System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact e985af09e2427909dd037e2c7cf4b74108b0bada:


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 20 20 20 20 20 20  ildYear]..      
1bf0: 20 20 73 65 74 20 79 65 61 72 56 61 72 4e 61 6d    set yearVarNam
1c00: 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20 3a 3a  e [appendArgs ::
1c10: 74 65 73 74 5f 6e 65 74 5f 66 78 5f 20 24 79 65  test_net_fx_ $ye
1c20: 61 72 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69  ar]....        i
1c30: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
1c40: 24 79 65 61 72 56 61 72 4e 61 6d 65 5d 20 26 26  $yearVarName] &&
1c50: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1c60: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 5b  [string length [
1c70: 73 65 74 20 24 79 65 61 72 56 61 72 4e 61 6d 65  set $yearVarName
1c80: 5d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ]] > 0} then {..
1c90: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1ca0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55         # NOTE: U
1cb0: 73 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64  se the specified
1cc0: 20 74 65 73 74 20 2e 4e 45 54 20 46 72 61 6d 65   test .NET Frame
1cd0: 77 6f 72 6b 2c 20 62 61 73 65 64 20 6f 6e 20 74  work, based on t
1ce0: 68 65 20 62 75 69 6c 64 0d 0a 20 20 20 20 20 20  he build..      
1cf0: 20 20 20 20 23 20 20 20 20 20 20 20 79 65 61 72      #       year
1d00: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
1d10: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1d20: 20 5b 73 65 74 20 24 79 65 61 72 56 61 72 4e 61   [set $yearVarNa
1d30: 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65  me]..        } e
1d40: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
1d50: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
1d60: 4e 4f 54 45 3a 20 46 61 6c 6c 62 61 63 6b 20 74  NOTE: Fallback t
1d70: 6f 20 74 68 65 20 22 77 65 6c 6c 20 6b 6e 6f 77  o the "well know
1d80: 6e 22 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72  n" .NET Framewor
1d90: 6b 20 76 65 72 73 69 6f 6e 20 74 68 61 74 0d 0a  k version that..
1da0: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
1db0: 20 20 69 73 20 6d 6f 73 74 20 63 6c 6f 73 65 6c    is most closel
1dc0: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
1dd0: 68 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 76  h a particular v
1de0: 65 72 73 69 6f 6e 20 6f 66 0d 0a 20 20 20 20 20  ersion of..     
1df0: 20 20 20 20 20 23 20 20 20 20 20 20 20 56 69 73       #       Vis
1e00: 75 61 6c 20 53 74 75 64 69 6f 2e 0d 0a 20 20 20  ual Studio...   
1e10: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1e20: 20 20 20 20 73 77 69 74 63 68 20 2d 65 78 61 63      switch -exac
1e30: 74 20 2d 2d 20 24 79 65 61 72 20 7b 0d 0a 20 20  t -- $year {..  
1e40: 20 20 20 20 20 20 20 20 20 20 32 30 30 35 20 7b            2005 {
1e50: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1e60: 72 65 74 75 72 6e 20 6e 65 74 46 78 32 30 0d 0a  return netFx20..
1e70: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1e80: 20 20 20 20 20 20 20 20 20 20 20 32 30 30 38 20             2008 
1e90: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1ea0: 20 72 65 74 75 72 6e 20 6e 65 74 46 78 33 35 0d   return netFx35.
1eb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
1ec0: 20 20 20 20 20 20 20 20 20 20 20 20 32 30 31 30              2010
1ed0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1ee0: 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78 34 30    return netFx40
1ef0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
1f00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 32 30 31  .            201
1f10: 32 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  2 {..           
1f20: 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78 34     return netFx4
1f30: 35 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  5..            }
1f40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 32 30  ..            20
1f50: 31 33 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  13 {..          
1f60: 20 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78      return netFx
1f70: 34 35 31 3b 20 23 20 54 4f 44 4f 3a 20 4f 72 20  451; # TODO: Or 
1f80: 22 6e 65 74 46 78 34 35 32 22 3f 0d 0a 20 20 20  "netFx452"?..   
1f90: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1fa0: 20 20 20 20 20 20 20 20 32 30 31 35 20 7b 0d 0a          2015 {..
1fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1fc0: 74 75 72 6e 20 6e 65 74 46 78 34 36 3b 20 23 20  turn netFx46; # 
1fd0: 54 4f 44 4f 3a 20 4f 72 20 22 6e 65 74 46 78 34  TODO: Or "netFx4
1fe0: 36 31 22 3f 0d 0a 20 20 20 20 20 20 20 20 20 20  61"?..          
1ff0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
2000: 20 64 65 66 61 75 6c 74 20 7b 0d 0a 20 20 20 20   default {..    
2010: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2020: 20 6e 65 74 46 78 33 35 3b 20 23 20 54 4f 44 4f   netFx35; # TODO
2030: 3a 20 47 6f 6f 64 20 22 66 61 6c 6c 62 61 63 6b  : Good "fallback
2040: 22 20 64 65 66 61 75 6c 74 3f 0d 0a 20 20 20 20  " default?..    
2050: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
2060: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
2070: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
2080: 7d 0d 0a 0c 0d 0a 20 20 20 20 23 0d 0a 20 20 20  }.....    #..   
2090: 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72   # NOTE: This pr
20a0: 6f 63 65 64 75 72 65 20 73 68 6f 75 6c 64 20 72  ocedure should r
20b0: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
20c0: 66 20 74 68 65 20 63 6f 6e 66 69 67 75 72 65 64  f the configured
20d0: 20 74 65 73 74 0d 0a 20 20 20 20 23 20 20 20 20   test..    #    
20e0: 20 20 20 70 6c 61 74 66 6f 72 6d 20 69 73 20 6d     platform is m
20f0: 6f 73 74 20 6c 69 6b 65 6c 79 20 74 68 65 20 64  ost likely the d
2100: 65 66 61 75 6c 74 20 66 6f 72 20 74 68 69 73 20  efault for this 
2110: 6d 61 63 68 69 6e 65 2e 0d 0a 20 20 20 20 23 0d  machine...    #.
2120: 0a 20 20 20 20 70 72 6f 63 20 69 73 44 65 66 61  .    proc isDefa
2130: 75 6c 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d  ultBuildPlatform
2140: 20 7b 20 7b 76 65 72 62 6f 73 65 20 66 61 6c 73   { {verbose fals
2150: 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e} } {..      #.
2160: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
2170: 75 6e 6e 69 6e 67 20 6f 6e 20 57 6f 57 36 34 20  unning on WoW64 
2180: 69 73 20 6e 65 76 65 72 20 74 68 65 20 64 65 66  is never the def
2190: 61 75 6c 74 20 70 6c 61 74 66 6f 72 6d 2e 0d 0a  ault platform...
21a0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
21b0: 66 20 7b 5b 69 73 52 75 6e 6e 69 6e 67 57 6f 57  f {[isRunningWoW
21c0: 36 34 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  64]} then {..   
21d0: 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73       if {$verbos
21e0: 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
21f0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
2200: 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20  st_channel \..  
2210: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
2220: 2d 20 64 65 74 65 63 74 65 64 20 6e 6f 6e 2d 64  - detected non-d
2230: 65 66 61 75 6c 74 20 70 6c 61 74 66 6f 72 6d 20  efault platform 
2240: 28 57 6f 57 36 34 29 5c 6e 22 0d 0a 20 20 20 20  (WoW64)\n"..    
2250: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 72      }..        r
2260: 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20  eturn false..   
2270: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
2280: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
2290: 68 69 73 20 68 61 73 20 61 20 67 6f 6f 64 20 63  his has a good c
22a0: 68 61 6e 63 65 20 6f 66 20 62 65 69 6e 67 20 74  hance of being t
22b0: 68 65 20 64 65 66 61 75 6c 74 20 70 6c 61 74 66  he default platf
22c0: 6f 72 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  orm...      #.. 
22d0: 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73       if {$verbos
22e0: 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
22f0: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
2300: 5f 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 64  _channel "---- d
2310: 65 74 65 63 74 65 64 20 64 65 66 61 75 6c 74 20  etected default 
2320: 70 6c 61 74 66 6f 72 6d 5c 6e 22 0d 0a 20 20 20  platform\n"..   
2330: 20 20 20 7d 0d 0a 20 20 20 20 20 20 72 65 74 75     }..      retu
2340: 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 7d 0d 0a  rn true..    }..
2350: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42  ...    proc getB
2360: 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20 7b 20 6e  uildPlatform { n
2370: 61 74 69 76 65 20 7d 20 7b 0d 0a 20 20 20 20 20  ative } {..     
2380: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
2390: 73 20 3a 3a 74 65 73 74 5f 70 6c 61 74 66 6f 72  s ::test_platfor
23a0: 6d 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  m] && \..       
23b0: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
23c0: 68 20 24 3a 3a 74 65 73 74 5f 70 6c 61 74 66 6f  h $::test_platfo
23d0: 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  rm] > 0} then {.
23e0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
23f0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
2400: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65  the specified te
2410: 73 74 20 70 6c 61 74 66 6f 72 6d 2e 20 20 49 66  st platform.  If
2420: 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 69   this variable i
2430: 73 20 6e 6f 74 20 73 65 74 2c 0d 0a 20 20 20 20  s not set,..    
2440: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
2450: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 77 69  default value wi
2460: 6c 6c 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74  ll be based on t
2470: 68 65 20 6d 61 63 68 69 6e 65 20 61 72 63 68 69  he machine archi
2480: 74 65 63 74 75 72 65 2e 0d 0a 20 20 20 20 20 20  tecture...      
2490: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
24a0: 75 72 6e 20 5b 65 78 70 72 20 7b 24 6e 61 74 69  urn [expr {$nati
24b0: 76 65 20 3f 20 24 3a 3a 74 65 73 74 5f 70 6c 61  ve ? $::test_pla
24c0: 74 66 6f 72 6d 20 3a 20 22 22 7d 5d 0d 0a 20 20  tform : ""}]..  
24d0: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69      } elseif {[i
24e0: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73  nfo exists ::tes
24f0: 74 5f 6d 61 63 68 69 6e 65 5d 20 26 26 20 5c 0d  t_machine] && \.
2500: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
2510: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73  ng length $::tes
2520: 74 5f 6d 61 63 68 69 6e 65 5d 20 3e 20 30 7d 20  t_machine] > 0} 
2530: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
2540: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
2550: 45 3a 20 46 6f 72 20 6e 61 74 69 76 65 20 62 75  E: For native bu
2560: 69 6c 64 73 2c 20 72 65 74 75 72 6e 20 74 68 65  ilds, return the
2570: 20 70 6c 61 74 66 6f 72 6d 20 6e 61 6d 65 20 63   platform name c
2580: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 0d  orresponding to.
2590: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
25a0: 20 74 68 65 20 74 65 73 74 20 6d 61 63 68 69 6e   the test machin
25b0: 65 20 61 72 63 68 69 74 65 63 74 75 72 65 3b 20  e architecture; 
25c0: 6f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  otherwise, retur
25d0: 6e 20 61 6e 20 65 6d 70 74 79 0d 0a 20 20 20 20  n an empty..    
25e0: 20 20 20 20 23 20 20 20 20 20 20 20 73 74 72 69      #       stri
25f0: 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ng...        #..
2600: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
2610: 65 78 70 72 20 7b 0d 0a 20 20 20 20 20 20 20 20  expr {..        
2620: 20 20 24 6e 61 74 69 76 65 20 3f 20 5b 6d 61 63    $native ? [mac
2630: 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72 6d 20 24  hineToPlatform $
2640: 3a 3a 74 65 73 74 5f 6d 61 63 68 69 6e 65 5d 20  ::test_machine] 
2650: 3a 20 22 22 0d 0a 20 20 20 20 20 20 20 20 7d 5d  : ""..        }]
2660: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66  ..      } elseif
2670: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
2680: 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61  :tcl_platform(ma
2690: 63 68 69 6e 65 29 5d 7d 20 74 68 65 6e 20 7b 0d  chine)]} then {.
26a0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
26b0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20      # NOTE: For 
26c0: 6e 61 74 69 76 65 20 62 75 69 6c 64 73 2c 20 72  native builds, r
26d0: 65 74 75 72 6e 20 74 68 65 20 70 6c 61 74 66 6f  eturn the platfo
26e0: 72 6d 20 6e 61 6d 65 20 63 6f 72 72 65 73 70 6f  rm name correspo
26f0: 6e 64 69 6e 67 20 74 6f 0d 0a 20 20 20 20 20 20  nding to..      
2700: 20 20 23 20 20 20 20 20 20 20 74 68 65 20 6d 61    #       the ma
2710: 63 68 69 6e 65 20 61 72 63 68 69 74 65 63 74 75  chine architectu
2720: 72 65 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 72  re; otherwise, r
2730: 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73  eturn an empty s
2740: 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20  tring...        
2750: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
2760: 6e 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20 20  n [expr {..     
2770: 20 20 20 20 20 24 6e 61 74 69 76 65 20 3f 20 5b       $native ? [
2780: 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72  machineToPlatfor
2790: 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72  m $::tcl_platfor
27a0: 6d 28 6d 61 63 68 69 6e 65 29 5d 20 3a 20 22 22  m(machine)] : ""
27b0: 0d 0a 20 20 20 20 20 20 20 20 7d 5d 0d 0a 20 20  ..        }]..  
27c0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
27d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
27e0: 20 23 20 4e 4f 54 45 3a 20 4e 6f 20 6d 61 63 68   # NOTE: No mach
27f0: 69 6e 65 20 61 72 63 68 69 74 65 63 74 75 72 65  ine architecture
2800: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72   is available, r
2810: 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73  eturn an empty s
2820: 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20  tring...        
2830: 23 20 20 20 20 20 20 20 49 74 20 69 73 20 69 6d  #       It is im
2840: 70 6f 72 74 61 6e 74 20 74 6f 20 72 65 74 75 72  portant to retur
2850: 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  n an empty strin
2860: 67 20 68 65 72 65 20 62 65 63 61 75 73 65 20 74  g here because t
2870: 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  he..        #   
2880: 20 20 20 20 72 65 73 75 6c 74 20 6f 66 20 74 68      result of th
2890: 69 73 20 70 72 6f 63 65 64 75 72 65 20 6d 61 79  is procedure may
28a0: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 5b 66   be used with [f
28b0: 69 6c 65 20 6a 6f 69 6e 5d 2e 0d 0a 20 20 20 20  ile join]...    
28c0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
28d0: 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 20 20  eturn ""..      
28e0: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
28f0: 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 43 6f   proc getBuildCo
2900: 6e 66 69 67 75 72 61 74 69 6f 6e 20 7b 7d 20 7b  nfiguration {} {
2910: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
2920: 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66 20   # NOTE: See if 
2930: 74 68 65 20 22 63 6f 6e 66 69 67 75 72 61 74 69  the "configurati
2940: 6f 6e 22 20 73 65 74 74 69 6e 67 20 68 61 73 20  on" setting has 
2950: 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 20  been overridden 
2960: 62 79 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  by the..      # 
2970: 20 20 20 20 20 20 75 73 65 72 20 28 65 2e 67 2e        user (e.g.
2980: 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20   on the command 
2990: 6c 69 6e 65 29 2e 20 20 54 68 69 73 20 68 65 6c  line).  This hel
29a0: 70 73 20 63 6f 6e 74 72 6f 6c 20 65 78 61 63 74  ps control exact
29b0: 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ly..      #     
29c0: 20 20 77 68 69 63 68 20 73 65 74 20 6f 66 20 62    which set of b
29d0: 69 6e 61 72 69 65 73 20 77 65 20 61 72 65 20 74  inaries we are t
29e0: 65 73 74 69 6e 67 20 28 69 2e 65 2e 20 74 68 6f  esting (i.e. tho
29f0: 73 65 20 62 75 69 6c 74 20 69 6e 20 74 68 65 0d  se built in the.
2a00: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22  .      #       "
2a10: 44 65 62 75 67 22 20 6f 72 20 22 52 65 6c 65 61  Debug" or "Relea
2a20: 73 65 22 20 62 75 69 6c 64 20 63 6f 6e 66 69 67  se" build config
2a30: 75 72 61 74 69 6f 6e 73 29 2e 20 20 54 6f 20 6f  urations).  To o
2a40: 76 65 72 72 69 64 65 20 74 68 69 73 0d 0a 20 20  verride this..  
2a50: 20 20 20 20 23 20 20 20 20 20 20 20 76 61 6c 75      #       valu
2a60: 65 20 76 69 61 20 74 68 65 20 63 6f 6d 6d 61 6e  e via the comman
2a70: 64 20 6c 69 6e 65 2c 20 65 6e 74 65 72 20 61 20  d line, enter a 
2a80: 63 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c 61 72 20  command similar 
2a90: 74 6f 20 6f 6e 65 20 6f 66 0d 0a 20 20 20 20 20  to one of..     
2aa0: 20 23 20 20 20 20 20 20 20 74 68 65 20 66 6f 6c   #       the fol
2ab0: 6c 6f 77 69 6e 67 20 28 61 6c 6c 20 6f 6e 20 6f  lowing (all on o
2ac0: 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20 20 20  ne line):..     
2ad0: 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20   #..      #     
2ae0: 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65    EagleShell.exe
2af0: 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20   -anyInitialize 
2b00: 22 73 65 74 20 74 65 73 74 5f 63 6f 6e 66 69 67  "set test_config
2b10: 75 72 61 74 69 6f 6e 20 44 65 62 75 67 22 0d 0a  uration Debug"..
2b20: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
2b30: 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c  -file .\path\to\
2b40: 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20  all.eagle..     
2b50: 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20   #..      #     
2b60: 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65    EagleShell.exe
2b70: 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20   -anyInitialize 
2b80: 22 73 65 74 20 74 65 73 74 5f 63 6f 6e 66 69 67  "set test_config
2b90: 75 72 61 74 69 6f 6e 20 52 65 6c 65 61 73 65 22  uration Release"
2ba0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
2bb0: 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74    -file .\path\t
2bc0: 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20  o\all.eagle..   
2bd0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20     #..      #   
2be0: 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65      EagleShell.e
2bf0: 78 65 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c  xe -file .\path\
2c00: 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 20 2d 70 72  to\all.eagle -pr
2c10: 65 54 65 73 74 0d 0a 20 20 20 20 20 20 23 20 20  eTest..      #  
2c20: 20 20 20 20 20 20 20 22 75 6e 73 65 74 20 2d 6e         "unset -n
2c30: 6f 63 6f 6d 70 6c 61 69 6e 20 74 65 73 74 5f 63  ocomplain test_c
2c40: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 0d 0a 20  onfiguration".. 
2c50: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
2c60: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
2c70: 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74  :test_configurat
2c80: 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ion] && \..     
2c90: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
2ca0: 67 74 68 20 24 3a 3a 74 65 73 74 5f 63 6f 6e 66  gth $::test_conf
2cb0: 69 67 75 72 61 74 69 6f 6e 5d 20 3e 20 30 7d 20  iguration] > 0} 
2cc0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
2cd0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
2ce0: 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63 69  E: Use the speci
2cf0: 66 69 65 64 20 74 65 73 74 20 63 6f 6e 66 69 67  fied test config
2d00: 75 72 61 74 69 6f 6e 2e 20 20 54 68 65 20 64 65  uration.  The de
2d10: 66 61 75 6c 74 20 76 61 6c 75 65 20 75 73 65 64  fault value used
2d20: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
2d30: 20 20 66 6f 72 20 74 68 69 73 20 76 61 72 69 61    for this varia
2d40: 62 6c 65 20 69 73 20 74 79 70 69 63 61 6c 6c 79  ble is typically
2d50: 20 22 52 65 6c 65 61 73 65 22 2c 20 61 73 20 73   "Release", as s
2d60: 65 74 20 62 79 20 74 68 65 20 74 65 73 74 0d 0a  et by the test..
2d70: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2d80: 73 75 69 74 65 20 69 74 73 65 6c 66 2e 0d 0a 20  suite itself... 
2d90: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2da0: 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74    return $::test
2db0: 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0d 0a  _configuration..
2dc0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
2dd0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2de0: 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 72 6d 61     # NOTE: Norma
2df0: 6c 6c 79 2c 20 77 65 20 77 69 6c 6c 20 6e 65 76  lly, we will nev
2e00: 65 72 20 68 69 74 20 74 68 69 73 20 63 61 73 65  er hit this case
2e10: 20 62 65 63 61 75 73 65 20 74 68 65 20 76 61 6c   because the val
2e20: 75 65 20 6f 66 20 74 68 65 0d 0a 20 20 20 20 20  ue of the..     
2e30: 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74 20     #       test 
2e40: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 76 61  configuration va
2e50: 72 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73  riable is always
2e60: 20 73 65 74 20 62 79 20 74 68 65 20 74 65 73 74   set by the test
2e70: 20 73 75 69 74 65 0d 0a 20 20 20 20 20 20 20 20   suite..        
2e80: 23 20 20 20 20 20 20 20 69 74 73 65 6c 66 3b 20  #       itself; 
2e90: 68 6f 77 65 76 65 72 2c 20 69 74 20 63 61 6e 20  however, it can 
2ea0: 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 75 73  be overridden us
2eb0: 69 6e 67 20 74 68 65 20 75 6e 73 65 74 20 63 6f  ing the unset co
2ec0: 6d 6d 61 6e 64 0d 0a 20 20 20 20 20 20 20 20 23  mmand..        #
2ed0: 20 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20         from the 
2ee0: 2d 70 72 65 54 65 73 74 20 6f 70 74 69 6f 6e 20  -preTest option 
2ef0: 74 6f 20 74 68 65 20 74 65 73 74 20 73 75 69 74  to the test suit
2f00: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
2f10: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
2f20: 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d 28  :eagle_platform(
2f30: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 29 0d 0a  configuration)..
2f40: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
2f50: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42  ...    proc getB
2f60: 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f  uildConfiguratio
2f70: 6e 73 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ns {} {..      #
2f80: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
2f90: 53 65 65 20 69 66 20 74 68 65 20 6c 69 73 74 20  See if the list 
2fa0: 6f 66 20 74 65 73 74 20 63 6f 6e 66 69 67 75 72  of test configur
2fb0: 61 74 69 6f 6e 73 20 68 61 73 20 62 65 65 6e 20  ations has been 
2fc0: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 0d 0a 20  overridden by.. 
2fd0: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
2fe0: 20 75 73 65 72 20 28 65 2e 67 2e 20 6f 6e 20 74   user (e.g. on t
2ff0: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29  he command line)
3000: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
3010: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
3020: 74 73 20 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67  ts ::test_config
3030: 75 72 61 74 69 6f 6e 73 5d 20 26 26 20 5c 0d 0a  urations] && \..
3040: 20 20 20 20 20 20 20 20 20 20 5b 6c 6c 65 6e 67            [lleng
3050: 74 68 20 24 3a 3a 74 65 73 74 5f 63 6f 6e 66 69  th $::test_confi
3060: 67 75 72 61 74 69 6f 6e 73 5d 20 3e 20 30 7d 20  gurations] > 0} 
3070: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
3080: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
3090: 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63 69  E: Use the speci
30a0: 66 69 65 64 20 6c 69 73 74 20 6f 66 20 74 65 73  fied list of tes
30b0: 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  t configurations
30c0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
30d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
30e0: 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69  test_configurati
30f0: 6f 6e 73 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  ons..      } els
3100: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e {..        #..
3110: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
3120: 55 73 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  Use the default 
3130: 6c 69 73 74 20 6f 66 20 74 65 73 74 20 63 6f 6e  list of test con
3140: 66 69 67 75 72 61 74 69 6f 6e 73 2e 0d 0a 20 20  figurations...  
3150: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
3160: 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 44 65   return [list De
3170: 62 75 67 20 52 65 6c 65 61 73 65 5d 0d 0a 20 20  bug Release]..  
3180: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
3190: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 75 69  .    proc getBui
31a0: 6c 64 42 61 73 65 44 69 72 65 63 74 6f 72 79 20  ldBaseDirectory 
31b0: 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
31c0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 67       # NOTE: Fig
31d0: 75 72 65 20 6f 75 74 20 74 68 65 20 62 61 73 65  ure out the base
31e0: 20 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65   directory where
31f0: 20 61 6c 6c 20 74 68 65 20 62 75 69 6c 64 73 20   all the builds 
3200: 73 68 6f 75 6c 64 20 62 65 0d 0a 20 20 20 20 20  should be..     
3210: 20 23 20 20 20 20 20 20 20 6c 6f 63 61 74 65 64   #       located
3220: 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20  .  This will be 
3230: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68  the directory th
3240: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
3250: 61 63 74 75 61 6c 0d 0a 20 20 20 20 20 20 23 20  actual..      # 
3260: 20 20 20 20 20 20 62 75 69 6c 64 20 6f 75 74 70        build outp
3270: 75 74 20 64 69 72 65 63 74 6f 72 79 20 28 65 2e  ut directory (e.
3280: 67 2e 20 70 61 72 65 6e 74 20 6f 66 20 22 62 69  g. parent of "bi
3290: 6e 22 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  n")...      #.. 
32a0: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
32b0: 78 69 73 74 73 20 3a 3a 62 75 69 6c 64 5f 62 61  xists ::build_ba
32c0: 73 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26  se_directory] &&
32d0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
32e0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
32f0: 62 75 69 6c 64 5f 62 61 73 65 5f 64 69 72 65 63  build_base_direc
3300: 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20  tory] > 0} then 
3310: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
3320: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
3330: 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  e location of th
3340: 65 20 62 75 69 6c 64 20 62 61 73 65 20 64 69 72  e build base dir
3350: 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
3360: 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20  overridden;..   
3370: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
3380: 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 76  refore, use it v
3390: 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20  erbatim...      
33a0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
33b0: 75 72 6e 20 24 3a 3a 62 75 69 6c 64 5f 62 61 73  urn $::build_bas
33c0: 65 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  e_directory..   
33d0: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e     } elseif {[in
33e0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f 6d 6d  fo exists ::comm
33f0: 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26  on_directory] &&
3400: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
3410: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
3420: 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79  common_directory
3430: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
3440: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
3450: 20 20 23 20 4e 4f 54 45 3a 20 4e 65 78 74 2c 20    # NOTE: Next, 
3460: 66 61 6c 6c 62 61 63 6b 20 74 6f 20 74 68 65 20  fallback to the 
3470: 67 72 61 6e 64 70 61 72 65 6e 74 20 64 69 72 65  grandparent dire
3480: 63 74 6f 72 79 20 6f 66 20 74 68 65 20 6f 6e 65  ctory of the one
3490: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
34a0: 20 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69    containing thi
34b0: 73 20 66 69 6c 65 20 28 69 2e 65 2e 20 22 63 6f  s file (i.e. "co
34c0: 6d 6d 6f 6e 2e 65 61 67 6c 65 22 29 2c 20 69 66  mmon.eagle"), if
34d0: 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20   available...   
34e0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
34f0: 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 64 69 72  return [file dir
3500: 6e 61 6d 65 20 5b 66 69 6c 65 20 64 69 72 6e 61  name [file dirna
3510: 6d 65 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72  me $::common_dir
3520: 65 63 74 6f 72 79 5d 5d 0d 0a 20 20 20 20 20 20  ectory]]..      
3530: 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20  } elseif {[info 
3540: 65 78 69 73 74 73 20 3a 3a 70 61 74 68 5d 20 26  exists ::path] &
3550: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
3560: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
3570: 3a 70 61 74 68 5d 20 3e 20 30 7d 20 74 68 65 6e  :path] > 0} then
3580: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
3590: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46         # NOTE: F
35a0: 69 6e 61 6c 6c 79 2c 20 66 61 6c 6c 62 61 63 6b  inally, fallback
35b0: 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 64   to the parent d
35c0: 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20  irectory of the 
35d0: 45 61 67 6c 65 54 65 73 74 0d 0a 20 20 20 20 20  EagleTest..     
35e0: 20 20 20 23 20 20 20 20 20 20 20 70 61 74 68 2e     #       path.
35f0: 20 20 54 68 65 20 45 61 67 6c 65 54 65 73 74 20    The EagleTest 
3600: 70 61 63 6b 61 67 65 20 67 75 61 72 61 6e 74 65  package guarante
3610: 65 73 20 74 68 61 74 20 74 68 69 73 20 76 61 72  es that this var
3620: 69 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 23  iable..        #
3630: 20 20 20 20 20 20 20 77 69 6c 6c 20 62 65 20 73         will be s
3640: 65 74 20 74 6f 20 74 68 65 20 64 69 72 65 63 74  et to the direct
3650: 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ory containing t
3660: 68 65 20 66 69 72 73 74 20 66 69 6c 65 20 74 6f  he first file to
3670: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
3680: 20 20 65 78 65 63 75 74 65 20 74 68 65 20 5b 72    execute the [r
3690: 75 6e 54 65 73 74 50 72 6f 6c 6f 67 75 65 5d 20  unTestPrologue] 
36a0: 73 63 72 69 70 74 20 6c 69 62 72 61 72 79 20 70  script library p
36b0: 72 6f 63 65 64 75 72 65 2e 0d 0a 20 20 20 20 20  rocedure...     
36c0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
36d0: 74 75 72 6e 20 5b 66 69 6c 65 20 64 69 72 6e 61  turn [file dirna
36e0: 6d 65 20 24 3a 3a 70 61 74 68 5d 0d 0a 20 20 20  me $::path]..   
36f0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
3700: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
3710: 23 20 4e 4f 54 45 3a 20 4e 6f 20 70 61 74 68 20  # NOTE: No path 
3720: 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65  is available, re
3730: 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74  turn an empty st
3740: 72 69 6e 67 2e 20 20 54 68 69 73 20 70 6f 69 6e  ring.  This poin
3750: 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
3760: 20 20 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65     should not be
3770: 20 72 65 61 63 68 65 64 2e 0d 0a 20 20 20 20 20   reached...     
3780: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
3790: 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 20 20 7d  turn ""..      }
37a0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
37b0: 70 72 6f 63 20 67 65 74 53 51 4c 69 74 65 54 65  proc getSQLiteTe
37c0: 73 74 44 61 74 61 50 61 74 68 20 7b 7d 20 7b 0d  stDataPath {} {.
37d0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
37e0: 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f  # NOTE: Figure o
37f0: 75 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ut the directory
3800: 20 77 68 65 72 65 20 61 6c 6c 20 74 68 65 20 74   where all the t
3810: 65 73 74 20 64 61 74 61 20 66 69 6c 65 73 20 73  est data files s
3820: 68 6f 75 6c 64 0d 0a 20 20 20 20 20 20 23 20 20  hould..      #  
3830: 20 20 20 20 20 62 65 20 6c 6f 63 61 74 65 64 2e       be located.
3840: 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65    This should be
3850: 20 74 68 65 20 22 64 61 74 61 22 20 64 69 72 65   the "data" dire
3860: 63 74 6f 72 79 20 62 65 6e 65 61 74 68 20 74 68  ctory beneath th
3870: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
3880: 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61   directory conta
3890: 69 6e 69 6e 67 20 74 68 65 20 61 63 74 75 61 6c  ining the actual
38a0: 20 74 65 73 74 20 73 63 72 69 70 74 73 2e 0d 0a   test scripts...
38b0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72        #..      r
38c0: 65 74 75 72 6e 20 5b 66 69 6c 65 20 6a 6f 69 6e  eturn [file join
38d0: 20 24 3a 3a 70 61 74 68 20 64 61 74 61 5d 0d 0a   $::path data]..
38e0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
38f0: 6f 63 20 69 73 52 75 6e 6e 69 6e 67 57 6f 57 36  oc isRunningWoW6
3900: 34 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  4 {} {..      #.
3910: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46  .      # NOTE: F
3920: 6f 72 20 6e 6f 77 2c 20 6a 75 73 74 20 75 73 65  or now, just use
3930: 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 74 65   the existing te
3940: 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 6f  st constraint fo
3950: 72 20 64 65 74 65 63 74 69 6e 67 0d 0a 20 20 20  r detecting..   
3960: 20 20 20 23 20 20 20 20 20 20 20 61 20 57 6f 57     #       a WoW
3970: 36 34 20 70 72 6f 63 65 73 73 2e 0d 0a 20 20 20  64 process...   
3980: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
3990: 72 6e 20 5b 68 61 76 65 43 6f 6e 73 74 72 61 69  rn [haveConstrai
39a0: 6e 74 20 77 6f 77 36 34 5d 0d 0a 20 20 20 20 7d  nt wow64]..    }
39b0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73  .....    proc is
39c0: 4d 69 78 65 64 4d 6f 64 65 41 73 73 65 6d 62 6c  MixedModeAssembl
39d0: 79 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 76 61  y { fileName {va
39e0: 72 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20  rName ""} } {.. 
39f0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
3a00: 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20 6d 61 6b  NOTE: First, mak
3a10: 65 20 73 75 72 65 20 74 68 65 20 74 65 73 74 20  e sure the test 
3a20: 73 75 69 74 65 20 69 6e 66 72 61 73 74 72 75 63  suite infrastruc
3a30: 74 75 72 65 20 69 73 20 61 6c 6c 6f 77 65 64 20  ture is allowed 
3a40: 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  to..      #     
3a50: 20 20 75 73 65 20 74 68 65 20 5b 65 78 65 63 5d    use the [exec]
3a60: 20 63 6f 6d 6d 61 6e 64 2e 0d 0a 20 20 20 20 20   command...     
3a70: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b   #..      if {![
3a80: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
3a90: 28 65 78 65 63 29 5d 20 26 26 20 21 5b 69 6e 66  (exec)] && ![inf
3aa0: 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f  o exists ::no(co
3ab0: 72 46 6c 61 67 73 29 5d 7d 20 74 68 65 6e 20 7b  rFlags)]} then {
3ac0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
3ad0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
3ae0: 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  the location of 
3af0: 43 6f 72 46 6c 61 67 73 20 69 73 20 70 72 65 73  CorFlags is pres
3b00: 65 6e 74 20 69 6e 20 74 68 65 20 65 6e 76 69 72  ent in the envir
3b10: 6f 6e 6d 65 6e 74 2c 0d 0a 20 20 20 20 20 20 20  onment,..       
3b20: 20 23 20 20 20 20 20 20 20 75 73 65 20 69 74 3b   #       use it;
3b30: 20 6f 74 68 65 72 77 69 73 65 20 61 73 73 75 6d   otherwise assum
3b40: 65 20 69 74 20 69 73 20 69 6e 20 74 68 65 20 50  e it is in the P
3b50: 41 54 48 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ATH...        #.
3b60: 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 72  .        set cor
3b70: 46 6c 61 67 73 20 5b 65 78 70 72 20 7b 0d 0a 20  Flags [expr {.. 
3b80: 20 20 20 20 20 20 20 20 20 5b 69 6e 66 6f 20 65           [info e
3b90: 78 69 73 74 73 20 3a 3a 65 6e 76 28 43 6f 72 46  xists ::env(CorF
3ba0: 6c 61 67 73 29 5d 20 3f 20 24 3a 3a 65 6e 76 28  lags)] ? $::env(
3bb0: 43 6f 72 46 6c 61 67 73 29 20 3a 20 22 43 6f 72  CorFlags) : "Cor
3bc0: 46 6c 61 67 73 22 0d 0a 20 20 20 20 20 20 20 20  Flags"..        
3bd0: 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  }]....        #.
3be0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
3bf0: 20 41 74 74 65 6d 70 74 20 74 6f 20 65 78 65 63   Attempt to exec
3c00: 75 74 65 20 43 6f 72 46 6c 61 67 73 20 6f 6e 20  ute CorFlags on 
3c10: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
3c20: 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  le...        #..
3c30: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
3c40: 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
3c50: 65 78 65 63 20 2d 2d 20 24 63 6f 72 46 6c 61 67  exec -- $corFlag
3c60: 73 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  s [file nativena
3c70: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20  me $fileName].. 
3c80: 20 20 20 20 20 20 20 7d 20 65 78 65 63 5d 20 3d         } exec] =
3c90: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
3ca0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
3cb0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 72      # NOTE: If r
3cc0: 65 71 75 65 73 74 65 64 20 62 79 20 6f 75 72 20  equested by our 
3cd0: 63 61 6c 6c 65 72 2c 20 61 74 74 65 6d 70 74 20  caller, attempt 
3ce0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
3cf0: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
3d00: 20 20 20 20 70 6c 61 74 66 6f 72 6d 20 66 6f 72      platform for
3d10: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
3d20: 69 6c 65 20 61 73 20 77 65 6c 6c 2e 0d 0a 20 20  ile as well...  
3d30: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
3d40: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
3d50: 20 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d 65   length $varName
3d60: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
3d70: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
3d80: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
3d90: 3a 20 53 74 6f 72 65 20 74 68 65 20 70 6c 61 74  : Store the plat
3da0: 66 6f 72 6d 20 69 6e 20 74 68 65 20 6e 61 6d 65  form in the name
3db0: 64 20 76 61 72 69 61 62 6c 65 20 69 6e 20 74 68  d variable in th
3dc0: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  e..            #
3dd0: 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 20 6f         context o
3de0: 66 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20  f our caller... 
3df0: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
3e00: 20 20 20 20 20 20 20 20 20 20 75 70 76 61 72 20            upvar 
3e10: 31 20 24 76 61 72 4e 61 6d 65 20 70 6c 61 74 66  1 $varName platf
3e20: 6f 72 6d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  orm....         
3e30: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
3e40: 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
3e50: 74 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65  t to extract the
3e60: 20 50 45 20 6c 69 6e 65 20 66 72 6f 6d 20 74 68   PE line from th
3e70: 65 20 63 61 70 74 75 72 65 64 0d 0a 20 20 20 20  e captured..    
3e80: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
3e90: 6f 75 74 70 75 74 2e 20 20 49 66 20 74 68 69 73  output.  If this
3ea0: 20 76 61 6c 75 65 20 69 73 20 22 50 45 33 32 22   value is "PE32"
3eb0: 20 6f 72 20 22 50 45 33 32 2b 22 2c 20 74 68 65   or "PE32+", the
3ec0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
3ed0: 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 20 66        assembly f
3ee0: 69 6c 65 20 69 73 20 33 32 2d 62 69 74 20 6f 72  ile is 32-bit or
3ef0: 20 36 34 2d 62 69 74 2c 20 72 65 73 70 65 63 74   64-bit, respect
3f00: 69 76 65 6c 79 3b 0d 0a 20 20 20 20 20 20 20 20  ively;..        
3f10: 20 20 20 20 23 20 20 20 20 20 20 20 6f 74 68 65      #       othe
3f20: 72 77 69 73 65 2c 20 69 74 73 20 74 79 70 65 20  rwise, its type 
3f30: 69 73 20 75 6e 6b 6e 6f 77 6e 2e 0d 0a 20 20 20  is unknown...   
3f40: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
3f50: 20 20 20 20 20 20 20 20 73 65 74 20 70 61 74 74          set patt
3f60: 65 72 6e 20 7b 5e 50 45 20 20 20 20 20 20 20 20  ern {^PE        
3f70: 3a 20 28 50 45 33 32 7c 50 45 33 32 5c 2b 29 5c  : (PE32|PE32\+)\
3f80: 73 2b 24 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  s+$}....        
3f90: 20 20 20 20 69 66 20 7b 5b 72 65 67 65 78 70 20      if {[regexp 
3fa0: 2d 6c 69 6e 65 20 2d 2d 20 24 70 61 74 74 65 72  -line -- $patter
3fb0: 6e 20 24 65 78 65 63 20 64 75 6d 6d 79 20 70 65  n $exec dummy pe
3fc0: 33 32 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  32]} then {..   
3fd0: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
3fe0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 48 41              # HA
3ff0: 43 4b 3a 20 54 68 69 73 20 5b 73 77 69 74 63 68  CK: This [switch
4000: 5d 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 33  ] assumes that 3
4010: 32 2d 62 69 74 20 65 78 65 63 75 74 61 62 6c 65  2-bit executable
4020: 73 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20 20  s are..         
4030: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6c 77       #       alw
4040: 61 79 73 20 78 38 36 20 61 6e 64 20 74 68 61 74  ays x86 and that
4050: 20 36 34 2d 62 69 74 20 65 78 65 63 75 74 61 62   64-bit executab
4060: 6c 65 73 20 61 72 65 20 61 6c 77 61 79 73 0d 0a  les are always..
4070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
4080: 20 20 20 20 20 20 78 36 34 2e 0d 0a 20 20 20 20        x64...    
4090: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
40a0: 20 20 20 20 20 20 20 20 20 20 20 73 77 69 74 63             switc
40b0: 68 20 2d 65 78 61 63 74 20 2d 2d 20 24 70 65 33  h -exact -- $pe3
40c0: 32 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  2 {..           
40d0: 20 20 20 20 20 50 45 33 32 20 7b 0d 0a 20 20 20       PE32 {..   
40e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
40f0: 65 74 20 70 6c 61 74 66 6f 72 6d 20 57 69 6e 33  et platform Win3
4100: 32 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2..             
4110: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
4120: 20 20 20 20 20 20 50 45 33 32 2b 20 7b 0d 0a 20        PE32+ {.. 
4130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4140: 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 78 36   set platform x6
4150: 34 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  4..             
4160: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
4170: 20 20 20 20 20 20 64 65 66 61 75 6c 74 20 7b 0d        default {.
4180: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4190: 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20     set platform 
41a0: 22 22 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ""..            
41b0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
41c0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
41d0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
41e0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
41f0: 70 6c 61 74 66 6f 72 6d 20 22 22 0d 0a 20 20 20  platform ""..   
4200: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
4210: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
4220: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4230: 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
4240: 74 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65  t to extract the
4250: 20 49 4c 4f 4e 4c 59 20 6c 69 6e 65 20 66 72 6f   ILONLY line fro
4260: 6d 20 74 68 65 20 63 61 70 74 75 72 65 64 0d 0a  m the captured..
4270: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
4280: 20 20 6f 75 74 70 75 74 2e 20 20 49 66 20 74 68    output.  If th
4290: 69 73 20 76 61 6c 75 65 20 69 73 20 7a 65 72 6f  is value is zero
42a0: 2c 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  , the specified 
42b0: 66 69 6c 65 20 6d 75 73 74 0d 0a 20 20 20 20 20  file must..     
42c0: 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65 20       #       be 
42d0: 61 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73  a mixed-mode ass
42e0: 65 6d 62 6c 79 3b 20 6f 74 68 65 72 77 69 73 65  embly; otherwise
42f0: 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  , it contains on
4300: 6c 79 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  ly..          # 
4310: 20 20 20 20 20 20 6d 61 6e 61 67 65 64 20 63 6f        managed co
4320: 6d 70 6f 6e 65 6e 74 73 2e 0d 0a 20 20 20 20 20  mponents...     
4330: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4340: 20 20 73 65 74 20 70 61 74 74 65 72 6e 20 7b 5e    set pattern {^
4350: 49 4c 4f 4e 4c 59 20 20 20 20 3a 20 28 30 7c 31  ILONLY    : (0|1
4360: 29 5c 73 2b 24 7d 0d 0a 0d 0a 20 20 20 20 20 20  )\s+$}....      
4370: 20 20 20 20 69 66 20 7b 21 5b 72 65 67 65 78 70      if {![regexp
4380: 20 2d 6c 69 6e 65 20 2d 2d 20 24 70 61 74 74 65   -line -- $patte
4390: 72 6e 20 24 65 78 65 63 20 64 75 6d 6d 79 20 69  rn $exec dummy i
43a0: 6c 4f 6e 6c 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  lOnly]} then {..
43b0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
43c0: 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20  rn false..      
43d0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
43e0: 20 20 20 69 66 20 7b 21 24 69 6c 4f 6e 6c 79 7d     if {!$ilOnly}
43f0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
4400: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
4410: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
4420: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
4430: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
4440: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74      # NOTE: If t
4450: 68 65 20 74 65 73 74 20 73 75 69 74 65 20 63 61  he test suite ca
4460: 6e 6e 6f 74 20 75 73 65 20 5b 65 78 65 63 5d 20  nnot use [exec] 
4470: 6f 72 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  or execution of 
4480: 43 6f 72 46 6c 61 67 73 0d 0a 20 20 20 20 20 20  CorFlags..      
4490: 23 20 20 20 20 20 20 20 66 61 69 6c 65 64 2c 20  #       failed, 
44a0: 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 0d 0a 20  return false... 
44b0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
44c0: 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20  turn false..    
44d0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69  }.....    proc i
44e0: 73 42 75 69 6c 64 41 76 61 69 6c 61 62 6c 65 20  sBuildAvailable 
44f0: 7b 20 6e 61 74 69 76 65 20 64 69 72 65 63 74 6f  { native directo
4500: 72 79 20 7b 76 61 72 4e 61 6d 65 20 22 22 7d 20  ry {varName ""} 
4510: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
4520: 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c      # NOTE: Buil
4530: 64 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c  d the fully qual
4540: 69 66 69 65 64 20 66 69 6c 65 20 6e 61 6d 65 20  ified file name 
4550: 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79 20  for the primary 
4560: 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20  assembly..      
4570: 23 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 69  #       containi
4580: 6e 67 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61  ng the System.Da
4590: 74 61 2e 53 51 4c 69 74 65 20 6d 61 6e 61 67 65  ta.SQLite manage
45a0: 64 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e 20 20 49  d components.  I
45b0: 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  t..      #      
45c0: 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 74 65 64   should be noted
45d0: 20 74 68 61 74 20 74 68 69 73 20 61 73 73 65 6d   that this assem
45e0: 62 6c 79 20 66 69 6c 65 20 6d 61 79 20 61 6c 73  bly file may als
45f0: 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 0d 0a 20  o contain the.. 
4600: 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 74       #       nat
4610: 69 76 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 2c 20  ive components, 
4620: 69 66 20 61 20 6e 61 74 69 76 65 20 62 75 69 6c  if a native buil
4630: 64 20 69 73 20 69 6e 20 75 73 65 2e 0d 0a 20 20  d is in use...  
4640: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
4650: 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20   fileName [file 
4660: 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
4670: 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79   join $directory
4680: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 53 79   \..          Sy
4690: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
46a0: 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  .dll]]....      
46b0: 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74  if {![file exist
46c0: 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  s $fileName]} th
46d0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
46e0: 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20  turn false..    
46f0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
4700: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74        # NOTE: At
4710: 74 65 6d 70 74 20 74 6f 20 61 75 74 6f 6d 61 74  tempt to automat
4720: 69 63 61 6c 6c 79 20 64 65 74 65 63 74 20 69 66  ically detect if
4730: 20 74 68 65 20 70 72 69 6d 61 72 79 20 61 73 73   the primary ass
4740: 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 23 20 20  embly..      #  
4750: 20 20 20 20 20 63 6f 6e 74 61 69 6e 73 20 61 6e       contains an
4760: 79 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e 65  y native compone
4770: 6e 74 73 2c 20 69 66 20 6e 65 63 65 73 73 61 72  nts, if necessar
4780: 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  y...      #..   
4790: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
47a0: 65 6e 67 74 68 20 24 6e 61 74 69 76 65 5d 20 3d  ength $native] =
47b0: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
47c0: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
47d0: 20 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d 65   length $varName
47e0: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
47f0: 20 20 20 20 20 20 20 20 20 75 70 76 61 72 20 31           upvar 1
4800: 20 24 76 61 72 4e 61 6d 65 20 24 76 61 72 4e 61   $varName $varNa
4810: 6d 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  me..        }...
4820: 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 61 74  .        set nat
4830: 69 76 65 20 5b 69 73 4d 69 78 65 64 4d 6f 64 65  ive [isMixedMode
4840: 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61  Assembly $fileNa
4850: 6d 65 20 24 76 61 72 4e 61 6d 65 5d 0d 0a 20 20  me $varName]..  
4860: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
4870: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
4880: 49 66 20 74 68 65 20 70 72 69 6d 61 72 79 20 61  If the primary a
4890: 73 73 65 6d 62 6c 79 20 61 6c 73 6f 20 63 6f 6e  ssembly also con
48a0: 74 61 69 6e 73 20 74 68 65 20 6e 61 74 69 76 65  tains the native
48b0: 20 63 6f 6d 70 6f 6e 65 6e 74 73 2c 0d 0a 20 20   components,..  
48c0: 20 20 20 20 23 20 20 20 20 20 20 20 77 65 20 68      #       we h
48d0: 61 76 65 20 65 76 65 72 79 74 68 69 6e 67 20 77  ave everything w
48e0: 65 20 6e 65 65 64 2e 0d 0a 20 20 20 20 20 20 23  e need...      #
48f0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 6e 61 74  ..      if {$nat
4900: 69 76 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ive} then {..   
4910: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
4920: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
4930: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
4940: 54 45 3a 20 57 68 61 74 20 69 73 20 74 68 65 20  TE: What is the 
4950: 61 72 63 68 69 74 65 63 74 75 72 65 20 66 6f 72  architecture for
4960: 20 74 68 69 73 20 6d 61 63 68 69 6e 65 3f 0d 0a   this machine?..
4970: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73        #..      s
4980: 65 74 20 61 72 63 68 69 74 65 63 74 75 72 65 20  et architecture 
4990: 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74 66 6f  [machineToPlatfo
49a0: 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f  rm $::tcl_platfo
49b0: 72 6d 28 6d 61 63 68 69 6e 65 29 20 74 72 75 65  rm(machine) true
49c0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ]....      #..  
49d0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 68 61 74      # NOTE: What
49e0: 20 69 73 20 74 68 65 20 70 6c 61 74 66 6f 72 6d   is the platform
49f0: 20 66 6f 72 20 74 68 69 73 20 6d 61 63 68 69 6e   for this machin
4a00: 65 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e?..      #..   
4a10: 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20     set platform 
4a20: 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74 66 6f  [machineToPlatfo
4a30: 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f  rm $::tcl_platfo
4a40: 72 6d 28 6d 61 63 68 69 6e 65 29 5d 0d 0a 0d 0a  rm(machine)]....
4a50: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
4a60: 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65   NOTE: Build the
4a70: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
4a80: 20 66 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 74   file name for t
4a90: 68 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d  he interop assem
4aa0: 62 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  bly..      #    
4ab0: 20 20 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68     containing th
4ac0: 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  e System.Data.SQ
4ad0: 4c 69 74 65 20 6e 61 74 69 76 65 20 63 6f 6d 70  Lite native comp
4ae0: 6f 6e 65 6e 74 73 2e 20 20 49 66 20 74 68 69 73  onents.  If this
4af0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
4b00: 66 69 6c 65 20 65 78 69 73 74 73 2c 20 77 65 20  file exists, we 
4b10: 73 68 6f 75 6c 64 20 68 61 76 65 20 65 76 65 72  should have ever
4b20: 79 74 68 69 6e 67 20 77 65 20 6e 65 65 64 2e 0d  ything we need..
4b30: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
4b40: 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69  set fileName [fi
4b50: 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
4b60: 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74  ile join $direct
4b70: 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ory \..         
4b80: 20 24 61 72 63 68 69 74 65 63 74 75 72 65 20 53   $architecture S
4b90: 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c  QLite.Interop.dl
4ba0: 6c 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  l]]....      if 
4bb0: 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66  {[file exists $f
4bc0: 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
4bd0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
4be0: 20 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a   true..      }..
4bf0: 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65  ..      set file
4c00: 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  Name [file nativ
4c10: 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
4c20: 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20   $directory \.. 
4c30: 20 20 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f           $platfo
4c40: 72 6d 20 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f  rm SQLite.Intero
4c50: 70 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20 20 20  p.dll]]....     
4c60: 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74   if {[file exist
4c70: 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  s $fileName]} th
4c80: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
4c90: 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20  turn true..     
4ca0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20   }....      set 
4cb0: 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e  fileName [file n
4cc0: 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
4cd0: 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20  join $directory 
4ce0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c  \..          SQL
4cf0: 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 5d  ite.Interop.dll]
4d00: 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  ]....      if {[
4d10: 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c  file exists $fil
4d20: 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
4d30: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
4d40: 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  rue..      }....
4d50: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
4d60: 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65   NOTE: Build the
4d70: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
4d80: 20 66 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 74   file name for t
4d90: 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 0d 0a  he SQLite core..
4da0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6c 69        #       li
4db0: 62 72 61 72 79 2e 20 20 49 66 20 74 68 69 73 20  brary.  If this 
4dc0: 66 69 6c 65 20 65 78 69 73 74 73 2c 20 77 65 20  file exists, we 
4dd0: 73 68 6f 75 6c 64 20 68 61 76 65 20 65 76 65 72  should have ever
4de0: 79 74 68 69 6e 67 20 77 65 0d 0a 20 20 20 20 20  ything we..     
4df0: 20 23 20 20 20 20 20 20 20 6e 65 65 64 2e 0d 0a   #       need...
4e00: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73        #..      s
4e10: 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c  et fileName [fil
4e20: 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69  e nativename [fi
4e30: 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f  le join $directo
4e40: 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ry \..          
4e50: 24 61 72 63 68 69 74 65 63 74 75 72 65 20 73 71  $architecture sq
4e60: 6c 69 74 65 33 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20  lite3.dll]].... 
4e70: 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65       if {[file e
4e80: 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d  xists $fileName]
4e90: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
4ea0: 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20    return true.. 
4eb0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
4ec0: 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69  set fileName [fi
4ed0: 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
4ee0: 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74  ile join $direct
4ef0: 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ory \..         
4f00: 20 24 70 6c 61 74 66 6f 72 6d 20 73 71 6c 69 74   $platform sqlit
4f10: 65 33 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20 20  e3.dll]]....    
4f20: 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73    if {[file exis
4f30: 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74  ts $fileName]} t
4f40: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
4f50: 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20  eturn true..    
4f60: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74    }....      set
4f70: 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20   fileName [file 
4f80: 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
4f90: 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79   join $directory
4fa0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 73 71   \..          sq
4fb0: 6c 69 74 65 33 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20  lite3.dll]].... 
4fc0: 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65       if {[file e
4fd0: 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d  xists $fileName]
4fe0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
4ff0: 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20    return true.. 
5000: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
5010: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
5020: 20 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 6e 61 74   One or more nat
5030: 69 76 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 6e  ive components n
5040: 65 65 64 65 64 20 62 79 20 53 79 73 74 65 6d 2e  eeded by System.
5050: 44 61 74 61 2e 53 51 4c 69 74 65 0d 0a 20 20 20  Data.SQLite..   
5060: 20 20 20 23 20 20 20 20 20 20 20 61 72 65 20 6d     #       are m
5070: 69 73 73 69 6e 67 2e 0d 0a 20 20 20 20 20 20 23  issing...      #
5080: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 66  ..      return f
5090: 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  alse..    }.....
50a0: 20 20 20 20 70 72 6f 63 20 69 73 52 65 6c 65 61      proc isRelea
50b0: 73 65 41 76 61 69 6c 61 62 6c 65 20 7b 20 64 69  seAvailable { di
50c0: 72 65 63 74 6f 72 79 20 7b 76 61 72 4e 61 6d 65  rectory {varName
50d0: 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20   ""} } {..      
50e0: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
50f0: 74 68 20 24 76 61 72 4e 61 6d 65 5d 20 3e 20 30  th $varName] > 0
5100: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
5110: 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
5120: 6d 65 20 24 76 61 72 4e 61 6d 65 0d 0a 20 20 20  me $varName..   
5130: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
5140: 74 75 72 6e 20 5b 69 73 42 75 69 6c 64 41 76 61  turn [isBuildAva
5150: 69 6c 61 62 6c 65 20 22 22 20 24 64 69 72 65 63  ilable "" $direc
5160: 74 6f 72 79 20 24 76 61 72 4e 61 6d 65 5d 0d 0a  tory $varName]..
5170: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
5180: 6f 63 20 6a 6f 69 6e 42 75 69 6c 64 44 69 72 65  oc joinBuildDire
5190: 63 74 6f 72 79 20 7b 20 6e 61 74 69 76 65 20 70  ctory { native p
51a0: 61 74 68 20 79 65 61 72 20 70 6c 61 74 66 6f 72  ath year platfor
51b0: 6d 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  m configuration 
51c0: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
51d0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75      # NOTE: Figu
51e0: 72 65 20 6f 75 74 20 61 6e 64 20 74 68 65 6e 20  re out and then 
51f0: 72 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 79  return the fully
5200: 20 71 75 61 6c 69 66 69 65 64 20 70 61 74 68 20   qualified path 
5210: 74 6f 20 74 68 65 20 62 75 69 6c 64 0d 0a 20 20  to the build..  
5220: 20 20 20 20 23 20 20 20 20 20 20 20 64 69 72 65      #       dire
5230: 63 74 6f 72 79 20 62 61 73 65 64 20 6f 6e 20 61  ctory based on a
5240: 6c 6c 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73  ll the arguments
5250: 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72   provided by our
5260: 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20   caller...      
5270: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 6e 61  #..      if {$na
5280: 74 69 76 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  tive} then {..  
5290: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69        return [fi
52a0: 6c 65 20 6a 6f 69 6e 20 24 70 61 74 68 20 62 69  le join $path bi
52b0: 6e 20 24 79 65 61 72 20 24 70 6c 61 74 66 6f 72  n $year $platfor
52c0: 6d 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  m $configuration
52d0: 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
52e0: 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
52f0: 6e 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 70 61  n [file join $pa
5300: 74 68 20 62 69 6e 20 24 79 65 61 72 20 24 63 6f  th bin $year $co
5310: 6e 66 69 67 75 72 61 74 69 6f 6e 20 62 69 6e 5d  nfiguration bin]
5320: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
5330: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
5340: 74 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79 20  tBuildDirectory 
5350: 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
5360: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 65       # NOTE: See
5370: 20 69 66 20 74 68 65 20 22 6e 61 74 69 76 65 22   if the "native"
5380: 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 20   runtime option 
5390: 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20 49  has been set.  I
53a0: 66 20 73 6f 2c 20 75 73 65 20 74 68 65 0d 0a 20  f so, use the.. 
53b0: 20 20 20 20 20 23 20 20 20 20 20 20 20 64 69 72       #       dir
53c0: 65 63 74 6f 72 79 20 66 6f 72 20 74 68 65 20 6d  ectory for the m
53d0: 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62  ixed-mode assemb
53e0: 6c 79 20 28 61 2e 6b 2e 61 2e 20 74 68 65 20 6e  ly (a.k.a. the n
53f0: 61 74 69 76 65 20 69 6e 74 65 72 6f 70 0d 0a 20  ative interop.. 
5400: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 73 73       #       ass
5410: 65 6d 62 6c 79 29 2e 20 20 54 6f 20 65 6e 61 62  embly).  To enab
5420: 6c 65 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 76  le this option v
5430: 69 61 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c  ia the command l
5440: 69 6e 65 2c 20 65 6e 74 65 72 20 61 0d 0a 20 20  ine, enter a..  
5450: 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6d 6d      #       comm
5460: 61 6e 64 20 73 69 6d 69 6c 61 72 20 74 6f 20 6f  and similar to o
5470: 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
5480: 69 6e 67 20 28 61 6c 6c 20 6f 6e 20 6f 6e 65 20  ing (all on one 
5490: 6c 69 6e 65 29 3a 0d 0a 20 20 20 20 20 20 23 0d  line):..      #.
54a0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45  .      #       E
54b0: 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 69  agleShell.exe -i
54c0: 6e 69 74 69 61 6c 69 7a 65 20 2d 72 75 6e 74 69  nitialize -runti
54d0: 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65 0d  meOption native.
54e0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20  .      #        
54f0: 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f   -file .\path\to
5500: 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20  \all.eagle..    
5510: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20    #..      #    
5520: 20 20 20 54 6f 20 65 6e 61 62 6c 65 20 74 68 69     To enable thi
5530: 73 20 6f 70 74 69 6f 6e 20 76 69 61 20 74 68 65  s option via the
5540: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 70 72   command line pr
5550: 69 6f 72 20 74 6f 20 74 68 65 20 22 62 65 74 61  ior to the "beta
5560: 20 31 36 22 0d 0a 20 20 20 20 20 20 23 20 20 20   16"..      #   
5570: 20 20 20 20 72 65 6c 65 61 73 65 20 6f 66 20 45      release of E
5580: 61 67 6c 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  agle, the follow
5590: 69 6e 67 20 63 6f 6d 6d 61 6e 64 20 6d 75 73 74  ing command must
55a0: 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64   be used instead
55b0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
55c0: 28 61 6c 73 6f 20 61 6c 6c 20 6f 6e 20 6f 6e 65  (also all on one
55d0: 20 6c 69 6e 65 29 3a 0d 0a 20 20 20 20 20 20 23   line):..      #
55e0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
55f0: 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d  EagleShell.exe -
5600: 69 6e 69 74 69 61 6c 69 7a 65 20 2d 70 6f 73 74  initialize -post
5610: 49 6e 69 74 69 61 6c 69 7a 65 0d 0a 20 20 20 20  Initialize..    
5620: 20 20 23 20 20 20 20 20 20 20 20 20 22 6f 62 6a    #         "obj
5630: 65 63 74 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72  ect invoke Inter
5640: 70 72 65 74 65 72 2e 47 65 74 41 63 74 69 76 65  preter.GetActive
5650: 20 41 64 64 52 75 6e 74 69 6d 65 4f 70 74 69 6f   AddRuntimeOptio
5660: 6e 20 6e 61 74 69 76 65 22 0d 0a 20 20 20 20 20  n native"..     
5670: 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65   #         -file
5680: 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65   .\path\to\all.e
5690: 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20  agle..      #.. 
56a0: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
56b0: 78 69 73 74 73 20 3a 3a 62 75 69 6c 64 5f 64 69  xists ::build_di
56c0: 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20  rectory] && \.. 
56d0: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
56e0: 20 6c 65 6e 67 74 68 20 24 3a 3a 62 75 69 6c 64   length $::build
56f0: 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d  _directory] > 0}
5700: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
5710: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
5720: 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e  TE: The location
5730: 20 6f 66 20 74 68 65 20 62 75 69 6c 64 20 64 69   of the build di
5740: 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e  rectory has been
5750: 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20   overridden;..  
5760: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
5770: 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20  erefore, use it 
5780: 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20  verbatim...     
5790: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
57a0: 74 75 72 6e 20 24 3a 3a 62 75 69 6c 64 5f 64 69  turn $::build_di
57b0: 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d  rectory..      }
57c0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
57d0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
57e0: 54 45 3a 20 49 66 20 74 68 65 20 22 6e 61 74 69  TE: If the "nati
57f0: 76 65 22 20 72 75 6e 74 69 6d 65 20 6f 70 74 69  ve" runtime opti
5800: 6f 6e 20 69 73 20 73 65 74 2c 20 74 68 65 20 6d  on is set, the m
5810: 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62  ixed-mode assemb
5820: 6c 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ly..        #   
5830: 20 20 20 20 69 73 20 62 65 69 6e 67 20 74 65 73      is being tes
5840: 74 65 64 2e 20 20 49 6e 20 74 68 61 74 20 63 61  ted.  In that ca
5850: 73 65 2c 20 74 68 65 20 70 61 74 68 20 74 6f 20  se, the path to 
5860: 74 68 65 20 62 75 69 6c 64 20 64 69 72 65 63 74  the build direct
5870: 6f 72 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ory..        #  
5880: 20 20 20 20 20 77 69 6c 6c 20 63 6f 6e 74 61 69       will contai
5890: 6e 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 20 6e  n the platform n
58a0: 61 6d 65 20 61 6e 64 20 61 6c 6c 20 74 68 65 20  ame and all the 
58b0: 62 69 6e 61 72 69 65 73 20 75 6e 64 65 72 20 74  binaries under t
58c0: 65 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20  est..        #  
58d0: 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 70       should be p
58e0: 72 65 73 65 6e 74 20 69 6e 20 74 68 61 74 20 64  resent in that d
58f0: 69 72 65 63 74 6f 72 79 2e 20 20 49 66 20 74 68  irectory.  If th
5900: 65 20 22 6e 61 74 69 76 65 22 20 72 75 6e 74 69  e "native" runti
5910: 6d 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  me..        #   
5920: 20 20 20 20 6f 70 74 69 6f 6e 20 69 73 20 6e 6f      option is no
5930: 74 20 73 65 74 2c 20 74 68 65 20 62 75 69 6c 64  t set, the build
5940: 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c 6c 20   directory will 
5950: 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f  be considered to
5960: 20 62 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20   be..        #  
5970: 20 20 20 20 20 22 70 6c 61 74 66 6f 72 6d 2d 6e       "platform-n
5980: 65 75 74 72 61 6c 22 2c 20 77 69 74 68 20 74 68  eutral", with th
5990: 65 20 6e 6f 74 61 62 6c 65 20 65 78 63 65 70 74  e notable except
59a0: 69 6f 6e 20 6f 66 20 61 6e 79 20 6e 61 74 69 76  ion of any nativ
59b0: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
59c0: 20 20 20 61 73 73 65 6d 62 6c 79 20 28 65 2e 67     assembly (e.g
59d0: 2e 20 22 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f  . "SQLite.Intero
59e0: 70 2e 64 6c 6c 22 29 20 63 6f 70 69 65 64 20 74  p.dll") copied t
59f0: 68 65 72 65 20 64 75 72 69 6e 67 20 74 68 65 0d  here during the.
5a00: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
5a10: 20 62 75 69 6c 64 20 70 72 6f 63 65 73 73 20 69   build process i
5a20: 74 73 65 6c 66 2e 20 20 49 66 20 74 68 65 20 62  tself.  If the b
5a30: 75 69 6c 64 20 70 72 6f 63 65 73 73 20 73 6f 6d  uild process som
5a40: 65 68 6f 77 20 64 6f 65 73 20 6e 6f 74 0d 0a 20  ehow does not.. 
5a50: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
5a60: 6f 70 79 20 74 68 65 20 6e 61 74 69 76 65 20 61  opy the native a
5a70: 73 73 65 6d 62 6c 79 20 66 6f 72 20 74 68 69 73  ssembly for this
5a80: 20 70 6c 61 74 66 6f 72 6d 2c 20 6d 6f 73 74 20   platform, most 
5a90: 6f 66 20 74 68 65 20 74 65 73 74 73 0d 0a 20 20  of the tests..  
5aa0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e        #       in
5ab0: 20 74 68 65 20 73 75 69 74 65 20 77 69 6c 6c 20   the suite will 
5ac0: 73 69 6d 70 6c 79 20 62 65 20 73 6b 69 70 70 65  simply be skippe
5ad0: 64 2e 20 20 47 65 6e 65 72 61 6c 6c 79 20 73 70  d.  Generally sp
5ae0: 65 61 6b 69 6e 67 2c 20 74 68 65 72 65 0d 0a 20  eaking, there.. 
5af0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
5b00: 72 65 20 74 77 6f 20 77 61 79 73 20 74 6f 20 62  re two ways to b
5b10: 75 69 6c 64 20 74 68 65 20 62 69 6e 61 72 69 65  uild the binarie
5b20: 73 20 77 68 65 6e 20 70 72 65 70 61 72 69 6e 67  s when preparing
5b30: 20 74 6f 20 72 75 6e 20 74 68 65 0d 0a 20 20 20   to run the..   
5b40: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73       #       tes
5b50: 74 20 73 75 69 74 65 3a 0d 0a 20 20 20 20 20 20  t suite:..      
5b60: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20    #..        #  
5b70: 20 20 20 20 20 31 2e 20 42 75 69 6c 64 20 74 68       1. Build th
5b80: 65 20 73 65 70 61 72 61 74 65 20 6d 61 6e 61 67  e separate manag
5b90: 65 64 20 61 6e 64 20 6e 61 74 69 76 65 20 61 73  ed and native as
5ba0: 73 65 6d 62 6c 69 65 73 20 75 73 69 6e 67 20 73  semblies using s
5bb0: 6f 6d 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ome..        #  
5bc0: 20 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64 73          commands
5bd0: 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0d 0a 20 20   similar to:..  
5be0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
5bf0: 20 23 20 20 20 20 20 20 20 20 20 20 62 75 69 6c   #          buil
5c00: 64 2e 62 61 74 20 24 7b 43 6f 6e 66 69 67 75 72  d.bat ${Configur
5c10: 61 74 69 6f 6e 7d 4d 61 6e 61 67 65 64 4f 6e 6c  ation}ManagedOnl
5c20: 79 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 0d 0a 20  y ${Platform}.. 
5c30: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
5c40: 20 20 62 75 69 6c 64 2e 62 61 74 20 24 7b 43 6f    build.bat ${Co
5c50: 6e 66 69 67 75 72 61 74 69 6f 6e 7d 4e 61 74 69  nfiguration}Nati
5c60: 76 65 4f 6e 6c 79 20 24 7b 50 6c 61 74 66 6f 72  veOnly ${Platfor
5c70: 6d 7d 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  m}..        #.. 
5c80: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
5c90: 20 20 57 68 65 72 65 20 24 7b 43 6f 6e 66 69 67    Where ${Config
5ca0: 75 72 61 74 69 6f 6e 7d 20 69 73 20 65 69 74 68  uration} is eith
5cb0: 65 72 20 22 44 65 62 75 67 22 20 6f 72 20 22 52  er "Debug" or "R
5cc0: 65 6c 65 61 73 65 22 20 61 6e 64 0d 0a 20 20 20  elease" and..   
5cd0: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20       #          
5ce0: 24 7b 50 6c 61 74 66 6f 72 6d 7d 20 69 73 20 65  ${Platform} is e
5cf0: 69 74 68 65 72 20 22 57 69 6e 33 32 22 20 6f 72  ither "Win32" or
5d00: 20 22 78 36 34 22 2e 0d 0a 20 20 20 20 20 20 20   "x64"...       
5d10: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20   #..        #   
5d20: 20 20 20 20 32 2e 20 42 75 69 6c 64 20 74 68 65      2. Build the
5d30: 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65   mixed-mode asse
5d40: 6d 62 6c 79 20 75 73 69 6e 67 20 61 20 63 6f 6d  mbly using a com
5d50: 6d 61 6e 64 20 73 69 6d 69 6c 61 72 20 74 6f 3a  mand similar to:
5d60: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
5d70: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20       #          
5d80: 62 75 69 6c 64 2e 62 61 74 20 24 7b 43 6f 6e 66  build.bat ${Conf
5d90: 69 67 75 72 61 74 69 6f 6e 7d 20 24 7b 50 6c 61  iguration} ${Pla
5da0: 74 66 6f 72 6d 7d 0d 0a 20 20 20 20 20 20 20 20  tform}..        
5db0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  #..        #    
5dc0: 20 20 20 20 20 20 57 68 65 72 65 20 24 7b 43 6f        Where ${Co
5dd0: 6e 66 69 67 75 72 61 74 69 6f 6e 7d 20 69 73 20  nfiguration} is 
5de0: 65 69 74 68 65 72 20 22 44 65 62 75 67 22 20 6f  either "Debug" o
5df0: 72 20 22 52 65 6c 65 61 73 65 22 20 61 6e 64 0d  r "Release" and.
5e00: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
5e10: 20 20 20 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 20      ${Platform} 
5e20: 69 73 20 65 69 74 68 65 72 20 22 57 69 6e 33 32  is either "Win32
5e30: 22 20 6f 72 20 22 78 36 34 22 2e 20 20 49 66 20  " or "x64".  If 
5e40: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 0d  this command is.
5e50: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
5e60: 20 20 20 20 75 73 65 64 2c 20 76 61 72 69 6f 75      used, variou
5e70: 73 20 74 65 73 74 73 20 74 68 61 74 20 72 65 71  s tests that req
5e80: 75 69 72 65 20 73 75 70 70 6c 65 6d 65 6e 74 61  uire supplementa
5e90: 72 79 20 6d 61 6e 61 67 65 64 0d 0a 20 20 20 20  ry managed..    
5ea0: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 61      #          a
5eb0: 73 73 65 6d 62 6c 69 65 73 20 28 65 2e 67 2e 20  ssemblies (e.g. 
5ec0: 4c 49 4e 51 29 20 6d 61 79 20 62 65 20 73 6b 69  LINQ) may be ski
5ed0: 70 70 65 64 20 75 6e 6c 65 73 73 20 74 68 6f 73  pped unless thos
5ee0: 65 20 62 69 6e 61 72 69 65 73 0d 0a 20 20 20 20  e binaries..    
5ef0: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 61      #          a
5f00: 72 65 20 73 75 62 73 65 71 75 65 6e 74 6c 79 20  re subsequently 
5f10: 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20  copied into the 
5f20: 63 6f 72 72 65 63 74 20 64 69 72 65 63 74 6f 72  correct director
5f30: 79 20 28 69 2e 65 2e 20 62 79 0d 0a 20 20 20 20  y (i.e. by..    
5f40: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 22      #          "
5f50: 74 65 73 74 5f 61 6c 6c 2e 62 61 74 22 29 2e 0d  test_all.bat")..
5f60: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
5f70: 20 20 20 20 23 20 20 20 20 20 20 20 4e 6f 74 65      #       Note
5f80: 20 74 68 61 74 20 61 6c 6c 20 6f 66 20 74 68 65   that all of the
5f90: 20 62 75 69 6c 64 20 63 6f 6d 6d 61 6e 64 73 20   build commands 
5fa0: 61 62 6f 76 65 20 77 69 6c 6c 20 64 65 66 61 75  above will defau
5fb0: 6c 74 20 74 6f 20 75 73 69 6e 67 0d 0a 20 20 20  lt to using..   
5fc0: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
5fd0: 20 6c 61 74 65 73 74 20 76 65 72 73 69 6f 6e 20   latest version 
5fe0: 6f 66 20 4d 53 42 75 69 6c 64 20 61 76 61 69 6c  of MSBuild avail
5ff0: 61 62 6c 65 20 61 6e 64 20 74 68 65 20 22 74 65  able and the "te
6000: 73 74 5f 79 65 61 72 22 20 6d 61 79 0d 0a 20 20  st_year" may..  
6010: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 65        #       ne
6020: 65 64 20 74 6f 20 62 65 20 61 64 6a 75 73 74 65  ed to be adjuste
6030: 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 20 74 6f  d accordingly to
6040: 20 61 63 74 75 61 6c 6c 79 20 72 75 6e 20 74 68   actually run th
6050: 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20  e test suite... 
6060: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 52         #       R
6070: 65 66 65 72 20 74 6f 20 74 68 65 20 63 6f 6d 6d  efer to the comm
6080: 65 6e 74 73 20 69 6e 20 5b 67 65 74 42 75 69 6c  ents in [getBuil
6090: 64 59 65 61 72 5d 20 66 6f 72 20 6d 6f 72 65 20  dYear] for more 
60a0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 0d 0a  information on..
60b0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
60c0: 68 6f 77 20 74 6f 20 73 65 74 20 74 68 69 73 20  how to set this 
60d0: 76 61 72 69 61 62 6c 65 2e 0d 0a 20 20 20 20 20  variable...     
60e0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65     #..        se
60f0: 74 20 6e 61 74 69 76 65 20 5b 68 61 73 52 75 6e  t native [hasRun
6100: 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76  timeOption nativ
6110: 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72 65  e]....        re
6120: 74 75 72 6e 20 5b 6a 6f 69 6e 42 75 69 6c 64 44  turn [joinBuildD
6130: 69 72 65 63 74 6f 72 79 20 24 6e 61 74 69 76 65  irectory $native
6140: 20 5b 67 65 74 42 75 69 6c 64 42 61 73 65 44 69   [getBuildBaseDi
6150: 72 65 63 74 6f 72 79 5d 20 5c 0d 0a 20 20 20 20  rectory] \..    
6160: 20 20 20 20 20 20 20 20 5b 67 65 74 42 75 69 6c          [getBuil
6170: 64 59 65 61 72 5d 20 5b 67 65 74 42 75 69 6c 64  dYear] [getBuild
6180: 50 6c 61 74 66 6f 72 6d 20 24 6e 61 74 69 76 65  Platform $native
6190: 5d 20 5b 67 65 74 42 75 69 6c 64 43 6f 6e 66 69  ] [getBuildConfi
61a0: 67 75 72 61 74 69 6f 6e 5d 5d 0d 0a 20 20 20 20  guration]]..    
61b0: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
61c0: 20 20 20 70 72 6f 63 20 67 65 74 52 65 6c 65 61     proc getRelea
61d0: 73 65 56 65 72 73 69 6f 6e 20 7b 7d 20 7b 0d 0a  seVersion {} {..
61e0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
61f0: 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f 75   NOTE: Figure ou
6200: 74 20 74 68 65 20 72 65 6c 65 61 73 65 20 76 65  t the release ve
6210: 72 73 69 6f 6e 20 66 6f 72 20 75 73 65 20 77 69  rsion for use wi
6220: 74 68 20 74 68 65 20 62 75 69 6c 64 20 64 69 72  th the build dir
6230: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 23 20  ectory..      # 
6240: 20 20 20 20 20 20 77 68 65 6e 20 63 68 65 63 6b        when check
6250: 69 6e 67 20 66 6f 72 20 61 76 61 69 6c 61 62 6c  ing for availabl
6260: 65 20 72 65 6c 65 61 73 65 73 2e 0d 0a 20 20 20  e releases...   
6270: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
6280: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 72  [info exists ::r
6290: 65 6c 65 61 73 65 5f 76 65 72 73 69 6f 6e 5d 20  elease_version] 
62a0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
62b0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
62c0: 3a 3a 72 65 6c 65 61 73 65 5f 76 65 72 73 69 6f  ::release_versio
62d0: 6e 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  n] > 0} then {..
62e0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
62f0: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 72     # NOTE: The r
6300: 65 6c 65 61 73 65 20 76 65 72 73 69 6f 6e 20 68  elease version h
6310: 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64  as been overridd
6320: 65 6e 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 75  en; therefore, u
6330: 73 65 20 69 74 0d 0a 20 20 20 20 20 20 20 20 23  se it..        #
6340: 20 20 20 20 20 20 20 76 65 72 62 61 74 69 6d 2e         verbatim.
6350: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
6360: 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 72       return $::r
6370: 65 6c 65 61 73 65 5f 76 65 72 73 69 6f 6e 0d 0a  elease_version..
6380: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
6390: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
63a0: 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 20 72 65     # NOTE: No re
63b0: 6c 65 61 73 65 20 76 65 72 73 69 6f 6e 20 69 73  lease version is
63c0: 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 74 75   available, retu
63d0: 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  rn an empty stri
63e0: 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ng...        #  
63f0: 20 20 20 20 20 49 74 20 69 73 20 69 6d 70 6f 72       It is impor
6400: 74 61 6e 74 20 74 6f 20 72 65 74 75 72 6e 20 61  tant to return a
6410: 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20 68  n empty string h
6420: 65 72 65 20 62 65 63 61 75 73 65 20 74 68 65 0d  ere because the.
6430: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
6440: 20 72 65 73 75 6c 74 20 6f 66 20 74 68 69 73 20   result of this 
6450: 70 72 6f 63 65 64 75 72 65 20 6d 61 79 20 62 65  procedure may be
6460: 20 75 73 65 64 20 77 69 74 68 20 5b 66 69 6c 65   used with [file
6470: 20 6a 6f 69 6e 5d 2e 0d 0a 20 20 20 20 20 20 20   join]...       
6480: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
6490: 72 6e 20 22 22 0d 0a 20 20 20 20 20 20 7d 0d 0a  rn ""..      }..
64a0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
64b0: 6f 63 20 67 65 74 42 75 69 6c 64 46 69 6c 65 4e  oc getBuildFileN
64c0: 61 6d 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b  ame { fileName {
64d0: 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7d 20 7b  platform ""} } {
64e0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
64f0: 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 73   # NOTE: Returns
6500: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
6510: 69 6c 65 20 6e 61 6d 65 20 61 73 20 69 66 20 69  ile name as if i
6520: 74 20 77 65 72 65 20 6c 6f 63 61 74 65 64 20 69  t were located i
6530: 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  n the..      #  
6540: 20 20 20 20 20 62 75 69 6c 64 20 64 69 72 65 63       build direc
6550: 74 6f 72 79 2c 20 64 69 73 63 61 72 64 69 6e 67  tory, discarding
6560: 20 61 6e 79 20 64 69 72 65 63 74 6f 72 79 20 69   any directory i
6570: 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 72 65 73 65  nformation prese
6580: 6e 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  nt..      #     
6590: 20 20 69 6e 20 74 68 65 20 66 69 6c 65 20 6e 61    in the file na
65a0: 6d 65 20 61 73 20 70 72 6f 76 69 64 65 64 20 62  me as provided b
65b0: 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20  y our caller... 
65c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65       #..      se
65d0: 74 20 72 65 73 75 6c 74 20 5b 66 69 6c 65 20 6e  t result [file n
65e0: 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20  ativename \..   
65f0: 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69         [file joi
6600: 6e 20 5b 67 65 74 42 75 69 6c 64 44 69 72 65 63  n [getBuildDirec
6610: 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d 20  tory] $platform 
6620: 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65  [file tail $file
6630: 4e 61 6d 65 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20  Name]]]....     
6640: 20 23 0d 0a 20 20 20 20 20 20 23 20 48 41 43 4b   #..      # HACK
6650: 3a 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20 6f  : When running o
6660: 6e 20 57 6f 57 36 34 2c 20 61 73 73 75 6d 65 20  n WoW64, assume 
6670: 74 68 65 20 74 65 73 74 20 65 78 65 63 75 74 61  the test executa
6680: 62 6c 65 73 20 61 72 65 20 70 72 65 73 65 6e 74  bles are present
6690: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
66a0: 77 69 74 68 20 74 68 65 20 22 33 32 22 20 73 75  with the "32" su
66b0: 66 66 69 78 20 6f 6e 20 74 68 65 6d 2e 0d 0a 20  ffix on them... 
66c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
66d0: 20 7b 5b 69 73 52 75 6e 6e 69 6e 67 57 6f 57 36   {[isRunningWoW6
66e0: 34 5d 20 26 26 20 5b 66 69 6c 65 20 65 78 74 65  4] && [file exte
66f0: 6e 73 69 6f 6e 20 24 72 65 73 75 6c 74 5d 20 65  nsion $result] e
6700: 71 20 22 2e 65 78 65 22 7d 20 74 68 65 6e 20 7b  q ".exe"} then {
6710: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 72 65  ..        set re
6720: 73 75 6c 74 20 5b 61 70 70 65 6e 64 41 72 67 73  sult [appendArgs
6730: 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20   [file rootname 
6740: 24 72 65 73 75 6c 74 5d 20 33 32 2e 65 78 65 5d  $result] 32.exe]
6750: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
6760: 20 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c     return $resul
6770: 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  t..    }.....   
6780: 20 70 72 6f 63 20 67 65 74 45 78 74 65 72 6e 61   proc getExterna
6790: 6c 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d  lDirectory {} {.
67a0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
67b0: 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f  # NOTE: This pro
67c0: 63 65 64 75 72 65 20 72 65 74 75 72 6e 73 20 74  cedure returns t
67d0: 68 65 20 64 69 72 65 63 74 6f 72 79 20 77 68 65  he directory whe
67e0: 72 65 20 74 68 65 20 65 78 74 65 72 6e 61 6c 20  re the external 
67f0: 62 69 6e 61 72 79 0d 0a 20 20 20 20 20 20 23 20  binary..      # 
6800: 20 20 20 20 20 20 66 69 6c 65 73 20 61 72 65 20        files are 
6810: 6c 6f 63 61 74 65 64 2e 0d 0a 20 20 20 20 20 20  located...      
6820: 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  #..      return 
6830: 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
6840: 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b   [file dirname [
6850: 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b 69 6e  file dirname [in
6860: 66 6f 20 62 69 6e 61 72 79 5d 5d 5d 5d 0d 0a 20  fo binary]]]].. 
6870: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
6880: 63 20 67 65 74 42 69 6e 61 72 79 44 69 72 65 63  c getBinaryDirec
6890: 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  tory {} {..     
68a0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
68b0: 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  : This procedure
68c0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 64 69 72   returns the dir
68d0: 65 63 74 6f 72 79 20 77 68 65 72 65 20 74 68 65  ectory where the
68e0: 20 74 65 73 74 20 61 70 70 6c 69 63 61 74 69 6f   test applicatio
68f0: 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  n..      #      
6900: 20 69 74 73 65 6c 66 20 28 69 2e 65 2e 20 74 68   itself (i.e. th
6910: 65 20 45 61 67 6c 65 20 73 68 65 6c 6c 29 20 69  e Eagle shell) i
6920: 73 20 6c 6f 63 61 74 65 64 2e 20 20 54 68 69 73  s located.  This
6930: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 61 73   will be used as
6940: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
6950: 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
6960: 66 6f 72 20 74 68 65 20 63 6f 70 69 65 64 20 53  for the copied S
6970: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
6980: 65 20 6e 61 74 69 76 65 20 61 6e 64 0d 0a 20 20  e native and..  
6990: 20 20 20 20 23 20 20 20 20 20 20 20 6d 61 6e 61      #       mana
69a0: 67 65 64 20 61 73 73 65 6d 62 6c 69 65 73 20 28  ged assemblies (
69b0: 69 2e 65 2e 20 62 65 63 61 75 73 65 20 74 68 69  i.e. because thi
69c0: 73 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20  s is one of the 
69d0: 66 65 77 20 70 6c 61 63 65 73 0d 0a 20 20 20 20  few places..    
69e0: 20 20 23 20 20 20 20 20 20 20 77 68 65 72 65 20    #       where 
69f0: 74 68 65 20 43 4c 52 20 77 69 6c 6c 20 61 63 74  the CLR will act
6a00: 75 61 6c 6c 79 20 66 69 6e 64 20 61 6e 64 20 6c  ually find and l
6a10: 6f 61 64 20 74 68 65 6d 20 70 72 6f 70 65 72 6c  oad them properl
6a20: 79 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  y)...      #..  
6a30: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
6a40: 69 73 74 73 20 3a 3a 62 69 6e 61 72 79 5f 64 69  ists ::binary_di
6a50: 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20  rectory] && \.. 
6a60: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
6a70: 20 6c 65 6e 67 74 68 20 24 3a 3a 62 69 6e 61 72   length $::binar
6a80: 79 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30  y_directory] > 0
6a90: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
6aa0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
6ab0: 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f  OTE: The locatio
6ac0: 6e 20 6f 66 20 74 68 65 20 62 69 6e 61 72 79 20  n of the binary 
6ad0: 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
6ae0: 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a  en overridden;..
6af0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6b00: 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  therefore, use i
6b10: 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20  t verbatim...   
6b20: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
6b30: 72 65 74 75 72 6e 20 24 3a 3a 62 69 6e 61 72 79  return $::binary
6b40: 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20  _directory..    
6b50: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
6b60: 20 20 20 20 72 65 74 75 72 6e 20 5b 69 6e 66 6f      return [info
6b70: 20 62 69 6e 61 72 79 5d 0d 0a 20 20 20 20 20 20   binary]..      
6b80: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
6b90: 20 70 72 6f 63 20 67 65 74 45 78 74 65 72 6e 61   proc getExterna
6ba0: 6c 46 69 6c 65 4e 61 6d 65 20 7b 20 66 69 6c 65  lFileName { file
6bb0: 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20  Name } {..      
6bc0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
6bd0: 20 52 65 74 75 72 6e 73 20 74 68 65 20 73 70 65   Returns the spe
6be0: 63 69 66 69 65 64 20 66 69 6c 65 20 6e 61 6d 65  cified file name
6bf0: 20 61 73 20 69 66 20 69 74 20 77 65 72 65 20 6c   as if it were l
6c00: 6f 63 61 74 65 64 20 69 6e 20 74 68 65 0d 0a 20  ocated in the.. 
6c10: 20 20 20 20 20 23 20 20 20 20 20 20 20 64 69 72       #       dir
6c20: 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e  ectory containin
6c30: 67 20 74 68 65 20 65 78 74 65 72 6e 61 6c 20 62  g the external b
6c40: 69 6e 61 72 69 65 73 2e 0d 0a 20 20 20 20 20 20  inaries...      
6c50: 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  #..      return 
6c60: 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
6c70: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74   [file join [get
6c80: 45 78 74 65 72 6e 61 6c 44 69 72 65 63 74 6f 72  ExternalDirector
6c90: 79 5d 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a  y] $fileName]]..
6ca0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
6cb0: 6f 63 20 67 65 74 42 69 6e 61 72 79 46 69 6c 65  oc getBinaryFile
6cc0: 4e 61 6d 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20  Name { fileName 
6cd0: 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7d 20  {platform ""} } 
6ce0: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
6cf0: 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e    # NOTE: Return
6d00: 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  s the specified 
6d10: 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 69 66 20  file name as if 
6d20: 69 74 20 77 65 72 65 20 6c 6f 63 61 74 65 64 20  it were located 
6d30: 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  in the..      # 
6d40: 20 20 20 20 20 20 62 69 6e 61 72 79 20 64 69 72        binary dir
6d50: 65 63 74 6f 72 79 2c 20 64 69 73 63 61 72 64 69  ectory, discardi
6d60: 6e 67 20 61 6e 79 20 64 69 72 65 63 74 6f 72 79  ng any directory
6d70: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 72 65   information pre
6d80: 73 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20 20  sent..      #   
6d90: 20 20 20 20 69 6e 20 74 68 65 20 66 69 6c 65 20      in the file 
6da0: 6e 61 6d 65 20 61 73 20 70 72 6f 76 69 64 65 64  name as provided
6db0: 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d   by our caller..
6dc0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
6dd0: 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74  return [file nat
6de0: 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20  ivename \..     
6df0: 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20       [file join 
6e00: 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65 63 74  [getBinaryDirect
6e10: 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d 20 5b  ory] $platform [
6e20: 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e  file tail $fileN
6e30: 61 6d 65 5d 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c  ame]]]..    }...
6e40: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 43 6f  ..    proc getCo
6e50: 72 65 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  reBinaryFileName
6e60: 20 7b 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d   { {platform ""}
6e70: 20 7b 73 74 61 6e 64 61 72 64 20 66 61 6c 73 65   {standard false
6e80: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
6e90: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
6ea0: 74 75 72 6e 73 20 74 68 65 20 66 75 6c 6c 20 70  turns the full p
6eb0: 61 74 68 20 66 6f 72 20 74 68 65 20 66 69 6c 65  ath for the file
6ec0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
6ed0: 53 51 4c 69 74 65 20 63 6f 72 65 0d 0a 20 20 20  SQLite core..   
6ee0: 20 20 20 23 20 20 20 20 20 20 20 6e 61 74 69 76     #       nativ
6ef0: 65 20 6c 69 62 72 61 72 79 20 63 6f 64 65 20 66  e library code f
6f00: 6f 72 20 74 68 69 73 20 70 6c 61 74 66 6f 72 6d  or this platform
6f10: 2e 20 20 46 69 72 73 74 2c 20 63 68 65 63 6b 20  .  First, check 
6f20: 61 6e 64 20 73 65 65 20 69 66 0d 0a 20 20 20 20  and see if..    
6f30: 20 20 23 20 20 20 20 20 20 20 74 68 65 20 53 51    #       the SQ
6f40: 4c 69 74 65 20 63 6f 72 65 20 6e 61 74 69 76 65  Lite core native
6f50: 20 6c 69 62 72 61 72 79 20 68 61 73 20 61 6c 72   library has alr
6f60: 65 61 64 79 20 62 65 65 6e 20 6c 6f 61 64 65 64  eady been loaded
6f70: 2e 20 20 4e 65 78 74 2c 0d 0a 20 20 20 20 20 20  .  Next,..      
6f80: 23 20 20 20 20 20 20 20 66 61 6c 6c 62 61 63 6b  #       fallback
6f90: 20 74 6f 20 77 68 61 74 20 74 68 65 20 66 75 6c   to what the ful
6fa0: 6c 20 70 61 74 68 20 73 68 6f 75 6c 64 20 62 65  l path should be
6fb0: 2c 20 62 61 73 65 64 20 6f 6e 20 77 68 65 74 68  , based on wheth
6fc0: 65 72 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  er the..      # 
6fd0: 20 20 20 20 20 20 6d 69 78 65 64 2d 6d 6f 64 65        mixed-mode
6fe0: 20 61 73 73 65 6d 62 6c 79 20 69 73 20 62 65 69   assembly is bei
6ff0: 6e 67 20 75 73 65 64 20 61 6e 64 20 74 68 65 20  ng used and the 
7000: 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 75 72 72  name of the curr
7010: 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ent..      #    
7020: 20 20 20 70 6c 61 74 66 6f 72 6d 2e 0d 0a 20 20     platform...  
7030: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
7040: 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
7050: 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
7060: 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
7070: 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
7080: 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
7090: 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76  Lite.UnsafeNativ
70a0: 65 4d 65 74 68 6f 64 73 20 5f 53 51 4c 69 74 65  eMethods _SQLite
70b0: 4e 61 74 69 76 65 4d 6f 64 75 6c 65 46 69 6c 65  NativeModuleFile
70c0: 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 20 66 69  Name..      } fi
70d0: 6c 65 4e 61 6d 65 5d 20 3d 3d 20 30 20 26 26 20  leName] == 0 && 
70e0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
70f0: 66 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74  fileName] > 0} t
7100: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
7110: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
7120: 3a 20 54 68 65 20 53 51 4c 69 74 65 20 63 6f 72  : The SQLite cor
7130: 65 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79  e native library
7140: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
7150: 6e 20 6c 6f 61 64 65 64 20 76 69 61 0d 0a 20 20  n loaded via..  
7160: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
7170: 65 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79  e native library
7180: 20 70 72 65 2d 6c 6f 61 64 65 72 2e 20 20 52 65   pre-loader.  Re
7190: 74 75 72 6e 20 74 68 61 74 20 66 69 6c 65 20 6e  turn that file n
71a0: 61 6d 65 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  ame now...      
71b0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
71c0: 75 72 6e 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20  urn $fileName.. 
71d0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
71e0: 69 66 20 7b 5b 68 61 73 52 75 6e 74 69 6d 65 4f  if {[hasRuntimeO
71f0: 70 74 69 6f 6e 20 6e 61 74 69 76 65 5d 7d 20 74  ption native]} t
7200: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
7210: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
7220: 3a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 69 78  : Return the mix
7230: 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79  ed-mode assembly
7240: 20 66 69 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20 20   file name...   
7250: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
7260: 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74  return [file nat
7270: 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20  ivename \..     
7280: 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69         [file joi
7290: 6e 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65  n [getBinaryDire
72a0: 63 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d  ctory] $platform
72b0: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
72c0: 69 74 65 2e 64 6c 6c 5d 5d 0d 0a 20 20 20 20 20  ite.dll]]..     
72d0: 20 7d 20 65 6c 73 65 69 66 20 7b 24 73 74 61 6e   } elseif {$stan
72e0: 64 61 72 64 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  dard} then {..  
72f0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
7300: 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20   # NOTE: Return 
7310: 74 68 65 20 6e 61 74 69 76 65 2d 6f 6e 6c 79 20  the native-only 
7320: 73 74 61 6e 64 61 72 64 20 53 51 4c 69 74 65 20  standard SQLite 
7330: 6c 69 62 72 61 72 79 20 66 69 6c 65 20 6e 61 6d  library file nam
7340: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
7350: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66         return [f
7360: 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c  ile nativename \
7370: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
7380: 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e  ile join [getBin
7390: 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20 24 70  aryDirectory] $p
73a0: 6c 61 74 66 6f 72 6d 20 73 71 6c 69 74 65 33 2e  latform sqlite3.
73b0: 64 6c 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d 20 65  dll]]..      } e
73c0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
73d0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
73e0: 3a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 74  : Return the nat
73f0: 69 76 65 2d 6f 6e 6c 79 20 69 6e 74 65 72 6f 70  ive-only interop
7400: 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 20 6e   assembly file n
7410: 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ame...        #.
7420: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
7430: 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
7440: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
7450: 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42  [file join [getB
7460: 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20  inaryDirectory] 
7470: 24 70 6c 61 74 66 6f 72 6d 20 53 51 4c 69 74 65  $platform SQLite
7480: 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 5d 5d 0d 0a  .Interop.dll]]..
7490: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
74a0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 43  ...    proc getC
74b0: 6f 6d 6d 6f 6e 44 69 72 65 63 74 6f 72 79 20 7b  ommonDirectory {
74c0: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
74d0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73      # NOTE: This
74e0: 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72   procedure retur
74f0: 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ns the directory
7500: 20 77 68 65 72 65 20 74 68 65 20 74 65 73 74 20   where the test 
7510: 73 63 72 69 70 74 73 0d 0a 20 20 20 20 20 20 23  scripts..      #
7520: 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65         should be
7530: 20 6c 6f 63 61 74 65 64 2e 20 20 42 79 20 64 65   located.  By de
7540: 66 61 75 6c 74 2c 20 74 68 69 73 20 6a 75 73 74  fault, this just
7550: 20 72 65 74 75 72 6e 73 20 74 68 65 20 45 61 67   returns the Eag
7560: 6c 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  le..      #     
7570: 20 20 62 69 6e 61 72 79 20 64 69 72 65 63 74 6f    binary directo
7580: 72 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ry...      #..  
7590: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
75a0: 69 73 74 73 20 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69  ists ::common_di
75b0: 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20  rectory] && \.. 
75c0: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
75d0: 20 6c 65 6e 67 74 68 20 24 3a 3a 63 6f 6d 6d 6f   length $::commo
75e0: 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30  n_directory] > 0
75f0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
7600: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
7610: 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f  OTE: The locatio
7620: 6e 20 6f 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  n of the common 
7630: 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
7640: 65 6e 20 73 65 74 3b 0d 0a 20 20 20 20 20 20 20  en set;..       
7650: 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f   #       therefo
7660: 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20  re, use it...   
7670: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
7680: 72 65 74 75 72 6e 20 24 3a 3a 63 6f 6d 6d 6f 6e  return $::common
7690: 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20  _directory..    
76a0: 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66    } elseif {[inf
76b0: 6f 20 65 78 69 73 74 73 20 3a 3a 76 65 6e 64 6f  o exists ::vendo
76c0: 72 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20  r_directory] && 
76d0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
76e0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 76  ring length $::v
76f0: 65 6e 64 6f 72 5f 64 69 72 65 63 74 6f 72 79 5d  endor_directory]
7700: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
7710: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
7720: 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63   # NOTE: The loc
7730: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 65 6e  ation of the ven
7740: 64 6f 72 20 64 69 72 65 63 74 6f 72 79 20 68 61  dor directory ha
7750: 73 20 62 65 65 6e 20 73 65 74 3b 0d 0a 20 20 20  s been set;..   
7760: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
7770: 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d  refore, use it..
7780: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
7790: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 76 65      return $::ve
77a0: 6e 64 6f 72 5f 64 69 72 65 63 74 6f 72 79 0d 0a  ndor_directory..
77b0: 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
77c0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
77d0: 63 6c 5f 6c 69 62 72 61 72 79 5d 20 26 26 20 5c  cl_library] && \
77e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
77f0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 63  ing length $::tc
7800: 6c 5f 6c 69 62 72 61 72 79 5d 20 3e 20 30 20 26  l_library] > 0 &
7810: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
7820: 66 69 6c 65 20 69 73 64 69 72 65 63 74 6f 72 79  file isdirectory
7830: 20 24 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79 5d   $::tcl_library]
7840: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
7850: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
7860: 4f 54 45 3a 20 54 68 65 20 76 61 72 69 61 62 6c  OTE: The variabl
7870: 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 61 74  e with the locat
7880: 69 6f 6e 20 6f 66 20 74 68 65 20 73 63 72 69 70  ion of the scrip
7890: 74 20 6c 69 62 72 61 72 79 20 69 73 0d 0a 20 20  t library is..  
78a0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 65        #       se
78b0: 74 20 61 6e 64 20 61 70 70 65 61 72 73 20 74 6f  t and appears to
78c0: 20 62 65 20 61 20 72 65 61 6c 20 64 69 72 65 63   be a real direc
78d0: 74 6f 72 79 20 28 69 2e 65 2e 20 6e 6f 74 20 65  tory (i.e. not e
78e0: 6d 62 65 64 64 65 64 0d 0a 20 20 20 20 20 20 20  mbedded..       
78f0: 20 23 20 20 20 20 20 20 20 77 69 74 68 69 6e 20   #       within 
7900: 61 20 66 69 6c 65 29 3b 20 74 68 65 72 65 66 6f  a file); therefo
7910: 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20  re, use it...   
7920: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
7930: 72 65 74 75 72 6e 20 24 3a 3a 74 63 6c 5f 6c 69  return $::tcl_li
7940: 62 72 61 72 79 0d 0a 20 20 20 20 20 20 7d 20 65  brary..      } e
7950: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
7960: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
7970: 3a 20 46 61 6c 6c 62 61 63 6b 20 74 6f 20 74 68  : Fallback to th
7980: 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74  e directory cont
7990: 61 69 6e 69 6e 67 20 74 68 65 20 65 78 65 63 75  aining the execu
79a0: 74 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  table...        
79b0: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
79c0: 6e 20 5b 69 6e 66 6f 20 62 69 6e 61 72 79 5d 0d  n [info binary].
79d0: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
79e0: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
79f0: 44 61 74 61 62 61 73 65 44 69 72 65 63 74 6f 72  DatabaseDirector
7a00: 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  y {} {..      #.
7a10: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
7a20: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65  his procedure re
7a30: 74 75 72 6e 73 20 74 68 65 20 64 69 72 65 63 74  turns the direct
7a40: 6f 72 79 20 77 68 65 72 65 20 74 68 65 20 74 65  ory where the te
7a50: 73 74 20 64 61 74 61 62 61 73 65 73 0d 0a 20 20  st databases..  
7a60: 20 20 20 20 23 20 20 20 20 20 20 20 73 68 6f 75      #       shou
7a70: 6c 64 20 62 65 20 6c 6f 63 61 74 65 64 2e 20 20  ld be located.  
7a80: 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69 73  By default, this
7a90: 20 6a 75 73 74 20 75 73 65 73 20 74 68 65 20 74   just uses the t
7aa0: 65 6d 70 6f 72 61 72 79 0d 0a 20 20 20 20 20 20  emporary..      
7ab0: 23 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72  #       director
7ac0: 79 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72  y configured for
7ad0: 20 74 68 69 73 20 73 79 73 74 65 6d 2e 0d 0a 20   this system... 
7ae0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
7af0: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
7b00: 3a 64 61 74 61 62 61 73 65 5f 64 69 72 65 63 74  :database_direct
7b10: 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ory] && \..     
7b20: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
7b30: 67 74 68 20 24 3a 3a 64 61 74 61 62 61 73 65 5f  gth $::database_
7b40: 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20  directory] > 0} 
7b50: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
7b60: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
7b70: 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  E: The location 
7b80: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
7b90: 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
7ba0: 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a  en overridden;..
7bb0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
7bc0: 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  therefore, use i
7bd0: 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
7be0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
7bf0: 3a 64 61 74 61 62 61 73 65 5f 64 69 72 65 63 74  :database_direct
7c00: 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  ory..      } els
7c10: 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74  eif {[info exist
7c20: 73 20 3a 3a 73 63 72 61 74 63 68 5f 64 69 72 65  s ::scratch_dire
7c30: 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20  ctory] && \..   
7c40: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
7c50: 65 6e 67 74 68 20 24 3a 3a 73 63 72 61 74 63 68  ength $::scratch
7c60: 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d  _directory] > 0}
7c70: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
7c80: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
7c90: 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e  TE: The location
7ca0: 20 6f 66 20 74 68 65 20 73 63 72 61 74 63 68 20   of the scratch 
7cb0: 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
7cc0: 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a  en overridden;..
7cd0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
7ce0: 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  therefore, use i
7cf0: 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
7d00: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
7d10: 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63 74 6f  :scratch_directo
7d20: 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ry..      } else
7d30: 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
7d40: 72 6e 20 5b 67 65 74 54 65 6d 70 6f 72 61 72 79  rn [getTemporary
7d50: 50 61 74 68 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  Path]..      }..
7d60: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
7d70: 6f 63 20 67 65 74 54 65 6d 70 6f 72 61 72 79 44  oc getTemporaryD
7d80: 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20  irectory {} {.. 
7d90: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
7da0: 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65  NOTE: This proce
7db0: 64 75 72 65 20 72 65 74 75 72 6e 73 20 74 68 65  dure returns the
7dc0: 20 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65   directory where
7dd0: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
7de0: 69 6c 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20  iles..      #   
7df0: 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 6c 6f      should be lo
7e00: 63 61 74 65 64 2e 20 20 42 79 20 64 65 66 61 75  cated.  By defau
7e10: 6c 74 2c 20 74 68 69 73 20 6a 75 73 74 20 75 73  lt, this just us
7e20: 65 73 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  es the temporary
7e30: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
7e40: 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 66 69 67  directory config
7e50: 75 72 65 64 20 66 6f 72 20 74 68 69 73 20 73 79  ured for this sy
7e60: 73 74 65 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  stem...      #..
7e70: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
7e80: 65 78 69 73 74 73 20 3a 3a 74 65 6d 70 6f 72 61  exists ::tempora
7e90: 72 79 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26  ry_directory] &&
7ea0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
7eb0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
7ec0: 74 65 6d 70 6f 72 61 72 79 5f 64 69 72 65 63 74  temporary_direct
7ed0: 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ory] > 0} then {
7ee0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
7ef0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
7f00: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
7f10: 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63   temporary direc
7f20: 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76  tory has been ov
7f30: 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20  erridden;..     
7f40: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 72 65     #       there
7f50: 66 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20  fore, use it... 
7f60: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
7f70: 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 6d 70    return $::temp
7f80: 6f 72 61 72 79 5f 64 69 72 65 63 74 6f 72 79 0d  orary_directory.
7f90: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20  .      } elseif 
7fa0: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
7fb0: 73 63 72 61 74 63 68 5f 64 69 72 65 63 74 6f 72  scratch_director
7fc0: 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  y] && \..       
7fd0: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
7fe0: 68 20 24 3a 3a 73 63 72 61 74 63 68 5f 64 69 72  h $::scratch_dir
7ff0: 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65  ectory] > 0} the
8000: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
8010: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
8020: 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  The location of 
8030: 74 68 65 20 73 63 72 61 74 63 68 20 64 69 72 65  the scratch dire
8040: 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 6f  ctory has been o
8050: 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20  verridden;..    
8060: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 72      #       ther
8070: 65 66 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a  efore, use it...
8080: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
8090: 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 73 63 72     return $::scr
80a0: 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79 0d 0a  atch_directory..
80b0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
80c0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
80d0: 67 65 74 54 65 6d 70 6f 72 61 72 79 50 61 74 68  getTemporaryPath
80e0: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
80f0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
8100: 65 74 45 78 65 63 75 74 65 4f 6e 53 65 74 75 70  etExecuteOnSetup
8110: 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20   {} {..      if 
8120: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
8130: 65 78 65 63 75 74 65 5f 6f 6e 5f 73 65 74 75 70  execute_on_setup
8140: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
8150: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
8160: 20 24 3a 3a 65 78 65 63 75 74 65 5f 6f 6e 5f 73   $::execute_on_s
8170: 65 74 75 70 5d 20 3e 20 30 7d 20 74 68 65 6e 20  etup] > 0} then 
8180: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
8190: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
81a0: 74 75 72 6e 20 74 68 65 20 63 6f 6e 66 69 67 75  turn the configu
81b0: 72 65 64 20 53 51 4c 20 74 6f 20 65 78 65 63 75  red SQL to execu
81c0: 74 65 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f  te during the co
81d0: 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20  nnection..      
81e0: 20 20 23 20 20 20 20 20 20 20 73 65 74 75 70 20    #       setup 
81f0: 70 72 6f 63 65 64 75 72 65 20 28 69 2e 65 2e 20  procedure (i.e. 
8200: 66 6f 72 20 65 76 65 72 79 20 74 65 73 74 20 64  for every test d
8210: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
8220: 6f 6e 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  on)...        #.
8230: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
8240: 24 3a 3a 65 78 65 63 75 74 65 5f 6f 6e 5f 73 65  $::execute_on_se
8250: 74 75 70 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  tup..      } els
8260: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e {..        #..
8270: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
8280: 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68 65 72  By default, ther
8290: 65 20 69 73 20 6e 6f 20 53 51 4c 20 74 6f 20 65  e is no SQL to e
82a0: 78 65 63 75 74 65 20 64 75 72 69 6e 67 20 74 68  xecute during th
82b0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20  e connection..  
82c0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 65        #       se
82d0: 74 75 70 20 70 72 6f 63 65 64 75 72 65 20 28 69  tup procedure (i
82e0: 2e 65 2e 20 66 6f 72 20 65 76 65 72 79 20 74 65  .e. for every te
82f0: 73 74 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  st database conn
8300: 65 63 74 69 6f 6e 29 2e 0d 0a 20 20 20 20 20 20  ection)...      
8310: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
8320: 75 72 6e 20 22 22 0d 0a 20 20 20 20 20 20 7d 0d  urn ""..      }.
8330: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
8340: 72 6f 63 20 67 65 74 54 65 73 74 4f 76 65 72 72  roc getTestOverr
8350: 69 64 65 73 50 72 65 61 6d 62 6c 65 20 7b 20 7b  idesPreamble { {
8360: 65 78 74 72 61 56 61 72 4e 61 6d 65 73 20 22 22  extraVarNames ""
8370: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  } } {..      set
8380: 20 76 61 72 4e 61 6d 65 73 20 5b 6c 69 73 74 5d   varNames [list]
8390: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
83a0: 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 61 76     # NOTE: If av
83b0: 61 69 6c 61 62 6c 65 2c 20 73 74 61 72 74 20 77  ailable, start w
83c0: 69 74 68 20 74 68 65 20 6d 61 73 74 65 72 20 6c  ith the master l
83d0: 69 73 74 20 6f 66 20 74 65 73 74 20 6f 76 65 72  ist of test over
83e0: 72 69 64 65 0d 0a 20 20 20 20 20 20 23 20 20 20  ride..      #   
83f0: 20 20 20 20 76 61 72 69 61 62 6c 65 73 2e 0d 0a      variables...
8400: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
8410: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
8420: 3a 3a 74 65 73 74 5f 6f 76 65 72 72 69 64 65 73  ::test_overrides
8430: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
8440: 20 20 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a 74 65    [llength $::te
8450: 73 74 5f 6f 76 65 72 72 69 64 65 73 5d 20 3e 20  st_overrides] > 
8460: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
8470: 20 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20     eval lappend 
8480: 76 61 72 4e 61 6d 65 73 20 24 3a 3a 74 65 73 74  varNames $::test
8490: 5f 6f 76 65 72 72 69 64 65 73 0d 0a 20 20 20 20  _overrides..    
84a0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
84b0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
84c0: 20 72 65 71 75 65 73 74 65 64 20 62 79 20 6f 75   requested by ou
84d0: 72 20 63 61 6c 6c 65 72 2c 20 61 64 64 20 61 6e  r caller, add an
84e0: 79 20 61 64 64 69 74 69 6f 6e 61 6c 20 76 61 72  y additional var
84f0: 69 61 62 6c 65 0d 0a 20 20 20 20 20 20 23 20 20  iable..      #  
8500: 20 20 20 20 20 6e 61 6d 65 73 20 74 6f 20 63 6f       names to co
8510: 70 79 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23  py now...      #
8520: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65  ..      if {[lle
8530: 6e 67 74 68 20 24 65 78 74 72 61 56 61 72 4e 61  ngth $extraVarNa
8540: 6d 65 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  mes] > 0} then {
8550: 0d 0a 20 20 20 20 20 20 20 20 65 76 61 6c 20 6c  ..        eval l
8560: 61 70 70 65 6e 64 20 76 61 72 4e 61 6d 65 73 20  append varNames 
8570: 24 65 78 74 72 61 56 61 72 4e 61 6d 65 73 0d 0a  $extraVarNames..
8580: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
8590: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
85a0: 3a 20 42 75 69 6c 64 20 74 68 65 20 73 63 72 69  : Build the scri
85b0: 70 74 20 66 72 61 67 6d 65 6e 74 20 74 6f 20 62  pt fragment to b
85c0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 70 72  e returned by pr
85d0: 6f 63 65 73 73 69 6e 67 20 65 61 63 68 0d 0a 20  ocessing each.. 
85e0: 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61 72       #       var
85f0: 69 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 61  iable name and a
8600: 64 64 69 6e 67 20 74 68 65 20 6e 65 63 65 63 65  dding the necece
8610: 73 73 61 72 79 20 73 63 72 69 70 74 20 66 72 61  ssary script fra
8620: 67 6d 65 6e 74 73 20 66 6f 72 0d 0a 20 20 20 20  gments for..    
8630: 20 20 23 20 20 20 20 20 20 20 65 61 63 68 20 6f    #       each o
8640: 6e 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ne...      #..  
8650: 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 22      set result "
8660: 22 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65 61  "....      forea
8670: 63 68 20 76 61 72 4e 61 6d 65 20 24 76 61 72 4e  ch varName $varN
8680: 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
8690: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
86a0: 45 3a 20 42 75 69 6c 64 20 74 68 65 20 71 75 61  E: Build the qua
86b0: 6c 69 66 69 65 64 20 67 6c 6f 62 61 6c 20 76 61  lified global va
86c0: 72 69 61 62 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20  riable name...  
86d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
86e0: 20 73 65 74 20 66 75 6c 6c 56 61 72 4e 61 6d 65   set fullVarName
86f0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 3a 3a 20   [appendArgs :: 
8700: 24 76 61 72 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20  $varName]....   
8710: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
8720: 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20 74 68 65  # NOTE: Does the
8730: 20 76 61 72 69 61 62 6c 65 20 65 78 69 73 74 20   variable exist 
8740: 69 6e 20 74 68 69 73 20 69 6e 74 65 72 70 72 65  in this interpre
8750: 74 65 72 20 63 6f 6e 74 65 78 74 3f 0d 0a 20 20  ter context?..  
8760: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
8770: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
8780: 73 20 24 66 75 6c 6c 56 61 72 4e 61 6d 65 5d 7d  s $fullVarName]}
8790: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
87a0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
87b0: 23 20 4e 4f 54 45 3a 20 41 70 70 65 6e 64 20 61  # NOTE: Append a
87c0: 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74   script fragment
87d0: 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20 74   to the result t
87e0: 68 61 74 20 77 69 6c 6c 20 63 6f 72 72 65 63 74  hat will correct
87f0: 6c 79 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  ly..          # 
8800: 20 20 20 20 20 20 63 6f 70 79 20 61 6e 79 20 63        copy any c
8810: 6f 6e 74 61 69 6e 65 64 20 76 61 6c 75 65 20 74  ontained value t
8820: 6f 20 61 6e 6f 74 68 65 72 20 69 6e 74 65 72 70  o another interp
8830: 72 65 74 65 72 20 63 6f 6e 74 65 78 74 2e 0d 0a  reter context...
8840: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
8850: 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 72 65         append re
8860: 73 75 6c 74 20 5c 6e 20 22 73 65 74 20 22 20 24  sult \n "set " $
8870: 66 75 6c 6c 56 61 72 4e 61 6d 65 20 22 20 5c 7b  fullVarName " \{
8880: 22 20 5b 73 65 74 20 24 66 75 6c 6c 56 61 72 4e  " [set $fullVarN
8890: 61 6d 65 5d 20 5c 7d 0d 0a 20 20 20 20 20 20 20  ame] \}..       
88a0: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
88b0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
88c0: 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 72 65 73  NOTE: If the res
88d0: 75 6c 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  ult contains one
88e0: 20 6f 72 20 6d 6f 72 65 20 73 63 72 69 70 74 20   or more script 
88f0: 66 72 61 67 6d 65 6e 74 73 2c 20 61 70 70 65 6e  fragments, appen
8900: 64 20 61 0d 0a 20 20 20 20 20 20 23 20 20 20 20  d a..      #    
8910: 20 20 20 6e 65 77 6c 69 6e 65 2e 0d 0a 20 20 20     newline...   
8920: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
8930: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
8940: 72 65 73 75 6c 74 5d 20 3e 20 30 7d 20 74 68 65  result] > 0} the
8950: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70  n {..        app
8960: 65 6e 64 20 72 65 73 75 6c 74 20 5c 6e 0d 0a 20  end result \n.. 
8970: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
8980: 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a  return $result..
8990: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
89a0: 6f 63 20 67 65 74 41 70 70 44 6f 6d 61 69 6e 50  oc getAppDomainP
89b0: 72 65 61 6d 62 6c 65 20 7b 20 7b 70 72 65 66 69  reamble { {prefi
89c0: 78 20 22 22 7d 20 7b 73 75 66 66 69 78 20 22 22  x ""} {suffix ""
89d0: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
89e0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
89f0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74  is procedure ret
8a00: 75 72 6e 73 20 61 20 74 65 73 74 20 73 65 74 75  urns a test setu
8a10: 70 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e  p script fragmen
8a20: 74 20 73 75 69 74 61 62 6c 65 20 66 6f 72 0d 0a  t suitable for..
8a30: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65 76        #       ev
8a40: 61 6c 75 61 74 69 6f 6e 20 62 79 20 61 6e 20 69  aluation by an i
8a50: 6e 74 65 72 70 72 65 74 65 72 20 63 72 65 61 74  nterpreter creat
8a60: 65 64 20 69 6e 20 61 6e 20 69 73 6f 6c 61 74 65  ed in an isolate
8a70: 64 20 61 70 70 6c 69 63 61 74 69 6f 6e 0d 0a 20  d application.. 
8a80: 20 20 20 20 20 23 20 20 20 20 20 20 20 64 6f 6d       #       dom
8a90: 61 69 6e 2e 20 20 54 68 65 20 73 63 72 69 70 74  ain.  The script
8aa0: 20 66 72 61 67 6d 65 6e 74 20 62 65 69 6e 67 20   fragment being 
8ab0: 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65  returned will be
8ac0: 20 73 75 72 72 6f 75 6e 64 65 64 20 62 79 0d 0a   surrounded by..
8ad0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
8ae0: 65 20 70 72 65 66 69 78 20 61 6e 64 20 73 75 66  e prefix and suf
8af0: 66 69 78 20 22 73 63 72 69 70 74 20 66 72 61 67  fix "script frag
8b00: 6d 65 6e 74 73 22 20 73 70 65 63 69 66 69 65 64  ments" specified
8b10: 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2c 0d   by our caller,.
8b20: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69  .      #       i
8b30: 66 20 61 6e 79 2e 20 20 54 68 65 20 65 6e 74 69  f any.  The enti
8b40: 72 65 20 73 63 72 69 70 74 20 62 65 69 6e 67 20  re script being 
8b50: 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65  returned will be
8b60: 20 73 75 62 73 74 69 74 75 74 65 64 20 76 69 61   substituted via
8b70: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
8b80: 5b 73 75 62 73 74 5d 2c 20 69 6e 20 74 68 65 20  [subst], in the 
8b90: 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 20 63  context of our c
8ba0: 61 6c 6c 65 72 2c 20 62 65 66 6f 72 65 20 62 65  aller, before be
8bb0: 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 0d 0a 20  ing returned... 
8bc0: 20 20 20 20 20 23 20 20 20 20 20 20 20 54 68 69       #       Thi
8bd0: 73 20 73 74 65 70 20 69 73 20 6e 65 63 65 73 73  s step is necess
8be0: 61 72 79 20 73 6f 20 74 68 61 74 20 73 6f 6d 65  ary so that some
8bf0: 20 6c 69 6d 69 74 65 64 20 63 6f 6e 74 65 78 74   limited context
8c00: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2c 0d 0a 20   information,.. 
8c10: 20 20 20 20 20 23 20 20 20 20 20 20 20 70 72 69       #       pri
8c20: 6d 61 72 69 6c 79 20 72 65 6c 61 74 65 64 20 74  marily related t
8c30: 6f 20 74 68 65 20 74 65 73 74 69 6e 67 20 64 69  o the testing di
8c40: 72 65 63 74 6f 72 69 65 73 2c 20 63 61 6e 20 62  rectories, can b
8c50: 65 20 74 72 61 6e 73 66 65 72 72 65 64 0d 0a 20  e transferred.. 
8c60: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20       #       to 
8c70: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20  the interpreter 
8c80: 69 6e 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20  in the isolated 
8c90: 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 6f 6d 61  application doma
8ca0: 69 6e 2c 20 6d 61 6b 69 6e 67 20 69 74 0d 0a 20  in, making it.. 
8cb0: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 62 6c       #       abl
8cc0: 65 20 74 6f 20 73 75 63 63 65 73 73 66 75 6c 6c  e to successfull
8cd0: 79 20 72 75 6e 20 74 65 73 74 73 20 74 68 61 74  y run tests that
8ce0: 20 72 65 71 75 69 72 65 20 6f 6e 65 20 6f 72 20   require one or 
8cf0: 6d 6f 72 65 20 6f 66 20 74 68 65 0d 0a 20 20 20  more of the..   
8d00: 20 20 20 23 20 20 20 20 20 20 20 66 69 6c 65 73     #       files
8d10: 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74   in one of the t
8d20: 65 73 74 69 6e 67 20 64 69 72 65 63 74 6f 72 69  esting directori
8d30: 65 73 2e 20 20 43 61 6c 6c 65 72 73 20 73 68 6f  es.  Callers sho
8d40: 75 6c 64 20 6b 65 65 70 20 69 6e 0d 0a 20 20 20  uld keep in..   
8d50: 20 20 20 23 20 20 20 20 20 20 20 6d 69 6e 64 20     #       mind 
8d60: 74 68 61 74 20 74 68 65 20 74 65 73 74 20 73 63  that the test sc
8d70: 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20 62 65  ript fragment be
8d80: 69 6e 67 20 72 65 74 75 72 6e 65 64 20 63 61 6e  ing returned can
8d90: 6e 6f 74 20 72 65 6c 79 20 6f 6e 0d 0a 20 20 20  not rely on..   
8da0: 20 20 20 23 20 20 20 20 20 20 20 61 6e 79 20 73     #       any s
8db0: 63 72 69 70 74 20 6c 69 62 72 61 72 79 20 70 72  cript library pr
8dc0: 6f 63 65 64 75 72 65 73 20 74 68 61 74 20 61 72  ocedures that ar
8dd0: 65 20 6e 6f 74 20 70 72 6f 76 69 64 65 64 20 62  e not provided b
8de0: 79 20 74 68 65 20 45 61 67 6c 65 0d 0a 20 20 20  y the Eagle..   
8df0: 20 20 20 23 20 20 20 20 20 20 20 6c 69 62 72 61     #       libra
8e00: 72 79 20 70 61 63 6b 61 67 65 20 28 69 2e 65 2e  ry package (i.e.
8e10: 20 22 69 6e 69 74 2e 65 61 67 6c 65 22 29 2c 20   "init.eagle"), 
8e20: 69 6e 63 6c 75 64 69 6e 67 20 74 68 6f 73 65 20  including those 
8e30: 70 72 6f 76 69 64 65 64 20 62 79 0d 0a 20 20 20  provided by..   
8e40: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 45     #       the E
8e50: 61 67 6c 65 20 74 65 73 74 20 70 61 63 6b 61 67  agle test packag
8e60: 65 2c 20 75 6e 6c 65 73 73 20 74 68 65 20 66 69  e, unless the fi
8e70: 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
8e80: 65 6d 20 69 73 20 6c 6f 61 64 65 64 0d 0a 20 20  em is loaded..  
8e90: 20 20 20 20 23 20 20 20 20 20 20 20 6d 61 6e 75      #       manu
8ea0: 61 6c 6c 79 20 76 69 61 20 73 6f 6d 65 20 6f 74  ally via some ot
8eb0: 68 65 72 20 6d 65 63 68 61 6e 69 73 6d 20 28 65  her mechanism (e
8ec0: 2e 67 2e 20 62 79 20 69 6e 63 6c 75 64 69 6e 67  .g. by including
8ed0: 20 61 70 70 72 6f 70 72 69 61 74 65 0d 0a 20 20   appropriate..  
8ee0: 20 20 20 20 23 20 20 20 20 20 20 20 5b 70 61 63      #       [pac
8ef0: 6b 61 67 65 20 72 65 71 75 69 72 65 5d 20 6f 72  kage require] or
8f00: 20 5b 73 6f 75 72 63 65 5d 20 63 6f 6d 6d 61 6e   [source] comman
8f10: 64 73 20 69 6e 20 74 68 65 20 70 72 65 66 69 78  ds in the prefix
8f20: 20 6f 72 20 73 75 66 66 69 78 0d 0a 20 20 20 20   or suffix..    
8f30: 20 20 23 20 20 20 20 20 20 20 73 63 72 69 70 74    #       script
8f40: 20 66 72 61 67 6d 65 6e 74 73 29 2e 20 20 41 6c   fragments).  Al
8f50: 73 6f 2c 20 61 6c 6c 20 76 61 72 69 61 62 6c 65  so, all variable
8f60: 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20   references and 
8f70: 61 6c 6c 20 6e 65 73 74 65 64 0d 0a 20 20 20 20  all nested..    
8f80: 20 20 23 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e    #       comman
8f90: 64 73 20 28 69 2e 65 2e 20 74 68 6f 73 65 20 69  ds (i.e. those i
8fa0: 6e 20 73 71 75 61 72 65 20 62 72 61 63 6b 65 74  n square bracket
8fb0: 73 29 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  s) contained in 
8fc0: 74 68 65 20 66 69 6e 61 6c 0d 0a 20 20 20 20 20  the final..     
8fd0: 20 23 20 20 20 20 20 20 20 73 63 72 69 70 74 20   #       script 
8fe0: 66 72 61 67 6d 65 6e 74 20 77 69 6c 6c 20 65 6e  fragment will en
8ff0: 64 20 75 70 20 62 65 69 6e 67 20 65 76 61 6c 75  d up being evalu
9000: 61 74 65 64 20 69 6e 20 74 68 65 20 63 6f 6e 74  ated in the cont
9010: 65 78 74 20 6f 66 20 74 68 65 0d 0a 20 20 20 20  ext of the..    
9020: 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c 69 6e    #       callin
9030: 67 20 69 6e 74 65 72 70 72 65 74 65 72 20 61 6e  g interpreter an
9040: 64 20 6e 6f 74 20 74 68 65 20 74 61 72 67 65 74  d not the target
9050: 20 69 6e 74 65 72 70 72 65 74 65 72 20 63 72 65   interpreter cre
9060: 61 74 65 64 20 69 6e 20 74 68 65 0d 0a 20 20 20  ated in the..   
9070: 20 20 20 23 20 20 20 20 20 20 20 69 73 6f 6c 61     #       isola
9080: 74 65 64 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  ted application 
9090: 64 6f 6d 61 69 6e 20 75 6e 6c 65 73 73 20 74 68  domain unless th
90a0: 65 20 64 6f 6c 6c 61 72 20 73 69 67 6e 73 20 61  e dollar signs a
90b0: 6e 64 2f 6f 72 20 73 71 75 61 72 65 0d 0a 20 20  nd/or square..  
90c0: 20 20 20 20 23 20 20 20 20 20 20 20 62 72 61 63      #       brac
90d0: 6b 65 74 73 20 61 72 65 20 73 70 65 63 69 61 6c  kets are special
90e0: 6c 79 20 71 75 6f 74 65 64 20 77 69 74 68 20 62  ly quoted with b
90f0: 61 63 6b 73 6c 61 73 68 65 73 2e 0d 0a 20 20 20  ackslashes...   
9100: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
9110: 72 6e 20 5b 75 70 6c 65 76 65 6c 20 31 20 5b 6c  rn [uplevel 1 [l
9120: 69 73 74 20 73 75 62 73 74 20 5b 61 70 70 65 6e  ist subst [appen
9130: 64 41 72 67 73 20 24 70 72 65 66 69 78 20 7b 0d  dArgs $prefix {.
9140: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
9150: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
9160: 5c 5b 6f 62 6a 65 63 74 5c 5d 20 63 6f 6d 6d 61  \[object\] comma
9170: 6e 64 20 6d 61 79 20 62 65 20 6d 69 73 73 69 6e  nd may be missin
9180: 67 20 69 6e 20 73 6f 6d 65 20 45 61 67 6c 65 20  g in some Eagle 
9190: 63 6f 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20  core..        # 
91a0: 20 20 20 20 20 20 6c 69 62 72 61 72 79 20 63 6f        library co
91b0: 6e 66 69 67 75 72 61 74 69 6f 6e 73 2e 20 20 43  nfigurations.  C
91c0: 6c 6f 6e 69 6e 67 20 61 6e 64 20 75 73 69 6e 67  loning and using
91d0: 20 74 68 65 20 70 72 6f 63 65 64 75 72 65 0d 0a   the procedure..
91e0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
91f0: 5c 5b 63 68 61 6e 67 65 4e 61 74 69 76 65 52 75  \[changeNativeRu
9200: 6e 74 69 6d 65 4f 70 74 69 6f 6e 5c 5d 20 6d 61  ntimeOption\] ma
9210: 79 20 68 65 6c 70 20 74 6f 20 6d 69 74 69 67 61  y help to mitiga
9220: 74 65 20 74 68 69 73 2e 0d 0a 20 20 20 20 20 20  te this...      
9230: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 70 72 6f    #..        pro
9240: 63 20 63 68 61 6e 67 65 4e 61 74 69 76 65 52 75  c changeNativeRu
9250: 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 5c 0d 0a 20  ntimeOption \.. 
9260: 20 20 20 20 20 20 20 20 20 20 20 7b 5b 69 6e 66             {[inf
9270: 6f 20 61 72 67 73 20 63 68 61 6e 67 65 4e 61 74  o args changeNat
9280: 69 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  iveRuntimeOption
9290: 5d 7d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ]} \..          
92a0: 20 20 7b 5b 69 6e 66 6f 20 62 6f 64 79 20 63 68    {[info body ch
92b0: 61 6e 67 65 4e 61 74 69 76 65 52 75 6e 74 69 6d  angeNativeRuntim
92c0: 65 4f 70 74 69 6f 6e 5d 7d 0d 0a 0d 0a 20 20 20  eOption]}....   
92d0: 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
92e0: 20 20 20 20 20 20 20 20 63 68 61 6e 67 65 4e 61          changeNa
92f0: 74 69 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f  tiveRuntimeOptio
9300: 6e 20 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74  n [hasRuntimeOpt
9310: 69 6f 6e 20 6e 61 74 69 76 65 5d 0d 0a 20 20 20  ion native]..   
9320: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20       }..      } 
9330: 5b 67 65 74 54 65 73 74 4f 76 65 72 72 69 64 65  [getTestOverride
9340: 73 50 72 65 61 6d 62 6c 65 20 5b 6c 69 73 74 20  sPreamble [list 
9350: 70 61 74 68 20 74 65 73 74 5f 63 68 61 6e 6e 65  path test_channe
9360: 6c 5d 5d 20 24 73 75 66 66 69 78 5d 5d 5d 0d 0a  l]] $suffix]]]..
9370: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
9380: 6f 63 20 74 72 79 43 6f 70 79 45 78 74 65 72 6e  oc tryCopyExtern
9390: 61 6c 46 69 6c 65 20 7b 0d 0a 20 20 20 20 20 20  alFile {..      
93a0: 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65 20 7b        fileName {
93b0: 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 6e 65  platform ""} {ne
93c0: 77 46 69 6c 65 4e 61 6d 65 20 22 22 7d 20 7b 76  wFileName ""} {v
93d0: 65 72 62 6f 73 65 20 66 61 6c 73 65 7d 20 7d 20  erbose false} } 
93e0: 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 73 6f 75  {..      set sou
93f0: 72 63 65 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74  rceFileName [get
9400: 45 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65  ExternalFileName
9410: 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20   $fileName].... 
9420: 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20       if {![file 
9430: 65 78 69 73 74 73 20 24 73 6f 75 72 63 65 46 69  exists $sourceFi
9440: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
9450: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65  .        if {$ve
9460: 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20  rbose} then {.. 
9470: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
9480: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
9490: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
94a0: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
94b0: 2d 20 73 6b 69 70 70 65 64 20 63 6f 70 79 69 6e  - skipped copyin
94c0: 67 20 65 78 74 65 72 6e 61 6c 20 66 69 6c 65 20  g external file 
94d0: 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e  \"" $sourceFileN
94e0: 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
94f0: 20 20 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65       "\", it doe
9500: 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d  s not exist\n"].
9510: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
9520: 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20      return..    
9530: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
9540: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
9550: 24 6e 65 77 46 69 6c 65 4e 61 6d 65 5d 20 3e 20  $newFileName] > 
9560: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
9570: 20 20 20 73 65 74 20 74 61 72 67 65 74 46 69 6c     set targetFil
9580: 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79  eName [getBinary
9590: 46 69 6c 65 4e 61 6d 65 20 24 6e 65 77 46 69 6c  FileName $newFil
95a0: 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d  eName $platform]
95b0: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
95c0: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 61  ..        set ta
95d0: 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65  rgetFileName [ge
95e0: 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
95f0: 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66  $fileName $platf
9600: 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  orm]..      }...
9610: 0a 20 20 20 20 20 20 73 65 74 20 74 61 72 67 65  .      set targe
9620: 74 44 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65  tDirectory [file
9630: 20 64 69 72 6e 61 6d 65 20 24 74 61 72 67 65 74   dirname $target
9640: 46 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20  FileName]....   
9650: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
9660: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 66  .        if {![f
9670: 69 6c 65 20 65 78 69 73 74 73 20 24 74 61 72 67  ile exists $targ
9680: 65 74 44 69 72 65 63 74 6f 72 79 5d 7d 20 74 68  etDirectory]} th
9690: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
96a0: 66 69 6c 65 20 6d 6b 64 69 72 20 24 74 61 72 67  file mkdir $targ
96b0: 65 74 44 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  etDirectory..   
96c0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
96d0: 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63 65  file copy -force
96e0: 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65   $sourceFileName
96f0: 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65   $targetFileName
9700: 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d  ..      }] == 0}
9710: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
9720: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
9730: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
9740: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
9750: 20 20 22 2d 2d 2d 2d 20 63 6f 70 69 65 64 20 65    "---- copied e
9760: 78 74 65 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f  xternal file fro
9770: 6d 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c  m \"" $sourceFil
9780: 65 4e 61 6d 65 20 22 5c 22 20 74 6f 20 5c 22 22  eName "\" to \""
9790: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
97a0: 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20  $targetFileName 
97b0: 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65  \"\n]..      } e
97c0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
97d0: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
97e0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
97f0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
9800: 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20  "---- failed to 
9810: 63 6f 70 79 20 65 78 74 65 72 6e 61 6c 20 66 69  copy external fi
9820: 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75  le from \"" $sou
9830: 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  rceFileName \.. 
9840: 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 74             "\" t
9850: 6f 20 5c 22 22 20 24 74 61 72 67 65 74 46 69 6c  o \"" $targetFil
9860: 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  eName \"\n]..   
9870: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
9880: 20 20 20 20 70 72 6f 63 20 74 72 79 43 6f 70 79      proc tryCopy
9890: 42 69 6e 61 72 79 46 69 6c 65 20 7b 0d 0a 20 20  BinaryFile {..  
98a0: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61            fileNa
98b0: 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d  me {platform ""}
98c0: 20 7b 6e 65 77 46 69 6c 65 4e 61 6d 65 20 22 22   {newFileName ""
98d0: 7d 20 7b 76 65 72 62 6f 73 65 20 66 61 6c 73 65  } {verbose false
98e0: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  } } {..      set
98f0: 20 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20   sourceFileName 
9900: 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61  [getBinaryFileNa
9910: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c  me $fileName $pl
9920: 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20  atform]....     
9930: 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73   if {![file exis
9940: 74 73 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61  ts $sourceFileNa
9950: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
9960: 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73       if {$verbos
9970: 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
9980: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
9990: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
99a0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
99b0: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b          "---- sk
99c0: 69 70 70 65 64 20 63 6f 70 79 69 6e 67 20 62 69  ipped copying bi
99d0: 6e 61 72 79 20 66 69 6c 65 20 5c 22 22 20 24 73  nary file \"" $s
99e0: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d  ourceFileName \.
99f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
9a00: 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  \", it does not 
9a10: 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20  exist\n"]..     
9a20: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 72 65     }..        re
9a30: 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  turn..      }...
9a40: 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
9a50: 6e 67 20 6c 65 6e 67 74 68 20 24 6e 65 77 46 69  ng length $newFi
9a60: 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65  leName] > 0} the
9a70: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  n {..        set
9a80: 20 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20   targetFileName 
9a90: 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d  [getBuildFileNam
9aa0: 65 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65 20 24  e $newFileName $
9ab0: 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20  platform]..     
9ac0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
9ad0: 20 20 20 73 65 74 20 74 61 72 67 65 74 46 69 6c     set targetFil
9ae0: 65 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c 64 46  eName [getBuildF
9af0: 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d  ileName $fileNam
9b00: 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20  e $platform]..  
9b10: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73      }....      s
9b20: 65 74 20 74 61 72 67 65 74 44 69 72 65 63 74 6f  et targetDirecto
9b30: 72 79 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65  ry [file dirname
9b40: 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65   $targetFileName
9b50: 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  ]....      if {[
9b60: 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
9b70: 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73   if {![file exis
9b80: 74 73 20 24 74 61 72 67 65 74 44 69 72 65 63 74  ts $targetDirect
9b90: 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ory]} then {..  
9ba0: 20 20 20 20 20 20 20 20 66 69 6c 65 20 6d 6b 64          file mkd
9bb0: 69 72 20 24 74 61 72 67 65 74 44 69 72 65 63 74  ir $targetDirect
9bc0: 6f 72 79 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ory..        }..
9bd0: 20 20 20 20 20 20 20 20 66 69 6c 65 20 63 6f 70          file cop
9be0: 79 20 2d 66 6f 72 63 65 20 24 73 6f 75 72 63 65  y -force $source
9bf0: 46 69 6c 65 4e 61 6d 65 20 24 74 61 72 67 65 74  FileName $target
9c00: 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20  FileName..      
9c10: 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  }] == 0} then {.
9c20: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
9c30: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
9c40: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
9c50: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
9c60: 63 6f 70 69 65 64 20 62 69 6e 61 72 79 20 66 69  copied binary fi
9c70: 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75  le from \"" $sou
9c80: 72 63 65 46 69 6c 65 4e 61 6d 65 20 22 5c 22 20  rceFileName "\" 
9c90: 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  to \"" \..      
9ca0: 20 20 20 20 20 20 24 74 61 72 67 65 74 46 69 6c        $targetFil
9cb0: 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  eName \"\n]..   
9cc0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
9cd0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
9ce0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
9cf0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
9d00: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c        "---- fail
9d10: 65 64 20 74 6f 20 63 6f 70 79 20 62 69 6e 61 72  ed to copy binar
9d20: 79 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20  y file from \"" 
9d30: 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20  $sourceFileName 
9d40: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
9d50: 5c 22 20 74 6f 20 5c 22 22 20 24 74 61 72 67 65  \" to \"" $targe
9d60: 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d  tFileName \"\n].
9d70: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
9d80: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79  ....    proc try
9d90: 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20 7b 0d  CopyBuildFile {.
9da0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c  .            fil
9db0: 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20  eName {platform 
9dc0: 22 22 7d 20 7b 6e 65 77 46 69 6c 65 4e 61 6d 65  ""} {newFileName
9dd0: 20 22 22 7d 20 7b 76 65 72 62 6f 73 65 20 66 61   ""} {verbose fa
9de0: 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  lse} } {..      
9df0: 73 65 74 20 73 6f 75 72 63 65 46 69 6c 65 4e 61  set sourceFileNa
9e00: 6d 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65  me [getBuildFile
9e10: 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24  Name $fileName $
9e20: 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20  platform]....   
9e30: 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78     if {![file ex
9e40: 69 73 74 73 20 24 73 6f 75 72 63 65 46 69 6c 65  ists $sourceFile
9e50: 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
9e60: 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62         if {$verb
9e70: 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ose} then {..   
9e80: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
9e90: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
9ea0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
9eb0: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
9ec0: 73 6b 69 70 70 65 64 20 63 6f 70 79 69 6e 67 20  skipped copying 
9ed0: 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22 20 24  build file \"" $
9ee0: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c  sourceFileName \
9ef0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
9f00: 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74  "\", it does not
9f10: 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20   exist\n"]..    
9f20: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 72      }..        r
9f30: 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a  eturn..      }..
9f40: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
9f50: 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e 65 77 46  ing length $newF
9f60: 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68  ileName] > 0} th
9f70: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  en {..        se
9f80: 74 20 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65  t targetFileName
9f90: 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
9fa0: 61 6d 65 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65  ame $newFileName
9fb0: 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20   $platform]..   
9fc0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
9fd0: 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74 46       set targetF
9fe0: 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61  ileName [getBina
9ff0: 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  ryFileName $file
a000: 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d  Name $platform].
a010: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
a020: 20 20 73 65 74 20 74 61 72 67 65 74 44 69 72 65    set targetDire
a030: 63 74 6f 72 79 20 5b 66 69 6c 65 20 64 69 72 6e  ctory [file dirn
a040: 61 6d 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e  ame $targetFileN
a050: 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  ame]....      if
a060: 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
a070: 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65      if {![file e
a080: 78 69 73 74 73 20 24 74 61 72 67 65 74 44 69 72  xists $targetDir
a090: 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d  ectory]} then {.
a0a0: 0a 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20  .          file 
a0b0: 6d 6b 64 69 72 20 24 74 61 72 67 65 74 44 69 72  mkdir $targetDir
a0c0: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 20 20  ectory..        
a0d0: 7d 0d 0a 20 20 20 20 20 20 20 20 66 69 6c 65 20  }..        file 
a0e0: 63 6f 70 79 20 2d 66 6f 72 63 65 20 24 73 6f 75  copy -force $sou
a0f0: 72 63 65 46 69 6c 65 4e 61 6d 65 20 24 74 61 72  rceFileName $tar
a100: 67 65 74 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  getFileName..   
a110: 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e     }] == 0} then
a120: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
a130: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
a140: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
a150: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
a160: 2d 2d 20 63 6f 70 69 65 64 20 62 75 69 6c 64 20  -- copied build 
a170: 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73  file from \"" $s
a180: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 22 5c  ourceFileName "\
a190: 22 20 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20  " to \"" \..    
a1a0: 20 20 20 20 20 20 20 20 24 74 61 72 67 65 74 46          $targetF
a1b0: 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20  ileName \"\n].. 
a1c0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
a1d0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
a1e0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
a1f0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
a200: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61          "---- fa
a210: 69 6c 65 64 20 74 6f 20 63 6f 70 79 20 62 75 69  iled to copy bui
a220: 6c 64 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22  ld file from \""
a230: 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65   $sourceFileName
a240: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
a250: 22 5c 22 20 74 6f 20 5c 22 22 20 24 74 61 72 67  "\" to \"" $targ
a260: 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d  etFileName \"\n]
a270: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
a280: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72  .....    proc tr
a290: 79 44 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c  yDeleteBinaryFil
a2a0: 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c  e { fileName {pl
a2b0: 61 74 66 6f 72 6d 20 22 22 7d 20 7b 76 65 72 62  atform ""} {verb
a2c0: 6f 73 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  ose false} } {..
a2d0: 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61        set fileNa
a2e0: 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c  me [getBinaryFil
a2f0: 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20  eName $fileName 
a300: 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20  $platform]....  
a310: 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65      if {![file e
a320: 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d  xists $fileName]
a330: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
a340: 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20    if {$verbose} 
a350: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
a360: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
a370: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
a380: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
a390: 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70       "---- skipp
a3a0: 65 64 20 64 65 6c 65 74 69 6e 67 20 62 69 6e 61  ed deleting bina
a3b0: 72 79 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c  ry file \"" $fil
a3c0: 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  eName \..       
a3d0: 20 20 20 20 20 20 20 22 5c 22 2c 20 69 74 20 64         "\", it d
a3e0: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22  oes not exist\n"
a3f0: 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
a400: 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20        return..  
a410: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69      }....      i
a420: 66 20 7b 5b 63 61 74 63 68 20 7b 66 69 6c 65 20  f {[catch {file 
a430: 64 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65  delete $fileName
a440: 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  }] == 0} then {.
a450: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
a460: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
a470: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
a480: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
a490: 64 65 6c 65 74 65 64 20 62 69 6e 61 72 79 20 66  deleted binary f
a4a0: 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d  ile \"" $fileNam
a4b0: 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d  e \"\n]..      }
a4c0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
a4d0: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
a4e0: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
a4f0: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
a500: 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74    "---- failed t
a510: 6f 20 64 65 6c 65 74 65 20 62 69 6e 61 72 79 20  o delete binary 
a520: 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61  file \"" $fileNa
a530: 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  me \"\n]..      
a540: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
a550: 20 70 72 6f 63 20 74 72 79 44 65 6c 65 74 65 42   proc tryDeleteB
a560: 75 69 6c 64 46 69 6c 65 20 7b 20 66 69 6c 65 4e  uildFile { fileN
a570: 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22  ame {platform ""
a580: 7d 20 7b 76 65 72 62 6f 73 65 20 66 61 6c 73 65  } {verbose false
a590: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  } } {..      set
a5a0: 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 75   fileName [getBu
a5b0: 69 6c 64 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c  ildFileName $fil
a5c0: 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d  eName $platform]
a5d0: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b  ....      if {![
a5e0: 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c  file exists $fil
a5f0: 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
a600: 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72          if {$ver
a610: 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  bose} then {..  
a620: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
a630: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
a640: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
a650: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
a660: 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e   skipped deletin
a670: 67 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22  g build file \""
a680: 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20   $fileName \..  
a690: 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c              "\",
a6a0: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
a6b0: 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  st\n"]..        
a6c0: 7d 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  }..        retur
a6d0: 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  n..      }....  
a6e0: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
a6f0: 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66 69 6c  file delete $fil
a700: 65 4e 61 6d 65 7d 5d 20 3d 3d 20 30 7d 20 74 68  eName}] == 0} th
a710: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  en {..        tp
a720: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
a730: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
a740: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
a750: 2d 2d 2d 2d 20 64 65 6c 65 74 65 64 20 62 75 69  ---- deleted bui
a760: 6c 64 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c  ld file \"" $fil
a770: 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  eName \"\n]..   
a780: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
a790: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
a7a0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
a7b0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
a7c0: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c        "---- fail
a7d0: 65 64 20 74 6f 20 64 65 6c 65 74 65 20 62 75 69  ed to delete bui
a7e0: 6c 64 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c  ld file \"" $fil
a7f0: 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  eName \"\n]..   
a800: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
a810: 20 20 20 20 70 72 6f 63 20 74 72 79 43 6f 70 79      proc tryCopy
a820: 41 73 73 65 6d 62 6c 79 20 7b 0d 0a 20 20 20 20  Assembly {..    
a830: 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65          fileName
a840: 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b   {platform ""} {
a850: 70 64 62 20 74 72 75 65 7d 20 7b 76 65 72 62 6f  pdb true} {verbo
a860: 73 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  se false} } {.. 
a870: 20 20 20 20 20 74 72 79 43 6f 70 79 42 75 69 6c       tryCopyBuil
a880: 64 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 20  dFile $fileName 
a890: 24 70 6c 61 74 66 6f 72 6d 20 22 22 20 24 76 65  $platform "" $ve
a8a0: 72 62 6f 73 65 0d 0a 0d 0a 20 20 20 20 20 20 69  rbose....      i
a8b0: 66 20 7b 24 70 64 62 7d 20 74 68 65 6e 20 7b 0d  f {$pdb} then {.
a8c0: 0a 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79  .        tryCopy
a8d0: 42 75 69 6c 64 46 69 6c 65 20 5b 61 70 70 65 6e  BuildFile [appen
a8e0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
a8f0: 20 20 20 20 20 5b 66 69 6c 65 20 72 6f 6f 74 6e       [file rootn
a900: 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 20 2e  ame $fileName] .
a910: 70 64 62 5d 20 24 70 6c 61 74 66 6f 72 6d 20 22  pdb] $platform "
a920: 22 20 24 76 65 72 62 6f 73 65 0d 0a 20 20 20 20  " $verbose..    
a930: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
a940: 20 20 20 70 72 6f 63 20 74 72 79 44 65 6c 65 74     proc tryDelet
a950: 65 41 73 73 65 6d 62 6c 79 20 7b 0d 0a 20 20 20  eAssembly {..   
a960: 20 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d           fileNam
a970: 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20  e {platform ""} 
a980: 7b 70 64 62 20 74 72 75 65 7d 20 7b 76 65 72 62  {pdb true} {verb
a990: 6f 73 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  ose false} } {..
a9a0: 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 42        tryDeleteB
a9b0: 69 6e 61 72 79 46 69 6c 65 20 24 66 69 6c 65 4e  inaryFile $fileN
a9c0: 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 20 24 76  ame $platform $v
a9d0: 65 72 62 6f 73 65 0d 0a 0d 0a 20 20 20 20 20 20  erbose....      
a9e0: 69 66 20 7b 24 70 64 62 7d 20 74 68 65 6e 20 7b  if {$pdb} then {
a9f0: 0d 0a 20 20 20 20 20 20 20 20 74 72 79 44 65 6c  ..        tryDel
aa00: 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20 5b 61  eteBinaryFile [a
aa10: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
aa20: 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 72           [file r
aa30: 6f 6f 74 6e 61 6d 65 20 24 66 69 6c 65 4e 61 6d  ootname $fileNam
aa40: 65 5d 20 2e 70 64 62 5d 20 24 70 6c 61 74 66 6f  e] .pdb] $platfo
aa50: 72 6d 20 24 76 65 72 62 6f 73 65 0d 0a 20 20 20  rm $verbose..   
aa60: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
aa70: 20 20 20 20 70 72 6f 63 20 74 72 79 4c 6f 61 64      proc tryLoad
aa80: 41 73 73 65 6d 62 6c 79 20 7b 20 66 69 6c 65 4e  Assembly { fileN
aa90: 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22  ame {platform ""
aaa0: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  } } {..      set
aab0: 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69   fileName [getBi
aac0: 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69  naryFileName $fi
aad0: 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d  leName $platform
aae0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  ]....      if {[
aaf0: 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
ab00: 20 73 65 74 20 61 73 73 65 6d 62 6c 79 20 5b 6f   set assembly [o
ab10: 62 6a 65 63 74 20 6c 6f 61 64 20 2d 6c 6f 61 64  bject load -load
ab20: 74 79 70 65 20 46 69 6c 65 20 2d 61 6c 69 61 73  type File -alias
ab30: 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20   $fileName]..   
ab40: 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e     }] == 0} then
ab50: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
ab60: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e         # NOTE: N
ab70: 6f 77 2c 20 61 64 64 20 74 68 65 20 6e 65 63 65  ow, add the nece
ab80: 73 73 61 72 79 20 74 65 73 74 20 63 6f 6e 73 74  ssary test const
ab90: 72 61 69 6e 74 2e 0d 0a 20 20 20 20 20 20 20 20  raint...        
aba0: 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  #..        addCo
abb0: 6e 73 74 72 61 69 6e 74 20 5b 66 69 6c 65 20 72  nstraint [file r
abc0: 6f 6f 74 6e 61 6d 65 20 5b 66 69 6c 65 20 74 61  ootname [file ta
abd0: 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a  il $fileName]]..
abe0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
abf0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 47 72 61       # NOTE: Gra
ac00: 62 20 74 68 65 20 69 6d 61 67 65 20 72 75 6e 74  b the image runt
ac10: 69 6d 65 20 76 65 72 73 69 6f 6e 20 66 72 6f 6d  ime version from
ac20: 20 74 68 65 20 61 73 73 65 6d 62 6c 79 20 62 65   the assembly be
ac30: 63 61 75 73 65 0d 0a 20 20 20 20 20 20 20 20 23  cause..        #
ac40: 20 20 20 20 20 20 20 73 65 76 65 72 61 6c 20 74         several t
ac50: 65 73 74 73 20 72 65 6c 79 20 6f 6e 20 69 74 20  ests rely on it 
ac60: 68 61 76 69 6e 67 20 61 20 63 65 72 74 61 69 6e  having a certain
ac70: 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20   value...       
ac80: 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43   #..        addC
ac90: 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
aca0: 64 41 72 67 73 20 5b 66 69 6c 65 20 74 61 69 6c  dArgs [file tail
acb0: 20 24 66 69 6c 65 4e 61 6d 65 5d 20 5f 20 5c 0d   $fileName] _ \.
acc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 24 61  .            [$a
acd0: 73 73 65 6d 62 6c 79 20 49 6d 61 67 65 52 75 6e  ssembly ImageRun
ace0: 74 69 6d 65 56 65 72 73 69 6f 6e 5d 5d 0d 0a 0d  timeVersion]]...
acf0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
ad00: 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75      # NOTE: Retu
ad10: 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  rn the full path
ad20: 20 6f 66 20 74 68 65 20 6c 6f 61 64 65 64 20 66   of the loaded f
ad30: 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ile...        #.
ad40: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
ad50: 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  $fileName..     
ad60: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
ad70: 72 6e 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  rn ""..    }....
ad80: 0a 20 20 20 20 70 72 6f 63 20 69 73 53 51 4c 69  .    proc isSQLi
ad90: 74 65 52 65 61 64 79 20 7b 7d 20 7b 0d 0a 20 20  teReady {} {..  
ada0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
adb0: 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64  OTE: This proced
adc0: 75 72 65 20 6d 75 73 74 20 72 65 74 75 72 6e 20  ure must return 
add0: 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 6c 79 20 69 66  non-zero only if
ade0: 20 74 68 65 20 53 51 4c 69 74 65 20 6e 61 74 69   the SQLite nati
adf0: 76 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ve..      #     
ae00: 20 20 6c 69 62 72 61 72 79 20 61 6e 64 20 74 68    library and th
ae10: 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  e System.Data.SQ
ae20: 4c 69 74 65 20 6d 61 6e 61 67 65 64 20 61 73 73  Lite managed ass
ae30: 65 6d 62 6c 79 20 61 72 65 20 6c 6f 61 64 65 64  embly are loaded
ae40: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
ae50: 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20 75 73  and ready for us
ae60: 65 20 62 79 20 74 68 65 20 74 65 73 74 20 73 75  e by the test su
ae70: 69 74 65 2e 20 20 43 75 72 72 65 6e 74 6c 79 2c  ite.  Currently,
ae80: 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0d   this procedure.
ae90: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
aea0: 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
aeb0: 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20 5b  only after the [
aec0: 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 5d  tryLoadAssembly]
aed0: 20 70 72 6f 63 65 64 75 72 65 20 68 61 73 0d 0a   procedure has..
aee0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65        #       be
aef0: 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f  en called to pro
af00: 62 65 20 66 6f 72 20 74 68 65 20 53 79 73 74 65  be for the Syste
af10: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 6d 61  m.Data.SQLite ma
af20: 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 0d 0a  naged assembly..
af30: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6e        #       an
af40: 64 20 74 68 65 20 5b 63 68 65 63 6b 46 6f 72 53  d the [checkForS
af50: 51 4c 69 74 65 5d 20 70 72 6f 63 65 64 75 72 65  QLite] procedure
af60: 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64   has been called
af70: 20 74 6f 20 70 72 6f 62 65 20 66 6f 72 0d 0a 20   to probe for.. 
af80: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
af90: 20 53 51 4c 69 74 65 20 6e 61 74 69 76 65 20 6c   SQLite native l
afa0: 69 62 72 61 72 79 3b 20 6f 74 68 65 72 77 69 73  ibrary; otherwis
afb0: 65 2c 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  e, this procedur
afc0: 65 20 77 69 6c 6c 20 73 69 6d 70 6c 79 0d 0a 20  e will simply.. 
afd0: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6c 77       #       alw
afe0: 61 79 73 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e  ays return zero.
aff0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
b000: 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 0d   return [expr {.
b010: 0a 20 20 20 20 20 20 20 20 5b 68 61 76 65 43 6f  .        [haveCo
b020: 6e 73 74 72 61 69 6e 74 20 53 79 73 74 65 6d 2e  nstraint System.
b030: 44 61 74 61 2e 53 51 4c 69 74 65 5d 20 26 26 20  Data.SQLite] && 
b040: 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
b050: 53 51 4c 69 74 65 5d 0d 0a 20 20 20 20 20 20 7d  SQLite]..      }
b060: 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  ]..    }.....   
b070: 20 70 72 6f 63 20 6d 61 74 63 68 50 6c 61 74 66   proc matchPlatf
b080: 6f 72 6d 20 7b 20 70 6c 61 74 66 6f 72 6d 20 7d  orm { platform }
b090: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
b0a0: 20 20 20 23 20 4e 4f 54 45 3a 20 41 6e 20 65 6d     # NOTE: An em
b0b0: 70 74 79 20 73 74 72 69 6e 67 20 66 6f 72 20 74  pty string for t
b0c0: 68 65 20 70 6c 61 74 66 6f 72 6d 20 6d 65 61 6e  he platform mean
b0d0: 73 20 74 68 61 74 20 74 68 65 20 62 75 69 6c 64  s that the build
b0e0: 20 69 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 23   is not..      #
b0f0: 20 20 20 20 20 20 20 5b 70 72 69 6d 61 72 69 6c         [primaril
b100: 79 5d 20 61 20 6e 61 74 69 76 65 20 62 75 69 6c  y] a native buil
b110: 64 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 69 74  d; therefore, it
b120: 20 61 6c 77 61 79 73 20 6d 61 74 63 68 65 73 2e   always matches.
b130: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
b140: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
b150: 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3d  gth $platform] =
b160: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
b170: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
b180: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
b190: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
b1a0: 54 45 3a 20 44 6f 65 73 20 74 68 65 20 73 70 65  TE: Does the spe
b1b0: 63 69 66 69 65 64 20 70 6c 61 74 66 6f 72 6d 20  cified platform 
b1c0: 6d 61 74 63 68 20 75 70 20 74 6f 20 74 68 65 20  match up to the 
b1d0: 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 3f  current process?
b1e0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
b1f0: 20 69 66 20 7b 24 70 6c 61 74 66 6f 72 6d 20 65   if {$platform e
b200: 71 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74  q [machineToPlat
b210: 66 6f 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74  form $::tcl_plat
b220: 66 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 7d 20  form(machine)]} 
b230: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
b240: 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20  return true..   
b250: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
b260: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
b270: 68 65 20 73 70 65 63 69 66 69 65 64 20 70 6c 61  he specified pla
b280: 74 66 6f 72 6d 20 64 6f 65 73 20 6e 6f 74 20 6d  tform does not m
b290: 61 74 63 68 20 75 70 20 77 69 74 68 20 74 68 65  atch up with the
b2a0: 20 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20   platform..     
b2b0: 20 23 20 20 20 20 20 20 20 66 6f 72 20 74 68 65   #       for the
b2c0: 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73   current process
b2d0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
b2e0: 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a    return false..
b2f0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
b300: 6f 63 20 68 61 76 65 53 51 4c 69 74 65 4f 62 6a  oc haveSQLiteObj
b310: 65 63 74 43 6f 6d 6d 61 6e 64 20 7b 7d 20 7b 0d  ectCommand {} {.
b320: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
b330: 23 20 4e 4f 54 45 3a 20 49 73 20 74 68 65 20 5b  # NOTE: Is the [
b340: 6f 62 6a 65 63 74 5d 20 63 6f 6d 6d 61 6e 64 20  object] command 
b350: 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61  currently availa
b360: 62 6c 65 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ble?..      #.. 
b370: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70       return [exp
b380: 72 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66  r {[llength [inf
b390: 6f 20 63 6f 6d 6d 61 6e 64 73 20 6f 62 6a 65 63  o commands objec
b3a0: 74 5d 5d 20 3e 20 30 7d 5d 0d 0a 20 20 20 20 7d  t]] > 0}]..    }
b3b0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68  .....    proc ch
b3c0: 65 63 6b 46 6f 72 53 51 4c 69 74 65 4f 62 6a 65  eckForSQLiteObje
b3d0: 63 74 43 6f 6d 6d 61 6e 64 20 7b 20 63 68 61 6e  ctCommand { chan
b3e0: 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74  nel } {..      t
b3f0: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
b400: 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
b410: 20 5c 22 6f 62 6a 65 63 74 5c 22 20 63 6f 6d 6d   \"object\" comm
b420: 61 6e 64 20 75 73 61 67 65 2e 2e 2e 20 22 0d 0a  and usage... "..
b430: 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e  ..      if {![in
b440: 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73  fo exists ::no(s
b450: 71 6c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61  qliteObjectComma
b460: 6e 64 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  nd)] && \..     
b470: 20 20 20 20 20 5b 68 61 76 65 53 51 4c 69 74 65       [haveSQLite
b480: 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20  ObjectCommand]} 
b490: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
b4a0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79  tputs $channel y
b4b0: 65 73 5c 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c  es\n..      } el
b4c0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
b4d0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
b4e0: 20 55 6e 6c 65 73 73 20 77 65 20 61 72 65 20 66   Unless we are f
b4f0: 6f 72 62 69 64 64 65 6e 20 66 72 6f 6d 20 64 6f  orbidden from do
b500: 69 6e 67 20 73 6f 2c 20 61 64 64 20 73 6f 6d 65  ing so, add some
b510: 20 63 6f 6e 73 74 72 61 69 6e 74 73 0d 0a 20 20   constraints..  
b520: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
b530: 61 74 20 77 69 6c 6c 20 61 6c 6c 6f 77 20 6d 6f  at will allow mo
b540: 73 74 20 6f 66 20 74 68 65 20 74 65 73 74 20 73  st of the test s
b550: 75 69 74 65 20 74 6f 20 72 75 6e 20 28 69 2e 65  uite to run (i.e
b560: 2e 20 74 68 6f 73 65 0d 0a 20 20 20 20 20 20 20  . those..       
b570: 20 23 20 20 20 20 20 20 20 74 65 73 74 73 20 74   #       tests t
b580: 68 61 74 20 64 6f 20 6e 6f 74 20 64 69 72 65 63  hat do not direc
b590: 74 6c 79 20 72 65 6c 79 20 75 70 6f 6e 20 74 68  tly rely upon th
b5a0: 65 20 5b 6f 62 6a 65 63 74 5d 20 63 6f 6d 6d 61  e [object] comma
b5b0: 6e 64 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  nd)...        #.
b5c0: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69  .        if {![i
b5d0: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
b5e0: 73 68 69 6d 53 51 4c 69 74 65 41 73 73 65 6d 62  shimSQLiteAssemb
b5f0: 6c 79 43 6f 6e 73 74 72 61 69 6e 74 73 29 5d 7d  lyConstraints)]}
b600: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
b610: 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
b620: 20 53 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 20   SQLite..       
b630: 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
b640: 20 53 51 4c 69 74 65 49 6e 74 65 72 6f 70 0d 0a   SQLiteInterop..
b650: 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
b660: 73 74 72 61 69 6e 74 20 53 79 73 74 65 6d 2e 44  straint System.D
b670: 61 74 61 2e 53 51 4c 69 74 65 0d 0a 20 20 20 20  ata.SQLite..    
b680: 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
b690: 69 6e 74 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  int System.Data.
b6a0: 53 51 4c 69 74 65 2e 45 6e 63 72 79 70 74 69 6f  SQLite.Encryptio
b6b0: 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  n..          add
b6c0: 43 6f 6e 73 74 72 61 69 6e 74 20 53 79 73 74 65  Constraint Syste
b6d0: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69  m.Data.SQLite.Li
b6e0: 6e 71 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  nq....          
b6f0: 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  addConstraint [a
b700: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
b710: 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
b720: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
b730: 6c 5f 76 20 5b 67 65 74 42 75 69 6c 64 43 6c 72  l_v [getBuildClr
b740: 56 65 72 73 69 6f 6e 5d 5d 0d 0a 20 20 20 20 20  Version]]..     
b750: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
b760: 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
b770: 73 20 3a 3a 6e 6f 28 73 68 69 6d 53 51 4c 69 74  s ::no(shimSQLit
b780: 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 43  eDefineConstantC
b790: 6f 6e 73 74 72 61 69 6e 74 73 29 5d 7d 20 74 68  onstraints)]} th
b7a0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
b7b0: 66 6f 72 65 61 63 68 20 64 65 66 69 6e 65 43 6f  foreach defineCo
b7c0: 6e 73 74 61 6e 74 20 5b 6c 69 73 74 20 5c 0d 0a  nstant [list \..
b7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49 4e                IN
b7e0: 54 45 52 4f 50 5f 45 58 54 45 4e 53 49 4f 4e 5f  TEROP_EXTENSION_
b7f0: 46 55 4e 43 54 49 4f 4e 53 20 49 4e 54 45 52 4f  FUNCTIONS INTERO
b800: 50 5f 46 54 53 35 5f 45 58 54 45 4e 53 49 4f 4e  P_FTS5_EXTENSION
b810: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
b820: 20 20 49 4e 54 45 52 4f 50 5f 4a 53 4f 4e 31 5f    INTEROP_JSON1_
b830: 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54 45 52 4f  EXTENSION INTERO
b840: 50 5f 50 45 52 43 45 4e 54 49 4c 45 5f 45 58 54  P_PERCENTILE_EXT
b850: 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20  ENSION \..      
b860: 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f          INTEROP_
b870: 52 45 47 45 58 50 5f 45 58 54 45 4e 53 49 4f 4e  REGEXP_EXTENSION
b880: 20 49 4e 54 45 52 4f 50 5f 54 45 53 54 5f 45 58   INTEROP_TEST_EX
b890: 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20  TENSION \..     
b8a0: 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50           INTEROP
b8b0: 5f 54 4f 54 59 50 45 5f 45 58 54 45 4e 53 49 4f  _TOTYPE_EXTENSIO
b8c0: 4e 20 49 4e 54 45 52 4f 50 5f 56 49 52 54 55 41  N INTEROP_VIRTUA
b8d0: 4c 5f 54 41 42 4c 45 20 5c 0d 0a 20 20 20 20 20  L_TABLE \..     
b8e0: 20 20 20 20 20 20 20 20 20 55 53 45 5f 49 4e 54           USE_INT
b8f0: 45 52 4f 50 5f 44 4c 4c 5d 20 7b 0d 0a 20 20 20  EROP_DLL] {..   
b900: 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73           addCons
b910: 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
b920: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
b930: 20 20 20 20 20 20 64 65 66 69 6e 65 43 6f 6e 73        defineCons
b940: 74 61 6e 74 2e 53 79 73 74 65 6d 2e 44 61 74 61  tant.System.Data
b950: 2e 53 51 4c 69 74 65 2e 20 24 64 65 66 69 6e 65  .SQLite. $define
b960: 43 6f 6e 73 74 61 6e 74 5d 0d 0a 20 20 20 20 20  Constant]..     
b970: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
b980: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
b990: 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
b9a0: 3a 6e 6f 28 73 68 69 6d 53 51 4c 69 74 65 56 69  :no(shimSQLiteVi
b9b0: 73 75 61 6c 53 74 75 64 69 6f 43 6f 6e 73 74 72  sualStudioConstr
b9c0: 61 69 6e 74 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  aints)]} then {.
b9d0: 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f  .          addCo
b9e0: 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
b9f0: 41 72 67 73 20 76 69 73 75 61 6c 53 74 75 64 69  Args visualStudi
ba00: 6f 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72 5d  o [getBuildYear]
ba10: 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  ]..        }....
ba20: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
ba30: 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20  hannel no\n..   
ba40: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
ba50: 20 20 20 20 70 72 6f 63 20 63 68 61 6e 67 65 4e      proc changeN
ba60: 61 74 69 76 65 52 75 6e 74 69 6d 65 4f 70 74 69  ativeRuntimeOpti
ba70: 6f 6e 20 7b 20 6e 61 74 69 76 65 20 7d 20 7b 0d  on { native } {.
ba80: 0a 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e  .      if {[llen
ba90: 67 74 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e  gth [info comman
baa0: 64 73 20 64 65 62 75 67 5d 5d 20 3e 20 30 20 26  ds debug]] > 0 &
bab0: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
bac0: 6c 6c 65 6e 67 74 68 20 5b 69 6e 66 6f 20 73 75  llength [info su
bad0: 62 63 6f 6d 6d 61 6e 64 73 20 64 65 62 75 67 20  bcommands debug 
bae0: 72 75 6e 74 69 6d 65 6f 70 74 69 6f 6e 5d 5d 20  runtimeoption]] 
baf0: 3e 20 30 20 26 26 20 5b 63 61 74 63 68 20 7b 0d  > 0 && [catch {.
bb00: 0a 20 20 20 20 20 20 20 20 64 65 62 75 67 20 72  .        debug r
bb10: 75 6e 74 69 6d 65 6f 70 74 69 6f 6e 20 5b 65 78  untimeoption [ex
bb20: 70 72 20 7b 24 6e 61 74 69 76 65 20 3f 20 22 61  pr {$native ? "a
bb30: 64 64 22 20 3a 20 22 72 65 6d 6f 76 65 22 7d 5d  dd" : "remove"}]
bb40: 20 6e 61 74 69 76 65 0d 0a 20 20 20 20 20 20 7d   native..      }
bb50: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
bb60: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
bb70: 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  rue..      }....
bb80: 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53        if {[haveS
bb90: 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61  QLiteObjectComma
bba0: 6e 64 5d 20 26 26 20 5b 63 61 74 63 68 20 7b 0d  nd] && [catch {.
bbb0: 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20  .        object 
bbc0: 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72 65 74  invoke Interpret
bbd0: 65 72 2e 47 65 74 41 63 74 69 76 65 20 5b 65 78  er.GetActive [ex
bbe0: 70 72 20 7b 24 6e 61 74 69 76 65 20 3f 20 5c 0d  pr {$native ? \.
bbf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 41 64  .            "Ad
bc00: 64 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 22 20  dRuntimeOption" 
bc10: 3a 20 22 52 65 6d 6f 76 65 52 75 6e 74 69 6d 65  : "RemoveRuntime
bc20: 4f 70 74 69 6f 6e 22 7d 5d 20 6e 61 74 69 76 65  Option"}] native
bc30: 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d  ..      }] == 0}
bc40: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
bc50: 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20   return true..  
bc60: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72      }....      r
bc70: 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20  eturn false..   
bc80: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
bc90: 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 42 75  checkForSQLiteBu
bca0: 69 6c 64 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b  ilds { channel {
bcb0: 73 65 6c 65 63 74 20 66 61 6c 73 65 7d 20 7d 20  select false} } 
bcc0: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
bcd0: 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
bce0: 66 6f 72 20 65 76 65 72 79 20 70 6f 73 73 69 62  for every possib
bcf0: 6c 65 20 76 61 6c 69 64 20 63 6f 6d 62 69 6e 61  le valid combina
bd00: 74 69 6f 6e 20 6f 66 20 76 61 6c 75 65 73 20 75  tion of values u
bd10: 73 65 64 20 77 68 65 6e 0d 0a 20 20 20 20 20 20  sed when..      
bd20: 23 20 20 20 20 20 20 20 6c 6f 63 61 74 69 6e 67  #       locating
bd30: 20 6f 75 74 20 74 68 65 20 62 75 69 6c 64 20 6f   out the build o
bd40: 75 74 70 75 74 20 64 69 72 65 63 74 6f 72 79 2c  utput directory,
bd50: 20 73 68 6f 77 69 6e 67 20 65 61 63 68 20 61 76   showing each av
bd60: 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20 23  ailable..      #
bd70: 20 20 20 20 20 20 20 62 75 69 6c 64 20 76 61 72         build var
bd80: 69 61 74 69 6f 6e 20 61 6c 6f 6e 67 20 74 68 65  iation along the
bd90: 20 77 61 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a   way...      #..
bda0: 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 6e 61        foreach na
bdb0: 74 69 76 65 20 5b 6c 69 73 74 20 66 61 6c 73 65  tive [list false
bdc0: 20 74 72 75 65 5d 20 7b 0d 0a 20 20 20 20 20 20   true] {..      
bdd0: 20 20 66 6f 72 65 61 63 68 20 79 65 61 72 20 5b    foreach year [
bde0: 67 65 74 42 75 69 6c 64 59 65 61 72 73 5d 20 7b  getBuildYears] {
bdf0: 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65  ..          fore
be00: 61 63 68 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ach configuratio
be10: 6e 20 5b 67 65 74 42 75 69 6c 64 43 6f 6e 66 69  n [getBuildConfi
be20: 67 75 72 61 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20  gurations] {..  
be30: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
be40: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
be50: 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
be60: 65 66 66 65 63 74 69 76 65 20 62 75 69 6c 64 20  effective build 
be70: 70 6c 61 74 66 6f 72 6d 2e 20 20 54 68 69 73 20  platform.  This 
be80: 69 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  is..            
be90: 23 20 20 20 20 20 20 20 62 61 73 65 64 20 6f 6e  #       based on
bea0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
beb0: 61 20 5b 70 72 69 6d 61 72 69 6c 79 5d 20 6e 61  a [primarily] na
bec0: 74 69 76 65 20 62 75 69 6c 64 0d 0a 20 20 20 20  tive build..    
bed0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
bee0: 69 73 20 62 65 69 6e 67 20 75 73 65 64 2e 20 20  is being used.  
bef0: 46 6f 72 20 5b 70 72 69 6d 61 72 69 6c 79 5d 20  For [primarily] 
bf00: 6e 6f 6e 2d 6e 61 74 69 76 65 20 62 75 69 6c 64  non-native build
bf10: 73 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  s,..            
bf20: 23 20 20 20 20 20 20 20 74 68 69 73 20 77 69 6c  #       this wil
bf30: 6c 20 62 65 20 61 6e 20 65 6d 70 74 79 20 73 74  l be an empty st
bf40: 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 20  ring...         
bf50: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
bf60: 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 5b    set platform [
bf70: 67 65 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d  getBuildPlatform
bf80: 20 24 6e 61 74 69 76 65 5d 0d 0a 0d 0a 20 20 20   $native]....   
bf90: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
bfa0: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
bfb0: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
bfc0: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65         "---- che
bfd0: 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d  cking for System
bfe0: 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75 69  .Data.SQLite bui
bff0: 6c 64 20 5c 22 22 20 5b 65 78 70 72 20 5c 0d 0a  ld \"" [expr \..
c000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c010: 7b 24 6e 61 74 69 76 65 20 3f 20 22 6e 61 74 69  {$native ? "nati
c020: 76 65 2f 22 20 3a 20 22 22 7d 5d 20 5b 65 78 70  ve/" : ""}] [exp
c030: 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  r {[string lengt
c040: 68 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h \..           
c050: 20 20 20 20 20 24 70 6c 61 74 66 6f 72 6d 5d 20       $platform] 
c060: 3e 20 30 20 3f 20 5b 61 70 70 65 6e 64 41 72 67  > 0 ? [appendArg
c070: 73 20 24 70 6c 61 74 66 6f 72 6d 20 2f 5d 20 3a  s $platform /] :
c080: 20 22 22 7d 5d 20 24 79 65 61 72 20 5c 0d 0a 20   ""}] $year \.. 
c090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c0a0: 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20   $configuration 
c0b0: 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20  "\"... "]....   
c0c0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
c0d0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
c0e0: 42 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 79 20  Build the fully 
c0f0: 71 75 61 6c 69 66 69 65 64 20 64 69 72 65 63 74  qualified direct
c100: 6f 72 79 20 77 68 65 72 65 20 74 68 65 20 6e 65  ory where the ne
c110: 63 65 73 73 61 72 79 0d 0a 20 20 20 20 20 20 20  cessary..       
c120: 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6d       #       com
c130: 70 6f 6e 65 6e 74 73 20 66 6f 72 20 53 79 73 74  ponents for Syst
c140: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 73  em.Data.SQLite s
c150: 68 6f 75 6c 64 20 62 65 20 66 6f 75 6e 64 2e 0d  hould be found..
c160: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
c170: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
c180: 64 69 72 65 63 74 6f 72 79 20 5b 6a 6f 69 6e 42  directory [joinB
c190: 75 69 6c 64 44 69 72 65 63 74 6f 72 79 20 24 6e  uildDirectory $n
c1a0: 61 74 69 76 65 20 5c 0d 0a 20 20 20 20 20 20 20  ative \..       
c1b0: 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 75 69           [getBui
c1c0: 6c 64 42 61 73 65 44 69 72 65 63 74 6f 72 79 5d  ldBaseDirectory]
c1d0: 20 24 79 65 61 72 20 24 70 6c 61 74 66 6f 72 6d   $year $platform
c1e0: 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d   $configuration]
c1f0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
c200: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  #..            #
c210: 20 4e 4f 54 45 3a 20 44 6f 20 74 68 65 20 6e 65   NOTE: Do the ne
c220: 63 65 73 73 61 72 79 20 66 69 6c 65 73 20 65 78  cessary files ex
c230: 69 73 74 3f 20 20 43 75 72 72 65 6e 74 6c 79 2c  ist?  Currently,
c240: 20 6e 6f 20 6f 74 68 65 72 20 73 74 65 70 73 0d   no other steps.
c250: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20  .            #  
c260: 20 20 20 20 20 61 72 65 20 74 61 6b 65 6e 20 74       are taken t
c270: 6f 20 76 65 72 69 66 79 20 74 68 69 73 20 62 75  o verify this bu
c280: 69 6c 64 20 69 73 20 61 63 74 75 61 6c 6c 79 20  ild is actually 
c290: 76 69 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20  viable...       
c2a0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
c2b0: 20 20 20 20 69 66 20 7b 5b 69 73 42 75 69 6c 64      if {[isBuild
c2c0: 41 76 61 69 6c 61 62 6c 65 20 24 6e 61 74 69 76  Available $nativ
c2d0: 65 20 24 64 69 72 65 63 74 6f 72 79 5d 7d 20 74  e $directory]} t
c2e0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
c2f0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
c300: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 68        # NOTE: Wh
c310: 65 6e 20 69 6e 20 22 73 65 6c 65 63 74 22 20 6d  en in "select" m
c320: 6f 64 65 2c 20 61 75 74 6f 6d 61 74 69 63 61 6c  ode, automatical
c330: 6c 79 20 73 65 6c 65 63 74 20 74 68 65 20 66 69  ly select the fi
c340: 72 73 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20  rst..           
c350: 20 20 20 23 20 20 20 20 20 20 20 61 76 61 69 6c     #       avail
c360: 61 62 6c 65 20 62 75 69 6c 64 20 6f 66 20 53 79  able build of Sy
c370: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
c380: 20 61 6e 64 20 74 68 65 6e 20 72 65 74 75 72 6e   and then return
c390: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
c3a0: 23 20 20 20 20 20 20 20 69 6d 6d 65 64 69 61 74  #       immediat
c3b0: 65 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ely...          
c3c0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
c3d0: 20 20 20 20 20 69 66 20 7b 24 73 65 6c 65 63 74       if {$select
c3e0: 20 26 26 20 5b 6d 61 74 63 68 50 6c 61 74 66 6f   && [matchPlatfo
c3f0: 72 6d 20 24 70 6c 61 74 66 6f 72 6d 5d 7d 20 74  rm $platform]} t
c400: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
c410: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
c420: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
c430: 3a 20 4d 61 6e 75 61 6c 6c 79 20 6f 76 65 72 72  : Manually overr
c440: 69 64 65 20 61 6c 6c 20 74 68 65 20 62 75 69 6c  ide all the buil
c450: 64 20 64 69 72 65 63 74 6f 72 79 20 73 65 6c 65  d directory sele
c460: 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20  ction..         
c470: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72         #       r
c480: 65 6c 61 74 65 64 20 74 65 73 74 20 73 65 74 74  elated test sett
c490: 69 6e 67 73 20 69 6e 20 6f 72 64 65 72 20 74 6f  ings in order to
c4a0: 20 66 6f 72 63 65 20 74 68 69 73 20 62 75 69 6c   force this buil
c4b0: 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d..             
c4c0: 20 20 20 23 20 20 20 20 20 20 20 6f 66 20 53 79     #       of Sy
c4d0: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
c4e0: 20 74 6f 20 62 65 20 75 73 65 64 2e 0d 0a 20 20   to be used...  
c4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
c500: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c510: 20 69 66 20 7b 21 5b 63 68 61 6e 67 65 4e 61 74   if {![changeNat
c520: 69 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  iveRuntimeOption
c530: 20 24 6e 61 74 69 76 65 5d 7d 20 74 68 65 6e 20   $native]} then 
c540: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
c550: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
c560: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
c570: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
c580: 20 20 20 20 20 20 20 20 20 22 6e 6f 2c 20 66 61           "no, fa
c590: 69 6c 65 64 20 74 6f 20 22 20 5b 65 78 70 72 20  iled to " [expr 
c5a0: 7b 24 6e 61 74 69 76 65 20 3f 20 22 61 64 64 22  {$native ? "add"
c5b0: 20 3a 20 22 72 65 6d 6f 76 65 22 7d 5d 20 5c 0d   : "remove"}] \.
c5c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c5d0: 20 20 20 20 20 20 20 22 20 74 68 65 20 5c 22 6e         " the \"n
c5e0: 61 74 69 76 65 5c 22 20 72 75 6e 74 69 6d 65 20  ative\" runtime 
c5f0: 6f 70 74 69 6f 6e 5c 6e 22 5d 0d 0a 0d 0a 20 20  option\n"]....  
c600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c610: 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20  return false..  
c620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
c630: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
c640: 20 20 20 73 65 74 20 3a 3a 74 65 73 74 5f 79 65     set ::test_ye
c650: 61 72 20 24 79 65 61 72 0d 0a 20 20 20 20 20 20  ar $year..      
c660: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a            set ::
c670: 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d 20 24 70  test_platform $p
c680: 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20  latform..       
c690: 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 74           set ::t
c6a0: 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f  est_configuratio
c6b0: 6e 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  n $configuration
c6c0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
c6d0: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
c6e0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
c6f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
c700: 20 20 20 20 20 20 22 79 65 73 2c 20 73 65 6c 65        "yes, sele
c710: 63 74 65 64 20 28 22 20 5b 65 78 70 72 20 7b 24  cted (" [expr {$
c720: 6e 61 74 69 76 65 20 3f 20 22 6e 61 74 69 76 65  native ? "native
c730: 2f 22 20 3a 20 22 22 7d 5d 20 5c 0d 0a 20 20 20  /" : ""}] \..   
c740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c750: 20 5b 65 78 70 72 20 7b 5b 73 74 72 69 6e 67 20   [expr {[string 
c760: 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d  length $platform
c770: 5d 20 3e 20 30 20 3f 20 5b 61 70 70 65 6e 64 41  ] > 0 ? [appendA
c780: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
c790: 20 20 20 20 20 20 20 20 20 20 20 24 70 6c 61 74             $plat
c7a0: 66 6f 72 6d 20 2f 5d 20 3a 20 22 22 7d 5d 20 24  form /] : ""}] $
c7b0: 79 65 61 72 20 2f 20 24 63 6f 6e 66 69 67 75 72  year / $configur
c7c0: 61 74 69 6f 6e 20 22 29 5c 6e 22 5d 0d 0a 0d 0a  ation ")\n"]....
c7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7e0: 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20  return true..   
c7f0: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
c800: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
c810: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
c820: 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20  nel yes\n..     
c830: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
c840: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
c850: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
c860: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e  tputs $channel n
c870: 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  o\n..           
c880: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
c890: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
c8a0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74    }....      ret
c8b0: 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d  urn false..    }
c8c0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68  .....    proc ch
c8d0: 65 63 6b 46 6f 72 53 51 4c 69 74 65 52 65 6c 65  eckForSQLiteRele
c8e0: 61 73 65 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b  ases { channel {
c8f0: 73 65 6c 65 63 74 20 66 61 6c 73 65 7d 20 7d 20  select false} } 
c900: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
c910: 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
c920: 66 6f 72 20 70 61 73 74 20 72 65 6c 65 61 73 65  for past release
c930: 73 20 6f 66 20 53 79 73 74 65 6d 2e 44 61 74 61  s of System.Data
c940: 2e 53 51 4c 69 74 65 20 69 6e 20 74 68 65 20 64  .SQLite in the d
c950: 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20  irectory..      
c960: 23 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 65  #       containe
c970: 64 20 69 6e 20 74 68 65 20 22 53 79 73 74 65 6d  d in the "System
c980: 2e 44 61 74 61 2e 53 51 4c 69 74 65 22 20 65 6e  .Data.SQLite" en
c990: 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62  vironment variab
c9a0: 6c 65 2c 20 69 66 0d 0a 20 20 20 20 20 20 23 20  le, if..      # 
c9b0: 20 20 20 20 20 20 70 72 65 73 65 6e 74 2e 0d 0a        present...
c9c0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
c9d0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
c9e0: 3a 3a 65 6e 76 28 53 79 73 74 65 6d 2e 44 61 74  ::env(System.Dat
c9f0: 61 2e 53 51 4c 69 74 65 29 5d 20 26 26 20 5c 0d  a.SQLite)] && \.
ca00: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
ca10: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 65 6e 76  ng length $::env
ca20: 28 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  (System.Data.SQL
ca30: 69 74 65 29 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ite)] > 0} then 
ca40: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
ca50: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75        # NOTE: Bu
ca60: 69 6c 64 20 74 68 65 20 66 75 6c 6c 79 20 71 75  ild the fully qu
ca70: 61 6c 69 66 69 65 64 20 64 69 72 65 63 74 6f 72  alified director
ca80: 79 20 77 68 65 72 65 20 74 68 65 20 6e 65 63 65  y where the nece
ca90: 73 73 61 72 79 0d 0a 20 20 20 20 20 20 20 20 23  ssary..        #
caa0: 20 20 20 20 20 20 20 63 6f 6d 70 6f 6e 65 6e 74         component
cab0: 73 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74  s for System.Dat
cac0: 61 2e 53 51 4c 69 74 65 20 73 68 6f 75 6c 64 20  a.SQLite should 
cad0: 62 65 20 66 6f 75 6e 64 2e 0d 0a 20 20 20 20 20  be found...     
cae0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65     #..        se
caf0: 74 20 64 69 72 65 63 74 6f 72 79 20 5b 66 69 6c  t directory [fil
cb00: 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69  e nativename [fi
cb10: 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20  le join \..     
cb20: 20 20 20 20 20 20 20 24 3a 3a 65 6e 76 28 53 79         $::env(Sy
cb30: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
cb40: 29 20 5b 67 65 74 52 65 6c 65 61 73 65 56 65 72  ) [getReleaseVer
cb50: 73 69 6f 6e 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20  sion]]]....     
cb60: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
cb70: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
cb80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
cb90: 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
cba0: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
cbb0: 74 65 20 72 65 6c 65 61 73 65 20 5c 22 22 20 5c  te release \"" \
cbc0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 64  ..            $d
cbd0: 69 72 65 63 74 6f 72 79 20 22 5c 22 2e 2e 2e 20  irectory "\"... 
cbe0: 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66  "]....        if
cbf0: 20 7b 5b 69 73 52 65 6c 65 61 73 65 41 76 61 69   {[isReleaseAvai
cc00: 6c 61 62 6c 65 20 24 64 69 72 65 63 74 6f 72 79  lable $directory
cc10: 20 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e   platform]} then
cc20: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
cc30: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
cc40: 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3d 3d 20 30   $platform] == 0
cc50: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
cc60: 20 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f        set platfo
cc70: 72 6d 20 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20  rm unknown..    
cc80: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
cc90: 20 20 20 20 20 69 66 20 7b 24 73 65 6c 65 63 74       if {$select
cca0: 20 26 26 20 5b 6d 61 74 63 68 50 6c 61 74 66 6f   && [matchPlatfo
ccb0: 72 6d 20 24 70 6c 61 74 66 6f 72 6d 5d 7d 20 74  rm $platform]} t
ccc0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
ccd0: 20 20 20 73 65 74 20 3a 3a 62 75 69 6c 64 5f 64     set ::build_d
cce0: 69 72 65 63 74 6f 72 79 20 24 64 69 72 65 63 74  irectory $direct
ccf0: 6f 72 79 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ory....         
cd00: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
cd10: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79  l [appendArgs "y
cd20: 65 73 2c 20 73 65 6c 65 63 74 65 64 20 28 22 20  es, selected (" 
cd30: 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d  $platform ")\n"]
cd40: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
cd50: 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20  return true..   
cd60: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
cd70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
cd80: 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
cd90: 65 6e 64 41 72 67 73 20 22 79 65 73 20 28 22 20  endArgs "yes (" 
cda0: 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d  $platform ")\n"]
cdb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
cdc0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
cdd0: 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
cde0: 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a   $channel no\n..
cdf0: 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65  ..          fore
ce00: 61 63 68 20 70 61 74 68 20 5b 6c 73 6f 72 74 20  ach path [lsort 
ce10: 2d 64 65 63 72 65 61 73 69 6e 67 20 5b 66 69 6c  -decreasing [fil
ce20: 65 20 6c 69 73 74 20 24 64 69 72 65 63 74 6f 72  e list $director
ce30: 79 20 2a 5d 5d 20 7b 0d 0a 20 20 20 20 20 20 20  y *]] {..       
ce40: 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65       if {[file e
ce50: 78 69 73 74 73 20 24 70 61 74 68 5d 20 26 26 20  xists $path] && 
ce60: 5b 66 69 6c 65 20 69 73 64 69 72 65 63 74 6f 72  [file isdirector
ce70: 79 20 24 70 61 74 68 5d 7d 20 74 68 65 6e 20 7b  y $path]} then {
ce80: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
ce90: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
cea0: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
ceb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cec0: 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
ced0: 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  or System.Data.S
cee0: 51 4c 69 74 65 20 72 65 6c 65 61 73 65 20 5c 22  QLite release \"
cef0: 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
cf00: 20 20 20 20 20 20 20 24 70 61 74 68 20 22 5c 22         $path "\"
cf10: 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20  ... "]....      
cf20: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 73 52          if {[isR
cf30: 65 6c 65 61 73 65 41 76 61 69 6c 61 62 6c 65 20  eleaseAvailable 
cf40: 24 70 61 74 68 20 70 6c 61 74 66 6f 72 6d 5d 7d  $path platform]}
cf50: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
cf60: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74           if {[st
cf70: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61  ring length $pla
cf80: 74 66 6f 72 6d 5d 20 3d 3d 20 30 7d 20 74 68 65  tform] == 0} the
cf90: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
cfa0: 20 20 20 20 20 20 20 73 65 74 20 70 6c 61 74 66         set platf
cfb0: 6f 72 6d 20 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20  orm unknown..   
cfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
cfd0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
cfe0: 20 20 69 66 20 7b 24 73 65 6c 65 63 74 20 26 26    if {$select &&
cff0: 20 5b 6d 61 74 63 68 50 6c 61 74 66 6f 72 6d 20   [matchPlatform 
d000: 24 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e  $platform]} then
d010: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
d020: 20 20 20 20 20 20 73 65 74 20 3a 3a 62 75 69 6c        set ::buil
d030: 64 5f 64 69 72 65 63 74 6f 72 79 20 24 70 61 74  d_directory $pat
d040: 68 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h....           
d050: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
d060: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
d070: 73 20 22 79 65 73 2c 20 73 65 6c 65 63 74 65 64  s "yes, selected
d080: 20 28 22 20 24 70 6c 61 74 66 6f 72 6d 20 22 29   (" $platform ")
d090: 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  \n"]....        
d0a0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
d0b0: 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 20   true..         
d0c0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
d0d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d0e0: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
d0f0: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79  l [appendArgs "y
d100: 65 73 20 28 22 20 24 70 6c 61 74 66 6f 72 6d 20  es (" $platform 
d110: 22 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  ")\n"]..        
d120: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
d130: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
d140: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
d150: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
d160: 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20  l no\n..        
d170: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
d180: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
d190: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
d1a0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
d1b0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
d1c0: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
d1d0: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
d1e0: 20 20 22 2d 2d 2d 2d 20 65 6e 76 69 72 6f 6e 6d    "---- environm
d1f0: 65 6e 74 20 76 61 72 69 61 62 6c 65 20 5c 22 53  ent variable \"S
d200: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
d210: 65 5c 22 20 69 73 20 6e 6f 74 20 22 20 5c 0d 0a  e\" is not " \..
d220: 20 20 20 20 20 20 20 20 20 20 20 20 22 73 65 74              "set
d230: 2c 20 73 6b 69 70 70 69 6e 67 20 63 68 65 63 6b  , skipping check
d240: 20 66 6f 72 20 72 65 6c 65 61 73 65 73 2e 2e 2e   for releases...
d250: 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  \n"]..      }...
d260: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61  .      return fa
d270: 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  lse..    }..... 
d280: 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72     proc checkFor
d290: 53 51 4c 69 74 65 4c 69 62 72 61 72 79 20 7b 20  SQLiteLibrary { 
d2a0: 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20  channel } {..   
d2b0: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
d2c0: 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67  l "---- checking
d2d0: 20 66 6f 72 20 53 51 4c 69 74 65 20 63 6f 72 65   for SQLite core
d2e0: 20 6c 69 62 72 61 72 79 2e 2e 2e 20 22 0d 0a 0d   library... "...
d2f0: 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63  .      if {[catc
d300: 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a  h {..        obj
d310: 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
d320: 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
d330: 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
d340: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53  em.Data.SQLite.S
d350: 51 4c 69 74 65 33 20 53 51 4c 69 74 65 56 65 72  QLite3 SQLiteVer
d360: 73 69 6f 6e 0d 0a 20 20 20 20 20 20 7d 20 76 65  sion..      } ve
d370: 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65  rsion] == 0} the
d380: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
d390: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
d3a0: 43 68 65 63 6b 20 69 66 20 74 68 65 20 72 65 74  Check if the ret
d3b0: 75 72 6e 65 64 20 76 65 72 73 69 6f 6e 20 77 61  urned version wa
d3c0: 73 20 6e 75 6c 6c 2e 20 20 49 66 20 73 6f 2c 20  s null.  If so, 
d3d0: 6d 61 6b 65 20 69 74 20 65 61 73 79 0d 0a 20 20  make it easy..  
d3e0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f        #       to
d3f0: 20 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20   spot...        
d400: 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  #..        if {[
d410: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76  string length $v
d420: 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68  ersion] == 0} th
d430: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
d440: 73 65 74 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c  set version null
d450: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
d460: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
d470: 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
d480: 74 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 46  t to query the F
d490: 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65  ossil source ide
d4a0: 6e 74 69 66 69 65 72 20 66 6f 72 20 74 68 65 20  ntifier for the 
d4b0: 53 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 20 20  SQLite..        
d4c0: 23 20 20 20 20 20 20 20 63 6f 72 65 20 6c 69 62  #       core lib
d4d0: 72 61 72 79 2e 0d 0a 20 20 20 20 20 20 20 20 23  rary...        #
d4e0: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
d4f0: 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
d500: 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
d510: 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
d520: 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
d530: 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
d540: 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 53 51  QLite.SQLite3 SQ
d550: 4c 69 74 65 53 6f 75 72 63 65 49 64 0d 0a 20 20  LiteSourceId..  
d560: 20 20 20 20 20 20 7d 20 73 6f 75 72 63 65 49 64        } sourceId
d570: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
d580: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
d590: 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 66 61 69    # NOTE: We fai
d5a0: 6c 65 64 20 74 6f 20 71 75 65 72 79 20 74 68 65  led to query the
d5b0: 20 46 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69   Fossil source i
d5c0: 64 65 6e 74 69 66 69 65 72 2e 0d 0a 20 20 20 20  dentifier...    
d5d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
d5e0: 20 20 20 73 65 74 20 73 6f 75 72 63 65 49 64 20     set sourceId 
d5f0: 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20  unknown..       
d600: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
d610: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
d620: 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 72 65   Check if the re
d630: 74 75 72 6e 65 64 20 46 6f 73 73 69 6c 20 73 6f  turned Fossil so
d640: 75 72 63 65 20 69 64 65 6e 74 69 66 69 65 72 20  urce identifier 
d650: 77 61 73 20 6e 75 6c 6c 2e 20 20 49 66 0d 0a 20  was null.  If.. 
d660: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73         #       s
d670: 6f 2c 20 6d 61 6b 65 20 69 74 20 65 61 73 79 20  o, make it easy 
d680: 74 6f 20 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20  to spot...      
d690: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
d6a0: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
d6b0: 24 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d  $sourceId] == 0}
d6c0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
d6d0: 20 20 20 73 65 74 20 73 6f 75 72 63 65 49 64 20     set sourceId 
d6e0: 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d  null..        }.
d6f0: 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
d700: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65        # NOTE: Ye
d710: 73 2c 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f  s, the SQLite co
d720: 72 65 20 6c 69 62 72 61 72 79 20 61 70 70 65 61  re library appea
d730: 72 73 20 74 6f 20 62 65 20 61 76 61 69 6c 61 62  rs to be availab
d740: 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  le...        #..
d750: 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
d760: 72 61 69 6e 74 20 53 51 4c 69 74 65 0d 0a 0d 0a  raint SQLite....
d770: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
d780: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
d790: 67 73 20 22 79 65 73 20 28 22 20 24 76 65 72 73  gs "yes (" $vers
d7a0: 69 6f 6e 20 22 20 22 20 24 73 6f 75 72 63 65 49  ion " " $sourceI
d7b0: 64 20 22 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  d ")\n"]..      
d7c0: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
d7d0: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
d7e0: 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a   no\n..      }..
d7f0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
d800: 6f 63 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74  oc checkForSQLit
d810: 65 49 6e 74 65 72 6f 70 20 7b 20 63 68 61 6e 6e  eInterop { chann
d820: 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70  el } {..      tp
d830: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d  uts $channel "--
d840: 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
d850: 53 51 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61  SQLite interop a
d860: 73 73 65 6d 62 6c 79 2e 2e 2e 20 22 0d 0a 0d 0a  ssembly... "....
d870: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
d880: 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65   {..        obje
d890: 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
d8a0: 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
d8b0: 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
d8c0: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51  m.Data.SQLite.SQ
d8d0: 4c 69 74 65 33 20 49 6e 74 65 72 6f 70 56 65 72  Lite3 InteropVer
d8e0: 73 69 6f 6e 0d 0a 20 20 20 20 20 20 7d 20 76 65  sion..      } ve
d8f0: 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65  rsion] == 0} the
d900: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
d910: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
d920: 43 68 65 63 6b 20 69 66 20 74 68 65 20 72 65 74  Check if the ret
d930: 75 72 6e 65 64 20 76 65 72 73 69 6f 6e 20 77 61  urned version wa
d940: 73 20 6e 75 6c 6c 2e 20 20 49 66 20 73 6f 2c 20  s null.  If so, 
d950: 6d 61 6b 65 20 69 74 20 65 61 73 79 0d 0a 20 20  make it easy..  
d960: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f        #       to
d970: 20 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20   spot...        
d980: 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  #..        if {[
d990: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76  string length $v
d9a0: 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68  ersion] == 0} th
d9b0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
d9c0: 73 65 74 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c  set version null
d9d0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
d9e0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
d9f0: 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
da00: 74 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 46  t to query the F
da10: 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65  ossil source ide
da20: 6e 74 69 66 69 65 72 20 66 6f 72 20 74 68 65 20  ntifier for the 
da30: 53 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 20 20  SQLite..        
da40: 23 20 20 20 20 20 20 20 63 6f 72 65 20 6c 69 62  #       core lib
da50: 72 61 72 79 2e 0d 0a 20 20 20 20 20 20 20 20 23  rary...        #
da60: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
da70: 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
da80: 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
da90: 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
daa0: 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
dab0: 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
dac0: 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 49 6e  QLite.SQLite3 In
dad0: 74 65 72 6f 70 53 6f 75 72 63 65 49 64 0d 0a 20  teropSourceId.. 
dae0: 20 20 20 20 20 20 20 7d 20 73 6f 75 72 63 65 49         } sourceI
daf0: 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  d]} then {..    
db00: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
db10: 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 66 61     # NOTE: We fa
db20: 69 6c 65 64 20 74 6f 20 71 75 65 72 79 20 74 68  iled to query th
db30: 65 20 46 6f 73 73 69 6c 20 73 6f 75 72 63 65 20  e Fossil source 
db40: 69 64 65 6e 74 69 66 69 65 72 2e 0d 0a 20 20 20  identifier...   
db50: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
db60: 20 20 20 20 73 65 74 20 73 6f 75 72 63 65 49 64      set sourceId
db70: 20 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20   unknown..      
db80: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
db90: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
dba0: 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 72  : Check if the r
dbb0: 65 74 75 72 6e 65 64 20 46 6f 73 73 69 6c 20 73  eturned Fossil s
dbc0: 6f 75 72 63 65 20 69 64 65 6e 74 69 66 69 65 72  ource identifier
dbd0: 20 77 61 73 20 6e 75 6c 6c 2e 20 20 49 66 0d 0a   was null.  If..
dbe0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
dbf0: 73 6f 2c 20 6d 61 6b 65 20 69 74 20 65 61 73 79  so, make it easy
dc00: 20 74 6f 20 73 70 6f 74 2e 0d 0a 20 20 20 20 20   to spot...     
dc10: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
dc20: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
dc30: 20 24 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30   $sourceId] == 0
dc40: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
dc50: 20 20 20 20 73 65 74 20 73 6f 75 72 63 65 49 64      set sourceId
dc60: 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d   null..        }
dc70: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
dc80: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42         # NOTE: B
dc90: 65 66 6f 72 65 20 61 63 74 75 61 6c 6c 79 20 61  efore actually a
dca0: 64 64 69 6e 67 20 74 68 65 20 74 65 73 74 20 63  dding the test c
dcb0: 6f 6e 73 74 72 61 69 6e 74 2c 20 6d 61 6b 65 20  onstraint, make 
dcc0: 73 75 72 65 20 74 68 65 0d 0a 20 20 20 20 20 20  sure the..      
dcd0: 20 20 23 20 20 20 20 20 20 20 76 65 72 73 69 6f    #       versio
dce0: 6e 20 69 73 20 76 61 6c 69 64 20 28 69 2e 65 2e  n is valid (i.e.
dcf0: 20 6e 6f 74 20 6a 75 73 74 20 74 68 61 74 20 77   not just that w
dd00: 65 20 63 6f 75 6c 64 20 71 75 65 72 79 20 69 74  e could query it
dd10: 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  )...        #.. 
dd20: 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 73         if {$vers
dd30: 69 6f 6e 20 6e 65 20 22 6e 75 6c 6c 22 7d 20 74  ion ne "null"} t
dd40: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
dd50: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
dd60: 4e 4f 54 45 3a 20 59 65 73 2c 20 74 68 65 20 53  NOTE: Yes, the S
dd70: 51 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73  QLite interop as
dd80: 73 65 6d 62 6c 79 20 61 70 70 65 61 72 73 20 74  sembly appears t
dd90: 6f 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2e 0d  o be available..
dda0: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
ddb0: 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
ddc0: 72 61 69 6e 74 20 53 51 4c 69 74 65 49 6e 74 65  raint SQLiteInte
ddd0: 72 6f 70 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  rop....         
dde0: 20 73 65 74 20 61 6e 73 77 65 72 20 79 65 73 0d   set answer yes.
ddf0: 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
de00: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
de10: 20 61 6e 73 77 65 72 20 6e 6f 0d 0a 20 20 20 20   answer no..    
de20: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
de30: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
de40: 5b 61 70 70 65 6e 64 41 72 67 73 20 24 61 6e 73  [appendArgs $ans
de50: 77 65 72 20 22 20 28 22 20 24 76 65 72 73 69 6f  wer " (" $versio
de60: 6e 20 22 20 22 20 24 73 6f 75 72 63 65 49 64 20  n " " $sourceId 
de70: 22 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 20  ")\n"]..      } 
de80: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
de90: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e  tputs $channel n
dea0: 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  o\n..      }..  
deb0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
dec0: 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44   checkForSQLiteD
ded0: 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 7b 20  efineConstant { 
dee0: 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 20 7d 20 7b  channel name } {
def0: 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63  ..      tputs $c
df00: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
df10: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
df20: 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
df30: 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  or System.Data.S
df40: 51 4c 69 74 65 20 64 65 66 69 6e 65 20 63 6f 6e  QLite define con
df50: 73 74 61 6e 74 20 5c 22 22 20 24 6e 61 6d 65 20  stant \"" $name 
df60: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 22 5c 22  \..          "\"
df70: 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20  ... "]....      
df80: 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
df90: 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
dfa0: 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
dfb0: 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
dfc0: 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
dfd0: 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20  .SQLite.SQLite3 
dfe0: 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73 0d  DefineConstants.
dff0: 0a 20 20 20 20 20 20 7d 20 64 65 66 69 6e 65 43  .      } defineC
e000: 6f 6e 73 74 61 6e 74 73 5d 20 3d 3d 20 30 7d 20  onstants] == 0} 
e010: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
e020: 69 66 20 7b 5b 6c 73 65 61 72 63 68 20 2d 65 78  if {[lsearch -ex
e030: 61 63 74 20 2d 6e 6f 63 61 73 65 20 24 64 65 66  act -nocase $def
e040: 69 6e 65 43 6f 6e 73 74 61 6e 74 73 20 24 6e 61  ineConstants $na
e050: 6d 65 5d 20 21 3d 20 2d 31 7d 20 74 68 65 6e 20  me] != -1} then 
e060: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
e070: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
e080: 3a 20 59 65 73 2c 20 74 68 69 73 20 64 65 66 69  : Yes, this defi
e090: 6e 65 20 63 6f 6e 73 74 61 6e 74 20 77 61 73 20  ne constant was 
e0a0: 65 6e 61 62 6c 65 64 20 77 68 65 6e 20 74 68 65  enabled when the
e0b0: 20 6d 61 6e 61 67 65 64 0d 0a 20 20 20 20 20 20   managed..      
e0c0: 20 20 20 20 23 20 20 20 20 20 20 20 61 73 73 65      #       asse
e0d0: 6d 62 6c 79 20 77 61 73 20 63 6f 6d 70 69 6c 65  mbly was compile
e0e0: 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  d...          #.
e0f0: 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f  .          addCo
e100: 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
e110: 41 72 67 73 20 64 65 66 69 6e 65 43 6f 6e 73 74  Args defineConst
e120: 61 6e 74 2e 53 79 73 74 65 6d 2e 44 61 74 61 2e  ant.System.Data.
e130: 53 51 4c 69 74 65 2e 20 24 6e 61 6d 65 5d 0d 0a  SQLite. $name]..
e140: 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
e150: 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e  s $channel yes\n
e160: 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
e170: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
e180: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c  uts $channel no\
e190: 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  n..        }..  
e1a0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
e1b0: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
e1c0: 6e 6e 65 6c 20 65 72 72 6f 72 5c 6e 0d 0a 20 20  nnel error\n..  
e1d0: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
e1e0: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 44 61 74  .    proc getDat
e1f0: 65 54 69 6d 65 46 6f 72 6d 61 74 20 7b 7d 20 7b  eTimeFormat {} {
e200: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
e210: 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72   # NOTE: This pr
e220: 6f 63 65 64 75 72 65 20 73 69 6d 70 6c 79 20 72  ocedure simply r
e230: 65 74 75 72 6e 73 20 74 68 65 20 22 64 65 66 61  eturns the "defa
e240: 75 6c 74 22 20 44 61 74 65 54 69 6d 65 20 66 6f  ult" DateTime fo
e250: 72 6d 61 74 20 75 73 65 64 0d 0a 20 20 20 20 20  rmat used..     
e260: 20 23 20 20 20 20 20 20 20 62 79 20 74 68 65 20   #       by the 
e270: 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20  test suite...   
e280: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
e290: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 64  [info exists ::d
e2a0: 61 74 65 74 69 6d 65 5f 66 6f 72 6d 61 74 5d 20  atetime_format] 
e2b0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
e2c0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
e2d0: 3a 3a 64 61 74 65 74 69 6d 65 5f 66 6f 72 6d 61  ::datetime_forma
e2e0: 74 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  t] > 0} then {..
e2f0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
e300: 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72     # NOTE: Retur
e310: 6e 20 74 68 65 20 6d 61 6e 75 61 6c 6c 79 20 6f  n the manually o
e320: 76 65 72 72 69 64 64 65 6e 20 76 61 6c 75 65 20  verridden value 
e330: 66 6f 72 20 74 68 65 20 44 61 74 65 54 69 6d 65  for the DateTime
e340: 20 66 6f 72 6d 61 74 2e 0d 0a 20 20 20 20 20 20   format...      
e350: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
e360: 75 72 6e 20 24 3a 3a 64 61 74 65 74 69 6d 65 5f  urn $::datetime_
e370: 66 6f 72 6d 61 74 0d 0a 20 20 20 20 20 20 7d 20  format..      } 
e380: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
e390: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
e3a0: 45 3a 20 52 65 74 75 72 6e 20 61 6e 20 49 53 4f  E: Return an ISO
e3b0: 38 36 30 31 20 44 61 74 65 54 69 6d 65 20 66 6f  8601 DateTime fo
e3c0: 72 6d 61 74 20 63 6f 6d 70 61 74 69 62 6c 65 20  rmat compatible 
e3d0: 77 69 74 68 20 53 51 4c 69 74 65 2c 0d 0a 20 20  with SQLite,..  
e3e0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 53 79        #       Sy
e3f0: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
e400: 2c 20 61 6e 64 20 73 75 69 74 61 62 6c 65 20 66  , and suitable f
e410: 6f 72 20 72 6f 75 6e 64 2d 74 72 69 70 70 69 6e  or round-trippin
e420: 67 20 77 69 74 68 20 74 68 65 0d 0a 20 20 20 20  g with the..    
e430: 20 20 20 20 23 20 20 20 20 20 20 20 44 61 74 65      #       Date
e440: 54 69 6d 65 20 63 6c 61 73 73 20 6f 66 20 74 68  Time class of th
e450: 65 20 66 72 61 6d 65 77 6f 72 6b 2e 20 20 49 66  e framework.  If
e460: 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 63   this value is c
e470: 68 61 6e 67 65 64 2c 0d 0a 20 20 20 20 20 20 20  hanged,..       
e480: 20 23 20 20 20 20 20 20 20 76 61 72 69 6f 75 73   #       various
e490: 20 74 65 73 74 73 20 6d 61 79 20 66 61 69 6c 2e   tests may fail.
e4a0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
e4b0: 20 20 20 20 20 72 65 74 75 72 6e 20 22 79 79 79       return "yyy
e4c0: 79 2d 4d 4d 2d 64 64 20 48 48 3a 6d 6d 3a 73 73  y-MM-dd HH:mm:ss
e4d0: 2e 46 46 46 46 46 46 46 4b 22 0d 0a 20 20 20 20  .FFFFFFFK"..    
e4e0: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
e4f0: 20 20 20 70 72 6f 63 20 65 6e 75 6d 65 72 61 62     proc enumerab
e500: 6c 65 54 6f 4c 69 73 74 20 7b 20 65 6e 75 6d 65  leToList { enume
e510: 72 61 62 6c 65 20 7d 20 7b 0d 0a 20 20 20 20 20  rable } {..     
e520: 20 73 65 74 20 72 65 73 75 6c 74 20 5b 6c 69 73   set result [lis
e530: 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  t]....      if {
e540: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
e550: 65 6e 75 6d 65 72 61 62 6c 65 5d 20 3d 3d 20 30  enumerable] == 0
e560: 20 7c 7c 20 24 65 6e 75 6d 65 72 61 62 6c 65 20   || $enumerable 
e570: 65 71 20 22 6e 75 6c 6c 22 7d 20 74 68 65 6e 20  eq "null"} then 
e580: 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
e590: 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 20  n $result..     
e5a0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 6f 62 6a 65   }....      obje
e5b0: 63 74 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61  ct foreach -alia
e5c0: 73 20 69 74 65 6d 20 24 65 6e 75 6d 65 72 61 62  s item $enumerab
e5d0: 6c 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  le {..        if
e5e0: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
e5f0: 20 24 69 74 65 6d 5d 20 3e 20 30 7d 20 74 68 65   $item] > 0} the
e600: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6c  n {..          l
e610: 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 5b 24  append result [$
e620: 69 74 65 6d 20 54 6f 53 74 72 69 6e 67 5d 0d 0a  item ToString]..
e630: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
e640: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
e650: 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20  rn $result..    
e660: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
e670: 61 74 63 68 41 6e 64 52 65 74 75 72 6e 20 7b 20  atchAndReturn { 
e680: 73 63 72 69 70 74 20 7b 73 74 61 63 6b 54 72 61  script {stackTra
e690: 63 65 20 66 61 6c 73 65 7d 20 7b 73 74 72 69 63  ce false} {stric
e6a0: 74 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20  t true} } {..   
e6b0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
e6c0: 54 45 3a 20 45 76 61 6c 75 61 74 65 20 74 68 65  TE: Evaluate the
e6d0: 20 73 63 72 69 70 74 20 70 72 6f 76 69 64 65 64   script provided
e6e0: 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 20 69   by our caller i
e6f0: 6e 20 74 68 65 69 72 20 63 6f 6e 74 65 78 74 2c  n their context,
e700: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
e710: 63 61 70 74 75 72 69 6e 67 20 62 6f 74 68 20 74  capturing both t
e720: 68 65 20 72 65 73 75 6c 74 20 61 6e 64 20 74 68  he result and th
e730: 65 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 0d 0a  e return code...
e740: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73        #..      s
e750: 65 74 20 63 6f 64 65 20 5b 63 61 74 63 68 20 7b  et code [catch {
e760: 75 70 6c 65 76 65 6c 20 31 20 24 73 63 72 69 70  uplevel 1 $scrip
e770: 74 7d 20 72 65 73 75 6c 74 5d 0d 0a 0d 0a 20 20  t} result]....  
e780: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
e790: 4f 54 45 3a 20 44 69 64 20 74 68 65 20 73 63 72  OTE: Did the scr
e7a0: 69 70 74 20 70 72 6f 76 69 64 65 64 20 62 79 20  ipt provided by 
e7b0: 6f 75 72 20 63 61 6c 6c 65 72 20 4e 4f 54 20 72  our caller NOT r
e7c0: 61 69 73 65 20 61 6e 20 65 72 72 6f 72 3f 0d 0a  aise an error?..
e7d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
e7e0: 66 20 7b 24 73 74 72 69 63 74 20 26 26 20 24 63  f {$strict && $c
e7f0: 6f 64 65 20 3d 3d 20 30 20 7c 7c 20 21 24 73 74  ode == 0 || !$st
e800: 72 69 63 74 20 26 26 20 24 63 6f 64 65 20 21 3d  rict && $code !=
e810: 20 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   1} then {..    
e820: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
e830: 20 4e 4f 54 45 3a 20 53 75 63 63 65 73 73 2e 20   NOTE: Success. 
e840: 20 52 65 74 75 72 6e 20 61 20 6c 69 73 74 20 77   Return a list w
e850: 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 20 63  ith the return c
e860: 6f 64 65 20 61 6e 64 20 74 68 65 20 72 65 73 75  ode and the resu
e870: 6c 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  lt...        #..
e880: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
e890: 6c 69 73 74 20 24 63 6f 64 65 20 24 72 65 73 75  list $code $resu
e8a0: 6c 74 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  lt]..      } els
e8b0: 65 69 66 20 7b 24 73 74 61 63 6b 54 72 61 63 65  eif {$stackTrace
e8c0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
e8d0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
e8e0: 4f 54 45 3a 20 46 61 69 6c 75 72 65 2e 20 20 4f  OTE: Failure.  O
e8f0: 75 72 20 63 61 6c 6c 65 72 20 77 61 6e 74 73 20  ur caller wants 
e900: 61 20 66 75 6c 6c 20 73 74 61 63 6b 20 74 72 61  a full stack tra
e910: 63 65 20 28 69 66 20 61 70 70 6c 69 63 61 62 6c  ce (if applicabl
e920: 65 29 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20  e),..        #  
e930: 20 20 20 20 20 72 65 74 75 72 6e 20 61 20 6c 69       return a li
e940: 73 74 20 77 69 74 68 20 74 68 65 20 72 65 74 75  st with the retu
e950: 72 6e 20 63 6f 64 65 20 61 6e 64 20 74 68 65 20  rn code and the 
e960: 72 65 73 75 6c 74 20 76 65 72 62 61 74 69 6d 2e  result verbatim.
e970: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
e980: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73       return [lis
e990: 74 20 24 63 6f 64 65 20 24 72 65 73 75 6c 74 5d  t $code $result]
e9a0: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
e9b0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
e9c0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 69       # NOTE: Fai
e9d0: 6c 75 72 65 2e 20 20 4f 75 72 20 63 61 6c 6c 65  lure.  Our calle
e9e0: 72 20 64 6f 65 73 20 6e 6f 74 20 77 61 6e 74 20  r does not want 
e9f0: 61 20 66 75 6c 6c 20 73 74 61 63 6b 20 74 72 61  a full stack tra
ea00: 63 65 20 28 69 66 0d 0a 20 20 20 20 20 20 20 20  ce (if..        
ea10: 23 20 20 20 20 20 20 20 61 70 70 6c 69 63 61 62  #       applicab
ea20: 6c 65 29 2c 20 72 65 74 75 72 6e 20 61 20 6c 69  le), return a li
ea30: 73 74 20 77 69 74 68 20 74 68 65 20 72 65 74 75  st with the retu
ea40: 72 6e 20 63 6f 64 65 2c 20 74 68 65 20 65 72 72  rn code, the err
ea50: 6f 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  or..        #   
ea60: 20 20 20 20 63 6f 64 65 20 66 6f 72 20 74 68 65      code for the
ea70: 20 69 6e 74 65 72 70 72 65 74 65 72 2c 20 61 6e   interpreter, an
ea80: 64 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  d the error mess
ea90: 61 67 65 20 75 70 20 74 6f 20 74 68 65 0d 0a 20  age up to the.. 
eaa0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70         #       p
eab0: 6f 69 6e 74 20 77 68 65 72 65 20 74 68 65 20 73  oint where the s
eac0: 74 61 63 6b 20 74 72 61 63 65 20 73 68 6f 75 6c  tack trace shoul
ead0: 64 20 73 74 61 72 74 2e 0d 0a 20 20 20 20 20 20  d start...      
eae0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74    #..        set
eaf0: 20 69 6e 64 65 78 20 5b 73 74 72 69 6e 67 20 66   index [string f
eb00: 69 72 73 74 20 22 20 20 20 61 74 20 22 20 24 72  irst "   at " $r
eb10: 65 73 75 6c 74 5d 3b 20 23 20 48 41 43 4b 3a 20  esult]; # HACK: 
eb20: 52 65 6c 69 61 62 6c 65 3f 0d 0a 0d 0a 20 20 20  Reliable?....   
eb30: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73       return [lis
eb40: 74 20 24 63 6f 64 65 20 24 3a 3a 65 72 72 6f 72  t $code $::error
eb50: 43 6f 64 65 20 5b 65 78 70 72 20 7b 24 69 6e 64  Code [expr {$ind
eb60: 65 78 20 21 3d 20 2d 31 20 3f 20 5c 0d 0a 20 20  ex != -1 ? \..  
eb70: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
eb80: 67 20 74 72 69 6d 20 5b 73 74 72 69 6e 67 20 72  g trim [string r
eb90: 61 6e 67 65 20 24 72 65 73 75 6c 74 20 30 20 24  ange $result 0 $
eba0: 69 6e 64 65 78 5d 5d 20 3a 20 24 72 65 73 75 6c  index]] : $resul
ebb0: 74 7d 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  t}]]..      }.. 
ebc0: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
ebd0: 63 20 63 6f 6d 70 69 6c 65 43 53 68 61 72 70 57  c compileCSharpW
ebe0: 69 74 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  ith {..         
ebf0: 20 20 20 74 65 78 74 20 6d 65 6d 6f 72 79 20 73     text memory s
ec00: 79 6d 62 6f 6c 73 20 73 74 72 69 63 74 20 72 65  ymbols strict re
ec10: 73 75 6c 74 73 56 61 72 4e 61 6d 65 20 65 72 72  sultsVarName err
ec20: 6f 72 73 56 61 72 4e 61 6d 65 20 66 69 6c 65 4e  orsVarName fileN
ec30: 61 6d 65 73 0d 0a 20 20 20 20 20 20 20 20 20 20  ames..          
ec40: 20 20 61 72 67 73 20 7d 20 7b 0d 0a 20 20 20 20    args } {..    
ec50: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
ec60: 45 3a 20 53 69 6e 63 65 20 77 65 20 61 72 65 20  E: Since we are 
ec70: 67 6f 69 6e 67 20 74 6f 20 75 73 65 20 74 68 69  going to use thi
ec80: 73 20 6d 65 74 68 6f 64 20 6e 61 6d 65 20 61 20  s method name a 
ec90: 6c 6f 74 2c 20 61 73 73 69 67 6e 20 69 74 20 74  lot, assign it t
eca0: 6f 20 61 0d 0a 20 20 20 20 20 20 23 20 20 20 20  o a..      #    
ecb0: 20 20 20 76 61 72 69 61 62 6c 65 20 66 69 72 73     variable firs
ecc0: 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  t...      #..   
ecd0: 20 20 20 73 65 74 20 61 64 64 20 52 65 66 65 72     set add Refer
ece0: 65 6e 63 65 64 41 73 73 65 6d 62 6c 69 65 73 2e  encedAssemblies.
ecf0: 41 64 64 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  Add....      #..
ed00: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 72        # NOTE: Cr
ed10: 65 61 74 65 20 74 68 65 20 62 61 73 65 20 63 6f  eate the base co
ed20: 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 75 61 74  mmand to evaluat
ed30: 65 20 61 6e 64 20 61 64 64 20 74 68 65 20 70 72  e and add the pr
ed40: 6f 70 65 72 74 79 20 73 65 74 74 69 6e 67 73 0d  operty settings.
ed50: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
ed60: 68 61 74 20 61 72 65 20 61 6c 6d 6f 73 74 20 61  hat are almost a
ed70: 6c 77 61 79 73 20 6e 65 65 64 65 64 20 62 79 20  lways needed by 
ed80: 6f 75 72 20 75 6e 69 74 20 74 65 73 74 73 20 28  our unit tests (
ed90: 69 2e 65 2e 20 74 68 65 20 53 79 73 74 65 6d 0d  i.e. the System.
eda0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
edb0: 6e 64 20 53 79 73 74 65 6d 2e 44 61 74 61 20 61  nd System.Data a
edc0: 73 73 65 6d 62 6c 79 20 72 65 66 65 72 65 6e 63  ssembly referenc
edd0: 65 73 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  es)...      #.. 
ede0: 20 20 20 20 20 73 65 74 20 63 6f 6d 6d 61 6e 64       set command
edf0: 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20   [list \..      
ee00: 20 20 20 20 63 6f 6d 70 69 6c 65 43 53 68 61 72      compileCShar
ee10: 70 20 24 74 65 78 74 20 24 6d 65 6d 6f 72 79 20  p $text $memory 
ee20: 24 73 79 6d 62 6f 6c 73 20 24 73 74 72 69 63 74  $symbols $strict
ee30: 20 72 65 73 75 6c 74 73 20 65 72 72 6f 72 73 20   results errors 
ee40: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 24 61 64  \..          $ad
ee50: 64 20 53 79 73 74 65 6d 2e 64 6c 6c 20 24 61 64  d System.dll $ad
ee60: 64 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 64 6c  d System.Data.dl
ee70: 6c 20 24 61 64 64 20 53 79 73 74 65 6d 2e 54 72  l $add System.Tr
ee80: 61 6e 73 61 63 74 69 6f 6e 73 2e 64 6c 6c 20 5c  ansactions.dll \
ee90: 0d 0a 20 20 20 20 20 20 20 20 20 20 24 61 64 64  ..          $add
eea0: 20 53 79 73 74 65 6d 2e 58 6d 6c 2e 64 6c 6c 5d   System.Xml.dll]
eeb0: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
eec0: 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 61     # NOTE: Add a
eed0: 6c 6c 20 74 68 65 20 70 72 6f 76 69 64 65 64 20  ll the provided 
eee0: 66 69 6c 65 20 6e 61 6d 65 73 20 61 73 20 61 73  file names as as
eef0: 73 65 6d 62 6c 79 20 72 65 66 65 72 65 6e 63 65  sembly reference
ef00: 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s...      #..   
ef10: 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
ef20: 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 73 20 7b  ame $fileNames {
ef30: 0d 0a 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e  ..        lappen
ef40: 64 20 63 6f 6d 6d 61 6e 64 20 24 61 64 64 20 5b  d command $add [
ef50: 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
ef60: 65 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20  e $fileName]..  
ef70: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
ef80: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
ef90: 41 64 64 20 74 68 65 20 65 78 74 72 61 20 61 72  Add the extra ar
efa0: 67 75 6d 65 6e 74 73 2c 20 69 66 20 61 6e 79 2c  guments, if any,
efb0: 20 74 6f 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20   to the command 
efc0: 74 6f 20 65 76 61 6c 75 61 74 65 2e 0d 0a 20 20  to evaluate...  
efd0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 65 76 61      #..      eva
efe0: 6c 20 6c 61 70 70 65 6e 64 20 63 6f 6d 6d 61 6e  l lappend comman
eff0: 64 20 24 61 72 67 73 0d 0a 0d 0a 20 20 20 20 20  d $args....     
f000: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
f010: 3a 20 41 6c 69 61 73 20 74 68 65 20 63 6f 6d 70  : Alias the comp
f020: 69 6c 65 72 20 6c 6f 63 61 6c 20 72 65 73 75 6c  iler local resul
f030: 74 73 20 61 6e 64 20 65 72 72 6f 72 73 20 76 61  ts and errors va
f040: 72 69 61 62 6c 65 73 20 74 6f 20 74 68 65 0d 0a  riables to the..
f050: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61        #       va
f060: 72 69 61 62 6c 65 20 6e 61 6d 65 73 20 70 72 6f  riable names pro
f070: 76 69 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c  vided by our cal
f080: 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ler...      #.. 
f090: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
f0a0: 20 6c 65 6e 67 74 68 20 24 72 65 73 75 6c 74 73   length $results
f0b0: 56 61 72 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68  VarName] > 0} th
f0c0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 70  en {..        up
f0d0: 76 61 72 20 31 20 24 72 65 73 75 6c 74 73 56 61  var 1 $resultsVa
f0e0: 72 4e 61 6d 65 20 72 65 73 75 6c 74 73 0d 0a 20  rName results.. 
f0f0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
f100: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
f110: 74 68 20 24 65 72 72 6f 72 73 56 61 72 4e 61 6d  th $errorsVarNam
f120: 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
f130: 20 20 20 20 20 20 20 20 75 70 76 61 72 20 31 20          upvar 1 
f140: 24 65 72 72 6f 72 73 56 61 72 4e 61 6d 65 20 65  $errorsVarName e
f150: 72 72 6f 72 73 0d 0a 20 20 20 20 20 20 7d 0d 0a  rrors..      }..
f160: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
f170: 20 23 20 4e 4f 54 45 3a 20 45 76 61 6c 75 61 74   # NOTE: Evaluat
f180: 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 65  e the constructe
f190: 64 20 5b 63 6f 6d 70 69 6c 65 43 53 68 61 72 70  d [compileCSharp
f1a0: 5d 20 63 6f 6d 6d 61 6e 64 20 61 6e 64 20 72 65  ] command and re
f1b0: 74 75 72 6e 20 74 68 65 0d 0a 20 20 20 20 20 20  turn the..      
f1c0: 23 20 20 20 20 20 20 20 72 65 73 75 6c 74 2e 0d  #       result..
f1d0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
f1e0: 65 76 61 6c 20 24 63 6f 6d 6d 61 6e 64 0d 0a 20  eval $command.. 
f1f0: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
f200: 63 20 69 73 4d 65 6d 6f 72 79 44 62 20 7b 20 66  c isMemoryDb { f
f210: 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20  ileName } {..   
f220: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
f230: 54 45 3a 20 49 73 20 74 68 65 20 73 70 65 63 69  TE: Is the speci
f240: 66 69 65 64 20 64 61 74 61 62 61 73 65 20 66 69  fied database fi
f250: 6c 65 20 6e 61 6d 65 20 72 65 61 6c 6c 79 20 61  le name really a
f260: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
f270: 62 61 73 65 3f 0d 0a 20 20 20 20 20 20 23 0d 0a  base?..      #..
f280: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78        return [ex
f290: 70 72 20 7b 24 66 69 6c 65 4e 61 6d 65 20 65 71  pr {$fileName eq
f2a0: 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 7c 7c 20 5c   ":memory:" || \
f2b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
f2c0: 69 6e 67 20 72 61 6e 67 65 20 24 66 69 6c 65 4e  ing range $fileN
f2d0: 61 6d 65 20 30 20 31 32 5d 20 65 71 20 22 66 69  ame 0 12] eq "fi
f2e0: 6c 65 3a 3a 6d 65 6d 6f 72 79 3a 22 7d 5d 0d 0a  le::memory:"}]..
f2f0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
f300: 6f 63 20 69 73 54 61 62 6c 65 49 6e 44 62 20 7b  oc isTableInDb {
f310: 20 6e 61 6d 65 20 7b 76 61 72 4e 61 6d 65 20 64   name {varName d
f320: 62 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  b} } {..      #.
f330: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
f340: 65 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63  efer to the spec
f350: 69 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28  ified variable (
f360: 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68  e.g. "db") in th
f370: 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72  e context of our
f380: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
f390: 63 61 6c 6c 65 72 2e 20 20 49 74 20 63 6f 6e 74  caller.  It cont
f3a0: 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  ains the databas
f3b0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e  e connection han
f3c0: 64 6c 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65  dle that will be
f3d0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
f3e0: 75 73 65 64 20 74 6f 20 65 78 65 63 75 74 65 20  used to execute 
f3f0: 74 68 65 20 71 75 65 72 79 20 75 73 65 64 20 74  the query used t
f400: 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  o determine if t
f410: 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69  he named table i
f420: 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
f430: 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 61 74   present in that
f440: 20 64 61 74 61 62 61 73 65 2e 0d 0a 20 20 20 20   database...    
f450: 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72    #..      upvar
f460: 20 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a   1 $varName db..
f470: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
f480: 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65   # NOTE: Use the
f490: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
f4a0: 61 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  able to determin
f4b0: 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74  e if the named t
f4c0: 61 62 6c 65 20 69 73 0d 0a 20 20 20 20 20 20 23  able is..      #
f4d0: 20 20 20 20 20 20 20 70 72 65 73 65 6e 74 20 69         present i
f4e0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0d  n the database..
f4f0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
f500: 73 65 74 20 73 71 6c 20 7b 0d 0a 20 20 20 20 20  set sql {..     
f510: 20 20 20 53 45 4c 45 43 54 20 43 4f 55 4e 54 28     SELECT COUNT(
f520: 2a 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  *) FROM sqlite_m
f530: 61 73 74 65 72 20 57 48 45 52 45 20 74 79 70 65  aster WHERE type
f540: 20 3d 20 27 74 61 62 6c 65 27 20 41 4e 44 20 6e   = 'table' AND n
f550: 61 6d 65 20 3d 20 3f 3b 0d 0a 20 20 20 20 20 20  ame = ?;..      
f560: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
f570: 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75      # NOTE: Retu
f580: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  rn non-zero if t
f590: 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69  he named table i
f5a0: 73 20 70 72 65 73 65 6e 74 2e 0d 0a 20 20 20 20  s present...    
f5b0: 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72    #..      retur
f5c0: 6e 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20 20  n [expr {..     
f5d0: 20 20 20 5b 73 71 6c 20 65 78 65 63 75 74 65 20     [sql execute 
f5e0: 2d 65 78 65 63 75 74 65 20 73 63 61 6c 61 72 20  -execute scalar 
f5f0: 24 64 62 20 24 73 71 6c 20 5b 6c 69 73 74 20 70  $db $sql [list p
f600: 61 72 61 6d 31 20 53 74 72 69 6e 67 20 24 6e 61  aram1 String $na
f610: 6d 65 5d 5d 20 3e 20 30 0d 0a 20 20 20 20 20 20  me]] > 0..      
f620: 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  }]..    }.....  
f630: 20 20 70 72 6f 63 20 74 72 69 6d 53 71 6c 20 7b    proc trimSql {
f640: 20 73 71 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20   sql } {..      
f650: 72 65 74 75 72 6e 20 5b 72 65 67 73 75 62 20 2d  return [regsub -
f660: 61 6c 6c 20 2d 2d 20 7b 5c 73 2b 7d 20 5b 73 74  all -- {\s+} [st
f670: 72 69 6e 67 20 74 72 69 6d 20 24 73 71 6c 5d 20  ring trim $sql] 
f680: 22 20 22 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  " "]..    }.....
f690: 20 20 20 20 70 72 6f 63 20 65 78 65 63 75 74 65      proc execute
f6a0: 53 71 6c 20 7b 20 73 71 6c 20 7b 65 78 65 63 75  Sql { sql {execu
f6b0: 74 65 20 6e 6f 6e 65 7d 20 7b 66 6f 72 6d 61 74  te none} {format
f6c0: 20 6e 6f 6e 65 7d 20 7b 66 69 6c 65 4e 61 6d 65   none} {fileName
f6d0: 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20   ""} } {..      
f6e0: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
f6f0: 74 68 20 24 66 69 6c 65 4e 61 6d 65 5d 20 3d 3d  th $fileName] ==
f700: 20 30 7d 20 74 68 65 6e 20 7b 73 65 74 20 66 69   0} then {set fi
f710: 6c 65 4e 61 6d 65 20 3a 6d 65 6d 6f 72 79 3a 7d  leName :memory:}
f720: 0d 0a 20 20 20 20 20 20 73 65 74 75 70 44 62 20  ..      setupDb 
f730: 24 66 69 6c 65 4e 61 6d 65 20 22 22 20 22 22 20  $fileName "" "" 
f740: 22 22 20 22 22 20 22 22 20 66 61 6c 73 65 20 66  "" "" "" false f
f750: 61 6c 73 65 20 66 61 6c 73 65 20 66 61 6c 73 65  alse false false
f760: 20 64 62 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20   db true....    
f770: 20 20 74 72 79 20 7b 0d 0a 20 20 20 20 20 20 20    try {..       
f780: 20 72 65 74 75 72 6e 20 5b 75 70 6c 65 76 65 6c   return [uplevel
f790: 20 31 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20   1 [list \..    
f7a0: 20 20 20 20 20 20 20 20 73 71 6c 20 65 78 65 63          sql exec
f7b0: 75 74 65 20 2d 65 78 65 63 75 74 65 20 24 65 78  ute -execute $ex
f7c0: 65 63 75 74 65 20 2d 66 6f 72 6d 61 74 20 24 66  ecute -format $f
f7d0: 6f 72 6d 61 74 20 24 64 62 20 24 73 71 6c 5d 5d  ormat $db $sql]]
f7e0: 0d 0a 20 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c  ..      } finall
f7f0: 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6c 65  y {..        cle
f800: 61 6e 75 70 44 62 20 24 66 69 6c 65 4e 61 6d 65  anupDb $fileName
f810: 20 64 62 20 66 61 6c 73 65 20 66 61 6c 73 65 20   db false false 
f820: 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a  false..      }..
f830: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
f840: 6f 63 20 68 61 73 4e 6f 46 6c 61 67 73 20 7b 20  oc hasNoFlags { 
f850: 76 61 72 4e 61 6d 65 20 6e 6f 6e 65 20 7d 20 7b  varName none } {
f860: 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20  ..      upvar 1 
f870: 24 76 61 72 4e 61 6d 65 20 66 6c 61 67 73 0d 0a  $varName flags..
f880: 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e  ..      if {![in
f890: 66 6f 20 65 78 69 73 74 73 20 66 6c 61 67 73 5d  fo exists flags]
f8a0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
f8b0: 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20    return true.. 
f8c0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
f8d0: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
f8e0: 74 68 20 24 66 6c 61 67 73 5d 20 3d 3d 20 30 7d  th $flags] == 0}
f8f0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
f900: 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20   return true..  
f910: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69      }....      i
f920: 66 20 7b 24 6e 6f 6e 65 20 26 26 20 24 66 6c 61  f {$none && $fla
f930: 67 73 20 65 71 20 22 4e 6f 6e 65 22 7d 20 74 68  gs eq "None"} th
f940: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
f950: 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20  turn true..     
f960: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
f970: 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d  rn false..    }.
f980: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
f990: 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 20  ConnectionFlags 
f9a0: 7b 20 66 69 6c 65 4e 61 6d 65 20 66 6c 61 67 73  { fileName flags
f9b0: 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d   {quiet false} }
f9c0: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
f9d0: 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72     # NOTE: Figur
f9e0: 65 20 6f 75 74 20 77 68 69 63 68 20 64 61 74 61  e out which data
f9f0: 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 6f  base file name o
fa00: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72  r connection str
fa10: 69 6e 67 20 74 68 65 73 65 0d 0a 20 20 20 20 20  ing these..     
fa20: 20 23 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74   #       connect
fa30: 69 6f 6e 20 66 6c 61 67 73 20 77 69 6c 6c 20 61  ion flags will a
fa40: 63 74 75 61 6c 6c 79 20 61 70 70 6c 79 20 74 6f  ctually apply to
fa50: 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 74 20 6e  .  This is not n
fa60: 65 63 65 73 73 61 72 79 0d 0a 20 20 20 20 20 20  ecessary..      
fa70: 23 20 20 20 20 20 20 20 69 6e 20 71 75 69 65 74  #       in quiet
fa80: 20 6d 6f 64 65 20 62 65 63 61 75 73 65 20 74 68   mode because th
fa90: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
faa0: 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20  s only used for 
fab0: 6c 6f 67 67 69 6e 67 0d 0a 20 20 20 20 20 20 23  logging..      #
fac0: 20 20 20 20 20 20 20 61 6e 64 20 72 65 70 6f 72         and repor
fad0: 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 0d 0a  ting purposes...
fae0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
faf0: 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
fb00: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
fb10: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
fb20: 66 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74  fileName] > 0} t
fb30: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
fb40: 20 73 65 74 20 64 61 74 61 62 61 73 65 20 5b 61   set database [a
fb50: 70 70 65 6e 64 41 72 67 73 20 22 66 69 6c 65 20  ppendArgs "file 
fb60: 6e 61 6d 65 20 5c 22 22 20 24 66 69 6c 65 4e 61  name \"" $fileNa
fb70: 6d 65 20 5c 22 5d 0d 0a 20 20 20 20 20 20 20 20  me \"]..        
fb80: 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20  } elseif {[info 
fb90: 65 78 69 73 74 73 20 3a 3a 64 61 74 61 53 6f 75  exists ::dataSou
fba0: 72 63 65 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  rce] && \..     
fbb0: 20 20 20 20 20 20 20 21 5b 61 72 72 61 79 20 65         ![array e
fbc0: 78 69 73 74 73 20 3a 3a 64 61 74 61 53 6f 75 72  xists ::dataSour
fbd0: 63 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ce]} then {..   
fbe0: 20 20 20 20 20 20 20 73 65 74 20 64 61 74 61 62         set datab
fbf0: 61 73 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20  ase [appendArgs 
fc00: 22 64 61 74 61 20 73 6f 75 72 63 65 20 5c 22 22  "data source \""
fc10: 20 24 3a 3a 64 61 74 61 53 6f 75 72 63 65 20 5c   $::dataSource \
fc20: 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  "]..        } el
fc30: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
fc40: 73 65 74 20 64 61 74 61 62 61 73 65 20 3c 75 6e  set database <un
fc50: 6b 6e 6f 77 6e 3e 0d 0a 20 20 20 20 20 20 20 20  known>..        
fc60: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
fc70: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
fc80: 4f 54 45 3a 20 53 68 6f 77 20 28 61 6e 64 20 6c  OTE: Show (and l
fc90: 6f 67 29 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f  og) the local co
fca0: 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 61  nnection flags a
fcb0: 6e 64 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  nd the associate
fcc0: 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
fcd0: 20 64 61 74 61 20 73 6f 75 72 63 65 20 6f 72 20   data source or 
fce0: 66 69 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20 20 20  file name...    
fcf0: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21    #..      if {!
fd00: 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
fd10: 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
fd20: 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65  fo exists ::no(e
fd30: 6d 69 74 4c 6f 63 61 6c 46 6c 61 67 73 29 5d 20  mitLocalFlags)] 
fd40: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
fd50: 20 20 28 21 5b 69 6e 66 6f 20 65 78 69 73 74 73    (![info exists
fd60: 20 3a 3a 6e 6f 28 65 6d 69 74 4c 6f 63 61 6c 46   ::no(emitLocalF
fd70: 6c 61 67 73 49 66 4e 6f 6e 65 29 5d 20 7c 7c 20  lagsIfNone)] || 
fd80: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
fd90: 21 5b 68 61 73 4e 6f 46 6c 61 67 73 20 66 6c 61  ![hasNoFlags fla
fda0: 67 73 20 66 61 6c 73 65 5d 29 7d 20 74 68 65 6e  gs false])} then
fdb0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
fdc0: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
fdd0: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
fde0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
fdf0: 20 22 2d 2d 2d 2d 20 6c 6f 63 61 6c 20 63 6f 6e   "---- local con
fe00: 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 66 6f  nection flags fo
fe10: 72 20 22 20 24 64 61 74 61 62 61 73 65 20 5c 0d  r " $database \.
fe20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
fe30: 20 61 72 65 3a 20 22 20 5b 65 78 70 72 20 7b 21   are: " [expr {!
fe40: 5b 68 61 73 4e 6f 46 6c 61 67 73 20 66 6c 61 67  [hasNoFlags flag
fe50: 73 20 66 61 6c 73 65 5d 20 3f 20 5c 0d 0a 20 20  s false] ? \..  
fe60: 20 20 20 20 20 20 20 20 20 20 20 20 5b 61 70 70              [app
fe70: 65 6e 64 41 72 67 73 20 5c 22 20 24 66 6c 61 67  endArgs \" $flag
fe80: 73 20 5c 22 5d 20 3a 20 22 3c 6e 6f 6e 65 3e 22  s \"] : "<none>"
fe90: 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  }] \n]..        
fea0: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
feb0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
fec0: 4f 54 45 3a 20 53 68 6f 77 20 28 61 6e 64 20 6c  OTE: Show (and l
fed0: 6f 67 29 20 74 68 65 20 73 68 61 72 65 64 20 63  og) the shared c
fee0: 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 2e  onnection flags.
fef0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
ff00: 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
ff10: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
ff20: 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
ff30: 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
ff40: 6f 6b 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  oke System.Data.
ff50: 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 43 6f 6e  SQLite.SQLiteCon
ff60: 6e 65 63 74 69 6f 6e 20 53 68 61 72 65 64 46 6c  nection SharedFl
ff70: 61 67 73 0d 0a 20 20 20 20 20 20 20 20 7d 20 73  ags..        } s
ff80: 68 61 72 65 64 46 6c 61 67 73 5d 20 3d 3d 20 30  haredFlags] == 0
ff90: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
ffa0: 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
ffb0: 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 53  xists ::no(emitS
ffc0: 68 61 72 65 64 46 6c 61 67 73 29 5d 20 26 26 20  haredFlags)] && 
ffd0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
ffe0: 20 28 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   (![info exists 
fff0: 3a 3a 6e 6f 28 65 6d 69 74 53 68 61 72 65 64 46  ::no(emitSharedF
10000 6c 61 67 73 49 66 4e 6f 6e 65 29 5d 20 7c 7c 20  lagsIfNone)] || 
10010 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
10020 20 20 21 5b 68 61 73 4e 6f 46 6c 61 67 73 20 73    ![hasNoFlags s
10030 68 61 72 65 64 46 6c 61 67 73 20 74 72 75 65 5d  haredFlags true]
10040 29 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  )} then {..     
10050 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
10060 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
10070 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
10080 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
10090 2d 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63 74  - shared connect
100a0 69 6f 6e 20 66 6c 61 67 73 20 66 6f 72 20 22 20  ion flags for " 
100b0 24 64 61 74 61 62 61 73 65 20 5c 0d 0a 20 20 20  $database \..   
100c0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 61               " a
100d0 72 65 3a 20 22 20 5b 65 78 70 72 20 7b 21 5b 68  re: " [expr {![h
100e0 61 73 4e 6f 46 6c 61 67 73 20 73 68 61 72 65 64  asNoFlags shared
100f0 46 6c 61 67 73 20 74 72 75 65 5d 20 3f 20 5c 0d  Flags true] ? \.
10100 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10110 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20   [appendArgs \" 
10120 24 73 68 61 72 65 64 46 6c 61 67 73 20 5c 22 5d  $sharedFlags \"]
10130 20 3a 20 22 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e   : "<none>"}] \n
10140 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
10150 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
10160 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
10170 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
10180 6e 6f 28 65 6d 69 74 53 68 61 72 65 64 46 6c 61  no(emitSharedFla
10190 67 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  gs)] && \..     
101a0 20 20 20 20 20 20 20 20 20 21 5b 69 6e 66 6f 20           ![info 
101b0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74  exists ::no(emit
101c0 53 68 61 72 65 64 46 6c 61 67 73 49 66 55 6e 61  SharedFlagsIfUna
101d0 76 61 69 6c 61 62 6c 65 29 5d 7d 20 74 68 65 6e  vailable)]} then
101e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
101f0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
10200 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
10210 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
10220 20 20 20 20 20 22 2d 2d 2d 2d 20 73 68 61 72 65       "---- share
10230 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61  d connection fla
10240 67 73 20 66 6f 72 20 22 20 24 64 61 74 61 62 61  gs for " $databa
10250 73 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  se \..          
10260 20 20 20 20 20 20 22 20 61 72 65 3a 20 3c 75 6e        " are: <un
10270 61 76 61 69 6c 61 62 6c 65 3e 5c 6e 22 5d 0d 0a  available>\n"]..
10280 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
10290 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
102a0 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
102b0 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 28    # NOTE: Show (
102c0 61 6e 64 20 6c 6f 67 29 20 74 68 65 20 64 65 74  and log) the det
102d0 65 63 74 65 64 20 67 6c 6f 62 61 6c 20 63 6f 6e  ected global con
102e0 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 2c 20 69  nection flags, i
102f0 66 20 61 6e 79 2e 0d 0a 20 20 20 20 20 20 23 0d  f any...      #.
10300 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69  .      if {!$qui
10310 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
10320 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
10330 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 47  xists ::no(emitG
10340 6c 6f 62 61 6c 46 6c 61 67 73 29 5d 20 26 26 20  lobalFlags)] && 
10350 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  \..            (
10360 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
10370 6e 6f 28 65 6d 69 74 47 6c 6f 62 61 6c 46 6c 61  no(emitGlobalFla
10380 67 73 49 66 4e 6f 6e 65 29 5d 20 7c 7c 20 5c 0d  gsIfNone)] || \.
10390 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 21 5b  .             ![
103a0 68 61 73 4e 6f 46 6c 61 67 73 20 3a 3a 63 6f 6e  hasNoFlags ::con
103b0 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73 20 66 61  nection_flags fa
103c0 6c 73 65 5d 29 7d 20 74 68 65 6e 20 7b 0d 0a 20  lse])} then {.. 
103d0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
103e0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
103f0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
10400 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
10410 2d 20 67 6c 6f 62 61 6c 20 63 6f 6e 6e 65 63 74  - global connect
10420 69 6f 6e 20 66 6c 61 67 73 20 61 72 65 3a 20 22  ion flags are: "
10430 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
10440 20 20 5b 65 78 70 72 20 7b 21 5b 68 61 73 4e 6f    [expr {![hasNo
10450 46 6c 61 67 73 20 3a 3a 63 6f 6e 6e 65 63 74 69  Flags ::connecti
10460 6f 6e 5f 66 6c 61 67 73 20 66 61 6c 73 65 5d 20  on_flags false] 
10470 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ? \..           
10480 20 20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c     [appendArgs \
10490 22 20 24 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f  " $::connection_
104a0 66 6c 61 67 73 20 5c 22 5d 20 3a 20 22 3c 6e 6f  flags \"] : "<no
104b0 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20  ne>"}] \n]..    
104c0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
104d0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
104e0 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 72   # NOTE: If ther
104f0 65 20 61 72 65 20 61 6e 79 20 67 6c 6f 62 61 6c  e are any global
10500 20 28 70 65 72 20 74 65 73 74 20 72 75 6e 29 20   (per test run) 
10510 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
10520 20 63 75 72 72 65 6e 74 6c 79 0d 0a 20 20 20 20   currently..    
10530 20 20 23 20 20 20 20 20 20 20 73 65 74 2c 20 75    #       set, u
10540 73 65 20 74 68 65 6d 20 6e 6f 77 20 28 69 2e 65  se them now (i.e
10550 2e 20 62 79 20 63 6f 6d 62 69 6e 69 6e 67 20 74  . by combining t
10560 68 65 6d 20 77 69 74 68 20 74 68 65 20 6f 6e 65  hem with the one
10570 73 20 66 6f 72 20 74 68 69 73 0d 0a 20 20 20 20  s for this..    
10580 20 20 23 20 20 20 20 20 20 20 63 6f 6e 6e 65 63    #       connec
10590 74 69 6f 6e 29 2e 0d 0a 20 20 20 20 20 20 23 0d  tion)...      #.
105a0 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
105b0 20 65 78 69 73 74 73 20 3a 3a 63 6f 6e 6e 65 63   exists ::connec
105c0 74 69 6f 6e 5f 66 6c 61 67 73 5d 7d 20 74 68 65  tion_flags]} the
105d0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
105e0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
105f0 43 6f 6d 62 69 6e 65 20 61 6e 64 2f 6f 72 20 72  Combine and/or r
10600 65 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 6e 65  eplace the conne
10610 63 74 69 6f 6e 20 66 6c 61 67 73 20 61 6e 64 20  ction flags and 
10620 74 68 65 6e 20 73 68 6f 77 20 74 68 65 0d 0a 20  then show the.. 
10630 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e         #       n
10640 65 77 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20  ew value...     
10650 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65     #..        se
10660 74 20 66 6c 61 67 73 20 5b 63 6f 6d 62 69 6e 65  t flags [combine
10670 46 6c 61 67 73 20 24 66 6c 61 67 73 20 24 3a 3a  Flags $flags $::
10680 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73  connection_flags
10690 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
106a0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
106b0 53 68 6f 77 20 28 61 6e 64 20 6c 6f 67 29 20 74  Show (and log) t
106c0 68 65 20 6e 65 77 20 65 66 66 65 63 74 69 76 65  he new effective
106d0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67   connection flag
106e0 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  s...        #.. 
106f0 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
10700 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
10710 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
10720 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69   exists ::no(emi
10730 74 43 6f 6d 62 69 6e 65 64 46 6c 61 67 73 29 5d  tCombinedFlags)]
10740 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
10750 20 20 20 20 20 28 21 5b 69 6e 66 6f 20 65 78 69       (![info exi
10760 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 43 6f 6d  sts ::no(emitCom
10770 62 69 6e 65 64 46 6c 61 67 73 49 66 4e 6f 6e 65  binedFlagsIfNone
10780 29 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20  )] || \..       
10790 20 20 20 20 20 20 20 20 21 5b 68 61 73 4e 6f 46          ![hasNoF
107a0 6c 61 67 73 20 66 6c 61 67 73 20 66 61 6c 73 65  lags flags false
107b0 5d 29 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ])} then {..    
107c0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
107d0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
107e0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
107f0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
10800 2d 2d 20 63 6f 6d 62 69 6e 65 64 20 63 6f 6e 6e  -- combined conn
10810 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 66 6f 72  ection flags for
10820 20 22 20 24 64 61 74 61 62 61 73 65 20 5c 0d 0a   " $database \..
10830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10840 22 20 61 72 65 3a 20 22 20 5b 65 78 70 72 20 7b  " are: " [expr {
10850 21 5b 68 61 73 4e 6f 46 6c 61 67 73 20 66 6c 61  ![hasNoFlags fla
10860 67 73 20 66 61 6c 73 65 5d 20 3f 20 5c 0d 0a 20  gs false] ? \.. 
10870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
10880 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24 66  appendArgs \" $f
10890 6c 61 67 73 20 5c 22 5d 20 3a 20 22 3c 6e 6f 6e  lags \"] : "<non
108a0 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20  e>"}] \n]..     
108b0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
108c0 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
108d0 20 20 20 20 72 65 74 75 72 6e 20 24 66 6c 61 67      return $flag
108e0 73 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  s..    }.....   
108f0 20 70 72 6f 63 20 67 65 74 46 6c 61 67 73 50 72   proc getFlagsPr
10900 6f 70 65 72 74 79 20 7b 20 7b 66 6c 61 67 73 20  operty { {flags 
10910 22 22 7d 20 7b 71 75 69 65 74 20 66 61 6c 73 65  ""} {quiet false
10920 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
10930 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 65        # NOTE: De
10940 74 65 72 6d 69 6e 65 20 77 68 61 74 20 74 68 65  termine what the
10950 20 63 6f 6d 62 69 6e 65 64 20 28 67 6c 6f 62 61   combined (globa
10960 6c 20 61 6e 64 20 6c 6f 63 61 6c 29 20 63 6f 6e  l and local) con
10970 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23  nection..      #
10980 20 20 20 20 20 20 20 66 6c 61 67 73 20 73 68 6f         flags sho
10990 75 6c 64 20 62 65 2c 20 70 6f 73 73 69 62 6c 79  uld be, possibly
109a0 20 71 75 69 65 74 6c 79 2e 0d 0a 20 20 20 20 20   quietly...     
109b0 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 66 6c   #..      set fl
109c0 61 67 73 20 5b 67 65 74 43 6f 6e 6e 65 63 74 69  ags [getConnecti
109d0 6f 6e 46 6c 61 67 73 20 22 22 20 24 66 6c 61 67  onFlags "" $flag
109e0 73 20 24 71 75 69 65 74 5d 0d 0a 0d 0a 20 20 20  s $quiet]....   
109f0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
10a00 54 45 3a 20 49 66 20 6e 6f 20 67 6c 6f 62 61 6c  TE: If no global
10a10 20 6f 72 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63   or local connec
10a20 74 69 6f 6e 20 66 6c 61 67 73 20 77 65 72 65 20  tion flags were 
10a30 73 70 65 63 69 66 69 65 64 2c 20 74 68 65 0d 0a  specified, the..
10a40 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 65        #       de
10a50 66 61 75 6c 74 20 63 6f 6e 6e 65 63 74 69 6f 6e  fault connection
10a60 20 66 6c 61 67 73 20 73 68 6f 75 6c 64 20 62 65   flags should be
10a70 20 75 73 65 64 3b 20 74 68 65 72 65 66 6f 72 65   used; therefore
10a80 2c 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20  , return..      
10a90 23 20 20 20 20 20 20 20 61 6e 20 65 6d 70 74 79  #       an empty
10aa0 20 73 74 72 69 6e 67 20 69 6e 20 74 68 61 74 20   string in that 
10ab0 63 61 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  case...      #..
10ac0 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
10ad0 67 20 6c 65 6e 67 74 68 20 24 66 6c 61 67 73 5d  g length $flags]
10ae0 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
10af0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22         return ""
10b00 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
10b10 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
10b20 54 45 3a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20  TE: In order to 
10b30 63 68 65 63 6b 20 69 66 20 74 68 65 20 64 65 66  check if the def
10b40 61 75 6c 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ault connection 
10b50 66 6c 61 67 73 20 61 72 65 20 62 65 69 6e 67 20  flags are being 
10b60 75 73 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20  used..      #   
10b70 20 20 20 20 69 74 20 69 73 20 6e 65 63 65 73 73      it is necess
10b80 61 72 79 20 74 6f 20 61 74 74 65 6d 70 74 20 61  ary to attempt a
10b90 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74 6f 20 74   conversion to t
10ba0 68 65 20 61 63 74 75 61 6c 20 65 6e 75 6d 65 72  he actual enumer
10bb0 61 74 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20  ated..      #   
10bc0 20 20 20 20 74 79 70 65 2e 20 20 46 61 69 6c 69      type.  Faili
10bd0 6e 67 20 74 68 61 74 2c 20 74 68 65 20 63 68 65  ng that, the che
10be0 63 6b 20 61 67 61 69 6e 73 74 20 74 68 65 20 64  ck against the d
10bf0 65 66 61 75 6c 74 20 76 61 6c 75 65 20 77 69 6c  efault value wil
10c00 6c 20 62 65 0d 0a 20 20 20 20 20 20 23 20 20 20  l be..      #   
10c10 20 20 20 20 73 6b 69 70 70 65 64 2e 0d 0a 20 20      skipped...  
10c20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
10c30 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
10c40 20 20 20 73 65 74 20 65 72 72 6f 72 20 6e 75 6c     set error nul
10c50 6c 3b 20 23 20 49 47 4e 4f 52 45 44 0d 0a 0d 0a  l; # IGNORED....
10c60 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
10c70 6e 76 6f 6b 65 20 55 74 69 6c 69 74 79 20 54 72  nvoke Utility Tr
10c80 79 50 61 72 73 65 46 6c 61 67 73 45 6e 75 6d 20  yParseFlagsEnum 
10c90 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
10ca0 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
10cb0 4c 69 74 65 2e 53 51 4c 69 74 65 43 6f 6e 6e 65  Lite.SQLiteConne
10cc0 63 74 69 6f 6e 46 6c 61 67 73 20 22 22 20 24 66  ctionFlags "" $f
10cd0 6c 61 67 73 20 6e 75 6c 6c 20 74 72 75 65 20 5c  lags null true \
10ce0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72  ..            tr
10cf0 75 65 20 65 72 72 6f 72 0d 0a 20 20 20 20 20 20  ue error..      
10d00 7d 20 76 61 6c 75 65 5d 7d 20 74 68 65 6e 20 7b  } value]} then {
10d10 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
10d20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74       # NOTE: Att
10d30 65 6d 70 74 69 6e 67 20 74 6f 20 70 61 72 73 65  empting to parse
10d40 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
10d50 66 6c 61 67 73 20 63 61 75 73 65 64 20 61 20 73  flags caused a s
10d60 63 72 69 70 74 0d 0a 20 20 20 20 20 20 20 20 23  cript..        #
10d70 20 20 20 20 20 20 20 65 72 72 6f 72 2e 20 20 45         error.  E
10d80 6d 69 74 20 61 20 77 61 72 6e 69 6e 67 20 74 6f  mit a warning to
10d90 20 74 68 65 20 74 65 73 74 20 6c 6f 67 20 66 69   the test log fi
10da0 6c 65 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65 0d  le and continue.
10db0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
10dc0 20 75 73 69 6e 67 20 61 6e 20 65 6d 74 70 79 20   using an emtpy 
10dd0 73 74 72 69 6e 67 20 69 6e 73 74 65 61 64 2e 0d  string instead..
10de0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
10df0 20 20 20 20 74 6c 6f 67 20 5b 61 70 70 65 6e 64      tlog [append
10e00 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
10e10 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
10e20 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 70 61 72  G: failed to par
10e30 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c  se connection fl
10e40 61 67 73 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d  ags, error: " \.
10e50 0a 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c  .            \n\
10e60 74 20 24 76 61 6c 75 65 20 5c 6e 5d 0d 0a 0d 0a  t $value \n]....
10e70 20 20 20 20 20 20 20 20 73 65 74 20 76 61 6c 75          set valu
10e80 65 20 22 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  e ""..      }...
10e90 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
10ea0 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 63  # NOTE: If the c
10eb0 6f 6d 62 69 6e 65 64 20 66 6c 61 67 73 20 73 74  ombined flags st
10ec0 72 69 6e 67 20 63 6f 75 6c 64 20 6e 6f 74 20 61  ring could not a
10ed0 63 74 75 61 6c 6c 79 20 62 65 20 63 6f 6e 76 65  ctually be conve
10ee0 72 74 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20  rted..      #   
10ef0 20 20 20 20 74 6f 20 74 68 65 20 65 6e 75 6d 65      to the enume
10f00 72 61 74 65 64 20 74 79 70 65 20 69 74 20 69 73  rated type it is
10f10 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   the default val
10f20 75 65 2c 20 74 68 65 6e 20 6a 75 73 74 20 75 73  ue, then just us
10f30 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
10f40 20 69 74 20 76 65 72 62 61 74 69 6d 3b 20 6f 74   it verbatim; ot
10f50 68 65 72 77 69 73 65 2c 20 6a 75 73 74 20 72 65  herwise, just re
10f60 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74  turn an empty st
10f70 72 69 6e 67 2e 20 20 49 6e 20 74 68 61 74 0d 0a  ring.  In that..
10f80 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61        #       ca
10f90 73 65 2c 20 74 68 65 20 64 65 66 61 75 6c 74 20  se, the default 
10fa0 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
10fb0 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2e 0d 0a   will be used...
10fc0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
10fd0 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
10fe0 68 20 24 76 61 6c 75 65 5d 20 3d 3d 20 30 20 7c  h $value] == 0 |
10ff0 7c 20 24 76 61 6c 75 65 20 6e 65 20 22 44 65 66  | $value ne "Def
11000 61 75 6c 74 22 7d 20 74 68 65 6e 20 7b 0d 0a 20  ault"} then {.. 
11010 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
11020 20 20 23 20 57 41 52 4e 49 4e 47 3a 20 54 68 69    # WARNING: Thi
11030 73 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 74  s returns the st
11040 72 69 6e 67 20 76 61 6c 75 65 20 6f 66 20 74 68  ring value of th
11050 65 20 63 6f 6d 62 69 6e 65 64 20 66 6c 61 67 73  e combined flags
11060 2c 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20 23  , not..        #
11070 20 20 20 20 20 20 20 20 20 20 74 68 65 20 65 6e            the en
11080 75 6d 65 72 61 74 65 64 20 76 61 6c 75 65 2e 20  umerated value. 
11090 20 54 68 69 73 20 69 73 20 62 79 20 64 65 73 69   This is by desi
110a0 67 6e 20 61 6e 64 20 73 68 6f 75 6c 64 20 6e 6f  gn and should no
110b0 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
110c0 20 20 20 20 20 20 62 65 20 63 68 61 6e 67 65 64        be changed
110d0 20 77 69 74 68 6f 75 74 20 63 61 72 65 66 75 6c   without careful
110e0 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20 28   consideration (
110f0 65 2e 67 2e 20 69 74 20 77 6f 75 6c 64 0d 0a 20  e.g. it would.. 
11100 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
11110 20 20 70 72 65 76 65 6e 74 20 74 68 65 20 53 51    prevent the SQ
11120 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 63  LiteConnection c
11130 6c 61 73 73 20 66 72 6f 6d 20 61 6c 6c 6f 77 69  lass from allowi
11140 6e 67 20 69 6e 76 61 6c 69 64 0d 0a 20 20 20 20  ng invalid..    
11150 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 5b      #          [
11160 22 6d 61 67 69 63 61 6c 22 5d 20 6d 65 74 61 2d  "magical"] meta-
11170 66 6c 61 67 73 29 2e 0d 0a 20 20 20 20 20 20 20  flags)...       
11180 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
11190 72 6e 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  rn [appendArgs "
111a0 46 6c 61 67 73 3d 22 20 24 66 6c 61 67 73 20 5c  Flags=" $flags \
111b0 3b 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ;]..      }.... 
111c0 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a       return ""..
111d0 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
111e0 6f 63 20 65 6e 61 62 6c 65 53 68 61 72 65 64 43  oc enableSharedC
111f0 61 63 68 65 20 7b 20 63 68 61 6e 6e 65 6c 20 65  ache { channel e
11200 6e 61 62 6c 65 20 7b 71 75 69 65 74 20 66 61 6c  nable {quiet fal
11210 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69  se} } {..      i
11220 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
11230 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
11240 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
11250 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
11260 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
11270 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74  SQLite.UnsafeNat
11280 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20  iveMethods \..  
11290 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
112a0 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f  3_enable_shared_
112b0 63 61 63 68 65 20 5b 65 78 70 72 20 69 6e 74 28  cache [expr int(
112c0 24 65 6e 61 62 6c 65 29 5d 0d 0a 20 20 20 20 20  $enable)]..     
112d0 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d   } result] == 0}
112e0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
112f0 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
11300 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
11310 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
11320 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
11330 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
11340 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 65  - call sqlite3_e
11350 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63  nable_shared_cac
11360 68 65 28 22 20 24 65 6e 61 62 6c 65 20 5c 0d 0a  he(" $enable \..
11370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 29                ")
11380 2e 2e 2e 20 6f 6b 3a 20 22 20 24 72 65 73 75 6c  ... ok: " $resul
11390 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d  t \n]..        }
113a0 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
113b0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24  ..        if {!$
113c0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
113d0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
113e0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
113f0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
11400 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20       "---- call 
11410 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73  sqlite3_enable_s
11420 68 61 72 65 64 5f 63 61 63 68 65 28 22 20 24 65  hared_cache(" $e
11430 6e 61 62 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20  nable \..       
11440 20 20 20 20 20 20 20 22 29 2e 2e 2e 20 65 72 72         ")... err
11450 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65 73 75  or: " \n\t $resu
11460 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  lt \n]..        
11470 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
11480 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73  }.....    proc s
11490 65 74 75 70 44 62 20 7b 0d 0a 20 20 20 20 20 20  etupDb {..      
114a0 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65 20 7b        fileName {
114b0 6d 6f 64 65 20 22 22 7d 20 7b 64 61 74 65 54 69  mode ""} {dateTi
114c0 6d 65 46 6f 72 6d 61 74 20 22 22 7d 20 7b 64 61  meFormat ""} {da
114d0 74 65 54 69 6d 65 4b 69 6e 64 20 22 22 7d 20 7b  teTimeKind ""} {
114e0 66 6c 61 67 73 20 22 22 7d 0d 0a 20 20 20 20 20  flags ""}..     
114f0 20 20 20 20 20 20 20 7b 65 78 74 72 61 20 22 22         {extra ""
11500 7d 20 7b 71 75 61 6c 69 66 79 20 74 72 75 65 7d  } {qualify true}
11510 20 7b 64 65 6c 65 74 65 20 74 72 75 65 7d 20 7b   {delete true} {
11520 75 72 69 20 66 61 6c 73 65 7d 0d 0a 20 20 20 20  uri false}..    
11530 20 20 20 20 20 20 20 20 7b 74 65 6d 70 6f 72 61          {tempora
11540 72 79 20 74 72 75 65 7d 20 7b 76 61 72 4e 61 6d  ry true} {varNam
11550 65 20 64 62 7d 20 7b 71 75 69 65 74 20 66 61 6c  e db} {quiet fal
11560 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  se} } {..      #
11570 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
11580 46 69 72 73 74 2c 20 73 65 65 20 69 66 20 6f 75  First, see if ou
11590 72 20 63 61 6c 6c 65 72 20 68 61 73 20 72 65 71  r caller has req
115a0 75 65 73 74 65 64 20 61 6e 20 69 6e 2d 6d 65 6d  uested an in-mem
115b0 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0d 0a 20  ory database... 
115c0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65       #..      se
115d0 74 20 69 73 4d 65 6d 6f 72 79 20 5b 69 73 4d 65  t isMemory [isMe
115e0 6d 6f 72 79 44 62 20 24 66 69 6c 65 4e 61 6d 65  moryDb $fileName
115f0 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ]....      #..  
11600 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20      # NOTE: For 
11610 6e 6f 77 2c 20 61 6c 6c 20 74 65 73 74 20 64 61  now, all test da
11620 74 61 62 61 73 65 73 20 75 73 65 64 20 62 79 20  tabases used by 
11630 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20 61  the test suite a
11640 72 65 20 70 6c 61 63 65 64 0d 0a 20 20 20 20 20  re placed..     
11650 20 23 20 20 20 20 20 20 20 69 6e 74 6f 20 74 68   #       into th
11660 65 20 64 61 74 61 62 61 73 65 20 64 69 72 65 63  e database direc
11670 74 6f 72 79 2e 20 20 45 61 63 68 20 64 61 74 61  tory.  Each data
11680 62 61 73 65 20 61 6e 64 20 72 65 6c 61 74 65 64  base and related
11690 20 66 69 6c 65 73 0d 0a 20 20 20 20 20 20 23 20   files..      # 
116a0 20 20 20 20 20 20 75 73 65 64 20 62 79 20 61 20        used by a 
116b0 74 65 73 74 20 73 68 6f 75 6c 64 20 62 65 20 63  test should be c
116c0 6c 65 61 6e 65 64 20 75 70 20 62 79 20 74 68 61  leaned up by tha
116d0 74 20 74 65 73 74 20 75 73 69 6e 67 20 74 68 65  t test using the
116e0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
116f0 22 63 6c 65 61 6e 75 70 44 62 22 20 70 72 6f 63  "cleanupDb" proc
11700 65 64 75 72 65 2c 20 62 65 6c 6f 77 2e 0d 0a 20  edure, below... 
11710 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
11720 20 7b 21 24 69 73 4d 65 6d 6f 72 79 20 26 26 20   {!$isMemory && 
11730 24 71 75 61 6c 69 66 79 7d 20 74 68 65 6e 20 7b  $qualify} then {
11740 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 69  ..        set fi
11750 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  leName [file joi
11760 6e 20 5b 67 65 74 44 61 74 61 62 61 73 65 44 69  n [getDatabaseDi
11770 72 65 63 74 6f 72 79 5d 20 5b 66 69 6c 65 20 74  rectory] [file t
11780 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d  ail $fileName]].
11790 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
117a0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
117b0 45 3a 20 42 79 20 64 65 66 61 75 6c 74 2c 20 64  E: By default, d
117c0 65 6c 65 74 65 20 61 6e 79 20 70 72 65 2d 65 78  elete any pre-ex
117d0 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20  isting database 
117e0 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 66 69  with the same fi
117f0 6c 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  le..      #     
11800 20 20 6e 61 6d 65 20 69 66 20 69 74 20 63 75 72    name if it cur
11810 72 65 6e 74 6c 79 20 65 78 69 73 74 73 2e 0d 0a  rently exists...
11820 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
11830 66 20 7b 21 24 69 73 4d 65 6d 6f 72 79 20 26 26  f {!$isMemory &&
11840 20 24 64 65 6c 65 74 65 20 26 26 20 5b 66 69 6c   $delete && [fil
11850 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61  e exists $fileNa
11860 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
11870 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
11880 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
11890 74 6f 20 64 65 6c 65 74 65 20 61 6e 79 20 70 72  to delete any pr
118a0 65 2d 65 78 69 73 74 69 6e 67 20 64 61 74 61 62  e-existing datab
118b0 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ase with the sam
118c0 65 20 66 69 6c 65 0d 0a 20 20 20 20 20 20 20 20  e file..        
118d0 23 20 20 20 20 20 20 20 6e 61 6d 65 2e 0d 0a 20  #       name... 
118e0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
118f0 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 66 69    if {[catch {fi
11900 6c 65 20 64 65 6c 65 74 65 20 24 66 69 6c 65 4e  le delete $fileN
11910 61 6d 65 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65  ame} error]} the
11920 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  n {..          #
11930 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
11940 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20 66  TE: We somehow f
11950 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20  ailed to delete 
11960 74 68 65 20 66 69 6c 65 2c 20 72 65 70 6f 72 74  the file, report
11970 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 20   why...         
11980 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   #..          if
11990 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
119a0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
119b0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
119c0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
119d0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
119e0 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
119f0 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c  G: failed to del
11a00 65 74 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ete database fil
11a10 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20  e \"" $fileName 
11a20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
11a30 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20 73 65     "\" during se
11a40 74 75 70 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e  tup, error: " \n
11a50 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20  \t $error \n].. 
11a60 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
11a70 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
11a80 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
11a90 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74   # NOTE: Refer t
11aa0 6f 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  o the specified 
11ab0 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22  variable (e.g. "
11ac0 64 62 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74  db") in the cont
11ad0 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20  ext of our..    
11ae0 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72    #       caller
11af0 2e 20 20 54 68 65 20 68 61 6e 64 6c 65 20 74 6f  .  The handle to
11b00 20 74 68 65 20 6f 70 65 6e 65 64 20 64 61 74 61   the opened data
11b10 62 61 73 65 20 77 69 6c 6c 20 62 65 20 73 74 6f  base will be sto
11b20 72 65 64 20 74 68 65 72 65 2e 0d 0a 20 20 20 20  red there...    
11b30 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72    #..      upvar
11b40 20 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a   1 $varName db..
11b50 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
11b60 20 23 20 4e 4f 54 45 3a 20 53 74 61 72 74 20 62   # NOTE: Start b
11b70 75 69 6c 64 69 6e 67 20 74 68 65 20 63 6f 6e 6e  uilding the conn
11b80 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 2e 20 20  ection string.  
11b90 54 68 65 20 6f 6e 6c 79 20 72 65 71 75 69 72 65  The only require
11ba0 64 20 70 6f 72 74 69 6f 6e 0d 0a 20 20 20 20 20  d portion..     
11bb0 20 23 20 20 20 20 20 20 20 6f 66 20 74 68 65 20   #       of the 
11bc0 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e  connection strin
11bd0 67 20 69 73 20 74 68 65 20 64 61 74 61 20 73 6f  g is the data so
11be0 75 72 63 65 2c 20 77 68 69 63 68 20 63 6f 6e 74  urce, which cont
11bf0 61 69 6e 73 20 74 68 65 0d 0a 20 20 20 20 20 20  ains the..      
11c00 23 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65  #       database
11c10 20 66 69 6c 65 20 6e 61 6d 65 20 69 74 73 65 6c   file name itsel
11c20 66 2e 20 20 49 66 20 6f 75 72 20 63 61 6c 6c 65  f.  If our calle
11c30 72 20 77 61 6e 74 73 20 74 6f 20 75 73 65 20 61  r wants to use a
11c40 20 55 52 49 20 61 73 0d 0a 20 20 20 20 20 20 23   URI as..      #
11c50 20 20 20 20 20 20 20 74 68 65 20 64 61 74 61 20         the data 
11c60 73 6f 75 72 63 65 2c 20 75 73 65 20 74 68 65 20  source, use the 
11c70 46 75 6c 6c 55 72 69 20 63 6f 6e 6e 65 63 74 69  FullUri connecti
11c80 6f 6e 20 73 74 72 69 6e 67 20 70 72 6f 70 65 72  on string proper
11c90 74 79 20 74 6f 0d 0a 20 20 20 20 20 20 23 20 20  ty to..      #  
11ca0 20 20 20 20 20 70 72 65 76 65 6e 74 20 74 68 65       prevent the
11cb0 20 64 61 74 61 20 73 6f 75 72 63 65 20 73 74 72   data source str
11cc0 69 6e 67 20 66 72 6f 6d 20 62 65 69 6e 67 20 6d  ing from being m
11cd0 61 6e 67 6c 65 64 2e 0d 0a 20 20 20 20 20 20 23  angled...      #
11ce0 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 75 72 69  ..      if {$uri
11cf0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
11d00 20 20 73 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e    set connection
11d10 20 7b 46 75 6c 6c 55 72 69 3d 24 7b 66 69 6c 65   {FullUri=${file
11d20 4e 61 6d 65 7d 7d 0d 0a 20 20 20 20 20 20 7d 20  Name}}..      } 
11d30 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
11d40 73 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b  set connection {
11d50 44 61 74 61 20 53 6f 75 72 63 65 3d 24 7b 66 69  Data Source=${fi
11d60 6c 65 4e 61 6d 65 7d 7d 0d 0a 20 20 20 20 20 20  leName}}..      
11d70 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
11d80 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 69 6e 63      # NOTE: Sinc
11d90 65 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  e this procedure
11da0 20 68 61 73 20 6e 6f 20 73 70 65 63 69 61 6c 20   has no special 
11db0 6b 6e 6f 77 6c 65 64 67 65 20 6f 66 20 77 68 61  knowledge of wha
11dc0 74 20 74 68 65 20 64 65 66 61 75 6c 74 0d 0a 20  t the default.. 
11dd0 20 20 20 20 20 23 20 20 20 20 20 20 20 73 65 74       #       set
11de0 74 69 6e 67 20 69 73 20 66 6f 72 20 74 68 65 20  ting is for the 
11df0 54 6f 46 75 6c 6c 50 61 74 68 20 63 6f 6e 6e 65  ToFullPath conne
11e00 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 70 72 6f  ction string pro
11e10 70 65 72 79 2c 20 61 6c 77 61 79 73 0d 0a 20 20  pery, always..  
11e20 20 20 20 20 23 20 20 20 20 20 20 20 61 64 64 20      #       add 
11e30 74 68 65 20 76 61 6c 75 65 20 77 65 20 6b 6e 6f  the value we kno
11e40 77 20 61 62 6f 75 74 20 74 6f 20 74 68 65 20 63  w about to the c
11e50 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67  onnection string
11e60 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
11e70 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74    append connect
11e80 69 6f 6e 20 7b 3b 54 6f 46 75 6c 6c 50 61 74 68  ion {;ToFullPath
11e90 3d 24 7b 71 75 61 6c 69 66 79 7d 7d 0d 0a 0d 0a  =${qualify}}....
11ea0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
11eb0 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20 63 61   NOTE: If our ca
11ec0 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64 20 61  ller specified a
11ed0 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 61   journal mode, a
11ee0 64 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  dd the necessary
11ef0 20 70 6f 72 74 69 6f 6e 0d 0a 20 20 20 20 20 20   portion..      
11f00 23 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63  #       of the c
11f10 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67  onnection string
11f20 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a   now...      #..
11f30 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
11f40 67 20 6c 65 6e 67 74 68 20 24 6d 6f 64 65 5d 20  g length $mode] 
11f50 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
11f60 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e       append conn
11f70 65 63 74 69 6f 6e 20 7b 3b 4a 6f 75 72 6e 61 6c  ection {;Journal
11f80 20 4d 6f 64 65 3d 24 7b 6d 6f 64 65 7d 7d 0d 0a   Mode=${mode}}..
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 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20  : If our caller 
11fc0 73 70 65 63 69 66 69 65 64 20 61 20 44 61 74 65  specified a Date
11fd0 54 69 6d 65 20 66 6f 72 6d 61 74 2c 20 61 64 64  Time format, add
11fe0 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 0d 0a   the necessary..
11ff0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 6f        #       po
12000 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6e  rtion of the con
12010 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e  nection string n
12020 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ow...      #..  
12030 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
12040 6c 65 6e 67 74 68 20 24 64 61 74 65 54 69 6d 65  length $dateTime
12050 46 6f 72 6d 61 74 5d 20 3e 20 30 7d 20 74 68 65  Format] > 0} the
12060 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70  n {..        app
12070 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b  end connection {
12080 3b 44 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 3d  ;DateTimeFormat=
12090 24 7b 64 61 74 65 54 69 6d 65 46 6f 72 6d 61 74  ${dateTimeFormat
120a0 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  }}..      }.... 
120b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
120c0 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20 63 61 6c  NOTE: If our cal
120d0 6c 65 72 20 73 70 65 63 69 66 69 65 64 20 61 20  ler specified a 
120e0 44 61 74 65 54 69 6d 65 4b 69 6e 64 2c 20 61 64  DateTimeKind, ad
120f0 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  d the necessary 
12100 70 6f 72 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23  portion..      #
12110 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f         of the co
12120 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20  nnection string 
12130 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  now...      #.. 
12140 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
12150 20 6c 65 6e 67 74 68 20 24 64 61 74 65 54 69 6d   length $dateTim
12160 65 4b 69 6e 64 5d 20 3e 20 30 7d 20 74 68 65 6e  eKind] > 0} then
12170 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65   {..        appe
12180 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b  nd connection {;
12190 44 61 74 65 54 69 6d 65 4b 69 6e 64 3d 24 7b 64  DateTimeKind=${d
121a0 61 74 65 54 69 6d 65 4b 69 6e 64 7d 7d 0d 0a 20  ateTimeKind}}.. 
121b0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
121c0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
121d0 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 61 74   Figure out what
121e0 20 74 68 65 20 66 69 6e 61 6c 20 66 6c 61 67 73   the final flags
121f0 20 66 6f 72 20 74 68 69 73 20 63 6f 6e 6e 65 63   for this connec
12200 74 69 6f 6e 20 6e 65 65 64 20 74 6f 20 62 65 2e  tion need to be.
12210 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
12220 20 73 65 74 20 66 6c 61 67 73 20 5b 67 65 74 43   set flags [getC
12230 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 20 24  onnectionFlags $
12240 66 69 6c 65 4e 61 6d 65 20 24 66 6c 61 67 73 20  fileName $flags 
12250 24 71 75 69 65 74 5d 0d 0a 0d 0a 20 20 20 20 20  $quiet]....     
12260 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
12270 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20  : If our caller 
12280 73 70 65 63 69 66 69 65 64 20 73 6f 6d 65 20 53  specified some S
12290 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 46  QLiteConnectionF
122a0 6c 61 67 73 2c 20 61 64 64 20 74 68 65 0d 0a 20  lags, add the.. 
122b0 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 65 63       #       nec
122c0 65 73 73 61 72 79 20 70 6f 72 74 69 6f 6e 20 6f  essary portion o
122d0 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
122e0 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20   string now...  
122f0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
12300 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
12310 24 66 6c 61 67 73 5d 20 3e 20 30 7d 20 74 68 65  $flags] > 0} the
12320 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70  n {..        app
12330 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b  end connection {
12340 3b 46 6c 61 67 73 3d 24 7b 66 6c 61 67 73 7d 7d  ;Flags=${flags}}
12350 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
12360 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
12370 54 45 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65  TE: If our calle
12380 72 20 73 70 65 63 69 66 69 65 64 20 61 6e 20 65  r specified an e
12390 78 74 72 61 20 70 61 79 6c 6f 61 64 20 74 6f 20  xtra payload to 
123a0 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a  the connection..
123b0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 74        #       st
123c0 72 69 6e 67 2c 20 61 70 70 65 6e 64 20 69 74 20  ring, append it 
123d0 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  now...      #.. 
123e0 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
123f0 20 6c 65 6e 67 74 68 20 24 65 78 74 72 61 5d 20   length $extra] 
12400 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
12410 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e       append conn
12420 65 63 74 69 6f 6e 20 5c 3b 20 24 65 78 74 72 61  ection \; $extra
12430 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
12440 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
12450 54 45 3a 20 4f 70 65 6e 20 74 68 65 20 64 61 74  TE: Open the dat
12460 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
12470 20 6e 6f 77 2c 20 70 6c 61 63 69 6e 67 20 74 68   now, placing th
12480 65 20 6f 70 61 71 75 65 20 68 61 6e 64 6c 65 20  e opaque handle 
12490 76 61 6c 75 65 0d 0a 20 20 20 20 20 20 23 20 20  value..      #  
124a0 20 20 20 20 20 69 6e 74 6f 20 74 68 65 20 76 61       into the va
124b0 72 69 61 62 6c 65 20 73 70 65 63 69 66 69 65 64  riable specified
124c0 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d   by our caller..
124d0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
124e0 73 65 74 20 64 62 20 5b 73 71 6c 20 6f 70 65 6e  set db [sql open
124f0 20 2d 74 79 70 65 20 53 51 4c 69 74 65 20 5b 73   -type SQLite [s
12500 75 62 73 74 20 24 63 6f 6e 6e 65 63 74 69 6f 6e  ubst $connection
12510 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ]]....      #.. 
12520 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 6e       # NOTE: Con
12530 66 69 67 75 72 65 20 74 68 65 20 74 65 6d 70 6f  figure the tempo
12540 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 66  rary directory f
12550 6f 72 20 74 68 65 20 6e 65 77 6c 79 20 6f 70 65  or the newly ope
12560 6e 65 64 20 64 61 74 61 62 61 73 65 0d 0a 20 20  ned database..  
12570 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 6e      #       conn
12580 65 63 74 69 6f 6e 20 6e 6f 77 20 75 6e 6c 65 73  ection now unles
12590 73 20 6f 75 72 20 63 61 6c 6c 65 72 20 66 6f 72  s our caller for
125a0 62 69 64 73 20 69 74 2e 0d 0a 20 20 20 20 20 20  bids it...      
125b0 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 74 65  #..      if {$te
125c0 6d 70 6f 72 61 72 79 20 26 26 20 21 5b 69 6e 66  mporary && ![inf
125d0 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 65  o exists ::no(se
125e0 74 54 65 6d 70 6f 72 61 72 79 44 69 72 65 63 74  tTemporaryDirect
125f0 6f 72 79 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ory)]} then {.. 
12600 20 20 20 20 20 20 20 73 71 6c 20 65 78 65 63 75         sql execu
12610 74 65 20 24 64 62 20 5b 61 70 70 65 6e 64 41 72  te $db [appendAr
12620 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
12630 20 20 22 50 52 41 47 4d 41 20 74 65 6d 70 5f 73    "PRAGMA temp_s
12640 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20 3d  tore_directory =
12650 20 5c 22 22 20 5b 67 65 74 54 65 6d 70 6f 72 61   \"" [getTempora
12660 72 79 44 69 72 65 63 74 6f 72 79 5d 20 5c 22 5c  ryDirectory] \"\
12670 3b 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ;]..      }.... 
12680 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
12690 4e 4f 54 45 3a 20 50 65 72 66 6f 72 6d 20 61 6e  NOTE: Perform an
126a0 79 20 65 78 74 72 61 20 70 65 72 2d 63 6f 6e 6e  y extra per-conn
126b0 65 63 74 69 6f 6e 20 73 65 74 75 70 20 66 6f 72  ection setup for
126c0 20 74 68 65 20 6e 65 77 6c 79 20 6f 70 65 6e 65   the newly opene
126d0 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
126e0 20 64 61 74 61 62 61 73 65 20 6e 6f 77 20 75 6e   database now un
126f0 6c 65 73 73 20 6f 75 72 20 63 61 6c 6c 65 72 20  less our caller 
12700 66 6f 72 62 69 64 73 20 69 74 2e 0d 0a 20 20 20  forbids it...   
12710 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
12720 65 78 65 63 75 74 65 4f 6e 53 65 74 75 70 20 5b  executeOnSetup [
12730 67 65 74 45 78 65 63 75 74 65 4f 6e 53 65 74 75  getExecuteOnSetu
12740 70 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  p]....      if {
12750 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
12760 65 78 65 63 75 74 65 4f 6e 53 65 74 75 70 5d 20  executeOnSetup] 
12770 3e 20 30 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  > 0 && \..      
12780 20 20 20 20 21 5b 69 6e 66 6f 20 65 78 69 73 74      ![info exist
12790 73 20 3a 3a 6e 6f 28 65 78 65 63 75 74 65 4f 6e  s ::no(executeOn
127a0 53 65 74 75 70 29 5d 7d 20 74 68 65 6e 20 7b 0d  Setup)]} then {.
127b0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
127c0 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73      # NOTE: This
127d0 20 63 6f 6d 6d 61 6e 64 20 6d 61 79 20 72 61 69   command may rai
127e0 73 65 20 61 6e 20 65 72 72 6f 72 3b 20 69 66 20  se an error; if 
127f0 73 6f 2c 20 74 68 61 74 20 69 73 20 66 69 6e 65  so, that is fine
12800 2c 20 61 73 0d 0a 20 20 20 20 20 20 20 20 23 20  , as..        # 
12810 20 20 20 20 20 20 74 68 65 20 65 6e 63 6c 6f 73        the enclos
12820 69 6e 67 20 74 65 73 74 20 77 69 6c 6c 20 74 68  ing test will th
12830 65 6e 20 66 61 69 6c 2e 20 20 54 68 65 20 5b 73  en fail.  The [s
12840 75 62 73 74 5d 20 63 6f 6d 6d 61 6e 64 20 69 73  ubst] command is
12850 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
12860 20 20 75 73 65 64 20 6f 6e 20 74 68 65 20 53 51    used on the SQ
12870 4c 20 69 6e 20 63 61 73 65 20 69 74 20 6e 65 65  L in case it nee
12880 64 73 20 74 6f 20 72 65 66 65 72 20 74 6f 20 73  ds to refer to s
12890 74 61 74 65 20 69 6e 20 6f 75 72 0d 0a 20 20 20  tate in our..   
128a0 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e       #       con
128b0 74 65 78 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  text...        #
128c0 0d 0a 20 20 20 20 20 20 20 20 73 71 6c 20 65 78  ..        sql ex
128d0 65 63 75 74 65 20 24 64 62 20 5b 73 75 62 73 74  ecute $db [subst
128e0 20 24 65 78 65 63 75 74 65 4f 6e 53 65 74 75 70   $executeOnSetup
128f0 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ]..      }....  
12900 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
12910 4f 54 45 3a 20 41 6c 77 61 79 73 20 72 65 74 75  OTE: Always retu
12920 72 6e 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  rn the connectio
12930 6e 20 68 61 6e 64 6c 65 20 75 70 6f 6e 20 73 75  n handle upon su
12940 63 63 65 73 73 2e 0d 0a 20 20 20 20 20 20 23 0d  ccess...      #.
12950 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 64  .      return $d
12960 62 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  b..    }.....   
12970 20 70 72 6f 63 20 67 65 74 44 62 43 6f 6e 6e 65   proc getDbConne
12980 63 74 69 6f 6e 20 7b 20 7b 76 61 72 4e 61 6d 65  ction { {varName
12990 20 64 62 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20   db} } {..      
129a0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
129b0 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 73 70   Refer to the sp
129c0 65 63 69 66 69 65 64 20 76 61 72 69 61 62 6c 65  ecified variable
129d0 20 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20   (e.g. "db") in 
129e0 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f  the context of o
129f0 75 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ur..      #     
12a00 20 20 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 68    caller.  The h
12a10 61 6e 64 6c 65 20 74 6f 20 74 68 65 20 64 61 74  andle to the dat
12a20 61 62 61 73 65 20 70 72 65 76 69 6f 75 73 6c 79  abase previously
12a30 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 65 0d   opened via the.
12a40 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 5b  .      #       [
12a50 73 65 74 75 70 44 62 5d 20 70 72 6f 63 65 64 75  setupDb] procedu
12a60 72 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f  re should be sto
12a70 72 65 64 20 74 68 65 72 65 2e 0d 0a 20 20 20 20  red there...    
12a80 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72    #..      upvar
12a90 20 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a   1 $varName db..
12aa0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
12ab0 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 72 65   # NOTE: This re
12ac0 74 75 72 6e 73 20 74 68 65 20 41 44 4f 2e 4e 45  turns the ADO.NE
12ad0 54 20 49 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20  T IDbConnection 
12ae0 6f 62 6a 65 63 74 20 69 6e 73 74 61 6e 63 65 20  object instance 
12af0 66 6f 72 20 74 68 65 0d 0a 20 20 20 20 20 20 23  for the..      #
12b00 20 20 20 20 20 20 20 73 70 65 63 69 66 69 65 64         specified
12b10 20 64 61 74 61 62 73 65 20 68 61 6e 64 6c 65 2e   databse handle.
12b20 20 20 53 69 6e 63 65 20 67 65 74 74 69 6e 67 20    Since getting 
12b30 74 68 69 73 20 6f 62 6a 65 63 74 20 72 65 6c 69  this object reli
12b40 65 73 20 75 70 6f 6e 0d 0a 20 20 20 20 20 20 23  es upon..      #
12b50 20 20 20 20 20 20 20 45 61 67 6c 65 20 69 6e 74         Eagle int
12b60 65 72 6e 61 6c 73 2c 20 67 72 65 61 74 20 63 61  ernals, great ca
12b70 72 65 20 73 68 6f 75 6c 64 20 62 65 20 74 61 6b  re should be tak
12b80 65 6e 20 74 6f 20 61 76 6f 69 64 20 64 69 73 70  en to avoid disp
12b90 6f 73 69 6e 67 20 6f 66 0d 0a 20 20 20 20 20 20  osing of..      
12ba0 23 20 20 20 20 20 20 20 74 68 69 73 20 6f 62 6a  #       this obj
12bb0 65 63 74 20 6f 72 20 6f 74 68 65 72 77 69 73 65  ect or otherwise
12bc0 20 70 75 74 74 69 6e 67 20 69 74 20 69 6e 74 6f   putting it into
12bd0 20 61 6e 20 69 6e 76 61 6c 69 64 20 73 74 61 74   an invalid stat
12be0 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
12bf0 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
12c00 73 74 73 20 64 62 5d 7d 20 74 68 65 6e 20 7b 0d  sts db]} then {.
12c10 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
12c20 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
12c30 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
12c40 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
12c50 20 2d 6f 62 6a 65 63 74 66 6c 61 67 73 20 2b 4e   -objectflags +N
12c60 6f 44 69 73 70 6f 73 65 20 2d 61 6c 69 61 73 20  oDispose -alias 
12c70 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
12c80 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74   Interpreter.Get
12c90 41 63 74 69 76 65 2e 63 6f 6e 6e 65 63 74 69 6f  Active.connectio
12ca0 6e 73 20 49 74 65 6d 20 24 64 62 0d 0a 20 20 20  ns Item $db..   
12cb0 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d       } result] =
12cc0 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
12cd0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
12ce0 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 75 63 63      # NOTE: Succ
12cf0 65 73 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20  ess, return the 
12d00 6f 70 61 71 75 65 20 6f 62 6a 65 63 74 20 68 61  opaque object ha
12d10 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20  ndle...         
12d20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65   #..          re
12d30 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20  turn $result..  
12d40 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
12d50 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
12d60 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46         # NOTE: F
12d70 61 69 6c 75 72 65 2c 20 72 65 70 6f 72 74 20 77  ailure, report w
12d80 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  hy...          #
12d90 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
12da0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
12db0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
12dc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
12dd0 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
12de0 69 6c 65 64 20 74 6f 20 67 65 74 20 63 6f 6e 6e  iled to get conn
12df0 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 66 6f  ection handle fo
12e00 72 20 64 61 74 61 62 61 73 65 20 5c 22 22 20 5c  r database \"" \
12e10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
12e20 24 64 62 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20  $db "\", error: 
12e30 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c  " \n\t $result \
12e40 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  n]..        }.. 
12e50 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
12e60 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
12e70 20 46 61 69 6c 75 72 65 2c 20 72 65 74 75 72 6e   Failure, return
12e80 20 61 6e 20 6f 62 76 69 6f 75 73 6c 79 20 69 6e   an obviously in
12e90 76 61 6c 69 64 20 6f 70 61 71 75 65 20 6f 62 6a  valid opaque obj
12ea0 65 63 74 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20  ect handle...   
12eb0 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
12ec0 72 6e 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  rn ""..    }....
12ed0 0a 20 20 20 20 70 72 6f 63 20 66 72 65 65 44 62  .    proc freeDb
12ee0 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20 7b 76 61  Connection { {va
12ef0 72 4e 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  rName connection
12f00 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
12f10 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
12f20 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63 69  fer to the speci
12f30 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28 65  fied variable (e
12f40 2e 67 2e 20 22 63 6f 6e 6e 65 63 74 69 6f 6e 22  .g. "connection"
12f50 29 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20  ) in the..      
12f60 23 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 20  #       context 
12f70 6f 66 20 6f 75 72 20 63 61 6c 6c 65 72 2e 20 20  of our caller.  
12f80 54 68 65 20 6f 70 61 71 75 65 20 6f 62 6a 65 63  The opaque objec
12f90 74 20 68 61 6e 64 6c 65 20 66 6f 72 20 61 6e 20  t handle for an 
12fa0 41 44 4f 2e 4e 45 54 0d 0a 20 20 20 20 20 20 23  ADO.NET..      #
12fb0 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f         connectio
12fc0 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 74  n previously ret
12fd0 75 72 6e 65 64 20 62 79 20 5b 67 65 74 44 62 43  urned by [getDbC
12fe0 6f 6e 6e 65 63 74 69 6f 6e 5d 20 73 68 6f 75 6c  onnection] shoul
12ff0 64 20 62 65 0d 0a 20 20 20 20 20 20 23 20 20 20  d be..      #   
13000 20 20 20 20 73 74 6f 72 65 64 20 74 68 65 72 65      stored there
13010 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
13020 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
13030 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 0d  me connection...
13040 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
13050 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
13060 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 6f 70  to remove the op
13070 61 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64  aque object hand
13080 6c 65 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65  le from the inte
13090 72 70 72 65 74 65 72 0d 0a 20 20 20 20 20 20 23  rpreter..      #
130a0 20 20 20 20 20 20 20 6e 6f 77 2e 20 20 54 68 69         now.  Thi
130b0 73 20 5b 6f 62 6a 65 63 74 20 64 69 73 70 6f 73  s [object dispos
130c0 65 5d 20 63 61 6c 6c 20 77 69 6c 6c 20 6e 6f 74  e] call will not
130d0 20 61 63 74 75 61 6c 6c 79 20 64 69 73 70 6f 73   actually dispos
130e0 65 20 6f 66 20 74 68 65 0d 0a 20 20 20 20 20 20  e of the..      
130f0 23 20 20 20 20 20 20 20 75 6e 64 65 72 6c 79 69  #       underlyi
13100 6e 67 20 6f 62 6a 65 63 74 20 62 65 63 61 75 73  ng object becaus
13110 65 20 74 68 65 20 2b 4e 6f 44 69 73 70 6f 73 65  e the +NoDispose
13120 20 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e   flag was set on
13130 20 69 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20   it..      #    
13140 20 20 20 64 75 72 69 6e 67 20 63 72 65 61 74 69     during creati
13150 6f 6e 20 6f 66 20 74 68 65 20 6f 70 61 71 75 65  on of the opaque
13160 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 2e 0d   object handle..
13170 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
13180 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
13190 20 63 6f 6e 6e 65 63 74 69 6f 6e 5d 20 26 26 20   connection] && 
131a0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 63 61  \..          [ca
131b0 74 63 68 20 7b 6f 62 6a 65 63 74 20 64 69 73 70  tch {object disp
131c0 6f 73 65 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 7d  ose $connection}
131d0 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d   error]} then {.
131e0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
131f0 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73      # NOTE: We s
13200 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f  omehow failed to
13210 20 72 65 6d 6f 76 65 20 74 68 65 20 68 61 6e 64   remove the hand
13220 6c 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d  le, report why..
13230 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
13240 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
13250 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
13260 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
13270 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
13280 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 72 65  NG: failed to re
13290 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  move connection 
132a0 68 61 6e 64 6c 65 20 5c 22 22 20 24 63 6f 6e 6e  handle \"" $conn
132b0 65 63 74 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20  ection \..      
132c0 20 20 20 20 20 20 22 5c 22 2c 20 65 72 72 6f 72        "\", error
132d0 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20  : " \n\t $error 
132e0 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  \n]..      }..  
132f0 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
13300 20 61 64 64 44 62 43 6f 6e 6e 65 63 74 69 6f 6e   addDbConnection
13310 20 7b 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 76   { connection {v
13320 61 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a  arName db} } {..
13330 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
13340 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20   NOTE: Refer to 
13350 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61  the specified va
13360 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62  riable (e.g. "db
13370 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78  ") in the contex
13380 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20  t of our..      
13390 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 0d  #       caller..
133a0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
133b0 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65  upvar 1 $varName
133c0 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a   db....      #..
133d0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 72        # NOTE: Cr
133e0 65 61 74 65 20 61 20 63 6f 72 72 65 63 74 6c 79  eate a correctly
133f0 20 66 6f 72 6d 61 74 74 65 64 20 6e 61 6d 65 20   formatted name 
13400 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
13410 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 0d 0a   connection to..
13420 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65        #       be
13430 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c 69   added to the li
13440 73 74 20 6d 61 6e 61 67 65 64 20 62 79 20 74 68  st managed by th
13450 65 20 45 61 67 6c 65 20 69 6e 74 65 72 70 72 65  e Eagle interpre
13460 74 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ter...      #.. 
13470 20 20 20 20 20 73 65 74 20 64 62 20 5b 6f 62 6a       set db [obj
13480 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
13490 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
134a0 20 20 20 20 20 20 20 20 20 20 45 61 67 6c 65 2e            Eagle.
134b0 5f 43 6f 6d 70 6f 6e 65 6e 74 73 2e 50 72 69 76  _Components.Priv
134c0 61 74 65 2e 46 6f 72 6d 61 74 4f 70 73 20 44 61  ate.FormatOps Da
134d0 74 61 62 61 73 65 4f 62 6a 65 63 74 4e 61 6d 65  tabaseObjectName
134e0 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 0d 0a   $connection \..
134f0 20 20 20 20 20 20 20 20 20 20 53 51 4c 69 74 65            SQLite
13500 43 6f 6e 6e 65 63 74 69 6f 6e 20 5b 6f 62 6a 65  Connection [obje
13510 63 74 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70  ct invoke Interp
13520 72 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 20  reter.GetActive 
13530 4e 65 78 74 49 64 5d 5d 0d 0a 0d 0a 20 20 20 20  NextId]]....    
13540 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
13550 45 3a 20 41 64 64 20 74 68 65 20 64 61 74 61 62  E: Add the datab
13560 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  ase connection p
13570 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20 63  rovided by our c
13580 61 6c 6c 65 72 20 74 6f 20 74 68 65 20 6c 69 73  aller to the lis
13590 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  t..      #      
135a0 20 6f 66 20 74 68 6f 73 65 20 6b 6e 6f 77 6e 20   of those known 
135b0 74 6f 20 74 68 65 20 45 61 67 6c 65 20 69 6e 74  to the Eagle int
135c0 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20  erpreter...     
135d0 20 23 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63 74   #..      object
135e0 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
135f0 4e 6f 6e 50 75 62 6c 69 63 20 49 6e 74 65 72 70  NonPublic Interp
13600 72 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 2e  reter.GetActive.
13610 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 41 64 64 20  connections Add 
13620 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 24 64 62  \..          $db
13630 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20   $connection..  
13640 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
13650 20 67 65 74 52 6f 77 73 46 72 6f 6d 44 61 74 61   getRowsFromData
13660 54 61 62 6c 65 20 7b 20 64 61 74 61 54 61 62 6c  Table { dataTabl
13670 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  e } {..      set
13680 20 72 6f 77 73 20 5b 6c 69 73 74 5d 0d 0a 20 20   rows [list]..  
13690 20 20 20 20 73 65 74 20 63 6f 75 6e 74 20 5b 24      set count [$
136a0 64 61 74 61 54 61 62 6c 65 20 43 6f 6c 75 6d 6e  dataTable Column
136b0 73 2e 43 6f 75 6e 74 5d 0d 0a 0d 0a 20 20 20 20  s.Count]....    
136c0 20 20 66 6f 72 20 7b 73 65 74 20 69 6e 64 65 78    for {set index
136d0 20 30 7d 20 7b 24 69 6e 64 65 78 20 3c 20 24 63   0} {$index < $c
136e0 6f 75 6e 74 7d 20 7b 69 6e 63 72 20 69 6e 64 65  ount} {incr inde
136f0 78 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  x} {..        se
13700 74 20 64 61 74 61 43 6f 6c 75 6d 6e 20 5b 24 64  t dataColumn [$d
13710 61 74 61 54 61 62 6c 65 20 2d 61 6c 69 61 73 20  ataTable -alias 
13720 43 6f 6c 75 6d 6e 73 2e 67 65 74 5f 49 74 65 6d  Columns.get_Item
13730 20 24 69 6e 64 65 78 5d 0d 0a 20 20 20 20 20 20   $index]..      
13740 20 20 73 65 74 20 6e 61 6d 65 73 28 24 69 6e 64    set names($ind
13750 65 78 29 20 5b 24 64 61 74 61 43 6f 6c 75 6d 6e  ex) [$dataColumn
13760 20 43 6f 6c 75 6d 6e 4e 61 6d 65 5d 0d 0a 20 20   ColumnName]..  
13770 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 6f      }....      o
13780 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20 2d 61  bject foreach -a
13790 6c 69 61 73 20 64 61 74 61 52 6f 77 20 5b 73 65  lias dataRow [se
137a0 74 20 64 61 74 61 52 6f 77 73 20 5b 24 64 61 74  t dataRows [$dat
137b0 61 54 61 62 6c 65 20 52 6f 77 73 5d 5d 20 7b 0d  aTable Rows]] {.
137c0 0a 20 20 20 20 20 20 20 20 73 65 74 20 72 6f 77  .        set row
137d0 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20   [list]....     
137e0 20 20 20 66 6f 72 20 7b 73 65 74 20 69 6e 64 65     for {set inde
137f0 78 20 30 7d 20 7b 24 69 6e 64 65 78 20 3c 20 24  x 0} {$index < $
13800 63 6f 75 6e 74 7d 20 7b 69 6e 63 72 20 69 6e 64  count} {incr ind
13810 65 78 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  ex} {..         
13820 20 73 65 74 20 76 61 6c 75 65 20 5b 24 64 61 74   set value [$dat
13830 61 52 6f 77 20 2d 63 72 65 61 74 65 20 2d 61 6c  aRow -create -al
13840 69 61 73 20 67 65 74 5f 49 74 65 6d 20 24 69 6e  ias get_Item $in
13850 64 65 78 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  dex]....        
13860 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
13870 6e 67 74 68 20 24 76 61 6c 75 65 5d 20 3e 20 30  ngth $value] > 0
13880 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
13890 20 20 20 20 20 21 5b 6f 62 6a 65 63 74 20 69 6e       ![object in
138a0 76 6f 6b 65 20 43 6f 6e 76 65 72 74 20 49 73 44  voke Convert IsD
138b0 42 4e 75 6c 6c 20 24 76 61 6c 75 65 5d 7d 20 74  BNull $value]} t
138c0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
138d0 20 20 20 6c 61 70 70 65 6e 64 20 72 6f 77 20 5b     lappend row [
138e0 6c 69 73 74 20 24 6e 61 6d 65 73 28 24 69 6e 64  list $names($ind
138f0 65 78 29 20 5b 24 76 61 6c 75 65 20 54 6f 53 74  ex) [$value ToSt
13900 72 69 6e 67 5d 5d 0d 0a 20 20 20 20 20 20 20 20  ring]]..        
13910 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
13920 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
13930 72 6f 77 20 5b 6c 69 73 74 20 24 6e 61 6d 65 73  row [list $names
13940 28 24 69 6e 64 65 78 29 5d 0d 0a 20 20 20 20 20  ($index)]..     
13950 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
13960 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 6c 61 70  }....        lap
13970 70 65 6e 64 20 72 6f 77 73 20 24 72 6f 77 0d 0a  pend rows $row..
13980 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
13990 20 72 65 74 75 72 6e 20 24 72 6f 77 73 0d 0a 20   return $rows.. 
139a0 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
139b0 63 20 64 75 6d 70 52 6f 77 73 46 72 6f 6d 44 61  c dumpRowsFromDa
139c0 74 61 54 61 62 6c 65 20 7b 20 63 68 61 6e 6e 65  taTable { channe
139d0 6c 20 72 6f 77 73 20 7d 20 7b 0d 0a 20 20 20 20  l rows } {..    
139e0 20 20 73 65 74 20 73 65 71 75 65 6e 63 65 20 31    set sequence 1
139f0 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63  ....      foreac
13a00 68 20 72 6f 77 20 24 72 6f 77 73 20 7b 0d 0a 20  h row $rows {.. 
13a10 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
13a20 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
13a30 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
13a40 20 5b 65 78 70 72 20 7b 24 73 65 71 75 65 6e 63   [expr {$sequenc
13a50 65 20 3e 20 31 20 3f 20 22 5c 6e 22 20 3a 20 22  e > 1 ? "\n" : "
13a60 22 7d 5d 20 22 2d 2d 2d 2d 20 52 4f 57 20 23 22  "}] "---- ROW #"
13a70 20 24 73 65 71 75 65 6e 63 65 20 3a 5c 6e 5d 0d   $sequence :\n].
13a80 0a 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61  ...        forea
13a90 63 68 20 70 61 69 72 20 24 72 6f 77 20 7b 0d 0a  ch pair $row {..
13aa0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c            if {[l
13ab0 6c 65 6e 67 74 68 20 24 70 61 69 72 5d 20 3e 3d  length $pair] >=
13ac0 20 32 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   2} then {..    
13ad0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
13ae0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
13af0 67 73 20 5c 74 20 5c 0d 0a 20 20 20 20 20 20 20  gs \t \..       
13b00 20 20 20 20 20 20 20 20 20 5b 6c 69 73 74 20 5b           [list [
13b10 6c 69 6e 64 65 78 20 24 70 61 69 72 20 30 5d 5d  lindex $pair 0]]
13b20 20 22 3a 20 22 20 5b 6c 69 73 74 20 5b 6c 69 6e   ": " [list [lin
13b30 64 65 78 20 24 70 61 69 72 20 31 5d 5d 20 5c 6e  dex $pair 1]] \n
13b40 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  ]..          } e
13b50 6c 73 65 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20  lseif {[llength 
13b60 24 70 61 69 72 5d 20 3d 3d 20 31 7d 20 74 68 65  $pair] == 1} the
13b70 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
13b80 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
13b90 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 74 20 5c  [appendArgs \t \
13ba0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
13bb0 20 20 5b 6c 69 73 74 20 5b 6c 69 6e 64 65 78 20    [list [lindex 
13bc0 24 70 61 69 72 20 30 5d 5d 20 22 3a 20 3c 6e 75  $pair 0]] ": <nu
13bd0 6c 6c 3e 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  ll>\n"]..       
13be0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
13bf0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
13c00 63 68 61 6e 6e 65 6c 20 5c 74 3c 65 6d 70 74 79  channel \t<empty
13c10 3e 5c 6e 3b 20 23 20 4e 4f 54 45 3a 20 4e 6f 20  >\n; # NOTE: No 
13c20 64 61 74 61 3f 0d 0a 20 20 20 20 20 20 20 20 20  data?..         
13c30 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
13c40 0a 20 20 20 20 20 20 20 20 69 6e 63 72 20 73 65  .        incr se
13c50 71 75 65 6e 63 65 0d 0a 20 20 20 20 20 20 7d 0d  quence..      }.
13c60 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
13c70 72 6f 63 20 63 6c 65 61 6e 75 70 44 62 20 7b 20  roc cleanupDb { 
13c80 66 69 6c 65 4e 61 6d 65 20 7b 76 61 72 4e 61 6d  fileName {varNam
13c90 65 20 64 62 7d 20 7b 63 6f 6c 6c 65 63 74 20 74  e db} {collect t
13ca0 72 75 65 7d 20 7b 71 75 61 6c 69 66 79 20 74 72  rue} {qualify tr
13cb0 75 65 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ue}..           
13cc0 20 20 20 20 20 20 20 20 20 20 7b 64 65 6c 65 74            {delet
13cd0 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20  e true} } {..   
13ce0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
13cf0 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 66  TE: Attempt to f
13d00 6f 72 63 65 20 61 6c 6c 20 70 65 6e 64 69 6e 67  orce all pending
13d10 20 22 67 61 72 62 61 67 65 22 20 6f 62 6a 65 63   "garbage" objec
13d20 74 73 20 74 6f 20 62 65 20 63 6f 6c 6c 65 63 74  ts to be collect
13d30 65 64 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ed,..      #    
13d40 20 20 20 69 6e 63 6c 75 64 69 6e 67 20 53 51 4c     including SQL
13d50 69 74 65 20 73 74 61 74 65 6d 65 6e 74 73 20 61  ite statements a
13d60 6e 64 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74  nd backup object
13d70 73 3b 20 74 68 69 73 20 73 68 6f 75 6c 64 20 61  s; this should a
13d80 6c 6c 6f 77 0d 0a 20 20 20 20 20 20 23 20 20 20  llow..      #   
13d90 20 20 20 20 74 68 65 20 75 6e 64 65 72 6c 79 69      the underlyi
13da0 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
13db0 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 0d   to be deleted..
13dc0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
13dd0 69 66 20 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68  if {$collect} th
13de0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f  en {..        co
13df0 6c 6c 65 63 74 47 61 72 62 61 67 65 20 24 3a 3a  llectGarbage $::
13e00 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20  test_channel..  
13e10 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
13e20 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
13e30 52 65 66 65 72 20 74 6f 20 74 68 65 20 73 70 65  Refer to the spe
13e40 63 69 66 69 65 64 20 76 61 72 69 61 62 6c 65 20  cified variable 
13e50 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74  (e.g. "db") in t
13e60 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75  he context of ou
13e70 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  r..      #      
13e80 20 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 68 61   caller.  The ha
13e90 6e 64 6c 65 20 74 6f 20 74 68 65 20 64 61 74 61  ndle to the data
13ea0 62 61 73 65 20 70 72 65 76 69 6f 75 73 6c 79 20  base previously 
13eb0 6f 70 65 6e 65 64 20 76 69 61 20 74 68 65 0d 0a  opened via the..
13ec0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 5b 73        #       [s
13ed0 65 74 75 70 44 62 5d 20 70 72 6f 63 65 64 75 72  etupDb] procedur
13ee0 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72  e should be stor
13ef0 65 64 20 74 68 65 72 65 2e 0d 0a 20 20 20 20 20  ed there...     
13f00 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20   #..      upvar 
13f10 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d  1 $varName db...
13f20 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
13f30 23 20 4e 4f 54 45 3a 20 43 6c 6f 73 65 20 74 68  # NOTE: Close th
13f40 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
13f50 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 6f 77  the database now
13f60 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 61  .  This should a
13f70 6c 6c 6f 77 20 75 73 0d 0a 20 20 20 20 20 20 23  llow us..      #
13f80 20 20 20 20 20 20 20 74 6f 20 64 65 6c 65 74 65         to delete
13f90 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
13fa0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0d 0a  database file...
13fb0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
13fc0 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
13fd0 64 62 5d 20 26 26 20 5b 63 61 74 63 68 20 7b 73  db] && [catch {s
13fe0 71 6c 20 63 6c 6f 73 65 20 24 64 62 7d 20 65 72  ql close $db} er
13ff0 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ror]} then {..  
14000 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
14010 20 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65   # NOTE: We some
14020 68 6f 77 20 66 61 69 6c 65 64 20 74 6f 20 63 6c  how failed to cl
14030 6f 73 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ose the database
14040 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20  , report why... 
14050 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
14060 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
14070 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
14080 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
14090 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
140a0 3a 20 66 61 69 6c 65 64 20 74 6f 20 63 6c 6f 73  : failed to clos
140b0 65 20 64 61 74 61 62 61 73 65 20 5c 22 22 20 24  e database \"" $
140c0 64 62 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22  db "\", error: "
140d0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
140e0 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
140f0 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
14100 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
14110 45 3a 20 46 69 72 73 74 2c 20 73 65 65 20 69 66  E: First, see if
14120 20 6f 75 72 20 63 61 6c 6c 65 72 20 68 61 73 20   our caller has 
14130 72 65 71 75 65 73 74 65 64 20 61 6e 20 69 6e 2d  requested an in-
14140 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
14150 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
14160 20 73 65 74 20 69 73 4d 65 6d 6f 72 79 20 5b 69   set isMemory [i
14170 73 4d 65 6d 6f 72 79 44 62 20 24 66 69 6c 65 4e  sMemoryDb $fileN
14180 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  ame]....      #.
14190 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42  .      # NOTE: B
141a0 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 20 70 61  uild the full pa
141b0 74 68 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  th to the databa
141c0 73 65 20 66 69 6c 65 20 6e 61 6d 65 2e 20 20 46  se file name.  F
141d0 6f 72 20 6e 6f 77 2c 20 61 6c 6c 20 74 65 73 74  or now, all test
141e0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
141f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 61  database files a
14200 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  re stored in the
14210 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63   temporary direc
14220 74 6f 72 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  tory...      #..
14230 20 20 20 20 20 20 69 66 20 7b 21 24 69 73 4d 65        if {!$isMe
14240 6d 6f 72 79 20 26 26 20 24 71 75 61 6c 69 66 79  mory && $qualify
14250 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
14260 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b    set fileName [
14270 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 44 61  file join [getDa
14280 74 61 62 61 73 65 44 69 72 65 63 74 6f 72 79 5d  tabaseDirectory]
14290 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c   [file tail $fil
142a0 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 20 20 7d  eName]]..      }
142b0 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
142c0 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
142d0 20 69 66 20 74 68 65 20 66 69 6c 65 20 73 74 69   if the file sti
142e0 6c 6c 20 65 78 69 73 74 73 2e 0d 0a 20 20 20 20  ll exists...    
142f0 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21    #..      if {!
14300 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24 64 65  $isMemory && $de
14310 6c 65 74 65 20 26 26 20 5b 66 69 6c 65 20 65 78  lete && [file ex
14320 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d  ists $fileName]}
14330 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
14340 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
14350 54 45 3a 20 53 6b 69 70 20 64 65 6c 65 74 69 6e  TE: Skip deletin
14360 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  g database files
14370 20 69 66 20 73 6f 6d 65 62 6f 64 79 20 73 65 74   if somebody set
14380 73 20 74 68 65 20 67 6c 6f 62 61 6c 0d 0a 20 20  s the global..  
14390 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61        #       va
143a0 72 69 61 62 6c 65 20 74 6f 20 70 72 65 76 65 6e  riable to preven
143b0 74 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  t it...        #
143c0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
143d0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
143e0 28 63 6c 65 61 6e 75 70 44 62 46 69 6c 65 29 5d  (cleanupDbFile)]
143f0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
14400 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
14410 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
14420 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 74   to delete the t
14430 65 73 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  est database fil
14440 65 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20  e now...        
14450 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69    #..          i
14460 66 20 7b 5b 73 65 74 20 63 6f 64 65 20 5b 63 61  f {[set code [ca
14470 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65  tch {file delete
14480 20 24 66 69 6c 65 4e 61 6d 65 7d 20 65 72 72 6f   $fileName} erro
14490 72 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  r]]} then {..   
144a0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
144b0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
144c0 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65  We somehow faile
144d0 64 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  d to delete the 
144e0 66 69 6c 65 2c 20 72 65 70 6f 72 74 20 77 68 79  file, report why
144f0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
14500 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
14510 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
14520 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
14530 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
14540 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
14550 3a 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65  : failed to dele
14560 74 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  te database file
14570 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c   \"" $fileName \
14580 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
14590 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c 65    "\" during cle
145a0 61 6e 75 70 2c 20 65 72 72 6f 72 3a 20 22 20 5c  anup, error: " \
145b0 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a  n\t $error \n]..
145c0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
145d0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
145e0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
145f0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68        # NOTE: Sh
14600 6f 77 20 74 68 61 74 20 77 65 20 73 6b 69 70 70  ow that we skipp
14610 65 64 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  ed deleting the 
14620 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20  file...         
14630 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   #..          se
14640 74 20 63 6f 64 65 20 30 0d 0a 0d 0a 20 20 20 20  t code 0....    
14650 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
14660 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
14670 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
14680 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
14690 41 52 4e 49 4e 47 3a 20 73 6b 69 70 70 65 64 20  ARNING: skipped 
146a0 64 65 6c 65 74 69 6e 67 20 64 61 74 61 62 61 73  deleting databas
146b0 65 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65  e file \"" $file
146c0 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  Name \..        
146d0 20 20 20 20 20 20 22 5c 22 20 64 75 72 69 6e 67        "\" during
146e0 20 63 6c 65 61 6e 75 70 5c 6e 22 5d 0d 0a 20 20   cleanup\n"]..  
146f0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
14700 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
14710 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
14720 54 45 3a 20 54 68 65 20 66 69 6c 65 20 64 6f 65  TE: The file doe
14730 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 73 75 63  s not exist, suc
14740 63 65 73 73 21 0d 0a 20 20 20 20 20 20 20 20 23  cess!..        #
14750 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f  ..        set co
14760 64 65 20 30 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  de 0..      }...
14770 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 63  .      return $c
14780 6f 64 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  ode..    }..... 
14790 20 20 20 70 72 6f 63 20 73 65 74 75 70 44 62 49     proc setupDbI
147a0 6e 74 65 72 72 75 70 74 43 61 6c 6c 62 61 63 6b  nterruptCallback
147b0 20 7b 20 63 68 61 6e 6e 65 6c 20 6c 6f 67 20 7d   { channel log }
147c0 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   {..      tputs 
147d0 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 73  $channel "---- s
147e0 65 74 74 69 6e 67 20 75 70 20 64 65 62 75 67 67  etting up debugg
147f0 65 72 20 69 6e 74 65 72 72 75 70 74 20 63 61 6c  er interrupt cal
14800 6c 62 61 63 6b 2e 2e 2e 20 22 0d 0a 0d 0a 20 20  lback... "....  
14810 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
14820 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a  ..        set ::
14830 65 6e 76 28 71 75 69 65 74 46 69 6e 64 49 6e 74  env(quietFindInt
14840 65 72 70 72 65 74 65 72 54 65 73 74 50 61 74 68  erpreterTestPath
14850 29 20 31 0d 0a 20 20 20 20 20 20 20 20 73 65 74  ) 1..        set
14860 20 3a 3a 65 6e 76 28 71 75 69 65 74 53 65 74 75   ::env(quietSetu
14870 70 49 6e 74 65 72 70 72 65 74 65 72 54 65 73 74  pInterpreterTest
14880 50 61 74 68 29 20 31 0d 0a 0d 0a 20 20 20 20 20  Path) 1....     
14890 20 20 20 74 72 79 20 7b 0d 0a 20 20 20 20 20 20     try {..      
148a0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
148b0 20 23 20 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75   # NOTE: Make su
148c0 72 65 20 74 68 65 20 73 63 72 69 70 74 20 64 65  re the script de
148d0 62 75 67 67 65 72 20 61 6e 64 20 74 68 65 20 69  bugger and the i
148e0 73 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72 65  solated interpre
148f0 74 65 72 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ter..          #
14900 20 20 20 20 20 20 20 61 72 65 20 73 65 74 75 70         are setup
14910 20 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20 75   and ready for u
14920 73 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  se...          #
14930 0d 0a 20 20 20 20 20 20 20 20 20 20 64 65 62 75  ..          debu
14940 67 20 73 65 74 75 70 20 74 72 75 65 20 74 72 75  g setup true tru
14950 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23  e....          #
14960 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
14970 54 45 3a 20 4c 6f 61 64 20 74 68 65 20 6e 65 63  TE: Load the nec
14980 65 73 73 61 72 79 20 70 61 63 6b 61 67 65 73 20  essary packages 
14990 69 6e 74 6f 20 74 68 65 20 69 73 6f 6c 61 74 65  into the isolate
149a0 64 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a  d interpreter...
149b0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
149c0 20 20 20 20 20 20 20 64 65 62 75 67 20 65 76 61         debug eva
149d0 6c 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l {..           
149e0 20 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65   package require
149f0 20 45 61 67 6c 65 0d 0a 20 20 20 20 20 20 20 20   Eagle..        
14a00 20 20 20 20 70 61 63 6b 61 67 65 20 72 65 71 75      package requ
14a10 69 72 65 20 45 61 67 6c 65 2e 4c 69 62 72 61 72  ire Eagle.Librar
14a20 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  y..            p
14a30 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 45  ackage require E
14a40 61 67 6c 65 2e 54 65 73 74 0d 0a 20 20 20 20 20  agle.Test..     
14a50 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
14a60 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
14a70 20 23 20 4e 4f 54 45 3a 20 43 6f 70 79 20 74 68   # NOTE: Copy th
14a80 65 20 6e 65 63 65 73 73 61 72 79 20 76 61 72 69  e necessary vari
14a90 61 62 6c 65 73 20 69 6e 74 6f 20 74 68 65 20 69  ables into the i
14aa0 73 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72 65  solated interpre
14ab0 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ter...          
14ac0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 64 65 62  #..          deb
14ad0 75 67 20 69 6e 76 6f 6b 65 20 30 20 73 65 74 20  ug invoke 0 set 
14ae0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24  ::test_channel $
14af0 63 68 61 6e 6e 65 6c 3b 20 23 20 4e 4f 54 45 3a  channel; # NOTE:
14b00 20 46 6f 72 20 5b 74 70 75 74 73 5d 2e 0d 0a 20   For [tputs]... 
14b10 20 20 20 20 20 20 20 20 20 64 65 62 75 67 20 69           debug i
14b20 6e 76 6f 6b 65 20 30 20 73 65 74 20 3a 3a 74 65  nvoke 0 set ::te
14b30 73 74 5f 6c 6f 67 20 24 6c 6f 67 3b 20 23 20 4e  st_log $log; # N
14b40 4f 54 45 3a 20 46 6f 72 20 5b 74 6c 6f 67 5d 2e  OTE: For [tlog].
14b50 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  ....          #.
14b60 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
14b70 45 3a 20 49 6e 73 74 61 6c 6c 20 74 68 65 20 63  E: Install the c
14b80 61 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 20 74  allback script t
14b90 6f 20 62 65 20 65 76 61 6c 75 61 74 65 64 20 69  o be evaluated i
14ba0 6e 20 74 68 65 20 69 73 6f 6c 61 74 65 64 0d 0a  n the isolated..
14bb0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
14bc0 20 20 69 6e 74 65 72 70 72 65 74 65 72 20 77 68    interpreter wh
14bd0 65 6e 20 74 68 69 73 20 69 6e 74 65 72 70 72 65  en this interpre
14be0 74 65 72 20 69 73 20 69 6e 74 65 72 72 75 70 74  ter is interrupt
14bf0 65 64 20 62 79 20 73 63 72 69 70 74 0d 0a 20 20  ed by script..  
14c00 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
14c10 63 61 6e 63 65 6c 6c 61 74 69 6f 6e 2c 20 65 74  cancellation, et
14c20 63 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  c...          #.
14c30 0a 20 20 20 20 20 20 20 20 20 20 64 65 62 75 67  .          debug
14c40 20 63 61 6c 6c 62 61 63 6b 20 61 70 70 6c 79 20   callback apply 
14c50 7b 7b 73 65 6e 64 65 72 20 65 7d 20 7b 0d 0a 20  {{sender e} {.. 
14c60 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
14c70 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
14c80 3a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20  : Check if this 
14c90 63 61 6c 6c 62 61 63 6b 20 69 73 20 6f 6e 65 20  callback is one 
14ca0 74 68 61 74 20 77 65 20 63 61 72 65 20 61 62 6f  that we care abo
14cb0 75 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ut...           
14cc0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
14cd0 69 66 20 7b 22 43 61 6e 63 65 6c 65 64 22 20 69  if {"Canceled" i
14ce0 6e 20 5b 73 70 6c 69 74 20 5b 24 65 20 49 6e 74  n [split [$e Int
14cf0 65 72 72 75 70 74 54 79 70 65 5d 20 22 2c 20 22  erruptType] ", "
14d00 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
14d10 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
14d20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
14d30 3a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  : Make sure the 
14d40 5b 6f 62 6a 65 63 74 5d 20 63 6f 6d 6d 61 6e 64  [object] command
14d50 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20   is available.  
14d60 53 69 6e 63 65 0d 0a 20 20 20 20 20 20 20 20 20  Since..         
14d70 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 69       #       thi
14d80 73 20 69 73 20 61 6e 20 69 73 6f 6c 61 74 65 64  s is an isolated
14d90 20 69 6e 74 65 72 70 72 65 74 65 72 2c 20 63 68   interpreter, ch
14da0 65 63 6b 20 66 6f 72 20 69 74 20 74 68 65 20 68  eck for it the h
14db0 61 72 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ard..           
14dc0 20 20 20 23 20 20 20 20 20 20 20 77 61 79 2e 0d     #       way..
14dd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
14de0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
14df0 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e  if {[llength [in
14e00 66 6f 20 63 6f 6d 6d 61 6e 64 73 20 6f 62 6a 65  fo commands obje
14e10 63 74 5d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ct]] > 0} then {
14e20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
14e30 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
14e40 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 74 65       # NOTE: Ite
14e50 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 6c 6c  rate through all
14e60 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
14e70 74 69 6f 6e 73 20 6b 6e 6f 77 6e 20 74 6f 20 74  tions known to t
14e80 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  he..            
14e90 20 20 20 20 23 20 20 20 20 20 20 20 70 61 72 65      #       pare
14ea0 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d  nt interpreter..
14eb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14ec0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
14ed0 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61      object forea
14ee0 63 68 20 2d 61 6c 69 61 73 20 70 61 69 72 20 5b  ch -alias pair [
14ef0 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
14f00 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
14f10 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
14f20 20 20 20 20 20 20 20 24 65 20 49 6e 74 65 72 70         $e Interp
14f30 72 65 74 65 72 2e 63 6f 6e 6e 65 63 74 69 6f 6e  reter.connection
14f40 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  s] {..          
14f50 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
14f60 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
14f70 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20  OTE: Attempt to 
14f80 63 61 6e 63 65 6c 20 61 6e 79 20 53 51 4c 20 71  cancel any SQL q
14f90 75 65 72 69 65 73 20 69 6e 20 70 72 6f 67 72 65  ueries in progre
14fa0 73 73 20 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20  ss on..         
14fb0 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
14fc0 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63   this database c
14fd0 6f 6e 6e 65 63 74 69 6f 6e 2e 0d 0a 20 20 20 20  onnection...    
14fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
14ff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15000 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 24     if {[catch {$
15010 70 61 69 72 20 56 61 6c 75 65 2e 43 61 6e 63 65  pair Value.Cance
15020 6c 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20  l} error]} then 
15030 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
15040 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
15050 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
15060 70 65 6e 64 41 72 67 73 20 5c 6e 20 5c 0d 0a 20  pendArgs \n \.. 
15070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15080 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
15090 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
150a0 63 61 6e 63 65 6c 20 71 75 65 72 79 20 66 6f 72  cancel query for
150b0 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
150c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63                "c
150d0 6f 6e 6e 65 63 74 69 6f 6e 20 5c 22 22 20 5b 24  onnection \"" [$
150e0 70 61 69 72 20 4b 65 79 5d 20 22 5c 22 2c 20 65  pair Key] "\", e
150f0 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 5c 0d 0a  rror: " \n\t \..
15100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15110 20 20 20 20 20 20 20 20 24 65 72 72 6f 72 20 5c          $error \
15120 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
15130 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
15140 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
15150 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
15160 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
15170 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
15180 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
15190 64 41 72 67 73 20 5c 6e 20 5c 0d 0a 20 20 20 20  dArgs \n \..    
151a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
151b0 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 63  "==== WARNING: c
151c0 61 6e 6e 6f 74 20 63 61 6e 63 65 6c 20 61 6e 79  annot cancel any
151d0 20 71 75 65 72 69 65 73 3a 20 22 20 5c 0d 0a 20   queries: " \.. 
151e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
151f0 20 20 20 22 74 68 65 20 5c 22 6f 62 6a 65 63 74     "the \"object
15200 5c 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 6e 6f  \" command is no
15210 74 20 61 76 61 69 6c 61 62 6c 65 5c 6e 22 5d 0d  t available\n"].
15220 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
15230 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
15240 0a 20 20 20 20 20 20 20 20 20 20 7d 7d 0d 0a 20  .          }}.. 
15250 20 20 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79         } finally
15260 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61   {..          ca
15270 74 63 68 20 7b 75 6e 73 65 74 20 3a 3a 65 6e 76  tch {unset ::env
15280 28 71 75 69 65 74 53 65 74 75 70 49 6e 74 65 72  (quietSetupInter
15290 70 72 65 74 65 72 54 65 73 74 50 61 74 68 29 7d  preterTestPath)}
152a0 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61 74 63  ..          catc
152b0 68 20 7b 75 6e 73 65 74 20 3a 3a 65 6e 76 28 71  h {unset ::env(q
152c0 75 69 65 74 46 69 6e 64 49 6e 74 65 72 70 72 65  uietFindInterpre
152d0 74 65 72 54 65 73 74 50 61 74 68 29 7d 0d 0a 20  terTestPath)}.. 
152e0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
152f0 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d 20 74  } error] == 0} t
15300 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61  hen {..        a
15310 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 69 6e 74  ddConstraint int
15320 65 72 72 75 70 74 43 61 6c 6c 62 61 63 6b 2e 73  erruptCallback.s
15330 71 6c 69 74 65 33 0d 0a 0d 0a 20 20 20 20 20 20  qlite3....      
15340 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
15350 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 7d 20   yes\n..      } 
15360 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
15370 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
15380 61 70 70 65 6e 64 41 72 67 73 20 22 6e 6f 2c 20  appendArgs "no, 
15390 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65  error: " \n\t $e
153a0 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  rror \n]..      
153b0 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
153c0 20 70 72 6f 63 20 63 6c 65 61 6e 75 70 46 69 6c   proc cleanupFil
153d0 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 63 6f  e { fileName {co
153e0 6c 6c 65 63 74 20 74 72 75 65 7d 20 7b 66 6f 72  llect true} {for
153f0 63 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  ce false} } {.. 
15400 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
15410 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
15420 20 66 6f 72 63 65 20 61 6c 6c 20 70 65 6e 64 69   force all pendi
15430 6e 67 20 22 67 61 72 62 61 67 65 22 20 6f 62 6a  ng "garbage" obj
15440 65 63 74 73 20 74 6f 20 62 65 20 63 6f 6c 6c 65  ects to be colle
15450 63 74 65 64 2c 0d 0a 20 20 20 20 20 20 23 20 20  cted,..      #  
15460 20 20 20 20 20 69 6e 63 6c 75 64 69 6e 67 20 53       including S
15470 51 4c 69 74 65 20 73 74 61 74 65 6d 65 6e 74 73  QLite statements
15480 20 61 6e 64 20 62 61 63 6b 75 70 20 6f 62 6a 65   and backup obje
15490 63 74 73 3b 20 74 68 69 73 20 73 68 6f 75 6c 64  cts; this should
154a0 20 61 6c 6c 6f 77 0d 0a 20 20 20 20 20 20 23 20   allow..      # 
154b0 20 20 20 20 20 20 74 68 65 20 75 6e 64 65 72 6c        the underl
154c0 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
154d0 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  le to be deleted
154e0 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
154f0 20 20 69 66 20 7b 24 63 6f 6c 6c 65 63 74 7d 20    if {$collect} 
15500 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
15510 63 6f 6c 6c 65 63 74 47 61 72 62 61 67 65 20 24  collectGarbage $
15520 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a  ::test_channel..
15530 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
15540 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
15550 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 66  : Check if the f
15560 69 6c 65 20 73 74 69 6c 6c 20 65 78 69 73 74 73  ile still exists
15570 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
15580 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73    if {[file exis
15590 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74  ts $fileName]} t
155a0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
155b0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
155c0 3a 20 53 6b 69 70 20 64 65 6c 65 74 69 6e 67 20  : Skip deleting 
155d0 74 65 73 74 20 66 69 6c 65 73 20 69 66 20 73 6f  test files if so
155e0 6d 65 62 6f 64 79 20 73 65 74 73 20 74 68 65 20  mebody sets the 
155f0 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 0d  global variable.
15600 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
15610 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74 2e 0d   to prevent it..
15620 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
15630 20 20 20 20 69 66 20 7b 24 66 6f 72 63 65 20 7c      if {$force |
15640 7c 20 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  | ![info exists 
15650 3a 3a 6e 6f 28 63 6c 65 61 6e 75 70 46 69 6c 65  ::no(cleanupFile
15660 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
15670 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
15680 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
15690 70 74 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  pt to delete the
156a0 20 74 65 73 74 20 66 69 6c 65 20 6e 6f 77 2e 0d   test file now..
156b0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
156c0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 65 74          if {[set
156d0 20 63 6f 64 65 20 5b 63 61 74 63 68 20 7b 66 69   code [catch {fi
156e0 6c 65 20 64 65 6c 65 74 65 20 24 66 69 6c 65 4e  le delete $fileN
156f0 61 6d 65 7d 20 65 72 72 6f 72 5d 5d 7d 20 74 68  ame} error]]} th
15700 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
15710 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
15720 20 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65   # NOTE: We some
15730 68 6f 77 20 66 61 69 6c 65 64 20 74 6f 20 64 65  how failed to de
15740 6c 65 74 65 20 74 68 65 20 66 69 6c 65 2c 20 72  lete the file, r
15750 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20  eport why...    
15760 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
15770 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
15780 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
15790 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
157a0 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
157b0 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
157c0 64 20 74 6f 20 64 65 6c 65 74 65 20 74 65 73 74  d to delete test
157d0 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e   file \"" $fileN
157e0 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
157f0 20 20 20 20 20 20 20 22 5c 22 20 64 75 72 69 6e         "\" durin
15800 67 20 63 6c 65 61 6e 75 70 2c 20 65 72 72 6f 72  g cleanup, error
15810 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20  : " \n\t $error 
15820 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
15830 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
15840 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
15850 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
15860 45 3a 20 53 68 6f 77 20 74 68 61 74 20 77 65 20  E: Show that we 
15870 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67  skipped deleting
15880 20 74 68 65 20 66 69 6c 65 2e 0d 0a 20 20 20 20   the file...    
15890 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
158a0 20 20 20 73 65 74 20 63 6f 64 65 20 30 0d 0a 0d     set code 0...
158b0 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
158c0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
158d0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
158e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
158f0 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 73 6b 69  === WARNING: ski
15900 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20 74 65  pped deleting te
15910 73 74 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c  st file \"" $fil
15920 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  eName \..       
15930 20 20 20 20 20 20 20 22 5c 22 20 64 75 72 69 6e         "\" durin
15940 67 20 63 6c 65 61 6e 75 70 5c 6e 22 5d 0d 0a 20  g cleanup\n"].. 
15950 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
15960 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
15970 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
15980 4f 54 45 3a 20 54 68 65 20 66 69 6c 65 20 64 6f  OTE: The file do
15990 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 73 75  es not exist, su
159a0 63 63 65 73 73 21 0d 0a 20 20 20 20 20 20 20 20  ccess!..        
159b0 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63  #..        set c
159c0 6f 64 65 20 30 0d 0a 20 20 20 20 20 20 7d 0d 0a  ode 0..      }..
159d0 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24  ..      return $
159e0 63 6f 64 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  code..    }.....
159f0 20 20 20 20 70 72 6f 63 20 63 6c 65 61 6e 75 70      proc cleanup
15a00 4d 65 6d 6f 72 79 20 7b 20 76 61 72 4e 61 6d 65  Memory { varName
15a10 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d   {quiet false} }
15a20 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68   {..      if {[h
15a30 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43  aveSQLiteObjectC
15a40 6f 6d 6d 61 6e 64 5d 20 26 26 20 5c 0d 0a 20 20  ommand] && \..  
15a50 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
15a60 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d 65 5d  length $varName]
15a70 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
15a80 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
15a90 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74   # NOTE: Refer t
15aa0 6f 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  o the specified 
15ab0 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22  variable (e.g. "
15ac0 63 6f 6e 6e 65 63 74 69 6f 6e 22 29 20 69 6e 20  connection") in 
15ad0 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  the..        #  
15ae0 20 20 20 20 20 63 6f 6e 74 65 78 74 20 6f 66 20       context of 
15af0 6f 75 72 20 63 61 6c 6c 65 72 2e 20 20 54 68 65  our caller.  The
15b00 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74 20 68   opaque object h
15b10 61 6e 64 6c 65 20 66 6f 72 20 61 6e 0d 0a 20 20  andle for an..  
15b20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 41 44        #       AD
15b30 4f 2e 4e 45 54 20 63 6f 6e 6e 65 63 74 69 6f 6e  O.NET connection
15b40 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 74 75   previously retu
15b50 72 6e 65 64 20 62 79 20 5b 67 65 74 44 62 43 6f  rned by [getDbCo
15b60 6e 6e 65 63 74 69 6f 6e 5d 0d 0a 20 20 20 20 20  nnection]..     
15b70 20 20 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c     #       shoul
15b80 64 20 62 65 20 73 74 6f 72 65 64 20 74 68 65 72  d be stored ther
15b90 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
15ba0 20 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24         upvar 1 $
15bb0 76 61 72 4e 61 6d 65 20 63 6f 6e 6e 65 63 74 69  varName connecti
15bc0 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66  on....        if
15bd0 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
15be0 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
15bf0 6f 6b 65 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 20  oke $connection 
15c00 52 65 6c 65 61 73 65 4d 65 6d 6f 72 79 0d 0a 20  ReleaseMemory.. 
15c10 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d         } result]
15c20 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
15c30 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
15c40 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
15c50 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
15c60 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
15c70 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
15c80 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
15c90 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
15ca0 74 6f 20 72 65 6c 65 61 73 65 20 64 61 74 61 62  to release datab
15cb0 61 73 65 20 6d 65 6d 6f 72 79 2c 20 65 72 72 6f  ase memory, erro
15cc0 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  r: " \..        
15cd0 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65          \n\t $re
15ce0 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  sult \n]..      
15cf0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
15d00 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
15d10 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20     if {[llength 
15d20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73 20 64  [info commands d
15d30 65 62 75 67 5d 5d 20 3e 20 30 7d 20 74 68 65 6e  ebug]] > 0} then
15d40 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
15d50 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
15d60 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c      uplevel 1 [l
15d70 69 73 74 20 64 65 62 75 67 20 70 75 72 67 65 5d  ist debug purge]
15d80 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65 73 75  ..        } resu
15d90 6c 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  lt]} then {..   
15da0 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
15db0 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
15dc0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
15dd0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
15de0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
15df0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
15e00 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
15e10 65 64 20 74 6f 20 70 75 72 67 65 20 63 61 6c 6c  ed to purge call
15e20 20 66 72 61 6d 65 2c 20 65 72 72 6f 72 3a 20 22   frame, error: "
15e30 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
15e40 20 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74      \n\t $result
15e50 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
15e60 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
15e70 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
15e80 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
15e90 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20  uplevel 1 [list 
15ea0 64 65 62 75 67 20 63 6c 65 61 6e 75 70 5d 0d 0a  debug cleanup]..
15eb0 20 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74          } result
15ec0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
15ed0 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
15ee0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
15ef0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
15f00 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
15f10 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
15f20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
15f30 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
15f40 20 74 6f 20 63 6c 65 61 6e 75 70 20 69 6e 74 65   to cleanup inte
15f50 72 70 72 65 74 65 72 2c 20 65 72 72 6f 72 3a 20  rpreter, error: 
15f60 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
15f70 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c       \n\t $resul
15f80 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  t \n]..         
15f90 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
15fa0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
15fb0 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
15fc0 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74   uplevel 1 [list
15fd0 20 64 65 62 75 67 20 63 6f 6c 6c 65 63 74 5d 0d   debug collect].
15fe0 0a 20 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c  .        } resul
15ff0 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  t]} then {..    
16000 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
16010 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
16020 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
16030 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
16040 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
16050 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
16060 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
16070 64 20 74 6f 20 63 6f 6c 6c 65 63 74 20 67 61 72  d to collect gar
16080 62 61 67 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c  bage, error: " \
16090 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
160a0 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c    \n\t $result \
160b0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
160c0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
160d0 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
160e0 20 20 20 70 72 6f 63 20 73 65 74 75 70 4d 65 6d     proc setupMem
160f0 6f 72 79 43 6f 75 6e 74 65 72 73 20 7b 20 76 61  oryCounters { va
16100 72 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20  rName } {..     
16110 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65   if {[haveSQLite
16120 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20  ObjectCommand]} 
16130 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
16140 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65  upvar 1 $varName
16150 20 63 6f 75 6e 74 65 72 0d 0a 0d 0a 20 20 20 20   counter....    
16160 20 20 20 20 73 65 74 20 63 6f 75 6e 74 65 72 28      set counter(
16170 31 29 20 5b 6f 62 6a 65 63 74 20 63 72 65 61 74  1) [object creat
16180 65 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20  e -alias \..    
16190 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
161a0 69 61 67 6e 6f 73 74 69 63 73 2e 50 65 72 66 6f  iagnostics.Perfo
161b0 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 20 50 72  rmanceCounter Pr
161c0 6f 63 65 73 73 20 5c 0d 0a 20 20 20 20 20 20 20  ocess \..       
161d0 20 20 20 20 20 22 57 6f 72 6b 69 6e 67 20 53 65       "Working Se
161e0 74 22 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d  t" [file rootnam
161f0 65 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 3a 3a  e [file tail $::
16200 62 69 6e 5f 66 69 6c 65 5d 5d 5d 0d 0a 0d 0a 20  bin_file]]].... 
16210 20 20 20 20 20 20 20 73 65 74 20 63 6f 75 6e 74         set count
16220 65 72 28 32 29 20 5b 6f 62 6a 65 63 74 20 63 72  er(2) [object cr
16230 65 61 74 65 20 2d 61 6c 69 61 73 20 5c 0d 0a 20  eate -alias \.. 
16240 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
16250 6d 2e 44 69 61 67 6e 6f 73 74 69 63 73 2e 50 65  m.Diagnostics.Pe
16260 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72  rformanceCounter
16270 20 50 72 6f 63 65 73 73 20 5c 0d 0a 20 20 20 20   Process \..    
16280 20 20 20 20 20 20 20 20 22 57 6f 72 6b 69 6e 67          "Working
16290 20 53 65 74 20 50 65 61 6b 22 20 5b 66 69 6c 65   Set Peak" [file
162a0 20 72 6f 6f 74 6e 61 6d 65 20 5b 66 69 6c 65 20   rootname [file 
162b0 74 61 69 6c 20 24 3a 3a 62 69 6e 5f 66 69 6c 65  tail $::bin_file
162c0 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73  ]]]....        s
162d0 65 74 20 63 6f 75 6e 74 65 72 28 33 29 20 5b 6f  et counter(3) [o
162e0 62 6a 65 63 74 20 63 72 65 61 74 65 20 2d 61 6c  bject create -al
162f0 69 61 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ias \..         
16300 20 20 20 53 79 73 74 65 6d 2e 44 69 61 67 6e 6f     System.Diagno
16310 73 74 69 63 73 2e 50 65 72 66 6f 72 6d 61 6e 63  stics.Performanc
16320 65 43 6f 75 6e 74 65 72 20 50 72 6f 63 65 73 73  eCounter Process
16330 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
16340 22 50 72 69 76 61 74 65 20 42 79 74 65 73 22 20  "Private Bytes" 
16350 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 5b  [file rootname [
16360 66 69 6c 65 20 74 61 69 6c 20 24 3a 3a 62 69 6e  file tail $::bin
16370 5f 66 69 6c 65 5d 5d 5d 0d 0a 20 20 20 20 20 20  _file]]]..      
16380 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
16390 6e 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  n ""..    }.....
163a0 20 20 20 20 70 72 6f 63 20 72 65 70 6f 72 74 4d      proc reportM
163b0 65 6d 6f 72 79 43 6f 75 6e 74 65 72 73 20 7b 20  emoryCounters { 
163c0 63 68 61 6e 6e 65 6c 20 76 61 72 4e 61 6d 65 20  channel varName 
163d0 70 72 65 66 69 78 20 7d 20 7b 0d 0a 20 20 20 20  prefix } {..    
163e0 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74    if {[haveSQLit
163f0 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d  eObjectCommand]}
16400 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
16410 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d   upvar 1 $varNam
16420 65 20 63 6f 75 6e 74 65 72 0d 0a 0d 0a 20 20 20  e counter....   
16430 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
16440 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
16450 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
16460 2d 2d 2d 2d 20 22 20 24 70 72 65 66 69 78 20 22  ---- " $prefix "
16470 20 63 6f 75 6e 74 65 72 20 5c 22 22 20 5c 0d 0a   counter \"" \..
16480 20 20 20 20 20 20 20 20 20 20 20 20 5b 6f 62 6a              [obj
16490 65 63 74 20 69 6e 76 6f 6b 65 20 24 63 6f 75 6e  ect invoke $coun
164a0 74 65 72 28 31 29 20 43 6f 75 6e 74 65 72 4e 61  ter(1) CounterNa
164b0 6d 65 5d 20 22 5c 22 20 76 61 6c 75 65 20 69 73  me] "\" value is
164c0 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
164d0 20 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65    [object invoke
164e0 20 24 63 6f 75 6e 74 65 72 28 31 29 20 52 61 77   $counter(1) Raw
164f0 56 61 6c 75 65 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20  Value] \n]....  
16500 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
16510 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
16520 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
16530 22 2d 2d 2d 2d 20 22 20 24 70 72 65 66 69 78 20  "---- " $prefix 
16540 22 20 63 6f 75 6e 74 65 72 20 5c 22 22 20 5c 0d  " counter \"" \.
16550 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 6f 62  .            [ob
16560 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24 63 6f 75  ject invoke $cou
16570 6e 74 65 72 28 32 29 20 43 6f 75 6e 74 65 72 4e  nter(2) CounterN
16580 61 6d 65 5d 20 22 5c 22 20 76 61 6c 75 65 20 69  ame] "\" value i
16590 73 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  s " \..         
165a0 20 20 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b     [object invok
165b0 65 20 24 63 6f 75 6e 74 65 72 28 32 29 20 52 61  e $counter(2) Ra
165c0 77 56 61 6c 75 65 5d 20 5c 6e 5d 0d 0a 0d 0a 20  wValue] \n].... 
165d0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
165e0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
165f0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
16600 20 22 2d 2d 2d 2d 20 22 20 24 70 72 65 66 69 78   "---- " $prefix
16610 20 22 20 63 6f 75 6e 74 65 72 20 5c 22 22 20 5c   " counter \"" \
16620 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 6f  ..            [o
16630 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24 63 6f  bject invoke $co
16640 75 6e 74 65 72 28 33 29 20 43 6f 75 6e 74 65 72  unter(3) Counter
16650 4e 61 6d 65 5d 20 22 5c 22 20 76 61 6c 75 65 20  Name] "\" value 
16660 69 73 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  is " \..        
16670 20 20 20 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f      [object invo
16680 6b 65 20 24 63 6f 75 6e 74 65 72 28 33 29 20 52  ke $counter(3) R
16690 61 77 56 61 6c 75 65 5d 20 5c 6e 5d 0d 0a 20 20  awValue] \n]..  
166a0 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
166b0 0a 20 20 20 20 70 72 6f 63 20 63 6f 6c 6c 65 63  .    proc collec
166c0 74 47 61 72 62 61 67 65 20 7b 20 63 68 61 6e 6e  tGarbage { chann
166d0 65 6c 20 7b 6d 69 6c 6c 69 73 65 63 6f 6e 64 73  el {milliseconds
166e0 20 31 30 30 30 7d 20 7b 71 75 69 65 74 20 74 72   1000} {quiet tr
166f0 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69  ue} } {..      i
16700 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62  f {[haveSQLiteOb
16710 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68  jectCommand]} th
16720 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
16730 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
16740 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
16750 6f 6b 65 20 47 43 20 47 65 74 54 6f 74 61 6c 4d  oke GC GetTotalM
16760 65 6d 6f 72 79 20 66 61 6c 73 65 0d 0a 20 20 20  emory false..   
16770 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d       } result] =
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 69 66 20 7b 21 24 71 75 69         if {!$qui
167a0 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
167b0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
167c0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
167d0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
167e0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6d 65 6d 6f        "---- memo
167f0 72 79 20 69 6e 20 75 73 65 20 62 79 20 74 68 65  ry in use by the
16800 20 43 4c 52 20 62 65 66 6f 72 65 20 63 6f 6c 6c   CLR before coll
16810 65 63 74 69 6f 6e 2e 2e 2e 20 22 20 5c 0d 0a 20  ection... " \.. 
16820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
16830 72 65 73 75 6c 74 20 22 20 62 79 74 65 73 5c 6e  result " bytes\n
16840 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  "]..          }.
16850 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
16860 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
16870 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
16880 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
16890 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
168a0 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
168b0 6f 20 67 65 74 20 43 4c 52 20 6d 65 6d 6f 72 79  o get CLR memory
168c0 20 75 73 61 67 65 2c 20 65 72 72 6f 72 3a 20 22   usage, error: "
168d0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
168e0 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c    \n\t $result \
168f0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  n]..        }.. 
16900 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
16910 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16920 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16930 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16940 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16950 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20  #########....   
16960 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
16970 54 45 3a 20 52 65 70 65 61 74 65 64 6c 79 20 61  TE: Repeatedly a
16980 74 74 65 6d 70 74 20 74 6f 20 63 6f 6c 6c 65 63  ttempt to collec
16990 74 20 67 61 72 62 61 67 65 20 75 6e 74 69 6c 20  t garbage until 
169a0 74 68 65 20 61 6c 6c 6f 74 74 65 64 20 6e 75 6d  the allotted num
169b0 62 65 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ber..      #    
169c0 20 20 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e     of millisecon
169d0 64 73 20 68 61 73 20 65 6c 61 70 73 65 64 2e 20  ds has elapsed. 
169e0 20 41 6c 77 61 79 73 20 61 74 74 65 6d 70 74 20   Always attempt 
169f0 74 6f 20 63 6f 6c 6c 65 63 74 20 67 61 72 62 61  to collect garba
16a00 67 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ge..      #     
16a10 20 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e    at least once.
16a20 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
16a30 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65   if {[haveSQLite
16a40 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20  ObjectCommand]} 
16a50 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
16a60 73 65 74 20 73 74 61 72 74 20 5b 63 6c 6f 63 6b  set start [clock
16a70 20 73 65 63 6f 6e 64 73 5d 0d 0a 20 20 20 20 20   seconds]..     
16a80 20 20 20 73 65 74 20 73 74 6f 70 20 5b 65 78 70     set stop [exp
16a90 72 20 7b 24 73 74 61 72 74 20 2b 20 28 24 6d 69  r {$start + ($mi
16aa0 6c 6c 69 73 65 63 6f 6e 64 73 20 2f 20 31 30 30  lliseconds / 100
16ab0 30 29 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  0)}]....        
16ac0 64 6f 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  do {..          
16ad0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
16ae0 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20  OTE: Attempt to 
16af0 66 6f 72 63 65 20 61 20 66 75 6c 6c 20 67 61 72  force a full gar
16b00 62 61 67 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 20  bage collection 
16b10 6e 6f 77 2e 20 20 52 65 70 6f 72 74 20 61 6e 79  now.  Report any
16b20 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
16b30 20 20 20 20 65 72 72 6f 72 20 74 68 61 74 20 69      error that i
16b40 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 66  s encountered if
16b50 20 77 65 20 66 61 69 6c 2e 0d 0a 20 20 20 20 20   we fail...     
16b60 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
16b70 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
16b80 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65              obje
16b90 63 74 20 69 6e 76 6f 6b 65 20 47 43 20 47 65 74  ct invoke GC Get
16ba0 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 74 72 75 65  TotalMemory true
16bb0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 72  ..          } er
16bc0 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ror]} then {..  
16bd0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
16be0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
16bf0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
16c00 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
16c10 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 66 75  RNING: failed fu
16c20 6c 6c 20 67 61 72 62 61 67 65 20 63 6f 6c 6c 65  ll garbage colle
16c30 63 74 69 6f 6e 2c 20 65 72 72 6f 72 3a 20 22 20  ction, error: " 
16c40 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
16c50 20 20 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c     \n\t $error \
16c60 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
16c70 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  ...          set
16c80 20 6e 6f 77 20 5b 63 6c 6f 63 6b 20 73 65 63 6f   now [clock seco
16c90 6e 64 73 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20  nds]..        } 
16ca0 77 68 69 6c 65 20 7b 24 73 74 61 72 74 20 3c 3d  while {$start <=
16cb0 20 24 6e 6f 77 20 26 26 20 24 6e 6f 77 20 3c 20   $now && $now < 
16cc0 24 73 74 6f 70 7d 0d 0a 20 20 20 20 20 20 7d 0d  $stop}..      }.
16cd0 0a 0d 0a 20 20 20 20 20 20 23 23 23 23 23 23 23  ...      #######
16ce0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16cf0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16d00 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16d10 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16d20 23 23 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  ##....      if {
16d30 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63  [haveSQLiteObjec
16d40 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20  tCommand]} then 
16d50 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  {..        if {[
16d60 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
16d70 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
16d80 20 47 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f   GC GetTotalMemo
16d90 72 79 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20  ry false..      
16da0 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30    } result] == 0
16db0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
16dc0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
16dd0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
16de0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
16df0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
16e00 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
16e10 20 20 20 22 2d 2d 2d 2d 20 6d 65 6d 6f 72 79 20     "---- memory 
16e20 69 6e 20 75 73 65 20 62 79 20 74 68 65 20 43 4c  in use by the CL
16e30 52 20 61 66 74 65 72 20 63 6f 6c 6c 65 63 74 69  R after collecti
16e40 6f 6e 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20  on... " \..     
16e50 20 20 20 20 20 20 20 20 20 20 20 24 72 65 73 75             $resu
16e60 6c 74 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a  lt " bytes\n"]..
16e70 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
16e80 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
16e90 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
16ea0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
16eb0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
16ec0 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
16ed0 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 67 65  NG: failed to ge
16ee0 74 20 43 4c 52 20 6d 65 6d 6f 72 79 20 75 73 61  t CLR memory usa
16ef0 67 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a  ge, error: " \..
16f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e                \n
16f10 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a  \t $result \n]..
16f20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
16f30 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
16f40 20 20 70 72 6f 63 20 67 65 74 53 51 4c 69 74 65    proc getSQLite
16f50 48 61 6e 64 6c 65 43 6f 75 6e 74 73 20 7b 20 63  HandleCounts { c
16f60 68 61 6e 6e 65 6c 20 7b 71 75 69 65 74 20 66 61  hannel {quiet fa
16f70 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  lse} } {..      
16f80 73 65 74 20 72 65 73 75 6c 74 20 5b 6c 69 73 74  set result [list
16f90 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  ]....      if {[
16fa0 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74  haveSQLiteObject
16fb0 43 6f 6d 6d 61 6e 64 5d 20 26 26 20 5b 68 61 76  Command] && [hav
16fc0 65 43 6f 6e 73 74 72 61 69 6e 74 20 5c 0d 0a 20  eConstraint \.. 
16fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65 66               def
16fe0 69 6e 65 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74  ineConstant.Syst
16ff0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 43  em.Data.SQLite.C
17000 4f 55 4e 54 5f 48 41 4e 44 4c 45 5d 7d 20 74 68  OUNT_HANDLE]} th
17010 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
17020 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
17030 20 41 64 64 20 65 61 63 68 20 63 72 69 74 69 63   Add each critic
17040 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 20  al handle count 
17050 74 6f 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  to the resulting
17060 20 6c 69 73 74 2e 0d 0a 20 20 20 20 20 20 20 20   list...        
17070 23 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61  #..        forea
17080 63 68 20 6e 61 6d 65 20 5b 6c 69 73 74 20 63 6f  ch name [list co
17090 6e 6e 65 63 74 69 6f 6e 43 6f 75 6e 74 20 73 74  nnectionCount st
170a0 61 74 65 6d 65 6e 74 43 6f 75 6e 74 20 62 61 63  atementCount bac
170b0 6b 75 70 43 6f 75 6e 74 5d 20 7b 0d 0a 20 20 20  kupCount] {..   
170c0 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
170d0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
170e0 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
170f0 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
17100 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
17110 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
17120 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74  SQLite.UnsafeNat
17130 69 76 65 4d 65 74 68 6f 64 73 20 24 6e 61 6d 65  iveMethods $name
17140 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 76 61  ..          } va
17150 6c 75 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  lue] == 0} then 
17160 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
17170 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
17180 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
17190 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
171a0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
171b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171c0 20 20 22 2d 2d 2d 2d 20 63 72 69 74 69 63 61 6c    "---- critical
171d0 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 20 5c 22   handle count \"
171e0 22 20 24 6e 61 6d 65 20 22 5c 22 20 69 73 20 22  " $name "\" is "
171f0 20 24 76 61 6c 75 65 20 5c 6e 5d 0d 0a 20 20 20   $value \n]..   
17200 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
17210 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e            lappen
17220 64 20 72 65 73 75 6c 74 20 24 76 61 6c 75 65 0d  d result $value.
17230 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
17240 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
17250 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
17260 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
17270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
17280 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
17290 69 6c 65 64 20 74 6f 20 67 65 74 20 63 72 69 74  iled to get crit
172a0 69 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e  ical handle coun
172b0 74 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  t \"" \..       
172c0 20 20 20 20 20 20 20 20 20 24 6e 61 6d 65 20 22           $name "
172d0 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  \", error: " \n\
172e0 74 20 24 76 61 6c 75 65 20 5c 6e 5d 0d 0a 20 20  t $value \n]..  
172f0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
17300 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
17310 73 65 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74  seif {!$quiet} t
17320 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
17330 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
17340 3a 20 54 68 65 20 61 63 74 75 61 6c 20 68 61 6e  : The actual han
17350 64 6c 65 20 63 6f 75 6e 74 73 20 61 72 65 20 6e  dle counts are n
17360 6f 74 20 61 76 61 69 6c 61 62 6c 65 3b 20 74 68  ot available; th
17370 65 72 65 66 6f 72 65 2c 20 6a 75 73 74 0d 0a 20  erefore, just.. 
17380 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72         #       r
17390 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 6c  eturn an empty l
173a0 69 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ist...        #.
173b0 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
173c0 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 72  channel "---- cr
173d0 69 74 69 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f  itical handle co
173e0 75 6e 74 73 20 75 6e 61 76 61 69 6c 61 62 6c 65  unts unavailable
173f0 5c 6e 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  \n"..      }....
17400 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65        return $re
17410 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  sult..    }.....
17420 20 20 20 20 70 72 6f 63 20 73 68 75 74 64 6f 77      proc shutdow
17430 6e 53 51 4c 69 74 65 20 7b 20 63 68 61 6e 6e 65  nSQLite { channe
17440 6c 20 7b 66 6f 72 63 65 20 66 61 6c 73 65 7d 20  l {force false} 
17450 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20  {quiet false} } 
17460 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
17470 20 20 23 20 4e 4f 54 45 3a 20 4d 61 6b 65 20 73    # NOTE: Make s
17480 75 72 65 20 74 68 61 74 20 53 51 4c 69 74 65 20  ure that SQLite 
17490 63 6f 72 65 20 6c 69 62 72 61 72 79 20 69 73 20  core library is 
174a0 63 6f 6d 70 6c 65 74 65 6c 79 20 73 68 75 74 64  completely shutd
174b0 6f 77 6e 2e 20 20 54 68 69 73 0d 0a 20 20 20 20  own.  This..    
174c0 20 20 23 20 20 20 20 20 20 20 69 73 20 75 73 65    #       is use
174d0 64 20 62 79 20 74 65 73 74 73 20 74 68 61 74 20  d by tests that 
174e0 63 68 61 6e 67 65 20 63 6f 6e 66 69 67 75 72 61  change configura
174f0 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61 6e 64  tion options and
17500 2f 6f 72 20 74 68 6f 73 65 0d 0a 20 20 20 20 20  /or those..     
17510 20 23 20 20 20 20 20 20 20 74 68 61 74 20 6e 65   #       that ne
17520 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ed to make sure 
17530 6c 6f 67 67 69 6e 67 20 69 73 20 69 6e 69 74 69  logging is initi
17540 61 6c 69 7a 65 64 20 28 69 2e 65 2e 20 6a 75 73  alized (i.e. jus
17550 74 20 69 6e 20 63 61 73 65 0d 0a 20 20 20 20 20  t in case..     
17560 20 23 20 20 20 20 20 20 20 74 68 65 20 53 51 4c   #       the SQL
17570 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79  ite core library
17580 20 77 61 73 20 69 6e 69 74 69 61 6c 69 7a 65 64   was initialized
17590 20 69 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20   in the process 
175a0 70 72 69 6f 72 20 74 6f 0d 0a 20 20 20 20 20 20  prior to..      
175b0 23 20 20 20 20 20 20 20 74 68 65 20 53 51 4c 69  #       the SQLi
175c0 74 65 4c 6f 67 20 63 6c 61 73 73 20 62 65 69 6e  teLog class bein
175d0 67 20 61 62 6c 65 20 74 6f 20 73 65 74 75 70 20  g able to setup 
175e0 69 74 73 20 6c 6f 67 67 69 6e 67 20 63 61 6c 6c  its logging call
175f0 62 61 63 6b 29 2e 0d 0a 20 20 20 20 20 20 23 20  back)...      # 
17600 20 20 20 20 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20        Normally, 
17610 74 68 69 73 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  this should only
17620 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66   be performed if
17630 20 53 51 4c 69 74 65 20 69 73 20 6c 6f 61 64 65   SQLite is loade
17640 64 20 61 6e 64 0d 0a 20 20 20 20 20 20 23 20 20  d and..      #  
17650 20 20 20 20 20 72 65 61 64 79 20 66 6f 72 20 75       ready for u
17660 73 65 20 62 79 20 74 68 65 20 74 65 73 74 20 73  se by the test s
17670 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  uite...      #..
17680 20 20 20 20 20 20 69 66 20 7b 24 66 6f 72 63 65        if {$force
17690 20 7c 7c 20 5b 69 73 53 51 4c 69 74 65 52 65 61   || [isSQLiteRea
176a0 64 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  dy]} then {..   
176b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
176c0 23 20 42 55 47 46 49 58 3a 20 4d 61 6b 65 20 73  # BUGFIX: Make s
176d0 75 72 65 20 74 68 61 74 20 61 6e 79 20 22 6c 65  ure that any "le
176e0 61 6b 65 64 22 20 74 72 61 6e 73 61 63 74 69 6f  aked" transactio
176f0 6e 73 20 61 6e 64 2f 6f 72 20 63 6f 6e 6e 65 63  ns and/or connec
17700 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20 23  tions..        #
17710 20 20 20 20 20 20 20 20 20 61 72 65 20 63 6c 65           are cle
17720 61 6e 65 64 20 75 70 20 62 65 66 6f 72 65 20 63  aned up before c
17730 61 6c 6c 69 6e 67 20 74 68 65 20 6e 61 74 69 76  alling the nativ
17740 65 20 73 68 75 74 64 6f 77 6e 20 66 75 6e 63 74  e shutdown funct
17750 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ion...        #.
17760 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  .        foreach
17770 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 5b 69 6e   transaction [in
17780 66 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 5d  fo transactions]
17790 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
177a0 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20   {[string match 
177b0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
177c0 20 53 79 73 74 65 6d 23 44 61 74 61 23 53 51 4c   System#Data#SQL
177d0 69 74 65 23 53 51 4c 69 74 65 54 72 61 6e 73 61  ite#SQLiteTransa
177e0 63 74 69 6f 6e 23 2a 20 24 74 72 61 6e 73 61 63  ction#* $transac
177f0 74 69 6f 6e 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  tion]} then {.. 
17800 20 20 20 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 20 20 20 20 73 71 6c 20 74 72 61 6e 73         sql trans
17830 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20  action rollback 
17840 24 74 72 61 6e 73 61 63 74 69 6f 6e 0d 0a 20 20  $transaction..  
17850 20 20 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f            } erro
17860 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  r] == 0} then {.
17870 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
17880 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
17890 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
178a0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
178b0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
178c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
178d0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 72 6f 6c 6c        "---- roll
178e0 65 64 20 62 61 63 6b 20 6c 65 61 6b 65 64 20 74  ed back leaked t
178f0 72 61 6e 73 61 63 74 69 6f 6e 20 5c 22 22 20 5c  ransaction \"" \
17900 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17910 20 20 20 20 20 20 24 74 72 61 6e 73 61 63 74 69        $transacti
17920 6f 6e 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  on \"\n]..      
17930 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
17940 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
17950 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
17960 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
17970 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
17980 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
17990 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
179a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
179b0 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
179c0 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 72  ING: failed to r
179d0 6f 6c 6c 62 61 63 6b 20 6c 65 61 6b 65 64 20 74  ollback leaked t
179e0 72 61 6e 73 61 63 74 69 6f 6e 20 5c 22 22 20 5c  ransaction \"" \
179f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17a00 20 20 20 20 20 20 24 74 72 61 6e 73 61 63 74 69        $transacti
17a10 6f 6e 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22  on "\", error: "
17a20 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d   \n\t $error \n]
17a30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17a40 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
17a50 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
17a60 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
17a70 20 20 20 20 66 6f 72 65 61 63 68 20 64 62 20 5b      foreach db [
17a80 69 6e 66 6f 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  info connections
17a90 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  ] {..          i
17aa0 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68  f {[string match
17ab0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
17ac0 20 20 53 79 73 74 65 6d 23 44 61 74 61 23 53 51    System#Data#SQ
17ad0 4c 69 74 65 23 53 51 4c 69 74 65 43 6f 6e 6e 65  Lite#SQLiteConne
17ae0 63 74 69 6f 6e 23 2a 20 24 64 62 5d 7d 20 74 68  ction#* $db]} th
17af0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
17b00 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 73 71    if {[catch {sq
17b10 6c 20 63 6c 6f 73 65 20 24 64 62 7d 20 65 72 72  l close $db} err
17b20 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  or] == 0} then {
17b30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17b40 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
17b50 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
17b60 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
17b70 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
17b80 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
17b90 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6c 6f         "---- clo
17ba0 73 65 64 20 6c 65 61 6b 65 64 20 64 61 74 61 62  sed leaked datab
17bb0 61 73 65 20 5c 22 22 20 24 64 62 20 5c 22 5c 6e  ase \"" $db \"\n
17bc0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]..             
17bd0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
17be0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
17bf0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
17c00 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
17c10 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
17c20 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
17c30 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
17c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
17c50 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
17c60 69 6c 65 64 20 74 6f 20 63 6c 6f 73 65 20 6c 65  iled to close le
17c70 61 6b 65 64 20 64 61 74 61 62 61 73 65 20 5c 22  aked database \"
17c80 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
17c90 20 20 20 20 20 20 20 20 20 24 64 62 20 22 5c 22           $db "\"
17ca0 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  , error: " \n\t 
17cb0 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20  $error \n]..    
17cc0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
17cd0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
17ce0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
17cf0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
17d00 0a 20 20 20 20 20 20 20 20 23 20 42 55 47 46 49  .        # BUGFI
17d10 58 3a 20 42 65 66 6f 72 65 20 63 61 6c 6c 69 6e  X: Before callin
17d20 67 20 74 68 65 20 6e 61 74 69 76 65 20 73 68 75  g the native shu
17d30 74 64 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 2c 20  tdown function, 
17d40 6d 61 6b 65 20 73 75 72 65 20 62 6f 74 68 0d 0a  make sure both..
17d50 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
17d60 20 20 6f 66 20 74 68 65 20 50 52 41 47 4d 41 20    of the PRAGMA 
17d70 72 65 6c 61 74 65 64 20 64 69 72 65 63 74 6f 72  related director
17d80 79 20 6e 61 6d 65 73 20 61 72 65 20 66 72 65 65  y names are free
17d90 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  d...        #.. 
17da0 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53         checkForS
17db0 51 4c 69 74 65 44 69 72 65 63 74 6f 72 69 65 73  QLiteDirectories
17dc0 20 24 63 68 61 6e 6e 65 6c 20 74 72 75 65 0d 0a   $channel true..
17dd0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
17de0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
17df0 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
17e00 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
17e10 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
17e20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
17e30 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69  QLite.UnsafeNati
17e40 76 65 4d 65 74 68 6f 64 73 20 73 71 6c 69 74 65  veMethods sqlite
17e50 33 5f 73 68 75 74 64 6f 77 6e 0d 0a 20 20 20 20  3_shutdown..    
17e60 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d      } result] ==
17e70 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
17e80 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
17e90 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
17ea0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
17eb0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
17ec0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
17ed0 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20       "---- call 
17ee0 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e  sqlite3_shutdown
17ef0 28 29 2e 2e 2e 20 6f 6b 3a 20 22 20 24 72 65 73  ()... ok: " $res
17f00 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ult \n]..       
17f10 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
17f20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
17f30 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
17f40 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
17f50 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
17f60 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
17f70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17f80 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69   "---- call sqli
17f90 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 2e 2e  te3_shutdown()..
17fa0 2e 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  . error: " \n\t 
17fb0 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
17fc0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
17fd0 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
17fe0 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
17ff0 20 72 65 70 6f 72 74 53 51 4c 69 74 65 52 65 73   reportSQLiteRes
18000 6f 75 72 63 65 73 20 7b 0d 0a 20 20 20 20 20 20  ources {..      
18010 20 20 20 20 20 20 63 68 61 6e 6e 65 6c 20 7b 71        channel {q
18020 75 69 65 74 20 66 61 6c 73 65 7d 20 7b 72 65 73  uiet false} {res
18030 65 74 20 74 72 75 65 7d 20 7b 63 6f 6c 6c 65 63  et true} {collec
18040 74 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20  t true} } {..   
18050 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
18060 54 45 3a 20 49 66 20 61 76 61 69 6c 61 62 6c 65  TE: If available
18070 2c 20 72 65 70 6f 72 74 20 6f 6e 20 28 61 6e 64  , report on (and
18080 20 70 6f 73 73 69 62 6c 79 20 72 65 73 65 74 29   possibly reset)
18090 20 74 68 65 20 72 75 6e 74 69 6d 65 0d 0a 20 20   the runtime..  
180a0 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 66      #       conf
180b0 69 67 75 72 61 74 69 6f 6e 20 73 74 61 74 69 73  iguration statis
180c0 74 69 63 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  tics...      #..
180d0 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53        if {[haveS
180e0 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61  QLiteObjectComma
180f0 6e 64 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  nd] && \..      
18100 20 20 20 20 5b 68 61 76 65 43 6f 6e 73 74 72 61      [haveConstra
18110 69 6e 74 20 62 75 69 6c 64 43 6f 6e 66 69 67 75  int buildConfigu
18120 72 61 74 69 6f 6e 2e 44 65 62 75 67 5d 20 26 26  ration.Debug] &&
18130 20 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20   [catch {..     
18140 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
18150 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
18160 69 63 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20  ic -alias \..   
18170 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
18180 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61  Data.SQLite.Unsa
18190 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20  feNativeMethods 
181a0 73 65 74 74 69 6e 67 52 65 61 64 43 6f 75 6e 74  settingReadCount
181b0 73 0d 0a 20 20 20 20 20 20 7d 20 73 65 74 74 69  s..      } setti
181c0 6e 67 52 65 61 64 43 6f 75 6e 74 73 5d 20 3d 3d  ngReadCounts] ==
181d0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
181e0 20 20 20 20 73 65 74 20 6e 61 6d 65 43 6f 75 6e      set nameCoun
181f0 74 20 5b 24 73 65 74 74 69 6e 67 52 65 61 64 43  t [$settingReadC
18200 6f 75 6e 74 73 20 43 6f 75 6e 74 5d 0d 0a 20 20  ounts Count]..  
18210 20 20 20 20 20 20 73 65 74 20 76 61 6c 75 65 43        set valueC
18220 6f 75 6e 74 20 30 0d 0a 0d 0a 20 20 20 20 20 20  ount 0....      
18230 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68    object foreach
18240 20 2d 61 6c 69 61 73 20 70 61 69 72 20 24 73 65   -alias pair $se
18250 74 74 69 6e 67 52 65 61 64 43 6f 75 6e 74 73 20  ttingReadCounts 
18260 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 6e 63  {..          inc
18270 72 20 76 61 6c 75 65 43 6f 75 6e 74 20 5b 24 70  r valueCount [$p
18280 61 69 72 20 56 61 6c 75 65 5d 0d 0a 0d 0a 20 20  air Value]....  
18290 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
182a0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
182b0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
182c0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
182d0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
182e0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 65 74         "---- set
182f0 74 69 6e 67 20 5c 22 22 20 5b 24 70 61 69 72 20  ting \"" [$pair 
18300 4b 65 79 5d 20 22 5c 22 20 77 61 73 20 72 65 61  Key] "\" was rea
18310 64 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  d " \..         
18320 20 20 20 20 20 20 20 5b 24 70 61 69 72 20 56 61         [$pair Va
18330 6c 75 65 5d 20 22 20 74 69 6d 65 73 5c 6e 22 5d  lue] " times\n"]
18340 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
18350 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
18360 20 20 20 20 69 66 20 7b 24 72 65 73 65 74 7d 20      if {$reset} 
18370 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
18380 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 24 73    if {[catch {$s
18390 65 74 74 69 6e 67 52 65 61 64 43 6f 75 6e 74 73  ettingReadCounts
183a0 20 43 6c 65 61 72 7d 20 65 72 72 6f 72 5d 20 3d   Clear} error] =
183b0 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
183c0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
183d0 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
183e0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
183f0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
18400 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
18410 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
18420 2d 20 72 65 73 65 74 20 73 65 74 74 69 6e 67 20  - reset setting 
18430 73 74 61 74 69 73 74 69 63 73 20 66 6f 72 20 74  statistics for t
18440 68 65 20 70 72 65 76 69 6f 75 73 20 22 20 5c 0d  he previous " \.
18450 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18460 20 20 20 24 6e 61 6d 65 43 6f 75 6e 74 20 22 20     $nameCount " 
18470 6e 61 6d 65 73 20 61 6e 64 20 22 20 24 76 61 6c  names and " $val
18480 75 65 43 6f 75 6e 74 20 22 20 76 61 6c 75 65 73  ueCount " values
18490 20 72 65 61 64 5c 6e 22 5d 0d 0a 20 20 20 20 20   read\n"]..     
184a0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
184b0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
184c0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
184d0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
184e0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
184f0 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
18500 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
18510 20 72 65 73 65 74 20 73 65 74 74 69 6e 67 20 73   reset setting s
18520 74 61 74 69 73 74 69 63 73 20 66 6f 72 20 22 20  tatistics for " 
18530 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
18540 20 20 20 22 74 68 65 20 70 72 65 76 69 6f 75 73     "the previous
18550 20 22 20 24 6e 61 6d 65 43 6f 75 6e 74 20 22 20   " $nameCount " 
18560 6e 61 6d 65 73 20 61 6e 64 20 22 20 24 76 61 6c  names and " $val
18570 75 65 43 6f 75 6e 74 20 5c 0d 0a 20 20 20 20 20  ueCount \..     
18580 20 20 20 20 20 20 20 20 20 20 20 22 20 76 61 6c             " val
18590 75 65 73 20 72 65 61 64 2c 20 65 72 72 6f 72 3a  ues read, error:
185a0 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c   " \n\t $error \
185b0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
185c0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
185d0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
185e0 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65  {[haveSQLiteObje
185f0 63 74 43 6f 6d 6d 61 6e 64 5d 20 26 26 20 5b 68  ctCommand] && [h
18600 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5c 0d  aveConstraint \.
18610 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  .              d
18620 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 2e 53 79  efineConstant.Sy
18630 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
18640 2e 49 4e 54 45 52 4f 50 5f 56 49 52 54 55 41 4c  .INTEROP_VIRTUAL
18650 5f 54 41 42 4c 45 5d 20 26 26 20 5c 0d 0a 20 20  _TABLE] && \..  
18660 20 20 20 20 20 20 20 20 5b 68 61 76 65 43 6f 6e          [haveCon
18670 73 74 72 61 69 6e 74 20 5c 0d 0a 20 20 20 20 20  straint \..     
18680 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 43           defineC
18690 6f 6e 73 74 61 6e 74 2e 53 79 73 74 65 6d 2e 44  onstant.System.D
186a0 61 74 61 2e 53 51 4c 69 74 65 2e 54 52 41 43 4b  ata.SQLite.TRACK
186b0 5f 4d 45 4d 4f 52 59 5f 42 59 54 45 53 5d 7d 20  _MEMORY_BYTES]} 
186c0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
186d0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
186e0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
186f0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
18700 2d 2d 2d 20 63 75 72 72 65 6e 74 20 6d 65 6d 6f  --- current memo
18710 72 79 20 69 6e 20 75 73 65 20 62 79 20 53 51 4c  ry in use by SQL
18720 69 74 65 4d 65 6d 6f 72 79 2e 2e 2e 20 22 0d 0a  iteMemory... "..
18730 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
18740 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
18750 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a  {..          obj
18760 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
18770 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
18780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
18790 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
187a0 2e 53 51 4c 69 74 65 4d 65 6d 6f 72 79 20 62 79  .SQLiteMemory by
187b0 74 65 73 41 6c 6c 6f 63 61 74 65 64 0d 0a 20 20  tesAllocated..  
187c0 20 20 20 20 20 20 7d 20 6d 65 6d 6f 72 79 5d 20        } memory] 
187d0 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
187e0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
187f0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
18800 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
18810 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
18820 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20 62 79  rgs $memory " by
18830 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  tes\n"]..       
18840 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
18850 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
18860 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b    set memory unk
18870 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nown....        
18880 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
18890 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
188a0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
188b0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
188c0 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20  emory \n]..     
188d0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
188e0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
188f0 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
18900 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
18910 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
18920 20 6d 61 78 69 6d 75 6d 20 6d 65 6d 6f 72 79 20   maximum memory 
18930 69 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74 65  in use by SQLite
18940 4d 65 6d 6f 72 79 2e 2e 2e 20 22 0d 0a 20 20 20  Memory... "..   
18950 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
18960 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
18970 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
18980 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
18990 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
189a0 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
189b0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51  m.Data.SQLite.SQ
189c0 4c 69 74 65 4d 65 6d 6f 72 79 20 6d 61 78 69 6d  LiteMemory maxim
189d0 75 6d 42 79 74 65 73 41 6c 6c 6f 63 61 74 65 64  umBytesAllocated
189e0 0d 0a 20 20 20 20 20 20 20 20 7d 20 6d 65 6d 6f  ..        } memo
189f0 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  ry] == 0} then {
18a00 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
18a10 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
18a20 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
18a30 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
18a40 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20  endArgs $memory 
18a50 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20  " bytes\n"]..   
18a60 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
18a70 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
18a80 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79        set memory
18a90 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20   unknown....    
18aa0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
18ab0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
18ac0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
18ad0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
18ae0 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20  s $memory \n].. 
18af0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
18b00 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
18b10 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71 75  ..      if {!$qu
18b20 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
18b30 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
18b40 6e 65 6c 20 22 2d 2d 2d 2d 20 63 75 72 72 65 6e  nel "---- curren
18b50 74 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20  t memory in use 
18b60 62 79 20 53 51 4c 69 74 65 2e 2e 2e 20 22 0d 0a  by SQLite... "..
18b70 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
18b80 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65   if {[haveSQLite
18b90 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20  ObjectCommand]} 
18ba0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
18bb0 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
18bc0 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
18bd0 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
18be0 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
18bf0 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
18c00 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61  Data.SQLite.Unsa
18c10 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20  feNativeMethods 
18c20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75  sqlite3_memory_u
18c30 73 65 64 0d 0a 20 20 20 20 20 20 20 20 7d 20 6d  sed..        } m
18c40 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65  emory] == 0} the
18c50 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
18c60 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
18c70 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
18c80 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
18c90 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f  appendArgs $memo
18ca0 72 79 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a  ry " bytes\n"]..
18cb0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
18cc0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
18cd0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
18ce0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61        # NOTE: Ma
18cf0 79 62 65 20 74 68 65 20 53 51 4c 69 74 65 20 63  ybe the SQLite c
18d00 6f 72 65 20 6c 69 62 72 61 72 79 20 69 73 20 75  ore library is u
18d10 6e 61 76 61 69 6c 61 62 6c 65 3f 0d 0a 20 20 20  navailable?..   
18d20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
18d30 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75      set memory u
18d40 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20  nknown....      
18d50 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
18d60 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
18d70 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
18d80 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
18d90 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20  $memory \n]..   
18da0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
18db0 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73    }..      } els
18dc0 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  e {..        set
18dd0 20 6d 65 6d 6f 72 79 20 75 6e 61 76 61 69 6c 61   memory unavaila
18de0 62 6c 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69  ble....        i
18df0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
18e00 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
18e10 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
18e20 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79  pendArgs $memory
18e30 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d   \n]..        }.
18e40 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
18e50 20 20 73 65 74 20 72 65 73 75 6c 74 20 24 6d 65    set result $me
18e60 6d 6f 72 79 3b 20 23 20 4e 4f 54 45 3a 20 52 65  mory; # NOTE: Re
18e70 74 75 72 6e 20 6d 65 6d 6f 72 79 20 69 6e 2d 75  turn memory in-u
18e80 73 65 20 74 6f 20 6f 75 72 20 63 61 6c 6c 65 72  se to our caller
18e90 2e 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21  .....      if {!
18ea0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
18eb0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
18ec0 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 6d 61 78  hannel "---- max
18ed0 69 6d 75 6d 20 6d 65 6d 6f 72 79 20 69 6e 20 75  imum memory in u
18ee0 73 65 20 62 79 20 53 51 4c 69 74 65 2e 2e 2e 20  se by SQLite... 
18ef0 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  "..      }....  
18f00 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c      if {[haveSQL
18f10 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64  iteObjectCommand
18f20 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
18f30 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
18f40 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
18f50 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
18f60 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
18f70 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
18f80 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55  em.Data.SQLite.U
18f90 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
18fa0 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ds \..          
18fb0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f      sqlite3_memo
18fc0 72 79 5f 68 69 67 68 77 61 74 65 72 20 30 0d 0a  ry_highwater 0..
18fd0 20 20 20 20 20 20 20 20 7d 20 6d 65 6d 6f 72 79          } memory
18fe0 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
18ff0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
19000 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
19010 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
19020 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
19030 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20  dArgs $memory " 
19040 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20  bytes\n"]..     
19050 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
19060 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
19070 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
19080 20 23 20 4e 4f 54 45 3a 20 4d 61 79 62 65 20 74   # NOTE: Maybe t
19090 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c  he SQLite core l
190a0 69 62 72 61 72 79 20 69 73 20 75 6e 61 76 61 69  ibrary is unavai
190b0 6c 61 62 6c 65 3f 0d 0a 20 20 20 20 20 20 20 20  lable?..        
190c0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73    #..          s
190d0 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77  et memory unknow
190e0 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n....          i
190f0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
19100 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
19110 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
19120 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f  appendArgs $memo
19130 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ry \n]..        
19140 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
19150 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
19160 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f          set memo
19170 72 79 20 75 6e 61 76 61 69 6c 61 62 6c 65 0d 0a  ry unavailable..
19180 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24  ..        if {!$
19190 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
191a0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
191b0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
191c0 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d  rgs $memory \n].
191d0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
191e0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
191f0 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65 6e 20  {$collect} then 
19200 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c 6c 65  {..        colle
19210 63 74 47 61 72 62 61 67 65 20 24 63 68 61 6e 6e  ctGarbage $chann
19220 65 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  el..      }.... 
19230 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
19240 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
19250 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
19260 20 22 2d 2d 2d 2d 20 63 75 72 72 65 6e 74 20 6d   "---- current m
19270 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20  emory in use by 
19280 74 68 65 20 43 4c 52 2e 2e 2e 20 22 0d 0a 20 20  the CLR... "..  
19290 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69      }....      i
192a0 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62  f {[haveSQLiteOb
192b0 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68  jectCommand]} th
192c0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
192d0 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
192e0 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
192f0 6f 6b 65 20 47 43 20 47 65 74 54 6f 74 61 6c 4d  oke GC GetTotalM
19300 65 6d 6f 72 79 20 66 61 6c 73 65 0d 0a 20 20 20  emory false..   
19310 20 20 20 20 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d       } memory] =
19320 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
19330 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
19340 6e 67 20 69 73 20 69 6e 74 65 67 65 72 20 2d 73  ng is integer -s
19350 74 72 69 63 74 20 24 6d 65 6d 6f 72 79 5d 7d 20  trict $memory]} 
19360 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
19370 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
19380 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
19390 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
193a0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
193b0 73 20 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65  s $memory " byte
193c0 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  s\n"]..         
193d0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
193e0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
193f0 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79        set memory
19400 20 69 6e 76 61 6c 69 64 0d 0a 0d 0a 20 20 20 20   invalid....    
19410 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
19420 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
19430 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
19440 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
19450 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e  dArgs $memory \n
19460 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
19470 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
19480 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
19490 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6d  .          set m
194a0 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d  emory unknown...
194b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
194c0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
194d0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
194e0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
194f0 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c  ndArgs $memory \
19500 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
19510 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
19520 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
19530 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75      set memory u
19540 6e 61 76 61 69 6c 61 62 6c 65 0d 0a 0d 0a 20 20  navailable....  
19550 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
19560 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
19570 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
19580 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
19590 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20  $memory \n]..   
195a0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
195b0 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
195c0 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a  $result..    }..
195d0 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63  ...    proc chec
195e0 6b 46 6f 72 53 51 4c 69 74 65 44 69 72 65 63 74  kForSQLiteDirect
195f0 6f 72 69 65 73 20 7b 20 63 68 61 6e 6e 65 6c 20  ories { channel 
19600 7b 72 65 73 65 74 20 66 61 6c 73 65 7d 20 7d 20  {reset false} } 
19610 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
19620 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
19630 69 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 77  if the sqlite3_w
19640 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
19650 72 79 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  ry function is a
19660 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20  vailable...     
19670 20 23 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   #..      tputs 
19680 24 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20  $channel \..    
19690 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63        "---- chec
196a0 6b 69 6e 67 20 66 6f 72 20 66 75 6e 63 74 69 6f  king for functio
196b0 6e 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  n sqlite3_win32_
196c0 73 65 74 5f 64 69 72 65 63 74 6f 72 79 2e 2e 2e  set_directory...
196d0 20 22 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   "....      #.. 
196e0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69       # NOTE: Thi
196f0 73 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 73 71  s call to the sq
19700 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f  lite3_win32_set_
19710 64 69 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69  directory functi
19720 6f 6e 20 75 73 65 73 20 74 68 65 0d 0a 20 20 20  on uses the..   
19730 20 20 20 23 20 20 20 20 20 20 20 69 6e 76 61 6c     #       inval
19740 69 64 20 76 61 6c 75 65 20 30 20 66 6f 72 20 74  id value 0 for t
19750 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
19760 74 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69 73  t.  This code is
19770 20 64 65 73 69 67 6e 65 64 0d 0a 20 20 20 20 20   designed..     
19780 20 23 20 20 20 20 20 20 20 74 6f 20 63 68 65 63   #       to chec
19790 6b 20 69 66 20 63 61 6c 6c 69 6e 67 20 74 68 65  k if calling the
197a0 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72   function will r
197b0 61 69 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f  aise an exceptio
197c0 6e 20 28 69 2e 65 2e 0d 0a 20 20 20 20 20 20 23  n (i.e...      #
197d0 20 20 20 20 20 20 20 74 68 65 20 61 63 74 75 61         the actua
197e0 6c 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  l result of the 
197f0 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
19800 74 20 6d 61 74 74 65 72 20 61 73 20 6c 6f 6e 67  t matter as long
19810 20 61 73 20 6e 6f 0d 0a 20 20 20 20 20 20 23 20   as no..      # 
19820 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20        directory 
19830 69 73 20 63 68 61 6e 67 65 64 29 2e 0d 0a 20 20  is changed)...  
19840 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
19850 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
19860 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
19870 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
19880 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
19890 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
198a0 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76  Lite.UnsafeNativ
198b0 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20  eMethods \..    
198c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
198d0 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
198e0 6f 72 79 20 30 20 6e 75 6c 6c 0d 0a 20 20 20 20  ory 0 null..    
198f0 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20    }] == 0} then 
19900 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
19910 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 61        # NOTE: Ca
19920 6c 6c 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  lling the sqlite
19930 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65  3_win32_set_dire
19940 63 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20 64  ctory function d
19950 6f 65 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20  oes not..       
19960 20 23 20 20 20 20 20 20 20 63 61 75 73 65 20 61   #       cause a
19970 6e 20 65 78 63 65 70 74 69 6f 6e 3b 20 74 68 65  n exception; the
19980 72 65 66 6f 72 65 2c 20 69 74 20 6d 75 73 74 20  refore, it must 
19990 62 65 20 61 76 61 69 6c 61 62 6c 65 20 28 69 2e  be available (i.
199a0 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  e...        #   
199b0 20 20 20 20 65 76 65 6e 20 74 68 6f 75 67 68 20      even though 
199c0 69 74 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e  it should return
199d0 20 61 20 66 61 69 6c 75 72 65 20 72 65 74 75 72   a failure retur
199e0 6e 20 63 6f 64 65 20 69 6e 20 74 68 69 73 0d 0a  n code in this..
199f0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
19a00 63 61 73 65 29 2e 0d 0a 20 20 20 20 20 20 20 20  case)...        
19a10 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  #..        addCo
19a20 6e 73 74 72 61 69 6e 74 20 73 71 6c 69 74 65 33  nstraint sqlite3
19a30 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63  _win32_set_direc
19a40 74 6f 72 79 0d 0a 0d 0a 20 20 20 20 20 20 20 20  tory....        
19a50 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79  tputs $channel y
19a60 65 73 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  es\n....        
19a70 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
19a80 45 3a 20 44 6f 65 73 20 6f 75 72 20 63 61 6c 6c  E: Does our call
19a90 65 72 20 77 61 6e 74 20 74 6f 20 72 65 73 65 74  er want to reset
19aa0 20 74 68 65 20 64 69 72 65 63 74 6f 72 69 65 73   the directories
19ab0 3f 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ?..        #..  
19ac0 20 20 20 20 20 20 69 66 20 7b 24 72 65 73 65 74        if {$reset
19ad0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
19ae0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
19af0 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 20 6d 61 6b   # NOTE: Now mak
19b00 65 20 73 75 72 65 20 74 68 65 20 64 61 74 61 62  e sure the datab
19b10 61 73 65 20 61 6e 64 20 74 65 6d 70 6f 72 61 72  ase and temporar
19b20 79 20 64 69 72 65 63 74 6f 72 69 65 73 20 61 72  y directories ar
19b30 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  e..          #  
19b40 20 20 20 20 20 72 65 73 65 74 20 74 68 65 69 72       reset their
19b50 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 2c   default values,
19b60 20 77 68 69 63 68 20 73 68 6f 75 6c 64 20 62 65   which should be
19b70 20 6e 75 6c 6c 20 66 6f 72 20 62 6f 74 68 2e 0d   null for both..
19b80 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
19b90 20 20 20 53 69 6e 63 65 20 74 68 65 20 73 71 6c     Since the sql
19ba0 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
19bb0 69 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f  irectory functio
19bc0 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 0d  n is available,.
19bd0 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
19be0 20 20 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20     use it...    
19bf0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
19c00 20 20 20 66 6f 72 20 7b 73 65 74 20 69 6e 64 65     for {set inde
19c10 78 20 31 7d 20 7b 24 69 6e 64 65 78 20 3c 20 33  x 1} {$index < 3
19c20 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b  } {incr index} {
19c30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
19c40 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
19c50 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
19c60 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
19c70 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
19c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
19c90 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
19ca0 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  e.UnsafeNativeMe
19cb0 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20  thods \..       
19cc0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
19cd0 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72  e3_win32_set_dir
19ce0 65 63 74 6f 72 79 20 24 69 6e 64 65 78 20 6e 75  ectory $index nu
19cf0 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll..            
19d00 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20  } result] == 0} 
19d10 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
19d20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
19d30 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
19d40 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
19d50 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c        "---- call
19d60 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
19d70 65 74 5f 64 69 72 65 63 74 6f 72 79 28 22 20 24  et_directory(" $
19d80 69 6e 64 65 78 20 5c 0d 0a 20 20 20 20 20 20 20  index \..       
19d90 20 20 20 20 20 20 20 20 20 20 20 22 2c 20 6e 75             ", nu
19da0 6c 6c 29 2e 2e 2e 20 6f 6b 3a 20 22 20 24 72 65  ll)... ok: " $re
19db0 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  sult \n]..      
19dc0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
19dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
19de0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
19df0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
19e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
19e10 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  --- call sqlite3
19e20 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63  _win32_set_direc
19e30 74 6f 72 79 28 22 20 24 69 6e 64 65 78 20 5c 0d  tory(" $index \.
19e40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19e50 20 20 20 22 2c 20 6e 75 6c 6c 29 2e 2e 2e 20 65     ", null)... e
19e60 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65  rror: " \n\t $re
19e70 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  sult \n]..      
19e80 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
19e90 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
19ea0 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
19eb0 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
19ec0 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 0d 0a  channel no\n....
19ed0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
19ee0 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20     # NOTE: Does 
19ef0 6f 75 72 20 63 61 6c 6c 65 72 20 77 61 6e 74 20  our caller want 
19f00 74 6f 20 72 65 73 65 74 20 74 68 65 20 64 69 72  to reset the dir
19f10 65 63 74 6f 72 69 65 73 3f 20 20 54 68 69 73 20  ectories?  This 
19f20 63 61 6e 20 6f 6e 6c 79 0d 0a 20 20 20 20 20 20  can only..      
19f30 20 20 23 20 20 20 20 20 20 20 62 65 20 70 65 72    #       be per
19f40 66 6f 72 6d 65 64 20 69 66 20 53 51 4c 69 74 65  formed if SQLite
19f50 20 69 73 20 6c 6f 61 64 65 64 20 61 6e 64 20 72   is loaded and r
19f60 65 61 64 79 20 66 6f 72 20 75 73 65 20 62 79 20  eady for use by 
19f70 74 68 65 20 74 65 73 74 0d 0a 20 20 20 20 20 20  the test..      
19f80 20 20 23 20 20 20 20 20 20 20 73 75 69 74 65 2e    #       suite.
19f90 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
19fa0 20 20 20 20 20 69 66 20 7b 24 72 65 73 65 74 20       if {$reset 
19fb0 26 26 20 5b 69 73 53 51 4c 69 74 65 52 65 61 64  && [isSQLiteRead
19fc0 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  y]} then {..    
19fd0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
19fe0 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 20 6d     # NOTE: Now m
19ff0 61 6b 65 20 73 75 72 65 20 74 68 65 20 64 61 74  ake sure the dat
1a000 61 62 61 73 65 20 61 6e 64 20 74 65 6d 70 6f 72  abase and tempor
1a010 61 72 79 20 64 69 72 65 63 74 6f 72 69 65 73 20  ary directories 
1a020 61 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23  are..          #
1a030 20 20 20 20 20 20 20 72 65 73 65 74 20 74 68 65         reset the
1a040 69 72 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  ir default value
1a050 73 2c 20 77 68 69 63 68 20 73 68 6f 75 6c 64 20  s, which should 
1a060 62 65 20 6e 75 6c 6c 20 66 6f 72 20 62 6f 74 68  be null for both
1a070 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  ...          #  
1a080 20 20 20 20 20 53 69 6e 63 65 20 74 68 65 20 73       Since the s
1a090 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
1a0a0 5f 64 69 72 65 63 74 6f 72 79 20 66 75 6e 63 74  _directory funct
1a0b0 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 0d 0a 20 20  ion does not..  
1a0c0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1a0d0 61 70 70 65 61 72 20 74 6f 20 62 65 20 61 76 61  appear to be ava
1a0e0 69 6c 61 62 6c 65 2c 20 75 73 65 20 74 68 65 20  ilable, use the 
1a0f0 61 73 73 6f 63 69 61 74 65 64 20 50 52 41 47 4d  associated PRAGM
1a100 41 20 63 6f 6d 6d 61 6e 64 73 0d 0a 20 20 20 20  A commands..    
1a110 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e        #       in
1a120 73 74 65 61 64 2e 0d 0a 20 20 20 20 20 20 20 20  stead...        
1a130 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 66    #..          f
1a140 6f 72 65 61 63 68 20 64 69 72 65 63 74 6f 72 79  oreach directory
1a150 20 5b 6c 69 73 74 20 64 61 74 61 5f 73 74 6f 72   [list data_stor
1a160 65 5f 64 69 72 65 63 74 6f 72 79 20 74 65 6d 70  e_directory temp
1a170 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79  _store_directory
1a180 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ] {..           
1a190 20 73 65 74 20 73 71 6c 20 5b 61 70 70 65 6e 64   set sql [append
1a1a0 41 72 67 73 20 22 50 52 41 47 4d 41 20 22 20 24  Args "PRAGMA " $
1a1b0 64 69 72 65 63 74 6f 72 79 20 22 20 3d 20 5c 22  directory " = \"
1a1c0 5c 22 3b 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  \";"]....       
1a1d0 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
1a1e0 7b 65 78 65 63 75 74 65 53 71 6c 20 24 73 71 6c  {executeSql $sql
1a1f0 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20  } result] == 0} 
1a200 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1a210 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1a220 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1a230 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1a240 20 20 20 20 20 20 22 2d 2d 2d 2d 20 65 78 65 63        "---- exec
1a250 75 74 65 20 50 52 41 47 4d 41 20 22 20 24 64 69  ute PRAGMA " $di
1a260 72 65 63 74 6f 72 79 20 22 2e 2e 2e 20 6f 6b 3a  rectory "... ok:
1a270 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
1a280 20 20 20 20 20 20 20 20 20 20 24 72 65 73 75 6c            $resul
1a290 74 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  t \"\n]..       
1a2a0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1a2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
1a2c0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
1a2d0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1a2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
1a2f0 2d 2d 20 65 78 65 63 75 74 65 20 50 52 41 47 4d  -- execute PRAGM
1a300 41 20 22 20 24 64 69 72 65 63 74 6f 72 79 20 22  A " $directory "
1a310 2e 2e 2e 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a  ... error: " \..
1a320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a330 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c    \n\t $result \
1a340 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
1a350 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
1a360 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1a370 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
1a380 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 6e       # NOTE: Fin
1a390 61 6c 6c 79 2c 20 73 68 6f 77 20 74 68 65 20 63  ally, show the c
1a3a0 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20  urrent value of 
1a3b0 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
1a3c0 20 74 65 6d 70 6f 72 61 72 79 0d 0a 20 20 20 20   temporary..    
1a3d0 20 20 23 20 20 20 20 20 20 20 64 69 72 65 63 74    #       direct
1a3e0 6f 72 69 65 73 2e 20 20 54 68 69 73 20 63 61 6e  ories.  This can
1a3f0 20 6f 6e 6c 79 20 62 65 20 70 65 72 66 6f 72 6d   only be perform
1a400 65 64 20 69 66 20 53 51 4c 69 74 65 20 69 73 20  ed if SQLite is 
1a410 6c 6f 61 64 65 64 0d 0a 20 20 20 20 20 20 23 20  loaded..      # 
1a420 20 20 20 20 20 20 61 6e 64 20 72 65 61 64 79 20        and ready 
1a430 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 74  for use by the t
1a440 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20  est suite...    
1a450 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
1a460 69 73 53 51 4c 69 74 65 52 65 61 64 79 5d 7d 20  isSQLiteReady]} 
1a470 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1a480 66 6f 72 65 61 63 68 20 64 69 72 65 63 74 6f 72  foreach director
1a490 79 20 5b 6c 69 73 74 20 64 61 74 61 5f 73 74 6f  y [list data_sto
1a4a0 72 65 5f 64 69 72 65 63 74 6f 72 79 20 74 65 6d  re_directory tem
1a4b0 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72  p_store_director
1a4c0 79 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  y] {..          
1a4d0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
1a4e0 61 70 70 65 6e 64 41 72 67 73 20 22 2d 2d 2d 2d  appendArgs "----
1a4f0 20 63 68 65 63 6b 69 6e 67 20 22 20 24 64 69 72   checking " $dir
1a500 65 63 74 6f 72 79 20 22 2e 2e 2e 20 22 5d 0d 0a  ectory "... "]..
1a510 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
1a520 73 71 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  sql [appendArgs 
1a530 22 50 52 41 47 4d 41 20 22 20 24 64 69 72 65 63  "PRAGMA " $direc
1a540 74 6f 72 79 20 5c 3b 5d 0d 0a 0d 0a 20 20 20 20  tory \;]....    
1a550 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
1a560 20 7b 65 78 65 63 75 74 65 53 71 6c 20 24 73 71   {executeSql $sq
1a570 6c 20 73 63 61 6c 61 72 7d 20 72 65 73 75 6c 74  l scalar} result
1a580 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
1a590 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1a5a0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1a5b0 6e 64 41 72 67 73 20 22 6f 6b 3a 20 5c 22 22 20  ndArgs "ok: \"" 
1a5c0 24 72 65 73 75 6c 74 20 5c 22 5c 6e 5d 0d 0a 20  $result \"\n].. 
1a5d0 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
1a5e0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
1a5f0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
1a600 70 70 65 6e 64 41 72 67 73 20 22 65 72 72 6f 72  ppendArgs "error
1a610 3a 20 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74  : " \n\t $result
1a620 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
1a630 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
1a640 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
1a650 0a 20 20 20 20 70 72 6f 63 20 6c 6f 61 64 53 51  .    proc loadSQ
1a660 4c 69 74 65 54 65 73 74 53 65 74 74 69 6e 67 73  LiteTestSettings
1a670 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 73 75 66 66   { channel {suff
1a680 69 78 20 22 22 7d 20 7b 71 75 69 65 74 20 66 61  ix ""} {quiet fa
1a690 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  lse} } {..      
1a6a0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
1a6b0 20 53 6b 69 70 20 6c 6f 61 64 69 6e 67 20 74 68   Skip loading th
1a6c0 65 20 73 65 74 74 69 6e 67 73 20 69 66 20 74 68  e settings if th
1a6d0 65 69 72 20 75 73 61 67 65 20 68 61 73 20 62 65  eir usage has be
1a6e0 65 6e 20 64 69 73 61 62 6c 65 64 2e 0d 0a 20 20  en disabled...  
1a6f0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
1a700 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
1a710 3a 6e 6f 28 73 71 6c 69 74 65 54 65 73 74 53 65  :no(sqliteTestSe
1a720 74 74 69 6e 67 73 29 5d 7d 20 74 68 65 6e 20 7b  ttings)]} then {
1a730 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1a740 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61       # NOTE: Loa
1a750 64 20 63 75 73 74 6f 6d 20 70 65 72 2d 75 73 65  d custom per-use
1a760 72 20 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73  r and/or per-hos
1a770 74 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20  t test settings 
1a780 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  now...        #.
1a790 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  .        if {[in
1a7a0 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f  fo exists ::tcl_
1a7b0 70 6c 61 74 66 6f 72 6d 28 75 73 65 72 29 5d 7d  platform(user)]}
1a7c0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1a7d0 20 20 20 73 65 74 20 75 73 65 72 53 65 74 74 69     set userSetti
1a7e0 6e 67 73 46 69 6c 65 4e 61 6d 65 20 5b 66 69 6c  ngsFileName [fil
1a7f0 65 20 6a 6f 69 6e 20 5b 67 65 74 43 6f 6d 6d 6f  e join [getCommo
1a800 6e 44 69 72 65 63 74 6f 72 79 5d 20 5c 0d 0a 20  nDirectory] \.. 
1a810 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 61 70               [ap
1a820 70 65 6e 64 41 72 67 73 20 73 65 74 74 69 6e 67  pendArgs setting
1a830 73 20 24 73 75 66 66 69 78 20 2e 20 24 3a 3a 74  s $suffix . $::t
1a840 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 75 73 65 72  cl_platform(user
1a850 29 20 2e 65 61 67 6c 65 5d 5d 0d 0a 0d 0a 20 20  ) .eagle]]....  
1a860 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c          if {[fil
1a870 65 20 65 78 69 73 74 73 20 24 75 73 65 72 53 65  e exists $userSe
1a880 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 5d 7d  ttingsFileName]}
1a890 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1a8a0 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
1a8b0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1a8c0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1a8d0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1a8e0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1a8f0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 6f          "---- lo
1a900 61 64 69 6e 67 20 70 65 72 2d 75 73 65 72 20 74  ading per-user t
1a910 65 73 74 20 73 65 74 74 69 6e 67 73 20 66 69 6c  est settings fil
1a920 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  e \"" \..       
1a930 20 20 20 20 20 20 20 20 20 20 20 24 75 73 65 72             $user
1a940 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65  SettingsFileName
1a950 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 20 20 20 20 20   \"...\n]..     
1a960 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1a970 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
1a980 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
1a990 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c      uplevel 1 [l
1a9a0 69 73 74 20 73 6f 75 72 63 65 20 24 75 73 65 72  ist source $user
1a9b0 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65  SettingsFileName
1a9c0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
1a9d0 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d   error]} then {.
1a9e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1a9f0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
1aa00 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1aa10 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1aa20 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1aa30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1aa40 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
1aa50 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 6c  ING: failed to l
1aa60 6f 61 64 20 70 65 72 2d 75 73 65 72 20 73 65 74  oad per-user set
1aa70 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c  tings file \"" \
1aa80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1aa90 20 20 20 20 20 20 24 75 73 65 72 53 65 74 74 69        $userSetti
1aaa0 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c  ngsFileName "\",
1aab0 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24   error: " \n\t $
1aac0 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20  error \n]..     
1aad0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1aae0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1aaf0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1ab00 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
1ab10 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
1ab20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
1ab30 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
1ab40 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
1ab50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
1ab60 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6c 6f 61 64  --- skipped load
1ab70 69 6e 67 20 70 65 72 2d 75 73 65 72 20 74 65 73  ing per-user tes
1ab80 74 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20  t settings file 
1ab90 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
1aba0 20 20 20 20 20 20 20 20 20 24 75 73 65 72 53 65           $userSe
1abb0 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22  ttingsFileName "
1abc0 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  \", it does not 
1abd0 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20  exist\n"]..     
1abe0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1abf0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1ac00 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 23 23 23  ....        ####
1ac10 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1ac20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1ac30 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1ac40 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1ac50 23 23 23 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69  ###....        i
1ac60 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
1ac70 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 68  ::tcl_platform(h
1ac80 6f 73 74 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ost)]} then {.. 
1ac90 20 20 20 20 20 20 20 20 20 73 65 74 20 68 6f 73           set hos
1aca0 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d  tSettingsFileNam
1acb0 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65  e [file join [ge
1acc0 74 43 6f 6d 6d 6f 6e 44 69 72 65 63 74 6f 72 79  tCommonDirectory
1acd0 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ] \..           
1ace0 20 20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 73     [appendArgs s
1acf0 65 74 74 69 6e 67 73 20 24 73 75 66 66 69 78 20  ettings $suffix 
1ad00 2e 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72  . $::tcl_platfor
1ad10 6d 28 68 6f 73 74 29 20 2e 65 61 67 6c 65 5d 5d  m(host) .eagle]]
1ad20 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
1ad30 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24   {[file exists $
1ad40 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65  hostSettingsFile
1ad50 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
1ad60 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
1ad70 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
1ad80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
1ad90 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
1ada0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
1adb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
1adc0 2d 2d 2d 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d  --- loading per-
1add0 68 6f 73 74 20 74 65 73 74 20 73 65 74 74 69 6e  host test settin
1ade0 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20  gs file \"" \.. 
1adf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae00 20 24 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69   $hostSettingsFi
1ae10 6c 65 4e 61 6d 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d  leName \"...\n].
1ae20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
1ae30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
1ae40 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
1ae50 20 20 20 20 20 20 20 20 20 20 75 70 6c 65 76 65            upleve
1ae60 6c 20 31 20 5b 6c 69 73 74 20 73 6f 75 72 63 65  l 1 [list source
1ae70 20 24 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69   $hostSettingsFi
1ae80 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20  leName]..       
1ae90 20 20 20 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74       } error]} t
1aea0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1aeb0 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
1aec0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1aed0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1aee0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
1aef0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1af00 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
1af10 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
1af20 64 20 74 6f 20 6c 6f 61 64 20 70 65 72 2d 68 6f  d to load per-ho
1af30 73 74 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65  st settings file
1af40 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
1af50 20 20 20 20 20 20 20 20 20 20 20 20 24 68 6f 73              $hos
1af60 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d  tSettingsFileNam
1af70 65 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20  e "\", error: " 
1af80 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
1af90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
1afa0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
1afb0 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
1afc0 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
1afd0 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
1afe0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1aff0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1b000 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1b010 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1b020 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65      "---- skippe
1b030 64 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d 68 6f  d loading per-ho
1b040 73 74 20 74 65 73 74 20 73 65 74 74 69 6e 67 73  st test settings
1b050 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20   file \"" \..   
1b060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
1b070 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65  hostSettingsFile
1b080 4e 61 6d 65 20 22 5c 22 2c 20 69 74 20 64 6f 65  Name "\", it doe
1b090 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d  s not exist\n"].
1b0a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
1b0b0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1b0c0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
1b0d0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
1b0e0 72 6f 63 20 72 75 6e 53 51 4c 69 74 65 54 65 73  roc runSQLiteTes
1b0f0 74 50 72 6f 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a  tPrologue {} {..
1b100 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
1b110 20 4e 4f 54 45 3a 20 53 6b 69 70 20 72 75 6e 6e   NOTE: Skip runn
1b120 69 6e 67 20 6f 75 72 20 63 75 73 74 6f 6d 20 70  ing our custom p
1b130 72 6f 6c 6f 67 75 65 20 69 66 20 74 68 65 20 6d  rologue if the m
1b140 61 69 6e 20 6f 6e 65 20 68 61 73 20 62 65 65 6e  ain one has been
1b150 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1b160 73 6b 69 70 70 65 64 2e 0d 0a 20 20 20 20 20 20  skipped...      
1b170 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69  #..      if {![i
1b180 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
1b190 70 72 6f 6c 6f 67 75 65 2e 65 61 67 6c 65 29 5d  prologue.eagle)]
1b1a0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1b1b0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
1b1c0 4f 54 45 3a 20 4c 6f 61 64 20 74 68 65 20 22 62  OTE: Load the "b
1b1d0 65 66 6f 72 65 2d 63 6f 6e 73 74 72 61 69 6e 74  efore-constraint
1b1e0 73 22 20 63 75 73 74 6f 6d 20 70 65 72 2d 75 73  s" custom per-us
1b1f0 65 72 20 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f  er and/or per-ho
1b200 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  st..        #   
1b210 20 20 20 20 74 65 73 74 20 73 65 74 74 69 6e 67      test setting
1b220 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20  s now...        
1b230 23 0d 0a 20 20 20 20 20 20 20 20 75 70 6c 65 76  #..        uplev
1b240 65 6c 20 31 20 5b 6c 69 73 74 20 6c 6f 61 64 53  el 1 [list loadS
1b250 51 4c 69 74 65 54 65 73 74 53 65 74 74 69 6e 67  QLiteTestSetting
1b260 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1b270 6c 20 2e 62 65 66 6f 72 65 5d 0d 0a 0d 0a 20 20  l .before]....  
1b280 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1b290 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
1b2a0 66 20 74 68 65 20 5b 6f 62 6a 65 63 74 5d 20 63  f the [object] c
1b2b0 6f 6d 6d 61 6e 64 20 69 73 20 61 76 61 69 6c 61  ommand is availa
1b2c0 62 6c 65 3b 20 69 66 20 6e 6f 74 2c 20 61 64 64  ble; if not, add
1b2d0 20 73 6f 6d 65 0d 0a 20 20 20 20 20 20 20 20 23   some..        #
1b2e0 20 20 20 20 20 20 20 73 68 69 6d 73 20 74 6f 20         shims to 
1b2f0 6d 61 6b 65 20 74 68 65 20 74 65 73 74 20 73 75  make the test su
1b300 69 74 65 20 72 75 6e 20 73 6d 6f 6f 74 68 65 72  ite run smoother
1b310 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1b320 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51        checkForSQ
1b330 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e  LiteObjectComman
1b340 64 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  d $::test_channe
1b350 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  l....        #..
1b360 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1b370 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 61  Determine the na
1b380 6d 65 73 20 6f 66 20 74 68 65 20 6e 61 74 69 76  mes of the nativ
1b390 65 20 70 6c 61 74 66 6f 72 6d 20 61 6e 64 20 61  e platform and a
1b3a0 72 63 68 69 74 65 63 74 75 72 65 2e 0d 0a 20 20  rchitecture...  
1b3b0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1b3c0 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 5b 67   set platform [g
1b3d0 65 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20  etBuildPlatform 
1b3e0 74 72 75 65 5d 0d 0a 20 20 20 20 20 20 20 20 73  true]..        s
1b3f0 65 74 20 61 72 63 68 69 74 65 63 74 75 72 65 20  et architecture 
1b400 5b 61 72 63 68 69 74 65 63 74 75 72 65 46 6f 72  [architectureFor
1b410 50 6c 61 74 66 6f 72 6d 20 24 70 6c 61 74 66 6f  Platform $platfo
1b420 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  rm]....        #
1b430 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1b440 3a 20 53 68 6f 77 20 74 68 65 20 70 6c 61 74 66  : Show the platf
1b450 6f 72 6d 20 61 6e 64 20 61 72 63 68 69 74 65 63  orm and architec
1b460 74 75 72 65 20 75 73 65 64 20 74 6f 20 68 65 6c  ture used to hel
1b470 70 20 6c 6f 63 61 74 65 20 74 68 65 0d 0a 20 20  p locate the..  
1b480 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61        #       na
1b490 74 69 76 65 20 62 75 69 6c 64 20 66 69 6c 65 73  tive build files
1b4a0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1b4b0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
1b4c0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
1b4d0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1b4e0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 70 6c 61         "---- pla
1b4f0 74 66 6f 72 6d 20 66 6f 72 20 6c 6f 63 61 74 69  tform for locati
1b500 6e 67 20 6e 61 74 69 76 65 20 62 75 69 6c 64 20  ng native build 
1b510 66 69 6c 65 73 20 69 73 20 5c 22 22 20 5c 0d 0a  files is \"" \..
1b520 20 20 20 20 20 20 20 20 20 20 20 20 24 70 6c 61              $pla
1b530 74 66 6f 72 6d 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20  tform \"\n].... 
1b540 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
1b550 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
1b560 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
1b570 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 61 72          "---- ar
1b580 63 68 69 74 65 63 74 75 72 65 20 66 6f 72 20 6c  chitecture for l
1b590 6f 63 61 74 69 6e 67 20 6e 61 74 69 76 65 20 62  ocating native b
1b5a0 75 69 6c 64 20 66 69 6c 65 73 20 69 73 20 5c 22  uild files is \"
1b5b0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
1b5c0 20 24 61 72 63 68 69 74 65 63 74 75 72 65 20 5c   $architecture \
1b5d0 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  "\n]....        
1b5e0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
1b5f0 45 3a 20 42 75 69 6c 64 20 61 20 6c 69 73 74 20  E: Build a list 
1b600 6f 66 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  of configuration
1b610 20 66 69 6c 65 73 20 74 68 61 74 20 77 65 20 68   files that we h
1b620 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  andle...        
1b630 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63  #..        set c
1b640 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 5b  onfigFileNames [
1b650 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  list \..        
1b660 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
1b670 53 51 4c 69 74 65 2e 64 6c 6c 2e 63 6f 6e 66 69  SQLite.dll.confi
1b680 67 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  g]....        #.
1b690 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
1b6a0 20 42 75 69 6c 64 20 61 20 6c 69 73 74 20 6f 66   Build a list of
1b6b0 20 61 75 78 69 6c 69 61 72 79 20 4d 61 6e 61 67   auxiliary Manag
1b6c0 65 64 20 44 65 62 75 67 67 69 6e 67 20 41 73 73  ed Debugging Ass
1b6d0 69 73 74 61 6e 74 73 20 28 4d 44 41 29 0d 0a 20  istants (MDA).. 
1b6e0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
1b6f0 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 69 6c  onfiguration fil
1b700 65 73 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c  es that we handl
1b710 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
1b720 20 20 20 20 20 20 20 73 65 74 20 6d 64 61 43 6f         set mdaCo
1b730 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 5b 6c  nfigFileNames [l
1b740 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ist \..         
1b750 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 33 32 2e     EagleShell32.
1b760 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 49  exe.mda.config I
1b770 6e 73 74 61 6c 6c 65 72 2e 65 78 65 2e 6d 64 61  nstaller.exe.mda
1b780 2e 63 6f 6e 66 69 67 20 5c 0d 0a 20 20 20 20 20  .config \..     
1b790 20 20 20 20 20 20 20 74 65 73 74 2e 65 78 65 2e         test.exe.
1b7a0 6d 64 61 2e 63 6f 6e 66 69 67 20 74 65 73 74 6c  mda.config testl
1b7b0 69 6e 71 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66  inq.exe.mda.conf
1b7c0 69 67 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ig \..          
1b7d0 20 20 74 65 73 74 65 66 36 2e 65 78 65 2e 6d 64    testef6.exe.md
1b7e0 61 2e 63 6f 6e 66 69 67 5d 0d 0a 0d 0a 20 20 20  a.config]....   
1b7f0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1b800 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68  # NOTE: Build th
1b810 65 20 6c 69 73 74 20 6f 66 20 65 78 74 65 72 6e  e list of extern
1b820 61 6c 20 66 69 6c 65 73 20 74 68 61 74 20 77 65  al files that we
1b830 20 68 61 6e 64 6c 65 2e 20 20 53 6f 6d 65 20 6f   handle.  Some o
1b840 66 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  f..        #    
1b850 20 20 20 74 68 65 73 65 20 66 69 6c 65 73 20 6d     these files m
1b860 61 79 20 62 65 20 6e 61 74 69 76 65 20 61 6e 64  ay be native and
1b870 2f 6f 72 20 6d 61 6e 61 67 65 64 20 61 73 73 65  /or managed asse
1b880 6d 62 6c 69 65 73 20 74 68 61 74 20 61 72 65 0d  mblies that are.
1b890 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
1b8a0 20 72 65 71 75 69 72 65 64 20 74 6f 20 70 65 72   required to per
1b8b0 66 6f 72 6d 20 76 61 72 69 6f 75 73 20 74 65 73  form various tes
1b8c0 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ts...        #..
1b8d0 20 20 20 20 20 20 20 20 73 65 74 20 65 78 74 65          set exte
1b8e0 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 73 20 5b 6c  rnalFileNames [l
1b8f0 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ist \..         
1b900 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 45 6e     [file join En
1b910 74 69 74 79 46 72 61 6d 65 77 6f 72 6b 20 6c 69  tityFramework li
1b920 62 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c  b [string map [l
1b930 69 73 74 20 46 78 20 22 22 5d 20 5b 73 74 72 69  ist Fx ""] [stri
1b940 6e 67 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ng \..          
1b950 20 20 6d 61 70 20 5b 6c 69 73 74 20 6e 65 74 46    map [list netF
1b960 78 34 35 31 20 6e 65 74 46 78 34 35 20 6e 65 74  x451 netFx45 net
1b970 46 78 34 35 32 20 6e 65 74 46 78 34 35 20 6e 65  Fx452 netFx45 ne
1b980 74 46 78 34 36 20 6e 65 74 46 78 34 35 20 5c 0d  tFx46 netFx45 \.
1b990 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 74  .            net
1b9a0 46 78 34 36 31 20 6e 65 74 46 78 34 35 5d 20 5b  Fx461 netFx45] [
1b9b0 67 65 74 42 75 69 6c 64 4e 65 74 46 78 5d 5d 5d  getBuildNetFx]]]
1b9c0 20 45 6e 74 69 74 79 46 72 61 6d 65 77 6f 72 6b   EntityFramework
1b9d0 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  .dll]]....      
1b9e0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
1b9f0 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 6c  OTE: Build the l
1ba00 69 73 74 20 6f 66 20 6e 61 74 69 76 65 20 61 73  ist of native as
1ba10 73 65 6d 62 6c 79 20 66 69 6c 65 73 20 74 68 61  sembly files tha
1ba20 74 20 77 65 20 68 61 6e 64 6c 65 2e 20 20 54 68  t we handle.  Th
1ba30 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
1ba40 20 20 20 72 65 61 73 6f 6e 20 74 68 65 20 22 53     reason the "S
1ba50 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
1ba60 65 2e 64 6c 6c 22 20 66 69 6c 65 20 69 73 20 69  e.dll" file is i
1ba70 6e 63 6c 75 64 65 64 20 68 65 72 65 20 69 73 0d  ncluded here is.
1ba80 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
1ba90 20 62 65 63 61 75 73 65 20 69 74 20 63 6f 75 6c   because it coul
1baa0 64 20 62 65 20 74 68 65 20 6d 69 78 65 64 2d 6d  d be the mixed-m
1bab0 6f 64 65 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20  ode assembly... 
1bac0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1bad0 20 20 73 65 74 20 6e 61 74 69 76 65 46 69 6c 65    set nativeFile
1bae0 4e 61 6d 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20  Names [list \.. 
1baf0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1bb00 65 33 2e 64 6c 6c 20 53 51 4c 69 74 65 2e 49 6e  e3.dll SQLite.In
1bb10 74 65 72 6f 70 2e 64 6c 6c 20 53 79 73 74 65 6d  terop.dll System
1bb20 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
1bb30 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
1bb40 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1bb50 42 75 69 6c 64 20 74 68 65 20 6c 69 73 74 20 6f  Build the list o
1bb60 66 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62  f managed assemb
1bb70 6c 79 20 66 69 6c 65 73 20 74 68 61 74 20 77 65  ly files that we
1bb80 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20   handle...      
1bb90 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74    #..        set
1bba0 20 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65   managedFileName
1bbb0 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20  s [list \..     
1bbc0 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
1bbd0 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 20 53 79  ta.SQLite.dll Sy
1bbe0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
1bbf0 2e 4c 69 6e 71 2e 64 6c 6c 20 5c 0d 0a 20 20 20  .Linq.dll \..   
1bc00 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
1bc10 44 61 74 61 2e 53 51 4c 69 74 65 2e 45 46 36 2e  Data.SQLite.EF6.
1bc20 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  dll]....        
1bc30 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
1bc40 45 3a 20 52 65 6d 6f 76 65 20 61 6e 79 20 74 65  E: Remove any te
1bc50 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  st constraints t
1bc60 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65  hat refer to the
1bc70 20 6e 61 74 69 76 65 20 61 6e 64 2f 6f 72 0d 0a   native and/or..
1bc80 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1bc90 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79  managed assembly
1bca0 20 66 69 6c 65 73 20 74 68 61 74 20 77 65 20 68   files that we h
1bcb0 61 6e 64 6c 65 20 75 6e 6c 65 73 73 20 66 6f 72  andle unless for
1bcc0 62 69 64 64 65 6e 20 66 72 6f 6d 0d 0a 20 20 20  bidden from..   
1bcd0 20 20 20 20 20 23 20 20 20 20 20 20 20 64 6f 69       #       doi
1bce0 6e 67 20 73 6f 2e 0d 0a 20 20 20 20 20 20 20 20  ng so...        
1bcf0 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  #..        if {!
1bd00 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
1bd10 6f 28 73 71 6c 69 74 65 52 65 6d 6f 76 65 43 6f  o(sqliteRemoveCo
1bd20 6e 73 74 72 61 69 6e 74 73 29 5d 7d 20 74 68 65  nstraints)]} the
1bd30 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66  n {..          f
1bd40 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
1bd50 24 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73  $configFileNames
1bd60 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1bd70 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74  removeConstraint
1bd80 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
1bd90 65 5f 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20  e_ $fileName].. 
1bda0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
1bdb0 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
1bdc0 66 69 6c 65 4e 61 6d 65 20 24 6d 64 61 43 6f 6e  fileName $mdaCon
1bdd0 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  figFileNames {..
1bde0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f              remo
1bdf0 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
1be00 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 24  pendArgs file_ $
1be10 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20  fileName]..     
1be20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1be30 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
1be40 4e 61 6d 65 20 24 65 78 74 65 72 6e 61 6c 46 69  Name $externalFi
1be50 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
1be60 20 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e         removeCon
1be70 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
1be80 72 67 73 20 66 69 6c 65 5f 20 5b 66 69 6c 65 20  rgs file_ [file 
1be90 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d  tail $fileName]]
1bea0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
1beb0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61  .          forea
1bec0 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74  ch fileName $nat
1bed0 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  iveFileNames {..
1bee0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f              remo
1bef0 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
1bf00 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 24  pendArgs file_ $
1bf10 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20  fileName]..     
1bf20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1bf30 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
1bf40 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64 46 69 6c  Name $managedFil
1bf50 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
1bf60 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73        removeCons
1bf70 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
1bf80 67 73 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61  gs file_ $fileNa
1bf90 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  me]..          }
1bfa0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
1bfb0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1bfc0 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 61    # NOTE: Skip a
1bfd0 6c 6c 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  ll System.Data.S
1bfe0 51 4c 69 74 65 20 72 65 6c 61 74 65 64 20 66 69  QLite related fi
1bff0 6c 65 20 68 61 6e 64 6c 69 6e 67 20 28 64 65 6c  le handling (del
1c000 65 74 69 6e 67 2c 0d 0a 20 20 20 20 20 20 20 20  eting,..        
1c010 23 20 20 20 20 20 20 20 63 6f 70 79 69 6e 67 2c  #       copying,
1c020 20 61 6e 64 20 6c 6f 61 64 69 6e 67 29 20 69 66   and loading) if
1c030 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20   instructed...  
1c040 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1c050 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
1c060 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 46 69  ts ::no(sqliteFi
1c070 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
1c080 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1c090 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b        # NOTE: Sk
1c0a0 69 70 20 74 72 79 69 6e 67 20 74 6f 20 64 65 6c  ip trying to del
1c0b0 65 74 65 20 61 6e 79 20 66 69 6c 65 73 20 69 66  ete any files if
1c0c0 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20   instructed...  
1c0d0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1c0e0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
1c0f0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65  exists ::no(dele
1c100 74 65 53 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d  teSqliteFiles)]}
1c110 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1c120 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
1c130 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65  exists ::no(dele
1c140 74 65 53 71 6c 69 74 65 43 6f 6e 66 69 67 46 69  teSqliteConfigFi
1c150 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
1c160 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
1c170 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 63  each fileName $c
1c180 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b  onfigFileNames {
1c190 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c1a0 20 20 74 72 79 44 65 6c 65 74 65 42 69 6e 61 72    tryDeleteBinar
1c1b0 79 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d  yFile $fileName.
1c1c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
1c1d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
1c1e0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
1c1f0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
1c200 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69   ::no(deleteSqli
1c210 74 65 45 78 74 65 72 6e 61 6c 46 69 6c 65 73 29  teExternalFiles)
1c220 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1c230 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
1c240 20 66 69 6c 65 4e 61 6d 65 20 24 6d 64 61 43 6f   fileName $mdaCo
1c250 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  nfigFileNames {.
1c260 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c270 20 74 72 79 44 65 6c 65 74 65 42 75 69 6c 64 46   tryDeleteBuildF
1c280 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20  ile $fileName.. 
1c290 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
1c2a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c2b0 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
1c2c0 20 24 65 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61   $externalFileNa
1c2d0 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
1c2e0 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65         tryDelete
1c2f0 42 69 6e 61 72 79 46 69 6c 65 20 24 66 69 6c 65  BinaryFile $file
1c300 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Name..          
1c310 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1c320 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1c330 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
1c340 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74  xists ::no(delet
1c350 65 53 71 6c 69 74 65 4e 61 74 69 76 65 46 69 6c  eSqliteNativeFil
1c360 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
1c370 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
1c380 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
1c390 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 49  no(deleteSqliteI
1c3a0 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d 20  mplicitFiles)]} 
1c3b0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1c3c0 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
1c3d0 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65  fileName $native
1c3e0 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
1c3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
1c400 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79  ryDeleteAssembly
1c410 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20   $fileName..    
1c420 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1c430 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
1c440 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c450 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
1c460 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c  s ::no(deleteSql
1c470 69 74 65 4e 6f 6e 49 6d 70 6c 69 63 69 74 46 69  iteNonImplicitFi
1c480 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
1c490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1c4a0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
1c4b0 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69   ::no(deleteSqli
1c4c0 74 65 50 6c 61 74 66 6f 72 6d 46 69 6c 65 73 29  tePlatformFiles)
1c4d0 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
1c4e0 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72              [str
1c4f0 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74  ing length $plat
1c500 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20  form] > 0} then 
1c510 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1c520 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
1c530 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c  eName $nativeFil
1c540 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
1c550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
1c560 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79 20  yDeleteAssembly 
1c570 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66  $fileName $platf
1c580 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  orm..           
1c590 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1c5a0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
1c5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1c5c0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
1c5d0 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69   ::no(deleteSqli
1c5e0 74 65 41 72 63 68 69 74 65 63 74 75 72 65 46 69  teArchitectureFi
1c5f0 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20  les)] && \..    
1c600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c610 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
1c620 61 72 63 68 69 74 65 63 74 75 72 65 5d 20 3e 20  architecture] > 
1c630 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
1c640 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
1c650 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e  each fileName $n
1c660 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b  ativeFileNames {
1c670 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c680 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 41        tryDeleteA
1c690 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d  ssembly $fileNam
1c6a0 65 20 24 61 72 63 68 69 74 65 63 74 75 72 65 0d  e $architecture.
1c6b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c6c0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
1c6d0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1c6e0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1c6f0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1c700 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
1c710 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65  o exists ::no(de
1c720 6c 65 74 65 53 71 6c 69 74 65 4d 61 6e 61 67 65  leteSqliteManage
1c730 64 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  dFiles)]} then {
1c740 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c750 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
1c760 20 24 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d   $managedFileNam
1c770 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
1c780 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 41        tryDeleteA
1c790 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d  ssembly $fileNam
1c7a0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
1c7b0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
1c7c0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
1c7d0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
1c7e0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
1c7f0 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20 22   Check for the "
1c800 61 75 74 6f 53 65 6c 65 63 74 22 20 72 75 6e 74  autoSelect" runt
1c810 69 6d 65 20 6f 70 74 69 6f 6e 2e 20 20 49 66 20  ime option.  If 
1c820 70 72 65 73 65 6e 74 2c 0d 0a 20 20 20 20 20 20  present,..      
1c830 20 20 20 20 23 20 20 20 20 20 20 20 61 74 74 65      #       atte
1c840 6d 70 74 20 74 6f 20 61 75 74 6f 6d 61 74 69 63  mpt to automatic
1c850 61 6c 6c 79 20 73 65 6c 65 63 74 20 74 68 65 20  ally select the 
1c860 66 69 72 73 74 20 61 76 61 69 6c 61 62 6c 65 0d  first available.
1c870 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
1c880 20 20 20 62 75 69 6c 64 20 28 6f 72 20 22 72 65     build (or "re
1c890 6c 65 61 73 65 22 29 20 6f 66 20 53 51 4c 69 74  lease") of SQLit
1c8a0 65 20 61 6e 64 20 53 79 73 74 65 6d 2e 44 61 74  e and System.Dat
1c8b0 61 2e 53 51 4c 69 74 65 0d 0a 20 20 20 20 20 20  a.SQLite..      
1c8c0 20 20 20 20 23 20 20 20 20 20 20 20 66 6f 72 20      #       for 
1c8d0 75 73 65 20 77 69 74 68 20 74 68 65 20 74 65 73  use with the tes
1c8e0 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20  t suite...      
1c8f0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1c900 20 69 66 20 7b 5b 68 61 73 52 75 6e 74 69 6d 65   if {[hasRuntime
1c910 4f 70 74 69 6f 6e 20 61 75 74 6f 53 65 6c 65 63  Option autoSelec
1c920 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  t]} then {..    
1c930 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 63 68          if {![ch
1c940 65 63 6b 46 6f 72 53 51 4c 69 74 65 42 75 69 6c  eckForSQLiteBuil
1c950 64 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ds $::test_chann
1c960 65 6c 20 74 72 75 65 5d 7d 20 74 68 65 6e 20 7b  el true]} then {
1c970 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c980 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 52 65  checkForSQLiteRe
1c990 6c 65 61 73 65 73 20 24 3a 3a 74 65 73 74 5f 63  leases $::test_c
1c9a0 68 61 6e 6e 65 6c 20 74 72 75 65 0d 0a 20 20 20  hannel true..   
1c9b0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1c9c0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1c9d0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1c9e0 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74    # NOTE: Skip t
1c9f0 72 79 69 6e 67 20 74 6f 20 76 65 72 69 66 79 20  rying to verify 
1ca00 74 68 65 20 62 75 69 6c 64 20 64 69 72 65 63 74  the build direct
1ca10 6f 72 79 20 69 66 20 69 6e 73 74 72 75 63 74 65  ory if instructe
1ca20 64 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  d;..          # 
1ca30 20 20 20 20 20 20 6f 74 68 65 72 77 69 73 65 2c        otherwise,
1ca40 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20 61 63   make sure it ac
1ca50 74 75 61 6c 6c 79 20 65 78 69 73 74 73 20 6f 72  tually exists or
1ca60 20 68 61 6c 74 20 74 68 65 20 65 6e 74 69 72 65   halt the entire
1ca70 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
1ca80 20 20 20 20 74 65 73 74 69 6e 67 20 70 72 6f 63      testing proc
1ca90 65 73 73 20 69 66 20 69 74 20 64 6f 65 73 20 6e  ess if it does n
1caa0 6f 74 20 65 78 69 73 74 2e 0d 0a 20 20 20 20 20  ot exist...     
1cab0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1cac0 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
1cad0 73 74 73 20 3a 3a 6e 6f 28 76 65 72 69 66 79 42  sts ::no(verifyB
1cae0 75 69 6c 64 44 69 72 65 63 74 6f 72 79 29 5d 7d  uildDirectory)]}
1caf0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1cb00 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1cb10 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 20 74      # NOTE: At t
1cb20 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 62  his point, the b
1cb30 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20 4d  uild directory M
1cb40 55 53 54 20 65 78 69 73 74 20 61 73 20 61 0d 0a  UST exist as a..
1cb50 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
1cb60 20 20 20 20 76 61 6c 69 64 20 64 69 72 65 63 74      valid direct
1cb70 6f 72 79 20 66 6f 72 20 74 68 65 20 74 65 73 74  ory for the test
1cb80 69 6e 67 20 70 72 6f 63 65 73 73 20 74 6f 20 63  ing process to c
1cb90 6f 6e 74 69 6e 75 65 2e 0d 0a 20 20 20 20 20 20  ontinue...      
1cba0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1cbb0 20 20 20 20 20 73 65 74 20 64 69 72 65 63 74 6f       set directo
1cbc0 72 79 20 5b 67 65 74 42 75 69 6c 64 44 69 72 65  ry [getBuildDire
1cbd0 63 74 6f 72 79 5d 0d 0a 0d 0a 20 20 20 20 20 20  ctory]....      
1cbe0 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65        if {![file
1cbf0 20 65 78 69 73 74 73 20 24 64 69 72 65 63 74 6f   exists $directo
1cc00 72 79 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20  ry] || \..      
1cc10 20 20 20 20 20 20 20 20 20 20 21 5b 66 69 6c 65            ![file
1cc20 20 69 73 64 69 72 65 63 74 6f 72 79 20 24 64 69   isdirectory $di
1cc30 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b  rectory]} then {
1cc40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1cc50 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
1cc60 20 23 20 4e 4f 54 45 3a 20 4a 75 73 74 20 70 72   # NOTE: Just pr
1cc70 69 6f 72 20 74 6f 20 61 63 74 75 61 6c 6c 79 20  ior to actually 
1cc80 68 61 6c 74 69 6e 67 20 74 68 65 20 74 65 73 74  halting the test
1cc90 69 6e 67 20 70 72 6f 63 65 73 73 2c 0d 0a 20 20  ing process,..  
1cca0 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
1ccb0 20 20 20 20 61 64 64 20 61 6e 20 65 72 72 6f 72      add an error
1ccc0 20 74 6f 20 74 68 65 20 74 65 73 74 20 6c 6f 67   to the test log
1ccd0 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20   file...        
1cce0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1ccf0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
1cd00 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
1cd10 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
1cd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
1cd30 2d 2d 2d 20 63 6f 75 6c 64 20 6e 6f 74 20 76 65  --- could not ve
1cd40 72 69 66 79 20 62 75 69 6c 64 20 64 69 72 65 63  rify build direc
1cd50 74 6f 72 79 20 5c 22 22 20 24 64 69 72 65 63 74  tory \"" $direct
1cd60 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ory \..         
1cd70 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 61 6c           "\", al
1cd80 6c 20 74 65 73 74 69 6e 67 20 68 61 6c 74 65 64  l testing halted
1cd90 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  \n"]....        
1cda0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1cdb0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52         # NOTE: R
1cdc0 61 69 73 69 6e 67 20 61 20 73 63 72 69 70 74 20  aising a script 
1cdd0 65 72 72 6f 72 20 66 72 6f 6d 20 74 68 69 73 20  error from this 
1cde0 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 68 61 6c  point should hal
1cdf0 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t..             
1ce00 20 23 20 20 20 20 20 20 20 74 68 65 20 74 65 73   #       the tes
1ce10 74 69 6e 67 20 70 72 6f 63 65 73 73 2e 0d 0a 20  ting process... 
1ce20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
1ce30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72                er
1ce40 72 6f 72 20 5b 61 70 70 65 6e 64 41 72 67 73 20  ror [appendArgs 
1ce50 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1ce60 20 20 20 20 20 22 63 6f 75 6c 64 20 6e 6f 74 20       "could not 
1ce70 76 65 72 69 66 79 20 62 75 69 6c 64 20 64 69 72  verify build dir
1ce80 65 63 74 6f 72 79 20 5c 22 22 20 24 64 69 72 65  ectory \"" $dire
1ce90 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20  ctory \..       
1cea0 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20             "\", 
1ceb0 61 6c 6c 20 74 65 73 74 69 6e 67 20 68 61 6c 74  all testing halt
1cec0 65 64 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  ed"]..          
1ced0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
1cee0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  ....          #.
1cef0 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
1cf00 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74  E: Skip trying t
1cf10 6f 20 63 6f 70 79 20 61 6e 79 20 66 69 6c 65 73  o copy any files
1cf20 20 69 66 20 69 6e 73 74 72 75 63 74 65 64 2e 0d   if instructed..
1cf30 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
1cf40 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
1cf50 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63  fo exists ::no(c
1cf60 6f 70 79 53 71 6c 69 74 65 46 69 6c 65 73 29 5d  opySqliteFiles)]
1cf70 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1cf80 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
1cf90 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70   exists ::no(cop
1cfa0 79 53 71 6c 69 74 65 43 6f 6e 66 69 67 46 69 6c  ySqliteConfigFil
1cfb0 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
1cfc0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
1cfd0 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 63 6f  ach fileName $co
1cfe0 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  nfigFileNames {.
1cff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d000 20 74 72 79 43 6f 70 79 42 75 69 6c 64 46 69 6c   tryCopyBuildFil
1d010 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  e $fileName..   
1d020 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
1d030 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
1d040 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
1d050 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
1d060 6f 28 63 6f 70 79 53 71 6c 69 74 65 45 78 74 65  o(copySqliteExte
1d070 72 6e 61 6c 46 69 6c 65 73 29 5d 7d 20 74 68 65  rnalFiles)]} the
1d080 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1d090 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1d0a0 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 70 79      # NOTE: Copy
1d0b0 20 74 68 65 20 4d 61 6e 61 67 65 64 20 44 65 62   the Managed Deb
1d0c0 75 67 67 69 6e 67 20 41 73 73 69 73 74 61 6e 74  ugging Assistant
1d0d0 73 20 28 4d 44 41 29 20 63 6f 6e 66 69 67 75 72  s (MDA) configur
1d0e0 61 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20  ation..         
1d0f0 20 20 20 20 20 23 20 20 20 20 20 20 20 66 69 6c       #       fil
1d100 65 20 66 6f 72 20 74 68 65 20 45 61 67 6c 65 20  e for the Eagle 
1d110 73 68 65 6c 6c 20 74 6f 20 74 68 65 20 62 75 69  shell to the bui
1d120 6c 64 20 6f 75 74 70 75 74 20 64 69 72 65 63 74  ld output direct
1d130 6f 72 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ory,..          
1d140 20 20 20 20 23 20 20 20 20 20 20 20 77 68 69 6c      #       whil
1d150 65 20 75 73 69 6e 67 20 65 61 63 68 20 6f 66 20  e using each of 
1d160 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65  the names of the
1d170 20 76 61 72 69 6f 75 73 20 6c 65 67 61 63 79 20   various legacy 
1d180 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20 20 20  test..          
1d190 20 20 20 20 23 20 20 20 20 20 20 20 65 78 65 63      #       exec
1d1a0 75 74 61 62 6c 65 73 2e 20 20 54 68 69 73 20 77  utables.  This w
1d1b0 69 6c 6c 20 68 65 6c 70 20 74 6f 20 6d 61 6b 65  ill help to make
1d1c0 20 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20 74   sure that all t
1d1d0 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  he..            
1d1e0 20 20 23 20 20 20 20 20 20 20 6c 65 67 61 63 79    #       legacy
1d1f0 20 74 65 73 74 73 20 72 75 6e 20 77 69 74 68 20   tests run with 
1d200 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65  exactly the same
1d210 20 73 65 74 20 6f 66 20 4d 61 6e 61 67 65 64 0d   set of Managed.
1d220 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
1d230 20 20 20 20 20 20 20 44 65 62 75 67 67 69 6e 67         Debugging
1d240 20 41 73 73 69 73 74 61 6e 74 73 20 63 6f 6e 66   Assistants conf
1d250 69 67 75 72 65 64 2e 0d 0a 20 20 20 20 20 20 20  igured...       
1d260 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1d270 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
1d280 66 69 6c 65 4e 61 6d 65 20 24 6d 64 61 43 6f 6e  fileName $mdaCon
1d290 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  figFileNames {..
1d2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d2b0 74 72 79 43 6f 70 79 42 69 6e 61 72 79 46 69 6c  tryCopyBinaryFil
1d2c0 65 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65  e EagleShell.exe
1d2d0 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 22 22 20 24  .mda.config "" $
1d2e0 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20  fileName..      
1d2f0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1d300 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
1d310 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
1d320 54 45 3a 20 43 6f 70 79 20 74 68 65 20 65 78 74  TE: Copy the ext
1d330 65 72 6e 61 6c 20 62 69 6e 61 72 69 65 73 2c 20  ernal binaries, 
1d340 69 66 20 61 6e 79 2c 20 74 6f 20 74 68 65 20 64  if any, to the d
1d350 69 72 65 63 74 6f 72 79 20 74 68 61 74 0d 0a 20  irectory that.. 
1d360 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
1d370 20 20 20 20 20 63 6f 6e 74 61 69 6e 73 20 74 68       contains th
1d380 65 20 45 61 67 6c 65 20 73 68 65 6c 6c 2e 20 20  e Eagle shell.  
1d390 54 68 69 73 20 69 73 20 74 79 70 69 63 61 6c 6c  This is typicall
1d3a0 79 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 0d 0a  y used to make..
1d3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
1d3c0 20 20 20 20 20 20 73 75 72 65 20 61 73 73 65 6d        sure assem
1d3d0 62 6c 69 65 73 20 72 65 66 65 72 65 6e 63 65 64  blies referenced
1d3e0 20 62 79 20 74 68 65 20 6f 6e 65 73 20 62 65 69   by the ones bei
1d3f0 6e 67 20 74 65 73 74 65 64 20 61 72 65 0d 0a 20  ng tested are.. 
1d400 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
1d410 20 20 20 20 20 61 76 61 69 6c 61 62 6c 65 20 64       available d
1d420 75 72 69 6e 67 20 74 68 65 20 74 65 73 74 69 6e  uring the testin
1d430 67 20 70 72 6f 63 65 73 73 2e 0d 0a 20 20 20 20  g process...    
1d440 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1d450 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61             forea
1d460 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 65 78 74  ch fileName $ext
1d470 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 73 20 7b  ernalFileNames {
1d480 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1d490 20 20 74 72 79 43 6f 70 79 45 78 74 65 72 6e 61    tryCopyExterna
1d4a0 6c 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d  lFile $fileName.
1d4b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
1d4c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
1d4d0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
1d4e0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
1d4f0 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65   ::no(copySqlite
1d500 4e 61 74 69 76 65 46 69 6c 65 73 29 5d 7d 20 74  NativeFiles)]} t
1d510 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1d520 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1d530 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
1d540 20 74 68 65 20 74 65 73 74 20 70 6c 61 74 66 6f   the test platfo
1d550 72 6d 20 69 73 20 6c 69 6b 65 6c 79 20 74 68 65  rm is likely the
1d560 20 64 65 66 61 75 6c 74 20 66 6f 72 20 74 68 69   default for thi
1d570 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s..             
1d580 20 23 20 20 20 20 20 20 20 6d 61 63 68 69 6e 65   #       machine
1d590 2c 20 61 6c 73 6f 20 74 72 79 20 74 6f 20 63 6f  , also try to co
1d5a0 70 79 20 74 68 65 20 6e 61 74 69 76 65 20 66 69  py the native fi
1d5b0 6c 65 73 20 74 6f 20 74 68 65 0d 0a 20 20 20 20  les to the..    
1d5c0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
1d5d0 20 20 62 69 6e 61 72 79 20 6c 6f 63 61 74 69 6f    binary locatio
1d5e0 6e 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n...            
1d5f0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1d600 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
1d610 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71  ists ::no(copySq
1d620 6c 69 74 65 49 6d 70 6c 69 63 69 74 46 69 6c 65  liteImplicitFile
1d630 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  s)] && \..      
1d640 20 20 20 20 20 20 20 20 20 20 20 20 5b 69 73 44              [isD
1d650 65 66 61 75 6c 74 42 75 69 6c 64 50 6c 61 74 66  efaultBuildPlatf
1d660 6f 72 6d 20 74 72 75 65 5d 7d 20 74 68 65 6e 20  orm true]} then 
1d670 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1d680 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
1d690 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e  ame $nativeFileN
1d6a0 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
1d6b0 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70            tryCop
1d6c0 79 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e  yAssembly $fileN
1d6d0 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ame..           
1d6e0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1d6f0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1d700 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
1d710 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
1d720 63 6f 70 79 53 71 6c 69 74 65 4e 6f 6e 49 6d 70  copySqliteNonImp
1d730 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d 20 74 68  licitFiles)]} th
1d740 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1d750 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
1d760 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70   exists ::no(cop
1d770 79 53 71 6c 69 74 65 50 6c 61 74 66 6f 72 6d 46  ySqlitePlatformF
1d780 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20  iles)] && \..   
1d790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7a0 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
1d7b0 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20  $platform] > 0} 
1d7c0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1d7d0 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
1d7e0 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69  h fileName $nati
1d7f0 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  veFileNames {.. 
1d800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d810 20 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62     tryCopyAssemb
1d820 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c  ly $fileName $pl
1d830 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20  atform..        
1d840 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1d850 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
1d860 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1d870 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
1d880 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c  sts ::no(copySql
1d890 69 74 65 41 72 63 68 69 74 65 63 74 75 72 65 46  iteArchitectureF
1d8a0 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20  iles)] && \..   
1d8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8c0 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
1d8d0 24 61 72 63 68 69 74 65 63 74 75 72 65 5d 20 3e  $architecture] >
1d8e0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1d8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
1d900 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
1d910 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20  nativeFileNames 
1d920 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1d930 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 41 73         tryCopyAs
1d940 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65  sembly $fileName
1d950 20 24 61 72 63 68 69 74 65 63 74 75 72 65 0d 0a   $architecture..
1d960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d970 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
1d980 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1d990 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1d9a0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1d9b0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
1d9c0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70   exists ::no(cop
1d9d0 79 53 71 6c 69 74 65 4d 61 6e 61 67 65 64 46 69  ySqliteManagedFi
1d9e0 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
1d9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
1da00 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d  each fileName $m
1da10 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73 20  anagedFileNames 
1da20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1da30 20 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62     tryCopyAssemb
1da40 6c 79 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20  ly $fileName..  
1da50 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1da60 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
1da70 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1da80 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1da90 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70      # NOTE: Skip
1daa0 20 74 72 79 69 6e 67 20 74 6f 20 6c 6f 61 64 20   trying to load 
1dab0 61 6e 79 20 66 69 6c 65 73 20 69 66 20 69 6e 73  any files if ins
1dac0 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20 20 20  tructed...      
1dad0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1dae0 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
1daf0 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69  ts ::no(loadSqli
1db00 74 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  teFiles)]} then 
1db10 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
1db20 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
1db30 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65   ::no(loadSqlite
1db40 49 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d  ImplicitFiles)]}
1db50 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1db60 20 20 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73         tryLoadAs
1db70 73 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61  sembly System.Da
1db80 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 0d 0a 20  ta.SQLite.dll.. 
1db90 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
1dba0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
1dbb0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
1dbc0 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 4c 69 6e  no(loadSqliteLin
1dbd0 71 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  qFiles)]} then {
1dbe0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1dbf0 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20  tryLoadAssembly 
1dc00 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
1dc10 74 65 2e 4c 69 6e 71 2e 64 6c 6c 0d 0a 20 20 20  te.Linq.dll..   
1dc20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
1dc30 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
1dc40 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
1dc50 28 6c 6f 61 64 53 71 6c 69 74 65 45 66 36 46 69  (loadSqliteEf6Fi
1dc60 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
1dc70 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
1dc80 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20 53 79 73  LoadAssembly Sys
1dc90 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
1dca0 45 46 36 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20  EF6.dll..       
1dcb0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1dcc0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
1dcd0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61   exists ::no(loa
1dce0 64 53 71 6c 69 74 65 4e 6f 6e 49 6d 70 6c 69 63  dSqliteNonImplic
1dcf0 69 74 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  itFiles)]} then 
1dd00 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1dd10 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
1dd20 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69  ts ::no(loadSqli
1dd30 74 65 50 6c 61 74 66 6f 72 6d 46 69 6c 65 73 29  tePlatformFiles)
1dd40 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
1dd50 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
1dd60 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f  g length $platfo
1dd70 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  rm] > 0} then {.
1dd80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1dd90 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79   tryLoadAssembly
1dda0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
1ddb0 69 74 65 2e 64 6c 6c 20 24 70 6c 61 74 66 6f 72  ite.dll $platfor
1ddc0 6d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m..             
1ddd0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
1dde0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
1ddf0 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53  xists ::no(loadS
1de00 71 6c 69 74 65 41 72 63 68 69 74 65 63 74 75 72  qliteArchitectur
1de10 65 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20  eFiles)] && \.. 
1de20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de30 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
1de40 24 61 72 63 68 69 74 65 63 74 75 72 65 5d 20 3e  $architecture] >
1de50 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1de60 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 4c              tryL
1de70 6f 61 64 41 73 73 65 6d 62 6c 79 20 53 79 73 74  oadAssembly Syst
1de80 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
1de90 6c 6c 20 24 61 72 63 68 69 74 65 63 74 75 72 65  ll $architecture
1dea0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1deb0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
1dec0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1ded0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1dee0 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
1def0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
1df00 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
1df10 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
1df20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
1df30 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20  file version of 
1df40 5c 22 73 71 6c 69 74 65 33 2e 64 6c 6c 5c 22 2e  \"sqlite3.dll\".
1df50 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  .. " \..        
1df60 20 20 20 20 20 20 5b 66 69 6c 65 20 76 65 72 73        [file vers
1df70 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69  ion [getBinaryFi
1df80 6c 65 4e 61 6d 65 20 73 71 6c 69 74 65 33 2e 64  leName sqlite3.d
1df90 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  ll]] \n]..      
1dfa0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63    }....        c
1dfb0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
1dfc0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
1dfd0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1dfe0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1dff0 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20       "---- file 
1e000 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53 51 4c  version of \"SQL
1e010 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 5c  ite.Interop.dll\
1e020 22 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20  "... " \..      
1e030 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 76 65          [file ve
1e040 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79  rsion [getBinary
1e050 46 69 6c 65 4e 61 6d 65 20 53 51 4c 69 74 65 2e  FileName SQLite.
1e060 49 6e 74 65 72 6f 70 2e 64 6c 6c 5d 5d 20 5c 6e  Interop.dll]] \n
1e070 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  ]..        }....
1e080 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d          catch {.
1e090 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
1e0a0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1e0b0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1e0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
1e0d0 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e  --- file version
1e0e0 20 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44 61 74   of \"System.Dat
1e0f0 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e  a.SQLite.dll\"..
1e100 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  . " \..         
1e110 20 20 20 20 20 5b 66 69 6c 65 20 76 65 72 73 69       [file versi
1e120 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c  on [getBinaryFil
1e130 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74  eName System.Dat
1e140 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d 5d 20 5c  a.SQLite.dll]] \
1e150 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  n]..        }...
1e160 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b  .        catch {
1e170 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
1e180 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1e190 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1e1a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
1e1b0 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f  ---- file versio
1e1c0 6e 20 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44 61  n of \"System.Da
1e1d0 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64  ta.SQLite.Linq.d
1e1e0 6c 6c 5c 22 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20  ll\"... " \..   
1e1f0 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
1e200 20 76 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e   version [getBin
1e210 61 72 79 46 69 6c 65 4e 61 6d 65 20 53 79 73 74  aryFileName Syst
1e220 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c  em.Data.SQLite.L
1e230 69 6e 71 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20  inq.dll]] \n].. 
1e240 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1e250 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
1e260 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
1e270 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
1e280 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
1e290 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
1e2a0 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20  file version of 
1e2b0 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  \"System.Data.SQ
1e2c0 4c 69 74 65 2e 45 46 36 2e 64 6c 6c 5c 22 2e 2e  Lite.EF6.dll\"..
1e2d0 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  . " \..         
1e2e0 20 20 20 20 20 5b 66 69 6c 65 20 76 65 72 73 69       [file versi
1e2f0 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c  on [getBinaryFil
1e300 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74  eName System.Dat
1e310 61 2e 53 51 4c 69 74 65 2e 45 46 36 2e 64 6c 6c  a.SQLite.EF6.dll
1e320 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ]] \n]..        
1e330 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
1e340 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
1e350 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20  $platform] > 0} 
1e360 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1e370 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20    catch {..     
1e380 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
1e390 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
1e3a0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
1e3b0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
1e3c0 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f  - file version o
1e3d0 66 20 5c 22 22 20 24 70 6c 61 74 66 6f 72 6d 20  f \"" $platform 
1e3e0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1e3f0 20 20 20 22 2f 73 71 6c 69 74 65 33 2e 64 6c 6c     "/sqlite3.dll
1e400 5c 22 2e 2e 2e 20 22 20 5b 66 69 6c 65 20 76 65  \"... " [file ve
1e410 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20  rsion \..       
1e420 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e           [getBin
1e430 61 72 79 46 69 6c 65 4e 61 6d 65 20 73 71 6c 69  aryFileName sqli
1e440 74 65 33 2e 64 6c 6c 20 24 70 6c 61 74 66 6f 72  te3.dll $platfor
1e450 6d 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  m]] \n]..       
1e460 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1e470 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20    catch {..     
1e480 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
1e490 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
1e4a0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
1e4b0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
1e4c0 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f  - file version o
1e4d0 66 20 5c 22 22 20 24 70 6c 61 74 66 6f 72 6d 20  f \"" $platform 
1e4e0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1e4f0 20 20 20 22 2f 53 51 4c 69 74 65 2e 49 6e 74 65     "/SQLite.Inte
1e500 72 6f 70 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5b  rop.dll\"... " [
1e510 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a  file version \..
1e520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e530 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61  [getBinaryFileNa
1e540 6d 65 20 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f  me SQLite.Intero
1e550 70 2e 64 6c 6c 20 24 70 6c 61 74 66 6f 72 6d 5d  p.dll $platform]
1e560 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  ] \n]..         
1e570 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
1e580 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
1e590 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
1e5a0 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
1e5b0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1e5c0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
1e5d0 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20  file version of 
1e5e0 5c 22 22 20 24 70 6c 61 74 66 6f 72 6d 20 5c 0d  \"" $platform \.
1e5f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e600 20 22 2f 53 79 73 74 65 6d 2e 44 61 74 61 2e 53   "/System.Data.S
1e610 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22  QLite.dll\"... "
1e620 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c   [file version \
1e630 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1e640 20 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65    [getBinaryFile
1e650 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74 61  Name System.Data
1e660 2e 53 51 4c 69 74 65 2e 64 6c 6c 20 24 70 6c 61  .SQLite.dll $pla
1e670 74 66 6f 72 6d 5d 5d 20 5c 6e 5d 0d 0a 20 20 20  tform]] \n]..   
1e680 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1e690 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69    }....        i
1e6a0 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
1e6b0 68 20 24 61 72 63 68 69 74 65 63 74 75 72 65 5d  h $architecture]
1e6c0 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
1e6d0 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d          catch {.
1e6e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
1e6f0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
1e700 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1e710 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1e720 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72    "---- file ver
1e730 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24 61 72 63  sion of \"" $arc
1e740 68 69 74 65 63 74 75 72 65 20 5c 0d 0a 20 20 20  hitecture \..   
1e750 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2f 73               "/s
1e760 71 6c 69 74 65 33 2e 64 6c 6c 5c 22 2e 2e 2e 20  qlite3.dll\"... 
1e770 22 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20  " [file version 
1e780 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1e790 20 20 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c     [getBinaryFil
1e7a0 65 4e 61 6d 65 20 73 71 6c 69 74 65 33 2e 64 6c  eName sqlite3.dl
1e7b0 6c 20 24 61 72 63 68 69 74 65 63 74 75 72 65 5d  l $architecture]
1e7c0 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  ] \n]..         
1e7d0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
1e7e0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
1e7f0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
1e800 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
1e810 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1e820 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
1e830 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20  file version of 
1e840 5c 22 22 20 24 61 72 63 68 69 74 65 63 74 75 72  \"" $architectur
1e850 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
1e860 20 20 20 20 20 22 2f 53 51 4c 69 74 65 2e 49 6e       "/SQLite.In
1e870 74 65 72 6f 70 2e 64 6c 6c 5c 22 2e 2e 2e 20 22  terop.dll\"... "
1e880 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c   [file version \
1e890 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1e8a0 20 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65    [getBinaryFile
1e8b0 4e 61 6d 65 20 53 51 4c 69 74 65 2e 49 6e 74 65  Name SQLite.Inte
1e8c0 72 6f 70 2e 64 6c 6c 20 24 61 72 63 68 69 74 65  rop.dll $archite
1e8d0 63 74 75 72 65 5d 5d 20 5c 6e 5d 0d 0a 20 20 20  cture]] \n]..   
1e8e0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1e8f0 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20        catch {.. 
1e900 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1e910 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1e920 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1e930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e940 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69  "---- file versi
1e950 6f 6e 20 6f 66 20 5c 22 22 20 24 61 72 63 68 69  on of \"" $archi
1e960 74 65 63 74 75 72 65 20 5c 0d 0a 20 20 20 20 20  tecture \..     
1e970 20 20 20 20 20 20 20 20 20 20 20 22 2f 53 79 73             "/Sys
1e980 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
1e990 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5b 66 69 6c 65  dll\"... " [file
1e9a0 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20   version \..    
1e9b0 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
1e9c0 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 53  BinaryFileName S
1e9d0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
1e9e0 65 2e 64 6c 6c 20 24 61 72 63 68 69 74 65 63 74  e.dll $architect
1e9f0 75 72 65 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20  ure]] \n]..     
1ea00 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1ea10 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  }....        #..
1ea20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1ea30 47 72 61 62 20 74 68 65 20 6c 69 73 74 20 6f 66  Grab the list of
1ea40 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c   managed assembl
1ea50 69 65 73 20 66 6f 72 20 74 68 65 20 63 75 72 72  ies for the curr
1ea60 65 6e 74 20 70 72 6f 63 65 73 73 0d 0a 20 20 20  ent process..   
1ea70 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6e 64       #       and
1ea80 20 72 65 70 6f 72 74 20 6f 6e 20 74 68 65 20 53   report on the S
1ea90 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
1eaa0 65 20 72 65 6c 61 74 65 64 20 6f 6e 65 73 2e 0d  e related ones..
1eab0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1eac0 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c      if {[haveSQL
1ead0 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64  iteObjectCommand
1eae0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1eaf0 20 20 20 20 20 73 65 74 20 61 73 73 65 6d 62 6c       set assembl
1eb00 69 65 73 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f  ies [object invo
1eb10 6b 65 20 41 70 70 44 6f 6d 61 69 6e 2e 43 75 72  ke AppDomain.Cur
1eb20 72 65 6e 74 44 6f 6d 61 69 6e 20 47 65 74 41 73  rentDomain GetAs
1eb30 73 65 6d 62 6c 69 65 73 5d 0d 0a 0d 0a 20 20 20  semblies]....   
1eb40 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f         object fo
1eb50 72 65 61 63 68 20 61 73 73 65 6d 62 6c 79 20 24  reach assembly $
1eb60 61 73 73 65 6d 62 6c 69 65 73 20 7b 0d 0a 20 20  assemblies {..  
1eb70 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73            if {[s
1eb80 74 72 69 6e 67 20 6d 61 74 63 68 20 5c 7b 53 79  tring match \{Sy
1eb90 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
1eba0 2a 20 24 61 73 73 65 6d 62 6c 79 5d 7d 20 74 68  * $assembly]} th
1ebb0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1ebc0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
1ebd0 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
1ebe0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1ebf0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
1ec00 20 66 6f 75 6e 64 20 6c 6f 61 64 65 64 20 61 73   found loaded as
1ec10 73 65 6d 62 6c 79 3a 20 22 20 24 61 73 73 65 6d  sembly: " $assem
1ec20 62 6c 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  bly \n]..       
1ec30 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1ec40 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
1ec50 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20  ..        catch 
1ec60 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
1ec70 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
1ec80 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  el \..          
1ec90 20 20 20 20 22 2d 2d 2d 2d 20 64 65 66 69 6e 65      "---- define
1eca0 20 63 6f 6e 73 74 61 6e 74 73 20 66 6f 72 20 5c   constants for \
1ecb0 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  "System.Data.SQL
1ecc0 69 74 65 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a 20 20  ite\"... "....  
1ecd0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
1ece0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
1ecf0 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
1ed00 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
1ed10 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
1ed20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
1ed30 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20  .SQLite.SQLite3 
1ed40 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73 0d  DefineConstants.
1ed50 0a 20 20 20 20 20 20 20 20 20 20 7d 20 64 65 66  .          } def
1ed60 69 6e 65 43 6f 6e 73 74 61 6e 74 73 5d 20 3d 3d  ineConstants] ==
1ed70 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1ed80 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
1ed90 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
1eda0 70 70 65 6e 64 41 72 67 73 20 5b 66 6f 72 6d 61  ppendArgs [forma
1edb0 74 4c 69 73 74 20 5b 6c 73 6f 72 74 20 5c 0d 0a  tList [lsort \..
1edc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edd0 24 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73  $defineConstants
1ede0 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a 20  ] <none>] \n].. 
1edf0 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
1ee00 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
1ee10 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
1ee20 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a  nnel unknown\n..
1ee30 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1ee40 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1ee50 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20    catch {..     
1ee60 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
1ee70 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20  st_channel \..  
1ee80 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
1ee90 2d 20 73 6f 75 72 63 65 20 76 65 72 73 69 6f 6e  - source version
1eea0 20 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44 61 74   of \"System.Dat
1eeb0 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e  a.SQLite.dll\"..
1eec0 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  . "....         
1eed0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
1eee0 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63             objec
1eef0 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
1ef00 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
1ef10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
1ef20 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
1ef30 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f  .SQLiteConnectio
1ef40 6e 20 50 72 6f 76 69 64 65 72 56 65 72 73 69 6f  n ProviderVersio
1ef50 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 76  n..          } v
1ef60 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68  ersion] == 0} th
1ef70 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1ef80 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
1ef90 6e 67 74 68 20 24 76 65 72 73 69 6f 6e 5d 20 3d  ngth $version] =
1efa0 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
1efb0 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 76             set v
1efc0 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20 20 20  ersion null..   
1efd0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1efe0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
1eff0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
1f000 70 70 65 6e 64 41 72 67 73 20 24 76 65 72 73 69  ppendArgs $versi
1f010 6f 6e 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  on \n]..        
1f020 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1f030 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
1f040 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e  :test_channel un
1f050 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20  known\n..       
1f060 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
1f070 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68  ...        catch
1f080 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
1f090 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
1f0a0 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  nel \..         
1f0b0 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6f 75 72 63       "---- sourc
1f0c0 65 20 63 68 65 63 6b 6f 75 74 20 6f 66 20 5c 22  e checkout of \"
1f0d0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
1f0e0 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 0d 0a 0d  te.dll\"... "...
1f0f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
1f100 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
1f110 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
1f120 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
1f130 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
1f140 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
1f150 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74  ata.SQLite.SQLit
1f160 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 50 72 6f 76  eConnection Prov
1f170 69 64 65 72 53 6f 75 72 63 65 49 64 0d 0a 20 20  iderSourceId..  
1f180 20 20 20 20 20 20 20 20 7d 20 73 6f 75 72 63 65          } source
1f190 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  Id] == 0} then {
1f1a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
1f1b0 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
1f1c0 20 24 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30   $sourceId] == 0
1f1d0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1f1e0 20 20 20 20 20 20 20 20 73 65 74 20 73 6f 75 72          set sour
1f1f0 63 65 49 64 20 6e 75 6c 6c 0d 0a 20 20 20 20 20  ceId null..     
1f200 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1f210 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
1f220 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
1f230 65 6e 64 41 72 67 73 20 24 73 6f 75 72 63 65 49  endArgs $sourceI
1f240 64 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  d \n]..         
1f250 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1f260 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
1f270 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b  test_channel unk
1f280 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20  nown\n..        
1f290 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
1f2a0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1f2b0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
1f2c0 63 6b 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65  ck the available
1f2d0 20 62 75 69 6c 64 73 20 28 61 6e 64 20 22 72 65   builds (and "re
1f2e0 6c 65 61 73 65 73 22 29 20 6f 66 20 53 51 4c 69  leases") of SQLi
1f2f0 74 65 20 61 6e 64 0d 0a 20 20 20 20 20 20 20 20  te and..        
1f300 23 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44  #       System.D
1f310 61 74 61 2e 53 51 4c 69 74 65 2e 0d 0a 20 20 20  ata.SQLite...   
1f320 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1f330 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 42 75  checkForSQLiteBu
1f340 69 6c 64 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  ilds $::test_cha
1f350 6e 6e 65 6c 0d 0a 20 20 20 20 20 20 20 20 63 68  nnel..        ch
1f360 65 63 6b 46 6f 72 53 51 4c 69 74 65 52 65 6c 65  eckForSQLiteRele
1f370 61 73 65 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  ases $::test_cha
1f380 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nnel....        
1f390 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
1f3a0 45 3a 20 4e 6f 77 2c 20 77 65 20 6e 65 65 64 20  E: Now, we need 
1f3b0 74 6f 20 6b 6e 6f 77 20 69 66 20 74 68 65 20 53  to know if the S
1f3c0 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61  QLite core libra
1f3d0 72 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 0d  ry is available.
1f3e0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
1f3f0 20 28 69 2e 65 2e 20 62 65 63 61 75 73 65 20 74   (i.e. because t
1f400 68 65 20 6d 61 6e 61 67 65 64 2d 6f 6e 6c 79 20  he managed-only 
1f410 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
1f420 74 65 20 61 73 73 65 6d 62 6c 79 20 63 61 6e 0d  te assembly can.
1f430 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
1f440 20 6c 6f 61 64 20 77 69 74 68 6f 75 74 20 69 74   load without it
1f450 3b 20 68 6f 77 65 76 65 72 2c 20 69 74 20 63 61  ; however, it ca
1f460 6e 6e 6f 74 20 64 6f 20 61 6e 79 74 68 69 6e 67  nnot do anything
1f470 20 75 73 65 66 75 6c 20 77 69 74 68 6f 75 74 0d   useful without.
1f480 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
1f490 20 69 74 29 2e 20 20 49 66 20 77 65 20 61 72 65   it).  If we are
1f4a0 20 75 73 69 6e 67 20 74 68 65 20 6d 69 78 65 64   using the mixed
1f4b0 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20 61  -mode assembly a
1f4c0 6e 64 20 77 65 20 61 6c 72 65 61 64 79 0d 0a 20  nd we already.. 
1f4d0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66         #       f
1f4e0 6f 75 6e 64 20 69 74 20 28 61 62 6f 76 65 29 2c  ound it (above),
1f4f0 20 74 68 69 73 20 73 68 6f 75 6c 64 20 61 6c 77   this should alw
1f500 61 79 73 20 73 75 63 63 65 65 64 2e 0d 0a 20 20  ays succeed...  
1f510 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1f520 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 4c   checkForSQLiteL
1f530 69 62 72 61 72 79 20 24 3a 3a 74 65 73 74 5f 63  ibrary $::test_c
1f540 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20  hannel....      
1f550 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
1f560 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68  OTE: Check if th
1f570 65 20 53 51 4c 69 74 65 20 69 6e 74 65 72 6f 70  e SQLite interop
1f580 20 61 73 73 65 6d 62 6c 79 20 69 73 20 61 76 61   assembly is ava
1f590 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20  ilable...       
1f5a0 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63   #..        chec
1f5b0 6b 46 6f 72 53 51 4c 69 74 65 49 6e 74 65 72 6f  kForSQLiteIntero
1f5c0 70 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  p $::test_channe
1f5d0 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  l....        #..
1f5e0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1f5f0 43 68 65 63 6b 20 74 68 65 20 53 51 4c 69 74 65  Check the SQLite
1f600 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 65   database and te
1f610 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72  mporary director
1f620 69 65 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ies...        #.
1f630 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f  .        checkFo
1f640 72 53 51 4c 69 74 65 44 69 72 65 63 74 6f 72 69  rSQLiteDirectori
1f650 65 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  es $::test_chann
1f660 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  el....        #.
1f670 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
1f680 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65 74 65   Attempt to dete
1f690 72 6d 69 6e 65 20 69 66 20 76 61 72 69 6f 75 73  rmine if various
1f6a0 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
1f6b0 74 69 6f 6e 73 20 6e 65 65 64 65 64 20 66 6f 72  tions needed for
1f6c0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1f6d0 20 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e    test constrain
1f6e0 74 73 20 77 65 72 65 20 65 6e 61 62 6c 65 64 20  ts were enabled 
1f6f0 66 6f 72 20 74 68 65 20 6d 61 6e 61 67 65 64 20  for the managed 
1f700 61 73 73 65 6d 62 6c 79 2e 20 20 54 68 65 72 65  assembly.  There
1f710 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1f720 20 20 61 72 65 20 73 6f 6d 65 20 63 6f 6d 70 69    are some compi
1f730 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20  le-time options 
1f740 74 68 61 74 20 6d 75 73 74 20 61 6c 73 6f 20 68  that must also h
1f750 61 76 65 20 62 65 65 6e 20 65 6e 61 62 6c 65 64  ave been enabled
1f760 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1f770 20 20 66 6f 72 20 74 68 65 20 69 6e 74 65 72 6f    for the intero
1f780 70 20 61 73 73 65 6d 62 6c 79 20 69 6e 20 6f 72  p assembly in or
1f790 64 65 72 20 74 6f 20 62 65 20 65 66 66 65 63 74  der to be effect
1f7a0 69 76 65 2e 20 20 46 6f 72 20 74 68 6f 73 65 0d  ive.  For those.
1f7b0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
1f7c0 20 6f 70 74 69 6f 6e 73 2c 20 69 74 20 77 69 6c   options, it wil
1f7d0 6c 20 62 65 20 61 73 73 75 6d 65 64 20 74 68 61  l be assumed tha
1f7e0 74 20 69 74 20 77 61 73 20 65 6e 61 62 6c 65 64  t it was enabled
1f7f0 20 66 6f 72 20 74 68 65 20 69 6e 74 65 72 6f 70   for the interop
1f800 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1f810 20 20 61 73 73 65 6d 62 6c 79 20 69 66 20 69 74    assembly if it
1f820 20 77 61 73 20 65 6e 61 62 6c 65 64 20 66 6f 72   was enabled for
1f830 20 74 68 65 20 6d 61 6e 61 67 65 64 20 61 73 73   the managed ass
1f840 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20  embly...        
1f850 23 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61  #..        forea
1f860 63 68 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e  ch defineConstan
1f870 74 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20  t [list \..     
1f880 20 20 20 20 20 20 20 43 48 45 43 4b 5f 53 54 41         CHECK_STA
1f890 54 45 20 43 4f 55 4e 54 5f 48 41 4e 44 4c 45 20  TE COUNT_HANDLE 
1f8a0 44 45 42 55 47 20 49 4e 54 45 52 4f 50 5f 43 4f  DEBUG INTEROP_CO
1f8b0 44 45 43 20 49 4e 54 45 52 4f 50 5f 44 45 42 55  DEC INTEROP_DEBU
1f8c0 47 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  G \..           
1f8d0 20 49 4e 54 45 52 4f 50 5f 45 58 54 45 4e 53 49   INTEROP_EXTENSI
1f8e0 4f 4e 5f 46 55 4e 43 54 49 4f 4e 53 20 49 4e 54  ON_FUNCTIONS INT
1f8f0 45 52 4f 50 5f 46 54 53 35 5f 45 58 54 45 4e 53  EROP_FTS5_EXTENS
1f900 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ION \..         
1f910 20 20 20 49 4e 54 45 52 4f 50 5f 49 4e 43 4c 55     INTEROP_INCLU
1f920 44 45 5f 43 45 52 4f 44 20 49 4e 54 45 52 4f 50  DE_CEROD INTEROP
1f930 5f 49 4e 43 4c 55 44 45 5f 45 58 54 52 41 20 49  _INCLUDE_EXTRA I
1f940 4e 54 45 52 4f 50 5f 49 4e 43 4c 55 44 45 5f 53  NTEROP_INCLUDE_S
1f950 45 45 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  EE \..          
1f960 20 20 49 4e 54 45 52 4f 50 5f 49 4e 43 4c 55 44    INTEROP_INCLUD
1f970 45 5f 5a 49 50 56 46 53 20 49 4e 54 45 52 4f 50  E_ZIPVFS INTEROP
1f980 5f 4a 53 4f 4e 31 5f 45 58 54 45 4e 53 49 4f 4e  _JSON1_EXTENSION
1f990 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1f9a0 49 4e 54 45 52 4f 50 5f 4c 45 47 41 43 59 5f 43  INTEROP_LEGACY_C
1f9b0 4c 4f 53 45 20 49 4e 54 45 52 4f 50 5f 4c 4f 47  LOSE INTEROP_LOG
1f9c0 20 49 4e 54 45 52 4f 50 5f 50 45 52 43 45 4e 54   INTEROP_PERCENT
1f9d0 49 4c 45 5f 45 58 54 45 4e 53 49 4f 4e 20 5c 0d  ILE_EXTENSION \.
1f9e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 54  .            INT
1f9f0 45 52 4f 50 5f 52 45 47 45 58 50 5f 45 58 54 45  EROP_REGEXP_EXTE
1fa00 4e 53 49 4f 4e 20 49 4e 54 45 52 4f 50 5f 54 45  NSION INTEROP_TE
1fa10 53 54 5f 45 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a  ST_EXTENSION \..
1fa20 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 54 45              INTE
1fa30 52 4f 50 5f 54 4f 54 59 50 45 5f 45 58 54 45 4e  ROP_TOTYPE_EXTEN
1fa40 53 49 4f 4e 20 49 4e 54 45 52 4f 50 5f 56 49 52  SION INTEROP_VIR
1fa50 54 55 41 4c 5f 54 41 42 4c 45 20 4e 45 54 5f 32  TUAL_TABLE NET_2
1fa60 30 20 4e 45 54 5f 33 35 20 5c 0d 0a 20 20 20 20  0 NET_35 \..    
1fa70 20 20 20 20 20 20 20 20 4e 45 54 5f 34 30 20 4e          NET_40 N
1fa80 45 54 5f 34 35 20 4e 45 54 5f 34 35 31 20 4e 45  ET_45 NET_451 NE
1fa90 54 5f 34 36 20 4e 45 54 5f 43 4f 4d 50 41 43 54  T_46 NET_COMPACT
1faa0 5f 32 30 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  _20 \..         
1fab0 20 20 20 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50     PLATFORM_COMP
1fac0 41 43 54 46 52 41 4d 45 57 4f 52 4b 20 50 52 45  ACTFRAMEWORK PRE
1fad0 4c 4f 41 44 5f 4e 41 54 49 56 45 5f 4c 49 42 52  LOAD_NATIVE_LIBR
1fae0 41 52 59 20 52 45 54 41 52 47 45 54 41 42 4c 45  ARY RETARGETABLE
1faf0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1fb00 53 51 4c 49 54 45 5f 53 54 41 4e 44 41 52 44 20  SQLITE_STANDARD 
1fb10 54 48 52 4f 57 5f 4f 4e 5f 44 49 53 50 4f 53 45  THROW_ON_DISPOSE
1fb20 44 20 54 52 41 43 45 20 54 52 41 43 45 5f 43 4f  D TRACE TRACE_CO
1fb30 4e 4e 45 43 54 49 4f 4e 20 5c 0d 0a 20 20 20 20  NNECTION \..    
1fb40 20 20 20 20 20 20 20 20 54 52 41 43 45 5f 44 45          TRACE_DE
1fb50 54 45 43 54 49 4f 4e 20 54 52 41 43 45 5f 48 41  TECTION TRACE_HA
1fb60 4e 44 4c 45 20 54 52 41 43 45 5f 50 52 45 4c 4f  NDLE TRACE_PRELO
1fb70 41 44 20 54 52 41 43 45 5f 53 48 41 52 45 44 20  AD TRACE_SHARED 
1fb80 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 54  \..            T
1fb90 52 41 43 45 5f 53 54 41 54 45 4d 45 4e 54 20 54  RACE_STATEMENT T
1fba0 52 41 43 45 5f 57 41 52 4e 49 4e 47 20 54 52 41  RACE_WARNING TRA
1fbb0 43 4b 5f 4d 45 4d 4f 52 59 5f 42 59 54 45 53 20  CK_MEMORY_BYTES 
1fbc0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 55  \..            U
1fbd0 53 45 5f 45 4e 54 49 54 59 5f 46 52 41 4d 45 57  SE_ENTITY_FRAMEW
1fbe0 4f 52 4b 5f 36 20 55 53 45 5f 49 4e 54 45 52 4f  ORK_6 USE_INTERO
1fbf0 50 5f 44 4c 4c 20 55 53 45 5f 50 52 45 50 41 52  P_DLL USE_PREPAR
1fc00 45 5f 56 32 20 57 49 4e 44 4f 57 53 5d 20 7b 0d  E_V2 WINDOWS] {.
1fc10 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
1fc20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1fc30 43 68 65 63 6b 20 69 66 20 74 68 65 20 63 6f 6d  Check if the com
1fc40 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
1fc50 20 69 73 20 6c 69 73 74 65 64 20 69 6e 20 74 68   is listed in th
1fc60 65 20 6c 69 73 74 20 6f 66 0d 0a 20 20 20 20 20  e list of..     
1fc70 20 20 20 20 20 23 20 20 20 20 20 20 20 22 64 65       #       "de
1fc80 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74 73 22 20  fine constants" 
1fc90 6b 65 70 74 20 74 72 61 63 6b 20 6f 66 20 62 79  kept track of by
1fca0 20 74 68 65 20 6d 61 6e 61 67 65 64 20 61 73 73   the managed ass
1fcb0 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20  embly...        
1fcc0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 63    #..          c
1fcd0 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 65 66  heckForSQLiteDef
1fce0 69 6e 65 43 6f 6e 73 74 61 6e 74 20 24 3a 3a 74  ineConstant $::t
1fcf0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 64 65 66  est_channel $def
1fd00 69 6e 65 43 6f 6e 73 74 61 6e 74 0d 0a 20 20 20  ineConstant..   
1fd10 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1fd20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
1fd30 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68  OTE: Check if th
1fd40 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  e System.Data.SQ
1fd50 4c 69 74 65 20 70 72 6f 76 69 64 65 72 20 77 61  Lite provider wa
1fd60 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 0d  s compiled with.
1fd70 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
1fd80 20 73 75 70 70 6f 72 74 20 66 6f 72 20 61 6e 79   support for any
1fd90 20 65 6e 63 72 79 70 74 65 64 20 64 61 74 61 62   encrypted datab
1fda0 61 73 65 73 2e 0d 0a 20 20 20 20 20 20 20 20 23  ases...        #
1fdb0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68  ..        if {[h
1fdc0 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5c 0d  aveConstraint \.
1fdd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fde0 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 2e   defineConstant.
1fdf0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
1fe00 74 65 2e 49 4e 54 45 52 4f 50 5f 43 4f 44 45 43  te.INTEROP_CODEC
1fe10 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] || \..        
1fe20 20 20 20 20 5b 68 61 76 65 43 6f 6e 73 74 72 61      [haveConstra
1fe30 69 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  int \..         
1fe40 20 20 20 20 20 20 20 64 65 66 69 6e 65 43 6f 6e         defineCon
1fe50 73 74 61 6e 74 2e 53 79 73 74 65 6d 2e 44 61 74  stant.System.Dat
1fe60 61 2e 53 51 4c 69 74 65 2e 49 4e 54 45 52 4f 50  a.SQLite.INTEROP
1fe70 5f 49 4e 43 4c 55 44 45 5f 53 45 45 5d 7d 20 74  _INCLUDE_SEE]} t
1fe80 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1fe90 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
1fea0 4e 4f 54 45 3a 20 59 65 73 2c 20 61 64 64 20 67  NOTE: Yes, add g
1feb0 65 6e 65 72 69 63 20 63 6f 6e 73 74 72 61 69 6e  eneric constrain
1fec0 74 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65  t for use by the
1fed0 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20   test suite...  
1fee0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1fef0 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
1ff00 6e 74 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  nt System.Data.S
1ff10 51 4c 69 74 65 2e 45 6e 63 72 79 70 74 69 6f 6e  QLite.Encryption
1ff20 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
1ff30 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1ff40 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
1ff50 74 68 65 20 63 75 72 72 65 6e 74 20 62 75 69 6c  the current buil
1ff60 64 20 79 65 61 72 2e 20 20 42 61 73 69 63 61 6c  d year.  Basical
1ff70 6c 79 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74  ly, this indicat
1ff80 65 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  es..        #   
1ff90 20 20 20 20 77 68 69 63 68 20 76 65 72 73 69 6f      which versio
1ffa0 6e 20 6f 66 20 4d 53 42 75 69 6c 64 20 61 6e 64  n of MSBuild and
1ffb0 2f 6f 72 20 56 69 73 75 61 6c 20 53 74 75 64 69  /or Visual Studi
1ffc0 6f 20 77 61 73 20 75 73 65 64 20 74 6f 0d 0a 20  o was used to.. 
1ffd0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
1ffe0 6f 6d 70 69 6c 65 20 74 68 65 20 61 73 73 65 6d  ompile the assem
1fff0 62 6c 79 20 62 69 6e 61 72 69 65 73 20 75 6e 64  bly binaries und
20000 65 72 20 74 65 73 74 2e 0d 0a 20 20 20 20 20 20  er test...      
20010 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75    #..        tpu
20020 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
20030 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  el \..          
20040 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67    "---- checking
20050 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61   for System.Data
20060 2e 53 51 4c 69 74 65 20 62 75 69 6c 64 20 79 65  .SQLite build ye
20070 61 72 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  ar... "....     
20080 20 20 20 73 65 74 20 79 65 61 72 20 5b 67 65 74     set year [get
20090 42 75 69 6c 64 59 65 61 72 5d 0d 0a 20 20 20 20  BuildYear]..    
200a0 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
200b0 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 62 75  t [appendArgs bu
200c0 69 6c 64 59 65 61 72 2e 20 24 79 65 61 72 5d 0d  ildYear. $year].
200d0 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
200e0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
200f0 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24 79  appendArgs \" $y
20100 65 61 72 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20  ear \"\n]....   
20110 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
20120 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68  # NOTE: Check th
20130 65 20 63 75 72 72 65 6e 74 20 62 75 69 6c 64 20  e current build 
20140 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 2e 20  .NET Framework. 
20150 20 42 61 73 69 63 61 6c 6c 79 2c 20 74 68 69 73   Basically, this
20160 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
20170 20 20 69 6e 64 69 63 61 74 65 73 20 77 68 69 63    indicates whic
20180 68 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  h version of the
20190 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 20   .NET Framework 
201a0 69 73 20 62 65 69 6e 67 0d 0a 20 20 20 20 20 20  is being..      
201b0 20 20 23 20 20 20 20 20 20 20 75 73 65 64 20 62    #       used b
201c0 79 20 74 68 65 20 61 73 73 65 6d 62 6c 79 20 62  y the assembly b
201d0 69 6e 61 72 69 65 73 20 75 6e 64 65 72 20 74 65  inaries under te
201e0 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  st...        #..
201f0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
20200 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d  :test_channel \.
20210 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
20220 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
20230 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
20240 74 65 20 62 75 69 6c 64 20 2e 4e 45 54 20 46 72  te build .NET Fr
20250 61 6d 65 77 6f 72 6b 2e 2e 2e 20 22 0d 0a 0d 0a  amework... "....
20260 20 20 20 20 20 20 20 20 73 65 74 20 6e 65 74 46          set netF
20270 78 20 5b 67 65 74 42 75 69 6c 64 4e 65 74 46 78  x [getBuildNetFx
20280 5d 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  ]..        addCo
20290 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
202a0 41 72 67 73 20 62 75 69 6c 64 46 72 61 6d 65 77  Args buildFramew
202b0 6f 72 6b 2e 20 24 6e 65 74 46 78 5d 0d 0a 20 20  ork. $netFx]..  
202c0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
202d0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
202e0 65 6e 64 41 72 67 73 20 5c 22 20 24 6e 65 74 46  endArgs \" $netF
202f0 78 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20  x \"\n]....     
20300 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
20310 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20  NOTE: Check the 
20320 63 75 72 72 65 6e 74 20 62 75 69 6c 64 20 63 6f  current build co
20330 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 20 54 68  nfiguration.  Th
20340 69 73 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c  is should normal
20350 6c 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ly..        #   
20360 20 20 20 20 62 65 20 65 69 74 68 65 72 20 22 44      be either "D
20370 65 62 75 67 22 20 6f 72 20 22 52 65 6c 65 61 73  ebug" or "Releas
20380 65 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e"...        #..
20390 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
203a0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d  :test_channel \.
203b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
203c0 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
203d0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
203e0 74 65 20 62 75 69 6c 64 20 63 6f 6e 66 69 67 75  te build configu
203f0 72 61 74 69 6f 6e 2e 2e 2e 20 22 0d 0a 0d 0a 20  ration... ".... 
20400 20 20 20 20 20 20 20 73 65 74 20 63 6f 6e 66 69         set confi
20410 67 75 72 61 74 69 6f 6e 20 5b 67 65 74 42 75 69  guration [getBui
20420 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d  ldConfiguration]
20430 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
20440 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
20450 72 67 73 20 62 75 69 6c 64 43 6f 6e 66 69 67 75  rgs buildConfigu
20460 72 61 74 69 6f 6e 2e 20 24 63 6f 6e 66 69 67 75  ration. $configu
20470 72 61 74 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 20  ration]..       
20480 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
20490 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
204a0 67 73 20 5c 22 20 24 63 6f 6e 66 69 67 75 72 61  gs \" $configura
204b0 74 69 6f 6e 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20  tion \"\n]....  
204c0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
204d0 20 23 20 4e 4f 54 45 3a 20 54 72 79 20 74 6f 20   # NOTE: Try to 
204e0 73 65 74 75 70 20 61 6e 20 69 6e 74 65 72 72 75  setup an interru
204f0 70 74 20 63 61 6c 6c 62 61 63 6b 20 75 73 69 6e  pt callback usin
20500 67 20 74 68 65 20 73 63 72 69 70 74 20 64 65 62  g the script deb
20510 75 67 67 65 72 0d 0a 20 20 20 20 20 20 20 20 23  ugger..        #
20520 20 20 20 20 20 20 20 74 68 61 74 20 77 69 6c 6c         that will
20530 20 63 61 6e 63 65 6c 20 61 6c 6c 20 53 51 4c 20   cancel all SQL 
20540 71 75 65 72 69 65 73 20 69 6e 20 70 72 6f 67 72  queries in progr
20550 65 73 73 20 66 6f 72 20 61 6c 6c 20 64 61 74 61  ess for all data
20560 62 61 73 65 0d 0a 20 20 20 20 20 20 20 20 23 20  base..        # 
20570 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e        connection
20580 73 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 69 73 20  s known to this 
20590 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20  interpreter...  
205a0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
205b0 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
205c0 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 49 6e  ts ::no(sqliteIn
205d0 74 65 72 72 75 70 74 43 61 6c 6c 62 61 63 6b 29  terruptCallback)
205e0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
205f0 20 20 20 20 20 73 65 74 75 70 44 62 49 6e 74 65       setupDbInte
20600 72 72 75 70 74 43 61 6c 6c 62 61 63 6b 20 24 3a  rruptCallback $:
20610 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 3a  :test_channel $:
20620 3a 74 65 73 74 5f 6c 6f 67 0d 0a 20 20 20 20 20  :test_log..     
20630 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
20640 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
20650 45 3a 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65  E: Check for the
20660 20 6e 61 74 69 76 65 20 72 75 6e 74 69 6d 65 20   native runtime 
20670 6f 70 74 69 6f 6e 2c 20 77 68 69 63 68 20 77 6f  option, which wo
20680 75 6c 64 20 6d 65 61 6e 20 77 65 20 61 72 65 0d  uld mean we are.
20690 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
206a0 20 75 73 69 6e 67 20 74 68 65 20 6d 69 78 65 64   using the mixed
206b0 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 2e 0d  -mode assembly..
206c0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
206d0 20 20 20 20 63 68 65 63 6b 46 6f 72 52 75 6e 74      checkForRunt
206e0 69 6d 65 4f 70 74 69 6f 6e 20 24 3a 3a 74 65 73  imeOption $::tes
206f0 74 5f 63 68 61 6e 6e 65 6c 20 6e 61 74 69 76 65  t_channel native
20700 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
20710 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
20720 68 65 63 6b 20 69 66 20 74 68 65 20 74 65 73 74  heck if the test
20730 20 73 75 69 74 65 20 73 68 6f 75 6c 64 20 63 6f   suite should co
20740 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
20750 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0d 0a 20  f connections.. 
20760 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22         #       "
20770 6f 70 65 6e 65 64 22 20 61 6e 64 20 22 63 6c 6f  opened" and "clo
20780 73 65 64 22 20 66 72 6f 6d 20 74 68 65 20 70 6f  sed" from the po
20790 6f 6c 20 77 68 65 6e 20 64 65 74 65 72 6d 69 6e  ol when determin
207a0 69 6e 67 20 69 66 20 61 20 74 65 73 74 0d 0a 20  ing if a test.. 
207b0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70         #       p
207c0 61 73 73 65 64 2e 20 20 44 69 73 61 62 6c 69 6e  assed.  Disablin
207d0 67 20 74 68 69 73 20 62 65 68 61 76 69 6f 72 20  g this behavior 
207e0 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 6e 65 63  is sometimes nec
207f0 65 73 73 61 72 79 20 28 65 2e 67 2e 0d 0a 20 20  essary (e.g...  
20800 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 75        #       du
20810 72 69 6e 67 20 74 68 65 20 72 65 6c 65 61 73 65  ring the release
20820 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73   testing process
20830 29 20 62 65 63 61 75 73 65 20 74 68 65 72 65 20  ) because there 
20840 61 72 65 20 73 65 76 65 72 61 6c 0d 0a 20 20 20  are several..   
20850 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73       #       tes
20860 74 73 20 74 68 61 74 20 72 65 6c 79 20 6f 6e 20  ts that rely on 
20870 74 68 65 20 22 6f 70 65 6e 65 64 20 66 72 6f 6d  the "opened from
20880 20 70 6f 6f 6c 22 20 63 6f 75 6e 74 20 62 65 69   pool" count bei
20890 6e 67 20 67 72 65 61 74 65 72 0d 0a 20 20 20 20  ng greater..    
208a0 20 20 20 20 23 20 20 20 20 20 20 20 74 68 61 6e      #       than
208b0 20 7a 65 72 6f 2e 20 20 54 68 65 73 65 20 74 65   zero.  These te
208c0 73 74 73 20 6d 61 79 20 66 61 69 6c 20 64 75 65  sts may fail due
208d0 20 74 6f 20 74 68 65 20 6e 6f 6e 2d 64 65 74 65   to the non-dete
208e0 72 6d 69 6e 69 73 74 69 63 0d 0a 20 20 20 20 20  rministic..     
208f0 20 20 20 23 20 20 20 20 20 20 20 62 65 68 61 76     #       behav
20900 69 6f 72 20 6f 66 20 74 68 65 20 43 4c 52 20 47  ior of the CLR G
20910 43 2c 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65  C, even when the
20920 72 65 20 69 73 20 6e 6f 20 62 75 67 20 69 6e 20  re is no bug in 
20930 74 68 65 20 63 6f 64 65 0d 0a 20 20 20 20 20 20  the code..      
20940 20 20 23 20 20 20 20 20 20 20 62 65 69 6e 67 20    #       being 
20950 74 65 73 74 65 64 2e 0d 0a 20 20 20 20 20 20 20  tested...       
20960 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63   #..        chec
20970 6b 46 6f 72 52 75 6e 74 69 6d 65 4f 70 74 69 6f  kForRuntimeOptio
20980 6e 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  n $::test_channe
20990 6c 20 6e 6f 50 6f 6f 6c 43 6f 75 6e 74 73 0d 0a  l noPoolCounts..
209a0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
209b0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
209c0 63 6b 20 69 66 20 74 68 65 20 74 65 73 74 20 73  ck if the test s
209d0 75 69 74 65 20 73 68 6f 75 6c 64 20 75 73 65 20  uite should use 
209e0 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64  shared-cache mod
209f0 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
20a00 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 52         checkForR
20a10 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 24 3a 3a  untimeOption $::
20a20 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 73 68 61  test_channel sha
20a30 72 65 64 43 61 63 68 65 0d 0a 0d 0a 20 20 20 20  redCache....    
20a40 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
20a50 20 4e 4f 54 45 3a 20 52 65 70 6f 72 74 20 74 68   NOTE: Report th
20a60 65 20 72 65 73 6f 75 72 63 65 20 75 73 61 67 65  e resource usage
20a70 20 70 72 69 6f 72 20 74 6f 20 72 75 6e 6e 69 6e   prior to runnin
20a80 67 20 61 6e 79 20 74 65 73 74 73 2e 0d 0a 20 20  g any tests...  
20a90 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
20aa0 20 72 65 70 6f 72 74 53 51 4c 69 74 65 52 65 73   reportSQLiteRes
20ab0 6f 75 72 63 65 73 20 24 3a 3a 74 65 73 74 5f 63  ources $::test_c
20ac0 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20  hannel....      
20ad0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
20ae0 4f 54 45 3a 20 47 72 61 62 20 74 68 65 20 6c 69  OTE: Grab the li
20af0 73 74 20 6f 66 20 6e 61 74 69 76 65 20 6d 6f 64  st of native mod
20b00 75 6c 65 73 20 66 6f 72 20 74 68 65 20 63 75 72  ules for the cur
20b10 72 65 6e 74 20 70 72 6f 63 65 73 73 20 61 6e 64  rent process and
20b20 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
20b30 20 20 72 65 70 6f 72 74 20 6f 6e 20 74 68 65 20    report on the 
20b40 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
20b50 74 65 20 72 65 6c 61 74 65 64 20 6f 6e 65 73 2e  te related ones.
20b60 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
20b70 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51       if {[haveSQ
20b80 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e  LiteObjectComman
20b90 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  d]} then {..    
20ba0 20 20 20 20 20 20 73 65 74 20 6d 6f 64 75 6c 65        set module
20bb0 73 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65  s [object invoke
20bc0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
20bd0 20 20 53 79 73 74 65 6d 2e 44 69 61 67 6e 6f 73    System.Diagnos
20be0 74 69 63 73 2e 50 72 6f 63 65 73 73 2e 47 65 74  tics.Process.Get
20bf0 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 20 4d  CurrentProcess M
20c00 6f 64 75 6c 65 73 5d 0d 0a 0d 0a 20 20 20 20 20  odules]....     
20c10 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65       object fore
20c20 61 63 68 20 2d 61 6c 69 61 73 20 6d 6f 64 75 6c  ach -alias modul
20c30 65 20 24 6d 6f 64 75 6c 65 73 20 7b 0d 0a 20 20  e $modules {..  
20c40 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
20c50 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
20c60 20 54 68 65 20 6d 6f 64 75 6c 65 20 66 69 6c 65   The module file
20c70 20 6e 61 6d 65 20 68 65 72 65 20 6d 75 73 74 20   name here must 
20c80 62 65 20 6e 6f 72 6d 61 6c 69 7a 65 64 2e 0d 0a  be normalized...
20c90 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
20ca0 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 66             set f
20cb0 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 6f  ileName [file no
20cc0 72 6d 61 6c 69 7a 65 20 5b 24 6d 6f 64 75 6c 65  rmalize [$module
20cd0 20 46 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 0d 0a 20   FileName]].... 
20ce0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
20cf0 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2d 6e 6f  string match -no
20d00 63 61 73 65 20 2a 2f 73 71 6c 69 74 65 33 2e 64  case */sqlite3.d
20d10 6c 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74  ll $fileName]} t
20d20 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
20d30 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
20d40 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
20d50 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
20d60 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
20d70 2d 20 66 6f 75 6e 64 20 6c 6f 61 64 65 64 20 53  - found loaded S
20d80 51 4c 69 74 65 20 6e 61 74 69 76 65 20 6c 69 62  QLite native lib
20d90 72 61 72 79 20 6d 6f 64 75 6c 65 3a 20 22 20 5c  rary module: " \
20da0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
20db0 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 20 5c 6e      $fileName \n
20dc0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
20dd0 20 65 6c 73 65 69 66 20 7b 5b 73 74 72 69 6e 67   elseif {[string
20de0 20 6d 61 74 63 68 20 5c 0d 0a 20 20 20 20 20 20   match \..      
20df0 20 20 20 20 20 20 20 20 20 20 2d 6e 6f 63 61 73            -nocas
20e00 65 20 2a 2f 53 51 4c 69 74 65 2e 49 6e 74 65 72  e */SQLite.Inter
20e10 6f 70 2e 64 6c 6c 20 24 66 69 6c 65 4e 61 6d 65  op.dll $fileName
20e20 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
20e30 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
20e40 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
20e50 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
20e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e70 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c 6f 61 64  "---- found load
20e80 65 64 20 53 51 4c 69 74 65 20 69 6e 74 65 72 6f  ed SQLite intero
20e90 70 20 61 73 73 65 6d 62 6c 79 20 6d 6f 64 75 6c  p assembly modul
20ea0 65 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  e: " \..        
20eb0 20 20 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e            $fileN
20ec0 61 6d 65 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ame \n]..       
20ed0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
20ee0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
20ef0 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20  ..        catch 
20f00 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
20f10 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
20f20 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  el \..          
20f30 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 6d 70 69 6c      "---- compil
20f40 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 66  e-time options f
20f50 6f 72 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c  or SQLite core l
20f60 69 62 72 61 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20  ibrary... ".... 
20f70 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
20f80 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
20f90 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
20fa0 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
20fb0 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
20fc0 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
20fd0 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33  a.SQLite.SQLite3
20fe0 20 53 51 4c 69 74 65 43 6f 6d 70 69 6c 65 4f 70   SQLiteCompileOp
20ff0 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20 20  tions..         
21000 20 7d 20 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e   } compileOption
21010 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  s] == 0} then {.
21020 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
21030 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
21040 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b  el [appendArgs [
21050 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73 6f 72  formatList [lsor
21060 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
21070 20 20 20 20 20 24 63 6f 6d 70 69 6c 65 4f 70 74       $compileOpt
21080 69 6f 6e 73 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e  ions] <none>] \n
21090 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  ]..          } e
210a0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
210b0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
210c0 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e  _channel unknown
210d0 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  \n..          }.
210e0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
210f0 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20        catch {.. 
21100 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
21110 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c  ::test_channel \
21120 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21130 22 2d 2d 2d 2d 20 63 6f 6d 70 69 6c 65 2d 74 69  "---- compile-ti
21140 6d 65 20 6f 70 74 69 6f 6e 73 20 66 6f 72 20 53  me options for S
21150 51 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73  QLite interop as
21160 73 65 6d 62 6c 79 2e 2e 2e 20 22 0d 0a 0d 0a 20  sembly... ".... 
21170 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
21180 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
21190 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
211a0 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
211b0 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
211c0 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
211d0 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33  a.SQLite.SQLite3
211e0 20 49 6e 74 65 72 6f 70 43 6f 6d 70 69 6c 65 4f   InteropCompileO
211f0 70 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20  ptions..        
21200 20 20 7d 20 63 6f 6d 70 69 6c 65 4f 70 74 69 6f    } compileOptio
21210 6e 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  ns] == 0} then {
21220 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
21230 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
21240 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
21250 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73 6f  [formatList [lso
21260 72 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  rt \..          
21270 20 20 20 20 20 20 24 63 6f 6d 70 69 6c 65 4f 70        $compileOp
21280 74 69 6f 6e 73 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c  tions] <none>] \
21290 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  n]..          } 
212a0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
212b0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
212c0 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77  t_channel unknow
212d0 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  n\n..          }
212e0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
212f0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
21300 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74    # NOTE: Show t
21310 68 65 20 61 63 74 69 76 65 20 74 65 73 74 20 63  he active test c
21320 6f 6e 73 74 72 61 69 6e 74 73 2e 0d 0a 20 20 20  onstraints...   
21330 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
21340 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
21350 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
21360 73 20 22 2d 2d 2d 2d 20 63 6f 6e 73 74 72 61 69  s "---- constrai
21370 6e 74 73 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20  nts: " \..      
21380 20 20 20 20 20 20 5b 66 6f 72 6d 61 74 4c 69 73        [formatLis
21390 74 20 5b 6c 73 6f 72 74 20 5b 67 65 74 43 6f 6e  t [lsort [getCon
213a0 73 74 72 61 69 6e 74 73 5d 5d 20 3c 6e 6f 6e 65  straints]] <none
213b0 3e 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20  >] \n]....      
213c0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
213d0 4f 54 45 3a 20 53 61 76 65 20 74 68 65 20 74 65  OTE: Save the te
213e0 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66  st constraints f
213f0 6f 72 20 75 73 65 20 62 79 20 74 68 72 65 61 64  or use by thread
21400 73 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 69  s created in thi
21410 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  s..        #    
21420 20 20 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64     application d
21430 6f 6d 61 69 6e 2e 20 20 54 68 69 73 20 69 73 20  omain.  This is 
21440 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73  necessary becaus
21450 65 20 61 6c 6c 20 74 68 65 20 45 61 67 6c 65 0d  e all the Eagle.
21460 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
21470 20 22 74 65 73 74 20 63 6f 6e 74 65 78 74 22 20   "test context" 
21480 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 70  information is p
21490 65 72 2d 74 68 72 65 61 64 2e 0d 0a 20 20 20 20  er-thread...    
214a0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
214b0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
214c0 20 3a 3a 74 65 73 74 5f 63 6f 6e 73 74 72 61 69   ::test_constrai
214d0 6e 74 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  nts]} then {..  
214e0 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65          set ::te
214f0 73 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 24  st_constraints $
21500 3a 3a 65 61 67 6c 65 5f 74 65 73 74 73 28 63 6f  ::eagle_tests(co
21510 6e 73 74 72 61 69 6e 74 73 29 0d 0a 20 20 20 20  nstraints)..    
21520 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
21530 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
21540 54 45 3a 20 4c 6f 61 64 20 74 68 65 20 22 61 66  TE: Load the "af
21550 74 65 72 2d 63 6f 6e 73 74 72 61 69 6e 74 73 22  ter-constraints"
21560 20 63 75 73 74 6f 6d 20 70 65 72 2d 75 73 65 72   custom per-user
21570 20 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74   and/or per-host
21580 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
21590 20 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20    test settings 
215a0 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  now...        #.
215b0 0a 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c  .        uplevel
215c0 20 31 20 5b 6c 69 73 74 20 6c 6f 61 64 53 51 4c   1 [list loadSQL
215d0 69 74 65 54 65 73 74 53 65 74 74 69 6e 67 73 20  iteTestSettings 
215e0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
215f0 2e 61 66 74 65 72 5d 0d 0a 0d 0a 20 20 20 20 20  .after]....     
21600 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
21610 4e 4f 54 45 3a 20 49 66 20 6e 65 63 65 73 73 61  NOTE: If necessa
21620 72 79 2c 20 65 6e 61 62 6c 65 20 73 68 61 72 65  ry, enable share
21630 64 2d 63 61 63 68 65 20 6d 6f 64 65 20 6e 6f 77  d-cache mode now
21640 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
21650 20 20 20 20 20 20 69 66 20 7b 5b 68 61 73 52 75        if {[hasRu
21660 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 73 68 61 72  ntimeOption shar
21670 65 64 43 61 63 68 65 5d 7d 20 74 68 65 6e 20 7b  edCache]} then {
21680 0d 0a 20 20 20 20 20 20 20 20 20 20 65 6e 61 62  ..          enab
21690 6c 65 53 68 61 72 65 64 43 61 63 68 65 20 24 3a  leSharedCache $:
216a0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72  :test_channel tr
216b0 75 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ue..        }...
216c0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
216d0 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77      # NOTE: Show
216e0 20 77 68 65 6e 20 6f 75 72 20 74 65 73 74 73 20   when our tests 
216f0 61 63 74 75 61 6c 6c 79 20 62 65 67 61 6e 20 28  actually began (
21700 6e 6f 77 29 2e 0d 0a 20 20 20 20 20 20 20 20 23  now)...        #
21710 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
21720 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
21730 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
21740 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
21750 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
21760 69 74 65 20 74 65 73 74 73 20 62 65 67 61 6e 20  ite tests began 
21770 61 74 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  at " \..        
21780 20 20 20 20 5b 63 6c 6f 63 6b 20 66 6f 72 6d 61      [clock forma
21790 74 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73  t [clock seconds
217a0 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d  ]] \n]..      }.
217b0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
217c0 72 6f 63 20 72 75 6e 53 51 4c 69 74 65 54 65 73  roc runSQLiteTes
217d0 74 46 69 6c 65 73 50 72 6f 6c 6f 67 75 65 20 7b  tFilesPrologue {
217e0 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 6c 65 76  } {..      uplev
217f0 65 6c 20 31 20 7b 0d 0a 20 20 20 20 20 20 20 20  el 1 {..        
21800 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
21810 45 3a 20 53 65 74 75 70 20 74 68 65 20 76 61 72  E: Setup the var
21820 69 61 62 6c 65 73 20 74 68 61 74 20 72 65 66 65  iables that refe
21830 72 20 74 6f 20 74 68 65 20 76 61 72 69 6f 75 73  r to the various
21840 20 6e 6f 6e 2d 64 61 74 61 20 66 69 6c 65 73 0d   non-data files.
21850 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
21860 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
21870 20 74 65 73 74 73 20 69 6e 20 74 68 69 73 20 66   tests in this f
21880 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ile...        #.
21890 0a 20 20 20 20 20 20 20 20 73 65 74 20 65 6e 74  .        set ent
218a0 69 74 79 46 72 61 6d 65 77 6f 72 6b 44 6c 6c 46  ityFrameworkDllF
218b0 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ile \..         
218c0 20 20 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65     [getBuildFile
218d0 4e 61 6d 65 20 45 6e 74 69 74 79 46 72 61 6d 65  Name EntityFrame
218e0 77 6f 72 6b 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20  work.dll]....   
218f0 20 20 20 20 20 73 65 74 20 69 6e 73 74 61 6c 6c       set install
21900 65 72 45 78 65 46 69 6c 65 20 5b 67 65 74 42 75  erExeFile [getBu
21910 69 6c 64 46 69 6c 65 4e 61 6d 65 20 49 6e 73 74  ildFileName Inst
21920 61 6c 6c 65 72 2e 65 78 65 5d 0d 0a 20 20 20 20  aller.exe]..    
21930 20 20 20 20 73 65 74 20 73 71 6c 69 74 65 44 65      set sqliteDe
21940 73 69 67 6e 65 72 44 6c 6c 46 69 6c 65 20 5b 67  signerDllFile [g
21950 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20  etBuildFileName 
21960 53 51 4c 69 74 65 2e 44 65 73 69 67 6e 65 72 2e  SQLite.Designer.
21970 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  dll]....        
21980 73 65 74 20 73 79 73 74 65 6d 44 61 74 61 53 51  set systemDataSQ
21990 4c 69 74 65 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20  LiteDllFile \.. 
219a0 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42             [getB
219b0 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 53 79 73  uildFileName Sys
219c0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
219d0 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  dll]....        
219e0 73 65 74 20 73 79 73 74 65 6d 44 61 74 61 53 51  set systemDataSQ
219f0 4c 69 74 65 4c 69 6e 71 44 6c 6c 46 69 6c 65 20  LiteLinqDllFile 
21a00 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
21a10 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65  getBuildFileName
21a20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
21a30 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 5d 0d 0a 0d  ite.Linq.dll]...
21a40 0a 20 20 20 20 20 20 20 20 73 65 74 20 73 79 73  .        set sys
21a50 74 65 6d 44 61 74 61 53 51 4c 69 74 65 45 66 36  temDataSQLiteEf6
21a60 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20  DllFile \..     
21a70 20 20 20 20 20 20 20 5b 67 65 74 42 75 69 6c 64         [getBuild
21a80 46 69 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e  FileName System.
21a90 44 61 74 61 2e 53 51 4c 69 74 65 2e 45 46 36 2e  Data.SQLite.EF6.
21aa0 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  dll]....        
21ab0 73 65 74 20 74 65 73 74 45 78 65 46 69 6c 65 20  set testExeFile 
21ac0 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d  [getBuildFileNam
21ad0 65 20 74 65 73 74 2e 65 78 65 5d 0d 0a 20 20 20  e test.exe]..   
21ae0 20 20 20 20 20 73 65 74 20 74 65 73 74 4c 69 6e       set testLin
21af0 71 45 78 65 46 69 6c 65 20 5b 67 65 74 42 75 69  qExeFile [getBui
21b00 6c 64 46 69 6c 65 4e 61 6d 65 20 74 65 73 74 6c  ldFileName testl
21b10 69 6e 71 2e 65 78 65 5d 0d 0a 20 20 20 20 20 20  inq.exe]..      
21b20 20 20 73 65 74 20 74 65 73 74 45 66 36 45 78 65    set testEf6Exe
21b30 46 69 6c 65 20 5b 67 65 74 42 75 69 6c 64 46 69  File [getBuildFi
21b40 6c 65 4e 61 6d 65 20 74 65 73 74 65 66 36 2e 65  leName testef6.e
21b50 78 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  xe]....        #
21b60 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
21b70 3a 20 53 65 74 75 70 20 74 68 65 20 76 61 72 69  : Setup the vari
21b80 61 62 6c 65 73 20 74 68 61 74 20 72 65 66 65 72  ables that refer
21b90 20 74 6f 20 74 68 65 20 76 61 72 69 6f 75 73 20   to the various 
21ba0 64 61 74 61 20 66 69 6c 65 73 0d 0a 20 20 20 20  data files..    
21bb0 20 20 20 20 23 20 20 20 20 20 20 20 72 65 71 75      #       requ
21bc0 69 72 65 64 20 62 79 20 74 68 65 20 74 65 73 74  ired by the test
21bd0 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e 0d  s in this file..
21be0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
21bf0 20 20 20 20 73 65 74 20 74 65 73 74 4c 69 6e 71      set testLinq
21c00 4f 75 74 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61  OutFile [file na
21c10 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a  tivename [file j
21c20 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  oin \..         
21c30 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73     [getSQLiteTes
21c40 74 44 61 74 61 50 61 74 68 5d 20 74 65 73 74 6c  tDataPath] testl
21c50 69 6e 71 2e 6f 75 74 5d 5d 0d 0a 0d 0a 20 20 20  inq.out]]....   
21c60 20 20 20 20 20 73 65 74 20 6e 6f 72 74 68 77 69       set northwi
21c70 6e 64 45 66 44 62 46 69 6c 65 20 5b 66 69 6c 65  ndEfDbFile [file
21c80 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
21c90 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20  e join \..      
21ca0 20 20 20 20 20 20 5b 66 69 6c 65 20 64 69 72 6e        [file dirn
21cb0 61 6d 65 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  ame [file dirnam
21cc0 65 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74  e [getSQLiteTest
21cd0 44 61 74 61 50 61 74 68 5d 5d 5d 20 5c 0d 0a 20  DataPath]]] \.. 
21ce0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 6c             testl
21cf0 69 6e 71 20 6e 6f 72 74 68 77 69 6e 64 45 46 2e  inq northwindEF.
21d00 64 62 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  db]]....        
21d10 73 65 74 20 6e 6f 6e 57 61 6c 44 62 46 69 6c 65  set nonWalDbFile
21d20 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
21d30 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a  e [file join \..
21d40 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
21d50 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61  SQLiteTestDataPa
21d60 74 68 5d 20 6e 6f 6e 57 61 6c 2e 64 62 5d 5d 0d  th] nonWal.db]].
21d70 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 77  ...        set w
21d80 61 6c 44 62 46 69 6c 65 20 5b 66 69 6c 65 20 6e  alDbFile [file n
21d90 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
21da0 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  join \..        
21db0 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65      [getSQLiteTe
21dc0 73 74 44 61 74 61 50 61 74 68 5d 20 77 61 6c 2e  stDataPath] wal.
21dd0 64 62 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  db]]....        
21de0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
21df0 45 3a 20 54 68 65 20 76 61 72 69 6f 75 73 20 69  E: The various i
21e00 6e 73 74 61 6c 6c 2f 75 6e 69 6e 73 74 61 6c 6c  nstall/uninstall
21e10 20 6c 6f 67 20 66 69 6c 65 73 20 75 73 65 64 20   log files used 
21e20 74 6f 20 74 65 73 74 20 74 68 65 0d 0a 20 20 20  to test the..   
21e30 20 20 20 20 20 23 20 20 20 20 20 20 20 64 65 73       #       des
21e40 69 67 6e 2d 74 69 6d 65 20 63 6f 6d 70 6f 6e 65  ign-time compone
21e50 6e 74 20 69 6e 73 74 61 6c 6c 65 72 2e 0d 0a 20  nt installer... 
21e60 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
21e70 20 20 73 65 74 20 74 65 73 74 49 6e 73 74 61 6c    set testInstal
21e80 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 20 5b  lVs2005LogFile [
21e90 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
21ea0 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20  [file join \..  
21eb0 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51            [getSQ
21ec0 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68  LiteTestDataPath
21ed0 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74  ] Installer_Test
21ee0 5f 56 73 32 30 30 35 2e 6c 6f 67 5d 5d 0d 0a 0d  _Vs2005.log]]...
21ef0 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73  .        set tes
21f00 74 49 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f  tInstallVs2008Lo
21f10 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69  gFile [file nati
21f20 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  vename [file joi
21f30 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
21f40 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44   [getSQLiteTestD
21f50 61 74 61 50 61 74 68 5d 20 49 6e 73 74 61 6c 6c  ataPath] Install
21f60 65 72 5f 54 65 73 74 5f 56 73 32 30 30 38 2e 6c  er_Test_Vs2008.l
21f70 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  og]]....        
21f80 73 65 74 20 74 65 73 74 49 6e 73 74 61 6c 6c 56  set testInstallV
21f90 73 32 30 31 30 4c 6f 67 46 69 6c 65 20 5b 66 69  s2010LogFile [fi
21fa0 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
21fb0 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20  ile join \..    
21fc0 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69          [getSQLi
21fd0 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20  teTestDataPath] 
21fe0 49 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56  Installer_Test_V
21ff0 73 32 30 31 30 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20  s2010.log]].... 
22000 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74 49         set testI
22010 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46  nstallVs2012LogF
22020 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ile [file native
22030 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
22040 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
22050 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74  getSQLiteTestDat
22060 61 50 61 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72  aPath] Installer
22070 5f 54 65 73 74 5f 56 73 32 30 31 32 2e 6c 6f 67  _Test_Vs2012.log
22080 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65  ]]....        se
22090 74 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32  t testInstallVs2
220a0 30 31 33 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65  013LogFile [file
220b0 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
220c0 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20  e join \..      
220d0 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65        [getSQLite
220e0 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 49 6e  TestDataPath] In
220f0 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32  staller_Test_Vs2
22100 30 31 33 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20  013.log]]....   
22110 20 20 20 20 20 73 65 74 20 74 65 73 74 49 6e 73       set testIns
22120 74 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c  tallVs2015LogFil
22130 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
22140 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d  me [file join \.
22150 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65  .            [ge
22160 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50  tSQLiteTestDataP
22170 61 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54  ath] Installer_T
22180 65 73 74 5f 56 73 32 30 31 35 2e 6c 6f 67 5d 5d  est_Vs2015.log]]
22190 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
221a0 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
221b0 30 30 35 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65  005LogFile [file
221c0 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
221d0 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20  e join \..      
221e0 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65        [getSQLite
221f0 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 55 6e  TestDataPath] Un
22200 69 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56  installer_Test_V
22210 73 32 30 30 35 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20  s2005.log]].... 
22220 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74 55         set testU
22230 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f  ninstallVs2008Lo
22240 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69  gFile [file nati
22250 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  vename [file joi
22260 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
22270 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44   [getSQLiteTestD
22280 61 74 61 50 61 74 68 5d 20 55 6e 69 6e 73 74 61  ataPath] Uninsta
22290 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 30 38  ller_Test_Vs2008
222a0 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  .log]]....      
222b0 20 20 73 65 74 20 74 65 73 74 55 6e 69 6e 73 74    set testUninst
222c0 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65  allVs2010LogFile
222d0 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
222e0 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a  e [file join \..
222f0 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
22300 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61  SQLiteTestDataPa
22310 74 68 5d 20 55 6e 69 6e 73 74 61 6c 6c 65 72 5f  th] Uninstaller_
22320 54 65 73 74 5f 56 73 32 30 31 30 2e 6c 6f 67 5d  Test_Vs2010.log]
22330 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74  ]....        set
22340 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73   testUninstallVs
22350 32 30 31 32 4c 6f 67 46 69 6c 65 20 5b 66 69 6c  2012LogFile [fil
22360 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69  e nativename [fi
22370 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20  le join \..     
22380 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74         [getSQLit
22390 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 55  eTestDataPath] U
223a0 6e 69 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f  ninstaller_Test_
223b0 56 73 32 30 31 32 2e 6c 6f 67 5d 5d 0d 0a 0d 0a  Vs2012.log]]....
223c0 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74          set test
223d0 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c  UninstallVs2013L
223e0 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74  ogFile [file nat
223f0 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
22400 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  in \..          
22410 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74    [getSQLiteTest
22420 44 61 74 61 50 61 74 68 5d 20 55 6e 69 6e 73 74  DataPath] Uninst
22430 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31  aller_Test_Vs201
22440 33 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20  3.log]]....     
22450 20 20 20 73 65 74 20 74 65 73 74 55 6e 69 6e 73     set testUnins
22460 74 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c  tallVs2015LogFil
22470 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
22480 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d  me [file join \.
22490 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65  .            [ge
224a0 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50  tSQLiteTestDataP
224b0 61 74 68 5d 20 55 6e 69 6e 73 74 61 6c 6c 65 72  ath] Uninstaller
224c0 5f 54 65 73 74 5f 56 73 32 30 31 35 2e 6c 6f 67  _Test_Vs2015.log
224d0 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 23  ]]....        ##
224e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
224f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
22500 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
22510 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
22520 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20 20 20  #####....       
22530 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74   if {![haveConst
22540 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
22550 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20  s file_ \..     
22560 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69         [file tai
22570 6c 20 24 65 6e 74 69 74 79 46 72 61 6d 65 77 6f  l $entityFramewo
22580 72 6b 44 6c 6c 46 69 6c 65 5d 5d 5d 7d 20 74 68  rkDllFile]]]} th
22590 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
225a0 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
225b0 73 74 5f 63 68 61 6e 6e 65 6c 20 24 65 6e 74 69  st_channel $enti
225c0 74 79 46 72 61 6d 65 77 6f 72 6b 44 6c 6c 46 69  tyFrameworkDllFi
225d0 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  le..        }...
225e0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68  .        if {![h
225f0 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  aveConstraint [a
22600 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
22610 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
22620 66 69 6c 65 20 74 61 69 6c 20 24 69 6e 73 74 61  file tail $insta
22630 6c 6c 65 72 45 78 65 46 69 6c 65 5d 5d 5d 7d 20  llerExeFile]]]} 
22640 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
22650 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24    checkForFile $
22660 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 69 6e  test_channel $in
22670 73 74 61 6c 6c 65 72 45 78 65 46 69 6c 65 20 49  stallerExeFile I
22680 6e 73 74 61 6c 6c 65 72 2e 65 78 65 0d 0a 20 20  nstaller.exe..  
22690 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
226a0 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e     if {![haveCon
226b0 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
226c0 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20  rgs file_ \..   
226d0 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
226e0 61 69 6c 20 24 73 71 6c 69 74 65 44 65 73 69 67  ail $sqliteDesig
226f0 6e 65 72 44 6c 6c 46 69 6c 65 5d 5d 5d 7d 20 74  nerDllFile]]]} t
22700 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
22710 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
22720 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 73 71 6c  est_channel $sql
22730 69 74 65 44 65 73 69 67 6e 65 72 44 6c 6c 46 69  iteDesignerDllFi
22740 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  le..        }...
22750 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68  .        if {![h
22760 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  aveConstraint [a
22770 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
22780 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
22790 66 69 6c 65 20 74 61 69 6c 20 24 73 79 73 74 65  file tail $syste
227a0 6d 44 61 74 61 53 51 4c 69 74 65 44 6c 6c 46 69  mDataSQLiteDllFi
227b0 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  le]]]} then {.. 
227c0 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f           checkFo
227d0 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e  rFile $test_chan
227e0 6e 65 6c 20 24 73 79 73 74 65 6d 44 61 74 61 53  nel $systemDataS
227f0 51 4c 69 74 65 44 6c 6c 46 69 6c 65 0d 0a 20 20  QLiteDllFile..  
22800 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
22810 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e     if {![haveCon
22820 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
22830 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20  rgs file_ \..   
22840 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
22850 61 69 6c 20 24 73 79 73 74 65 6d 44 61 74 61 53  ail $systemDataS
22860 51 4c 69 74 65 4c 69 6e 71 44 6c 6c 46 69 6c 65  QLiteLinqDllFile
22870 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
22880 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
22890 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
228a0 6c 20 24 73 79 73 74 65 6d 44 61 74 61 53 51 4c  l $systemDataSQL
228b0 69 74 65 4c 69 6e 71 44 6c 6c 46 69 6c 65 0d 0a  iteLinqDllFile..
228c0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
228d0 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43       if {![haveC
228e0 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
228f0 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20  dArgs file_ \.. 
22900 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
22910 20 74 61 69 6c 20 24 73 79 73 74 65 6d 44 61 74   tail $systemDat
22920 61 53 51 4c 69 74 65 45 66 36 44 6c 6c 46 69 6c  aSQLiteEf6DllFil
22930 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e]]]} then {..  
22940 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
22950 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e  File $test_chann
22960 65 6c 20 24 73 79 73 74 65 6d 44 61 74 61 53 51  el $systemDataSQ
22970 4c 69 74 65 45 66 36 44 6c 6c 46 69 6c 65 0d 0a  LiteEf6DllFile..
22980 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
22990 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43       if {![haveC
229a0 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
229b0 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20  dArgs file_ \.. 
229c0 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
229d0 20 74 61 69 6c 20 24 74 65 73 74 45 78 65 46 69   tail $testExeFi
229e0 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  le]]]} then {.. 
229f0 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f           checkFo
22a00 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e  rFile $test_chan
22a10 6e 65 6c 20 24 74 65 73 74 45 78 65 46 69 6c 65  nel $testExeFile
22a20 20 74 65 73 74 2e 65 78 65 0d 0a 20 20 20 20 20   test.exe..     
22a30 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
22a40 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
22a50 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
22a60 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
22a70 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c        [file tail
22a80 20 24 74 65 73 74 4c 69 6e 71 45 78 65 46 69 6c   $testLinqExeFil
22a90 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e]]]} then {..  
22aa0 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
22ab0 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e  File $test_chann
22ac0 65 6c 20 24 74 65 73 74 4c 69 6e 71 45 78 65 46  el $testLinqExeF
22ad0 69 6c 65 20 74 65 73 74 6c 69 6e 71 2e 65 78 65  ile testlinq.exe
22ae0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
22af0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76         if {![hav
22b00 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  eConstraint [app
22b10 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d  endArgs file_ \.
22b20 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69  .            [fi
22b30 6c 65 20 74 61 69 6c 20 24 74 65 73 74 45 66 36  le tail $testEf6
22b40 45 78 65 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  ExeFile]]]} then
22b50 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   {..          ch
22b60 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74  eckForFile $test
22b70 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 45 66  _channel $testEf
22b80 36 45 78 65 46 69 6c 65 20 74 65 73 74 65 66 36  6ExeFile testef6
22b90 2e 65 78 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d  .exe..        }.
22ba0 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
22bb0 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
22bc0 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
22bd0 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  _ \..           
22be0 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73   [file tail $tes
22bf0 74 4c 69 6e 71 4f 75 74 46 69 6c 65 5d 5d 5d 7d  tLinqOutFile]]]}
22c00 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
22c10 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20     checkForFile 
22c20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74  $test_channel $t
22c30 65 73 74 4c 69 6e 71 4f 75 74 46 69 6c 65 0d 0a  estLinqOutFile..
22c40 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
22c50 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43       if {![haveC
22c60 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
22c70 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20  dArgs file_ \.. 
22c80 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
22c90 20 74 61 69 6c 20 24 6e 6f 72 74 68 77 69 6e 64   tail $northwind
22ca0 45 66 44 62 46 69 6c 65 5d 5d 5d 7d 20 74 68 65  EfDbFile]]]} the
22cb0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  n {..          c
22cc0 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
22cd0 74 5f 63 68 61 6e 6e 65 6c 20 24 6e 6f 72 74 68  t_channel $north
22ce0 77 69 6e 64 45 66 44 62 46 69 6c 65 0d 0a 20 20  windEfDbFile..  
22cf0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
22d00 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e     if {![haveCon
22d10 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
22d20 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20  rgs file_ \..   
22d30 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
22d40 61 69 6c 20 24 6e 6f 6e 57 61 6c 44 62 46 69 6c  ail $nonWalDbFil
22d50 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e]]]} then {..  
22d60 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
22d70 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e  File $test_chann
22d80 65 6c 20 24 6e 6f 6e 57 61 6c 44 62 46 69 6c 65  el $nonWalDbFile
22d90 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
22da0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76         if {![hav
22db0 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  eConstraint [app
22dc0 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d  endArgs file_ \.
22dd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69  .            [fi
22de0 6c 65 20 74 61 69 6c 20 24 77 61 6c 44 62 46 69  le tail $walDbFi
22df0 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  le]]]} then {.. 
22e00 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f           checkFo
22e10 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e  rFile $test_chan
22e20 6e 65 6c 20 24 77 61 6c 44 62 46 69 6c 65 0d 0a  nel $walDbFile..
22e30 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
22e40 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43       if {![haveC
22e50 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
22e60 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20  dArgs file_ \.. 
22e70 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
22e80 20 74 61 69 6c 20 24 74 65 73 74 49 6e 73 74 61   tail $testInsta
22e90 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 5d  llVs2005LogFile]
22ea0 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
22eb0 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69        checkForFi
22ec0 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c  le $test_channel
22ed0 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32   $testInstallVs2
22ee0 30 30 35 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20  005LogFile..    
22ef0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
22f00 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74   if {![haveConst
22f10 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
22f20 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20  s file_ \..     
22f30 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69         [file tai
22f40 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73  l $testInstallVs
22f50 32 30 30 38 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20  2008LogFile]]]} 
22f60 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
22f70 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24    checkForFile $
22f80 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65  test_channel $te
22f90 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c  stInstallVs2008L
22fa0 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20  ogFile..        
22fb0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
22fc0 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e  {![haveConstrain
22fd0 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
22fe0 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  le_ \..         
22ff0 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74     [file tail $t
23000 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 30  estInstallVs2010
23010 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  LogFile]]]} then
23020 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   {..          ch
23030 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74  eckForFile $test
23040 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 49 6e  _channel $testIn
23050 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69  stallVs2010LogFi
23060 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  le..        }...
23070 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68  .        if {![h
23080 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  aveConstraint [a
23090 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
230a0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
230b0 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74 49  file tail $testI
230c0 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46  nstallVs2012LogF
230d0 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ile]]]} then {..
230e0 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
230f0 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
23100 6e 6e 65 6c 20 24 74 65 73 74 49 6e 73 74 61 6c  nnel $testInstal
23110 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65 0d 0a  lVs2012LogFile..
23120 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
23130 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43       if {![haveC
23140 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
23150 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20  dArgs file_ \.. 
23160 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
23170 20 74 61 69 6c 20 24 74 65 73 74 49 6e 73 74 61   tail $testInsta
23180 6c 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 5d  llVs2013LogFile]
23190 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
231a0 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69        checkForFi
231b0 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c  le $test_channel
231c0 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32   $testInstallVs2
231d0 30 31 33 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20  013LogFile..    
231e0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
231f0 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74   if {![haveConst
23200 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
23210 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20  s file_ \..     
23220 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69         [file tai
23230 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73  l $testInstallVs
23240 32 30 31 35 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20  2015LogFile]]]} 
23250 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
23260 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24    checkForFile $
23270 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65  test_channel $te
23280 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c  stInstallVs2015L
23290 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20  ogFile..        
232a0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
232b0 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e  {![haveConstrain
232c0 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
232d0 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  le_ \..         
232e0 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74     [file tail $t
232f0 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30  estUninstallVs20
23300 30 35 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68  05LogFile]]]} th
23310 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
23320 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
23330 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74  st_channel $test
23340 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c  UninstallVs2005L
23350 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20  ogFile..        
23360 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
23370 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e  {![haveConstrain
23380 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
23390 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  le_ \..         
233a0 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74     [file tail $t
233b0 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30  estUninstallVs20
233c0 30 38 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68  08LogFile]]]} th
233d0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
233e0 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
233f0 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74  st_channel $test
23400 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c  UninstallVs2008L
23410 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20  ogFile..        
23420 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
23430 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e  {![haveConstrain
23440 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
23450 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  le_ \..         
23460 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74     [file tail $t
23470 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30  estUninstallVs20
23480 31 30 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68  10LogFile]]]} th
23490 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
234a0 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
234b0 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74  st_channel $test
234c0 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c  UninstallVs2010L
234d0 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20  ogFile..        
234e0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
234f0 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e  {![haveConstrain
23500 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
23510 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  le_ \..         
23520 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74     [file tail $t
23530 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30  estUninstallVs20
23540 31 32 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68  12LogFile]]]} th
23550 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
23560 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
23570 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74  st_channel $test
23580 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c  UninstallVs2012L
23590 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20  ogFile..        
235a0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
235b0 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e  {![haveConstrain
235c0 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
235d0 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  le_ \..         
235e0 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74     [file tail $t
235f0 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30  estUninstallVs20
23600 31 33 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68  13LogFile]]]} th
23610 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
23620 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
23630 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74  st_channel $test
23640 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c  UninstallVs2013L
23650 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20  ogFile..        
23660 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
23670 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e  {![haveConstrain
23680 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
23690 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  le_ \..         
236a0 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74     [file tail $t
236b0 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30  estUninstallVs20
236c0 31 35 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68  15LogFile]]]} th
236d0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
236e0 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
236f0 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74  st_channel $test
23700 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c  UninstallVs2015L
23710 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20  ogFile..        
23720 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
23730 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72  }.....    proc r
23740 75 6e 53 51 4c 69 74 65 54 65 73 74 46 69 6c 65  unSQLiteTestFile
23750 73 45 70 69 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a  sEpilogue {} {..
23760 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20        uplevel 1 
23770 7b 0d 0a 20 20 20 20 20 20 20 20 75 6e 73 65 74  {..        unset
23780 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 5c 0d 0a   -nocomplain \..
23790 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
237a0 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c  UninstallVs2015L
237b0 6f 67 46 69 6c 65 20 74 65 73 74 55 6e 69 6e 73  ogFile testUnins
237c0 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c  tallVs2013LogFil
237d0 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
237e0 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73   testUninstallVs
237f0 32 30 31 32 4c 6f 67 46 69 6c 65 20 74 65 73 74  2012LogFile test
23800 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c  UninstallVs2010L
23810 6f 67 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20  ogFile \..      
23820 20 20 20 20 20 20 74 65 73 74 55 6e 69 6e 73 74        testUninst
23830 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c 65  allVs2008LogFile
23840 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73   testUninstallVs
23850 32 30 30 35 4c 6f 67 46 69 6c 65 20 5c 0d 0a 20  2005LogFile \.. 
23860 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 49             testI
23870 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46  nstallVs2015LogF
23880 69 6c 65 20 74 65 73 74 49 6e 73 74 61 6c 6c 56  ile testInstallV
23890 73 32 30 31 33 4c 6f 67 46 69 6c 65 20 5c 0d 0a  s2013LogFile \..
238a0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
238b0 49 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67  InstallVs2012Log
238c0 46 69 6c 65 20 74 65 73 74 49 6e 73 74 61 6c 6c  File testInstall
238d0 56 73 32 30 31 30 4c 6f 67 46 69 6c 65 20 5c 0d  Vs2010LogFile \.
238e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
238f0 74 49 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f  tInstallVs2008Lo
23900 67 46 69 6c 65 20 74 65 73 74 49 6e 73 74 61 6c  gFile testInstal
23910 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 0d 0a  lVs2005LogFile..
23920 0d 0a 20 20 20 20 20 20 20 20 75 6e 73 65 74 20  ..        unset 
23930 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 5c 0d 0a 20  -nocomplain \.. 
23940 20 20 20 20 20 20 20 20 20 20 20 6e 6f 72 74 68             north
23950 77 69 6e 64 45 66 44 62 46 69 6c 65 20 74 65 73  windEfDbFile tes
23960 74 4c 69 6e 71 4f 75 74 46 69 6c 65 20 5c 0d 0a  tLinqOutFile \..
23970 20 20 20 20 20 20 20 20 20 20 20 20 77 61 6c 44              walD
23980 62 46 69 6c 65 20 6e 6f 6e 57 61 6c 44 62 46 69  bFile nonWalDbFi
23990 6c 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 75 6e  le....        un
239a0 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20  set -nocomplain 
239b0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  \..            t
239c0 65 73 74 45 66 36 45 78 65 46 69 6c 65 20 74 65  estEf6ExeFile te
239d0 73 74 4c 69 6e 71 45 78 65 46 69 6c 65 20 5c 0d  stLinqExeFile \.
239e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
239f0 74 45 78 65 46 69 6c 65 20 73 79 73 74 65 6d 44  tExeFile systemD
23a00 61 74 61 53 51 4c 69 74 65 45 66 36 44 6c 6c 46  ataSQLiteEf6DllF
23a10 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ile \..         
23a20 20 20 20 73 79 73 74 65 6d 44 61 74 61 53 51 4c     systemDataSQL
23a30 69 74 65 4c 69 6e 71 44 6c 6c 46 69 6c 65 20 73  iteLinqDllFile s
23a40 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65 44  ystemDataSQLiteD
23a50 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20  llFile \..      
23a60 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 73 69        sqliteDesi
23a70 67 6e 65 72 44 6c 6c 46 69 6c 65 20 69 6e 73 74  gnerDllFile inst
23a80 61 6c 6c 65 72 45 78 65 46 69 6c 65 20 5c 0d 0a  allerExeFile \..
23a90 20 20 20 20 20 20 20 20 20 20 20 20 65 6e 74 69              enti
23aa0 74 79 46 72 61 6d 65 77 6f 72 6b 44 6c 6c 46 69  tyFrameworkDllFi
23ab0 6c 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  le..      }..   
23ac0 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
23ad0 72 75 6e 53 51 4c 69 74 65 54 65 73 74 45 70 69  runSQLiteTestEpi
23ae0 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20 20 20 20  logue {} {..    
23af0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
23b00 45 3a 20 53 6b 69 70 20 72 75 6e 6e 69 6e 67 20  E: Skip running 
23b10 6f 75 72 20 63 75 73 74 6f 6d 20 65 70 69 6c 6f  our custom epilo
23b20 67 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20  gue if the main 
23b30 6f 6e 65 20 68 61 73 20 62 65 65 6e 0d 0a 20 20  one has been..  
23b40 20 20 20 20 23 20 20 20 20 20 20 20 73 6b 69 70      #       skip
23b50 70 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ped...      #.. 
23b60 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
23b70 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 70 69 6c  exists ::no(epil
23b80 6f 67 75 65 2e 65 61 67 6c 65 29 5d 7d 20 74 68  ogue.eagle)]} th
23b90 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
23ba0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
23bb0 20 53 68 6f 77 20 77 68 65 6e 20 6f 75 72 20 74   Show when our t
23bc0 65 73 74 73 20 61 63 74 75 61 6c 6c 79 20 65 6e  ests actually en
23bd0 64 65 64 20 28 6e 6f 77 29 2e 0d 0a 20 20 20 20  ded (now)...    
23be0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74      #..        t
23bf0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
23c00 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
23c10 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
23c20 22 2d 2d 2d 2d 20 53 79 73 74 65 6d 2e 44 61 74  "---- System.Dat
23c30 61 2e 53 51 4c 69 74 65 20 74 65 73 74 73 20 65  a.SQLite tests e
23c40 6e 64 65 64 20 61 74 20 22 20 5c 0d 0a 20 20 20  nded at " \..   
23c50 20 20 20 20 20 20 20 20 20 5b 63 6c 6f 63 6b 20           [clock 
23c60 66 6f 72 6d 61 74 20 5b 63 6c 6f 63 6b 20 73 65  format [clock se
23c70 63 6f 6e 64 73 5d 5d 20 5c 6e 5d 0d 0a 0d 0a 20  conds]] \n].... 
23c80 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
23c90 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 74    # NOTE: Load t
23ca0 68 65 20 22 65 70 69 6c 6f 67 75 65 22 20 63 75  he "epilogue" cu
23cb0 73 74 6f 6d 20 70 65 72 2d 75 73 65 72 20 61 6e  stom per-user an
23cc0 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74 20 74 65  d/or per-host te
23cd0 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  st..        #   
23ce0 20 20 20 20 73 65 74 74 69 6e 67 73 20 6e 6f 77      settings now
23cf0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
23d00 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20        uplevel 1 
23d10 5b 6c 69 73 74 20 6c 6f 61 64 53 51 4c 69 74 65  [list loadSQLite
23d20 54 65 73 74 53 65 74 74 69 6e 67 73 20 24 3a 3a  TestSettings $::
23d30 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 2e 65 70  test_channel .ep
23d40 69 6c 6f 67 75 65 5d 0d 0a 0d 0a 20 20 20 20 20  ilogue]....     
23d50 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
23d60 42 55 47 46 49 58 3a 20 42 65 66 6f 72 65 20 63  BUGFIX: Before c
23d70 68 65 63 6b 69 6e 67 20 74 68 65 20 66 69 6e 61  hecking the fina
23d80 6c 20 72 65 73 6f 75 72 63 65 73 20 69 6e 20 75  l resources in u
23d90 73 65 20 62 79 20 53 51 4c 69 74 65 2c 20 6d 61  se by SQLite, ma
23da0 6b 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ke..        #   
23db0 20 20 20 20 20 20 73 75 72 65 20 62 6f 74 68 20        sure both 
23dc0 6f 66 20 74 68 65 20 50 52 41 47 4d 41 20 72 65  of the PRAGMA re
23dd0 6c 61 74 65 64 20 64 69 72 65 63 74 6f 72 79 20  lated directory 
23de0 6e 61 6d 65 73 20 61 72 65 20 66 72 65 65 64 2e  names are freed.
23df0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
23e00 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c       checkForSQL
23e10 69 74 65 44 69 72 65 63 74 6f 72 69 65 73 20 24  iteDirectories $
23e20 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74  ::test_channel t
23e30 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  rue....        #
23e40 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
23e50 3a 20 41 6c 73 6f 20 72 65 70 6f 72 74 20 74 68  : Also report th
23e60 65 20 72 65 73 6f 75 72 63 65 20 75 73 61 67 65  e resource usage
23e70 20 61 66 74 65 72 20 72 75 6e 6e 69 6e 67 20 74   after running t
23e80 68 65 20 74 65 73 74 73 2e 0d 0a 20 20 20 20 20  he tests...     
23e90 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
23ea0 70 6f 72 74 53 51 4c 69 74 65 52 65 73 6f 75 72  portSQLiteResour
23eb0 63 65 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  ces $::test_chan
23ec0 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  nel....        #
23ed0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
23ee0 3a 20 52 65 70 6f 72 74 20 74 68 65 20 63 72 69  : Report the cri
23ef0 74 69 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75  tical handle cou
23f00 6e 74 73 20 61 66 74 65 72 20 72 75 6e 6e 69 6e  nts after runnin
23f10 67 20 74 68 65 20 74 65 73 74 73 2e 0d 0a 20 20  g the tests...  
23f20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
23f30 20 67 65 74 53 51 4c 69 74 65 48 61 6e 64 6c 65   getSQLiteHandle
23f40 43 6f 75 6e 74 73 20 24 3a 3a 74 65 73 74 5f 63  Counts $::test_c
23f50 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20  hannel....      
23f60 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
23f70 4f 54 45 3a 20 49 66 20 6e 65 63 65 73 73 61 72  OTE: If necessar
23f80 79 2c 20 64 69 73 61 62 6c 65 20 73 68 61 72 65  y, disable share
23f90 64 2d 63 61 63 68 65 20 6d 6f 64 65 20 6e 6f 77  d-cache mode now
23fa0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
23fb0 20 20 20 20 20 20 69 66 20 7b 5b 68 61 73 52 75        if {[hasRu
23fc0 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 73 68 61 72  ntimeOption shar
23fd0 65 64 43 61 63 68 65 5d 7d 20 74 68 65 6e 20 7b  edCache]} then {
23fe0 0d 0a 20 20 20 20 20 20 20 20 20 20 65 6e 61 62  ..          enab
23ff0 6c 65 53 68 61 72 65 64 43 61 63 68 65 20 24 3a  leSharedCache $:
24000 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 66 61  :test_channel fa
24010 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  lse..        }..
24020 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
24030 0c 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23  ...    #########
24040 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
24050 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
24060 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
24070 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
24080 23 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23  ##..    ########
24090 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
240a0 23 23 23 23 23 20 45 4e 44 20 45 61 67 6c 65 20  ##### END Eagle 
240b0 4f 4e 4c 59 20 23 23 23 23 23 23 23 23 23 23 23  ONLY ###########
240c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
240d0 23 23 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23  ###..    #######
240e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
240f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
24100 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
24110 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
24120 23 23 23 23 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23  ####..  }....  #
24130 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 53 61 76 65  ..  # NOTE: Save
24140 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
24150 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61   directory conta
24160 69 6e 69 6e 67 20 74 68 69 73 20 66 69 6c 65 2e  ining this file.
24170 0d 0a 20 20 23 0d 0a 20 20 69 66 20 7b 21 5b 69  ..  #..  if {![i
24180 6e 66 6f 20 65 78 69 73 74 73 20 63 6f 6d 6d 6f  nfo exists commo
24190 6e 5f 64 69 72 65 63 74 6f 72 79 5d 7d 20 74 68  n_directory]} th
241a0 65 6e 20 7b 0d 0a 20 20 20 20 73 65 74 20 63 6f  en {..    set co
241b0 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 20 5b  mmon_directory [
241c0 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b 69 6e  file dirname [in
241d0 66 6f 20 73 63 72 69 70 74 5d 5d 0d 0a 20 20 7d  fo script]]..  }
241e0 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54  ....  #..  # NOT
241f0 45 3a 20 50 72 6f 76 69 64 65 20 74 68 65 20 53  E: Provide the S
24200 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
24210 65 20 74 65 73 74 20 70 61 63 6b 61 67 65 20 74  e test package t
24220 6f 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65  o the interprete
24230 72 2e 0d 0a 20 20 23 0d 0a 20 20 70 61 63 6b 61  r...  #..  packa
24240 67 65 20 70 72 6f 76 69 64 65 20 53 79 73 74 65  ge provide Syste
24250 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 54 65  m.Data.SQLite.Te
24260 73 74 20 31 2e 30 0d 0a 7d 0d 0a                 st 1.0..}..