System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 05ca873d260a61a412a569567b71f5146c154373:


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 0d 0a 20 20  turn netFx46..  
1fd0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1fe0: 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74           default
1ff0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2000: 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78 33 35    return netFx35
2010: 3b 20 23 20 54 4f 44 4f 3a 20 47 6f 6f 64 20 22  ; # TODO: Good "
2020: 66 61 6c 6c 62 61 63 6b 22 20 64 65 66 61 75 6c  fallback" defaul
2030: 74 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t?..            
2040: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
2050: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
2060: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
2070: 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a    #..    # NOTE:
2080: 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   This procedure 
2090: 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 6e 6f  should return no
20a0: 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 63 6f  n-zero if the co
20b0: 6e 66 69 67 75 72 65 64 20 74 65 73 74 0d 0a 20  nfigured test.. 
20c0: 20 20 20 23 20 20 20 20 20 20 20 70 6c 61 74 66     #       platf
20d0: 6f 72 6d 20 69 73 20 6d 6f 73 74 20 6c 69 6b 65  orm is most like
20e0: 6c 79 20 74 68 65 20 64 65 66 61 75 6c 74 20 66  ly the default f
20f0: 6f 72 20 74 68 69 73 20 6d 61 63 68 69 6e 65 2e  or this machine.
2100: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 70 72 6f  ..    #..    pro
2110: 63 20 69 73 44 65 66 61 75 6c 74 42 75 69 6c 64  c isDefaultBuild
2120: 50 6c 61 74 66 6f 72 6d 20 7b 20 7b 76 65 72 62  Platform { {verb
2130: 6f 73 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  ose false} } {..
2140: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
2150: 20 4e 4f 54 45 3a 20 52 75 6e 6e 69 6e 67 20 6f   NOTE: Running o
2160: 6e 20 57 6f 57 36 34 20 69 73 20 6e 65 76 65 72  n WoW64 is never
2170: 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 6c 61   the default pla
2180: 74 66 6f 72 6d 2e 0d 0a 20 20 20 20 20 20 23 0d  tform...      #.
2190: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 73 52 75  .      if {[isRu
21a0: 6e 6e 69 6e 67 57 6f 57 36 34 5d 7d 20 74 68 65  nningWoW64]} the
21b0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
21c0: 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20  {$verbose} then 
21d0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
21e0: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
21f0: 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  el \..          
2200: 20 20 20 20 22 2d 2d 2d 2d 20 64 65 74 65 63 74      "---- detect
2210: 65 64 20 6e 6f 6e 2d 64 65 66 61 75 6c 74 20 70  ed non-default p
2220: 6c 61 74 66 6f 72 6d 20 28 57 6f 57 36 34 29 5c  latform (WoW64)\
2230: 6e 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  n"..        }.. 
2240: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61         return fa
2250: 6c 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  lse..      }....
2260: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
2270: 20 4e 4f 54 45 3a 20 54 68 69 73 20 68 61 73 20   NOTE: This has 
2280: 61 20 67 6f 6f 64 20 63 68 61 6e 63 65 20 6f 66  a good chance of
2290: 20 62 65 69 6e 67 20 74 68 65 20 64 65 66 61 75   being the defau
22a0: 6c 74 20 70 6c 61 74 66 6f 72 6d 2e 0d 0a 20 20  lt platform...  
22b0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
22c0: 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20  {$verbose} then 
22d0: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
22e0: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
22f0: 20 22 2d 2d 2d 2d 20 64 65 74 65 63 74 65 64 20   "---- detected 
2300: 64 65 66 61 75 6c 74 20 70 6c 61 74 66 6f 72 6d  default platform
2310: 5c 6e 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  \n"..      }..  
2320: 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d      return true.
2330: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
2340: 72 6f 63 20 67 65 74 42 75 69 6c 64 50 6c 61 74  roc getBuildPlat
2350: 66 6f 72 6d 20 7b 20 6e 61 74 69 76 65 20 7d 20  form { native } 
2360: 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  {..      if {[in
2370: 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74  fo exists ::test
2380: 5f 70 6c 61 74 66 6f 72 6d 5d 20 26 26 20 5c 0d  _platform] && \.
2390: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
23a0: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73  ng length $::tes
23b0: 74 5f 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d  t_platform] > 0}
23c0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
23d0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
23e0: 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63  TE: Use the spec
23f0: 69 66 69 65 64 20 74 65 73 74 20 70 6c 61 74 66  ified test platf
2400: 6f 72 6d 2e 20 20 49 66 20 74 68 69 73 20 76 61  orm.  If this va
2410: 72 69 61 62 6c 65 20 69 73 20 6e 6f 74 20 73 65  riable is not se
2420: 74 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  t,..        #   
2430: 20 20 20 20 74 68 65 20 64 65 66 61 75 6c 74 20      the default 
2440: 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 20 62 61  value will be ba
2450: 73 65 64 20 6f 6e 20 74 68 65 20 6d 61 63 68 69  sed on the machi
2460: 6e 65 20 61 72 63 68 69 74 65 63 74 75 72 65 2e  ne architecture.
2470: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2480: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70       return [exp
2490: 72 20 7b 24 6e 61 74 69 76 65 20 3f 20 24 3a 3a  r {$native ? $::
24a0: 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d 20 3a 20  test_platform : 
24b0: 22 22 7d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  ""}]..      } el
24c0: 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73  seif {[info exis
24d0: 74 73 20 3a 3a 74 65 73 74 5f 6d 61 63 68 69 6e  ts ::test_machin
24e0: 65 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  e] && \..       
24f0: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
2500: 68 20 24 3a 3a 74 65 73 74 5f 6d 61 63 68 69 6e  h $::test_machin
2510: 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
2520: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2530: 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 6e     # NOTE: For n
2540: 61 74 69 76 65 20 62 75 69 6c 64 73 2c 20 72 65  ative builds, re
2550: 74 75 72 6e 20 74 68 65 20 70 6c 61 74 66 6f 72  turn the platfor
2560: 6d 20 6e 61 6d 65 20 63 6f 72 72 65 73 70 6f 6e  m name correspon
2570: 64 69 6e 67 20 74 6f 0d 0a 20 20 20 20 20 20 20  ding to..       
2580: 20 23 20 20 20 20 20 20 20 74 68 65 20 74 65 73   #       the tes
2590: 74 20 6d 61 63 68 69 6e 65 20 61 72 63 68 69 74  t machine archit
25a0: 65 63 74 75 72 65 3b 20 6f 74 68 65 72 77 69 73  ecture; otherwis
25b0: 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70  e, return an emp
25c0: 74 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ty..        #   
25d0: 20 20 20 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20      string...   
25e0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
25f0: 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 0d 0a  return [expr {..
2600: 20 20 20 20 20 20 20 20 20 20 24 6e 61 74 69 76            $nativ
2610: 65 20 3f 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c  e ? [machineToPl
2620: 61 74 66 6f 72 6d 20 24 3a 3a 74 65 73 74 5f 6d  atform $::test_m
2630: 61 63 68 69 6e 65 5d 20 3a 20 22 22 0d 0a 20 20  achine] : ""..  
2640: 20 20 20 20 20 20 7d 5d 0d 0a 20 20 20 20 20 20        }]..      
2650: 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20  } elseif {[info 
2660: 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61  exists ::tcl_pla
2670: 74 66 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 7d  tform(machine)]}
2680: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2690: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
26a0: 54 45 3a 20 46 6f 72 20 6e 61 74 69 76 65 20 62  TE: For native b
26b0: 75 69 6c 64 73 2c 20 72 65 74 75 72 6e 20 74 68  uilds, return th
26c0: 65 20 70 6c 61 74 66 6f 72 6d 20 6e 61 6d 65 20  e platform name 
26d0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
26e0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
26f0: 20 20 74 68 65 20 6d 61 63 68 69 6e 65 20 61 72    the machine ar
2700: 63 68 69 74 65 63 74 75 72 65 3b 20 6f 74 68 65  chitecture; othe
2710: 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e  rwise, return an
2720: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0d 0a   empty string...
2730: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2740: 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20     return [expr 
2750: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 24 6e 61  {..          $na
2760: 74 69 76 65 20 3f 20 5b 6d 61 63 68 69 6e 65 54  tive ? [machineT
2770: 6f 50 6c 61 74 66 6f 72 6d 20 24 3a 3a 74 63 6c  oPlatform $::tcl
2780: 5f 70 6c 61 74 66 6f 72 6d 28 6d 61 63 68 69 6e  _platform(machin
2790: 65 29 5d 20 3a 20 22 22 0d 0a 20 20 20 20 20 20  e)] : ""..      
27a0: 20 20 7d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c    }]..      } el
27b0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
27c0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
27d0: 20 4e 6f 20 6d 61 63 68 69 6e 65 20 61 72 63 68   No machine arch
27e0: 69 74 65 63 74 75 72 65 20 69 73 20 61 76 61 69  itecture is avai
27f0: 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 6e  lable, return an
2800: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0d 0a   empty string...
2810: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2820: 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  It is important 
2830: 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70  to return an emp
2840: 74 79 20 73 74 72 69 6e 67 20 68 65 72 65 20 62  ty string here b
2850: 65 63 61 75 73 65 20 74 68 65 0d 0a 20 20 20 20  ecause the..    
2860: 20 20 20 20 23 20 20 20 20 20 20 20 72 65 73 75      #       resu
2870: 6c 74 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65  lt of this proce
2880: 64 75 72 65 20 6d 61 79 20 62 65 20 75 73 65 64  dure may be used
2890: 20 77 69 74 68 20 5b 66 69 6c 65 20 6a 6f 69 6e   with [file join
28a0: 5d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ]...        #.. 
28b0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22         return ""
28c0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
28d0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
28e0: 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74  tBuildConfigurat
28f0: 69 6f 6e 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  ion {} {..      
2900: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
2910: 20 53 65 65 20 69 66 20 74 68 65 20 22 63 6f 6e   See if the "con
2920: 66 69 67 75 72 61 74 69 6f 6e 22 20 73 65 74 74  figuration" sett
2930: 69 6e 67 20 68 61 73 20 62 65 65 6e 20 6f 76 65  ing has been ove
2940: 72 72 69 64 64 65 6e 20 62 79 20 74 68 65 0d 0a  rridden by the..
2950: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73        #       us
2960: 65 72 20 28 65 2e 67 2e 20 6f 6e 20 74 68 65 20  er (e.g. on the 
2970: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 20 20  command line).  
2980: 54 68 69 73 20 68 65 6c 70 73 20 63 6f 6e 74 72  This helps contr
2990: 6f 6c 20 65 78 61 63 74 6c 79 0d 0a 20 20 20 20  ol exactly..    
29a0: 20 20 23 20 20 20 20 20 20 20 77 68 69 63 68 20    #       which 
29b0: 73 65 74 20 6f 66 20 62 69 6e 61 72 69 65 73 20  set of binaries 
29c0: 77 65 20 61 72 65 20 74 65 73 74 69 6e 67 20 28  we are testing (
29d0: 69 2e 65 2e 20 74 68 6f 73 65 20 62 75 69 6c 74  i.e. those built
29e0: 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23   in the..      #
29f0: 20 20 20 20 20 20 20 22 44 65 62 75 67 22 20 6f         "Debug" o
2a00: 72 20 22 52 65 6c 65 61 73 65 22 20 62 75 69 6c  r "Release" buil
2a10: 64 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  d configurations
2a20: 29 2e 20 20 54 6f 20 6f 76 65 72 72 69 64 65 20  ).  To override 
2a30: 74 68 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20  this..      #   
2a40: 20 20 20 20 76 61 6c 75 65 20 76 69 61 20 74 68      value via th
2a50: 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2c 20  e command line, 
2a60: 65 6e 74 65 72 20 61 20 63 6f 6d 6d 61 6e 64 20  enter a command 
2a70: 73 69 6d 69 6c 61 72 20 74 6f 20 6f 6e 65 20 6f  similar to one o
2a80: 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  f..      #      
2a90: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 28   the following (
2aa0: 61 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65 29  all on one line)
2ab0: 3a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  :..      #..    
2ac0: 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53    #       EagleS
2ad0: 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69  hell.exe -anyIni
2ae0: 74 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65 73  tialize "set tes
2af0: 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  t_configuration 
2b00: 44 65 62 75 67 22 0d 0a 20 20 20 20 20 20 23 20  Debug"..      # 
2b10: 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c          -file .\
2b20: 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c  path\to\all.eagl
2b30: 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  e..      #..    
2b40: 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53    #       EagleS
2b50: 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69  hell.exe -anyIni
2b60: 74 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65 73  tialize "set tes
2b70: 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  t_configuration 
2b80: 52 65 6c 65 61 73 65 22 0d 0a 20 20 20 20 20 20  Release"..      
2b90: 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20  #         -file 
2ba0: 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61  .\path\to\all.ea
2bb0: 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  gle..      #..  
2bc0: 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c      #       Eagl
2bd0: 65 53 68 65 6c 6c 2e 65 78 65 20 2d 66 69 6c 65  eShell.exe -file
2be0: 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65   .\path\to\all.e
2bf0: 61 67 6c 65 20 2d 70 72 65 54 65 73 74 0d 0a 20  agle -preTest.. 
2c00: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 22       #         "
2c10: 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69  unset -nocomplai
2c20: 6e 20 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61  n test_configura
2c30: 74 69 6f 6e 22 0d 0a 20 20 20 20 20 20 23 0d 0a  tion"..      #..
2c40: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
2c50: 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 63 6f  exists ::test_co
2c60: 6e 66 69 67 75 72 61 74 69 6f 6e 5d 20 26 26 20  nfiguration] && 
2c70: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
2c80: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74  ring length $::t
2c90: 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f  est_configuratio
2ca0: 6e 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  n] > 0} then {..
2cb0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2cc0: 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74     # NOTE: Use t
2cd0: 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65 73  he specified tes
2ce0: 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  t configuration.
2cf0: 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61    The default va
2d00: 6c 75 65 20 75 73 65 64 0d 0a 20 20 20 20 20 20  lue used..      
2d10: 20 20 23 20 20 20 20 20 20 20 66 6f 72 20 74 68    #       for th
2d20: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 74  is variable is t
2d30: 79 70 69 63 61 6c 6c 79 20 22 52 65 6c 65 61 73  ypically "Releas
2d40: 65 22 2c 20 61 73 20 73 65 74 20 62 79 20 74 68  e", as set by th
2d50: 65 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20  e test..        
2d60: 23 20 20 20 20 20 20 20 73 75 69 74 65 20 69 74  #       suite it
2d70: 73 65 6c 66 2e 0d 0a 20 20 20 20 20 20 20 20 23  self...        #
2d80: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
2d90: 20 24 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75   $::test_configu
2da0: 72 61 74 69 6f 6e 0d 0a 20 20 20 20 20 20 7d 20  ration..      } 
2db0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
2dc0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
2dd0: 45 3a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 77 65 20  E: Normally, we 
2de0: 77 69 6c 6c 20 6e 65 76 65 72 20 68 69 74 20 74  will never hit t
2df0: 68 69 73 20 63 61 73 65 20 62 65 63 61 75 73 65  his case because
2e00: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
2e10: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
2e20: 20 20 20 74 65 73 74 20 63 6f 6e 66 69 67 75 72     test configur
2e30: 61 74 69 6f 6e 20 76 61 72 69 61 62 6c 65 20 69  ation variable i
2e40: 73 20 61 6c 77 61 79 73 20 73 65 74 20 62 79 20  s always set by 
2e50: 74 68 65 20 74 65 73 74 20 73 75 69 74 65 0d 0a  the test suite..
2e60: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2e70: 69 74 73 65 6c 66 3b 20 68 6f 77 65 76 65 72 2c  itself; however,
2e80: 20 69 74 20 63 61 6e 20 62 65 20 6f 76 65 72 72   it can be overr
2e90: 69 64 64 65 6e 20 75 73 69 6e 67 20 74 68 65 20  idden using the 
2ea0: 75 6e 73 65 74 20 63 6f 6d 6d 61 6e 64 0d 0a 20  unset command.. 
2eb0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66         #       f
2ec0: 72 6f 6d 20 74 68 65 20 2d 70 72 65 54 65 73 74  rom the -preTest
2ed0: 20 6f 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 74   option to the t
2ee0: 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20  est suite...    
2ef0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
2f00: 65 74 75 72 6e 20 24 3a 3a 65 61 67 6c 65 5f 70  eturn $::eagle_p
2f10: 6c 61 74 66 6f 72 6d 28 63 6f 6e 66 69 67 75 72  latform(configur
2f20: 61 74 69 6f 6e 29 0d 0a 20 20 20 20 20 20 7d 0d  ation)..      }.
2f30: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
2f40: 72 6f 63 20 67 65 74 42 75 69 6c 64 43 6f 6e 66  roc getBuildConf
2f50: 69 67 75 72 61 74 69 6f 6e 73 20 7b 7d 20 7b 0d  igurations {} {.
2f60: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
2f70: 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66 20 74  # NOTE: See if t
2f80: 68 65 20 6c 69 73 74 20 6f 66 20 74 65 73 74 20  he list of test 
2f90: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 68  configurations h
2fa0: 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64  as been overridd
2fb0: 65 6e 20 62 79 0d 0a 20 20 20 20 20 20 23 20 20  en by..      #  
2fc0: 20 20 20 20 20 74 68 65 20 75 73 65 72 20 28 65       the user (e
2fd0: 2e 67 2e 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61  .g. on the comma
2fe0: 6e 64 20 6c 69 6e 65 29 2e 0d 0a 20 20 20 20 20  nd line)...     
2ff0: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
3000: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73  nfo exists ::tes
3010: 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  t_configurations
3020: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
3030: 20 20 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a 74 65    [llength $::te
3040: 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  st_configuration
3050: 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  s] > 0} then {..
3060: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
3070: 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74     # NOTE: Use t
3080: 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 69 73  he specified lis
3090: 74 20 6f 66 20 74 65 73 74 20 63 6f 6e 66 69 67  t of test config
30a0: 75 72 61 74 69 6f 6e 73 2e 0d 0a 20 20 20 20 20  urations...     
30b0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
30c0: 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 63 6f 6e  turn $::test_con
30d0: 66 69 67 75 72 61 74 69 6f 6e 73 0d 0a 20 20 20  figurations..   
30e0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
30f0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
3100: 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20  # NOTE: Use the 
3110: 64 65 66 61 75 6c 74 20 6c 69 73 74 20 6f 66 20  default list of 
3120: 74 65 73 74 20 63 6f 6e 66 69 67 75 72 61 74 69  test configurati
3130: 6f 6e 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ons...        #.
3140: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
3150: 5b 6c 69 73 74 20 44 65 62 75 67 20 52 65 6c 65  [list Debug Rele
3160: 61 73 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  ase]..      }.. 
3170: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
3180: 63 20 67 65 74 42 75 69 6c 64 42 61 73 65 44 69  c getBuildBaseDi
3190: 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20  rectory {} {..  
31a0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
31b0: 4f 54 45 3a 20 46 69 67 75 72 65 20 6f 75 74 20  OTE: Figure out 
31c0: 74 68 65 20 62 61 73 65 20 64 69 72 65 63 74 6f  the base directo
31d0: 72 79 20 77 68 65 72 65 20 61 6c 6c 20 74 68 65  ry where all the
31e0: 20 62 75 69 6c 64 73 20 73 68 6f 75 6c 64 20 62   builds should b
31f0: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
3200: 20 6c 6f 63 61 74 65 64 2e 20 20 54 68 69 73 20   located.  This 
3210: 77 69 6c 6c 20 62 65 20 74 68 65 20 64 69 72 65  will be the dire
3220: 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61  ctory that conta
3230: 69 6e 73 20 74 68 65 20 61 63 74 75 61 6c 0d 0a  ins the actual..
3240: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 75        #       bu
3250: 69 6c 64 20 6f 75 74 70 75 74 20 64 69 72 65 63  ild output direc
3260: 74 6f 72 79 20 28 65 2e 67 2e 20 70 61 72 65 6e  tory (e.g. paren
3270: 74 20 6f 66 20 22 62 69 6e 22 29 2e 0d 0a 20 20  t of "bin")...  
3280: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
3290: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
32a0: 62 75 69 6c 64 5f 62 61 73 65 5f 64 69 72 65 63  build_base_direc
32b0: 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20  tory] && \..    
32c0: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
32d0: 6e 67 74 68 20 24 3a 3a 62 75 69 6c 64 5f 62 61  ngth $::build_ba
32e0: 73 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20  se_directory] > 
32f0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
3300: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
3310: 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69  NOTE: The locati
3320: 6f 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 64 20  on of the build 
3330: 62 61 73 65 20 64 69 72 65 63 74 6f 72 79 20 68  base directory h
3340: 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64  as been overridd
3350: 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20  en;..        #  
3360: 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20       therefore, 
3370: 75 73 65 20 69 74 20 76 65 72 62 61 74 69 6d 2e  use it verbatim.
3380: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
3390: 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 62       return $::b
33a0: 75 69 6c 64 5f 62 61 73 65 5f 64 69 72 65 63 74  uild_base_direct
33b0: 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  ory..      } els
33c0: 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74  eif {[info exist
33d0: 73 20 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63  s ::common_direc
33e0: 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20  tory] && \..    
33f0: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
3400: 6e 67 74 68 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64  ngth $::common_d
3410: 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74  irectory] > 0} t
3420: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
3430: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
3440: 3a 20 4e 65 78 74 2c 20 66 61 6c 6c 62 61 63 6b  : Next, fallback
3450: 20 74 6f 20 74 68 65 20 67 72 61 6e 64 70 61 72   to the grandpar
3460: 65 6e 74 20 64 69 72 65 63 74 6f 72 79 20 6f 66  ent directory of
3470: 20 74 68 65 20 6f 6e 65 0d 0a 20 20 20 20 20 20   the one..      
3480: 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74 61 69    #       contai
3490: 6e 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20 28  ning this file (
34a0: 69 2e 65 2e 20 22 63 6f 6d 6d 6f 6e 2e 65 61 67  i.e. "common.eag
34b0: 6c 65 22 29 2c 20 69 66 20 61 76 61 69 6c 61 62  le"), if availab
34c0: 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  le...        #..
34d0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
34e0: 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b 66 69  file dirname [fi
34f0: 6c 65 20 64 69 72 6e 61 6d 65 20 24 3a 3a 63 6f  le dirname $::co
3500: 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 5d  mmon_directory]]
3510: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66  ..      } elseif
3520: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
3530: 3a 70 61 74 68 5d 20 26 26 20 5c 0d 0a 20 20 20  :path] && \..   
3540: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
3550: 65 6e 67 74 68 20 24 3a 3a 70 61 74 68 5d 20 3e  ength $::path] >
3560: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
3570: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
3580: 20 4e 4f 54 45 3a 20 46 69 6e 61 6c 6c 79 2c 20   NOTE: Finally, 
3590: 66 61 6c 6c 62 61 63 6b 20 74 6f 20 74 68 65 20  fallback to the 
35a0: 70 61 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79  parent directory
35b0: 20 6f 66 20 74 68 65 20 45 61 67 6c 65 54 65 73   of the EagleTes
35c0: 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
35d0: 20 20 20 70 61 74 68 2e 20 20 54 68 65 20 45 61     path.  The Ea
35e0: 67 6c 65 54 65 73 74 20 70 61 63 6b 61 67 65 20  gleTest package 
35f0: 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20  guarantees that 
3600: 74 68 69 73 20 76 61 72 69 61 62 6c 65 0d 0a 20  this variable.. 
3610: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77         #       w
3620: 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 74 68  ill be set to th
3630: 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74  e directory cont
3640: 61 69 6e 69 6e 67 20 74 68 65 20 66 69 72 73 74  aining the first
3650: 20 66 69 6c 65 20 74 6f 0d 0a 20 20 20 20 20 20   file to..      
3660: 20 20 23 20 20 20 20 20 20 20 65 78 65 63 75 74    #       execut
3670: 65 20 74 68 65 20 5b 72 75 6e 54 65 73 74 50 72  e the [runTestPr
3680: 6f 6c 6f 67 75 65 5d 20 73 63 72 69 70 74 20 6c  ologue] script l
3690: 69 62 72 61 72 79 20 70 72 6f 63 65 64 75 72 65  ibrary procedure
36a0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
36b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69        return [fi
36c0: 6c 65 20 64 69 72 6e 61 6d 65 20 24 3a 3a 70 61  le dirname $::pa
36d0: 74 68 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  th]..      } els
36e0: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e {..        #..
36f0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
3700: 4e 6f 20 70 61 74 68 20 69 73 20 61 76 61 69 6c  No path is avail
3710: 61 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 6e 20  able, return an 
3720: 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 20 54  empty string.  T
3730: 68 69 73 20 70 6f 69 6e 74 0d 0a 20 20 20 20 20  his point..     
3740: 20 20 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c     #       shoul
3750: 64 20 6e 6f 74 20 62 65 20 72 65 61 63 68 65 64  d not be reached
3760: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
3770: 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d        return "".
3780: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
3790: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
37a0: 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61  SQLiteTestDataPa
37b0: 74 68 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  th {} {..      #
37c0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
37d0: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 64  Figure out the d
37e0: 69 72 65 63 74 6f 72 79 20 77 68 65 72 65 20 61  irectory where a
37f0: 6c 6c 20 74 68 65 20 74 65 73 74 20 64 61 74 61  ll the test data
3800: 20 66 69 6c 65 73 20 73 68 6f 75 6c 64 0d 0a 20   files should.. 
3810: 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65 20       #       be 
3820: 6c 6f 63 61 74 65 64 2e 20 20 54 68 69 73 20 73  located.  This s
3830: 68 6f 75 6c 64 20 62 65 20 74 68 65 20 22 64 61  hould be the "da
3840: 74 61 22 20 64 69 72 65 63 74 6f 72 79 20 62 65  ta" directory be
3850: 6e 65 61 74 68 20 74 68 65 0d 0a 20 20 20 20 20  neath the..     
3860: 20 23 20 20 20 20 20 20 20 64 69 72 65 63 74 6f   #       directo
3870: 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ry containing th
3880: 65 20 61 63 74 75 61 6c 20 74 65 73 74 20 73 63  e actual test sc
3890: 72 69 70 74 73 2e 0d 0a 20 20 20 20 20 20 23 0d  ripts...      #.
38a0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66  .      return [f
38b0: 69 6c 65 20 6a 6f 69 6e 20 24 3a 3a 70 61 74 68  ile join $::path
38c0: 20 64 61 74 61 5d 0d 0a 20 20 20 20 7d 0d 0a 0c   data]..    }...
38d0: 0d 0a 20 20 20 20 70 72 6f 63 20 69 73 52 75 6e  ..    proc isRun
38e0: 6e 69 6e 67 57 6f 57 36 34 20 7b 7d 20 7b 0d 0a  ningWoW64 {} {..
38f0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
3900: 20 4e 4f 54 45 3a 20 46 6f 72 20 6e 6f 77 2c 20   NOTE: For now, 
3910: 6a 75 73 74 20 75 73 65 20 74 68 65 20 65 78 69  just use the exi
3920: 73 74 69 6e 67 20 74 65 73 74 20 63 6f 6e 73 74  sting test const
3930: 72 61 69 6e 74 20 66 6f 72 20 64 65 74 65 63 74  raint for detect
3940: 69 6e 67 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ing..      #    
3950: 20 20 20 61 20 57 6f 57 36 34 20 70 72 6f 63 65     a WoW64 proce
3960: 73 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ss...      #..  
3970: 20 20 20 20 72 65 74 75 72 6e 20 5b 68 61 76 65      return [have
3980: 43 6f 6e 73 74 72 61 69 6e 74 20 77 6f 77 36 34  Constraint wow64
3990: 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  ]..    }.....   
39a0: 20 70 72 6f 63 20 69 73 4d 69 78 65 64 4d 6f 64   proc isMixedMod
39b0: 65 41 73 73 65 6d 62 6c 79 20 7b 20 66 69 6c 65  eAssembly { file
39c0: 4e 61 6d 65 20 7b 76 61 72 4e 61 6d 65 20 22 22  Name {varName ""
39d0: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
39e0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69        # NOTE: Fi
39f0: 72 73 74 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  rst, make sure t
3a00: 68 65 20 74 65 73 74 20 73 75 69 74 65 20 69 6e  he test suite in
3a10: 66 72 61 73 74 72 75 63 74 75 72 65 20 69 73 20  frastructure is 
3a20: 61 6c 6c 6f 77 65 64 20 74 6f 0d 0a 20 20 20 20  allowed to..    
3a30: 20 20 23 20 20 20 20 20 20 20 75 73 65 20 74 68    #       use th
3a40: 65 20 5b 65 78 65 63 5d 20 63 6f 6d 6d 61 6e 64  e [exec] command
3a50: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
3a60: 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
3a70: 73 74 73 20 3a 3a 6e 6f 28 65 78 65 63 29 5d 20  sts ::no(exec)] 
3a80: 26 26 20 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  && ![info exists
3a90: 20 3a 3a 6e 6f 28 63 6f 72 46 6c 61 67 73 29 5d   ::no(corFlags)]
3aa0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
3ab0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
3ac0: 4f 54 45 3a 20 49 66 20 74 68 65 20 6c 6f 63 61  OTE: If the loca
3ad0: 74 69 6f 6e 20 6f 66 20 43 6f 72 46 6c 61 67 73  tion of CorFlags
3ae0: 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74   is present in t
3af0: 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 2c 0d  he environment,.
3b00: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
3b10: 20 75 73 65 20 69 74 3b 20 6f 74 68 65 72 77 69   use it; otherwi
3b20: 73 65 20 61 73 73 75 6d 65 20 69 74 20 69 73 20  se assume it is 
3b30: 69 6e 20 74 68 65 20 50 41 54 48 2e 0d 0a 20 20  in the PATH...  
3b40: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
3b50: 20 73 65 74 20 63 6f 72 46 6c 61 67 73 20 5b 65   set corFlags [e
3b60: 78 70 72 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  xpr {..         
3b70: 20 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a   [info exists ::
3b80: 65 6e 76 28 43 6f 72 46 6c 61 67 73 29 5d 20 3f  env(CorFlags)] ?
3b90: 20 24 3a 3a 65 6e 76 28 43 6f 72 46 6c 61 67 73   $::env(CorFlags
3ba0: 29 20 3a 20 22 43 6f 72 46 6c 61 67 73 22 0d 0a  ) : "CorFlags"..
3bb0: 20 20 20 20 20 20 20 20 7d 5d 0d 0a 0d 0a 20 20          }]....  
3bc0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
3bd0: 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
3be0: 20 74 6f 20 65 78 65 63 75 74 65 20 43 6f 72 46   to execute CorF
3bf0: 6c 61 67 73 20 6f 6e 20 74 68 65 20 73 70 65 63  lags on the spec
3c00: 69 66 69 65 64 20 66 69 6c 65 2e 0d 0a 20 20 20  ified file...   
3c10: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
3c20: 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
3c30: 20 20 20 20 20 20 20 20 65 78 65 63 20 2d 2d 20          exec -- 
3c40: 24 63 6f 72 46 6c 61 67 73 20 5b 66 69 6c 65 20  $corFlags [file 
3c50: 6e 61 74 69 76 65 6e 61 6d 65 20 24 66 69 6c 65  nativename $file
3c60: 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 7d  Name]..        }
3c70: 20 65 78 65 63 5d 20 3d 3d 20 30 7d 20 74 68 65   exec] == 0} the
3c80: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  n {..          #
3c90: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
3ca0: 54 45 3a 20 49 66 20 72 65 71 75 65 73 74 65 64  TE: If requested
3cb0: 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2c 20   by our caller, 
3cc0: 61 74 74 65 6d 70 74 20 74 6f 20 64 65 74 65 72  attempt to deter
3cd0: 6d 69 6e 65 20 74 68 65 0d 0a 20 20 20 20 20 20  mine the..      
3ce0: 20 20 20 20 23 20 20 20 20 20 20 20 70 6c 61 74      #       plat
3cf0: 66 6f 72 6d 20 66 6f 72 20 74 68 65 20 73 70 65  form for the spe
3d00: 63 69 66 69 65 64 20 66 69 6c 65 20 61 73 20 77  cified file as w
3d10: 65 6c 6c 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ell...          
3d20: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  #..          if 
3d30: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
3d40: 24 76 61 72 4e 61 6d 65 5d 20 3e 20 30 7d 20 74  $varName] > 0} t
3d50: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
3d60: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
3d70: 20 20 23 20 4e 4f 54 45 3a 20 53 74 6f 72 65 20    # NOTE: Store 
3d80: 74 68 65 20 70 6c 61 74 66 6f 72 6d 20 69 6e 20  the platform in 
3d90: 74 68 65 20 6e 61 6d 65 64 20 76 61 72 69 61 62  the named variab
3da0: 6c 65 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20  le in the..     
3db0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
3dc0: 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 20 63 61  ontext of our ca
3dd0: 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20  ller...         
3de0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
3df0: 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
3e00: 6d 65 20 70 6c 61 74 66 6f 72 6d 0d 0a 0d 0a 20  me platform.... 
3e10: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
3e20: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
3e30: 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 65 78 74  : Attempt to ext
3e40: 72 61 63 74 20 74 68 65 20 50 45 20 6c 69 6e 65  ract the PE line
3e50: 20 66 72 6f 6d 20 74 68 65 20 63 61 70 74 75 72   from the captur
3e60: 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed..            
3e70: 23 20 20 20 20 20 20 20 6f 75 74 70 75 74 2e 20  #       output. 
3e80: 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69   If this value i
3e90: 73 20 22 50 45 33 32 22 20 6f 72 20 22 50 45 33  s "PE32" or "PE3
3ea0: 32 2b 22 2c 20 74 68 65 0d 0a 20 20 20 20 20 20  2+", the..      
3eb0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 73        #       as
3ec0: 73 65 6d 62 6c 79 20 66 69 6c 65 20 69 73 20 33  sembly file is 3
3ed0: 32 2d 62 69 74 20 6f 72 20 36 34 2d 62 69 74 2c  2-bit or 64-bit,
3ee0: 20 72 65 73 70 65 63 74 69 76 65 6c 79 3b 0d 0a   respectively;..
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
3f00: 20 20 20 20 6f 74 68 65 72 77 69 73 65 2c 20 69      otherwise, i
3f10: 74 73 20 74 79 70 65 20 69 73 20 75 6e 6b 6e 6f  ts type is unkno
3f20: 77 6e 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  wn...           
3f30: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
3f40: 73 65 74 20 70 61 74 74 65 72 6e 20 7b 5e 50 45  set pattern {^PE
3f50: 20 20 20 20 20 20 20 20 3a 20 28 50 45 33 32 7c          : (PE32|
3f60: 50 45 33 32 5c 2b 29 5c 73 2b 24 7d 0d 0a 0d 0a  PE32\+)\s+$}....
3f70: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
3f80: 5b 72 65 67 65 78 70 20 2d 6c 69 6e 65 20 2d 2d  [regexp -line --
3f90: 20 24 70 61 74 74 65 72 6e 20 24 65 78 65 63 20   $pattern $exec 
3fa0: 64 75 6d 6d 79 20 70 65 33 32 5d 7d 20 74 68 65  dummy pe32]} the
3fb0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
3fc0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
3fd0: 20 20 20 20 23 20 48 41 43 4b 3a 20 54 68 69 73      # HACK: This
3fe0: 20 5b 73 77 69 74 63 68 5d 20 61 73 73 75 6d 65   [switch] assume
3ff0: 73 20 74 68 61 74 20 33 32 2d 62 69 74 20 65 78  s that 32-bit ex
4000: 65 63 75 74 61 62 6c 65 73 20 61 72 65 0d 0a 20  ecutables are.. 
4010: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
4020: 20 20 20 20 20 61 6c 77 61 79 73 20 78 38 36 20       always x86 
4030: 61 6e 64 20 74 68 61 74 20 36 34 2d 62 69 74 20  and that 64-bit 
4040: 65 78 65 63 75 74 61 62 6c 65 73 20 61 72 65 20  executables are 
4050: 61 6c 77 61 79 73 0d 0a 20 20 20 20 20 20 20 20  always..        
4060: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 78 36        #       x6
4070: 34 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  4...            
4080: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
4090: 20 20 20 73 77 69 74 63 68 20 2d 65 78 61 63 74     switch -exact
40a0: 20 2d 2d 20 24 70 65 33 32 20 7b 0d 0a 20 20 20   -- $pe32 {..   
40b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 50 45 33               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 20 20 73 65 74 20 70 6c 61 74 66         set platf
40e0: 6f 72 6d 20 57 69 6e 33 32 0d 0a 20 20 20 20 20  orm Win32..     
40f0: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
4100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 45                PE
4110: 33 32 2b 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  32+ {..         
4120: 20 20 20 20 20 20 20 20 20 73 65 74 20 70 6c 61           set pla
4130: 74 66 6f 72 6d 20 78 36 34 0d 0a 20 20 20 20 20  tform x64..     
4140: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
4150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65                de
4160: 66 61 75 6c 74 20 7b 0d 0a 20 20 20 20 20 20 20  fault {..       
4170: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 70             set p
4180: 6c 61 74 66 6f 72 6d 20 22 22 0d 0a 20 20 20 20  latform ""..    
4190: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
41a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
41b0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
41c0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
41d0: 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d      set platform
41e0: 20 22 22 0d 0a 20 20 20 20 20 20 20 20 20 20 20   ""..           
41f0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
4200: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
4210: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
4220: 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 65 78 74  : Attempt to ext
4230: 72 61 63 74 20 74 68 65 20 49 4c 4f 4e 4c 59 20  ract the ILONLY 
4240: 6c 69 6e 65 20 66 72 6f 6d 20 74 68 65 20 63 61  line from the ca
4250: 70 74 75 72 65 64 0d 0a 20 20 20 20 20 20 20 20  ptured..        
4260: 20 20 23 20 20 20 20 20 20 20 6f 75 74 70 75 74    #       output
4270: 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65  .  If this value
4280: 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 20 73 70   is zero, the sp
4290: 65 63 69 66 69 65 64 20 66 69 6c 65 20 6d 75 73  ecified file mus
42a0: 74 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  t..          #  
42b0: 20 20 20 20 20 62 65 20 61 20 6d 69 78 65 64 2d       be a mixed-
42c0: 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 3b 20 6f  mode assembly; o
42d0: 74 68 65 72 77 69 73 65 2c 20 69 74 20 63 6f 6e  therwise, it con
42e0: 74 61 69 6e 73 20 6f 6e 6c 79 0d 0a 20 20 20 20  tains only..    
42f0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 61        #       ma
4300: 6e 61 67 65 64 20 63 6f 6d 70 6f 6e 65 6e 74 73  naged components
4310: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
4320: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 70 61            set pa
4330: 74 74 65 72 6e 20 7b 5e 49 4c 4f 4e 4c 59 20 20  ttern {^ILONLY  
4340: 20 20 3a 20 28 30 7c 31 29 5c 73 2b 24 7d 0d 0a    : (0|1)\s+$}..
4350: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
4360: 21 5b 72 65 67 65 78 70 20 2d 6c 69 6e 65 20 2d  ![regexp -line -
4370: 2d 20 24 70 61 74 74 65 72 6e 20 24 65 78 65 63  - $pattern $exec
4380: 20 64 75 6d 6d 79 20 69 6c 4f 6e 6c 79 5d 7d 20   dummy ilOnly]} 
4390: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
43a0: 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
43b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
43c0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
43d0: 24 69 6c 4f 6e 6c 79 7d 20 74 68 65 6e 20 7b 0d  $ilOnly} then {.
43e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
43f0: 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
4400: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
4410: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
4420: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
4430: 54 45 3a 20 49 66 20 74 68 65 20 74 65 73 74 20  TE: If the test 
4440: 73 75 69 74 65 20 63 61 6e 6e 6f 74 20 75 73 65  suite cannot use
4450: 20 5b 65 78 65 63 5d 20 6f 72 20 65 78 65 63 75   [exec] or execu
4460: 74 69 6f 6e 20 6f 66 20 43 6f 72 46 6c 61 67 73  tion of CorFlags
4470: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
4480: 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 20 66  failed, return f
4490: 61 6c 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  alse...      #..
44a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
44b0: 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  se..    }.....  
44c0: 20 20 70 72 6f 63 20 69 73 42 75 69 6c 64 41 76    proc isBuildAv
44d0: 61 69 6c 61 62 6c 65 20 7b 20 6e 61 74 69 76 65  ailable { native
44e0: 20 64 69 72 65 63 74 6f 72 79 20 7b 76 61 72 4e   directory {varN
44f0: 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20  ame ""} } {..   
4500: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
4510: 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 66 75  TE: Build the fu
4520: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 66 69  lly qualified fi
4530: 6c 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  le name for the 
4540: 70 72 69 6d 61 72 79 20 61 73 73 65 6d 62 6c 79  primary assembly
4550: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
4560: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 53  containing the S
4570: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
4580: 65 20 6d 61 6e 61 67 65 64 20 63 6f 6d 70 6f 6e  e managed compon
4590: 65 6e 74 73 2e 20 20 49 74 0d 0a 20 20 20 20 20  ents.  It..     
45a0: 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20   #       should 
45b0: 62 65 20 6e 6f 74 65 64 20 74 68 61 74 20 74 68  be noted that th
45c0: 69 73 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65  is assembly file
45d0: 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69   may also contai
45e0: 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  n the..      #  
45f0: 20 20 20 20 20 6e 61 74 69 76 65 20 63 6f 6d 70       native comp
4600: 6f 6e 65 6e 74 73 2c 20 69 66 20 61 20 6e 61 74  onents, if a nat
4610: 69 76 65 20 62 75 69 6c 64 20 69 73 20 69 6e 20  ive build is in 
4620: 75 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  use...      #.. 
4630: 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d       set fileNam
4640: 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
4650: 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64  me [file join $d
4660: 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20  irectory \..    
4670: 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
4680: 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d 5d 0d 0a  a.SQLite.dll]]..
4690: 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69  ..      if {![fi
46a0: 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e  le exists $fileN
46b0: 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
46c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
46d0: 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  se..      }.... 
46e0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
46f0: 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
4700: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
4710: 65 74 65 63 74 20 69 66 20 74 68 65 20 70 72 69  etect if the pri
4720: 6d 61 72 79 20 61 73 73 65 6d 62 6c 79 0d 0a 20  mary assembly.. 
4730: 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e       #       con
4740: 74 61 69 6e 73 20 61 6e 79 20 6e 61 74 69 76 65  tains any native
4750: 20 63 6f 6d 70 6f 6e 65 6e 74 73 2c 20 69 66 20   components, if 
4760: 6e 65 63 65 73 73 61 72 79 2e 0d 0a 20 20 20 20  necessary...    
4770: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
4780: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e  string length $n
4790: 61 74 69 76 65 5d 20 3d 3d 20 30 7d 20 74 68 65  ative] == 0} the
47a0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
47b0: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
47c0: 24 76 61 72 4e 61 6d 65 5d 20 3e 20 30 7d 20 74  $varName] > 0} t
47d0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
47e0: 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d   upvar 1 $varNam
47f0: 65 20 24 76 61 72 4e 61 6d 65 0d 0a 20 20 20 20  e $varName..    
4800: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
4810: 20 73 65 74 20 6e 61 74 69 76 65 20 5b 69 73 4d   set native [isM
4820: 69 78 65 64 4d 6f 64 65 41 73 73 65 6d 62 6c 79  ixedModeAssembly
4830: 20 24 66 69 6c 65 4e 61 6d 65 20 24 76 61 72 4e   $fileName $varN
4840: 61 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  ame]..      }...
4850: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
4860: 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 70  # NOTE: If the p
4870: 72 69 6d 61 72 79 20 61 73 73 65 6d 62 6c 79 20  rimary assembly 
4880: 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20 74 68  also contains th
4890: 65 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e 65  e native compone
48a0: 6e 74 73 2c 0d 0a 20 20 20 20 20 20 23 20 20 20  nts,..      #   
48b0: 20 20 20 20 77 65 20 68 61 76 65 20 65 76 65 72      we have ever
48c0: 79 74 68 69 6e 67 20 77 65 20 6e 65 65 64 2e 0d  ything we need..
48d0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
48e0: 69 66 20 7b 24 6e 61 74 69 76 65 7d 20 74 68 65  if {$native} the
48f0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  n {..        ret
4900: 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
4910: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
4920: 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 68 61 74      # NOTE: What
4930: 20 69 73 20 74 68 65 20 70 6c 61 74 66 6f 72 6d   is the platform
4940: 20 66 6f 72 20 74 68 69 73 20 6d 61 63 68 69 6e   for this machin
4950: 65 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e?..      #..   
4960: 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20     set platform 
4970: 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74 66 6f  [machineToPlatfo
4980: 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f  rm $::tcl_platfo
4990: 72 6d 28 6d 61 63 68 69 6e 65 29 5d 0d 0a 0d 0a  rm(machine)]....
49a0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
49b0: 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65   NOTE: Build the
49c0: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
49d0: 20 66 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 74   file name for t
49e0: 68 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d  he interop assem
49f0: 62 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  bly..      #    
4a00: 20 20 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68     containing th
4a10: 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  e System.Data.SQ
4a20: 4c 69 74 65 20 6e 61 74 69 76 65 20 63 6f 6d 70  Lite native comp
4a30: 6f 6e 65 6e 74 73 2e 20 20 49 66 20 74 68 69 73  onents.  If this
4a40: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
4a50: 66 69 6c 65 20 65 78 69 73 74 73 2c 20 77 65 20  file exists, we 
4a60: 73 68 6f 75 6c 64 20 68 61 76 65 20 65 76 65 72  should have ever
4a70: 79 74 68 69 6e 67 20 77 65 20 6e 65 65 64 2e 0d  ything we need..
4a80: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
4a90: 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69  set fileName [fi
4aa0: 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
4ab0: 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74  ile join $direct
4ac0: 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ory \..         
4ad0: 20 24 70 6c 61 74 66 6f 72 6d 20 53 51 4c 69 74   $platform SQLit
4ae0: 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 5d 5d 0d  e.Interop.dll]].
4af0: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 66 69  ...      if {[fi
4b00: 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e  le exists $fileN
4b10: 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
4b20: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
4b30: 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  e..      }....  
4b40: 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65      set fileName
4b50: 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
4b60: 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69  e [file join $di
4b70: 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20  rectory \..     
4b80: 20 20 20 20 20 53 51 4c 69 74 65 2e 49 6e 74 65       SQLite.Inte
4b90: 72 6f 70 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20  rop.dll]]....   
4ba0: 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69     if {[file exi
4bb0: 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20  sts $fileName]} 
4bc0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
4bd0: 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20  return true..   
4be0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
4bf0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42  .      # NOTE: B
4c00: 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 79 20 71  uild the fully q
4c10: 75 61 6c 69 66 69 65 64 20 66 69 6c 65 20 6e 61  ualified file na
4c20: 6d 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69 74  me for the SQLit
4c30: 65 20 63 6f 72 65 0d 0a 20 20 20 20 20 20 23 20  e core..      # 
4c40: 20 20 20 20 20 20 6c 69 62 72 61 72 79 2e 20 20        library.  
4c50: 49 66 20 74 68 69 73 20 66 69 6c 65 20 65 78 69  If this file exi
4c60: 73 74 73 2c 20 77 65 20 73 68 6f 75 6c 64 20 68  sts, we should h
4c70: 61 76 65 20 65 76 65 72 79 74 68 69 6e 67 20 77  ave everything w
4c80: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
4c90: 20 6e 65 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d   need...      #.
4ca0: 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e  .      set fileN
4cb0: 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ame [file native
4cc0: 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
4cd0: 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20  $directory \..  
4ce0: 20 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72          $platfor
4cf0: 6d 20 73 71 6c 69 74 65 33 2e 64 6c 6c 5d 5d 0d  m sqlite3.dll]].
4d00: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 66 69  ...      if {[fi
4d10: 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e  le exists $fileN
4d20: 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
4d30: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
4d40: 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  e..      }....  
4d50: 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65      set fileName
4d60: 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
4d70: 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69  e [file join $di
4d80: 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20  rectory \..     
4d90: 20 20 20 20 20 73 71 6c 69 74 65 33 2e 64 6c 6c       sqlite3.dll
4da0: 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  ]]....      if {
4db0: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69  [file exists $fi
4dc0: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
4dd0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
4de0: 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  true..      }...
4df0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
4e00: 23 20 4e 4f 54 45 3a 20 4f 6e 65 20 6f 72 20 6d  # NOTE: One or m
4e10: 6f 72 65 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f  ore native compo
4e20: 6e 65 6e 74 73 20 6e 65 65 64 65 64 20 62 79 20  nents needed by 
4e30: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
4e40: 74 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  te..      #     
4e50: 20 20 61 72 65 20 6d 69 73 73 69 6e 67 2e 0d 0a    are missing...
4e60: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72        #..      r
4e70: 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20  eturn false..   
4e80: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
4e90: 69 73 52 65 6c 65 61 73 65 41 76 61 69 6c 61 62  isReleaseAvailab
4ea0: 6c 65 20 7b 20 64 69 72 65 63 74 6f 72 79 20 7b  le { directory {
4eb0: 76 61 72 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d  varName ""} } {.
4ec0: 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
4ed0: 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 72 4e 61  ng length $varNa
4ee0: 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  me] > 0} then {.
4ef0: 0a 20 20 20 20 20 20 20 20 75 70 76 61 72 20 31  .        upvar 1
4f00: 20 24 76 61 72 4e 61 6d 65 20 24 76 61 72 4e 61   $varName $varNa
4f10: 6d 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  me..      }.... 
4f20: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 69 73 42       return [isB
4f30: 75 69 6c 64 41 76 61 69 6c 61 62 6c 65 20 22 22  uildAvailable ""
4f40: 20 24 64 69 72 65 63 74 6f 72 79 20 24 76 61 72   $directory $var
4f50: 4e 61 6d 65 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  Name]..    }....
4f60: 0a 20 20 20 20 70 72 6f 63 20 6a 6f 69 6e 42 75  .    proc joinBu
4f70: 69 6c 64 44 69 72 65 63 74 6f 72 79 20 7b 20 6e  ildDirectory { n
4f80: 61 74 69 76 65 20 70 61 74 68 20 79 65 61 72 20  ative path year 
4f90: 70 6c 61 74 66 6f 72 6d 20 63 6f 6e 66 69 67 75  platform configu
4fa0: 72 61 74 69 6f 6e 20 7d 20 7b 0d 0a 20 20 20 20  ration } {..    
4fb0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
4fc0: 45 3a 20 46 69 67 75 72 65 20 6f 75 74 20 61 6e  E: Figure out an
4fd0: 64 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68  d then return th
4fe0: 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  e fully qualifie
4ff0: 64 20 70 61 74 68 20 74 6f 20 74 68 65 20 62 75  d path to the bu
5000: 69 6c 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ild..      #    
5010: 20 20 20 64 69 72 65 63 74 6f 72 79 20 62 61 73     directory bas
5020: 65 64 20 6f 6e 20 61 6c 6c 20 74 68 65 20 61 72  ed on all the ar
5030: 67 75 6d 65 6e 74 73 20 70 72 6f 76 69 64 65 64  guments provided
5040: 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d   by our caller..
5050: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
5060: 69 66 20 7b 24 6e 61 74 69 76 65 7d 20 74 68 65  if {$native} the
5070: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  n {..        ret
5080: 75 72 6e 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24  urn [file join $
5090: 70 61 74 68 20 62 69 6e 20 24 79 65 61 72 20 24  path bin $year $
50a0: 70 6c 61 74 66 6f 72 6d 20 24 63 6f 6e 66 69 67  platform $config
50b0: 75 72 61 74 69 6f 6e 5d 0d 0a 20 20 20 20 20 20  uration]..      
50c0: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
50d0: 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6a    return [file j
50e0: 6f 69 6e 20 24 70 61 74 68 20 62 69 6e 20 24 79  oin $path bin $y
50f0: 65 61 72 20 24 63 6f 6e 66 69 67 75 72 61 74 69  ear $configurati
5100: 6f 6e 20 62 69 6e 5d 0d 0a 20 20 20 20 20 20 7d  on bin]..      }
5110: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
5120: 70 72 6f 63 20 67 65 74 42 75 69 6c 64 44 69 72  proc getBuildDir
5130: 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20  ectory {} {..   
5140: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
5150: 54 45 3a 20 53 65 65 20 69 66 20 74 68 65 20 22  TE: See if the "
5160: 6e 61 74 69 76 65 22 20 72 75 6e 74 69 6d 65 20  native" runtime 
5170: 6f 70 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20  option has been 
5180: 73 65 74 2e 20 20 49 66 20 73 6f 2c 20 75 73 65  set.  If so, use
5190: 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
51a0: 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 66 6f      directory fo
51b0: 72 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65  r the mixed-mode
51c0: 20 61 73 73 65 6d 62 6c 79 20 28 61 2e 6b 2e 61   assembly (a.k.a
51d0: 2e 20 74 68 65 20 6e 61 74 69 76 65 20 69 6e 74  . the native int
51e0: 65 72 6f 70 0d 0a 20 20 20 20 20 20 23 20 20 20  erop..      #   
51f0: 20 20 20 20 61 73 73 65 6d 62 6c 79 29 2e 20 20      assembly).  
5200: 54 6f 20 65 6e 61 62 6c 65 20 74 68 69 73 20 6f  To enable this o
5210: 70 74 69 6f 6e 20 76 69 61 20 74 68 65 20 63 6f  ption via the co
5220: 6d 6d 61 6e 64 20 6c 69 6e 65 2c 20 65 6e 74 65  mmand line, ente
5230: 72 20 61 0d 0a 20 20 20 20 20 20 23 20 20 20 20  r a..      #    
5240: 20 20 20 63 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c     command simil
5250: 61 72 20 74 6f 20 6f 6e 65 20 6f 66 20 74 68 65  ar to one of the
5260: 20 66 6f 6c 6c 6f 77 69 6e 67 20 28 61 6c 6c 20   following (all 
5270: 6f 6e 20 6f 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20  on one line):.. 
5280: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
5290: 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c        EagleShell
52a0: 2e 65 78 65 20 2d 69 6e 69 74 69 61 6c 69 7a 65  .exe -initialize
52b0: 20 2d 72 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20   -runtimeOption 
52c0: 6e 61 74 69 76 65 0d 0a 20 20 20 20 20 20 23 20  native..      # 
52d0: 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c          -file .\
52e0: 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c  path\to\all.eagl
52f0: 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  e..      #..    
5300: 20 20 23 20 20 20 20 20 20 20 54 6f 20 65 6e 61    #       To ena
5310: 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6f 6e 20  ble this option 
5320: 76 69 61 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20  via the command 
5330: 6c 69 6e 65 20 70 72 69 6f 72 20 74 6f 20 74 68  line prior to th
5340: 65 20 22 62 65 74 61 20 31 36 22 0d 0a 20 20 20  e "beta 16"..   
5350: 20 20 20 23 20 20 20 20 20 20 20 72 65 6c 65 61     #       relea
5360: 73 65 20 6f 66 20 45 61 67 6c 65 2c 20 74 68 65  se of Eagle, the
5370: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 6d 61   following comma
5380: 6e 64 20 6d 75 73 74 20 62 65 20 75 73 65 64 20  nd must be used 
5390: 69 6e 73 74 65 61 64 0d 0a 20 20 20 20 20 20 23  instead..      #
53a0: 20 20 20 20 20 20 20 28 61 6c 73 6f 20 61 6c 6c         (also all
53b0: 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65 29 3a 0d 0a   on one line):..
53c0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
53d0: 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c         EagleShel
53e0: 6c 2e 65 78 65 20 2d 69 6e 69 74 69 61 6c 69 7a  l.exe -initializ
53f0: 65 20 2d 70 6f 73 74 49 6e 69 74 69 61 6c 69 7a  e -postInitializ
5400: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
5410: 20 20 20 22 6f 62 6a 65 63 74 20 69 6e 76 6f 6b     "object invok
5420: 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65  e Interpreter.Ge
5430: 74 41 63 74 69 76 65 20 41 64 64 52 75 6e 74 69  tActive AddRunti
5440: 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65 22  meOption native"
5450: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
5460: 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74    -file .\path\t
5470: 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20  o\all.eagle..   
5480: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
5490: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 62  [info exists ::b
54a0: 75 69 6c 64 5f 64 69 72 65 63 74 6f 72 79 5d 20  uild_directory] 
54b0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
54c0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
54d0: 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63 74 6f 72  ::build_director
54e0: 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  y] > 0} then {..
54f0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
5500: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c     # NOTE: The l
5510: 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 62  ocation of the b
5520: 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20 68  uild directory h
5530: 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64  as been overridd
5540: 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20  en;..        #  
5550: 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20       therefore, 
5560: 75 73 65 20 69 74 20 76 65 72 62 61 74 69 6d 2e  use it verbatim.
5570: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
5580: 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 62       return $::b
5590: 75 69 6c 64 5f 64 69 72 65 63 74 6f 72 79 0d 0a  uild_directory..
55a0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
55b0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
55c0: 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68     # NOTE: If th
55d0: 65 20 22 6e 61 74 69 76 65 22 20 72 75 6e 74 69  e "native" runti
55e0: 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 73 65 74  me option is set
55f0: 2c 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65  , the mixed-mode
5600: 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20   assembly..     
5610: 20 20 20 23 20 20 20 20 20 20 20 69 73 20 62 65     #       is be
5620: 69 6e 67 20 74 65 73 74 65 64 2e 20 20 49 6e 20  ing tested.  In 
5630: 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 20 70  that case, the p
5640: 61 74 68 20 74 6f 20 74 68 65 20 62 75 69 6c 64  ath to the build
5650: 20 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20   directory..    
5660: 20 20 20 20 23 20 20 20 20 20 20 20 77 69 6c 6c      #       will
5670: 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 70 6c 61   contain the pla
5680: 74 66 6f 72 6d 20 6e 61 6d 65 20 61 6e 64 20 61  tform name and a
5690: 6c 6c 20 74 68 65 20 62 69 6e 61 72 69 65 73 20  ll the binaries 
56a0: 75 6e 64 65 72 20 74 65 73 74 0d 0a 20 20 20 20  under test..    
56b0: 20 20 20 20 23 20 20 20 20 20 20 20 73 68 6f 75      #       shou
56c0: 6c 64 20 62 65 20 70 72 65 73 65 6e 74 20 69 6e  ld be present in
56d0: 20 74 68 61 74 20 64 69 72 65 63 74 6f 72 79 2e   that directory.
56e0: 20 20 49 66 20 74 68 65 20 22 6e 61 74 69 76 65    If the "native
56f0: 22 20 72 75 6e 74 69 6d 65 0d 0a 20 20 20 20 20  " runtime..     
5700: 20 20 20 23 20 20 20 20 20 20 20 6f 70 74 69 6f     #       optio
5710: 6e 20 69 73 20 6e 6f 74 20 73 65 74 2c 20 74 68  n is not set, th
5720: 65 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72  e build director
5730: 79 20 77 69 6c 6c 20 62 65 20 63 6f 6e 73 69 64  y will be consid
5740: 65 72 65 64 20 74 6f 20 62 65 0d 0a 20 20 20 20  ered to be..    
5750: 20 20 20 20 23 20 20 20 20 20 20 20 22 70 6c 61      #       "pla
5760: 74 66 6f 72 6d 2d 6e 65 75 74 72 61 6c 22 2c 20  tform-neutral", 
5770: 77 69 74 68 20 74 68 65 20 6e 6f 74 61 62 6c 65  with the notable
5780: 20 65 78 63 65 70 74 69 6f 6e 20 6f 66 20 61 6e   exception of an
5790: 79 20 6e 61 74 69 76 65 0d 0a 20 20 20 20 20 20  y native..      
57a0: 20 20 23 20 20 20 20 20 20 20 61 73 73 65 6d 62    #       assemb
57b0: 6c 79 20 28 65 2e 67 2e 20 22 53 51 4c 69 74 65  ly (e.g. "SQLite
57c0: 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 22 29 20 63  .Interop.dll") c
57d0: 6f 70 69 65 64 20 74 68 65 72 65 20 64 75 72 69  opied there duri
57e0: 6e 67 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  ng the..        
57f0: 23 20 20 20 20 20 20 20 62 75 69 6c 64 20 70 72  #       build pr
5800: 6f 63 65 73 73 20 69 74 73 65 6c 66 2e 20 20 49  ocess itself.  I
5810: 66 20 74 68 65 20 62 75 69 6c 64 20 70 72 6f 63  f the build proc
5820: 65 73 73 20 73 6f 6d 65 68 6f 77 20 64 6f 65 73  ess somehow does
5830: 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20 23 20   not..        # 
5840: 20 20 20 20 20 20 63 6f 70 79 20 74 68 65 20 6e        copy the n
5850: 61 74 69 76 65 20 61 73 73 65 6d 62 6c 79 20 66  ative assembly f
5860: 6f 72 20 74 68 69 73 20 70 6c 61 74 66 6f 72 6d  or this platform
5870: 2c 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 65  , most of the te
5880: 73 74 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20  sts..        #  
5890: 20 20 20 20 20 69 6e 20 74 68 65 20 73 75 69 74       in the suit
58a0: 65 20 77 69 6c 6c 20 73 69 6d 70 6c 79 20 62 65  e will simply be
58b0: 20 73 6b 69 70 70 65 64 2e 20 20 47 65 6e 65 72   skipped.  Gener
58c0: 61 6c 6c 79 20 73 70 65 61 6b 69 6e 67 2c 20 74  ally speaking, t
58d0: 68 65 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20  here..        # 
58e0: 20 20 20 20 20 20 61 72 65 20 74 77 6f 20 77 61        are two wa
58f0: 79 73 20 74 6f 20 62 75 69 6c 64 20 74 68 65 20  ys to build the 
5900: 62 69 6e 61 72 69 65 73 20 77 68 65 6e 20 70 72  binaries when pr
5910: 65 70 61 72 69 6e 67 20 74 6f 20 72 75 6e 20 74  eparing to run t
5920: 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  he..        #   
5930: 20 20 20 20 74 65 73 74 20 73 75 69 74 65 3a 0d      test suite:.
5940: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
5950: 20 20 20 20 23 20 20 20 20 20 20 20 31 2e 20 42      #       1. B
5960: 75 69 6c 64 20 74 68 65 20 73 65 70 61 72 61 74  uild the separat
5970: 65 20 6d 61 6e 61 67 65 64 20 61 6e 64 20 6e 61  e managed and na
5980: 74 69 76 65 20 61 73 73 65 6d 62 6c 69 65 73 20  tive assemblies 
5990: 75 73 69 6e 67 20 73 6f 6d 65 0d 0a 20 20 20 20  using some..    
59a0: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 63      #          c
59b0: 6f 6d 6d 61 6e 64 73 20 73 69 6d 69 6c 61 72 20  ommands similar 
59c0: 74 6f 3a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  to:..        #..
59d0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
59e0: 20 20 20 62 75 69 6c 64 2e 62 61 74 20 24 7b 43     build.bat ${C
59f0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 4d 61 6e  onfiguration}Man
5a00: 61 67 65 64 4f 6e 6c 79 20 24 7b 50 6c 61 74 66  agedOnly ${Platf
5a10: 6f 72 6d 7d 0d 0a 20 20 20 20 20 20 20 20 23 20  orm}..        # 
5a20: 20 20 20 20 20 20 20 20 20 62 75 69 6c 64 2e 62           build.b
5a30: 61 74 20 24 7b 43 6f 6e 66 69 67 75 72 61 74 69  at ${Configurati
5a40: 6f 6e 7d 4e 61 74 69 76 65 4f 6e 6c 79 20 24 7b  on}NativeOnly ${
5a50: 50 6c 61 74 66 6f 72 6d 7d 0d 0a 20 20 20 20 20  Platform}..     
5a60: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
5a70: 20 20 20 20 20 20 20 20 20 57 68 65 72 65 20 24           Where $
5a80: 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 20  {Configuration} 
5a90: 69 73 20 65 69 74 68 65 72 20 22 44 65 62 75 67  is either "Debug
5aa0: 22 20 6f 72 20 22 52 65 6c 65 61 73 65 22 20 61  " or "Release" a
5ab0: 6e 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  nd..        #   
5ac0: 20 20 20 20 20 20 20 24 7b 50 6c 61 74 66 6f 72         ${Platfor
5ad0: 6d 7d 20 69 73 20 65 69 74 68 65 72 20 22 57 69  m} is either "Wi
5ae0: 6e 33 32 22 20 6f 72 20 22 78 36 34 22 2e 0d 0a  n32" or "x64"...
5af0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
5b00: 20 20 20 23 20 20 20 20 20 20 20 32 2e 20 42 75     #       2. Bu
5b10: 69 6c 64 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f  ild the mixed-mo
5b20: 64 65 20 61 73 73 65 6d 62 6c 79 20 75 73 69 6e  de assembly usin
5b30: 67 20 61 20 63 6f 6d 6d 61 6e 64 20 73 69 6d 69  g a command simi
5b40: 6c 61 72 20 74 6f 3a 0d 0a 20 20 20 20 20 20 20  lar to:..       
5b50: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20   #..        #   
5b60: 20 20 20 20 20 20 20 62 75 69 6c 64 2e 62 61 74         build.bat
5b70: 20 24 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e   ${Configuration
5b80: 7d 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 0d 0a 20  } ${Platform}.. 
5b90: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
5ba0: 20 20 23 20 20 20 20 20 20 20 20 20 20 57 68 65    #          Whe
5bb0: 72 65 20 24 7b 43 6f 6e 66 69 67 75 72 61 74 69  re ${Configurati
5bc0: 6f 6e 7d 20 69 73 20 65 69 74 68 65 72 20 22 44  on} is either "D
5bd0: 65 62 75 67 22 20 6f 72 20 22 52 65 6c 65 61 73  ebug" or "Releas
5be0: 65 22 20 61 6e 64 0d 0a 20 20 20 20 20 20 20 20  e" and..        
5bf0: 23 20 20 20 20 20 20 20 20 20 20 24 7b 50 6c 61  #          ${Pla
5c00: 74 66 6f 72 6d 7d 20 69 73 20 65 69 74 68 65 72  tform} is either
5c10: 20 22 57 69 6e 33 32 22 20 6f 72 20 22 78 36 34   "Win32" or "x64
5c20: 22 2e 20 20 49 66 20 74 68 69 73 20 63 6f 6d 6d  ".  If this comm
5c30: 61 6e 64 20 69 73 0d 0a 20 20 20 20 20 20 20 20  and is..        
5c40: 23 20 20 20 20 20 20 20 20 20 20 75 73 65 64 2c  #          used,
5c50: 20 76 61 72 69 6f 75 73 20 74 65 73 74 73 20 74   various tests t
5c60: 68 61 74 20 72 65 71 75 69 72 65 20 73 75 70 70  hat require supp
5c70: 6c 65 6d 65 6e 74 61 72 79 20 6d 61 6e 61 67 65  lementary manage
5c80: 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  d..        #    
5c90: 20 20 20 20 20 20 61 73 73 65 6d 62 6c 69 65 73        assemblies
5ca0: 20 28 65 2e 67 2e 20 4c 49 4e 51 29 20 6d 61 79   (e.g. LINQ) may
5cb0: 20 62 65 20 73 6b 69 70 70 65 64 20 75 6e 6c 65   be skipped unle
5cc0: 73 73 20 74 68 6f 73 65 20 62 69 6e 61 72 69 65  ss those binarie
5cd0: 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  s..        #    
5ce0: 20 20 20 20 20 20 61 72 65 20 73 75 62 73 65 71        are subseq
5cf0: 75 65 6e 74 6c 79 20 63 6f 70 69 65 64 20 69 6e  uently copied in
5d00: 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 64  to the correct d
5d10: 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 20 62  irectory (i.e. b
5d20: 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
5d30: 20 20 20 20 20 20 22 74 65 73 74 5f 61 6c 6c 2e        "test_all.
5d40: 62 61 74 22 29 2e 0d 0a 20 20 20 20 20 20 20 20  bat")...        
5d50: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  #..        #    
5d60: 20 20 20 4e 6f 74 65 20 74 68 61 74 20 61 6c 6c     Note that all
5d70: 20 6f 66 20 74 68 65 20 62 75 69 6c 64 20 63 6f   of the build co
5d80: 6d 6d 61 6e 64 73 20 61 62 6f 76 65 20 77 69 6c  mmands above wil
5d90: 6c 20 64 65 66 61 75 6c 74 20 74 6f 20 75 73 69  l default to usi
5da0: 6e 67 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ng..        #   
5db0: 20 20 20 20 74 68 65 20 6c 61 74 65 73 74 20 76      the latest v
5dc0: 65 72 73 69 6f 6e 20 6f 66 20 4d 53 42 75 69 6c  ersion of MSBuil
5dd0: 64 20 61 76 61 69 6c 61 62 6c 65 20 61 6e 64 20  d available and 
5de0: 74 68 65 20 22 74 65 73 74 5f 79 65 61 72 22 20  the "test_year" 
5df0: 6d 61 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20  may..        #  
5e00: 20 20 20 20 20 6e 65 65 64 20 74 6f 20 62 65 20       need to be 
5e10: 61 64 6a 75 73 74 65 64 20 61 63 63 6f 72 64 69  adjusted accordi
5e20: 6e 67 6c 79 20 74 6f 20 61 63 74 75 61 6c 6c 79  ngly to actually
5e30: 20 72 75 6e 20 74 68 65 20 74 65 73 74 20 73 75   run the test su
5e40: 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 20  ite...        # 
5e50: 20 20 20 20 20 20 52 65 66 65 72 20 74 6f 20 74        Refer to t
5e60: 68 65 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 5b  he comments in [
5e70: 67 65 74 42 75 69 6c 64 59 65 61 72 5d 20 66 6f  getBuildYear] fo
5e80: 72 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69  r more informati
5e90: 6f 6e 20 6f 6e 0d 0a 20 20 20 20 20 20 20 20 23  on on..        #
5ea0: 20 20 20 20 20 20 20 68 6f 77 20 74 6f 20 73 65         how to se
5eb0: 74 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 2e  t this variable.
5ec0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
5ed0: 20 20 20 20 20 73 65 74 20 6e 61 74 69 76 65 20       set native 
5ee0: 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f  [hasRuntimeOptio
5ef0: 6e 20 6e 61 74 69 76 65 5d 0d 0a 0d 0a 20 20 20  n native]....   
5f00: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6a 6f 69       return [joi
5f10: 6e 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79 20  nBuildDirectory 
5f20: 24 6e 61 74 69 76 65 20 5b 67 65 74 42 75 69 6c  $native [getBuil
5f30: 64 42 61 73 65 44 69 72 65 63 74 6f 72 79 5d 20  dBaseDirectory] 
5f40: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
5f50: 67 65 74 42 75 69 6c 64 59 65 61 72 5d 20 5b 67  getBuildYear] [g
5f60: 65 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20  etBuildPlatform 
5f70: 24 6e 61 74 69 76 65 5d 20 5b 67 65 74 42 75 69  $native] [getBui
5f80: 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d  ldConfiguration]
5f90: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
5fa0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
5fb0: 65 74 52 65 6c 65 61 73 65 56 65 72 73 69 6f 6e  etReleaseVersion
5fc0: 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
5fd0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69        # NOTE: Fi
5fe0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 65 6c  gure out the rel
5ff0: 65 61 73 65 20 76 65 72 73 69 6f 6e 20 66 6f 72  ease version for
6000: 20 75 73 65 20 77 69 74 68 20 74 68 65 20 62 75   use with the bu
6010: 69 6c 64 20 64 69 72 65 63 74 6f 72 79 0d 0a 20  ild directory.. 
6020: 20 20 20 20 20 23 20 20 20 20 20 20 20 77 68 65       #       whe
6030: 6e 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 61  n checking for a
6040: 76 61 69 6c 61 62 6c 65 20 72 65 6c 65 61 73 65  vailable release
6050: 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s...      #..   
6060: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
6070: 73 74 73 20 3a 3a 72 65 6c 65 61 73 65 5f 76 65  sts ::release_ve
6080: 72 73 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20 20 20  rsion] && \..   
6090: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
60a0: 65 6e 67 74 68 20 24 3a 3a 72 65 6c 65 61 73 65  ength $::release
60b0: 5f 76 65 72 73 69 6f 6e 5d 20 3e 20 30 7d 20 74  _version] > 0} t
60c0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
60d0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
60e0: 3a 20 54 68 65 20 72 65 6c 65 61 73 65 20 76 65  : The release ve
60f0: 72 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 6f  rsion has been o
6100: 76 65 72 72 69 64 64 65 6e 3b 20 74 68 65 72 65  verridden; there
6110: 66 6f 72 65 2c 20 75 73 65 20 69 74 0d 0a 20 20  fore, use it..  
6120: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76 65        #       ve
6130: 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20  rbatim...       
6140: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
6150: 72 6e 20 24 3a 3a 72 65 6c 65 61 73 65 5f 76 65  rn $::release_ve
6160: 72 73 69 6f 6e 0d 0a 20 20 20 20 20 20 7d 20 65  rsion..      } e
6170: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
6180: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
6190: 3a 20 4e 6f 20 72 65 6c 65 61 73 65 20 76 65 72  : No release ver
61a0: 73 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c  sion is availabl
61b0: 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70  e, return an emp
61c0: 74 79 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20  ty string...    
61d0: 20 20 20 20 23 20 20 20 20 20 20 20 49 74 20 69      #       It i
61e0: 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 72  s important to r
61f0: 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73  eturn an empty s
6200: 74 72 69 6e 67 20 68 65 72 65 20 62 65 63 61 75  tring here becau
6210: 73 65 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  se the..        
6220: 23 20 20 20 20 20 20 20 72 65 73 75 6c 74 20 6f  #       result o
6230: 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  f this procedure
6240: 20 6d 61 79 20 62 65 20 75 73 65 64 20 77 69 74   may be used wit
6250: 68 20 5b 66 69 6c 65 20 6a 6f 69 6e 5d 2e 0d 0a  h [file join]...
6260: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
6270: 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20     return ""..  
6280: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
6290: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 75 69  .    proc getBui
62a0: 6c 64 46 69 6c 65 4e 61 6d 65 20 7b 20 66 69 6c  ldFileName { fil
62b0: 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20  eName {platform 
62c0: 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ""} } {..      #
62d0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
62e0: 52 65 74 75 72 6e 73 20 74 68 65 20 73 70 65 63  Returns the spec
62f0: 69 66 69 65 64 20 66 69 6c 65 20 6e 61 6d 65 20  ified file name 
6300: 61 73 20 69 66 20 69 74 20 77 65 72 65 20 6c 6f  as if it were lo
6310: 63 61 74 65 64 20 69 6e 20 74 68 65 0d 0a 20 20  cated in the..  
6320: 20 20 20 20 23 20 20 20 20 20 20 20 62 75 69 6c      #       buil
6330: 64 20 64 69 72 65 63 74 6f 72 79 2c 20 64 69 73  d directory, dis
6340: 63 61 72 64 69 6e 67 20 61 6e 79 20 64 69 72 65  carding any dire
6350: 63 74 6f 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f  ctory informatio
6360: 6e 20 70 72 65 73 65 6e 74 0d 0a 20 20 20 20 20  n present..     
6370: 20 23 20 20 20 20 20 20 20 69 6e 20 74 68 65 20   #       in the 
6380: 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 70 72 6f  file name as pro
6390: 76 69 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c  vided by our cal
63a0: 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ler...      #.. 
63b0: 20 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20       set result 
63c0: 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
63d0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 66   \..          [f
63e0: 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42 75 69  ile join [getBui
63f0: 6c 64 44 69 72 65 63 74 6f 72 79 5d 20 24 70 6c  ldDirectory] $pl
6400: 61 74 66 6f 72 6d 20 5b 66 69 6c 65 20 74 61 69  atform [file tai
6410: 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 5d 0d 0a  l $fileName]]]..
6420: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
6430: 20 23 20 48 41 43 4b 3a 20 57 68 65 6e 20 72 75   # HACK: When ru
6440: 6e 6e 69 6e 67 20 6f 6e 20 57 6f 57 36 34 2c 20  nning on WoW64, 
6450: 61 73 73 75 6d 65 20 74 68 65 20 74 65 73 74 20  assume the test 
6460: 65 78 65 63 75 74 61 62 6c 65 73 20 61 72 65 20  executables are 
6470: 70 72 65 73 65 6e 74 0d 0a 20 20 20 20 20 20 23  present..      #
6480: 20 20 20 20 20 20 20 77 69 74 68 20 74 68 65 20         with the 
6490: 22 33 32 22 20 73 75 66 66 69 78 20 6f 6e 20 74  "32" suffix on t
64a0: 68 65 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  hem...      #.. 
64b0: 20 20 20 20 20 69 66 20 7b 5b 69 73 52 75 6e 6e       if {[isRunn
64c0: 69 6e 67 57 6f 57 36 34 5d 20 26 26 20 5b 66 69  ingWoW64] && [fi
64d0: 6c 65 20 65 78 74 65 6e 73 69 6f 6e 20 24 72 65  le extension $re
64e0: 73 75 6c 74 5d 20 65 71 20 22 2e 65 78 65 22 7d  sult] eq ".exe"}
64f0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
6500: 20 73 65 74 20 72 65 73 75 6c 74 20 5b 61 70 70   set result [app
6510: 65 6e 64 41 72 67 73 20 5b 66 69 6c 65 20 72 6f  endArgs [file ro
6520: 6f 74 6e 61 6d 65 20 24 72 65 73 75 6c 74 5d 20  otname $result] 
6530: 33 32 2e 65 78 65 5d 0d 0a 20 20 20 20 20 20 7d  32.exe]..      }
6540: 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ....      return
6550: 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d   $result..    }.
6560: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
6570: 45 78 74 65 72 6e 61 6c 44 69 72 65 63 74 6f 72  ExternalDirector
6580: 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  y {} {..      #.
6590: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
65a0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65  his procedure re
65b0: 74 75 72 6e 73 20 74 68 65 20 64 69 72 65 63 74  turns the direct
65c0: 6f 72 79 20 77 68 65 72 65 20 74 68 65 20 65 78  ory where the ex
65d0: 74 65 72 6e 61 6c 20 62 69 6e 61 72 79 0d 0a 20  ternal binary.. 
65e0: 20 20 20 20 20 23 20 20 20 20 20 20 20 66 69 6c       #       fil
65f0: 65 73 20 61 72 65 20 6c 6f 63 61 74 65 64 2e 0d  es are located..
6600: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
6610: 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74  return [file nat
6620: 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 64 69  ivename [file di
6630: 72 6e 61 6d 65 20 5b 66 69 6c 65 20 64 69 72 6e  rname [file dirn
6640: 61 6d 65 20 5b 69 6e 66 6f 20 62 69 6e 61 72 79  ame [info binary
6650: 5d 5d 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  ]]]]..    }.....
6660: 20 20 20 20 70 72 6f 63 20 67 65 74 42 69 6e 61      proc getBina
6670: 72 79 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b  ryDirectory {} {
6680: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
6690: 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72   # NOTE: This pr
66a0: 6f 63 65 64 75 72 65 20 72 65 74 75 72 6e 73 20  ocedure returns 
66b0: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 77 68  the directory wh
66c0: 65 72 65 20 74 68 65 20 74 65 73 74 20 61 70 70  ere the test app
66d0: 6c 69 63 61 74 69 6f 6e 0d 0a 20 20 20 20 20 20  lication..      
66e0: 23 20 20 20 20 20 20 20 69 74 73 65 6c 66 20 28  #       itself (
66f0: 69 2e 65 2e 20 74 68 65 20 45 61 67 6c 65 20 73  i.e. the Eagle s
6700: 68 65 6c 6c 29 20 69 73 20 6c 6f 63 61 74 65 64  hell) is located
6710: 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20  .  This will be 
6720: 75 73 65 64 20 61 73 0d 0a 20 20 20 20 20 20 23  used as..      #
6730: 20 20 20 20 20 20 20 74 68 65 20 64 65 73 74 69         the desti
6740: 6e 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 63  nation for the c
6750: 6f 70 69 65 64 20 53 79 73 74 65 6d 2e 44 61 74  opied System.Dat
6760: 61 2e 53 51 4c 69 74 65 20 6e 61 74 69 76 65 20  a.SQLite native 
6770: 61 6e 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20  and..      #    
6780: 20 20 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d     managed assem
6790: 62 6c 69 65 73 20 28 69 2e 65 2e 20 62 65 63 61  blies (i.e. beca
67a0: 75 73 65 20 74 68 69 73 20 69 73 20 6f 6e 65 20  use this is one 
67b0: 6f 66 20 74 68 65 20 66 65 77 20 70 6c 61 63 65  of the few place
67c0: 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
67d0: 20 77 68 65 72 65 20 74 68 65 20 43 4c 52 20 77   where the CLR w
67e0: 69 6c 6c 20 61 63 74 75 61 6c 6c 79 20 66 69 6e  ill actually fin
67f0: 64 20 61 6e 64 20 6c 6f 61 64 20 74 68 65 6d 20  d and load them 
6800: 70 72 6f 70 65 72 6c 79 29 2e 0d 0a 20 20 20 20  properly)...    
6810: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
6820: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 62 69  info exists ::bi
6830: 6e 61 72 79 5f 64 69 72 65 63 74 6f 72 79 5d 20  nary_directory] 
6840: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
6850: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
6860: 3a 3a 62 69 6e 61 72 79 5f 64 69 72 65 63 74 6f  ::binary_directo
6870: 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ry] > 0} then {.
6880: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
6890: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
68a0: 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  location of the 
68b0: 62 69 6e 61 72 79 20 64 69 72 65 63 74 6f 72 79  binary directory
68c0: 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69   has been overri
68d0: 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23  dden;..        #
68e0: 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65         therefore
68f0: 2c 20 75 73 65 20 69 74 20 76 65 72 62 61 74 69  , use it verbati
6900: 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  m...        #.. 
6910: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
6920: 3a 62 69 6e 61 72 79 5f 64 69 72 65 63 74 6f 72  :binary_director
6930: 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  y..      } else 
6940: 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
6950: 6e 20 5b 69 6e 66 6f 20 62 69 6e 61 72 79 5d 0d  n [info binary].
6960: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
6970: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
6980: 45 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65  ExternalFileName
6990: 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d   { fileName } {.
69a0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
69b0: 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 73 20  # NOTE: Returns 
69c0: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
69d0: 6c 65 20 6e 61 6d 65 20 61 73 20 69 66 20 69 74  le name as if it
69e0: 20 77 65 72 65 20 6c 6f 63 61 74 65 64 20 69 6e   were located in
69f0: 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
6a00: 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 63 6f      directory co
6a10: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65 78 74  ntaining the ext
6a20: 65 72 6e 61 6c 20 62 69 6e 61 72 69 65 73 2e 0d  ernal binaries..
6a30: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
6a40: 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74  return [file nat
6a50: 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
6a60: 69 6e 20 5b 67 65 74 45 78 74 65 72 6e 61 6c 44  in [getExternalD
6a70: 69 72 65 63 74 6f 72 79 5d 20 24 66 69 6c 65 4e  irectory] $fileN
6a80: 61 6d 65 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  ame]]..    }....
6a90: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 69 6e  .    proc getBin
6aa0: 61 72 79 46 69 6c 65 4e 61 6d 65 20 7b 20 66 69  aryFileName { fi
6ab0: 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d  leName {platform
6ac0: 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20   ""} } {..      
6ad0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
6ae0: 20 52 65 74 75 72 6e 73 20 74 68 65 20 73 70 65   Returns the spe
6af0: 63 69 66 69 65 64 20 66 69 6c 65 20 6e 61 6d 65  cified file name
6b00: 20 61 73 20 69 66 20 69 74 20 77 65 72 65 20 6c   as if it were l
6b10: 6f 63 61 74 65 64 20 69 6e 20 74 68 65 0d 0a 20  ocated in the.. 
6b20: 20 20 20 20 20 23 20 20 20 20 20 20 20 62 69 6e       #       bin
6b30: 61 72 79 20 64 69 72 65 63 74 6f 72 79 2c 20 64  ary directory, d
6b40: 69 73 63 61 72 64 69 6e 67 20 61 6e 79 20 64 69  iscarding any di
6b50: 72 65 63 74 6f 72 79 20 69 6e 66 6f 72 6d 61 74  rectory informat
6b60: 69 6f 6e 20 70 72 65 73 65 6e 74 0d 0a 20 20 20  ion present..   
6b70: 20 20 20 23 20 20 20 20 20 20 20 69 6e 20 74 68     #       in th
6b80: 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 70  e file name as p
6b90: 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20 63  rovided by our c
6ba0: 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d  aller...      #.
6bb0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66  .      return [f
6bc0: 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c  ile nativename \
6bd0: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c  ..          [fil
6be0: 65 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e 61 72  e join [getBinar
6bf0: 79 44 69 72 65 63 74 6f 72 79 5d 20 24 70 6c 61  yDirectory] $pla
6c00: 74 66 6f 72 6d 20 5b 66 69 6c 65 20 74 61 69 6c  tform [file tail
6c10: 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 5d 0d 0a 20   $fileName]]].. 
6c20: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
6c30: 63 20 67 65 74 43 6f 72 65 42 69 6e 61 72 79 46  c getCoreBinaryF
6c40: 69 6c 65 4e 61 6d 65 20 7b 20 7b 70 6c 61 74 66  ileName { {platf
6c50: 6f 72 6d 20 22 22 7d 20 7b 73 74 61 6e 64 61 72  orm ""} {standar
6c60: 64 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20  d false} } {..  
6c70: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
6c80: 4f 54 45 3a 20 52 65 74 75 72 6e 73 20 74 68 65  OTE: Returns the
6c90: 20 66 75 6c 6c 20 70 61 74 68 20 66 6f 72 20 74   full path for t
6ca0: 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69  he file containi
6cb0: 6e 67 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f  ng the SQLite co
6cc0: 72 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  re..      #     
6cd0: 20 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79    native library
6ce0: 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70   code for this p
6cf0: 6c 61 74 66 6f 72 6d 2e 20 20 46 69 72 73 74 2c  latform.  First,
6d00: 20 63 68 65 63 6b 20 61 6e 64 20 73 65 65 20 69   check and see i
6d10: 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  f..      #      
6d20: 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65   the SQLite core
6d30: 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79 20   native library 
6d40: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
6d50: 20 6c 6f 61 64 65 64 2e 20 20 4e 65 78 74 2c 0d   loaded.  Next,.
6d60: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66  .      #       f
6d70: 61 6c 6c 62 61 63 6b 20 74 6f 20 77 68 61 74 20  allback to what 
6d80: 74 68 65 20 66 75 6c 6c 20 70 61 74 68 20 73 68  the full path sh
6d90: 6f 75 6c 64 20 62 65 2c 20 62 61 73 65 64 20 6f  ould be, based o
6da0: 6e 20 77 68 65 74 68 65 72 20 74 68 65 0d 0a 20  n whether the.. 
6db0: 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 69 78       #       mix
6dc0: 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79  ed-mode assembly
6dd0: 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 20 61   is being used a
6de0: 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  nd the name of t
6df0: 68 65 20 63 75 72 72 65 6e 74 0d 0a 20 20 20 20  he current..    
6e00: 20 20 23 20 20 20 20 20 20 20 70 6c 61 74 66 6f    #       platfo
6e10: 72 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  rm...      #..  
6e20: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
6e30: 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74  ..        object
6e40: 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
6e50: 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
6e60: 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
6e70: 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61  Data.SQLite.Unsa
6e80: 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20  feNativeMethods 
6e90: 5f 53 51 4c 69 74 65 4e 61 74 69 76 65 4d 6f 64  _SQLiteNativeMod
6ea0: 75 6c 65 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  uleFileName..   
6eb0: 20 20 20 7d 20 66 69 6c 65 4e 61 6d 65 5d 20 3d     } fileName] =
6ec0: 3d 20 30 20 26 26 20 5b 73 74 72 69 6e 67 20 6c  = 0 && [string l
6ed0: 65 6e 67 74 68 20 24 66 69 6c 65 4e 61 6d 65 5d  ength $fileName]
6ee0: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
6ef0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
6f00: 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 53 51 4c   # NOTE: The SQL
6f10: 69 74 65 20 63 6f 72 65 20 6e 61 74 69 76 65 20  ite core native 
6f20: 6c 69 62 72 61 72 79 20 68 61 73 20 61 6c 72 65  library has alre
6f30: 61 64 79 20 62 65 65 6e 20 6c 6f 61 64 65 64 20  ady been loaded 
6f40: 76 69 61 0d 0a 20 20 20 20 20 20 20 20 23 20 20  via..        #  
6f50: 20 20 20 20 20 74 68 65 20 6e 61 74 69 76 65 20       the native 
6f60: 6c 69 62 72 61 72 79 20 70 72 65 2d 6c 6f 61 64  library pre-load
6f70: 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 61 74  er.  Return that
6f80: 20 66 69 6c 65 20 6e 61 6d 65 20 6e 6f 77 2e 0d   file name now..
6f90: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
6fa0: 20 20 20 20 72 65 74 75 72 6e 20 24 66 69 6c 65      return $file
6fb0: 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  Name..      }...
6fc0: 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 73 52  .      if {[hasR
6fd0: 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74  untimeOption nat
6fe0: 69 76 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ive]} then {..  
6ff0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
7000: 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20   # NOTE: Return 
7010: 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61  the mixed-mode a
7020: 73 73 65 6d 62 6c 79 20 66 69 6c 65 20 6e 61 6d  ssembly file nam
7030: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
7040: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66         return [f
7050: 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c  ile nativename \
7060: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
7070: 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e  ile join [getBin
7080: 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20 24 70  aryDirectory] $p
7090: 6c 61 74 66 6f 72 6d 20 53 79 73 74 65 6d 2e 44  latform System.D
70a0: 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d 5d  ata.SQLite.dll]]
70b0: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66  ..      } elseif
70c0: 20 7b 24 73 74 61 6e 64 61 72 64 7d 20 74 68 65   {$standard} the
70d0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
70e0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
70f0: 52 65 74 75 72 6e 20 74 68 65 20 6e 61 74 69 76  Return the nativ
7100: 65 2d 6f 6e 6c 79 20 73 74 61 6e 64 61 72 64 20  e-only standard 
7110: 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 20 66  SQLite library f
7120: 69 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20  ile name...     
7130: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
7140: 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76  turn [file nativ
7150: 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  ename \..       
7160: 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20       [file join 
7170: 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65 63 74  [getBinaryDirect
7180: 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d 20 73  ory] $platform s
7190: 71 6c 69 74 65 33 2e 64 6c 6c 5d 5d 0d 0a 20 20  qlite3.dll]]..  
71a0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
71b0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
71c0: 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20   # NOTE: Return 
71d0: 74 68 65 20 6e 61 74 69 76 65 2d 6f 6e 6c 79 20  the native-only 
71e0: 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79  interop assembly
71f0: 20 66 69 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20 20   file name...   
7200: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
7210: 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74  return [file nat
7220: 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20  ivename \..     
7230: 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69         [file joi
7240: 6e 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65  n [getBinaryDire
7250: 63 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d  ctory] $platform
7260: 20 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e   SQLite.Interop.
7270: 64 6c 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  dll]]..      }..
7280: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
7290: 6f 63 20 67 65 74 43 6f 6d 6d 6f 6e 44 69 72 65  oc getCommonDire
72a0: 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20  ctory {} {..    
72b0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
72c0: 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72  E: This procedur
72d0: 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 64 69  e returns the di
72e0: 72 65 63 74 6f 72 79 20 77 68 65 72 65 20 74 68  rectory where th
72f0: 65 20 74 65 73 74 20 73 63 72 69 70 74 73 0d 0a  e test scripts..
7300: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 68        #       sh
7310: 6f 75 6c 64 20 62 65 20 6c 6f 63 61 74 65 64 2e  ould be located.
7320: 20 20 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68    By default, th
7330: 69 73 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20  is just returns 
7340: 74 68 65 20 45 61 67 6c 65 0d 0a 20 20 20 20 20  the Eagle..     
7350: 20 23 20 20 20 20 20 20 20 62 69 6e 61 72 79 20   #       binary 
7360: 64 69 72 65 63 74 6f 72 79 2e 0d 0a 20 20 20 20  directory...    
7370: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
7380: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f  info exists ::co
7390: 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20  mmon_directory] 
73a0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
73b0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
73c0: 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f  ::common_directo
73d0: 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ry] > 0} then {.
73e0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
73f0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
7400: 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  location of the 
7410: 63 6f 6d 6d 6f 6e 20 64 69 72 65 63 74 6f 72 79  common directory
7420: 20 68 61 73 20 62 65 65 6e 20 73 65 74 3b 0d 0a   has been set;..
7430: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
7440: 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  therefore, use i
7450: 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
7460: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
7470: 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72  :common_director
7480: 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69  y..      } elsei
7490: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
74a0: 3a 3a 76 65 6e 64 6f 72 5f 64 69 72 65 63 74 6f  ::vendor_directo
74b0: 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  ry] && \..      
74c0: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
74d0: 74 68 20 24 3a 3a 76 65 6e 64 6f 72 5f 64 69 72  th $::vendor_dir
74e0: 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65  ectory] > 0} the
74f0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
7500: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
7510: 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  The location of 
7520: 74 68 65 20 76 65 6e 64 6f 72 20 64 69 72 65 63  the vendor direc
7530: 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73 65  tory has been se
7540: 74 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  t;..        #   
7550: 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75      therefore, u
7560: 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20  se it...        
7570: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
7580: 6e 20 24 3a 3a 76 65 6e 64 6f 72 5f 64 69 72 65  n $::vendor_dire
7590: 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65  ctory..      } e
75a0: 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69  lseif {[info exi
75b0: 73 74 73 20 3a 3a 74 63 6c 5f 6c 69 62 72 61 72  sts ::tcl_librar
75c0: 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  y] && \..       
75d0: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
75e0: 68 20 24 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79  h $::tcl_library
75f0: 5d 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20 20 20  ] > 0 && \..    
7600: 20 20 20 20 20 20 5b 66 69 6c 65 20 69 73 64 69        [file isdi
7610: 72 65 63 74 6f 72 79 20 24 3a 3a 74 63 6c 5f 6c  rectory $::tcl_l
7620: 69 62 72 61 72 79 5d 7d 20 74 68 65 6e 20 7b 0d  ibrary]} then {.
7630: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
7640: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
7650: 76 61 72 69 61 62 6c 65 20 77 69 74 68 20 74 68  variable with th
7660: 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  e location of th
7670: 65 20 73 63 72 69 70 74 20 6c 69 62 72 61 72 79  e script library
7680: 20 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20   is..        #  
7690: 20 20 20 20 20 73 65 74 20 61 6e 64 20 61 70 70       set and app
76a0: 65 61 72 73 20 74 6f 20 62 65 20 61 20 72 65 61  ears to be a rea
76b0: 6c 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65  l directory (i.e
76c0: 2e 20 6e 6f 74 20 65 6d 62 65 64 64 65 64 0d 0a  . not embedded..
76d0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
76e0: 77 69 74 68 69 6e 20 61 20 66 69 6c 65 29 3b 20  within a file); 
76f0: 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  therefore, use i
7700: 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
7710: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
7720: 3a 74 63 6c 5f 6c 69 62 72 61 72 79 0d 0a 20 20  :tcl_library..  
7730: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
7740: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
7750: 20 23 20 4e 4f 54 45 3a 20 46 61 6c 6c 62 61 63   # NOTE: Fallbac
7760: 6b 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f  k to the directo
7770: 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ry containing th
7780: 65 20 65 78 65 63 75 74 61 62 6c 65 2e 0d 0a 20  e executable... 
7790: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
77a0: 20 20 72 65 74 75 72 6e 20 5b 69 6e 66 6f 20 62    return [info b
77b0: 69 6e 61 72 79 5d 0d 0a 20 20 20 20 20 20 7d 0d  inary]..      }.
77c0: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
77d0: 72 6f 63 20 67 65 74 44 61 74 61 62 61 73 65 44  roc getDatabaseD
77e0: 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20  irectory {} {.. 
77f0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
7800: 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65  NOTE: This proce
7810: 64 75 72 65 20 72 65 74 75 72 6e 73 20 74 68 65  dure returns the
7820: 20 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65   directory where
7830: 20 74 68 65 20 74 65 73 74 20 64 61 74 61 62 61   the test databa
7840: 73 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ses..      #    
7850: 20 20 20 73 68 6f 75 6c 64 20 62 65 20 6c 6f 63     should be loc
7860: 61 74 65 64 2e 20 20 42 79 20 64 65 66 61 75 6c  ated.  By defaul
7870: 74 2c 20 74 68 69 73 20 6a 75 73 74 20 75 73 65  t, this just use
7880: 73 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0d  s the temporary.
7890: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64  .      #       d
78a0: 69 72 65 63 74 6f 72 79 20 63 6f 6e 66 69 67 75  irectory configu
78b0: 72 65 64 20 66 6f 72 20 74 68 69 73 20 73 79 73  red for this sys
78c0: 74 65 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  tem...      #.. 
78d0: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
78e0: 78 69 73 74 73 20 3a 3a 64 61 74 61 62 61 73 65  xists ::database
78f0: 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c  _directory] && \
7900: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
7910: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 64 61  ing length $::da
7920: 74 61 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79  tabase_directory
7930: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
7940: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
7950: 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f    # NOTE: The lo
7960: 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61  cation of the da
7970: 74 61 62 61 73 65 20 64 69 72 65 63 74 6f 72 79  tabase directory
7980: 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69   has been overri
7990: 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23  dden;..        #
79a0: 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65         therefore
79b0: 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20  , use it...     
79c0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
79d0: 74 75 72 6e 20 24 3a 3a 64 61 74 61 62 61 73 65  turn $::database
79e0: 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20  _directory..    
79f0: 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66    } elseif {[inf
7a00: 6f 20 65 78 69 73 74 73 20 3a 3a 73 63 72 61 74  o exists ::scrat
7a10: 63 68 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26  ch_directory] &&
7a20: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
7a30: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
7a40: 73 63 72 61 74 63 68 5f 64 69 72 65 63 74 6f 72  scratch_director
7a50: 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  y] > 0} then {..
7a60: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
7a70: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c     # NOTE: The l
7a80: 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ocation of the s
7a90: 63 72 61 74 63 68 20 64 69 72 65 63 74 6f 72 79  cratch directory
7aa0: 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69   has been overri
7ab0: 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23  dden;..        #
7ac0: 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65         therefore
7ad0: 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20  , use it...     
7ae0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
7af0: 74 75 72 6e 20 24 3a 3a 73 63 72 61 74 63 68 5f  turn $::scratch_
7b00: 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20  directory..     
7b10: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
7b20: 20 20 20 72 65 74 75 72 6e 20 5b 67 65 74 54 65     return [getTe
7b30: 6d 70 6f 72 61 72 79 50 61 74 68 5d 0d 0a 20 20  mporaryPath]..  
7b40: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
7b50: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 54 65 6d  .    proc getTem
7b60: 70 6f 72 61 72 79 44 69 72 65 63 74 6f 72 79 20  poraryDirectory 
7b70: 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
7b80: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69       # NOTE: Thi
7b90: 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75  s procedure retu
7ba0: 72 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f 72  rns the director
7bb0: 79 20 77 68 65 72 65 20 74 68 65 20 74 65 6d 70  y where the temp
7bc0: 6f 72 61 72 79 20 66 69 6c 65 73 0d 0a 20 20 20  orary files..   
7bd0: 20 20 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c     #       shoul
7be0: 64 20 62 65 20 6c 6f 63 61 74 65 64 2e 20 20 42  d be located.  B
7bf0: 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69 73 20  y default, this 
7c00: 6a 75 73 74 20 75 73 65 73 20 74 68 65 20 74 65  just uses the te
7c10: 6d 70 6f 72 61 72 79 0d 0a 20 20 20 20 20 20 23  mporary..      #
7c20: 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79         directory
7c30: 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20   configured for 
7c40: 74 68 69 73 20 73 79 73 74 65 6d 2e 0d 0a 20 20  this system...  
7c50: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
7c60: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
7c70: 74 65 6d 70 6f 72 61 72 79 5f 64 69 72 65 63 74  temporary_direct
7c80: 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ory] && \..     
7c90: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
7ca0: 67 74 68 20 24 3a 3a 74 65 6d 70 6f 72 61 72 79  gth $::temporary
7cb0: 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d  _directory] > 0}
7cc0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
7cd0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
7ce0: 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e  TE: The location
7cf0: 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72   of the temporar
7d00: 79 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20  y directory has 
7d10: 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b  been overridden;
7d20: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
7d30: 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65    therefore, use
7d40: 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d   it...        #.
7d50: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
7d60: 24 3a 3a 74 65 6d 70 6f 72 61 72 79 5f 64 69 72  $::temporary_dir
7d70: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20  ectory..      } 
7d80: 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78  elseif {[info ex
7d90: 69 73 74 73 20 3a 3a 73 63 72 61 74 63 68 5f 64  ists ::scratch_d
7da0: 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a  irectory] && \..
7db0: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
7dc0: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 73 63 72 61  g length $::scra
7dd0: 74 63 68 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e  tch_directory] >
7de0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
7df0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
7e00: 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74   NOTE: The locat
7e10: 69 6f 6e 20 6f 66 20 74 68 65 20 73 63 72 61 74  ion of the scrat
7e20: 63 68 20 64 69 72 65 63 74 6f 72 79 20 68 61 73  ch directory has
7e30: 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e   been overridden
7e40: 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ;..        #    
7e50: 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73     therefore, us
7e60: 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  e it...        #
7e70: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
7e80: 20 24 3a 3a 73 63 72 61 74 63 68 5f 64 69 72 65   $::scratch_dire
7e90: 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65  ctory..      } e
7ea0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  lse {..        r
7eb0: 65 74 75 72 6e 20 5b 67 65 74 54 65 6d 70 6f 72  eturn [getTempor
7ec0: 61 72 79 50 61 74 68 5d 0d 0a 20 20 20 20 20 20  aryPath]..      
7ed0: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
7ee0: 20 70 72 6f 63 20 67 65 74 45 78 65 63 75 74 65   proc getExecute
7ef0: 4f 6e 53 65 74 75 70 20 7b 7d 20 7b 0d 0a 20 20  OnSetup {} {..  
7f00: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
7f10: 69 73 74 73 20 3a 3a 65 78 65 63 75 74 65 5f 6f  ists ::execute_o
7f20: 6e 5f 73 65 74 75 70 5d 20 26 26 20 5c 0d 0a 20  n_setup] && \.. 
7f30: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
7f40: 20 6c 65 6e 67 74 68 20 24 3a 3a 65 78 65 63 75   length $::execu
7f50: 74 65 5f 6f 6e 5f 73 65 74 75 70 5d 20 3e 20 30  te_on_setup] > 0
7f60: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
7f70: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
7f80: 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65 20  OTE: Return the 
7f90: 63 6f 6e 66 69 67 75 72 65 64 20 53 51 4c 20 74  configured SQL t
7fa0: 6f 20 65 78 65 63 75 74 65 20 64 75 72 69 6e 67  o execute during
7fb0: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d   the connection.
7fc0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
7fd0: 20 73 65 74 75 70 20 70 72 6f 63 65 64 75 72 65   setup procedure
7fe0: 20 28 69 2e 65 2e 20 66 6f 72 20 65 76 65 72 79   (i.e. for every
7ff0: 20 74 65 73 74 20 64 61 74 61 62 61 73 65 20 63   test database c
8000: 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0d 0a 20 20 20  onnection)...   
8010: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
8020: 72 65 74 75 72 6e 20 24 3a 3a 65 78 65 63 75 74  return $::execut
8030: 65 5f 6f 6e 5f 73 65 74 75 70 0d 0a 20 20 20 20  e_on_setup..    
8040: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
8050: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
8060: 20 4e 4f 54 45 3a 20 42 79 20 64 65 66 61 75 6c   NOTE: By defaul
8070: 74 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 53  t, there is no S
8080: 51 4c 20 74 6f 20 65 78 65 63 75 74 65 20 64 75  QL to execute du
8090: 72 69 6e 67 20 74 68 65 20 63 6f 6e 6e 65 63 74  ring the connect
80a0: 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ion..        #  
80b0: 20 20 20 20 20 73 65 74 75 70 20 70 72 6f 63 65       setup proce
80c0: 64 75 72 65 20 28 69 2e 65 2e 20 66 6f 72 20 65  dure (i.e. for e
80d0: 76 65 72 79 20 74 65 73 74 20 64 61 74 61 62 61  very test databa
80e0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0d  se connection)..
80f0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
8100: 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20      return "".. 
8110: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
8120: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 54 65  ..    proc getTe
8130: 73 74 4f 76 65 72 72 69 64 65 73 50 72 65 61 6d  stOverridesPream
8140: 62 6c 65 20 7b 20 7b 65 78 74 72 61 56 61 72 4e  ble { {extraVarN
8150: 61 6d 65 73 20 22 22 7d 20 7d 20 7b 0d 0a 20 20  ames ""} } {..  
8160: 20 20 20 20 73 65 74 20 76 61 72 4e 61 6d 65 73      set varNames
8170: 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20   [list]....     
8180: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
8190: 3a 20 49 66 20 61 76 61 69 6c 61 62 6c 65 2c 20  : If available, 
81a0: 73 74 61 72 74 20 77 69 74 68 20 74 68 65 20 6d  start with the m
81b0: 61 73 74 65 72 20 6c 69 73 74 20 6f 66 20 74 65  aster list of te
81c0: 73 74 20 6f 76 65 72 72 69 64 65 0d 0a 20 20 20  st override..   
81d0: 20 20 20 23 20 20 20 20 20 20 20 76 61 72 69 61     #       varia
81e0: 62 6c 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  bles...      #..
81f0: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
8200: 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 6f 76  exists ::test_ov
8210: 65 72 72 69 64 65 73 5d 20 26 26 20 5c 0d 0a 20  errides] && \.. 
8220: 20 20 20 20 20 20 20 20 20 5b 6c 6c 65 6e 67 74           [llengt
8230: 68 20 24 3a 3a 74 65 73 74 5f 6f 76 65 72 72 69  h $::test_overri
8240: 64 65 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  des] > 0} then {
8250: 0d 0a 20 20 20 20 20 20 20 20 65 76 61 6c 20 6c  ..        eval l
8260: 61 70 70 65 6e 64 20 76 61 72 4e 61 6d 65 73 20  append varNames 
8270: 24 3a 3a 74 65 73 74 5f 6f 76 65 72 72 69 64 65  $::test_override
8280: 73 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  s..      }....  
8290: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
82a0: 4f 54 45 3a 20 49 66 20 72 65 71 75 65 73 74 65  OTE: If requeste
82b0: 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2c  d by our caller,
82c0: 20 61 64 64 20 61 6e 79 20 61 64 64 69 74 69 6f   add any additio
82d0: 6e 61 6c 20 76 61 72 69 61 62 6c 65 0d 0a 20 20  nal variable..  
82e0: 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d 65      #       name
82f0: 73 20 74 6f 20 63 6f 70 79 20 6e 6f 77 2e 0d 0a  s to copy now...
8300: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
8310: 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 65 78 74  f {[llength $ext
8320: 72 61 56 61 72 4e 61 6d 65 73 5d 20 3e 20 30 7d  raVarNames] > 0}
8330: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
8340: 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 76 61   eval lappend va
8350: 72 4e 61 6d 65 73 20 24 65 78 74 72 61 56 61 72  rNames $extraVar
8360: 4e 61 6d 65 73 0d 0a 20 20 20 20 20 20 7d 0d 0a  Names..      }..
8370: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
8380: 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74   # NOTE: Build t
8390: 68 65 20 73 63 72 69 70 74 20 66 72 61 67 6d 65  he script fragme
83a0: 6e 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  nt to be returne
83b0: 64 20 62 79 20 70 72 6f 63 65 73 73 69 6e 67 20  d by processing 
83c0: 65 61 63 68 0d 0a 20 20 20 20 20 20 23 20 20 20  each..      #   
83d0: 20 20 20 20 76 61 72 69 61 62 6c 65 20 6e 61 6d      variable nam
83e0: 65 20 61 6e 64 20 61 64 64 69 6e 67 20 74 68 65  e and adding the
83f0: 20 6e 65 63 65 63 65 73 73 61 72 79 20 73 63 72   nececessary scr
8400: 69 70 74 20 66 72 61 67 6d 65 6e 74 73 20 66 6f  ipt fragments fo
8410: 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  r..      #      
8420: 20 65 61 63 68 20 6f 6e 65 2e 0d 0a 20 20 20 20   each one...    
8430: 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 72    #..      set r
8440: 65 73 75 6c 74 20 22 22 0d 0a 0d 0a 20 20 20 20  esult ""....    
8450: 20 20 66 6f 72 65 61 63 68 20 76 61 72 4e 61 6d    foreach varNam
8460: 65 20 24 76 61 72 4e 61 6d 65 73 20 7b 0d 0a 20  e $varNames {.. 
8470: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
8480: 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20    # NOTE: Build 
8490: 74 68 65 20 71 75 61 6c 69 66 69 65 64 20 67 6c  the qualified gl
84a0: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 61  obal variable na
84b0: 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  me...        #..
84c0: 20 20 20 20 20 20 20 20 73 65 74 20 66 75 6c 6c          set full
84d0: 56 61 72 4e 61 6d 65 20 5b 61 70 70 65 6e 64 41  VarName [appendA
84e0: 72 67 73 20 3a 3a 20 24 76 61 72 4e 61 6d 65 5d  rgs :: $varName]
84f0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
8500: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44         # NOTE: D
8510: 6f 65 73 20 74 68 65 20 76 61 72 69 61 62 6c 65  oes the variable
8520: 20 65 78 69 73 74 20 69 6e 20 74 68 69 73 20 69   exist in this i
8530: 6e 74 65 72 70 72 65 74 65 72 20 63 6f 6e 74 65  nterpreter conte
8540: 78 74 3f 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  xt?..        #..
8550: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66          if {[inf
8560: 6f 20 65 78 69 73 74 73 20 24 66 75 6c 6c 56 61  o exists $fullVa
8570: 72 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  rName]} then {..
8580: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
8590: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41         # NOTE: A
85a0: 70 70 65 6e 64 20 61 20 73 63 72 69 70 74 20 66  ppend a script f
85b0: 72 61 67 6d 65 6e 74 20 74 6f 20 74 68 65 20 72  ragment to the r
85c0: 65 73 75 6c 74 20 74 68 61 74 20 77 69 6c 6c 20  esult that will 
85d0: 63 6f 72 72 65 63 74 6c 79 0d 0a 20 20 20 20 20  correctly..     
85e0: 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 70       #       cop
85f0: 79 20 61 6e 79 20 63 6f 6e 74 61 69 6e 65 64 20  y any contained 
8600: 76 61 6c 75 65 20 74 6f 20 61 6e 6f 74 68 65 72  value to another
8610: 20 69 6e 74 65 72 70 72 65 74 65 72 20 63 6f 6e   interpreter con
8620: 74 65 78 74 2e 0d 0a 20 20 20 20 20 20 20 20 20  text...         
8630: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 61 70   #..          ap
8640: 70 65 6e 64 20 72 65 73 75 6c 74 20 5c 6e 20 22  pend result \n "
8650: 73 65 74 20 22 20 24 66 75 6c 6c 56 61 72 4e 61  set " $fullVarNa
8660: 6d 65 20 22 20 5c 7b 22 20 5b 73 65 74 20 24 66  me " \{" [set $f
8670: 75 6c 6c 56 61 72 4e 61 6d 65 5d 20 5c 7d 0d 0a  ullVarName] \}..
8680: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
8690: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
86a0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
86b0: 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6e 74 61  the result conta
86c0: 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
86d0: 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 73  script fragments
86e0: 2c 20 61 70 70 65 6e 64 20 61 0d 0a 20 20 20 20  , append a..    
86f0: 20 20 23 20 20 20 20 20 20 20 6e 65 77 6c 69 6e    #       newlin
8700: 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
8710: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
8720: 65 6e 67 74 68 20 24 72 65 73 75 6c 74 5d 20 3e  ength $result] >
8730: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
8740: 20 20 20 20 61 70 70 65 6e 64 20 72 65 73 75 6c      append resul
8750: 74 20 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  t \n..      }...
8760: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72  .      return $r
8770: 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  esult..    }....
8780: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 41 70 70  .    proc getApp
8790: 44 6f 6d 61 69 6e 50 72 65 61 6d 62 6c 65 20 7b  DomainPreamble {
87a0: 20 7b 70 72 65 66 69 78 20 22 22 7d 20 7b 73 75   {prefix ""} {su
87b0: 66 66 69 78 20 22 22 7d 20 7d 20 7b 0d 0a 20 20  ffix ""} } {..  
87c0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
87d0: 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64  OTE: This proced
87e0: 75 72 65 20 72 65 74 75 72 6e 73 20 61 20 74 65  ure returns a te
87f0: 73 74 20 73 65 74 75 70 20 73 63 72 69 70 74 20  st setup script 
8800: 66 72 61 67 6d 65 6e 74 20 73 75 69 74 61 62 6c  fragment suitabl
8810: 65 20 66 6f 72 0d 0a 20 20 20 20 20 20 23 20 20  e for..      #  
8820: 20 20 20 20 20 65 76 61 6c 75 61 74 69 6f 6e 20       evaluation 
8830: 62 79 20 61 6e 20 69 6e 74 65 72 70 72 65 74 65  by an interprete
8840: 72 20 63 72 65 61 74 65 64 20 69 6e 20 61 6e 20  r created in an 
8850: 69 73 6f 6c 61 74 65 64 20 61 70 70 6c 69 63 61  isolated applica
8860: 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  tion..      #   
8870: 20 20 20 20 64 6f 6d 61 69 6e 2e 20 20 54 68 65      domain.  The
8880: 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74   script fragment
8890: 20 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64 20   being returned 
88a0: 77 69 6c 6c 20 62 65 20 73 75 72 72 6f 75 6e 64  will be surround
88b0: 65 64 20 62 79 0d 0a 20 20 20 20 20 20 23 20 20  ed by..      #  
88c0: 20 20 20 20 20 74 68 65 20 70 72 65 66 69 78 20       the prefix 
88d0: 61 6e 64 20 73 75 66 66 69 78 20 22 73 63 72 69  and suffix "scri
88e0: 70 74 20 66 72 61 67 6d 65 6e 74 73 22 20 73 70  pt fragments" sp
88f0: 65 63 69 66 69 65 64 20 62 79 20 6f 75 72 20 63  ecified by our c
8900: 61 6c 6c 65 72 2c 0d 0a 20 20 20 20 20 20 23 20  aller,..      # 
8910: 20 20 20 20 20 20 69 66 20 61 6e 79 2e 20 20 54        if any.  T
8920: 68 65 20 65 6e 74 69 72 65 20 73 63 72 69 70 74  he entire script
8930: 20 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64 20   being returned 
8940: 77 69 6c 6c 20 62 65 20 73 75 62 73 74 69 74 75  will be substitu
8950: 74 65 64 20 76 69 61 0d 0a 20 20 20 20 20 20 23  ted via..      #
8960: 20 20 20 20 20 20 20 5b 73 75 62 73 74 5d 2c 20         [subst], 
8970: 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f  in the context o
8980: 66 20 6f 75 72 20 63 61 6c 6c 65 72 2c 20 62 65  f our caller, be
8990: 66 6f 72 65 20 62 65 69 6e 67 20 72 65 74 75 72  fore being retur
89a0: 6e 65 64 2e 0d 0a 20 20 20 20 20 20 23 20 20 20  ned...      #   
89b0: 20 20 20 20 54 68 69 73 20 73 74 65 70 20 69 73      This step is
89c0: 20 6e 65 63 65 73 73 61 72 79 20 73 6f 20 74 68   necessary so th
89d0: 61 74 20 73 6f 6d 65 20 6c 69 6d 69 74 65 64 20  at some limited 
89e0: 63 6f 6e 74 65 78 74 20 69 6e 66 6f 72 6d 61 74  context informat
89f0: 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 23 20 20 20  ion,..      #   
8a00: 20 20 20 20 70 72 69 6d 61 72 69 6c 79 20 72 65      primarily re
8a10: 6c 61 74 65 64 20 74 6f 20 74 68 65 20 74 65 73  lated to the tes
8a20: 74 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65 73  ting directories
8a30: 2c 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66 65  , can be transfe
8a40: 72 72 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20  rred..      #   
8a50: 20 20 20 20 74 6f 20 74 68 65 20 69 6e 74 65 72      to the inter
8a60: 70 72 65 74 65 72 20 69 6e 20 74 68 65 20 69 73  preter in the is
8a70: 6f 6c 61 74 65 64 20 61 70 70 6c 69 63 61 74 69  olated applicati
8a80: 6f 6e 20 64 6f 6d 61 69 6e 2c 20 6d 61 6b 69 6e  on domain, makin
8a90: 67 20 69 74 0d 0a 20 20 20 20 20 20 23 20 20 20  g it..      #   
8aa0: 20 20 20 20 61 62 6c 65 20 74 6f 20 73 75 63 63      able to succ
8ab0: 65 73 73 66 75 6c 6c 79 20 72 75 6e 20 74 65 73  essfully run tes
8ac0: 74 73 20 74 68 61 74 20 72 65 71 75 69 72 65 20  ts that require 
8ad0: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74  one or more of t
8ae0: 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
8af0: 20 20 66 69 6c 65 73 20 69 6e 20 6f 6e 65 20 6f    files in one o
8b00: 66 20 74 68 65 20 74 65 73 74 69 6e 67 20 64 69  f the testing di
8b10: 72 65 63 74 6f 72 69 65 73 2e 20 20 43 61 6c 6c  rectories.  Call
8b20: 65 72 73 20 73 68 6f 75 6c 64 20 6b 65 65 70 20  ers should keep 
8b30: 69 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  in..      #     
8b40: 20 20 6d 69 6e 64 20 74 68 61 74 20 74 68 65 20    mind that the 
8b50: 74 65 73 74 20 73 63 72 69 70 74 20 66 72 61 67  test script frag
8b60: 6d 65 6e 74 20 62 65 69 6e 67 20 72 65 74 75 72  ment being retur
8b70: 6e 65 64 20 63 61 6e 6e 6f 74 20 72 65 6c 79 20  ned cannot rely 
8b80: 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  on..      #     
8b90: 20 20 61 6e 79 20 73 63 72 69 70 74 20 6c 69 62    any script lib
8ba0: 72 61 72 79 20 70 72 6f 63 65 64 75 72 65 73 20  rary procedures 
8bb0: 74 68 61 74 20 61 72 65 20 6e 6f 74 20 70 72 6f  that are not pro
8bc0: 76 69 64 65 64 20 62 79 20 74 68 65 20 45 61 67  vided by the Eag
8bd0: 6c 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  le..      #     
8be0: 20 20 6c 69 62 72 61 72 79 20 70 61 63 6b 61 67    library packag
8bf0: 65 20 28 69 2e 65 2e 20 22 69 6e 69 74 2e 65 61  e (i.e. "init.ea
8c00: 67 6c 65 22 29 2c 20 69 6e 63 6c 75 64 69 6e 67  gle"), including
8c10: 20 74 68 6f 73 65 20 70 72 6f 76 69 64 65 64 20   those provided 
8c20: 62 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  by..      #     
8c30: 20 20 74 68 65 20 45 61 67 6c 65 20 74 65 73 74    the Eagle test
8c40: 20 70 61 63 6b 61 67 65 2c 20 75 6e 6c 65 73 73   package, unless
8c50: 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69   the file contai
8c60: 6e 69 6e 67 20 74 68 65 6d 20 69 73 20 6c 6f 61  ning them is loa
8c70: 64 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ded..      #    
8c80: 20 20 20 6d 61 6e 75 61 6c 6c 79 20 76 69 61 20     manually via 
8c90: 73 6f 6d 65 20 6f 74 68 65 72 20 6d 65 63 68 61  some other mecha
8ca0: 6e 69 73 6d 20 28 65 2e 67 2e 20 62 79 20 69 6e  nism (e.g. by in
8cb0: 63 6c 75 64 69 6e 67 20 61 70 70 72 6f 70 72 69  cluding appropri
8cc0: 61 74 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ate..      #    
8cd0: 20 20 20 5b 70 61 63 6b 61 67 65 20 72 65 71 75     [package requ
8ce0: 69 72 65 5d 20 6f 72 20 5b 73 6f 75 72 63 65 5d  ire] or [source]
8cf0: 20 63 6f 6d 6d 61 6e 64 73 20 69 6e 20 74 68 65   commands in the
8d00: 20 70 72 65 66 69 78 20 6f 72 20 73 75 66 66 69   prefix or suffi
8d10: 78 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  x..      #      
8d20: 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74   script fragment
8d30: 73 29 2e 20 20 41 6c 73 6f 2c 20 61 6c 6c 20 76  s).  Also, all v
8d40: 61 72 69 61 62 6c 65 20 72 65 66 65 72 65 6e 63  ariable referenc
8d50: 65 73 20 61 6e 64 20 61 6c 6c 20 6e 65 73 74 65  es and all neste
8d60: 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
8d70: 20 63 6f 6d 6d 61 6e 64 73 20 28 69 2e 65 2e 20   commands (i.e. 
8d80: 74 68 6f 73 65 20 69 6e 20 73 71 75 61 72 65 20  those in square 
8d90: 62 72 61 63 6b 65 74 73 29 20 63 6f 6e 74 61 69  brackets) contai
8da0: 6e 65 64 20 69 6e 20 74 68 65 20 66 69 6e 61 6c  ned in the final
8db0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
8dc0: 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20  script fragment 
8dd0: 77 69 6c 6c 20 65 6e 64 20 75 70 20 62 65 69 6e  will end up bein
8de0: 67 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20 74  g evaluated in t
8df0: 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 74 68  he context of th
8e00: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
8e10: 20 63 61 6c 6c 69 6e 67 20 69 6e 74 65 72 70 72   calling interpr
8e20: 65 74 65 72 20 61 6e 64 20 6e 6f 74 20 74 68 65  eter and not the
8e30: 20 74 61 72 67 65 74 20 69 6e 74 65 72 70 72 65   target interpre
8e40: 74 65 72 20 63 72 65 61 74 65 64 20 69 6e 20 74  ter created in t
8e50: 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
8e60: 20 20 69 73 6f 6c 61 74 65 64 20 61 70 70 6c 69    isolated appli
8e70: 63 61 74 69 6f 6e 20 64 6f 6d 61 69 6e 20 75 6e  cation domain un
8e80: 6c 65 73 73 20 74 68 65 20 64 6f 6c 6c 61 72 20  less the dollar 
8e90: 73 69 67 6e 73 20 61 6e 64 2f 6f 72 20 73 71 75  signs and/or squ
8ea0: 61 72 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  are..      #    
8eb0: 20 20 20 62 72 61 63 6b 65 74 73 20 61 72 65 20     brackets are 
8ec0: 73 70 65 63 69 61 6c 6c 79 20 71 75 6f 74 65 64  specially quoted
8ed0: 20 77 69 74 68 20 62 61 63 6b 73 6c 61 73 68 65   with backslashe
8ee0: 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s...      #..   
8ef0: 20 20 20 72 65 74 75 72 6e 20 5b 75 70 6c 65 76     return [uplev
8f00: 65 6c 20 31 20 5b 6c 69 73 74 20 73 75 62 73 74  el 1 [list subst
8f10: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 70 72   [appendArgs $pr
8f20: 65 66 69 78 20 7b 0d 0a 20 20 20 20 20 20 20 20  efix {..        
8f30: 69 66 20 7b 5b 68 61 73 52 75 6e 74 69 6d 65 4f  if {[hasRuntimeO
8f40: 70 74 69 6f 6e 20 6e 61 74 69 76 65 5d 7d 20 74  ption native]} t
8f50: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
8f60: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
8f70: 4e 4f 54 45 3a 20 54 68 65 20 5c 5b 6f 62 6a 65  NOTE: The \[obje
8f80: 63 74 5c 5d 20 63 6f 6d 6d 61 6e 64 20 6d 61 79  ct\] command may
8f90: 20 62 65 20 6d 69 73 73 69 6e 67 20 69 6e 20 73   be missing in s
8fa0: 6f 6d 65 20 45 61 67 6c 65 20 63 6f 72 65 0d 0a  ome Eagle core..
8fb0: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
8fc0: 20 20 6c 69 62 72 61 72 79 20 63 6f 6e 66 69 67    library config
8fd0: 75 72 61 74 69 6f 6e 73 2e 20 20 49 6e 20 74 68  urations.  In th
8fe0: 61 74 20 63 61 73 65 2c 20 77 65 20 63 61 6e 6e  at case, we cann
8ff0: 6f 74 20 63 6f 70 79 20 74 68 65 0d 0a 20 20 20  ot copy the..   
9000: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22         #       "
9010: 6e 61 74 69 76 65 22 20 72 75 6e 74 69 6d 65 20  native" runtime 
9020: 6f 70 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20  option...       
9030: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
9040: 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
9050: 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
9060: 6b 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47  ke Interpreter.G
9070: 65 74 41 63 74 69 76 65 20 41 64 64 52 75 6e 74  etActive AddRunt
9080: 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65  imeOption native
9090: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
90a0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
90b0: 7d 20 5b 67 65 74 54 65 73 74 4f 76 65 72 72 69  } [getTestOverri
90c0: 64 65 73 50 72 65 61 6d 62 6c 65 20 5b 6c 69 73  desPreamble [lis
90d0: 74 20 70 61 74 68 20 74 65 73 74 5f 63 68 61 6e  t path test_chan
90e0: 6e 65 6c 5d 5d 20 24 73 75 66 66 69 78 5d 5d 5d  nel]] $suffix]]]
90f0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
9100: 70 72 6f 63 20 74 72 79 43 6f 70 79 45 78 74 65  proc tryCopyExte
9110: 72 6e 61 6c 46 69 6c 65 20 7b 0d 0a 20 20 20 20  rnalFile {..    
9120: 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65          fileName
9130: 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b   {platform ""} {
9140: 6e 65 77 46 69 6c 65 4e 61 6d 65 20 22 22 7d 20  newFileName ""} 
9150: 7b 76 65 72 62 6f 73 65 20 66 61 6c 73 65 7d 20  {verbose false} 
9160: 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 73  } {..      set s
9170: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5b 67  ourceFileName [g
9180: 65 74 45 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61  etExternalFileNa
9190: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d  me $fileName]...
91a0: 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c  .      if {![fil
91b0: 65 20 65 78 69 73 74 73 20 24 73 6f 75 72 63 65  e exists $source
91c0: 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  FileName]} then 
91d0: 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24  {..        if {$
91e0: 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d  verbose} then {.
91f0: 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
9200: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
9210: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
9220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
9230: 2d 2d 2d 20 73 6b 69 70 70 65 64 20 63 6f 70 79  --- skipped copy
9240: 69 6e 67 20 65 78 74 65 72 6e 61 6c 20 66 69 6c  ing external fil
9250: 65 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c  e \"" $sourceFil
9260: 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  eName \..       
9270: 20 20 20 20 20 20 20 22 5c 22 2c 20 69 74 20 64         "\", it d
9280: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22  oes not exist\n"
9290: 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
92a0: 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20        return..  
92b0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69      }....      i
92c0: 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
92d0: 68 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65 5d 20  h $newFileName] 
92e0: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
92f0: 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74 46       set targetF
9300: 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61  ileName [getBina
9310: 72 79 46 69 6c 65 4e 61 6d 65 20 24 6e 65 77 46  ryFileName $newF
9320: 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72  ileName $platfor
9330: 6d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  m]..      } else
9340: 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
9350: 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b  targetFileName [
9360: 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
9370: 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61  e $fileName $pla
9380: 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 7d 0d  tform]..      }.
9390: 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 74 61 72  ...      set tar
93a0: 67 65 74 44 69 72 65 63 74 6f 72 79 20 5b 66 69  getDirectory [fi
93b0: 6c 65 20 64 69 72 6e 61 6d 65 20 24 74 61 72 67  le dirname $targ
93c0: 65 74 46 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20  etFileName].... 
93d0: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
93e0: 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  {..        if {!
93f0: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 74 61  [file exists $ta
9400: 72 67 65 74 44 69 72 65 63 74 6f 72 79 5d 7d 20  rgetDirectory]} 
9410: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
9420: 20 20 66 69 6c 65 20 6d 6b 64 69 72 20 24 74 61    file mkdir $ta
9430: 72 67 65 74 44 69 72 65 63 74 6f 72 79 0d 0a 20  rgetDirectory.. 
9440: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
9450: 20 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72    file copy -for
9460: 63 65 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61  ce $sourceFileNa
9470: 6d 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61  me $targetFileNa
9480: 6d 65 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20  me..      }] == 
9490: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
94a0: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
94b0: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
94c0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
94d0: 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 69 65 64      "---- copied
94e0: 20 65 78 74 65 72 6e 61 6c 20 66 69 6c 65 20 66   external file f
94f0: 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63 65 46  rom \"" $sourceF
9500: 69 6c 65 4e 61 6d 65 20 22 5c 22 20 74 6f 20 5c  ileName "\" to \
9510: 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
9520: 20 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d    $targetFileNam
9530: 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d  e \"\n]..      }
9540: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
9550: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
9560: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
9570: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
9580: 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74    "---- failed t
9590: 6f 20 63 6f 70 79 20 65 78 74 65 72 6e 61 6c 20  o copy external 
95a0: 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73  file from \"" $s
95b0: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d  ourceFileName \.
95c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22  .            "\"
95d0: 20 74 6f 20 5c 22 22 20 24 74 61 72 67 65 74 46   to \"" $targetF
95e0: 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20  ileName \"\n].. 
95f0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
9600: 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79 43 6f  ..    proc tryCo
9610: 70 79 42 69 6e 61 72 79 46 69 6c 65 20 7b 0d 0a  pyBinaryFile {..
9620: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
9630: 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22  Name {platform "
9640: 22 7d 20 7b 6e 65 77 46 69 6c 65 4e 61 6d 65 20  "} {newFileName 
9650: 22 22 7d 20 7b 76 65 72 62 6f 73 65 20 66 61 6c  ""} {verbose fal
9660: 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73  se} } {..      s
9670: 65 74 20 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  et sourceFileNam
9680: 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65  e [getBinaryFile
9690: 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24  Name $fileName $
96a0: 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20  platform]....   
96b0: 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78     if {![file ex
96c0: 69 73 74 73 20 24 73 6f 75 72 63 65 46 69 6c 65  ists $sourceFile
96d0: 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
96e0: 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62         if {$verb
96f0: 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ose} then {..   
9700: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
9710: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
9720: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
9730: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
9740: 73 6b 69 70 70 65 64 20 63 6f 70 79 69 6e 67 20  skipped copying 
9750: 62 69 6e 61 72 79 20 66 69 6c 65 20 5c 22 22 20  binary file \"" 
9760: 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20  $sourceFileName 
9770: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
9780: 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f   "\", it does no
9790: 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20  t exist\n"]..   
97a0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
97b0: 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d  return..      }.
97c0: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  ...      if {[st
97d0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e 65 77  ring length $new
97e0: 46 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74  FileName] > 0} t
97f0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  hen {..        s
9800: 65 74 20 74 61 72 67 65 74 46 69 6c 65 4e 61 6d  et targetFileNam
9810: 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e  e [getBuildFileN
9820: 61 6d 65 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65  ame $newFileName
9830: 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20   $platform]..   
9840: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
9850: 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74 46       set targetF
9860: 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c  ileName [getBuil
9870: 64 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e  dFileName $fileN
9880: 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a  ame $platform]..
9890: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
98a0: 20 73 65 74 20 74 61 72 67 65 74 44 69 72 65 63   set targetDirec
98b0: 74 6f 72 79 20 5b 66 69 6c 65 20 64 69 72 6e 61  tory [file dirna
98c0: 6d 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61  me $targetFileNa
98d0: 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  me]....      if 
98e0: 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
98f0: 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78     if {![file ex
9900: 69 73 74 73 20 24 74 61 72 67 65 74 44 69 72 65  ists $targetDire
9910: 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ctory]} then {..
9920: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 6d            file m
9930: 6b 64 69 72 20 24 74 61 72 67 65 74 44 69 72 65  kdir $targetDire
9940: 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 20 20 7d  ctory..        }
9950: 0d 0a 20 20 20 20 20 20 20 20 66 69 6c 65 20 63  ..        file c
9960: 6f 70 79 20 2d 66 6f 72 63 65 20 24 73 6f 75 72  opy -force $sour
9970: 63 65 46 69 6c 65 4e 61 6d 65 20 24 74 61 72 67  ceFileName $targ
9980: 65 74 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20  etFileName..    
9990: 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20    }] == 0} then 
99a0: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
99b0: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
99c0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
99d0: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
99e0: 2d 20 63 6f 70 69 65 64 20 62 69 6e 61 72 79 20  - copied binary 
99f0: 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73  file from \"" $s
9a00: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 22 5c  ourceFileName "\
9a10: 22 20 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20  " to \"" \..    
9a20: 20 20 20 20 20 20 20 20 24 74 61 72 67 65 74 46          $targetF
9a30: 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20  ileName \"\n].. 
9a40: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
9a50: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
9a60: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
9a70: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
9a80: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61          "---- fa
9a90: 69 6c 65 64 20 74 6f 20 63 6f 70 79 20 62 69 6e  iled to copy bin
9aa0: 61 72 79 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22  ary file from \"
9ab0: 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  " $sourceFileNam
9ac0: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
9ad0: 20 22 5c 22 20 74 6f 20 5c 22 22 20 24 74 61 72   "\" to \"" $tar
9ae0: 67 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e  getFileName \"\n
9af0: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
9b00: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74  }.....    proc t
9b10: 72 79 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20  ryCopyBuildFile 
9b20: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  {..            f
9b30: 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72  ileName {platfor
9b40: 6d 20 22 22 7d 20 7b 6e 65 77 46 69 6c 65 4e 61  m ""} {newFileNa
9b50: 6d 65 20 22 22 7d 20 7b 76 65 72 62 6f 73 65 20  me ""} {verbose 
9b60: 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20  false} } {..    
9b70: 20 20 73 65 74 20 73 6f 75 72 63 65 46 69 6c 65    set sourceFile
9b80: 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c 64 46 69  Name [getBuildFi
9b90: 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  leName $fileName
9ba0: 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20   $platform].... 
9bb0: 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20       if {![file 
9bc0: 65 78 69 73 74 73 20 24 73 6f 75 72 63 65 46 69  exists $sourceFi
9bd0: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
9be0: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65  .        if {$ve
9bf0: 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20  rbose} then {.. 
9c00: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
9c10: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
9c20: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
9c30: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
9c40: 2d 20 73 6b 69 70 70 65 64 20 63 6f 70 79 69 6e  - skipped copyin
9c50: 67 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22  g build file \""
9c60: 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65   $sourceFileName
9c70: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
9c80: 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e    "\", it does n
9c90: 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20  ot exist\n"]..  
9ca0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
9cb0: 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d   return..      }
9cc0: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73  ....      if {[s
9cd0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e 65  tring length $ne
9ce0: 77 46 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20  wFileName] > 0} 
9cf0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
9d00: 73 65 74 20 74 61 72 67 65 74 46 69 6c 65 4e 61  set targetFileNa
9d10: 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c  me [getBinaryFil
9d20: 65 4e 61 6d 65 20 24 6e 65 77 46 69 6c 65 4e 61  eName $newFileNa
9d30: 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20  me $platform].. 
9d40: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
9d50: 20 20 20 20 20 20 20 73 65 74 20 74 61 72 67 65         set targe
9d60: 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69  tFileName [getBi
9d70: 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69  naryFileName $fi
9d80: 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d  leName $platform
9d90: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ]..      }....  
9da0: 20 20 20 20 73 65 74 20 74 61 72 67 65 74 44 69      set targetDi
9db0: 72 65 63 74 6f 72 79 20 5b 66 69 6c 65 20 64 69  rectory [file di
9dc0: 72 6e 61 6d 65 20 24 74 61 72 67 65 74 46 69 6c  rname $targetFil
9dd0: 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  eName]....      
9de0: 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
9df0: 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65        if {![file
9e00: 20 65 78 69 73 74 73 20 24 74 61 72 67 65 74 44   exists $targetD
9e10: 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20  irectory]} then 
9e20: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66 69 6c  {..          fil
9e30: 65 20 6d 6b 64 69 72 20 24 74 61 72 67 65 74 44  e mkdir $targetD
9e40: 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20  irectory..      
9e50: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 66 69 6c    }..        fil
9e60: 65 20 63 6f 70 79 20 2d 66 6f 72 63 65 20 24 73  e copy -force $s
9e70: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 24 74  ourceFileName $t
9e80: 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 0d 0a 20  argetFileName.. 
9e90: 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68       }] == 0} th
9ea0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  en {..        tp
9eb0: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
9ec0: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
9ed0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
9ee0: 2d 2d 2d 2d 20 63 6f 70 69 65 64 20 62 75 69 6c  ---- copied buil
9ef0: 64 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20  d file from \"" 
9f00: 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20  $sourceFileName 
9f10: 22 5c 22 20 74 6f 20 5c 22 22 20 5c 0d 0a 20 20  "\" to \"" \..  
9f20: 20 20 20 20 20 20 20 20 20 20 24 74 61 72 67 65            $targe
9f30: 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d  tFileName \"\n].
9f40: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
9f50: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
9f60: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
9f70: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
9f80: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
9f90: 66 61 69 6c 65 64 20 74 6f 20 63 6f 70 79 20 62  failed to copy b
9fa0: 75 69 6c 64 20 66 69 6c 65 20 66 72 6f 6d 20 5c  uild file from \
9fb0: 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61  "" $sourceFileNa
9fc0: 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
9fd0: 20 20 22 5c 22 20 74 6f 20 5c 22 22 20 24 74 61    "\" to \"" $ta
9fe0: 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c  rgetFileName \"\
9ff0: 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  n]..      }..   
a000: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
a010: 74 72 79 44 65 6c 65 74 65 42 69 6e 61 72 79 46  tryDeleteBinaryF
a020: 69 6c 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b  ile { fileName {
a030: 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 76 65  platform ""} {ve
a040: 72 62 6f 73 65 20 66 61 6c 73 65 7d 20 7d 20 7b  rbose false} } {
a050: 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65  ..      set file
a060: 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46  Name [getBinaryF
a070: 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d  ileName $fileNam
a080: 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a  e $platform]....
a090: 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65        if {![file
a0a0: 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d   exists $fileNam
a0b0: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
a0c0: 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65      if {$verbose
a0d0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
a0e0: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
a0f0: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
a100: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
a110: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69         "---- ski
a120: 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20 62 69  pped deleting bi
a130: 6e 61 72 79 20 66 69 6c 65 20 5c 22 22 20 24 66  nary file \"" $f
a140: 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20  ileName \..     
a150: 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69 74           "\", it
a160: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c   does not exist\
a170: 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  n"]..        }..
a180: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a          return..
a190: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
a1a0: 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 66 69 6c   if {[catch {fil
a1b0: 65 20 64 65 6c 65 74 65 20 24 66 69 6c 65 4e 61  e delete $fileNa
a1c0: 6d 65 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  me}] == 0} then 
a1d0: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
a1e0: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
a1f0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
a200: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
a210: 2d 20 64 65 6c 65 74 65 64 20 62 69 6e 61 72 79  - deleted binary
a220: 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e   file \"" $fileN
a230: 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  ame \"\n]..     
a240: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
a250: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
a260: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
a270: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
a280: 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64      "---- failed
a290: 20 74 6f 20 64 65 6c 65 74 65 20 62 69 6e 61 72   to delete binar
a2a0: 79 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65  y file \"" $file
a2b0: 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20  Name \"\n]..    
a2c0: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
a2d0: 20 20 20 70 72 6f 63 20 74 72 79 44 65 6c 65 74     proc tryDelet
a2e0: 65 42 75 69 6c 64 46 69 6c 65 20 7b 20 66 69 6c  eBuildFile { fil
a2f0: 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20  eName {platform 
a300: 22 22 7d 20 7b 76 65 72 62 6f 73 65 20 66 61 6c  ""} {verbose fal
a310: 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73  se} } {..      s
a320: 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65 74  et fileName [get
a330: 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 24 66  BuildFileName $f
a340: 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72  ileName $platfor
a350: 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  m]....      if {
a360: 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66  ![file exists $f
a370: 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
a380: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 76  ..        if {$v
a390: 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a  erbose} then {..
a3a0: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
a3b0: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
a3c0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
a3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
a3e0: 2d 2d 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74  -- skipped delet
a3f0: 69 6e 67 20 62 75 69 6c 64 20 66 69 6c 65 20 5c  ing build file \
a400: 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a  "" $fileName \..
a410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c                "\
a420: 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65  ", it does not e
a430: 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  xist\n"]..      
a440: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 72 65 74    }..        ret
a450: 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  urn..      }....
a460: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
a470: 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66   {file delete $f
a480: 69 6c 65 4e 61 6d 65 7d 5d 20 3d 3d 20 30 7d 20  ileName}] == 0} 
a490: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
a4a0: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
a4b0: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
a4c0: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
a4d0: 20 22 2d 2d 2d 2d 20 64 65 6c 65 74 65 64 20 62   "---- deleted b
a4e0: 75 69 6c 64 20 66 69 6c 65 20 5c 22 22 20 24 66  uild file \"" $f
a4f0: 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20  ileName \"\n].. 
a500: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
a510: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
a520: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
a530: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
a540: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61          "---- fa
a550: 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 62  iled to delete b
a560: 75 69 6c 64 20 66 69 6c 65 20 5c 22 22 20 24 66  uild file \"" $f
a570: 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20  ileName \"\n].. 
a580: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
a590: 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79 43 6f  ..    proc tryCo
a5a0: 70 79 41 73 73 65 6d 62 6c 79 20 7b 0d 0a 20 20  pyAssembly {..  
a5b0: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61            fileNa
a5c0: 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d  me {platform ""}
a5d0: 20 7b 70 64 62 20 74 72 75 65 7d 20 7b 76 65 72   {pdb true} {ver
a5e0: 62 6f 73 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  bose false} } {.
a5f0: 0a 20 20 20 20 20 20 74 72 79 43 6f 70 79 42 75  .      tryCopyBu
a600: 69 6c 64 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d  ildFile $fileNam
a610: 65 20 24 70 6c 61 74 66 6f 72 6d 20 22 22 20 24  e $platform "" $
a620: 76 65 72 62 6f 73 65 0d 0a 0d 0a 20 20 20 20 20  verbose....     
a630: 20 69 66 20 7b 24 70 64 62 7d 20 74 68 65 6e 20   if {$pdb} then 
a640: 7b 0d 0a 20 20 20 20 20 20 20 20 74 72 79 43 6f  {..        tryCo
a650: 70 79 42 75 69 6c 64 46 69 6c 65 20 5b 61 70 70  pyBuildFile [app
a660: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
a670: 20 20 20 20 20 20 20 5b 66 69 6c 65 20 72 6f 6f         [file roo
a680: 74 6e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d  tname $fileName]
a690: 20 2e 70 64 62 5d 20 24 70 6c 61 74 66 6f 72 6d   .pdb] $platform
a6a0: 20 22 22 20 24 76 65 72 62 6f 73 65 0d 0a 20 20   "" $verbose..  
a6b0: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
a6c0: 0a 20 20 20 20 70 72 6f 63 20 74 72 79 44 65 6c  .    proc tryDel
a6d0: 65 74 65 41 73 73 65 6d 62 6c 79 20 7b 0d 0a 20  eteAssembly {.. 
a6e0: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 4e             fileN
a6f0: 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22  ame {platform ""
a700: 7d 20 7b 70 64 62 20 74 72 75 65 7d 20 7b 76 65  } {pdb true} {ve
a710: 72 62 6f 73 65 20 66 61 6c 73 65 7d 20 7d 20 7b  rbose false} } {
a720: 0d 0a 20 20 20 20 20 20 74 72 79 44 65 6c 65 74  ..      tryDelet
a730: 65 42 69 6e 61 72 79 46 69 6c 65 20 24 66 69 6c  eBinaryFile $fil
a740: 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 20  eName $platform 
a750: 24 76 65 72 62 6f 73 65 0d 0a 0d 0a 20 20 20 20  $verbose....    
a760: 20 20 69 66 20 7b 24 70 64 62 7d 20 74 68 65 6e    if {$pdb} then
a770: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 72 79 44   {..        tryD
a780: 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20  eleteBinaryFile 
a790: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
a7a0: 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
a7b0: 20 72 6f 6f 74 6e 61 6d 65 20 24 66 69 6c 65 4e   rootname $fileN
a7c0: 61 6d 65 5d 20 2e 70 64 62 5d 20 24 70 6c 61 74  ame] .pdb] $plat
a7d0: 66 6f 72 6d 20 24 76 65 72 62 6f 73 65 0d 0a 20  form $verbose.. 
a7e0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
a7f0: 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79 4c 6f  ..    proc tryLo
a800: 61 64 41 73 73 65 6d 62 6c 79 20 7b 20 66 69 6c  adAssembly { fil
a810: 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20  eName {platform 
a820: 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73  ""} } {..      s
a830: 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65 74  et fileName [get
a840: 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24  BinaryFileName $
a850: 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f  fileName $platfo
a860: 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  rm]....      if 
a870: 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
a880: 20 20 20 73 65 74 20 61 73 73 65 6d 62 6c 79 20     set assembly 
a890: 5b 6f 62 6a 65 63 74 20 6c 6f 61 64 20 2d 6c 6f  [object load -lo
a8a0: 61 64 74 79 70 65 20 46 69 6c 65 20 2d 61 6c 69  adtype File -ali
a8b0: 61 73 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20  as $fileName].. 
a8c0: 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68       }] == 0} th
a8d0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
a8e0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
a8f0: 20 4e 6f 77 2c 20 61 64 64 20 74 68 65 20 6e 65   Now, add the ne
a900: 63 65 73 73 61 72 79 20 74 65 73 74 20 63 6f 6e  cessary test con
a910: 73 74 72 61 69 6e 74 2e 0d 0a 20 20 20 20 20 20  straint...      
a920: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64    #..        add
a930: 43 6f 6e 73 74 72 61 69 6e 74 20 5b 66 69 6c 65  Constraint [file
a940: 20 72 6f 6f 74 6e 61 6d 65 20 5b 66 69 6c 65 20   rootname [file 
a950: 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d  tail $fileName]]
a960: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
a970: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 47         # NOTE: G
a980: 72 61 62 20 74 68 65 20 69 6d 61 67 65 20 72 75  rab the image ru
a990: 6e 74 69 6d 65 20 76 65 72 73 69 6f 6e 20 66 72  ntime version fr
a9a0: 6f 6d 20 74 68 65 20 61 73 73 65 6d 62 6c 79 20  om the assembly 
a9b0: 62 65 63 61 75 73 65 0d 0a 20 20 20 20 20 20 20  because..       
a9c0: 20 23 20 20 20 20 20 20 20 73 65 76 65 72 61 6c   #       several
a9d0: 20 74 65 73 74 73 20 72 65 6c 79 20 6f 6e 20 69   tests rely on i
a9e0: 74 20 68 61 76 69 6e 67 20 61 20 63 65 72 74 61  t having a certa
a9f0: 69 6e 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20  in value...     
aa00: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64     #..        ad
aa10: 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  dConstraint [app
aa20: 65 6e 64 41 72 67 73 20 5b 66 69 6c 65 20 74 61  endArgs [file ta
aa30: 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 20 5f 20  il $fileName] _ 
aa40: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
aa50: 24 61 73 73 65 6d 62 6c 79 20 49 6d 61 67 65 52  $assembly ImageR
aa60: 75 6e 74 69 6d 65 56 65 72 73 69 6f 6e 5d 5d 0d  untimeVersion]].
aa70: 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
aa80: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
aa90: 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61  turn the full pa
aaa0: 74 68 20 6f 66 20 74 68 65 20 6c 6f 61 64 65 64  th of the loaded
aab0: 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20   file...        
aac0: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
aad0: 6e 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  n $fileName..   
aae0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
aaf0: 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 7d 0d 0a  turn ""..    }..
ab00: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73 53 51  ...    proc isSQ
ab10: 4c 69 74 65 52 65 61 64 79 20 7b 7d 20 7b 0d 0a  LiteReady {} {..
ab20: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
ab30: 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63   NOTE: This proc
ab40: 65 64 75 72 65 20 6d 75 73 74 20 72 65 74 75 72  edure must retur
ab50: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 6c 79 20  n non-zero only 
ab60: 69 66 20 74 68 65 20 53 51 4c 69 74 65 20 6e 61  if the SQLite na
ab70: 74 69 76 65 0d 0a 20 20 20 20 20 20 23 20 20 20  tive..      #   
ab80: 20 20 20 20 6c 69 62 72 61 72 79 20 61 6e 64 20      library and 
ab90: 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  the System.Data.
aba0: 53 51 4c 69 74 65 20 6d 61 6e 61 67 65 64 20 61  SQLite managed a
abb0: 73 73 65 6d 62 6c 79 20 61 72 65 20 6c 6f 61 64  ssembly are load
abc0: 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ed..      #     
abd0: 20 20 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20    and ready for 
abe0: 75 73 65 20 62 79 20 74 68 65 20 74 65 73 74 20  use by the test 
abf0: 73 75 69 74 65 2e 20 20 43 75 72 72 65 6e 74 6c  suite.  Currentl
ac00: 79 2c 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  y, this procedur
ac10: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
ac20: 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
ac30: 64 20 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65  d only after the
ac40: 20 5b 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c   [tryLoadAssembl
ac50: 79 5d 20 70 72 6f 63 65 64 75 72 65 20 68 61 73  y] procedure has
ac60: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
ac70: 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 70  been called to p
ac80: 72 6f 62 65 20 66 6f 72 20 74 68 65 20 53 79 73  robe for the Sys
ac90: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
aca0: 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79  managed assembly
acb0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
acc0: 61 6e 64 20 74 68 65 20 5b 63 68 65 63 6b 46 6f  and the [checkFo
acd0: 72 53 51 4c 69 74 65 5d 20 70 72 6f 63 65 64 75  rSQLite] procedu
ace0: 72 65 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c  re has been call
acf0: 65 64 20 74 6f 20 70 72 6f 62 65 20 66 6f 72 0d  ed to probe for.
ad00: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
ad10: 68 65 20 53 51 4c 69 74 65 20 6e 61 74 69 76 65  he SQLite native
ad20: 20 6c 69 62 72 61 72 79 3b 20 6f 74 68 65 72 77   library; otherw
ad30: 69 73 65 2c 20 74 68 69 73 20 70 72 6f 63 65 64  ise, this proced
ad40: 75 72 65 20 77 69 6c 6c 20 73 69 6d 70 6c 79 0d  ure will simply.
ad50: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
ad60: 6c 77 61 79 73 20 72 65 74 75 72 6e 20 7a 65 72  lways return zer
ad70: 6f 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  o...      #..   
ad80: 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20     return [expr 
ad90: 7b 0d 0a 20 20 20 20 20 20 20 20 5b 68 61 76 65  {..        [have
ada0: 43 6f 6e 73 74 72 61 69 6e 74 20 53 79 73 74 65  Constraint Syste
adb0: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 5d 20 26  m.Data.SQLite] &
adc0: 26 20 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e  & [haveConstrain
add0: 74 20 53 51 4c 69 74 65 5d 0d 0a 20 20 20 20 20  t SQLite]..     
ade0: 20 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20   }]..    }..... 
adf0: 20 20 20 70 72 6f 63 20 6d 61 74 63 68 4d 61 63     proc matchMac
ae00: 68 69 6e 65 20 7b 20 70 6c 61 74 66 6f 72 6d 20  hine { platform 
ae10: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
ae20: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 6e 20 65      # NOTE: An e
ae30: 6d 70 74 79 20 73 74 72 69 6e 67 20 66 6f 72 20  mpty string for 
ae40: 74 68 65 20 70 6c 61 74 66 6f 72 6d 20 6d 65 61  the platform mea
ae50: 6e 73 20 74 68 61 74 20 74 68 65 20 62 75 69 6c  ns that the buil
ae60: 64 20 69 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20  d is not..      
ae70: 23 20 20 20 20 20 20 20 5b 70 72 69 6d 61 72 69  #       [primari
ae80: 6c 79 5d 20 61 20 6e 61 74 69 76 65 20 62 75 69  ly] a native bui
ae90: 6c 64 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 69  ld; therefore, i
aea0: 74 20 61 6c 77 61 79 73 20 6d 61 74 63 68 65 73  t always matches
aeb0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
aec0: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
aed0: 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20  ngth $platform] 
aee0: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
aef0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
af00: 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  e..      }....  
af10: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
af20: 4f 54 45 3a 20 44 6f 65 73 20 74 68 65 20 73 70  OTE: Does the sp
af30: 65 63 69 66 69 65 64 20 70 6c 61 74 66 6f 72 6d  ecified platform
af40: 20 6d 61 74 63 68 20 75 70 20 74 6f 20 74 68 65   match up to the
af50: 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73   current process
af60: 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ?..      #..    
af70: 20 20 69 66 20 7b 24 70 6c 61 74 66 6f 72 6d 20    if {$platform 
af80: 65 71 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61  eq [machineToPla
af90: 74 66 6f 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61  tform $::tcl_pla
afa0: 74 66 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 7d  tform(machine)]}
afb0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
afc0: 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20   return true..  
afd0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
afe0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
aff0: 54 68 65 20 73 70 65 63 69 66 69 65 64 20 70 6c  The specified pl
b000: 61 74 66 6f 72 6d 20 64 6f 65 73 20 6e 6f 74 20  atform does not 
b010: 6d 61 74 63 68 20 75 70 20 77 69 74 68 20 74 68  match up with th
b020: 65 20 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20  e platform..    
b030: 20 20 23 20 20 20 20 20 20 20 66 6f 72 20 74 68    #       for th
b040: 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73  e current proces
b050: 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s...      #..   
b060: 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d     return false.
b070: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
b080: 72 6f 63 20 68 61 76 65 53 51 4c 69 74 65 4f 62  roc haveSQLiteOb
b090: 6a 65 63 74 43 6f 6d 6d 61 6e 64 20 7b 7d 20 7b  jectCommand {} {
b0a0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
b0b0: 20 23 20 4e 4f 54 45 3a 20 49 73 20 74 68 65 20   # NOTE: Is the 
b0c0: 5b 6f 62 6a 65 63 74 5d 20 63 6f 6d 6d 61 6e 64  [object] command
b0d0: 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c   currently avail
b0e0: 61 62 6c 65 3f 0d 0a 20 20 20 20 20 20 23 0d 0a  able?..      #..
b0f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78        return [ex
b100: 70 72 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e  pr {[llength [in
b110: 66 6f 20 63 6f 6d 6d 61 6e 64 73 20 6f 62 6a 65  fo commands obje
b120: 63 74 5d 5d 20 3e 20 30 7d 5d 0d 0a 20 20 20 20  ct]] > 0}]..    
b130: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
b140: 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 4f 62 6a  heckForSQLiteObj
b150: 65 63 74 43 6f 6d 6d 61 6e 64 20 7b 20 63 68 61  ectCommand { cha
b160: 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20  nnel } {..      
b170: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
b180: 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
b190: 72 20 5c 22 6f 62 6a 65 63 74 5c 22 20 63 6f 6d  r \"object\" com
b1a0: 6d 61 6e 64 20 75 73 61 67 65 2e 2e 2e 20 22 0d  mand usage... ".
b1b0: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69  ...      if {![i
b1c0: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
b1d0: 73 71 6c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d  sqliteObjectComm
b1e0: 61 6e 64 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20  and)] && \..    
b1f0: 20 20 20 20 20 20 5b 68 61 76 65 53 51 4c 69 74        [haveSQLit
b200: 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d  eObjectCommand]}
b210: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
b220: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
b230: 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 7d 20 65  yes\n..      } e
b240: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
b250: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
b260: 3a 20 55 6e 6c 65 73 73 20 77 65 20 61 72 65 20  : Unless we are 
b270: 66 6f 72 62 69 64 64 65 6e 20 66 72 6f 6d 20 64  forbidden from d
b280: 6f 69 6e 67 20 73 6f 2c 20 61 64 64 20 73 6f 6d  oing so, add som
b290: 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0d 0a 20  e constraints.. 
b2a0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
b2b0: 68 61 74 20 77 69 6c 6c 20 61 6c 6c 6f 77 20 6d  hat will allow m
b2c0: 6f 73 74 20 6f 66 20 74 68 65 20 74 65 73 74 20  ost of the test 
b2d0: 73 75 69 74 65 20 74 6f 20 72 75 6e 20 28 69 2e  suite to run (i.
b2e0: 65 2e 20 74 68 6f 73 65 0d 0a 20 20 20 20 20 20  e. those..      
b2f0: 20 20 23 20 20 20 20 20 20 20 74 65 73 74 73 20    #       tests 
b300: 74 68 61 74 20 64 6f 20 6e 6f 74 20 64 69 72 65  that do not dire
b310: 63 74 6c 79 20 72 65 6c 79 20 75 70 6f 6e 20 74  ctly rely upon t
b320: 68 65 20 5b 6f 62 6a 65 63 74 5d 20 63 6f 6d 6d  he [object] comm
b330: 61 6e 64 29 2e 0d 0a 20 20 20 20 20 20 20 20 23  and)...        #
b340: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
b350: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
b360: 28 73 68 69 6d 53 51 4c 69 74 65 41 73 73 65 6d  (shimSQLiteAssem
b370: 62 6c 79 43 6f 6e 73 74 72 61 69 6e 74 73 29 5d  blyConstraints)]
b380: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
b390: 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
b3a0: 74 20 53 51 4c 69 74 65 0d 0a 20 20 20 20 20 20  t SQLite..      
b3b0: 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
b3c0: 74 20 53 51 4c 69 74 65 49 6e 74 65 72 6f 70 0d  t SQLiteInterop.
b3d0: 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f  .          addCo
b3e0: 6e 73 74 72 61 69 6e 74 20 53 79 73 74 65 6d 2e  nstraint System.
b3f0: 44 61 74 61 2e 53 51 4c 69 74 65 0d 0a 20 20 20  Data.SQLite..   
b400: 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
b410: 61 69 6e 74 20 53 79 73 74 65 6d 2e 44 61 74 61  aint System.Data
b420: 2e 53 51 4c 69 74 65 2e 45 6e 63 72 79 70 74 69  .SQLite.Encrypti
b430: 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64  on..          ad
b440: 64 43 6f 6e 73 74 72 61 69 6e 74 20 53 79 73 74  dConstraint Syst
b450: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c  em.Data.SQLite.L
b460: 69 6e 71 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  inq....         
b470: 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b   addConstraint [
b480: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
b490: 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
b4a0: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
b4b0: 6c 6c 5f 76 20 5b 67 65 74 42 75 69 6c 64 43 6c  ll_v [getBuildCl
b4c0: 72 56 65 72 73 69 6f 6e 5d 5d 0d 0a 20 20 20 20  rVersion]]..    
b4d0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
b4e0: 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
b4f0: 74 73 20 3a 3a 6e 6f 28 73 68 69 6d 53 51 4c 69  ts ::no(shimSQLi
b500: 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74  teDefineConstant
b510: 43 6f 6e 73 74 72 61 69 6e 74 73 29 5d 7d 20 74  Constraints)]} t
b520: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
b530: 20 66 6f 72 65 61 63 68 20 64 65 66 69 6e 65 43   foreach defineC
b540: 6f 6e 73 74 61 6e 74 20 5b 6c 69 73 74 20 5c 0d  onstant [list \.
b550: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49  .              I
b560: 4e 54 45 52 4f 50 5f 45 58 54 45 4e 53 49 4f 4e  NTEROP_EXTENSION
b570: 5f 46 55 4e 43 54 49 4f 4e 53 20 49 4e 54 45 52  _FUNCTIONS INTER
b580: 4f 50 5f 54 45 53 54 5f 45 58 54 45 4e 53 49 4f  OP_TEST_EXTENSIO
b590: 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  N \..           
b5a0: 20 20 20 49 4e 54 45 52 4f 50 5f 56 49 52 54 55     INTEROP_VIRTU
b5b0: 41 4c 5f 54 41 42 4c 45 20 55 53 45 5f 49 4e 54  AL_TABLE USE_INT
b5c0: 45 52 4f 50 5f 44 4c 4c 5d 20 7b 0d 0a 20 20 20  EROP_DLL] {..   
b5d0: 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73           addCons
b5e0: 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
b5f0: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
b600: 20 20 20 20 20 20 64 65 66 69 6e 65 43 6f 6e 73        defineCons
b610: 74 61 6e 74 2e 53 79 73 74 65 6d 2e 44 61 74 61  tant.System.Data
b620: 2e 53 51 4c 69 74 65 2e 20 24 64 65 66 69 6e 65  .SQLite. $define
b630: 43 6f 6e 73 74 61 6e 74 5d 0d 0a 20 20 20 20 20  Constant]..     
b640: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
b650: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
b660: 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
b670: 3a 6e 6f 28 73 68 69 6d 53 51 4c 69 74 65 56 69  :no(shimSQLiteVi
b680: 73 75 61 6c 53 74 75 64 69 6f 43 6f 6e 73 74 72  sualStudioConstr
b690: 61 69 6e 74 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  aints)]} then {.
b6a0: 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f  .          addCo
b6b0: 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
b6c0: 41 72 67 73 20 76 69 73 75 61 6c 53 74 75 64 69  Args visualStudi
b6d0: 6f 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72 5d  o [getBuildYear]
b6e0: 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  ]..        }....
b6f0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
b700: 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20  hannel no\n..   
b710: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
b720: 20 20 20 20 70 72 6f 63 20 63 68 61 6e 67 65 4e      proc changeN
b730: 61 74 69 76 65 52 75 6e 74 69 6d 65 4f 70 74 69  ativeRuntimeOpti
b740: 6f 6e 20 7b 20 6e 61 74 69 76 65 20 7d 20 7b 0d  on { native } {.
b750: 0a 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e  .      if {[llen
b760: 67 74 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e  gth [info comman
b770: 64 73 20 64 65 62 75 67 5d 5d 20 3e 20 30 20 26  ds debug]] > 0 &
b780: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
b790: 6c 6c 65 6e 67 74 68 20 5b 69 6e 66 6f 20 73 75  llength [info su
b7a0: 62 63 6f 6d 6d 61 6e 64 73 20 64 65 62 75 67 20  bcommands debug 
b7b0: 72 75 6e 74 69 6d 65 6f 70 74 69 6f 6e 5d 5d 20  runtimeoption]] 
b7c0: 3e 20 30 20 26 26 20 5b 63 61 74 63 68 20 7b 0d  > 0 && [catch {.
b7d0: 0a 20 20 20 20 20 20 20 20 64 65 62 75 67 20 72  .        debug r
b7e0: 75 6e 74 69 6d 65 6f 70 74 69 6f 6e 20 5b 65 78  untimeoption [ex
b7f0: 70 72 20 7b 24 6e 61 74 69 76 65 20 3f 20 22 61  pr {$native ? "a
b800: 64 64 22 20 3a 20 22 72 65 6d 6f 76 65 22 7d 5d  dd" : "remove"}]
b810: 20 6e 61 74 69 76 65 0d 0a 20 20 20 20 20 20 7d   native..      }
b820: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
b830: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
b840: 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  rue..      }....
b850: 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53        if {[haveS
b860: 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61  QLiteObjectComma
b870: 6e 64 5d 20 26 26 20 5b 63 61 74 63 68 20 7b 0d  nd] && [catch {.
b880: 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20  .        object 
b890: 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72 65 74  invoke Interpret
b8a0: 65 72 2e 47 65 74 41 63 74 69 76 65 20 5b 65 78  er.GetActive [ex
b8b0: 70 72 20 7b 24 6e 61 74 69 76 65 20 3f 20 5c 0d  pr {$native ? \.
b8c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 41 64  .            "Ad
b8d0: 64 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 22 20  dRuntimeOption" 
b8e0: 3a 20 22 52 65 6d 6f 76 65 52 75 6e 74 69 6d 65  : "RemoveRuntime
b8f0: 4f 70 74 69 6f 6e 22 7d 5d 20 6e 61 74 69 76 65  Option"}] native
b900: 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d  ..      }] == 0}
b910: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
b920: 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20   return true..  
b930: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72      }....      r
b940: 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20  eturn false..   
b950: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
b960: 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 42 75  checkForSQLiteBu
b970: 69 6c 64 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b  ilds { channel {
b980: 73 65 6c 65 63 74 20 66 61 6c 73 65 7d 20 7d 20  select false} } 
b990: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
b9a0: 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
b9b0: 66 6f 72 20 65 76 65 72 79 20 70 6f 73 73 69 62  for every possib
b9c0: 6c 65 20 76 61 6c 69 64 20 63 6f 6d 62 69 6e 61  le valid combina
b9d0: 74 69 6f 6e 20 6f 66 20 76 61 6c 75 65 73 20 75  tion of values u
b9e0: 73 65 64 20 77 68 65 6e 0d 0a 20 20 20 20 20 20  sed when..      
b9f0: 23 20 20 20 20 20 20 20 6c 6f 63 61 74 69 6e 67  #       locating
ba00: 20 6f 75 74 20 74 68 65 20 62 75 69 6c 64 20 6f   out the build o
ba10: 75 74 70 75 74 20 64 69 72 65 63 74 6f 72 79 2c  utput directory,
ba20: 20 73 68 6f 77 69 6e 67 20 65 61 63 68 20 61 76   showing each av
ba30: 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20 23  ailable..      #
ba40: 20 20 20 20 20 20 20 62 75 69 6c 64 20 76 61 72         build var
ba50: 69 61 74 69 6f 6e 20 61 6c 6f 6e 67 20 74 68 65  iation along the
ba60: 20 77 61 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a   way...      #..
ba70: 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 6e 61        foreach na
ba80: 74 69 76 65 20 5b 6c 69 73 74 20 66 61 6c 73 65  tive [list false
ba90: 20 74 72 75 65 5d 20 7b 0d 0a 20 20 20 20 20 20   true] {..      
baa0: 20 20 66 6f 72 65 61 63 68 20 79 65 61 72 20 5b    foreach year [
bab0: 67 65 74 42 75 69 6c 64 59 65 61 72 73 5d 20 7b  getBuildYears] {
bac0: 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65  ..          fore
bad0: 61 63 68 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ach configuratio
bae0: 6e 20 5b 67 65 74 42 75 69 6c 64 43 6f 6e 66 69  n [getBuildConfi
baf0: 67 75 72 61 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20  gurations] {..  
bb00: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
bb10: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
bb20: 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
bb30: 65 66 66 65 63 74 69 76 65 20 62 75 69 6c 64 20  effective build 
bb40: 70 6c 61 74 66 6f 72 6d 2e 20 20 54 68 69 73 20  platform.  This 
bb50: 69 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  is..            
bb60: 23 20 20 20 20 20 20 20 62 61 73 65 64 20 6f 6e  #       based on
bb70: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
bb80: 61 20 5b 70 72 69 6d 61 72 69 6c 79 5d 20 6e 61  a [primarily] na
bb90: 74 69 76 65 20 62 75 69 6c 64 0d 0a 20 20 20 20  tive build..    
bba0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
bbb0: 69 73 20 62 65 69 6e 67 20 75 73 65 64 2e 20 20  is being used.  
bbc0: 46 6f 72 20 5b 70 72 69 6d 61 72 69 6c 79 5d 20  For [primarily] 
bbd0: 6e 6f 6e 2d 6e 61 74 69 76 65 20 62 75 69 6c 64  non-native build
bbe0: 73 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  s,..            
bbf0: 23 20 20 20 20 20 20 20 74 68 69 73 20 77 69 6c  #       this wil
bc00: 6c 20 62 65 20 61 6e 20 65 6d 70 74 79 20 73 74  l be an empty st
bc10: 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 20  ring...         
bc20: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
bc30: 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 5b    set platform [
bc40: 67 65 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d  getBuildPlatform
bc50: 20 24 6e 61 74 69 76 65 5d 0d 0a 0d 0a 20 20 20   $native]....   
bc60: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
bc70: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
bc80: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
bc90: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65         "---- che
bca0: 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d  cking for System
bcb0: 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75 69  .Data.SQLite bui
bcc0: 6c 64 20 5c 22 22 20 5b 65 78 70 72 20 5c 0d 0a  ld \"" [expr \..
bcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bce0: 7b 24 6e 61 74 69 76 65 20 3f 20 22 6e 61 74 69  {$native ? "nati
bcf0: 76 65 2f 22 20 3a 20 22 22 7d 5d 20 5b 65 78 70  ve/" : ""}] [exp
bd00: 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  r {[string lengt
bd10: 68 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h \..           
bd20: 20 20 20 20 20 24 70 6c 61 74 66 6f 72 6d 5d 20       $platform] 
bd30: 3e 20 30 20 3f 20 5b 61 70 70 65 6e 64 41 72 67  > 0 ? [appendArg
bd40: 73 20 24 70 6c 61 74 66 6f 72 6d 20 2f 5d 20 3a  s $platform /] :
bd50: 20 22 22 7d 5d 20 24 79 65 61 72 20 5c 0d 0a 20   ""}] $year \.. 
bd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bd70: 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20   $configuration 
bd80: 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20  "\"... "]....   
bd90: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
bda0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
bdb0: 42 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 79 20  Build the fully 
bdc0: 71 75 61 6c 69 66 69 65 64 20 64 69 72 65 63 74  qualified direct
bdd0: 6f 72 79 20 77 68 65 72 65 20 74 68 65 20 6e 65  ory where the ne
bde0: 63 65 73 73 61 72 79 0d 0a 20 20 20 20 20 20 20  cessary..       
bdf0: 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6d       #       com
be00: 70 6f 6e 65 6e 74 73 20 66 6f 72 20 53 79 73 74  ponents for Syst
be10: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 73  em.Data.SQLite s
be20: 68 6f 75 6c 64 20 62 65 20 66 6f 75 6e 64 2e 0d  hould be found..
be30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
be40: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
be50: 64 69 72 65 63 74 6f 72 79 20 5b 6a 6f 69 6e 42  directory [joinB
be60: 75 69 6c 64 44 69 72 65 63 74 6f 72 79 20 24 6e  uildDirectory $n
be70: 61 74 69 76 65 20 5c 0d 0a 20 20 20 20 20 20 20  ative \..       
be80: 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 75 69           [getBui
be90: 6c 64 42 61 73 65 44 69 72 65 63 74 6f 72 79 5d  ldBaseDirectory]
bea0: 20 24 79 65 61 72 20 24 70 6c 61 74 66 6f 72 6d   $year $platform
beb0: 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d   $configuration]
bec0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
bed0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  #..            #
bee0: 20 4e 4f 54 45 3a 20 44 6f 20 74 68 65 20 6e 65   NOTE: Do the ne
bef0: 63 65 73 73 61 72 79 20 66 69 6c 65 73 20 65 78  cessary files ex
bf00: 69 73 74 3f 20 20 43 75 72 72 65 6e 74 6c 79 2c  ist?  Currently,
bf10: 20 6e 6f 20 6f 74 68 65 72 20 73 74 65 70 73 0d   no other steps.
bf20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20  .            #  
bf30: 20 20 20 20 20 61 72 65 20 74 61 6b 65 6e 20 74       are taken t
bf40: 6f 20 76 65 72 69 66 79 20 74 68 69 73 20 62 75  o verify this bu
bf50: 69 6c 64 20 69 73 20 61 63 74 75 61 6c 6c 79 20  ild is actually 
bf60: 76 69 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20  viable...       
bf70: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
bf80: 20 20 20 20 69 66 20 7b 5b 69 73 42 75 69 6c 64      if {[isBuild
bf90: 41 76 61 69 6c 61 62 6c 65 20 24 6e 61 74 69 76  Available $nativ
bfa0: 65 20 24 64 69 72 65 63 74 6f 72 79 5d 7d 20 74  e $directory]} t
bfb0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
bfc0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
bfd0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 68        # NOTE: Wh
bfe0: 65 6e 20 69 6e 20 22 73 65 6c 65 63 74 22 20 6d  en in "select" m
bff0: 6f 64 65 2c 20 61 75 74 6f 6d 61 74 69 63 61 6c  ode, automatical
c000: 6c 79 20 73 65 6c 65 63 74 20 74 68 65 20 66 69  ly select the fi
c010: 72 73 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20  rst..           
c020: 20 20 20 23 20 20 20 20 20 20 20 61 76 61 69 6c     #       avail
c030: 61 62 6c 65 20 62 75 69 6c 64 20 6f 66 20 53 79  able build of Sy
c040: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
c050: 20 61 6e 64 20 74 68 65 6e 20 72 65 74 75 72 6e   and then return
c060: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
c070: 23 20 20 20 20 20 20 20 69 6d 6d 65 64 69 61 74  #       immediat
c080: 65 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ely...          
c090: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
c0a0: 20 20 20 20 20 69 66 20 7b 24 73 65 6c 65 63 74       if {$select
c0b0: 20 26 26 20 5b 6d 61 74 63 68 4d 61 63 68 69 6e   && [matchMachin
c0c0: 65 20 24 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68  e $platform]} th
c0d0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
c0e0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
c0f0: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
c100: 20 4d 61 6e 75 61 6c 6c 79 20 6f 76 65 72 72 69   Manually overri
c110: 64 65 20 61 6c 6c 20 74 68 65 20 62 75 69 6c 64  de all the build
c120: 20 64 69 72 65 63 74 6f 72 79 20 73 65 6c 65 63   directory selec
c130: 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  tion..          
c140: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65        #       re
c150: 6c 61 74 65 64 20 74 65 73 74 20 73 65 74 74 69  lated test setti
c160: 6e 67 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ngs in order to 
c170: 66 6f 72 63 65 20 74 68 69 73 20 62 75 69 6c 64  force this build
c180: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
c190: 20 20 23 20 20 20 20 20 20 20 6f 66 20 53 79 73    #       of Sys
c1a0: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
c1b0: 74 6f 20 62 65 20 75 73 65 64 2e 0d 0a 20 20 20  to be used...   
c1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
c1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1e0: 69 66 20 7b 21 5b 63 68 61 6e 67 65 4e 61 74 69  if {![changeNati
c1f0: 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20  veRuntimeOption 
c200: 24 6e 61 74 69 76 65 5d 7d 20 74 68 65 6e 20 7b  $native]} then {
c210: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
c220: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
c230: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
c240: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
c250: 20 20 20 20 20 20 20 20 22 6e 6f 2c 20 66 61 69          "no, fai
c260: 6c 65 64 20 74 6f 20 22 20 5b 65 78 70 72 20 7b  led to " [expr {
c270: 24 6e 61 74 69 76 65 20 3f 20 22 61 64 64 22 20  $native ? "add" 
c280: 3a 20 22 72 65 6d 6f 76 65 22 7d 5d 20 5c 0d 0a  : "remove"}] \..
c290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2a0: 20 20 20 20 20 20 22 20 74 68 65 20 5c 22 6e 61        " the \"na
c2b0: 74 69 76 65 5c 22 20 72 75 6e 74 69 6d 65 20 6f  tive\" runtime o
c2c0: 70 74 69 6f 6e 5c 6e 22 5d 0d 0a 0d 0a 20 20 20  ption\n"]....   
c2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
c2e0: 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20  eturn false..   
c2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
c300: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
c310: 20 20 73 65 74 20 3a 3a 74 65 73 74 5f 79 65 61    set ::test_yea
c320: 72 20 24 79 65 61 72 0d 0a 20 20 20 20 20 20 20  r $year..       
c330: 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 74           set ::t
c340: 65 73 74 5f 70 6c 61 74 66 6f 72 6d 20 24 70 6c  est_platform $pl
c350: 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20  atform..        
c360: 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65          set ::te
c370: 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  st_configuration
c380: 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0d   $configuration.
c390: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
c3a0: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
c3b0: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
c3c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c3d0: 20 20 20 20 20 22 79 65 73 2c 20 73 65 6c 65 63       "yes, selec
c3e0: 74 65 64 20 28 22 20 5b 65 78 70 72 20 7b 24 6e  ted (" [expr {$n
c3f0: 61 74 69 76 65 20 3f 20 22 6e 61 74 69 76 65 2f  ative ? "native/
c400: 22 20 3a 20 22 22 7d 5d 20 5c 0d 0a 20 20 20 20  " : ""}] \..    
c410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c420: 5b 65 78 70 72 20 7b 5b 73 74 72 69 6e 67 20 6c  [expr {[string l
c430: 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d  ength $platform]
c440: 20 3e 20 30 20 3f 20 5b 61 70 70 65 6e 64 41 72   > 0 ? [appendAr
c450: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
c460: 20 20 20 20 20 20 20 20 20 20 24 70 6c 61 74 66            $platf
c470: 6f 72 6d 20 2f 5d 20 3a 20 22 22 7d 5d 20 24 79  orm /] : ""}] $y
c480: 65 61 72 20 2f 20 24 63 6f 6e 66 69 67 75 72 61  ear / $configura
c490: 74 69 6f 6e 20 22 29 5c 6e 22 5d 0d 0a 0d 0a 20  tion ")\n"].... 
c4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
c4b0: 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20  eturn true..    
c4c0: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
c4d0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
c4e0: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
c4f0: 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20  el yes\n..      
c500: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
c510: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
c520: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
c530: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
c540: 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  \n..            
c550: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
c560: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
c570: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
c580: 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d  rn false..    }.
c590: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65  ....    proc che
c5a0: 63 6b 46 6f 72 53 51 4c 69 74 65 52 65 6c 65 61  ckForSQLiteRelea
c5b0: 73 65 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 73  ses { channel {s
c5c0: 65 6c 65 63 74 20 66 61 6c 73 65 7d 20 7d 20 7b  elect false} } {
c5d0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
c5e0: 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66   # NOTE: Check f
c5f0: 6f 72 20 70 61 73 74 20 72 65 6c 65 61 73 65 73  or past releases
c600: 20 6f 66 20 53 79 73 74 65 6d 2e 44 61 74 61 2e   of System.Data.
c610: 53 51 4c 69 74 65 20 69 6e 20 74 68 65 20 64 69  SQLite in the di
c620: 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 23  rectory..      #
c630: 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 65 64         contained
c640: 20 69 6e 20 74 68 65 20 22 53 79 73 74 65 6d 2e   in the "System.
c650: 44 61 74 61 2e 53 51 4c 69 74 65 22 20 65 6e 76  Data.SQLite" env
c660: 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c  ironment variabl
c670: 65 2c 20 69 66 0d 0a 20 20 20 20 20 20 23 20 20  e, if..      #  
c680: 20 20 20 20 20 70 72 65 73 65 6e 74 2e 0d 0a 20       present... 
c690: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
c6a0: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
c6b0: 3a 65 6e 76 28 53 79 73 74 65 6d 2e 44 61 74 61  :env(System.Data
c6c0: 2e 53 51 4c 69 74 65 29 5d 20 26 26 20 5c 0d 0a  .SQLite)] && \..
c6d0: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
c6e0: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 65 6e 76 28  g length $::env(
c6f0: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
c700: 74 65 29 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  te)] > 0} then {
c710: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
c720: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69       # NOTE: Bui
c730: 6c 64 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61  ld the fully qua
c740: 6c 69 66 69 65 64 20 64 69 72 65 63 74 6f 72 79  lified directory
c750: 20 77 68 65 72 65 20 74 68 65 20 6e 65 63 65 73   where the neces
c760: 73 61 72 79 0d 0a 20 20 20 20 20 20 20 20 23 20  sary..        # 
c770: 20 20 20 20 20 20 63 6f 6d 70 6f 6e 65 6e 74 73        components
c780: 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61   for System.Data
c790: 2e 53 51 4c 69 74 65 20 73 68 6f 75 6c 64 20 62  .SQLite should b
c7a0: 65 20 66 6f 75 6e 64 2e 0d 0a 20 20 20 20 20 20  e found...      
c7b0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74    #..        set
c7c0: 20 64 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65   directory [file
c7d0: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
c7e0: 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20  e join \..      
c7f0: 20 20 20 20 20 20 24 3a 3a 65 6e 76 28 53 79 73        $::env(Sys
c800: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 29  tem.Data.SQLite)
c810: 20 5b 67 65 74 52 65 6c 65 61 73 65 56 65 72 73   [getReleaseVers
c820: 69 6f 6e 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  ion]]]....      
c830: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
c840: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
c850: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
c860: 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53  - checking for S
c870: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
c880: 65 20 72 65 6c 65 61 73 65 20 5c 22 22 20 5c 0d  e release \"" \.
c890: 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 64 69  .            $di
c8a0: 72 65 63 74 6f 72 79 20 22 5c 22 2e 2e 2e 20 22  rectory "\"... "
c8b0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  ]....        if 
c8c0: 7b 5b 69 73 52 65 6c 65 61 73 65 41 76 61 69 6c  {[isReleaseAvail
c8d0: 61 62 6c 65 20 24 64 69 72 65 63 74 6f 72 79 20  able $directory 
c8e0: 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20  platform]} then 
c8f0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
c900: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
c910: 24 70 6c 61 74 66 6f 72 6d 5d 20 3d 3d 20 30 7d  $platform] == 0}
c920: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
c930: 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72       set platfor
c940: 6d 20 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20  m unknown..     
c950: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
c960: 20 20 20 20 69 66 20 7b 24 73 65 6c 65 63 74 20      if {$select 
c970: 26 26 20 5b 6d 61 74 63 68 4d 61 63 68 69 6e 65  && [matchMachine
c980: 20 24 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65   $platform]} the
c990: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
c9a0: 20 73 65 74 20 3a 3a 62 75 69 6c 64 5f 64 69 72   set ::build_dir
c9b0: 65 63 74 6f 72 79 20 24 64 69 72 65 63 74 6f 72  ectory $director
c9c0: 79 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  y....           
c9d0: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
c9e0: 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73  [appendArgs "yes
c9f0: 2c 20 73 65 6c 65 63 74 65 64 20 28 22 20 24 70  , selected (" $p
ca00: 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a  latform ")\n"]..
ca10: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
ca20: 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20  turn true..     
ca30: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
ca40: 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
ca50: 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
ca60: 64 41 72 67 73 20 22 79 65 73 20 28 22 20 24 70  dArgs "yes (" $p
ca70: 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a  latform ")\n"]..
ca80: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
ca90: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
caa0: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
cab0: 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 0d 0a  channel no\n....
cac0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
cad0: 68 20 70 61 74 68 20 5b 6c 73 6f 72 74 20 2d 64  h path [lsort -d
cae0: 65 63 72 65 61 73 69 6e 67 20 5b 66 69 6c 65 20  ecreasing [file 
caf0: 6c 69 73 74 20 24 64 69 72 65 63 74 6f 72 79 20  list $directory 
cb00: 2a 5d 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  *]] {..         
cb10: 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69     if {[file exi
cb20: 73 74 73 20 24 70 61 74 68 5d 20 26 26 20 5b 66  sts $path] && [f
cb30: 69 6c 65 20 69 73 64 69 72 65 63 74 6f 72 79 20  ile isdirectory 
cb40: 24 70 61 74 68 5d 7d 20 74 68 65 6e 20 7b 0d 0a  $path]} then {..
cb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
cb60: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
cb70: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
cb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
cb90: 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
cba0: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
cbb0: 69 74 65 20 72 65 6c 65 61 73 65 20 5c 22 22 20  ite release \"" 
cbc0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
cbd0: 20 20 20 20 20 24 70 61 74 68 20 22 5c 22 2e 2e       $path "\"..
cbe0: 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  . "]....        
cbf0: 20 20 20 20 20 20 69 66 20 7b 5b 69 73 52 65 6c        if {[isRel
cc00: 65 61 73 65 41 76 61 69 6c 61 62 6c 65 20 24 70  easeAvailable $p
cc10: 61 74 68 20 70 6c 61 74 66 6f 72 6d 5d 7d 20 74  ath platform]} t
cc20: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
cc30: 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
cc40: 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66  ng length $platf
cc50: 6f 72 6d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  orm] == 0} then 
cc60: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
cc70: 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72       set platfor
cc80: 6d 20 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20  m unknown..     
cc90: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
cca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ccb0: 69 66 20 7b 24 73 65 6c 65 63 74 20 26 26 20 5b  if {$select && [
ccc0: 6d 61 74 63 68 4d 61 63 68 69 6e 65 20 24 70 6c  matchMachine $pl
ccd0: 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d  atform]} then {.
cce0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ccf0: 20 20 20 73 65 74 20 3a 3a 62 75 69 6c 64 5f 64     set ::build_d
cd00: 69 72 65 63 74 6f 72 79 20 24 70 61 74 68 0d 0a  irectory $path..
cd10: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
cd20: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
cd30: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  el [appendArgs "
cd40: 79 65 73 2c 20 73 65 6c 65 63 74 65 64 20 28 22  yes, selected ("
cd50: 20 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22   $platform ")\n"
cd60: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
cd70: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
cd80: 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue..            
cd90: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
cda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdb0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
cdc0: 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73 20  appendArgs "yes 
cdd0: 28 22 20 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c  (" $platform ")\
cde0: 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n"]..           
cdf0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
ce00: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
ce10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce20: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e  tputs $channel n
ce30: 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  o\n..           
ce40: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
ce50: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
ce60: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
ce70: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
ce80: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
ce90: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
cea0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
ceb0: 2d 2d 2d 2d 20 65 6e 76 69 72 6f 6e 6d 65 6e 74  ---- environment
cec0: 20 76 61 72 69 61 62 6c 65 20 5c 22 53 79 73 74   variable \"Syst
ced0: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 5c 22  em.Data.SQLite\"
cee0: 20 69 73 20 6e 6f 74 20 22 20 5c 0d 0a 20 20 20   is not " \..   
cef0: 20 20 20 20 20 20 20 20 20 22 73 65 74 2c 20 73           "set, s
cf00: 6b 69 70 70 69 6e 67 20 63 68 65 63 6b 20 66 6f  kipping check fo
cf10: 72 20 72 65 6c 65 61 73 65 73 2e 2e 2e 5c 6e 22  r releases...\n"
cf20: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ]..      }....  
cf30: 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
cf40: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
cf50: 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51 4c  proc checkForSQL
cf60: 69 74 65 4c 69 62 72 61 72 79 20 7b 20 63 68 61  iteLibrary { cha
cf70: 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20  nnel } {..      
cf80: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
cf90: 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
cfa0: 72 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69  r SQLite core li
cfb0: 62 72 61 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20  brary... "....  
cfc0: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
cfd0: 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74  ..        object
cfe0: 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
cff0: 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
d000: 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
d010: 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69  Data.SQLite.SQLi
d020: 74 65 33 20 53 51 4c 69 74 65 56 65 72 73 69 6f  te3 SQLiteVersio
d030: 6e 0d 0a 20 20 20 20 20 20 7d 20 76 65 72 73 69  n..      } versi
d040: 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  on] == 0} then {
d050: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
d060: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
d070: 63 6b 20 69 66 20 74 68 65 20 72 65 74 75 72 6e  ck if the return
d080: 65 64 20 76 65 72 73 69 6f 6e 20 77 61 73 20 6e  ed version was n
d090: 75 6c 6c 2e 20 20 49 66 20 73 6f 2c 20 6d 61 6b  ull.  If so, mak
d0a0: 65 20 69 74 20 65 61 73 79 0d 0a 20 20 20 20 20  e it easy..     
d0b0: 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 73 70     #       to sp
d0c0: 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ot...        #..
d0d0: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
d0e0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72 73  ing length $vers
d0f0: 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ion] == 0} then 
d100: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
d110: 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20   version null.. 
d120: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
d130: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
d140: 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
d150: 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f 73 73  o query the Foss
d160: 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69  il source identi
d170: 66 69 65 72 20 66 6f 72 20 74 68 65 20 53 51 4c  fier for the SQL
d180: 69 74 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ite..        #  
d190: 20 20 20 20 20 63 6f 72 65 20 6c 69 62 72 61 72       core librar
d1a0: 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  y...        #.. 
d1b0: 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
d1c0: 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f  h {..          o
d1d0: 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
d1e0: 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
d1f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
d200: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
d210: 74 65 2e 53 51 4c 69 74 65 33 20 53 51 4c 69 74  te.SQLite3 SQLit
d220: 65 53 6f 75 72 63 65 49 64 0d 0a 20 20 20 20 20  eSourceId..     
d230: 20 20 20 7d 20 73 6f 75 72 63 65 49 64 5d 7d 20     } sourceId]} 
d240: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
d250: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
d260: 20 4e 4f 54 45 3a 20 57 65 20 66 61 69 6c 65 64   NOTE: We failed
d270: 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f   to query the Fo
d280: 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e  ssil source iden
d290: 74 69 66 69 65 72 2e 0d 0a 20 20 20 20 20 20 20  tifier...       
d2a0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
d2b0: 73 65 74 20 73 6f 75 72 63 65 49 64 20 75 6e 6b  set sourceId unk
d2c0: 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d  nown..        }.
d2d0: 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
d2e0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
d2f0: 65 63 6b 20 69 66 20 74 68 65 20 72 65 74 75 72  eck if the retur
d300: 6e 65 64 20 46 6f 73 73 69 6c 20 73 6f 75 72 63  ned Fossil sourc
d310: 65 20 69 64 65 6e 74 69 66 69 65 72 20 77 61 73  e identifier was
d320: 20 6e 75 6c 6c 2e 20 20 49 66 0d 0a 20 20 20 20   null.  If..    
d330: 20 20 20 20 23 20 20 20 20 20 20 20 73 6f 2c 20      #       so, 
d340: 6d 61 6b 65 20 69 74 20 65 61 73 79 20 74 6f 20  make it easy to 
d350: 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  spot...        #
d360: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73  ..        if {[s
d370: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 6f  tring length $so
d380: 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68  urceId] == 0} th
d390: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
d3a0: 73 65 74 20 73 6f 75 72 63 65 49 64 20 6e 75 6c  set sourceId nul
d3b0: 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  l..        }....
d3c0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
d3d0: 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20     # NOTE: Yes, 
d3e0: 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20  the SQLite core 
d3f0: 6c 69 62 72 61 72 79 20 61 70 70 65 61 72 73 20  library appears 
d400: 74 6f 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2e  to be available.
d410: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
d420: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
d430: 6e 74 20 53 51 4c 69 74 65 0d 0a 0d 0a 20 20 20  nt SQLite....   
d440: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
d450: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
d460: 22 79 65 73 20 28 22 20 24 76 65 72 73 69 6f 6e  "yes (" $version
d470: 20 22 20 22 20 24 73 6f 75 72 63 65 49 64 20 22   " " $sourceId "
d480: 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65  )\n"]..      } e
d490: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
d4a0: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
d4b0: 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  \n..      }..   
d4c0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
d4d0: 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 49 6e  checkForSQLiteIn
d4e0: 74 65 72 6f 70 20 7b 20 63 68 61 6e 6e 65 6c 20  terop { channel 
d4f0: 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73  } {..      tputs
d500: 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
d510: 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 51 4c  checking for SQL
d520: 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65  ite interop asse
d530: 6d 62 6c 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  mbly... "....   
d540: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
d550: 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20  .        object 
d560: 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
d570: 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
d580: 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
d590: 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74  ata.SQLite.SQLit
d5a0: 65 33 20 49 6e 74 65 72 6f 70 56 65 72 73 69 6f  e3 InteropVersio
d5b0: 6e 0d 0a 20 20 20 20 20 20 7d 20 76 65 72 73 69  n..      } versi
d5c0: 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  on] == 0} then {
d5d0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
d5e0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
d5f0: 63 6b 20 69 66 20 74 68 65 20 72 65 74 75 72 6e  ck if the return
d600: 65 64 20 76 65 72 73 69 6f 6e 20 77 61 73 20 6e  ed version was n
d610: 75 6c 6c 2e 20 20 49 66 20 73 6f 2c 20 6d 61 6b  ull.  If so, mak
d620: 65 20 69 74 20 65 61 73 79 0d 0a 20 20 20 20 20  e it easy..     
d630: 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 73 70     #       to sp
d640: 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ot...        #..
d650: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
d660: 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72 73  ing length $vers
d670: 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ion] == 0} then 
d680: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
d690: 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20   version null.. 
d6a0: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
d6b0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
d6c0: 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
d6d0: 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f 73 73  o query the Foss
d6e0: 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69  il source identi
d6f0: 66 69 65 72 20 66 6f 72 20 74 68 65 20 53 51 4c  fier for the SQL
d700: 69 74 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ite..        #  
d710: 20 20 20 20 20 63 6f 72 65 20 6c 69 62 72 61 72       core librar
d720: 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  y...        #.. 
d730: 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
d740: 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f  h {..          o
d750: 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
d760: 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
d770: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
d780: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
d790: 74 65 2e 53 51 4c 69 74 65 33 20 49 6e 74 65 72  te.SQLite3 Inter
d7a0: 6f 70 53 6f 75 72 63 65 49 64 0d 0a 20 20 20 20  opSourceId..    
d7b0: 20 20 20 20 7d 20 73 6f 75 72 63 65 49 64 5d 7d      } sourceId]}
d7c0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
d7d0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
d7e0: 23 20 4e 4f 54 45 3a 20 57 65 20 66 61 69 6c 65  # NOTE: We faile
d7f0: 64 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 46  d to query the F
d800: 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65  ossil source ide
d810: 6e 74 69 66 69 65 72 2e 0d 0a 20 20 20 20 20 20  ntifier...      
d820: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
d830: 20 73 65 74 20 73 6f 75 72 63 65 49 64 20 75 6e   set sourceId un
d840: 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20 7d  known..        }
d850: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
d860: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
d870: 68 65 63 6b 20 69 66 20 74 68 65 20 72 65 74 75  heck if the retu
d880: 72 6e 65 64 20 46 6f 73 73 69 6c 20 73 6f 75 72  rned Fossil sour
d890: 63 65 20 69 64 65 6e 74 69 66 69 65 72 20 77 61  ce identifier wa
d8a0: 73 20 6e 75 6c 6c 2e 20 20 49 66 0d 0a 20 20 20  s null.  If..   
d8b0: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6f 2c       #       so,
d8c0: 20 6d 61 6b 65 20 69 74 20 65 61 73 79 20 74 6f   make it easy to
d8d0: 20 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20   spot...        
d8e0: 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  #..        if {[
d8f0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73  string length $s
d900: 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74  ourceId] == 0} t
d910: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
d920: 20 73 65 74 20 73 6f 75 72 63 65 49 64 20 6e 75   set sourceId nu
d930: 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ll..        }...
d940: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
d950: 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 65 66 6f      # NOTE: Befo
d960: 72 65 20 61 63 74 75 61 6c 6c 79 20 61 64 64 69  re actually addi
d970: 6e 67 20 74 68 65 20 74 65 73 74 20 63 6f 6e 73  ng the test cons
d980: 74 72 61 69 6e 74 2c 20 6d 61 6b 65 20 73 75 72  traint, make sur
d990: 65 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23  e the..        #
d9a0: 20 20 20 20 20 20 20 76 65 72 73 69 6f 6e 20 69         version i
d9b0: 73 20 76 61 6c 69 64 20 28 69 2e 65 2e 20 6e 6f  s valid (i.e. no
d9c0: 74 20 6a 75 73 74 20 74 68 61 74 20 77 65 20 63  t just that we c
d9d0: 6f 75 6c 64 20 71 75 65 72 79 20 69 74 29 2e 0d  ould query it)..
d9e0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
d9f0: 20 20 20 20 69 66 20 7b 24 76 65 72 73 69 6f 6e      if {$version
da00: 20 6e 65 20 22 6e 75 6c 6c 22 7d 20 74 68 65 6e   ne "null"} then
da10: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
da20: 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
da30: 45 3a 20 59 65 73 2c 20 74 68 65 20 53 51 4c 69  E: Yes, the SQLi
da40: 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d  te interop assem
da50: 62 6c 79 20 61 70 70 65 61 72 73 20 74 6f 20 62  bly appears to b
da60: 65 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20  e available...  
da70: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
da80: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
da90: 6e 74 20 53 51 4c 69 74 65 49 6e 74 65 72 6f 70  nt SQLiteInterop
daa0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65  ....          se
dab0: 74 20 61 6e 73 77 65 72 20 79 65 73 0d 0a 20 20  t answer yes..  
dac0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
dad0: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 61 6e            set an
dae0: 73 77 65 72 20 6e 6f 0d 0a 20 20 20 20 20 20 20  swer no..       
daf0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70   }....        tp
db00: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
db10: 70 65 6e 64 41 72 67 73 20 24 61 6e 73 77 65 72  pendArgs $answer
db20: 20 22 20 28 22 20 24 76 65 72 73 69 6f 6e 20 22   " (" $version "
db30: 20 22 20 24 73 6f 75 72 63 65 49 64 20 22 29 5c   " $sourceId ")\
db40: 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  n"]..      } els
db50: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e {..        tpu
db60: 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e  ts $channel no\n
db70: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
db80: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68  .....    proc ch
db90: 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 65 66 69  eckForSQLiteDefi
dba0: 6e 65 43 6f 6e 73 74 61 6e 74 20 7b 20 63 68 61  neConstant { cha
dbb0: 6e 6e 65 6c 20 6e 61 6d 65 20 7d 20 7b 0d 0a 20  nnel name } {.. 
dbc0: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
dbd0: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
dbe0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 22 2d 2d  \..          "--
dbf0: 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
dc00: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
dc10: 74 65 20 64 65 66 69 6e 65 20 63 6f 6e 73 74 61  te define consta
dc20: 6e 74 20 5c 22 22 20 24 6e 61 6d 65 20 5c 0d 0a  nt \"" $name \..
dc30: 20 20 20 20 20 20 20 20 20 20 22 5c 22 2e 2e 2e            "\"...
dc40: 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20   "]....      if 
dc50: 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
dc60: 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
dc70: 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
dc80: 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
dc90: 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
dca0: 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 44 65 66  Lite.SQLite3 Def
dcb0: 69 6e 65 43 6f 6e 73 74 61 6e 74 73 0d 0a 20 20  ineConstants..  
dcc0: 20 20 20 20 7d 20 64 65 66 69 6e 65 43 6f 6e 73      } defineCons
dcd0: 74 61 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68 65  tants] == 0} the
dce0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
dcf0: 7b 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74  {[lsearch -exact
dd00: 20 2d 6e 6f 63 61 73 65 20 24 64 65 66 69 6e 65   -nocase $define
dd10: 43 6f 6e 73 74 61 6e 74 73 20 24 6e 61 6d 65 5d  Constants $name]
dd20: 20 21 3d 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a   != -1} then {..
dd30: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
dd40: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59         # NOTE: Y
dd50: 65 73 2c 20 74 68 69 73 20 64 65 66 69 6e 65 20  es, this define 
dd60: 63 6f 6e 73 74 61 6e 74 20 77 61 73 20 65 6e 61  constant was ena
dd70: 62 6c 65 64 20 77 68 65 6e 20 74 68 65 20 6d 61  bled when the ma
dd80: 6e 61 67 65 64 0d 0a 20 20 20 20 20 20 20 20 20  naged..         
dd90: 20 23 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c   #       assembl
dda0: 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 2e 0d  y was compiled..
ddb0: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
ddc0: 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
ddd0: 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
dde0: 73 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74  s defineConstant
ddf0: 2e 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  .System.Data.SQL
de00: 69 74 65 2e 20 24 6e 61 6d 65 5d 0d 0a 0d 0a 20  ite. $name].... 
de10: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
de20: 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20  channel yes\n.. 
de30: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
de40: 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
de50: 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a   $channel no\n..
de60: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
de70: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
de80: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
de90: 6c 20 65 72 72 6f 72 5c 6e 0d 0a 20 20 20 20 20  l error\n..     
dea0: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
deb0: 20 20 70 72 6f 63 20 67 65 74 44 61 74 65 54 69    proc getDateTi
dec0: 6d 65 46 6f 72 6d 61 74 20 7b 7d 20 7b 0d 0a 20  meFormat {} {.. 
ded0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
dee0: 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65  NOTE: This proce
def0: 64 75 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75  dure simply retu
df00: 72 6e 73 20 74 68 65 20 22 64 65 66 61 75 6c 74  rns the "default
df10: 22 20 44 61 74 65 54 69 6d 65 20 66 6f 72 6d 61  " DateTime forma
df20: 74 20 75 73 65 64 0d 0a 20 20 20 20 20 20 23 20  t used..      # 
df30: 20 20 20 20 20 20 62 79 20 74 68 65 20 74 65 73        by the tes
df40: 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20  t suite...      
df50: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
df60: 66 6f 20 65 78 69 73 74 73 20 3a 3a 64 61 74 65  fo exists ::date
df70: 74 69 6d 65 5f 66 6f 72 6d 61 74 5d 20 26 26 20  time_format] && 
df80: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
df90: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 64  ring length $::d
dfa0: 61 74 65 74 69 6d 65 5f 66 6f 72 6d 61 74 5d 20  atetime_format] 
dfb0: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
dfc0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
dfd0: 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74  # NOTE: Return t
dfe0: 68 65 20 6d 61 6e 75 61 6c 6c 79 20 6f 76 65 72  he manually over
dff0: 72 69 64 64 65 6e 20 76 61 6c 75 65 20 66 6f 72  ridden value for
e000: 20 74 68 65 20 44 61 74 65 54 69 6d 65 20 66 6f   the DateTime fo
e010: 72 6d 61 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  rmat...        #
e020: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
e030: 20 24 3a 3a 64 61 74 65 74 69 6d 65 5f 66 6f 72   $::datetime_for
e040: 6d 61 74 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  mat..      } els
e050: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e {..        #..
e060: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
e070: 52 65 74 75 72 6e 20 61 6e 20 49 53 4f 38 36 30  Return an ISO860
e080: 31 20 44 61 74 65 54 69 6d 65 20 66 6f 72 6d 61  1 DateTime forma
e090: 74 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  t compatible wit
e0a0: 68 20 53 51 4c 69 74 65 2c 0d 0a 20 20 20 20 20  h SQLite,..     
e0b0: 20 20 20 23 20 20 20 20 20 20 20 53 79 73 74 65     #       Syste
e0c0: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2c 20 61  m.Data.SQLite, a
e0d0: 6e 64 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  nd suitable for 
e0e0: 72 6f 75 6e 64 2d 74 72 69 70 70 69 6e 67 20 77  round-tripping w
e0f0: 69 74 68 20 74 68 65 0d 0a 20 20 20 20 20 20 20  ith the..       
e100: 20 23 20 20 20 20 20 20 20 44 61 74 65 54 69 6d   #       DateTim
e110: 65 20 63 6c 61 73 73 20 6f 66 20 74 68 65 20 66  e class of the f
e120: 72 61 6d 65 77 6f 72 6b 2e 20 20 49 66 20 74 68  ramework.  If th
e130: 69 73 20 76 61 6c 75 65 20 69 73 20 63 68 61 6e  is value is chan
e140: 67 65 64 2c 0d 0a 20 20 20 20 20 20 20 20 23 20  ged,..        # 
e150: 20 20 20 20 20 20 76 61 72 69 6f 75 73 20 74 65        various te
e160: 73 74 73 20 6d 61 79 20 66 61 69 6c 2e 0d 0a 20  sts may fail... 
e170: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
e180: 20 20 72 65 74 75 72 6e 20 22 79 79 79 79 2d 4d    return "yyyy-M
e190: 4d 2d 64 64 20 48 48 3a 6d 6d 3a 73 73 2e 46 46  M-dd HH:mm:ss.FF
e1a0: 46 46 46 46 46 4b 22 0d 0a 20 20 20 20 20 20 7d  FFFFFK"..      }
e1b0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
e1c0: 70 72 6f 63 20 65 6e 75 6d 65 72 61 62 6c 65 54  proc enumerableT
e1d0: 6f 4c 69 73 74 20 7b 20 65 6e 75 6d 65 72 61 62  oList { enumerab
e1e0: 6c 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  le } {..      se
e1f0: 74 20 72 65 73 75 6c 74 20 5b 6c 69 73 74 5d 0d  t result [list].
e200: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  ...      if {[st
e210: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 65 6e 75  ring length $enu
e220: 6d 65 72 61 62 6c 65 5d 20 3d 3d 20 30 20 7c 7c  merable] == 0 ||
e230: 20 24 65 6e 75 6d 65 72 61 62 6c 65 20 65 71 20   $enumerable eq 
e240: 22 6e 75 6c 6c 22 7d 20 74 68 65 6e 20 7b 0d 0a  "null"} then {..
e250: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
e260: 72 65 73 75 6c 74 0d 0a 20 20 20 20 20 20 7d 0d  result..      }.
e270: 0a 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63 74 20  ...      object 
e280: 66 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20 69  foreach -alias i
e290: 74 65 6d 20 24 65 6e 75 6d 65 72 61 62 6c 65 20  tem $enumerable 
e2a0: 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  {..        if {[
e2b0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 69  string length $i
e2c0: 74 65 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  tem] > 0} then {
e2d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 6c 61 70 70  ..          lapp
e2e0: 65 6e 64 20 72 65 73 75 6c 74 20 5b 24 69 74 65  end result [$ite
e2f0: 6d 20 54 6f 53 74 72 69 6e 67 5d 0d 0a 20 20 20  m ToString]..   
e300: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
e310: 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
e320: 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a  $result..    }..
e330: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 61 74 63  ...    proc catc
e340: 68 41 6e 64 52 65 74 75 72 6e 20 7b 20 73 63 72  hAndReturn { scr
e350: 69 70 74 20 7b 73 74 61 63 6b 54 72 61 63 65 20  ipt {stackTrace 
e360: 66 61 6c 73 65 7d 20 7b 73 74 72 69 63 74 20 74  false} {strict t
e370: 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  rue} } {..      
e380: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
e390: 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 73 63   Evaluate the sc
e3a0: 72 69 70 74 20 70 72 6f 76 69 64 65 64 20 62 79  ript provided by
e3b0: 20 6f 75 72 20 63 61 6c 6c 65 72 20 69 6e 20 74   our caller in t
e3c0: 68 65 69 72 20 63 6f 6e 74 65 78 74 2c 0d 0a 20  heir context,.. 
e3d0: 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61 70       #       cap
e3e0: 74 75 72 69 6e 67 20 62 6f 74 68 20 74 68 65 20  turing both the 
e3f0: 72 65 73 75 6c 74 20 61 6e 64 20 74 68 65 20 72  result and the r
e400: 65 74 75 72 6e 20 63 6f 64 65 2e 0d 0a 20 20 20  eturn code...   
e410: 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
e420: 63 6f 64 65 20 5b 63 61 74 63 68 20 7b 75 70 6c  code [catch {upl
e430: 65 76 65 6c 20 31 20 24 73 63 72 69 70 74 7d 20  evel 1 $script} 
e440: 72 65 73 75 6c 74 5d 0d 0a 0d 0a 20 20 20 20 20  result]....     
e450: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
e460: 3a 20 44 69 64 20 74 68 65 20 73 63 72 69 70 74  : Did the script
e470: 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72   provided by our
e480: 20 63 61 6c 6c 65 72 20 4e 4f 54 20 72 61 69 73   caller NOT rais
e490: 65 20 61 6e 20 65 72 72 6f 72 3f 0d 0a 20 20 20  e an error?..   
e4a0: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
e4b0: 24 73 74 72 69 63 74 20 26 26 20 24 63 6f 64 65  $strict && $code
e4c0: 20 3d 3d 20 30 20 7c 7c 20 21 24 73 74 72 69 63   == 0 || !$stric
e4d0: 74 20 26 26 20 24 63 6f 64 65 20 21 3d 20 31 7d  t && $code != 1}
e4e0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
e4f0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
e500: 54 45 3a 20 53 75 63 63 65 73 73 2e 20 20 52 65  TE: Success.  Re
e510: 74 75 72 6e 20 61 20 6c 69 73 74 20 77 69 74 68  turn a list with
e520: 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
e530: 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 2e   and the result.
e540: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
e550: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73       return [lis
e560: 74 20 24 63 6f 64 65 20 24 72 65 73 75 6c 74 5d  t $code $result]
e570: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66  ..      } elseif
e580: 20 7b 24 73 74 61 63 6b 54 72 61 63 65 7d 20 74   {$stackTrace} t
e590: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
e5a0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
e5b0: 3a 20 46 61 69 6c 75 72 65 2e 20 20 4f 75 72 20  : Failure.  Our 
e5c0: 63 61 6c 6c 65 72 20 77 61 6e 74 73 20 61 20 66  caller wants a f
e5d0: 75 6c 6c 20 73 74 61 63 6b 20 74 72 61 63 65 20  ull stack trace 
e5e0: 28 69 66 20 61 70 70 6c 69 63 61 62 6c 65 29 2c  (if applicable),
e5f0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
e600: 20 20 72 65 74 75 72 6e 20 61 20 6c 69 73 74 20    return a list 
e610: 77 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 20  with the return 
e620: 63 6f 64 65 20 61 6e 64 20 74 68 65 20 72 65 73  code and the res
e630: 75 6c 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20  ult verbatim... 
e640: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
e650: 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 24    return [list $
e660: 63 6f 64 65 20 24 72 65 73 75 6c 74 5d 0d 0a 20  code $result].. 
e670: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
e680: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
e690: 20 20 23 20 4e 4f 54 45 3a 20 46 61 69 6c 75 72    # NOTE: Failur
e6a0: 65 2e 20 20 4f 75 72 20 63 61 6c 6c 65 72 20 64  e.  Our caller d
e6b0: 6f 65 73 20 6e 6f 74 20 77 61 6e 74 20 61 20 66  oes not want a f
e6c0: 75 6c 6c 20 73 74 61 63 6b 20 74 72 61 63 65 20  ull stack trace 
e6d0: 28 69 66 0d 0a 20 20 20 20 20 20 20 20 23 20 20  (if..        #  
e6e0: 20 20 20 20 20 61 70 70 6c 69 63 61 62 6c 65 29       applicable)
e6f0: 2c 20 72 65 74 75 72 6e 20 61 20 6c 69 73 74 20  , return a list 
e700: 77 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 20  with the return 
e710: 63 6f 64 65 2c 20 74 68 65 20 65 72 72 6f 72 0d  code, the error.
e720: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
e730: 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69 6e   code for the in
e740: 74 65 72 70 72 65 74 65 72 2c 20 61 6e 64 20 74  terpreter, and t
e750: 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
e760: 20 75 70 20 74 6f 20 74 68 65 0d 0a 20 20 20 20   up to the..    
e770: 20 20 20 20 23 20 20 20 20 20 20 20 70 6f 69 6e      #       poin
e780: 74 20 77 68 65 72 65 20 74 68 65 20 73 74 61 63  t where the stac
e790: 6b 20 74 72 61 63 65 20 73 68 6f 75 6c 64 20 73  k trace should s
e7a0: 74 61 72 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  tart...        #
e7b0: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 69 6e  ..        set in
e7c0: 64 65 78 20 5b 73 74 72 69 6e 67 20 66 69 72 73  dex [string firs
e7d0: 74 20 22 20 20 20 61 74 20 22 20 24 72 65 73 75  t "   at " $resu
e7e0: 6c 74 5d 3b 20 23 20 48 41 43 4b 3a 20 52 65 6c  lt]; # HACK: Rel
e7f0: 69 61 62 6c 65 3f 0d 0a 0d 0a 20 20 20 20 20 20  iable?....      
e800: 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 24    return [list $
e810: 63 6f 64 65 20 24 3a 3a 65 72 72 6f 72 43 6f 64  code $::errorCod
e820: 65 20 5b 65 78 70 72 20 7b 24 69 6e 64 65 78 20  e [expr {$index 
e830: 21 3d 20 2d 31 20 3f 20 5c 0d 0a 20 20 20 20 20  != -1 ? \..     
e840: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 74         [string t
e850: 72 69 6d 20 5b 73 74 72 69 6e 67 20 72 61 6e 67  rim [string rang
e860: 65 20 24 72 65 73 75 6c 74 20 30 20 24 69 6e 64  e $result 0 $ind
e870: 65 78 5d 5d 20 3a 20 24 72 65 73 75 6c 74 7d 5d  ex]] : $result}]
e880: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
e890: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
e8a0: 6f 6d 70 69 6c 65 43 53 68 61 72 70 57 69 74 68  ompileCSharpWith
e8b0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
e8c0: 74 65 78 74 20 6d 65 6d 6f 72 79 20 73 79 6d 62  text memory symb
e8d0: 6f 6c 73 20 73 74 72 69 63 74 20 72 65 73 75 6c  ols strict resul
e8e0: 74 73 56 61 72 4e 61 6d 65 20 65 72 72 6f 72 73  tsVarName errors
e8f0: 56 61 72 4e 61 6d 65 20 66 69 6c 65 4e 61 6d 65  VarName fileName
e900: 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  s..            a
e910: 72 67 73 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  rgs } {..      #
e920: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
e930: 53 69 6e 63 65 20 77 65 20 61 72 65 20 67 6f 69  Since we are goi
e940: 6e 67 20 74 6f 20 75 73 65 20 74 68 69 73 20 6d  ng to use this m
e950: 65 74 68 6f 64 20 6e 61 6d 65 20 61 20 6c 6f 74  ethod name a lot
e960: 2c 20 61 73 73 69 67 6e 20 69 74 20 74 6f 20 61  , assign it to a
e970: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
e980: 76 61 72 69 61 62 6c 65 20 66 69 72 73 74 2e 0d  variable first..
e990: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
e9a0: 73 65 74 20 61 64 64 20 52 65 66 65 72 65 6e 63  set add Referenc
e9b0: 65 64 41 73 73 65 6d 62 6c 69 65 73 2e 41 64 64  edAssemblies.Add
e9c0: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
e9d0: 20 20 20 23 20 4e 4f 54 45 3a 20 43 72 65 61 74     # NOTE: Creat
e9e0: 65 20 74 68 65 20 62 61 73 65 20 63 6f 6d 6d 61  e the base comma
e9f0: 6e 64 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61  nd to evaluate a
ea00: 6e 64 20 61 64 64 20 74 68 65 20 70 72 6f 70 65  nd add the prope
ea10: 72 74 79 20 73 65 74 74 69 6e 67 73 0d 0a 20 20  rty settings..  
ea20: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 61 74      #       that
ea30: 20 61 72 65 20 61 6c 6d 6f 73 74 20 61 6c 77 61   are almost alwa
ea40: 79 73 20 6e 65 65 64 65 64 20 62 79 20 6f 75 72  ys needed by our
ea50: 20 75 6e 69 74 20 74 65 73 74 73 20 28 69 2e 65   unit tests (i.e
ea60: 2e 20 74 68 65 20 53 79 73 74 65 6d 0d 0a 20 20  . the System..  
ea70: 20 20 20 20 23 20 20 20 20 20 20 20 61 6e 64 20      #       and 
ea80: 53 79 73 74 65 6d 2e 44 61 74 61 20 61 73 73 65  System.Data asse
ea90: 6d 62 6c 79 20 72 65 66 65 72 65 6e 63 65 73 29  mbly references)
eaa0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
eab0: 20 20 73 65 74 20 63 6f 6d 6d 61 6e 64 20 5b 6c    set command [l
eac0: 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ist \..         
ead0: 20 63 6f 6d 70 69 6c 65 43 53 68 61 72 70 20 24   compileCSharp $
eae0: 74 65 78 74 20 24 6d 65 6d 6f 72 79 20 24 73 79  text $memory $sy
eaf0: 6d 62 6f 6c 73 20 24 73 74 72 69 63 74 20 72 65  mbols $strict re
eb00: 73 75 6c 74 73 20 65 72 72 6f 72 73 20 5c 0d 0a  sults errors \..
eb10: 20 20 20 20 20 20 20 20 20 20 24 61 64 64 20 53            $add S
eb20: 79 73 74 65 6d 2e 64 6c 6c 20 24 61 64 64 20 53  ystem.dll $add S
eb30: 79 73 74 65 6d 2e 44 61 74 61 2e 64 6c 6c 20 24  ystem.Data.dll $
eb40: 61 64 64 20 53 79 73 74 65 6d 2e 54 72 61 6e 73  add System.Trans
eb50: 61 63 74 69 6f 6e 73 2e 64 6c 6c 20 5c 0d 0a 20  actions.dll \.. 
eb60: 20 20 20 20 20 20 20 20 20 24 61 64 64 20 53 79           $add Sy
eb70: 73 74 65 6d 2e 58 6d 6c 2e 64 6c 6c 5d 0d 0a 0d  stem.Xml.dll]...
eb80: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
eb90: 23 20 4e 4f 54 45 3a 20 41 64 64 20 61 6c 6c 20  # NOTE: Add all 
eba0: 74 68 65 20 70 72 6f 76 69 64 65 64 20 66 69 6c  the provided fil
ebb0: 65 20 6e 61 6d 65 73 20 61 73 20 61 73 73 65 6d  e names as assem
ebc0: 62 6c 79 20 72 65 66 65 72 65 6e 63 65 73 2e 0d  bly references..
ebd0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
ebe0: 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
ebf0: 20 24 66 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20   $fileNames {.. 
ec00: 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 63         lappend c
ec10: 6f 6d 6d 61 6e 64 20 24 61 64 64 20 5b 67 65 74  ommand $add [get
ec20: 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24  BinaryFileName $
ec30: 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20  fileName]..     
ec40: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
ec50: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64       # NOTE: Add
ec60: 20 74 68 65 20 65 78 74 72 61 20 61 72 67 75 6d   the extra argum
ec70: 65 6e 74 73 2c 20 69 66 20 61 6e 79 2c 20 74 6f  ents, if any, to
ec80: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20   the command to 
ec90: 65 76 61 6c 75 61 74 65 2e 0d 0a 20 20 20 20 20  evaluate...     
eca0: 20 23 0d 0a 20 20 20 20 20 20 65 76 61 6c 20 6c   #..      eval l
ecb0: 61 70 70 65 6e 64 20 63 6f 6d 6d 61 6e 64 20 24  append command $
ecc0: 61 72 67 73 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  args....      #.
ecd0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41  .      # NOTE: A
ece0: 6c 69 61 73 20 74 68 65 20 63 6f 6d 70 69 6c 65  lias the compile
ecf0: 72 20 6c 6f 63 61 6c 20 72 65 73 75 6c 74 73 20  r local results 
ed00: 61 6e 64 20 65 72 72 6f 72 73 20 76 61 72 69 61  and errors varia
ed10: 62 6c 65 73 20 74 6f 20 74 68 65 0d 0a 20 20 20  bles to the..   
ed20: 20 20 20 23 20 20 20 20 20 20 20 76 61 72 69 61     #       varia
ed30: 62 6c 65 20 6e 61 6d 65 73 20 70 72 6f 76 69 64  ble names provid
ed40: 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72  ed by our caller
ed50: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
ed60: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
ed70: 6e 67 74 68 20 24 72 65 73 75 6c 74 73 56 61 72  ngth $resultsVar
ed80: 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  Name] > 0} then 
ed90: 7b 0d 0a 20 20 20 20 20 20 20 20 75 70 76 61 72  {..        upvar
eda0: 20 31 20 24 72 65 73 75 6c 74 73 56 61 72 4e 61   1 $resultsVarNa
edb0: 6d 65 20 72 65 73 75 6c 74 73 0d 0a 20 20 20 20  me results..    
edc0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
edd0: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
ede0: 24 65 72 72 6f 72 73 56 61 72 4e 61 6d 65 5d 20  $errorsVarName] 
edf0: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
ee00: 20 20 20 20 20 75 70 76 61 72 20 31 20 24 65 72       upvar 1 $er
ee10: 72 6f 72 73 56 61 72 4e 61 6d 65 20 65 72 72 6f  rorsVarName erro
ee20: 72 73 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  rs..      }.... 
ee30: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
ee40: 4e 4f 54 45 3a 20 45 76 61 6c 75 61 74 65 20 74  NOTE: Evaluate t
ee50: 68 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 5b  he constructed [
ee60: 63 6f 6d 70 69 6c 65 43 53 68 61 72 70 5d 20 63  compileCSharp] c
ee70: 6f 6d 6d 61 6e 64 20 61 6e 64 20 72 65 74 75 72  ommand and retur
ee80: 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  n the..      #  
ee90: 20 20 20 20 20 72 65 73 75 6c 74 2e 0d 0a 20 20       result...  
eea0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 65 76 61      #..      eva
eeb0: 6c 20 24 63 6f 6d 6d 61 6e 64 0d 0a 20 20 20 20  l $command..    
eec0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69  }.....    proc i
eed0: 73 4d 65 6d 6f 72 79 44 62 20 7b 20 66 69 6c 65  sMemoryDb { file
eee0: 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20  Name } {..      
eef0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
ef00: 20 49 73 20 74 68 65 20 73 70 65 63 69 66 69 65   Is the specifie
ef10: 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  d database file 
ef20: 6e 61 6d 65 20 72 65 61 6c 6c 79 20 61 6e 20 69  name really an i
ef30: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
ef40: 65 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e?..      #..   
ef50: 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20     return [expr 
ef60: 7b 24 66 69 6c 65 4e 61 6d 65 20 65 71 20 22 3a  {$fileName eq ":
ef70: 6d 65 6d 6f 72 79 3a 22 20 7c 7c 20 5c 0d 0a 20  memory:" || \.. 
ef80: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
ef90: 20 72 61 6e 67 65 20 24 66 69 6c 65 4e 61 6d 65   range $fileName
efa0: 20 30 20 31 32 5d 20 65 71 20 22 66 69 6c 65 3a   0 12] eq "file:
efb0: 3a 6d 65 6d 6f 72 79 3a 22 7d 5d 0d 0a 20 20 20  :memory:"}]..   
efc0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
efd0: 69 73 54 61 62 6c 65 49 6e 44 62 20 7b 20 6e 61  isTableInDb { na
efe0: 6d 65 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20  me {varName db} 
eff0: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
f000: 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65      # NOTE: Refe
f010: 72 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69  r to the specifi
f020: 65 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67  ed variable (e.g
f030: 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65 20 63  . "db") in the c
f040: 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20  ontext of our.. 
f050: 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6c       #       cal
f060: 6c 65 72 2e 20 20 49 74 20 63 6f 6e 74 61 69 6e  ler.  It contain
f070: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  s the database c
f080: 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65  onnection handle
f090: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 0d 0a 20   that will be.. 
f0a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73 65       #       use
f0b0: 64 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  d to execute the
f0c0: 20 71 75 65 72 79 20 75 73 65 64 20 74 6f 20 64   query used to d
f0d0: 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
f0e0: 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73 0d 0a  named table is..
f0f0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 72        #       pr
f100: 65 73 65 6e 74 20 69 6e 20 74 68 61 74 20 64 61  esent in that da
f110: 74 61 62 61 73 65 2e 0d 0a 20 20 20 20 20 20 23  tabase...      #
f120: 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20  ..      upvar 1 
f130: 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20  $varName db.... 
f140: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
f150: 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 71  NOTE: Use the sq
f160: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
f170: 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  e to determine i
f180: 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c  f the named tabl
f190: 65 20 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20  e is..      #   
f1a0: 20 20 20 20 70 72 65 73 65 6e 74 20 69 6e 20 74      present in t
f1b0: 68 65 20 64 61 74 61 62 61 73 65 2e 0d 0a 20 20  he database...  
f1c0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
f1d0: 20 73 71 6c 20 7b 0d 0a 20 20 20 20 20 20 20 20   sql {..        
f1e0: 53 45 4c 45 43 54 20 43 4f 55 4e 54 28 2a 29 20  SELECT COUNT(*) 
f1f0: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
f200: 65 72 20 57 48 45 52 45 20 74 79 70 65 20 3d 20  er WHERE type = 
f210: 27 74 61 62 6c 65 27 20 41 4e 44 20 6e 61 6d 65  'table' AND name
f220: 20 3d 20 3f 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a   = ?;..      }..
f230: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
f240: 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20   # NOTE: Return 
f250: 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
f260: 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20 70  named table is p
f270: 72 65 73 65 6e 74 2e 0d 0a 20 20 20 20 20 20 23  resent...      #
f280: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b  ..      return [
f290: 65 78 70 72 20 7b 0d 0a 20 20 20 20 20 20 20 20  expr {..        
f2a0: 5b 73 71 6c 20 65 78 65 63 75 74 65 20 2d 65 78  [sql execute -ex
f2b0: 65 63 75 74 65 20 73 63 61 6c 61 72 20 24 64 62  ecute scalar $db
f2c0: 20 24 73 71 6c 20 5b 6c 69 73 74 20 70 61 72 61   $sql [list para
f2d0: 6d 31 20 53 74 72 69 6e 67 20 24 6e 61 6d 65 5d  m1 String $name]
f2e0: 5d 20 3e 20 30 0d 0a 20 20 20 20 20 20 7d 5d 0d  ] > 0..      }].
f2f0: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
f300: 72 6f 63 20 74 72 69 6d 53 71 6c 20 7b 20 73 71  roc trimSql { sq
f310: 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 72 65 74  l } {..      ret
f320: 75 72 6e 20 5b 72 65 67 73 75 62 20 2d 61 6c 6c  urn [regsub -all
f330: 20 2d 2d 20 7b 5c 73 2b 7d 20 5b 73 74 72 69 6e   -- {\s+} [strin
f340: 67 20 74 72 69 6d 20 24 73 71 6c 5d 20 22 20 22  g trim $sql] " "
f350: 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  ]..    }.....   
f360: 20 70 72 6f 63 20 65 78 65 63 75 74 65 53 71 6c   proc executeSql
f370: 20 7b 20 73 71 6c 20 7b 65 78 65 63 75 74 65 20   { sql {execute 
f380: 6e 6f 6e 65 7d 20 7b 66 6f 72 6d 61 74 20 6e 6f  none} {format no
f390: 6e 65 7d 20 7b 66 69 6c 65 4e 61 6d 65 20 22 22  ne} {fileName ""
f3a0: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20  } } {..      if 
f3b0: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
f3c0: 24 66 69 6c 65 4e 61 6d 65 5d 20 3d 3d 20 30 7d  $fileName] == 0}
f3d0: 20 74 68 65 6e 20 7b 73 65 74 20 66 69 6c 65 4e   then {set fileN
f3e0: 61 6d 65 20 3a 6d 65 6d 6f 72 79 3a 7d 0d 0a 20  ame :memory:}.. 
f3f0: 20 20 20 20 20 73 65 74 75 70 44 62 20 24 66 69       setupDb $fi
f400: 6c 65 4e 61 6d 65 20 22 22 20 22 22 20 22 22 20  leName "" "" "" 
f410: 22 22 20 22 22 20 66 61 6c 73 65 20 66 61 6c 73  "" "" false fals
f420: 65 20 66 61 6c 73 65 20 66 61 6c 73 65 20 64 62  e false false db
f430: 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20 74   true....      t
f440: 72 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  ry {..        re
f450: 74 75 72 6e 20 5b 75 70 6c 65 76 65 6c 20 31 20  turn [uplevel 1 
f460: 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20  [list \..       
f470: 20 20 20 20 20 73 71 6c 20 65 78 65 63 75 74 65       sql execute
f480: 20 2d 65 78 65 63 75 74 65 20 24 65 78 65 63 75   -execute $execu
f490: 74 65 20 2d 66 6f 72 6d 61 74 20 24 66 6f 72 6d  te -format $form
f4a0: 61 74 20 24 64 62 20 24 73 71 6c 5d 5d 0d 0a 20  at $db $sql]].. 
f4b0: 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b       } finally {
f4c0: 0d 0a 20 20 20 20 20 20 20 20 63 6c 65 61 6e 75  ..        cleanu
f4d0: 70 44 62 20 24 66 69 6c 65 4e 61 6d 65 20 64 62  pDb $fileName db
f4e0: 20 66 61 6c 73 65 20 66 61 6c 73 65 20 66 61 6c   false false fal
f4f0: 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  se..      }..   
f500: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
f510: 68 61 73 4e 6f 46 6c 61 67 73 20 7b 20 76 61 72  hasNoFlags { var
f520: 4e 61 6d 65 20 6e 6f 6e 65 20 7d 20 7b 0d 0a 20  Name none } {.. 
f530: 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61       upvar 1 $va
f540: 72 4e 61 6d 65 20 66 6c 61 67 73 0d 0a 0d 0a 20  rName flags.... 
f550: 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
f560: 65 78 69 73 74 73 20 66 6c 61 67 73 5d 7d 20 74  exists flags]} t
f570: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
f580: 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20  eturn true..    
f590: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
f5a0: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
f5b0: 24 66 6c 61 67 73 5d 20 3d 3d 20 30 7d 20 74 68  $flags] == 0} th
f5c0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
f5d0: 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20  turn true..     
f5e0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   }....      if {
f5f0: 24 6e 6f 6e 65 20 26 26 20 24 66 6c 61 67 73 20  $none && $flags 
f600: 65 71 20 22 4e 6f 6e 65 22 7d 20 74 68 65 6e 20  eq "None"} then 
f610: 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
f620: 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d  n true..      }.
f630: 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
f640: 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  false..    }....
f650: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 43 6f 6e  .    proc getCon
f660: 6e 65 63 74 69 6f 6e 46 6c 61 67 73 20 7b 20 66  nectionFlags { f
f670: 69 6c 65 4e 61 6d 65 20 66 6c 61 67 73 20 7b 71  ileName flags {q
f680: 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  uiet false} } {.
f690: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
f6a0: 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f  # NOTE: Figure o
f6b0: 75 74 20 77 68 69 63 68 20 64 61 74 61 62 61 73  ut which databas
f6c0: 65 20 66 69 6c 65 20 6e 61 6d 65 20 6f 72 20 63  e file name or c
f6d0: 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67  onnection string
f6e0: 20 74 68 65 73 65 0d 0a 20 20 20 20 20 20 23 20   these..      # 
f6f0: 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e        connection
f700: 20 66 6c 61 67 73 20 77 69 6c 6c 20 61 63 74 75   flags will actu
f710: 61 6c 6c 79 20 61 70 70 6c 79 20 74 6f 2e 20 20  ally apply to.  
f720: 54 68 69 73 20 69 73 20 6e 6f 74 20 6e 65 63 65  This is not nece
f730: 73 73 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20  ssary..      #  
f740: 20 20 20 20 20 69 6e 20 71 75 69 65 74 20 6d 6f       in quiet mo
f750: 64 65 20 62 65 63 61 75 73 65 20 74 68 69 73 20  de because this 
f760: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6f  information is o
f770: 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 67  nly used for log
f780: 67 69 6e 67 0d 0a 20 20 20 20 20 20 23 20 20 20  ging..      #   
f790: 20 20 20 20 61 6e 64 20 72 65 70 6f 72 74 69 6e      and reportin
f7a0: 67 20 70 75 72 70 6f 73 65 73 2e 0d 0a 20 20 20  g purposes...   
f7b0: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
f7c0: 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
f7d0: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74  .        if {[st
f7e0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 69 6c  ring length $fil
f7f0: 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e  eName] > 0} then
f800: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
f810: 74 20 64 61 74 61 62 61 73 65 20 5b 61 70 70 65  t database [appe
f820: 6e 64 41 72 67 73 20 22 66 69 6c 65 20 6e 61 6d  ndArgs "file nam
f830: 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20  e \"" $fileName 
f840: 5c 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65  \"]..        } e
f850: 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69  lseif {[info exi
f860: 73 74 73 20 3a 3a 64 61 74 61 53 6f 75 72 63 65  sts ::dataSource
f870: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
f880: 20 20 20 20 21 5b 61 72 72 61 79 20 65 78 69 73      ![array exis
f890: 74 73 20 3a 3a 64 61 74 61 53 6f 75 72 63 65 5d  ts ::dataSource]
f8a0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
f8b0: 20 20 20 20 73 65 74 20 64 61 74 61 62 61 73 65      set database
f8c0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 64 61   [appendArgs "da
f8d0: 74 61 20 73 6f 75 72 63 65 20 5c 22 22 20 24 3a  ta source \"" $:
f8e0: 3a 64 61 74 61 53 6f 75 72 63 65 20 5c 22 5d 0d  :dataSource \"].
f8f0: 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
f900: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
f910: 20 64 61 74 61 62 61 73 65 20 3c 75 6e 6b 6e 6f   database <unkno
f920: 77 6e 3e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  wn>..        }..
f930: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
f940: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
f950: 3a 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f 67 29  : Show (and log)
f960: 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65   the local conne
f970: 63 74 69 6f 6e 20 66 6c 61 67 73 20 61 6e 64 20  ction flags and 
f980: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0d 0a  the associated..
f990: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 61        #       da
f9a0: 74 61 20 73 6f 75 72 63 65 20 6f 72 20 66 69 6c  ta source or fil
f9b0: 65 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20 23  e name...      #
f9c0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71 75  ..      if {!$qu
f9d0: 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
f9e0: 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
f9f0: 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74  exists ::no(emit
fa00: 4c 6f 63 61 6c 46 6c 61 67 73 29 5d 20 26 26 20  LocalFlags)] && 
fa10: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  \..            (
fa20: 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
fa30: 6e 6f 28 65 6d 69 74 4c 6f 63 61 6c 46 6c 61 67  no(emitLocalFlag
fa40: 73 49 66 4e 6f 6e 65 29 5d 20 7c 7c 20 5c 0d 0a  sIfNone)] || \..
fa50: 20 20 20 20 20 20 20 20 20 20 20 20 20 21 5b 68               ![h
fa60: 61 73 4e 6f 46 6c 61 67 73 20 66 6c 61 67 73 20  asNoFlags flags 
fa70: 66 61 6c 73 65 5d 29 7d 20 74 68 65 6e 20 7b 0d  false])} then {.
fa80: 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
fa90: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
faa0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
fab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
fac0: 2d 2d 2d 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63  --- local connec
fad0: 74 69 6f 6e 20 66 6c 61 67 73 20 66 6f 72 20 22  tion flags for "
fae0: 20 24 64 61 74 61 62 61 73 65 20 5c 0d 0a 20 20   $database \..  
faf0: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 61 72              " ar
fb00: 65 3a 20 22 20 5b 65 78 70 72 20 7b 21 5b 68 61  e: " [expr {![ha
fb10: 73 4e 6f 46 6c 61 67 73 20 66 6c 61 67 73 20 66  sNoFlags flags f
fb20: 61 6c 73 65 5d 20 3f 20 5c 0d 0a 20 20 20 20 20  alse] ? \..     
fb30: 20 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64           [append
fb40: 41 72 67 73 20 5c 22 20 24 66 6c 61 67 73 20 5c  Args \" $flags \
fb50: 22 5d 20 3a 20 22 3c 6e 6f 6e 65 3e 22 7d 5d 20  "] : "<none>"}] 
fb60: 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  \n]..        }..
fb70: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
fb80: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
fb90: 3a 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f 67 29  : Show (and log)
fba0: 20 74 68 65 20 73 68 61 72 65 64 20 63 6f 6e 6e   the shared conn
fbb0: 65 63 74 69 6f 6e 20 66 6c 61 67 73 2e 0d 0a 20  ection flags... 
fbc0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
fbd0: 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
fbe0: 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  {..        if {[
fbf0: 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
fc00: 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
fc10: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
fc20: 69 74 65 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63  ite.SQLiteConnec
fc30: 74 69 6f 6e 20 53 68 61 72 65 64 46 6c 61 67 73  tion SharedFlags
fc40: 0d 0a 20 20 20 20 20 20 20 20 7d 20 73 68 61 72  ..        } shar
fc50: 65 64 46 6c 61 67 73 5d 20 3d 3d 20 30 7d 20 74  edFlags] == 0} t
fc60: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
fc70: 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
fc80: 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 53 68 61 72  ts ::no(emitShar
fc90: 65 64 46 6c 61 67 73 29 5d 20 26 26 20 5c 0d 0a  edFlags)] && \..
fca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 21                (!
fcb0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
fcc0: 6f 28 65 6d 69 74 53 68 61 72 65 64 46 6c 61 67  o(emitSharedFlag
fcd0: 73 49 66 4e 6f 6e 65 29 5d 20 7c 7c 20 5c 0d 0a  sIfNone)] || \..
fce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21                 !
fcf0: 5b 68 61 73 4e 6f 46 6c 61 67 73 20 73 68 61 72  [hasNoFlags shar
fd00: 65 64 46 6c 61 67 73 20 74 72 75 65 5d 29 7d 20  edFlags true])} 
fd10: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
fd20: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
fd30: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
fd40: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
fd50: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
fd60: 68 61 72 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e  hared connection
fd70: 20 66 6c 61 67 73 20 66 6f 72 20 22 20 24 64 61   flags for " $da
fd80: 74 61 62 61 73 65 20 5c 0d 0a 20 20 20 20 20 20  tabase \..      
fd90: 20 20 20 20 20 20 20 20 20 20 22 20 61 72 65 3a            " are:
fda0: 20 22 20 5b 65 78 70 72 20 7b 21 5b 68 61 73 4e   " [expr {![hasN
fdb0: 6f 46 6c 61 67 73 20 73 68 61 72 65 64 46 6c 61  oFlags sharedFla
fdc0: 67 73 20 74 72 75 65 5d 20 3f 20 5c 0d 0a 20 20  gs true] ? \..  
fdd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 61                [a
fde0: 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24 73 68  ppendArgs \" $sh
fdf0: 61 72 65 64 46 6c 61 67 73 20 5c 22 5d 20 3a 20  aredFlags \"] : 
fe00: 22 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a  "<none>"}] \n]..
fe10: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
fe20: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
fe30: 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
fe40: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
fe50: 65 6d 69 74 53 68 61 72 65 64 46 6c 61 67 73 29  emitSharedFlags)
fe60: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
fe70: 20 20 20 20 20 20 21 5b 69 6e 66 6f 20 65 78 69        ![info exi
fe80: 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 53 68 61  sts ::no(emitSha
fe90: 72 65 64 46 6c 61 67 73 49 66 55 6e 61 76 61 69  redFlagsIfUnavai
fea0: 6c 61 62 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d  lable)]} then {.
feb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
fec0: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
fed0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
fee0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
fef0: 20 20 22 2d 2d 2d 2d 20 73 68 61 72 65 64 20 63    "---- shared c
ff00: 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20  onnection flags 
ff10: 66 6f 72 20 22 20 24 64 61 74 61 62 61 73 65 20  for " $database 
ff20: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
ff30: 20 20 20 22 20 61 72 65 3a 20 3c 75 6e 61 76 61     " are: <unava
ff40: 69 6c 61 62 6c 65 3e 5c 6e 22 5d 0d 0a 20 20 20  ilable>\n"]..   
ff50: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
ff60: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
ff70: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
ff80: 20 4e 4f 54 45 3a 20 53 68 6f 77 20 28 61 6e 64   NOTE: Show (and
ff90: 20 6c 6f 67 29 20 74 68 65 20 64 65 74 65 63 74   log) the detect
ffa0: 65 64 20 67 6c 6f 62 61 6c 20 63 6f 6e 6e 65 63  ed global connec
ffb0: 74 69 6f 6e 20 66 6c 61 67 73 2c 20 69 66 20 61  tion flags, if a
ffc0: 6e 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ny...      #..  
ffd0: 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
ffe0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
fff0: 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
10000 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 47 6c 6f 62  ts ::no(emitGlob
10010 61 6c 46 6c 61 67 73 29 5d 20 26 26 20 5c 0d 0a  alFlags)] && \..
10020 20 20 20 20 20 20 20 20 20 20 20 20 28 21 5b 69              (![i
10030 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
10040 65 6d 69 74 47 6c 6f 62 61 6c 46 6c 61 67 73 49  emitGlobalFlagsI
10050 66 4e 6f 6e 65 29 5d 20 7c 7c 20 5c 0d 0a 20 20  fNone)] || \..  
10060 20 20 20 20 20 20 20 20 20 20 20 21 5b 68 61 73             ![has
10070 4e 6f 46 6c 61 67 73 20 3a 3a 63 6f 6e 6e 65 63  NoFlags ::connec
10080 74 69 6f 6e 5f 66 6c 61 67 73 20 66 61 6c 73 65  tion_flags false
10090 5d 29 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ])} then {..    
100a0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
100b0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
100c0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
100d0 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 67           "---- g
100e0 6c 6f 62 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e  lobal connection
100f0 20 66 6c 61 67 73 20 61 72 65 3a 20 22 20 5c 0d   flags are: " \.
10100 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
10110 65 78 70 72 20 7b 21 5b 68 61 73 4e 6f 46 6c 61  expr {![hasNoFla
10120 67 73 20 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f  gs ::connection_
10130 66 6c 61 67 73 20 66 61 6c 73 65 5d 20 3f 20 5c  flags false] ? \
10140 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
10150 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24  [appendArgs \" $
10160 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61  ::connection_fla
10170 67 73 20 5c 22 5d 20 3a 20 22 3c 6e 6f 6e 65 3e  gs \"] : "<none>
10180 22 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  "}] \n]..       
10190 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
101a0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
101b0 4e 4f 54 45 3a 20 49 66 20 74 68 65 72 65 20 61  NOTE: If there a
101c0 72 65 20 61 6e 79 20 67 6c 6f 62 61 6c 20 28 70  re any global (p
101d0 65 72 20 74 65 73 74 20 72 75 6e 29 20 63 6f 6e  er test run) con
101e0 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 63 75  nection flags cu
101f0 72 72 65 6e 74 6c 79 0d 0a 20 20 20 20 20 20 23  rrently..      #
10200 20 20 20 20 20 20 20 73 65 74 2c 20 75 73 65 20         set, use 
10210 74 68 65 6d 20 6e 6f 77 20 28 69 2e 65 2e 20 62  them now (i.e. b
10220 79 20 63 6f 6d 62 69 6e 69 6e 67 20 74 68 65 6d  y combining them
10230 20 77 69 74 68 20 74 68 65 20 6f 6e 65 73 20 66   with the ones f
10240 6f 72 20 74 68 69 73 0d 0a 20 20 20 20 20 20 23  or this..      #
10250 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f         connectio
10260 6e 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  n)...      #..  
10270 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
10280 69 73 74 73 20 3a 3a 63 6f 6e 6e 65 63 74 69 6f  ists ::connectio
10290 6e 5f 66 6c 61 67 73 5d 7d 20 74 68 65 6e 20 7b  n_flags]} then {
102a0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
102b0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 6d       # NOTE: Com
102c0 62 69 6e 65 20 61 6e 64 2f 6f 72 20 72 65 70 6c  bine and/or repl
102d0 61 63 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ace the connecti
102e0 6f 6e 20 66 6c 61 67 73 20 61 6e 64 20 74 68 65  on flags and the
102f0 6e 20 73 68 6f 77 20 74 68 65 0d 0a 20 20 20 20  n show the..    
10300 20 20 20 20 23 20 20 20 20 20 20 20 6e 65 77 20      #       new 
10310 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20 20  value...        
10320 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 66  #..        set f
10330 6c 61 67 73 20 5b 63 6f 6d 62 69 6e 65 46 6c 61  lags [combineFla
10340 67 73 20 24 66 6c 61 67 73 20 24 3a 3a 63 6f 6e  gs $flags $::con
10350 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73 5d 0d 0a  nection_flags]..
10360 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
10370 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f       # NOTE: Sho
10380 77 20 28 61 6e 64 20 6c 6f 67 29 20 74 68 65 20  w (and log) the 
10390 6e 65 77 20 65 66 66 65 63 74 69 76 65 20 63 6f  new effective co
103a0 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 2e 0d  nnection flags..
103b0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
103c0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
103d0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
103e0 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
103f0 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 43 6f  ists ::no(emitCo
10400 6d 62 69 6e 65 64 46 6c 61 67 73 29 5d 20 26 26  mbinedFlags)] &&
10410 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
10420 20 20 28 21 5b 69 6e 66 6f 20 65 78 69 73 74 73    (![info exists
10430 20 3a 3a 6e 6f 28 65 6d 69 74 43 6f 6d 62 69 6e   ::no(emitCombin
10440 65 64 46 6c 61 67 73 49 66 4e 6f 6e 65 29 5d 20  edFlagsIfNone)] 
10450 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  || \..          
10460 20 20 20 20 20 21 5b 68 61 73 4e 6f 46 6c 61 67       ![hasNoFlag
10470 73 20 66 6c 61 67 73 20 66 61 6c 73 65 5d 29 7d  s flags false])}
10480 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
10490 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
104a0 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
104b0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
104c0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
104d0 63 6f 6d 62 69 6e 65 64 20 63 6f 6e 6e 65 63 74  combined connect
104e0 69 6f 6e 20 66 6c 61 67 73 20 66 6f 72 20 22 20  ion flags for " 
104f0 24 64 61 74 61 62 61 73 65 20 5c 0d 0a 20 20 20  $database \..   
10500 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 61               " a
10510 72 65 3a 20 22 20 5b 65 78 70 72 20 7b 21 5b 68  re: " [expr {![h
10520 61 73 4e 6f 46 6c 61 67 73 20 66 6c 61 67 73 20  asNoFlags flags 
10530 66 61 6c 73 65 5d 20 3f 20 5c 0d 0a 20 20 20 20  false] ? \..    
10540 20 20 20 20 20 20 20 20 20 20 20 20 5b 61 70 70              [app
10550 65 6e 64 41 72 67 73 20 5c 22 20 24 66 6c 61 67  endArgs \" $flag
10560 73 20 5c 22 5d 20 3a 20 22 3c 6e 6f 6e 65 3e 22  s \"] : "<none>"
10570 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  }] \n]..        
10580 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
10590 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
105a0 20 72 65 74 75 72 6e 20 24 66 6c 61 67 73 0d 0a   return $flags..
105b0 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
105c0 6f 63 20 67 65 74 46 6c 61 67 73 50 72 6f 70 65  oc getFlagsPrope
105d0 72 74 79 20 7b 20 7b 66 6c 61 67 73 20 22 22 7d  rty { {flags ""}
105e0 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d   {quiet false} }
105f0 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
10600 20 20 20 23 20 4e 4f 54 45 3a 20 44 65 74 65 72     # NOTE: Deter
10610 6d 69 6e 65 20 77 68 61 74 20 74 68 65 20 63 6f  mine what the co
10620 6d 62 69 6e 65 64 20 28 67 6c 6f 62 61 6c 20 61  mbined (global a
10630 6e 64 20 6c 6f 63 61 6c 29 20 63 6f 6e 6e 65 63  nd local) connec
10640 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  tion..      #   
10650 20 20 20 20 66 6c 61 67 73 20 73 68 6f 75 6c 64      flags should
10660 20 62 65 2c 20 70 6f 73 73 69 62 6c 79 20 71 75   be, possibly qu
10670 69 65 74 6c 79 2e 0d 0a 20 20 20 20 20 20 23 0d  ietly...      #.
10680 0a 20 20 20 20 20 20 73 65 74 20 66 6c 61 67 73  .      set flags
10690 20 5b 67 65 74 43 6f 6e 6e 65 63 74 69 6f 6e 46   [getConnectionF
106a0 6c 61 67 73 20 22 22 20 24 66 6c 61 67 73 20 24  lags "" $flags $
106b0 71 75 69 65 74 5d 0d 0a 0d 0a 20 20 20 20 20 20  quiet]....      
106c0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
106d0 20 49 66 20 6e 6f 20 67 6c 6f 62 61 6c 20 6f 72   If no global or
106e0 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f   local connectio
106f0 6e 20 66 6c 61 67 73 20 77 65 72 65 20 73 70 65  n flags were spe
10700 63 69 66 69 65 64 2c 20 74 68 65 0d 0a 20 20 20  cified, the..   
10710 20 20 20 23 20 20 20 20 20 20 20 64 65 66 61 75     #       defau
10720 6c 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c  lt connection fl
10730 61 67 73 20 73 68 6f 75 6c 64 20 62 65 20 75 73  ags should be us
10740 65 64 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 72  ed; therefore, r
10750 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 23 20 20  eturn..      #  
10760 20 20 20 20 20 61 6e 20 65 6d 70 74 79 20 73 74       an empty st
10770 72 69 6e 67 20 69 6e 20 74 68 61 74 20 63 61 73  ring in that cas
10780 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
10790 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
107a0 65 6e 67 74 68 20 24 66 6c 61 67 73 5d 20 3d 3d  ength $flags] ==
107b0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
107c0 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20      return "".. 
107d0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
107e0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
107f0 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 63 68 65   In order to che
10800 63 6b 20 69 66 20 74 68 65 20 64 65 66 61 75 6c  ck if the defaul
10810 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61  t connection fla
10820 67 73 20 61 72 65 20 62 65 69 6e 67 20 75 73 65  gs are being use
10830 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
10840 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79   it is necessary
10850 20 74 6f 20 61 74 74 65 6d 70 74 20 61 20 63 6f   to attempt a co
10860 6e 76 65 72 73 69 6f 6e 20 74 6f 20 74 68 65 20  nversion to the 
10870 61 63 74 75 61 6c 20 65 6e 75 6d 65 72 61 74 65  actual enumerate
10880 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
10890 20 74 79 70 65 2e 20 20 46 61 69 6c 69 6e 67 20   type.  Failing 
108a0 74 68 61 74 2c 20 74 68 65 20 63 68 65 63 6b 20  that, the check 
108b0 61 67 61 69 6e 73 74 20 74 68 65 20 64 65 66 61  against the defa
108c0 75 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c 20 62  ult value will b
108d0 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
108e0 20 73 6b 69 70 70 65 64 2e 0d 0a 20 20 20 20 20   skipped...     
108f0 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63   #..      if {[c
10900 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
10910 73 65 74 20 65 72 72 6f 72 20 6e 75 6c 6c 3b 20  set error null; 
10920 23 20 49 47 4e 4f 52 45 44 0d 0a 0d 0a 20 20 20  # IGNORED....   
10930 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
10940 6b 65 20 55 74 69 6c 69 74 79 20 54 72 79 50 61  ke Utility TryPa
10950 72 73 65 46 6c 61 67 73 45 6e 75 6d 20 22 22 20  rseFlagsEnum "" 
10960 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  \..            S
10970 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
10980 65 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69  e.SQLiteConnecti
10990 6f 6e 46 6c 61 67 73 20 22 22 20 24 66 6c 61 67  onFlags "" $flag
109a0 73 20 6e 75 6c 6c 20 74 72 75 65 20 5c 0d 0a 20  s null true \.. 
109b0 20 20 20 20 20 20 20 20 20 20 20 74 72 75 65 20             true 
109c0 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 7d 20 76  error..      } v
109d0 61 6c 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  alue]} then {.. 
109e0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
109f0 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
10a00 74 69 6e 67 20 74 6f 20 70 61 72 73 65 20 74 68  ting to parse th
10a10 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61  e connection fla
10a20 67 73 20 63 61 75 73 65 64 20 61 20 73 63 72 69  gs caused a scri
10a30 70 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  pt..        #   
10a40 20 20 20 20 65 72 72 6f 72 2e 20 20 45 6d 69 74      error.  Emit
10a50 20 61 20 77 61 72 6e 69 6e 67 20 74 6f 20 74 68   a warning to th
10a60 65 20 74 65 73 74 20 6c 6f 67 20 66 69 6c 65 20  e test log file 
10a70 61 6e 64 20 63 6f 6e 74 69 6e 75 65 0d 0a 20 20  and continue..  
10a80 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73        #       us
10a90 69 6e 67 20 61 6e 20 65 6d 74 70 79 20 73 74 72  ing an emtpy str
10aa0 69 6e 67 20 69 6e 73 74 65 61 64 2e 0d 0a 20 20  ing instead...  
10ab0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
10ac0 20 74 6c 6f 67 20 5b 61 70 70 65 6e 64 41 72 67   tlog [appendArg
10ad0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
10ae0 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
10af0 66 61 69 6c 65 64 20 74 6f 20 70 61 72 73 65 20  failed to parse 
10b00 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
10b10 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20  , error: " \..  
10b20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24            \n\t $
10b30 76 61 6c 75 65 20 5c 6e 5d 0d 0a 0d 0a 20 20 20  value \n]....   
10b40 20 20 20 20 20 73 65 74 20 76 61 6c 75 65 20 22       set value "
10b50 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  "..      }....  
10b60 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
10b70 4f 54 45 3a 20 49 66 20 74 68 65 20 63 6f 6d 62  OTE: If the comb
10b80 69 6e 65 64 20 66 6c 61 67 73 20 73 74 72 69 6e  ined flags strin
10b90 67 20 63 6f 75 6c 64 20 6e 6f 74 20 61 63 74 75  g could not actu
10ba0 61 6c 6c 79 20 62 65 20 63 6f 6e 76 65 72 74 65  ally be converte
10bb0 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
10bc0 20 74 6f 20 74 68 65 20 65 6e 75 6d 65 72 61 74   to the enumerat
10bd0 65 64 20 74 79 70 65 20 69 74 20 69 73 20 74 68  ed type it is th
10be0 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 2c  e default value,
10bf0 20 74 68 65 6e 20 6a 75 73 74 20 75 73 65 0d 0a   then just use..
10c00 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 74        #       it
10c10 20 76 65 72 62 61 74 69 6d 3b 20 6f 74 68 65 72   verbatim; other
10c20 77 69 73 65 2c 20 6a 75 73 74 20 72 65 74 75 72  wise, just retur
10c30 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  n an empty strin
10c40 67 2e 20 20 49 6e 20 74 68 61 74 0d 0a 20 20 20  g.  In that..   
10c50 20 20 20 23 20 20 20 20 20 20 20 63 61 73 65 2c     #       case,
10c60 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6e   the default con
10c70 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 77 69  nection flags wi
10c80 6c 6c 20 62 65 20 75 73 65 64 2e 0d 0a 20 20 20  ll be used...   
10c90 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
10ca0 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
10cb0 76 61 6c 75 65 5d 20 3d 3d 20 30 20 7c 7c 20 24  value] == 0 || $
10cc0 76 61 6c 75 65 20 6e 65 20 22 44 65 66 61 75 6c  value ne "Defaul
10cd0 74 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  t"} then {..    
10ce0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
10cf0 20 57 41 52 4e 49 4e 47 3a 20 54 68 69 73 20 72   WARNING: This r
10d00 65 74 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e  eturns the strin
10d10 67 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63  g value of the c
10d20 6f 6d 62 69 6e 65 64 20 66 6c 61 67 73 2c 20 6e  ombined flags, n
10d30 6f 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ot..        #   
10d40 20 20 20 20 20 20 20 74 68 65 20 65 6e 75 6d 65         the enume
10d50 72 61 74 65 64 20 76 61 6c 75 65 2e 20 20 54 68  rated value.  Th
10d60 69 73 20 69 73 20 62 79 20 64 65 73 69 67 6e 20  is is by design 
10d70 61 6e 64 20 73 68 6f 75 6c 64 20 6e 6f 74 0d 0a  and should not..
10d80 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
10d90 20 20 20 62 65 20 63 68 61 6e 67 65 64 20 77 69     be changed wi
10da0 74 68 6f 75 74 20 63 61 72 65 66 75 6c 20 63 6f  thout careful co
10db0 6e 73 69 64 65 72 61 74 69 6f 6e 20 28 65 2e 67  nsideration (e.g
10dc0 2e 20 69 74 20 77 6f 75 6c 64 0d 0a 20 20 20 20  . it would..    
10dd0 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 70      #          p
10de0 72 65 76 65 6e 74 20 74 68 65 20 53 51 4c 69 74  revent the SQLit
10df0 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 63 6c 61 73  eConnection clas
10e00 73 20 66 72 6f 6d 20 61 6c 6c 6f 77 69 6e 67 20  s from allowing 
10e10 69 6e 76 61 6c 69 64 0d 0a 20 20 20 20 20 20 20  invalid..       
10e20 20 23 20 20 20 20 20 20 20 20 20 20 5b 22 6d 61   #          ["ma
10e30 67 69 63 61 6c 22 5d 20 6d 65 74 61 2d 66 6c 61  gical"] meta-fla
10e40 67 73 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  gs)...        #.
10e50 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
10e60 5b 61 70 70 65 6e 64 41 72 67 73 20 22 46 6c 61  [appendArgs "Fla
10e70 67 73 3d 22 20 24 66 6c 61 67 73 20 5c 3b 5d 0d  gs=" $flags \;].
10e80 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
10e90 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20    return ""..   
10ea0 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
10eb0 65 6e 61 62 6c 65 53 68 61 72 65 64 43 61 63 68  enableSharedCach
10ec0 65 20 7b 20 63 68 61 6e 6e 65 6c 20 65 6e 61 62  e { channel enab
10ed0 6c 65 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d  le {quiet false}
10ee0 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b   } {..      if {
10ef0 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
10f00 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
10f10 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
10f20 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
10f30 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
10f40 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65  ite.UnsafeNative
10f50 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20  Methods \..     
10f60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
10f70 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63  nable_shared_cac
10f80 68 65 20 5b 65 78 70 72 20 69 6e 74 28 24 65 6e  he [expr int($en
10f90 61 62 6c 65 29 5d 0d 0a 20 20 20 20 20 20 7d 20  able)]..      } 
10fa0 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68  result] == 0} th
10fb0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
10fc0 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
10fd0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
10fe0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
10ff0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
11000 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
11010 61 6c 6c 20 73 71 6c 69 74 65 33 5f 65 6e 61 62  all sqlite3_enab
11020 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65 28  le_shared_cache(
11030 22 20 24 65 6e 61 62 6c 65 20 5c 0d 0a 20 20 20  " $enable \..   
11040 20 20 20 20 20 20 20 20 20 20 20 22 29 2e 2e 2e             ")...
11050 20 6f 6b 3a 20 22 20 24 72 65 73 75 6c 74 20 5c   ok: " $result \
11060 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  n]..        }.. 
11070 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
11080 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
11090 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
110a0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
110b0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
110c0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
110d0 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c    "---- call sql
110e0 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72  ite3_enable_shar
110f0 65 64 5f 63 61 63 68 65 28 22 20 24 65 6e 61 62  ed_cache(" $enab
11100 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  le \..          
11110 20 20 20 20 22 29 2e 2e 2e 20 65 72 72 6f 72 3a      ")... error:
11120 20 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20   " \n\t $result 
11130 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  \n]..        }..
11140 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
11150 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 65 74 75  ...    proc setu
11160 70 44 62 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  pDb {..         
11170 20 20 20 66 69 6c 65 4e 61 6d 65 20 7b 6d 6f 64     fileName {mod
11180 65 20 22 22 7d 20 7b 64 61 74 65 54 69 6d 65 46  e ""} {dateTimeF
11190 6f 72 6d 61 74 20 22 22 7d 20 7b 64 61 74 65 54  ormat ""} {dateT
111a0 69 6d 65 4b 69 6e 64 20 22 22 7d 20 7b 66 6c 61  imeKind ""} {fla
111b0 67 73 20 22 22 7d 0d 0a 20 20 20 20 20 20 20 20  gs ""}..        
111c0 20 20 20 20 7b 65 78 74 72 61 20 22 22 7d 20 7b      {extra ""} {
111d0 71 75 61 6c 69 66 79 20 74 72 75 65 7d 20 7b 64  qualify true} {d
111e0 65 6c 65 74 65 20 74 72 75 65 7d 20 7b 75 72 69  elete true} {uri
111f0 20 66 61 6c 73 65 7d 0d 0a 20 20 20 20 20 20 20   false}..       
11200 20 20 20 20 20 7b 74 65 6d 70 6f 72 61 72 79 20       {temporary 
11210 74 72 75 65 7d 20 7b 76 61 72 4e 61 6d 65 20 64  true} {varName d
11220 62 7d 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d  b} {quiet false}
11230 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
11240 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 72       # NOTE: Fir
11250 73 74 2c 20 73 65 65 20 69 66 20 6f 75 72 20 63  st, see if our c
11260 61 6c 6c 65 72 20 68 61 73 20 72 65 71 75 65 73  aller has reques
11270 74 65 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ted an in-memory
11280 20 64 61 74 61 62 61 73 65 2e 0d 0a 20 20 20 20   database...    
11290 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 69    #..      set i
112a0 73 4d 65 6d 6f 72 79 20 5b 69 73 4d 65 6d 6f 72  sMemory [isMemor
112b0 79 44 62 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a  yDb $fileName]..
112c0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
112d0 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 6e 6f 77   # NOTE: For now
112e0 2c 20 61 6c 6c 20 74 65 73 74 20 64 61 74 61 62  , all test datab
112f0 61 73 65 73 20 75 73 65 64 20 62 79 20 74 68 65  ases used by the
11300 20 74 65 73 74 20 73 75 69 74 65 20 61 72 65 20   test suite are 
11310 70 6c 61 63 65 64 0d 0a 20 20 20 20 20 20 23 20  placed..      # 
11320 20 20 20 20 20 20 69 6e 74 6f 20 74 68 65 20 64        into the d
11330 61 74 61 62 61 73 65 20 64 69 72 65 63 74 6f 72  atabase director
11340 79 2e 20 20 45 61 63 68 20 64 61 74 61 62 61 73  y.  Each databas
11350 65 20 61 6e 64 20 72 65 6c 61 74 65 64 20 66 69  e and related fi
11360 6c 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20  les..      #    
11370 20 20 20 75 73 65 64 20 62 79 20 61 20 74 65 73     used by a tes
11380 74 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 65 61  t should be clea
11390 6e 65 64 20 75 70 20 62 79 20 74 68 61 74 20 74  ned up by that t
113a0 65 73 74 20 75 73 69 6e 67 20 74 68 65 0d 0a 20  est using the.. 
113b0 20 20 20 20 20 23 20 20 20 20 20 20 20 22 63 6c       #       "cl
113c0 65 61 6e 75 70 44 62 22 20 70 72 6f 63 65 64 75  eanupDb" procedu
113d0 72 65 2c 20 62 65 6c 6f 77 2e 0d 0a 20 20 20 20  re, below...    
113e0 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21    #..      if {!
113f0 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24 71 75  $isMemory && $qu
11400 61 6c 69 66 79 7d 20 74 68 65 6e 20 7b 0d 0a 20  alify} then {.. 
11410 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e         set fileN
11420 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b  ame [file join [
11430 67 65 74 44 61 74 61 62 61 73 65 44 69 72 65 63  getDatabaseDirec
11440 74 6f 72 79 5d 20 5b 66 69 6c 65 20 74 61 69 6c  tory] [file tail
11450 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20   $fileName]]..  
11460 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
11470 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
11480 42 79 20 64 65 66 61 75 6c 74 2c 20 64 65 6c 65  By default, dele
11490 74 65 20 61 6e 79 20 70 72 65 2d 65 78 69 73 74  te any pre-exist
114a0 69 6e 67 20 64 61 74 61 62 61 73 65 20 77 69 74  ing database wit
114b0 68 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 0d  h the same file.
114c0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e  .      #       n
114d0 61 6d 65 20 69 66 20 69 74 20 63 75 72 72 65 6e  ame if it curren
114e0 74 6c 79 20 65 78 69 73 74 73 2e 0d 0a 20 20 20  tly exists...   
114f0 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
11500 21 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24 64  !$isMemory && $d
11510 65 6c 65 74 65 20 26 26 20 5b 66 69 6c 65 20 65  elete && [file e
11520 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d  xists $fileName]
11530 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
11540 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
11550 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20  OTE: Attempt to 
11560 64 65 6c 65 74 65 20 61 6e 79 20 70 72 65 2d 65  delete any pre-e
11570 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65  xisting database
11580 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 66   with the same f
11590 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ile..        #  
115a0 20 20 20 20 20 6e 61 6d 65 2e 0d 0a 20 20 20 20       name...    
115b0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
115c0 66 20 7b 5b 63 61 74 63 68 20 7b 66 69 6c 65 20  f {[catch {file 
115d0 64 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65  delete $fileName
115e0 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b  } error]} then {
115f0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
11600 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
11610 20 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c   We somehow fail
11620 65 64 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  ed to delete the
11630 20 66 69 6c 65 2c 20 72 65 70 6f 72 74 20 77 68   file, report wh
11640 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  y...          #.
11650 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
11660 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
11670 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
11680 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
11690 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
116a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
116b0 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
116c0 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65  failed to delete
116d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 5c   database file \
116e0 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a  "" $fileName \..
116f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11700 22 5c 22 20 64 75 72 69 6e 67 20 73 65 74 75 70  "\" during setup
11710 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  , error: " \n\t 
11720 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20  $error \n]..    
11730 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
11740 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
11750 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
11760 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74  NOTE: Refer to t
11770 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72  he specified var
11780 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22  iable (e.g. "db"
11790 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74  ) in the context
117a0 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23   of our..      #
117b0 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20 20         caller.  
117c0 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 74 68  The handle to th
117d0 65 20 6f 70 65 6e 65 64 20 64 61 74 61 62 61 73  e opened databas
117e0 65 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64  e will be stored
117f0 20 74 68 65 72 65 2e 0d 0a 20 20 20 20 20 20 23   there...      #
11800 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20  ..      upvar 1 
11810 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20  $varName db.... 
11820 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
11830 4e 4f 54 45 3a 20 53 74 61 72 74 20 62 75 69 6c  NOTE: Start buil
11840 64 69 6e 67 20 74 68 65 20 63 6f 6e 6e 65 63 74  ding the connect
11850 69 6f 6e 20 73 74 72 69 6e 67 2e 20 20 54 68 65  ion string.  The
11860 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 64 20 70   only required p
11870 6f 72 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20  ortion..      # 
11880 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6e        of the con
11890 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 69  nection string i
118a0 73 20 74 68 65 20 64 61 74 61 20 73 6f 75 72 63  s the data sourc
118b0 65 2c 20 77 68 69 63 68 20 63 6f 6e 74 61 69 6e  e, which contain
118c0 73 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  s the..      #  
118d0 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
118e0 6c 65 20 6e 61 6d 65 20 69 74 73 65 6c 66 2e 20  le name itself. 
118f0 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 77   If our caller w
11900 61 6e 74 73 20 74 6f 20 75 73 65 20 61 20 55 52  ants to use a UR
11910 49 20 61 73 0d 0a 20 20 20 20 20 20 23 20 20 20  I as..      #   
11920 20 20 20 20 74 68 65 20 64 61 74 61 20 73 6f 75      the data sou
11930 72 63 65 2c 20 75 73 65 20 74 68 65 20 46 75 6c  rce, use the Ful
11940 6c 55 72 69 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  lUri connection 
11950 73 74 72 69 6e 67 20 70 72 6f 70 65 72 74 79 20  string property 
11960 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  to..      #     
11970 20 20 70 72 65 76 65 6e 74 20 74 68 65 20 64 61    prevent the da
11980 74 61 20 73 6f 75 72 63 65 20 73 74 72 69 6e 67  ta source string
11990 20 66 72 6f 6d 20 62 65 69 6e 67 20 6d 61 6e 67   from being mang
119a0 6c 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  led...      #.. 
119b0 20 20 20 20 20 69 66 20 7b 24 75 72 69 7d 20 74       if {$uri} t
119c0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  hen {..        s
119d0 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 46  et connection {F
119e0 75 6c 6c 55 72 69 3d 24 7b 66 69 6c 65 4e 61 6d  ullUri=${fileNam
119f0 65 7d 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  e}}..      } els
11a00 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  e {..        set
11a10 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 44 61 74   connection {Dat
11a20 61 20 53 6f 75 72 63 65 3d 24 7b 66 69 6c 65 4e  a Source=${fileN
11a30 61 6d 65 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a  ame}}..      }..
11a40 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
11a50 20 23 20 4e 4f 54 45 3a 20 53 69 6e 63 65 20 74   # NOTE: Since t
11a60 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 68 61  his procedure ha
11a70 73 20 6e 6f 20 73 70 65 63 69 61 6c 20 6b 6e 6f  s no special kno
11a80 77 6c 65 64 67 65 20 6f 66 20 77 68 61 74 20 74  wledge of what t
11a90 68 65 20 64 65 66 61 75 6c 74 0d 0a 20 20 20 20  he default..    
11aa0 20 20 23 20 20 20 20 20 20 20 73 65 74 74 69 6e    #       settin
11ab0 67 20 69 73 20 66 6f 72 20 74 68 65 20 54 6f 46  g is for the ToF
11ac0 75 6c 6c 50 61 74 68 20 63 6f 6e 6e 65 63 74 69  ullPath connecti
11ad0 6f 6e 20 73 74 72 69 6e 67 20 70 72 6f 70 65 72  on string proper
11ae0 79 2c 20 61 6c 77 61 79 73 0d 0a 20 20 20 20 20  y, always..     
11af0 20 23 20 20 20 20 20 20 20 61 64 64 20 74 68 65   #       add the
11b00 20 76 61 6c 75 65 20 77 65 20 6b 6e 6f 77 20 61   value we know a
11b10 62 6f 75 74 20 74 6f 20 74 68 65 20 63 6f 6e 6e  bout to the conn
11b20 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 2e 0d 0a  ection string...
11b30 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 61        #..      a
11b40 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e  ppend connection
11b50 20 7b 3b 54 6f 46 75 6c 6c 50 61 74 68 3d 24 7b   {;ToFullPath=${
11b60 71 75 61 6c 69 66 79 7d 7d 0d 0a 0d 0a 20 20 20  qualify}}....   
11b70 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
11b80 54 45 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65  TE: If our calle
11b90 72 20 73 70 65 63 69 66 69 65 64 20 61 20 6a 6f  r specified a jo
11ba0 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 61 64 64 20  urnal mode, add 
11bb0 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 70 6f  the necessary po
11bc0 72 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20  rtion..      #  
11bd0 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6e 6e       of the conn
11be0 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f  ection string no
11bf0 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  w...      #..   
11c00 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
11c10 65 6e 67 74 68 20 24 6d 6f 64 65 5d 20 3e 20 30  ength $mode] > 0
11c20 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
11c30 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74    append connect
11c40 69 6f 6e 20 7b 3b 4a 6f 75 72 6e 61 6c 20 4d 6f  ion {;Journal Mo
11c50 64 65 3d 24 7b 6d 6f 64 65 7d 7d 0d 0a 20 20 20  de=${mode}}..   
11c60 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
11c70 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
11c80 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 73 70 65  f our caller spe
11c90 63 69 66 69 65 64 20 61 20 44 61 74 65 54 69 6d  cified a DateTim
11ca0 65 20 66 6f 72 6d 61 74 2c 20 61 64 64 20 74 68  e format, add th
11cb0 65 20 6e 65 63 65 73 73 61 72 79 0d 0a 20 20 20  e necessary..   
11cc0 20 20 20 23 20 20 20 20 20 20 20 70 6f 72 74 69     #       porti
11cd0 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63  on of the connec
11ce0 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e  tion string now.
11cf0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
11d00 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
11d10 67 74 68 20 24 64 61 74 65 54 69 6d 65 46 6f 72  gth $dateTimeFor
11d20 6d 61 74 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  mat] > 0} then {
11d30 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  ..        append
11d40 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 44 61   connection {;Da
11d50 74 65 54 69 6d 65 46 6f 72 6d 61 74 3d 24 7b 64  teTimeFormat=${d
11d60 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 7d 7d 0d  ateTimeFormat}}.
11d70 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
11d80 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
11d90 45 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72  E: If our caller
11da0 20 73 70 65 63 69 66 69 65 64 20 61 20 44 61 74   specified a Dat
11db0 65 54 69 6d 65 4b 69 6e 64 2c 20 61 64 64 20 74  eTimeKind, add t
11dc0 68 65 20 6e 65 63 65 73 73 61 72 79 20 70 6f 72  he necessary por
11dd0 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  tion..      #   
11de0 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65      of the conne
11df0 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77  ction string now
11e00 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
11e10 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
11e20 6e 67 74 68 20 24 64 61 74 65 54 69 6d 65 4b 69  ngth $dateTimeKi
11e30 6e 64 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  nd] > 0} then {.
11e40 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20  .        append 
11e50 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 44 61 74  connection {;Dat
11e60 65 54 69 6d 65 4b 69 6e 64 3d 24 7b 64 61 74 65  eTimeKind=${date
11e70 54 69 6d 65 4b 69 6e 64 7d 7d 0d 0a 20 20 20 20  TimeKind}}..    
11e80 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
11e90 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69        # NOTE: Fi
11ea0 67 75 72 65 20 6f 75 74 20 77 68 61 74 20 74 68  gure out what th
11eb0 65 20 66 69 6e 61 6c 20 66 6c 61 67 73 20 66 6f  e final flags fo
11ec0 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  r this connectio
11ed0 6e 20 6e 65 65 64 20 74 6f 20 62 65 2e 0d 0a 20  n need to be... 
11ee0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65       #..      se
11ef0 74 20 66 6c 61 67 73 20 5b 67 65 74 43 6f 6e 6e  t flags [getConn
11f00 65 63 74 69 6f 6e 46 6c 61 67 73 20 24 66 69 6c  ectionFlags $fil
11f10 65 4e 61 6d 65 20 24 66 6c 61 67 73 20 24 71 75  eName $flags $qu
11f20 69 65 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  iet]....      #.
11f30 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
11f40 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 73 70 65  f our caller spe
11f50 63 69 66 69 65 64 20 73 6f 6d 65 20 53 51 4c 69  cified some SQLi
11f60 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67  teConnectionFlag
11f70 73 2c 20 61 64 64 20 74 68 65 0d 0a 20 20 20 20  s, add the..    
11f80 20 20 23 20 20 20 20 20 20 20 6e 65 63 65 73 73    #       necess
11f90 61 72 79 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  ary portion of t
11fa0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74  he connection st
11fb0 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  ring now...     
11fc0 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   #..      if {[s
11fd0 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 6c  tring length $fl
11fe0 61 67 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ags] > 0} then {
11ff0 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  ..        append
12000 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 46 6c   connection {;Fl
12010 61 67 73 3d 24 7b 66 6c 61 67 73 7d 7d 0d 0a 20  ags=${flags}}.. 
12020 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
12030 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
12040 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 73   If our caller s
12050 70 65 63 69 66 69 65 64 20 61 6e 20 65 78 74 72  pecified an extr
12060 61 20 70 61 79 6c 6f 61 64 20 74 6f 20 74 68 65  a payload to the
12070 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20   connection..   
12080 20 20 20 23 20 20 20 20 20 20 20 73 74 72 69 6e     #       strin
12090 67 2c 20 61 70 70 65 6e 64 20 69 74 20 6e 6f 77  g, append it now
120a0 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
120b0 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
120c0 6e 67 74 68 20 24 65 78 74 72 61 5d 20 3e 20 30  ngth $extra] > 0
120d0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
120e0 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74    append connect
120f0 69 6f 6e 20 5c 3b 20 24 65 78 74 72 61 0d 0a 20  ion \; $extra.. 
12100 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
12110 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
12120 20 4f 70 65 6e 20 74 68 65 20 64 61 74 61 62 61   Open the databa
12130 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f  se connection no
12140 77 2c 20 70 6c 61 63 69 6e 67 20 74 68 65 20 6f  w, placing the o
12150 70 61 71 75 65 20 68 61 6e 64 6c 65 20 76 61 6c  paque handle val
12160 75 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ue..      #     
12170 20 20 69 6e 74 6f 20 74 68 65 20 76 61 72 69 61    into the varia
12180 62 6c 65 20 73 70 65 63 69 66 69 65 64 20 62 79  ble specified by
12190 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20   our caller...  
121a0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
121b0 20 64 62 20 5b 73 71 6c 20 6f 70 65 6e 20 2d 74   db [sql open -t
121c0 79 70 65 20 53 51 4c 69 74 65 20 5b 73 75 62 73  ype SQLite [subs
121d0 74 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 5d 5d 0d  t $connection]].
121e0 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
121f0 20 20 23 20 4e 4f 54 45 3a 20 43 6f 6e 66 69 67    # NOTE: Config
12200 75 72 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72  ure the temporar
12210 79 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20  y directory for 
12220 74 68 65 20 6e 65 77 6c 79 20 6f 70 65 6e 65 64  the newly opened
12230 20 64 61 74 61 62 61 73 65 0d 0a 20 20 20 20 20   database..     
12240 20 23 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74   #       connect
12250 69 6f 6e 20 6e 6f 77 20 75 6e 6c 65 73 73 20 6f  ion now unless o
12260 75 72 20 63 61 6c 6c 65 72 20 66 6f 72 62 69 64  ur caller forbid
12270 73 20 69 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  s it...      #..
12280 20 20 20 20 20 20 69 66 20 7b 24 74 65 6d 70 6f        if {$tempo
12290 72 61 72 79 20 26 26 20 21 5b 69 6e 66 6f 20 65  rary && ![info e
122a0 78 69 73 74 73 20 3a 3a 6e 6f 28 73 65 74 54 65  xists ::no(setTe
122b0 6d 70 6f 72 61 72 79 44 69 72 65 63 74 6f 72 79  mporaryDirectory
122c0 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
122d0 20 20 20 20 73 71 6c 20 65 78 65 63 75 74 65 20      sql execute 
122e0 24 64 62 20 5b 61 70 70 65 6e 64 41 72 67 73 20  $db [appendArgs 
122f0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
12300 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72  PRAGMA temp_stor
12310 65 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 5c 22  e_directory = \"
12320 22 20 5b 67 65 74 54 65 6d 70 6f 72 61 72 79 44  " [getTemporaryD
12330 69 72 65 63 74 6f 72 79 5d 20 5c 22 5c 3b 5d 0d  irectory] \"\;].
12340 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
12350 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
12360 45 3a 20 50 65 72 66 6f 72 6d 20 61 6e 79 20 65  E: Perform any e
12370 78 74 72 61 20 70 65 72 2d 63 6f 6e 6e 65 63 74  xtra per-connect
12380 69 6f 6e 20 73 65 74 75 70 20 66 6f 72 20 74 68  ion setup for th
12390 65 20 6e 65 77 6c 79 20 6f 70 65 6e 65 64 0d 0a  e newly opened..
123a0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 61        #       da
123b0 74 61 62 61 73 65 20 6e 6f 77 20 75 6e 6c 65 73  tabase now unles
123c0 73 20 6f 75 72 20 63 61 6c 6c 65 72 20 66 6f 72  s our caller for
123d0 62 69 64 73 20 69 74 2e 0d 0a 20 20 20 20 20 20  bids it...      
123e0 23 0d 0a 20 20 20 20 20 20 73 65 74 20 65 78 65  #..      set exe
123f0 63 75 74 65 4f 6e 53 65 74 75 70 20 5b 67 65 74  cuteOnSetup [get
12400 45 78 65 63 75 74 65 4f 6e 53 65 74 75 70 5d 0d  ExecuteOnSetup].
12410 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  ...      if {[st
12420 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 65 78 65  ring length $exe
12430 63 75 74 65 4f 6e 53 65 74 75 70 5d 20 3e 20 30  cuteOnSetup] > 0
12440 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
12450 20 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   ![info exists :
12460 3a 6e 6f 28 65 78 65 63 75 74 65 4f 6e 53 65 74  :no(executeOnSet
12470 75 70 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  up)]} then {..  
12480 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
12490 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 63 6f   # NOTE: This co
124a0 6d 6d 61 6e 64 20 6d 61 79 20 72 61 69 73 65 20  mmand may raise 
124b0 61 6e 20 65 72 72 6f 72 3b 20 69 66 20 73 6f 2c  an error; if so,
124c0 20 74 68 61 74 20 69 73 20 66 69 6e 65 2c 20 61   that is fine, a
124d0 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  s..        #    
124e0 20 20 20 74 68 65 20 65 6e 63 6c 6f 73 69 6e 67     the enclosing
124f0 20 74 65 73 74 20 77 69 6c 6c 20 74 68 65 6e 20   test will then 
12500 66 61 69 6c 2e 20 20 54 68 65 20 5b 73 75 62 73  fail.  The [subs
12510 74 5d 20 63 6f 6d 6d 61 6e 64 20 69 73 0d 0a 20  t] command is.. 
12520 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75         #       u
12530 73 65 64 20 6f 6e 20 74 68 65 20 53 51 4c 20 69  sed on the SQL i
12540 6e 20 63 61 73 65 20 69 74 20 6e 65 65 64 73 20  n case it needs 
12550 74 6f 20 72 65 66 65 72 20 74 6f 20 73 74 61 74  to refer to stat
12560 65 20 69 6e 20 6f 75 72 0d 0a 20 20 20 20 20 20  e in our..      
12570 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74 65 78    #       contex
12580 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
12590 20 20 20 20 20 20 20 73 71 6c 20 65 78 65 63 75         sql execu
125a0 74 65 20 24 64 62 20 5b 73 75 62 73 74 20 24 65  te $db [subst $e
125b0 78 65 63 75 74 65 4f 6e 53 65 74 75 70 5d 0d 0a  xecuteOnSetup]..
125c0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
125d0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
125e0 3a 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20  : Always return 
125f0 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  the connection h
12600 61 6e 64 6c 65 20 75 70 6f 6e 20 73 75 63 63 65  andle upon succe
12610 73 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ss...      #..  
12620 20 20 20 20 72 65 74 75 72 6e 20 24 64 62 0d 0a      return $db..
12630 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
12640 6f 63 20 67 65 74 44 62 43 6f 6e 6e 65 63 74 69  oc getDbConnecti
12650 6f 6e 20 7b 20 7b 76 61 72 4e 61 6d 65 20 64 62  on { {varName db
12660 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
12670 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
12680 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63 69  fer to the speci
12690 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28 65  fied variable (e
126a0 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65  .g. "db") in the
126b0 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d   context of our.
126c0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
126d0 61 6c 6c 65 72 2e 20 20 54 68 65 20 68 61 6e 64  aller.  The hand
126e0 6c 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  le to the databa
126f0 73 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70  se previously op
12700 65 6e 65 64 20 76 69 61 20 74 68 65 0d 0a 20 20  ened via the..  
12710 20 20 20 20 23 20 20 20 20 20 20 20 5b 73 65 74      #       [set
12720 75 70 44 62 5d 20 70 72 6f 63 65 64 75 72 65 20  upDb] procedure 
12730 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64  should be stored
12740 20 74 68 65 72 65 2e 0d 0a 20 20 20 20 20 20 23   there...      #
12750 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20  ..      upvar 1 
12760 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20  $varName db.... 
12770 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
12780 4e 4f 54 45 3a 20 54 68 69 73 20 72 65 74 75 72  NOTE: This retur
12790 6e 73 20 74 68 65 20 41 44 4f 2e 4e 45 54 20 49  ns the ADO.NET I
127a0 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 6a  DbConnection obj
127b0 65 63 74 20 69 6e 73 74 61 6e 63 65 20 66 6f 72  ect instance for
127c0 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
127d0 20 20 20 20 73 70 65 63 69 66 69 65 64 20 64 61      specified da
127e0 74 61 62 73 65 20 68 61 6e 64 6c 65 2e 20 20 53  tabse handle.  S
127f0 69 6e 63 65 20 67 65 74 74 69 6e 67 20 74 68 69  ince getting thi
12800 73 20 6f 62 6a 65 63 74 20 72 65 6c 69 65 73 20  s object relies 
12810 75 70 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  upon..      #   
12820 20 20 20 20 45 61 67 6c 65 20 69 6e 74 65 72 6e      Eagle intern
12830 61 6c 73 2c 20 67 72 65 61 74 20 63 61 72 65 20  als, great care 
12840 73 68 6f 75 6c 64 20 62 65 20 74 61 6b 65 6e 20  should be taken 
12850 74 6f 20 61 76 6f 69 64 20 64 69 73 70 6f 73 69  to avoid disposi
12860 6e 67 20 6f 66 0d 0a 20 20 20 20 20 20 23 20 20  ng of..      #  
12870 20 20 20 20 20 74 68 69 73 20 6f 62 6a 65 63 74       this object
12880 20 6f 72 20 6f 74 68 65 72 77 69 73 65 20 70 75   or otherwise pu
12890 74 74 69 6e 67 20 69 74 20 69 6e 74 6f 20 61 6e  tting it into an
128a0 20 69 6e 76 61 6c 69 64 20 73 74 61 74 65 2e 0d   invalid state..
128b0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
128c0 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
128d0 20 64 62 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   db]} then {..  
128e0 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
128f0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62   {..          ob
12900 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
12910 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d 6f  gs +NonPublic -o
12920 62 6a 65 63 74 66 6c 61 67 73 20 2b 4e 6f 44 69  bjectflags +NoDi
12930 73 70 6f 73 65 20 2d 61 6c 69 61 73 20 5c 0d 0a  spose -alias \..
12940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49 6e                In
12950 74 65 72 70 72 65 74 65 72 2e 47 65 74 41 63 74  terpreter.GetAct
12960 69 76 65 2e 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ive.connections 
12970 49 74 65 6d 20 24 64 62 0d 0a 20 20 20 20 20 20  Item $db..      
12980 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30    } result] == 0
12990 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
129a0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
129b0 20 23 20 4e 4f 54 45 3a 20 53 75 63 63 65 73 73   # NOTE: Success
129c0 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6f 70 61  , return the opa
129d0 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c  que object handl
129e0 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  e...          #.
129f0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
12a00 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 20  n $result..     
12a10 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
12a20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
12a30 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 69 6c      # NOTE: Fail
12a40 75 72 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e  ure, report why.
12a50 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
12a60 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
12a70 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
12a80 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
12a90 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
12aa0 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
12ab0 64 20 74 6f 20 67 65 74 20 63 6f 6e 6e 65 63 74  d to get connect
12ac0 69 6f 6e 20 68 61 6e 64 6c 65 20 66 6f 72 20 64  ion handle for d
12ad0 61 74 61 62 61 73 65 20 5c 22 22 20 5c 0d 0a 20  atabase \"" \.. 
12ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 24 64 62               $db
12af0 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c   "\", error: " \
12b00 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d  n\t $result \n].
12b10 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
12b20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
12b30 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61        # NOTE: Fa
12b40 69 6c 75 72 65 2c 20 72 65 74 75 72 6e 20 61 6e  ilure, return an
12b50 20 6f 62 76 69 6f 75 73 6c 79 20 69 6e 76 61 6c   obviously inval
12b60 69 64 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74  id opaque object
12b70 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20   handle...      
12b80 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  #..      return 
12b90 22 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  ""..    }.....  
12ba0 20 20 70 72 6f 63 20 66 72 65 65 44 62 43 6f 6e    proc freeDbCon
12bb0 6e 65 63 74 69 6f 6e 20 7b 20 7b 76 61 72 4e 61  nection { {varNa
12bc0 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 7d 20 7d  me connection} }
12bd0 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
12be0 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72     # NOTE: Refer
12bf0 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65   to the specifie
12c00 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e  d variable (e.g.
12c10 20 22 63 6f 6e 6e 65 63 74 69 6f 6e 22 29 20 69   "connection") i
12c20 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  n the..      #  
12c30 20 20 20 20 20 63 6f 6e 74 65 78 74 20 6f 66 20       context of 
12c40 6f 75 72 20 63 61 6c 6c 65 72 2e 20 20 54 68 65  our caller.  The
12c50 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74 20 68   opaque object h
12c60 61 6e 64 6c 65 20 66 6f 72 20 61 6e 20 41 44 4f  andle for an ADO
12c70 2e 4e 45 54 0d 0a 20 20 20 20 20 20 23 20 20 20  .NET..      #   
12c80 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70      connection p
12c90 72 65 76 69 6f 75 73 6c 79 20 72 65 74 75 72 6e  reviously return
12ca0 65 64 20 62 79 20 5b 67 65 74 44 62 43 6f 6e 6e  ed by [getDbConn
12cb0 65 63 74 69 6f 6e 5d 20 73 68 6f 75 6c 64 20 62  ection] should b
12cc0 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
12cd0 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a   stored there...
12ce0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75        #..      u
12cf0 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20  pvar 1 $varName 
12d00 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 0d 0a 20 20  connection....  
12d10 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
12d20 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20  OTE: Attempt to 
12d30 72 65 6d 6f 76 65 20 74 68 65 20 6f 70 61 71 75  remove the opaqu
12d40 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20  e object handle 
12d50 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 70 72  from the interpr
12d60 65 74 65 72 0d 0a 20 20 20 20 20 20 23 20 20 20  eter..      #   
12d70 20 20 20 20 6e 6f 77 2e 20 20 54 68 69 73 20 5b      now.  This [
12d80 6f 62 6a 65 63 74 20 64 69 73 70 6f 73 65 5d 20  object dispose] 
12d90 63 61 6c 6c 20 77 69 6c 6c 20 6e 6f 74 20 61 63  call will not ac
12da0 74 75 61 6c 6c 79 20 64 69 73 70 6f 73 65 20 6f  tually dispose o
12db0 66 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  f the..      #  
12dc0 20 20 20 20 20 75 6e 64 65 72 6c 79 69 6e 67 20       underlying 
12dd0 6f 62 6a 65 63 74 20 62 65 63 61 75 73 65 20 74  object because t
12de0 68 65 20 2b 4e 6f 44 69 73 70 6f 73 65 20 66 6c  he +NoDispose fl
12df0 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20 69 74  ag was set on it
12e00 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
12e10 64 75 72 69 6e 67 20 63 72 65 61 74 69 6f 6e 20  during creation 
12e20 6f 66 20 74 68 65 20 6f 70 61 71 75 65 20 6f 62  of the opaque ob
12e30 6a 65 63 74 20 68 61 6e 64 6c 65 2e 0d 0a 20 20  ject handle...  
12e40 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
12e50 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 63 6f  {[info exists co
12e60 6e 6e 65 63 74 69 6f 6e 5d 20 26 26 20 5c 0d 0a  nnection] && \..
12e70 20 20 20 20 20 20 20 20 20 20 5b 63 61 74 63 68            [catch
12e80 20 7b 6f 62 6a 65 63 74 20 64 69 73 70 6f 73 65   {object dispose
12e90 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 7d 20 65 72   $connection} er
12ea0 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ror]} then {..  
12eb0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
12ec0 20 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65   # NOTE: We some
12ed0 68 6f 77 20 66 61 69 6c 65 64 20 74 6f 20 72 65  how failed to re
12ee0 6d 6f 76 65 20 74 68 65 20 68 61 6e 64 6c 65 2c  move the handle,
12ef0 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20   report why...  
12f00 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
12f10 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
12f20 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
12f30 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
12f40 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
12f50 20 66 61 69 6c 65 64 20 74 6f 20 72 65 6d 6f 76   failed to remov
12f60 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e  e connection han
12f70 64 6c 65 20 5c 22 22 20 24 63 6f 6e 6e 65 63 74  dle \"" $connect
12f80 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ion \..         
12f90 20 20 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22     "\", error: "
12fa0 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d   \n\t $error \n]
12fb0 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
12fc0 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 61 64  .....    proc ad
12fd0 64 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20  dDbConnection { 
12fe0 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 76 61 72 4e  connection {varN
12ff0 61 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a 20 20 20  ame db} } {..   
13000 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
13010 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65  TE: Refer to the
13020 20 73 70 65 63 69 66 69 65 64 20 76 61 72 69 61   specified varia
13030 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22 29 20  ble (e.g. "db") 
13040 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f  in the context o
13050 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23 20 20  f our..      #  
13060 20 20 20 20 20 63 61 6c 6c 65 72 2e 0d 0a 20 20       caller...  
13070 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76      #..      upv
13080 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 64 62  ar 1 $varName db
13090 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
130a0 20 20 20 23 20 4e 4f 54 45 3a 20 43 72 65 61 74     # NOTE: Creat
130b0 65 20 61 20 63 6f 72 72 65 63 74 6c 79 20 66 6f  e a correctly fo
130c0 72 6d 61 74 74 65 64 20 6e 61 6d 65 20 66 6f 72  rmatted name for
130d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
130e0 6e 6e 65 63 74 69 6f 6e 20 74 6f 0d 0a 20 20 20  nnection to..   
130f0 20 20 20 23 20 20 20 20 20 20 20 62 65 20 61 64     #       be ad
13100 64 65 64 20 74 6f 20 74 68 65 20 6c 69 73 74 20  ded to the list 
13110 6d 61 6e 61 67 65 64 20 62 79 20 74 68 65 20 45  managed by the E
13120 61 67 6c 65 20 69 6e 74 65 72 70 72 65 74 65 72  agle interpreter
13130 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
13140 20 20 73 65 74 20 64 62 20 5b 6f 62 6a 65 63 74    set db [object
13150 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
13160 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
13170 20 20 20 20 20 20 20 45 61 67 6c 65 2e 5f 43 6f         Eagle._Co
13180 6d 70 6f 6e 65 6e 74 73 2e 50 72 69 76 61 74 65  mponents.Private
13190 2e 46 6f 72 6d 61 74 4f 70 73 20 44 61 74 61 62  .FormatOps Datab
131a0 61 73 65 4f 62 6a 65 63 74 4e 61 6d 65 20 24 63  aseObjectName $c
131b0 6f 6e 6e 65 63 74 69 6f 6e 20 5c 0d 0a 20 20 20  onnection \..   
131c0 20 20 20 20 20 20 20 53 51 4c 69 74 65 43 6f 6e         SQLiteCon
131d0 6e 65 63 74 69 6f 6e 20 5b 6f 62 6a 65 63 74 20  nection [object 
131e0 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72 65 74  invoke Interpret
131f0 65 72 2e 47 65 74 41 63 74 69 76 65 20 4e 65 78  er.GetActive Nex
13200 74 49 64 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 23  tId]]....      #
13210 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
13220 41 64 64 20 74 68 65 20 64 61 74 61 62 61 73 65  Add the database
13230 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 76   connection prov
13240 69 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c  ided by our call
13250 65 72 20 74 6f 20 74 68 65 20 6c 69 73 74 0d 0a  er to the list..
13260 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 66        #       of
13270 20 74 68 6f 73 65 20 6b 6e 6f 77 6e 20 74 6f 20   those known to 
13280 74 68 65 20 45 61 67 6c 65 20 69 6e 74 65 72 70  the Eagle interp
13290 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d  reter...      #.
132a0 0a 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e  .      object in
132b0 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
132c0 50 75 62 6c 69 63 20 49 6e 74 65 72 70 72 65 74  Public Interpret
132d0 65 72 2e 47 65 74 41 63 74 69 76 65 2e 63 6f 6e  er.GetActive.con
132e0 6e 65 63 74 69 6f 6e 73 20 41 64 64 20 5c 0d 0a  nections Add \..
132f0 20 20 20 20 20 20 20 20 20 20 24 64 62 20 24 63            $db $c
13300 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20 7d  onnection..    }
13310 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
13320 74 52 6f 77 73 46 72 6f 6d 44 61 74 61 54 61 62  tRowsFromDataTab
13330 6c 65 20 7b 20 64 61 74 61 54 61 62 6c 65 20 7d  le { dataTable }
13340 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 72 6f   {..      set ro
13350 77 73 20 5b 6c 69 73 74 5d 0d 0a 20 20 20 20 20  ws [list]..     
13360 20 73 65 74 20 63 6f 75 6e 74 20 5b 24 64 61 74   set count [$dat
13370 61 54 61 62 6c 65 20 43 6f 6c 75 6d 6e 73 2e 43  aTable Columns.C
13380 6f 75 6e 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 66  ount]....      f
13390 6f 72 20 7b 73 65 74 20 69 6e 64 65 78 20 30 7d  or {set index 0}
133a0 20 7b 24 69 6e 64 65 78 20 3c 20 24 63 6f 75 6e   {$index < $coun
133b0 74 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20  t} {incr index} 
133c0 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 64  {..        set d
133d0 61 74 61 43 6f 6c 75 6d 6e 20 5b 24 64 61 74 61  ataColumn [$data
133e0 54 61 62 6c 65 20 2d 61 6c 69 61 73 20 43 6f 6c  Table -alias Col
133f0 75 6d 6e 73 2e 67 65 74 5f 49 74 65 6d 20 24 69  umns.get_Item $i
13400 6e 64 65 78 5d 0d 0a 20 20 20 20 20 20 20 20 73  ndex]..        s
13410 65 74 20 6e 61 6d 65 73 28 24 69 6e 64 65 78 29  et names($index)
13420 20 5b 24 64 61 74 61 43 6f 6c 75 6d 6e 20 43 6f   [$dataColumn Co
13430 6c 75 6d 6e 4e 61 6d 65 5d 0d 0a 20 20 20 20 20  lumnName]..     
13440 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 6f 62 6a 65   }....      obje
13450 63 74 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61  ct foreach -alia
13460 73 20 64 61 74 61 52 6f 77 20 5b 73 65 74 20 64  s dataRow [set d
13470 61 74 61 52 6f 77 73 20 5b 24 64 61 74 61 54 61  ataRows [$dataTa
13480 62 6c 65 20 52 6f 77 73 5d 5d 20 7b 0d 0a 20 20  ble Rows]] {..  
13490 20 20 20 20 20 20 73 65 74 20 72 6f 77 20 5b 6c        set row [l
134a0 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ist]....        
134b0 66 6f 72 20 7b 73 65 74 20 69 6e 64 65 78 20 30  for {set index 0
134c0 7d 20 7b 24 69 6e 64 65 78 20 3c 20 24 63 6f 75  } {$index < $cou
134d0 6e 74 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d  nt} {incr index}
134e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
134f0 74 20 76 61 6c 75 65 20 5b 24 64 61 74 61 52 6f  t value [$dataRo
13500 77 20 2d 63 72 65 61 74 65 20 2d 61 6c 69 61 73  w -create -alias
13510 20 67 65 74 5f 49 74 65 6d 20 24 69 6e 64 65 78   get_Item $index
13520 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  ]....          i
13530 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
13540 68 20 24 76 61 6c 75 65 5d 20 3e 20 30 20 26 26  h $value] > 0 &&
13550 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
13560 20 20 21 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b    ![object invok
13570 65 20 43 6f 6e 76 65 72 74 20 49 73 44 42 4e 75  e Convert IsDBNu
13580 6c 6c 20 24 76 61 6c 75 65 5d 7d 20 74 68 65 6e  ll $value]} then
13590 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
135a0 6c 61 70 70 65 6e 64 20 72 6f 77 20 5b 6c 69 73  lappend row [lis
135b0 74 20 24 6e 61 6d 65 73 28 24 69 6e 64 65 78 29  t $names($index)
135c0 20 5b 24 76 61 6c 75 65 20 54 6f 53 74 72 69 6e   [$value ToStrin
135d0 67 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  g]]..          }
135e0 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
135f0 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 6f 77       lappend row
13600 20 5b 6c 69 73 74 20 24 6e 61 6d 65 73 28 24 69   [list $names($i
13610 6e 64 65 78 29 5d 0d 0a 20 20 20 20 20 20 20 20  ndex)]..        
13620 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
13630 0d 0a 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e  ..        lappen
13640 64 20 72 6f 77 73 20 24 72 6f 77 0d 0a 20 20 20  d rows $row..   
13650 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
13660 74 75 72 6e 20 24 72 6f 77 73 0d 0a 20 20 20 20  turn $rows..    
13670 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 64  }.....    proc d
13680 75 6d 70 52 6f 77 73 46 72 6f 6d 44 61 74 61 54  umpRowsFromDataT
13690 61 62 6c 65 20 7b 20 63 68 61 6e 6e 65 6c 20 72  able { channel r
136a0 6f 77 73 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73  ows } {..      s
136b0 65 74 20 73 65 71 75 65 6e 63 65 20 31 0d 0a 0d  et sequence 1...
136c0 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72  .      foreach r
136d0 6f 77 20 24 72 6f 77 73 20 7b 0d 0a 20 20 20 20  ow $rows {..    
136e0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
136f0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
13700 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 65  ..            [e
13710 78 70 72 20 7b 24 73 65 71 75 65 6e 63 65 20 3e  xpr {$sequence >
13720 20 31 20 3f 20 22 5c 6e 22 20 3a 20 22 22 7d 5d   1 ? "\n" : ""}]
13730 20 22 2d 2d 2d 2d 20 52 4f 57 20 23 22 20 24 73   "---- ROW #" $s
13740 65 71 75 65 6e 63 65 20 3a 5c 6e 5d 0d 0a 0d 0a  equence :\n]....
13750 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
13760 70 61 69 72 20 24 72 6f 77 20 7b 0d 0a 20 20 20  pair $row {..   
13770 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e         if {[llen
13780 67 74 68 20 24 70 61 69 72 5d 20 3e 3d 20 32 7d  gth $pair] >= 2}
13790 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
137a0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
137b0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
137c0 5c 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  \t \..          
137d0 20 20 20 20 20 20 5b 6c 69 73 74 20 5b 6c 69 6e        [list [lin
137e0 64 65 78 20 24 70 61 69 72 20 30 5d 5d 20 22 3a  dex $pair 0]] ":
137f0 20 22 20 5b 6c 69 73 74 20 5b 6c 69 6e 64 65 78   " [list [lindex
13800 20 24 70 61 69 72 20 31 5d 5d 20 5c 6e 5d 0d 0a   $pair 1]] \n]..
13810 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
13820 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 70 61  if {[llength $pa
13830 69 72 5d 20 3d 3d 20 31 7d 20 74 68 65 6e 20 7b  ir] == 1} then {
13840 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
13850 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
13860 70 65 6e 64 41 72 67 73 20 5c 74 20 5c 0d 0a 20  pendArgs \t \.. 
13870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
13880 6c 69 73 74 20 5b 6c 69 6e 64 65 78 20 24 70 61  list [lindex $pa
13890 69 72 20 30 5d 5d 20 22 3a 20 3c 6e 75 6c 6c 3e  ir 0]] ": <null>
138a0 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
138b0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
138c0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
138d0 6e 6e 65 6c 20 5c 74 3c 65 6d 70 74 79 3e 5c 6e  nnel \t<empty>\n
138e0 3b 20 23 20 4e 4f 54 45 3a 20 4e 6f 20 64 61 74  ; # NOTE: No dat
138f0 61 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  a?..          }.
13900 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
13910 20 20 20 20 20 20 69 6e 63 72 20 73 65 71 75 65        incr seque
13920 6e 63 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  nce..      }..  
13930 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
13940 20 63 6c 65 61 6e 75 70 44 62 20 7b 20 66 69 6c   cleanupDb { fil
13950 65 4e 61 6d 65 20 7b 76 61 72 4e 61 6d 65 20 64  eName {varName d
13960 62 7d 20 7b 63 6f 6c 6c 65 63 74 20 74 72 75 65  b} {collect true
13970 7d 20 7b 71 75 61 6c 69 66 79 20 74 72 75 65 7d  } {qualify true}
13980 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
13990 20 20 20 20 20 20 20 7b 64 65 6c 65 74 65 20 74         {delete t
139a0 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  rue} } {..      
139b0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
139c0 20 41 74 74 65 6d 70 74 20 74 6f 20 66 6f 72 63   Attempt to forc
139d0 65 20 61 6c 6c 20 70 65 6e 64 69 6e 67 20 22 67  e all pending "g
139e0 61 72 62 61 67 65 22 20 6f 62 6a 65 63 74 73 20  arbage" objects 
139f0 74 6f 20 62 65 20 63 6f 6c 6c 65 63 74 65 64 2c  to be collected,
13a00 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
13a10 69 6e 63 6c 75 64 69 6e 67 20 53 51 4c 69 74 65  including SQLite
13a20 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6e 64 20   statements and 
13a30 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 3b 20  backup objects; 
13a40 74 68 69 73 20 73 68 6f 75 6c 64 20 61 6c 6c 6f  this should allo
13a50 77 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  w..      #      
13a60 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
13a70 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
13a80 20 62 65 20 64 65 6c 65 74 65 64 2e 0d 0a 20 20   be deleted...  
13a90 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
13aa0 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65 6e 20  {$collect} then 
13ab0 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c 6c 65  {..        colle
13ac0 63 74 47 61 72 62 61 67 65 20 24 3a 3a 74 65 73  ctGarbage $::tes
13ad0 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20  t_channel..     
13ae0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
13af0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66       # NOTE: Ref
13b00 65 72 20 74 6f 20 74 68 65 20 73 70 65 63 69 66  er to the specif
13b10 69 65 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e  ied variable (e.
13b20 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65 20  g. "db") in the 
13b30 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a  context of our..
13b40 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61        #       ca
13b50 6c 6c 65 72 2e 20 20 54 68 65 20 68 61 6e 64 6c  ller.  The handl
13b60 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
13b70 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65  e previously ope
13b80 6e 65 64 20 76 69 61 20 74 68 65 0d 0a 20 20 20  ned via the..   
13b90 20 20 20 23 20 20 20 20 20 20 20 5b 73 65 74 75     #       [setu
13ba0 70 44 62 5d 20 70 72 6f 63 65 64 75 72 65 20 73  pDb] procedure s
13bb0 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20  hould be stored 
13bc0 74 68 65 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d  there...      #.
13bd0 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24  .      upvar 1 $
13be0 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20  varName db....  
13bf0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
13c00 4f 54 45 3a 20 43 6c 6f 73 65 20 74 68 65 20 63  OTE: Close the c
13c10 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65  onnection to the
13c20 20 64 61 74 61 62 61 73 65 20 6e 6f 77 2e 20 20   database now.  
13c30 54 68 69 73 20 73 68 6f 75 6c 64 20 61 6c 6c 6f  This should allo
13c40 77 20 75 73 0d 0a 20 20 20 20 20 20 23 20 20 20  w us..      #   
13c50 20 20 20 20 74 6f 20 64 65 6c 65 74 65 20 74 68      to delete th
13c60 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
13c70 61 62 61 73 65 20 66 69 6c 65 2e 0d 0a 20 20 20  abase file...   
13c80 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
13c90 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 64 62 5d  [info exists db]
13ca0 20 26 26 20 5b 63 61 74 63 68 20 7b 73 71 6c 20   && [catch {sql 
13cb0 63 6c 6f 73 65 20 24 64 62 7d 20 65 72 72 6f 72  close $db} error
13cc0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
13cd0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
13ce0 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77  NOTE: We somehow
13cf0 20 66 61 69 6c 65 64 20 74 6f 20 63 6c 6f 73 65   failed to close
13d00 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 72   the database, r
13d10 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20  eport why...    
13d20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74      #..        t
13d30 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
13d40 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
13d50 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
13d60 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
13d70 61 69 6c 65 64 20 74 6f 20 63 6c 6f 73 65 20 64  ailed to close d
13d80 61 74 61 62 61 73 65 20 5c 22 22 20 24 64 62 20  atabase \"" $db 
13d90 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d  "\", error: " \.
13da0 0a 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c  .            \n\
13db0 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20  t $error \n]..  
13dc0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
13dd0 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
13de0 46 69 72 73 74 2c 20 73 65 65 20 69 66 20 6f 75  First, see if ou
13df0 72 20 63 61 6c 6c 65 72 20 68 61 73 20 72 65 71  r caller has req
13e00 75 65 73 74 65 64 20 61 6e 20 69 6e 2d 6d 65 6d  uested an in-mem
13e10 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0d 0a 20  ory database... 
13e20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65       #..      se
13e30 74 20 69 73 4d 65 6d 6f 72 79 20 5b 69 73 4d 65  t isMemory [isMe
13e40 6d 6f 72 79 44 62 20 24 66 69 6c 65 4e 61 6d 65  moryDb $fileName
13e50 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ]....      #..  
13e60 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c      # NOTE: Buil
13e70 64 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 20  d the full path 
13e80 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
13e90 66 69 6c 65 20 6e 61 6d 65 2e 20 20 46 6f 72 20  file name.  For 
13ea0 6e 6f 77 2c 20 61 6c 6c 20 74 65 73 74 0d 0a 20  now, all test.. 
13eb0 20 20 20 20 20 23 20 20 20 20 20 20 20 64 61 74       #       dat
13ec0 61 62 61 73 65 20 66 69 6c 65 73 20 61 72 65 20  abase files are 
13ed0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 74 65  stored in the te
13ee0 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72  mporary director
13ef0 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  y...      #..   
13f00 20 20 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72     if {!$isMemor
13f10 79 20 26 26 20 24 71 75 61 6c 69 66 79 7d 20 74  y && $qualify} t
13f20 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  hen {..        s
13f30 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c  et fileName [fil
13f40 65 20 6a 6f 69 6e 20 5b 67 65 74 44 61 74 61 62  e join [getDatab
13f50 61 73 65 44 69 72 65 63 74 6f 72 79 5d 20 5b 66  aseDirectory] [f
13f60 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61  ile tail $fileNa
13f70 6d 65 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  me]]..      }...
13f80 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
13f90 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66  # NOTE: Check if
13fa0 20 74 68 65 20 66 69 6c 65 20 73 74 69 6c 6c 20   the file still 
13fb0 65 78 69 73 74 73 2e 0d 0a 20 20 20 20 20 20 23  exists...      #
13fc0 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 69 73  ..      if {!$is
13fd0 4d 65 6d 6f 72 79 20 26 26 20 24 64 65 6c 65 74  Memory && $delet
13fe0 65 20 26 26 20 5b 66 69 6c 65 20 65 78 69 73 74  e && [file exist
13ff0 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  s $fileName]} th
14000 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
14010 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
14020 20 53 6b 69 70 20 64 65 6c 65 74 69 6e 67 20 64   Skip deleting d
14030 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 69 66  atabase files if
14040 20 73 6f 6d 65 62 6f 64 79 20 73 65 74 73 20 74   somebody sets t
14050 68 65 20 67 6c 6f 62 61 6c 0d 0a 20 20 20 20 20  he global..     
14060 20 20 20 23 20 20 20 20 20 20 20 76 61 72 69 61     #       varia
14070 62 6c 65 20 74 6f 20 70 72 65 76 65 6e 74 20 69  ble to prevent i
14080 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
14090 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
140a0 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6c  o exists ::no(cl
140b0 65 61 6e 75 70 44 62 46 69 6c 65 29 5d 7d 20 74  eanupDbFile)]} t
140c0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
140d0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
140e0 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
140f0 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 73 74   delete the test
14100 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
14110 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ow...          #
14120 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
14130 5b 73 65 74 20 63 6f 64 65 20 5b 63 61 74 63 68  [set code [catch
14140 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66   {file delete $f
14150 69 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72 5d 5d  ileName} error]]
14160 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
14170 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
14180 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20       # NOTE: We 
14190 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74  somehow failed t
141a0 6f 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c  o delete the fil
141b0 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a  e, report why...
141c0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
141d0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
141e0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
141f0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
14200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14210 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
14220 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20  ailed to delete 
14230 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 5c 22  database file \"
14240 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  " $fileName \.. 
14250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
14260 5c 22 20 64 75 72 69 6e 67 20 63 6c 65 61 6e 75  \" during cleanu
14270 70 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  p, error: " \n\t
14280 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20   $error \n]..   
14290 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
142a0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
142b0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
142c0 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20     # NOTE: Show 
142d0 74 68 61 74 20 77 65 20 73 6b 69 70 70 65 64 20  that we skipped 
142e0 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c  deleting the fil
142f0 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  e...          #.
14300 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 63  .          set c
14310 6f 64 65 20 30 0d 0a 0d 0a 20 20 20 20 20 20 20  ode 0....       
14320 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
14330 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
14340 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
14350 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
14360 49 4e 47 3a 20 73 6b 69 70 70 65 64 20 64 65 6c  ING: skipped del
14370 65 74 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  eting database f
14380 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d  ile \"" $fileNam
14390 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
143a0 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c     "\" during cl
143b0 65 61 6e 75 70 5c 6e 22 5d 0d 0a 20 20 20 20 20  eanup\n"]..     
143c0 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
143d0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
143e0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
143f0 20 54 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e   The file does n
14400 6f 74 20 65 78 69 73 74 2c 20 73 75 63 63 65 73  ot exist, succes
14410 73 21 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  s!..        #.. 
14420 20 20 20 20 20 20 20 73 65 74 20 63 6f 64 65 20         set code 
14430 30 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  0..      }....  
14440 20 20 20 20 72 65 74 75 72 6e 20 24 63 6f 64 65      return $code
14450 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
14460 70 72 6f 63 20 73 65 74 75 70 44 62 49 6e 74 65  proc setupDbInte
14470 72 72 75 70 74 43 61 6c 6c 62 61 63 6b 20 7b 20  rruptCallback { 
14480 63 68 61 6e 6e 65 6c 20 6c 6f 67 20 7d 20 7b 0d  channel log } {.
14490 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68  .      tputs $ch
144a0 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 73 65 74 74  annel "---- sett
144b0 69 6e 67 20 75 70 20 64 65 62 75 67 67 65 72 20  ing up debugger 
144c0 69 6e 74 65 72 72 75 70 74 20 63 61 6c 6c 62 61  interrupt callba
144d0 63 6b 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  ck... "....     
144e0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
144f0 20 20 20 20 20 20 20 73 65 74 20 3a 3a 65 6e 76         set ::env
14500 28 71 75 69 65 74 46 69 6e 64 49 6e 74 65 72 70  (quietFindInterp
14510 72 65 74 65 72 54 65 73 74 50 61 74 68 29 20 31  reterTestPath) 1
14520 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a  ..        set ::
14530 65 6e 76 28 71 75 69 65 74 53 65 74 75 70 49 6e  env(quietSetupIn
14540 74 65 72 70 72 65 74 65 72 54 65 73 74 50 61 74  terpreterTestPat
14550 68 29 20 31 0d 0a 0d 0a 20 20 20 20 20 20 20 20  h) 1....        
14560 74 72 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  try {..         
14570 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
14580 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75 72 65 20  NOTE: Make sure 
14590 74 68 65 20 73 63 72 69 70 74 20 64 65 62 75 67  the script debug
145a0 67 65 72 20 61 6e 64 20 74 68 65 20 69 73 6f 6c  ger and the isol
145b0 61 74 65 64 20 69 6e 74 65 72 70 72 65 74 65 72  ated interpreter
145c0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
145d0 20 20 20 20 61 72 65 20 73 65 74 75 70 20 61 6e      are setup an
145e0 64 20 72 65 61 64 79 20 66 6f 72 20 75 73 65 2e  d ready for use.
145f0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
14600 20 20 20 20 20 20 20 20 20 64 65 62 75 67 20 73           debug s
14610 65 74 75 70 20 74 72 75 65 20 74 72 75 65 0d 0a  etup true true..
14620 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
14630 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
14640 20 4c 6f 61 64 20 74 68 65 20 6e 65 63 65 73 73   Load the necess
14650 61 72 79 20 70 61 63 6b 61 67 65 73 20 69 6e 74  ary packages int
14660 6f 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20 69  o the isolated i
14670 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20  nterpreter...   
14680 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
14690 20 20 20 20 64 65 62 75 67 20 65 76 61 6c 20 7b      debug eval {
146a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 61  ..            pa
146b0 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 45 61  ckage require Ea
146c0 67 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  gle..           
146d0 20 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65   package require
146e0 20 45 61 67 6c 65 2e 4c 69 62 72 61 72 79 0d 0a   Eagle.Library..
146f0 20 20 20 20 20 20 20 20 20 20 20 20 70 61 63 6b              pack
14700 61 67 65 20 72 65 71 75 69 72 65 20 45 61 67 6c  age require Eagl
14710 65 2e 54 65 73 74 0d 0a 20 20 20 20 20 20 20 20  e.Test..        
14720 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
14730 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
14740 4e 4f 54 45 3a 20 43 6f 70 79 20 74 68 65 20 6e  NOTE: Copy the n
14750 65 63 65 73 73 61 72 79 20 76 61 72 69 61 62 6c  ecessary variabl
14760 65 73 20 69 6e 74 6f 20 74 68 65 20 69 73 6f 6c  es into the isol
14770 61 74 65 64 20 69 6e 74 65 72 70 72 65 74 65 72  ated interpreter
14780 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
14790 20 20 20 20 20 20 20 20 20 20 64 65 62 75 67 20            debug 
147a0 69 6e 76 6f 6b 65 20 30 20 73 65 74 20 3a 3a 74  invoke 0 set ::t
147b0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 63 68 61  est_channel $cha
147c0 6e 6e 65 6c 3b 20 23 20 4e 4f 54 45 3a 20 46 6f  nnel; # NOTE: Fo
147d0 72 20 5b 74 70 75 74 73 5d 2e 0d 0a 20 20 20 20  r [tputs]...    
147e0 20 20 20 20 20 20 64 65 62 75 67 20 69 6e 76 6f        debug invo
147f0 6b 65 20 30 20 73 65 74 20 3a 3a 74 65 73 74 5f  ke 0 set ::test_
14800 6c 6f 67 20 24 6c 6f 67 3b 20 23 20 4e 4f 54 45  log $log; # NOTE
14810 3a 20 46 6f 72 20 5b 74 6c 6f 67 5d 2e 0d 0a 0d  : For [tlog]....
14820 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
14830 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
14840 49 6e 73 74 61 6c 6c 20 74 68 65 20 63 61 6c 6c  Install the call
14850 62 61 63 6b 20 73 63 72 69 70 74 20 74 6f 20 62  back script to b
14860 65 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20 74  e evaluated in t
14870 68 65 20 69 73 6f 6c 61 74 65 64 0d 0a 20 20 20  he isolated..   
14880 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69         #       i
14890 6e 74 65 72 70 72 65 74 65 72 20 77 68 65 6e 20  nterpreter when 
148a0 74 68 69 73 20 69 6e 74 65 72 70 72 65 74 65 72  this interpreter
148b0 20 69 73 20 69 6e 74 65 72 72 75 70 74 65 64 20   is interrupted 
148c0 62 79 20 73 63 72 69 70 74 0d 0a 20 20 20 20 20  by script..     
148d0 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6e       #       can
148e0 63 65 6c 6c 61 74 69 6f 6e 2c 20 65 74 63 2e 0d  cellation, etc..
148f0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
14900 20 20 20 20 20 20 20 20 64 65 62 75 67 20 63 61          debug ca
14910 6c 6c 62 61 63 6b 20 61 70 70 6c 79 20 7b 7b 73  llback apply {{s
14920 65 6e 64 65 72 20 65 7d 20 7b 0d 0a 20 20 20 20  ender e} {..    
14930 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
14940 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
14950 68 65 63 6b 20 69 66 20 74 68 69 73 20 63 61 6c  heck if this cal
14960 6c 62 61 63 6b 20 69 73 20 6f 6e 65 20 74 68 61  lback is one tha
14970 74 20 77 65 20 63 61 72 65 20 61 62 6f 75 74 2e  t we care about.
14980 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
14990 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
149a0 7b 22 43 61 6e 63 65 6c 65 64 22 20 69 6e 20 5b  {"Canceled" in [
149b0 73 70 6c 69 74 20 5b 24 65 20 49 6e 74 65 72 72  split [$e Interr
149c0 75 70 74 54 79 70 65 5d 20 22 2c 20 22 5d 7d 20  uptType] ", "]} 
149d0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
149e0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
149f0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d         # NOTE: M
14a00 61 6b 65 20 73 75 72 65 20 74 68 65 20 5b 6f 62  ake sure the [ob
14a10 6a 65 63 74 5d 20 63 6f 6d 6d 61 6e 64 20 69 73  ject] command is
14a20 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 53 69 6e   available.  Sin
14a30 63 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ce..            
14a40 20 20 23 20 20 20 20 20 20 20 74 68 69 73 20 69    #       this i
14a50 73 20 61 6e 20 69 73 6f 6c 61 74 65 64 20 69 6e  s an isolated in
14a60 74 65 72 70 72 65 74 65 72 2c 20 63 68 65 63 6b  terpreter, check
14a70 20 66 6f 72 20 69 74 20 74 68 65 20 68 61 72 64   for it the hard
14a80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
14a90 23 20 20 20 20 20 20 20 77 61 79 2e 0d 0a 20 20  #       way...  
14aa0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
14ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
14ac0 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66 6f 20  {[llength [info 
14ad0 63 6f 6d 6d 61 6e 64 73 20 6f 62 6a 65 63 74 5d  commands object]
14ae0 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
14af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
14b00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
14b10 20 20 23 20 4e 4f 54 45 3a 20 49 74 65 72 61 74    # NOTE: Iterat
14b20 65 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 64 61  e through all da
14b30 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
14b40 6e 73 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 65 0d  ns known to the.
14b50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14b60 20 23 20 20 20 20 20 20 20 70 61 72 65 6e 74 20   #       parent 
14b70 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20  interpreter...  
14b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
14b90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14ba0 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20   object foreach 
14bb0 2d 61 6c 69 61 73 20 70 61 69 72 20 5b 6f 62 6a  -alias pair [obj
14bc0 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
14bd0 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
14be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bf0 20 20 20 20 24 65 20 49 6e 74 65 72 70 72 65 74      $e Interpret
14c00 65 72 2e 63 6f 6e 6e 65 63 74 69 6f 6e 73 5d 20  er.connections] 
14c10 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
14c20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
14c30 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
14c40 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 63 61 6e  : Attempt to can
14c50 63 65 6c 20 61 6e 79 20 53 51 4c 20 71 75 65 72  cel any SQL quer
14c60 69 65 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20  ies in progress 
14c70 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  on..            
14c80 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
14c90 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  is database conn
14ca0 65 63 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20  ection...       
14cb0 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
14cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14cd0 69 66 20 7b 5b 63 61 74 63 68 20 7b 24 70 61 69  if {[catch {$pai
14ce0 72 20 56 61 6c 75 65 2e 43 61 6e 63 65 6c 7d 20  r Value.Cancel} 
14cf0 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a  error]} then {..
14d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d10 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
14d20 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
14d30 64 41 72 67 73 20 5c 6e 20 5c 0d 0a 20 20 20 20  dArgs \n \..    
14d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d50 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
14d60 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 63 61 6e  G: failed to can
14d70 63 65 6c 20 71 75 65 72 79 20 66 6f 72 20 22 20  cel query for " 
14d80 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
14d90 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 6e 6e             "conn
14da0 65 63 74 69 6f 6e 20 5c 22 22 20 5b 24 70 61 69  ection \"" [$pai
14db0 72 20 4b 65 79 5d 20 22 5c 22 2c 20 65 72 72 6f  r Key] "\", erro
14dc0 72 3a 20 22 20 5c 6e 5c 74 20 5c 0d 0a 20 20 20  r: " \n\t \..   
14dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14de0 20 20 20 20 20 24 65 72 72 6f 72 20 5c 6e 5d 0d       $error \n].
14df0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14e00 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
14e10 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
14e20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
14e30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14e40 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
14e50 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
14e60 67 73 20 5c 6e 20 5c 0d 0a 20 20 20 20 20 20 20  gs \n \..       
14e70 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
14e80 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 63 61 6e 6e  == WARNING: cann
14e90 6f 74 20 63 61 6e 63 65 6c 20 61 6e 79 20 71 75  ot cancel any qu
14ea0 65 72 69 65 73 3a 20 22 20 5c 0d 0a 20 20 20 20  eries: " \..    
14eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ec0 22 74 68 65 20 5c 22 6f 62 6a 65 63 74 5c 22 20  "the \"object\" 
14ed0 63 6f 6d 6d 61 6e 64 20 69 73 20 6e 6f 74 20 61  command is not a
14ee0 76 61 69 6c 61 62 6c 65 5c 6e 22 5d 0d 0a 20 20  vailable\n"]..  
14ef0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
14f00 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
14f10 20 20 20 20 20 20 20 20 7d 7d 0d 0a 20 20 20 20          }}..    
14f20 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0d      } finally {.
14f30 0a 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68  .          catch
14f40 20 7b 75 6e 73 65 74 20 3a 3a 65 6e 76 28 71 75   {unset ::env(qu
14f50 69 65 74 53 65 74 75 70 49 6e 74 65 72 70 72 65  ietSetupInterpre
14f60 74 65 72 54 65 73 74 50 61 74 68 29 7d 0d 0a 20  terTestPath)}.. 
14f70 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b           catch {
14f80 75 6e 73 65 74 20 3a 3a 65 6e 76 28 71 75 69 65  unset ::env(quie
14f90 74 46 69 6e 64 49 6e 74 65 72 70 72 65 74 65 72  tFindInterpreter
14fa0 54 65 73 74 50 61 74 68 29 7d 0d 0a 20 20 20 20  TestPath)}..    
14fb0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65      }..      } e
14fc0 72 72 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  rror] == 0} then
14fd0 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43   {..        addC
14fe0 6f 6e 73 74 72 61 69 6e 74 20 69 6e 74 65 72 72  onstraint interr
14ff0 75 70 74 43 61 6c 6c 62 61 63 6b 2e 73 71 6c 69  uptCallback.sqli
15000 74 65 33 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74  te3....        t
15010 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65  puts $channel ye
15020 73 5c 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  s\n..      } els
15030 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e {..        tpu
15040 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
15050 65 6e 64 41 72 67 73 20 22 6e 6f 2c 20 65 72 72  endArgs "no, err
15060 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f  or: " \n\t $erro
15070 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  r \n]..      }..
15080 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
15090 6f 63 20 63 6c 65 61 6e 75 70 46 69 6c 65 20 7b  oc cleanupFile {
150a0 20 66 69 6c 65 4e 61 6d 65 20 7b 63 6f 6c 6c 65   fileName {colle
150b0 63 74 20 74 72 75 65 7d 20 7b 66 6f 72 63 65 20  ct true} {force 
150c0 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20  false} } {..    
150d0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
150e0 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 66 6f  E: Attempt to fo
150f0 72 63 65 20 61 6c 6c 20 70 65 6e 64 69 6e 67 20  rce all pending 
15100 22 67 61 72 62 61 67 65 22 20 6f 62 6a 65 63 74  "garbage" object
15110 73 20 74 6f 20 62 65 20 63 6f 6c 6c 65 63 74 65  s to be collecte
15120 64 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  d,..      #     
15130 20 20 69 6e 63 6c 75 64 69 6e 67 20 53 51 4c 69    including SQLi
15140 74 65 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6e  te statements an
15150 64 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73  d backup objects
15160 3b 20 74 68 69 73 20 73 68 6f 75 6c 64 20 61 6c  ; this should al
15170 6c 6f 77 0d 0a 20 20 20 20 20 20 23 20 20 20 20  low..      #    
15180 20 20 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e     the underlyin
15190 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
151a0 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 0d 0a  to be deleted...
151b0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
151c0 66 20 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65  f {$collect} the
151d0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c  n {..        col
151e0 6c 65 63 74 47 61 72 62 61 67 65 20 24 3a 3a 74  lectGarbage $::t
151f0 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20  est_channel..   
15200 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
15210 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43  .      # NOTE: C
15220 68 65 63 6b 20 69 66 20 74 68 65 20 66 69 6c 65  heck if the file
15230 20 73 74 69 6c 6c 20 65 78 69 73 74 73 2e 0d 0a   still exists...
15240 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
15250 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20  f {[file exists 
15260 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  $fileName]} then
15270 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
15280 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
15290 6b 69 70 20 64 65 6c 65 74 69 6e 67 20 74 65 73  kip deleting tes
152a0 74 20 66 69 6c 65 73 20 69 66 20 73 6f 6d 65 62  t files if someb
152b0 6f 64 79 20 73 65 74 73 20 74 68 65 20 67 6c 6f  ody sets the glo
152c0 62 61 6c 20 76 61 72 69 61 62 6c 65 0d 0a 20 20  bal variable..  
152d0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f        #       to
152e0 20 70 72 65 76 65 6e 74 20 69 74 2e 0d 0a 20 20   prevent it...  
152f0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
15300 20 69 66 20 7b 24 66 6f 72 63 65 20 7c 7c 20 21   if {$force || !
15310 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
15320 6f 28 63 6c 65 61 6e 75 70 46 69 6c 65 29 5d 7d  o(cleanupFile)]}
15330 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
15340 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
15350 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
15360 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  to delete the te
15370 73 74 20 66 69 6c 65 20 6e 6f 77 2e 0d 0a 20 20  st file now...  
15380 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
15390 20 20 20 20 20 69 66 20 7b 5b 73 65 74 20 63 6f       if {[set co
153a0 64 65 20 5b 63 61 74 63 68 20 7b 66 69 6c 65 20  de [catch {file 
153b0 64 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65  delete $fileName
153c0 7d 20 65 72 72 6f 72 5d 5d 7d 20 74 68 65 6e 20  } error]]} then 
153d0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  {..            #
153e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
153f0 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77  NOTE: We somehow
15400 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74   failed to delet
15410 65 20 74 68 65 20 66 69 6c 65 2c 20 72 65 70 6f  e the file, repo
15420 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20  rt why...       
15430 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
15440 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
15450 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
15460 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
15470 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
15480 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
15490 6f 20 64 65 6c 65 74 65 20 74 65 73 74 20 66 69  o delete test fi
154a0 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65  le \"" $fileName
154b0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
154c0 20 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63      "\" during c
154d0 6c 65 61 6e 75 70 2c 20 65 72 72 6f 72 3a 20 22  leanup, error: "
154e0 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d   \n\t $error \n]
154f0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
15500 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
15510 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
15520 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
15530 53 68 6f 77 20 74 68 61 74 20 77 65 20 73 6b 69  Show that we ski
15540 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20 74 68  pped deleting th
15550 65 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20  e file...       
15560 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
15570 73 65 74 20 63 6f 64 65 20 30 0d 0a 0d 0a 20 20  set code 0....  
15580 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
15590 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
155a0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
155b0 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
155c0 20 57 41 52 4e 49 4e 47 3a 20 73 6b 69 70 70 65   WARNING: skippe
155d0 64 20 64 65 6c 65 74 69 6e 67 20 74 65 73 74 20  d deleting test 
155e0 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61  file \"" $fileNa
155f0 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
15600 20 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63      "\" during c
15610 6c 65 61 6e 75 70 5c 6e 22 5d 0d 0a 20 20 20 20  leanup\n"]..    
15620 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65      }..      } e
15630 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
15640 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
15650 3a 20 54 68 65 20 66 69 6c 65 20 64 6f 65 73 20  : The file does 
15660 6e 6f 74 20 65 78 69 73 74 2c 20 73 75 63 63 65  not exist, succe
15670 73 73 21 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ss!..        #..
15680 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 64 65          set code
15690 20 30 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   0..      }.... 
156a0 20 20 20 20 20 72 65 74 75 72 6e 20 24 63 6f 64       return $cod
156b0 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  e..    }.....   
156c0 20 70 72 6f 63 20 63 6f 6c 6c 65 63 74 47 61 72   proc collectGar
156d0 62 61 67 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7b  bage { channel {
156e0 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 31 30 30  milliseconds 100
156f0 30 7d 20 7b 71 75 69 65 74 20 74 72 75 65 7d 20  0} {quiet true} 
15700 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  } {..      if {[
15710 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74  haveSQLiteObject
15720 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b  Command]} then {
15730 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
15740 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
15750 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
15760 47 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72  GC GetTotalMemor
15770 79 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20  y false..       
15780 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d   } result] == 0}
15790 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
157a0 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
157b0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
157c0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
157d0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
157e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
157f0 20 20 22 2d 2d 2d 2d 20 6d 65 6d 6f 72 79 20 69    "---- memory i
15800 6e 20 75 73 65 20 62 79 20 74 68 65 20 43 4c 52  n use by the CLR
15810 20 62 65 66 6f 72 65 20 63 6f 6c 6c 65 63 74 69   before collecti
15820 6f 6e 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20  on... " \..     
15830 20 20 20 20 20 20 20 20 20 20 20 24 72 65 73 75             $resu
15840 6c 74 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a  lt " bytes\n"]..
15850 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
15860 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
15870 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
15880 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
15890 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
158a0 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
158b0 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 67 65  NG: failed to ge
158c0 74 20 43 4c 52 20 6d 65 6d 6f 72 79 20 75 73 61  t CLR memory usa
158d0 67 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a  ge, error: " \..
158e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e                \n
158f0 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a  \t $result \n]..
15900 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
15910 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 23 23 23   }....      ####
15920 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15930 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15940 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15950 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15960 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20 20 23  #####....      #
15970 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
15980 52 65 70 65 61 74 65 64 6c 79 20 61 74 74 65 6d  Repeatedly attem
15990 70 74 20 74 6f 20 63 6f 6c 6c 65 63 74 20 67 61  pt to collect ga
159a0 72 62 61 67 65 20 75 6e 74 69 6c 20 74 68 65 20  rbage until the 
159b0 61 6c 6c 6f 74 74 65 64 20 6e 75 6d 62 65 72 0d  allotted number.
159c0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f  .      #       o
159d0 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 68  f milliseconds h
159e0 61 73 20 65 6c 61 70 73 65 64 2e 20 20 41 6c 77  as elapsed.  Alw
159f0 61 79 73 20 61 74 74 65 6d 70 74 20 74 6f 20 63  ays attempt to c
15a00 6f 6c 6c 65 63 74 20 67 61 72 62 61 67 65 0d 0a  ollect garbage..
15a10 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 74        #       at
15a20 20 6c 65 61 73 74 20 6f 6e 63 65 2e 0d 0a 20 20   least once...  
15a30 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
15a40 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65  {[haveSQLiteObje
15a50 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e  ctCommand]} then
15a60 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
15a70 73 74 61 72 74 20 5b 63 6c 6f 63 6b 20 73 65 63  start [clock sec
15a80 6f 6e 64 73 5d 0d 0a 20 20 20 20 20 20 20 20 73  onds]..        s
15a90 65 74 20 73 74 6f 70 20 5b 65 78 70 72 20 7b 24  et stop [expr {$
15aa0 73 74 61 72 74 20 2b 20 28 24 6d 69 6c 6c 69 73  start + ($millis
15ab0 65 63 6f 6e 64 73 20 2f 20 31 30 30 30 29 7d 5d  econds / 1000)}]
15ac0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 64 6f 20 7b  ....        do {
15ad0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
15ae0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
15af0 20 41 74 74 65 6d 70 74 20 74 6f 20 66 6f 72 63   Attempt to forc
15b00 65 20 61 20 66 75 6c 6c 20 67 61 72 62 61 67 65  e a full garbage
15b10 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 6e 6f 77 2e   collection now.
15b20 20 20 52 65 70 6f 72 74 20 61 6e 79 0d 0a 20 20    Report any..  
15b30 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
15b40 65 72 72 6f 72 20 74 68 61 74 20 69 73 20 65 6e  error that is en
15b50 63 6f 75 6e 74 65 72 65 64 20 69 66 20 77 65 20  countered if we 
15b60 66 61 69 6c 2e 0d 0a 20 20 20 20 20 20 20 20 20  fail...         
15b70 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   #..          if
15b80 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
15b90 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
15ba0 6e 76 6f 6b 65 20 47 43 20 47 65 74 54 6f 74 61  nvoke GC GetTota
15bb0 6c 4d 65 6d 6f 72 79 20 74 72 75 65 0d 0a 20 20  lMemory true..  
15bc0 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d          } error]
15bd0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
15be0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
15bf0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
15c00 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
15c10 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
15c20 47 3a 20 66 61 69 6c 65 64 20 66 75 6c 6c 20 67  G: failed full g
15c30 61 72 62 61 67 65 20 63 6f 6c 6c 65 63 74 69 6f  arbage collectio
15c40 6e 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20  n, error: " \.. 
15c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
15c60 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a  n\t $error \n]..
15c70 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
15c80 20 20 20 20 20 20 20 20 20 73 65 74 20 6e 6f 77           set now
15c90 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d   [clock seconds]
15ca0 0d 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c  ..        } whil
15cb0 65 20 7b 24 73 74 61 72 74 20 3c 3d 20 24 6e 6f  e {$start <= $no
15cc0 77 20 26 26 20 24 6e 6f 77 20 3c 20 24 73 74 6f  w && $now < $sto
15cd0 70 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  p}..      }.... 
15ce0 20 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23       ###########
15cf0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15d00 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15d10 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15d20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
15d30 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76  ..      if {[hav
15d40 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d  eSQLiteObjectCom
15d50 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  mand]} then {.. 
15d60 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
15d70 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f  h {..          o
15d80 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47 43 20  bject invoke GC 
15d90 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 66  GetTotalMemory f
15da0 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 7d 20  alse..        } 
15db0 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68  result] == 0} th
15dc0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
15dd0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
15de0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
15df0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
15e00 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
15e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
15e20 2d 2d 2d 2d 20 6d 65 6d 6f 72 79 20 69 6e 20 75  ---- memory in u
15e30 73 65 20 62 79 20 74 68 65 20 43 4c 52 20 61 66  se by the CLR af
15e40 74 65 72 20 63 6f 6c 6c 65 63 74 69 6f 6e 2e 2e  ter collection..
15e50 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  . " \..         
15e60 20 20 20 20 20 20 20 24 72 65 73 75 6c 74 20 22         $result "
15e70 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20   bytes\n"]..    
15e80 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
15e90 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
15ea0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
15eb0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
15ec0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
15ed0 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
15ee0 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 43 4c  failed to get CL
15ef0 52 20 6d 65 6d 6f 72 79 20 75 73 61 67 65 2c 20  R memory usage, 
15f00 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20  error: " \..    
15f10 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24            \n\t $
15f20 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20  result \n]..    
15f30 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
15f40 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
15f50 6f 63 20 67 65 74 53 51 4c 69 74 65 48 61 6e 64  oc getSQLiteHand
15f60 6c 65 43 6f 75 6e 74 73 20 7b 20 63 68 61 6e 6e  leCounts { chann
15f70 65 6c 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d  el {quiet false}
15f80 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20   } {..      set 
15f90 72 65 73 75 6c 74 20 5b 6c 69 73 74 5d 0d 0a 0d  result [list]...
15fa0 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65  .      if {[have
15fb0 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d  SQLiteObjectComm
15fc0 61 6e 64 5d 20 26 26 20 5b 68 61 76 65 43 6f 6e  and] && [haveCon
15fd0 73 74 72 61 69 6e 74 20 5c 0d 0a 20 20 20 20 20  straint \..     
15fe0 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 43           defineC
15ff0 6f 6e 73 74 61 6e 74 2e 53 79 73 74 65 6d 2e 44  onstant.System.D
16000 61 74 61 2e 53 51 4c 69 74 65 2e 43 4f 55 4e 54  ata.SQLite.COUNT
16010 5f 48 41 4e 44 4c 45 5d 7d 20 74 68 65 6e 20 7b  _HANDLE]} then {
16020 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
16030 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64       # NOTE: Add
16040 20 65 61 63 68 20 63 72 69 74 69 63 61 6c 20 68   each critical h
16050 61 6e 64 6c 65 20 63 6f 75 6e 74 20 74 6f 20 74  andle count to t
16060 68 65 20 72 65 73 75 6c 74 69 6e 67 20 6c 69 73  he resulting lis
16070 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
16080 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 6e         foreach n
16090 61 6d 65 20 5b 6c 69 73 74 20 63 6f 6e 6e 65 63  ame [list connec
160a0 74 69 6f 6e 43 6f 75 6e 74 20 73 74 61 74 65 6d  tionCount statem
160b0 65 6e 74 43 6f 75 6e 74 20 62 61 63 6b 75 70 43  entCount backupC
160c0 6f 75 6e 74 5d 20 7b 0d 0a 20 20 20 20 20 20 20  ount] {..       
160d0 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
160e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a  .            obj
160f0 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
16100 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
16110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16120 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
16130 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d  te.UnsafeNativeM
16140 65 74 68 6f 64 73 20 24 6e 61 6d 65 0d 0a 20 20  ethods $name..  
16150 20 20 20 20 20 20 20 20 7d 20 76 61 6c 75 65 5d          } value]
16160 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
16170 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
16180 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
16190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
161a0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
161b0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
161c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
161d0 2d 2d 2d 20 63 72 69 74 69 63 61 6c 20 68 61 6e  --- critical han
161e0 64 6c 65 20 63 6f 75 6e 74 20 5c 22 22 20 24 6e  dle count \"" $n
161f0 61 6d 65 20 22 5c 22 20 69 73 20 22 20 24 76 61  ame "\" is " $va
16200 6c 75 65 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  lue \n]..       
16210 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
16220 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65        lappend re
16230 73 75 6c 74 20 24 76 61 6c 75 65 0d 0a 20 20 20  sult $value..   
16240 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
16250 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
16260 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
16270 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
16280 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
16290 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
162a0 20 74 6f 20 67 65 74 20 63 72 69 74 69 63 61 6c   to get critical
162b0 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 20 5c 22   handle count \"
162c0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
162d0 20 20 20 20 20 24 6e 61 6d 65 20 22 5c 22 2c 20       $name "\", 
162e0 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 76  error: " \n\t $v
162f0 61 6c 75 65 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  alue \n]..      
16300 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
16310 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66  ..      } elseif
16320 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
16330 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
16340 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
16350 65 20 61 63 74 75 61 6c 20 68 61 6e 64 6c 65 20  e actual handle 
16360 63 6f 75 6e 74 73 20 61 72 65 20 6e 6f 74 20 61  counts are not a
16370 76 61 69 6c 61 62 6c 65 3b 20 74 68 65 72 65 66  vailable; theref
16380 6f 72 65 2c 20 6a 75 73 74 0d 0a 20 20 20 20 20  ore, just..     
16390 20 20 20 23 20 20 20 20 20 20 20 72 65 74 75 72     #       retur
163a0 6e 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e  n an empty list.
163b0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
163c0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
163d0 6e 65 6c 20 22 2d 2d 2d 2d 20 63 72 69 74 69 63  nel "---- critic
163e0 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 73  al handle counts
163f0 20 75 6e 61 76 61 69 6c 61 62 6c 65 5c 6e 22 0d   unavailable\n".
16400 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
16410 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74    return $result
16420 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
16430 70 72 6f 63 20 73 68 75 74 64 6f 77 6e 53 51 4c  proc shutdownSQL
16440 69 74 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 66  ite { channel {f
16450 6f 72 63 65 20 66 61 6c 73 65 7d 20 7b 71 75 69  orce false} {qui
16460 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  et false} } {.. 
16470 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
16480 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75 72 65 20  NOTE: Make sure 
16490 74 68 61 74 20 53 51 4c 69 74 65 20 63 6f 72 65  that SQLite core
164a0 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d 70   library is comp
164b0 6c 65 74 65 6c 79 20 73 68 75 74 64 6f 77 6e 2e  letely shutdown.
164c0 20 20 54 68 69 73 0d 0a 20 20 20 20 20 20 23 20    This..      # 
164d0 20 20 20 20 20 20 69 73 20 75 73 65 64 20 62 79        is used by
164e0 20 74 65 73 74 73 20 74 68 61 74 20 63 68 61 6e   tests that chan
164f0 67 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ge configuration
16500 20 6f 70 74 69 6f 6e 73 20 61 6e 64 2f 6f 72 20   options and/or 
16510 74 68 6f 73 65 0d 0a 20 20 20 20 20 20 23 20 20  those..      #  
16520 20 20 20 20 20 74 68 61 74 20 6e 65 65 64 20 74       that need t
16530 6f 20 6d 61 6b 65 20 73 75 72 65 20 6c 6f 67 67  o make sure logg
16540 69 6e 67 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ing is initializ
16550 65 64 20 28 69 2e 65 2e 20 6a 75 73 74 20 69 6e  ed (i.e. just in
16560 20 63 61 73 65 0d 0a 20 20 20 20 20 20 23 20 20   case..      #  
16570 20 20 20 20 20 74 68 65 20 53 51 4c 69 74 65 20       the SQLite 
16580 63 6f 72 65 20 6c 69 62 72 61 72 79 20 77 61 73  core library was
16590 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 69 6e 20   initialized in 
165a0 74 68 65 20 70 72 6f 63 65 73 73 20 70 72 69 6f  the process prio
165b0 72 20 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20  r to..      #   
165c0 20 20 20 20 74 68 65 20 53 51 4c 69 74 65 4c 6f      the SQLiteLo
165d0 67 20 63 6c 61 73 73 20 62 65 69 6e 67 20 61 62  g class being ab
165e0 6c 65 20 74 6f 20 73 65 74 75 70 20 69 74 73 20  le to setup its 
165f0 6c 6f 67 67 69 6e 67 20 63 61 6c 6c 62 61 63 6b  logging callback
16600 29 2e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  )...      #     
16610 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73    Normally, this
16620 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
16630 70 65 72 66 6f 72 6d 65 64 20 69 66 20 53 51 4c  performed if SQL
16640 69 74 65 20 69 73 20 6c 6f 61 64 65 64 20 61 6e  ite is loaded an
16650 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
16660 20 72 65 61 64 79 20 66 6f 72 20 75 73 65 20 62   ready for use b
16670 79 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  y the test suite
16680 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
16690 20 20 69 66 20 7b 24 66 6f 72 63 65 20 7c 7c 20    if {$force || 
166a0 5b 69 73 53 51 4c 69 74 65 52 65 61 64 79 5d 7d  [isSQLiteReady]}
166b0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
166c0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 42 55   #..        # BU
166d0 47 46 49 58 3a 20 4d 61 6b 65 20 73 75 72 65 20  GFIX: Make sure 
166e0 74 68 61 74 20 61 6e 79 20 22 6c 65 61 6b 65 64  that any "leaked
166f0 22 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  " transactions a
16700 6e 64 2f 6f 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  nd/or connection
16710 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  s..        #    
16720 20 20 20 20 20 61 72 65 20 63 6c 65 61 6e 65 64       are cleaned
16730 20 75 70 20 62 65 66 6f 72 65 20 63 61 6c 6c 69   up before calli
16740 6e 67 20 74 68 65 20 6e 61 74 69 76 65 20 73 68  ng the native sh
16750 75 74 64 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 2e  utdown function.
16760 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
16770 20 20 20 20 20 66 6f 72 65 61 63 68 20 74 72 61       foreach tra
16780 6e 73 61 63 74 69 6f 6e 20 5b 69 6e 66 6f 20 74  nsaction [info t
16790 72 61 6e 73 61 63 74 69 6f 6e 73 5d 20 7b 0d 0a  ransactions] {..
167a0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73            if {[s
167b0 74 72 69 6e 67 20 6d 61 74 63 68 20 5c 0d 0a 20  tring match \.. 
167c0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
167d0 74 65 6d 23 44 61 74 61 23 53 51 4c 69 74 65 23  tem#Data#SQLite#
167e0 53 51 4c 69 74 65 54 72 61 6e 73 61 63 74 69 6f  SQLiteTransactio
167f0 6e 23 2a 20 24 74 72 61 6e 73 61 63 74 69 6f 6e  n#* $transaction
16800 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
16810 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
16820 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
16830 20 20 20 73 71 6c 20 74 72 61 6e 73 61 63 74 69     sql transacti
16840 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 24 74 72 61  on rollback $tra
16850 6e 73 61 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20  nsaction..      
16860 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d 20 3d        } error] =
16870 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
16880 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
16890 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
168a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168b0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
168c0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
168d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168e0 20 20 22 2d 2d 2d 2d 20 72 6f 6c 6c 65 64 20 62    "---- rolled b
168f0 61 63 6b 20 6c 65 61 6b 65 64 20 74 72 61 6e 73  ack leaked trans
16900 61 63 74 69 6f 6e 20 5c 22 22 20 5c 0d 0a 20 20  action \"" \..  
16910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16920 20 20 24 74 72 61 6e 73 61 63 74 69 6f 6e 20 5c    $transaction \
16930 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  "\n]..          
16940 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
16950 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
16960 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
16970 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
16980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16990 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
169a0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
169b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
169c0 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
169d0 20 66 61 69 6c 65 64 20 74 6f 20 72 6f 6c 6c 62   failed to rollb
169e0 61 63 6b 20 6c 65 61 6b 65 64 20 74 72 61 6e 73  ack leaked trans
169f0 61 63 74 69 6f 6e 20 5c 22 22 20 5c 0d 0a 20 20  action \"" \..  
16a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a10 20 20 24 74 72 61 6e 73 61 63 74 69 6f 6e 20 22    $transaction "
16a20 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  \", error: " \n\
16a30 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20  t $error \n]..  
16a40 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
16a50 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
16a60 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
16a70 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
16a80 66 6f 72 65 61 63 68 20 64 62 20 5b 69 6e 66 6f  foreach db [info
16a90 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 5d 20 7b 0d   connections] {.
16aa0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
16ab0 73 74 72 69 6e 67 20 6d 61 74 63 68 20 5c 0d 0a  string match \..
16ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
16ad0 73 74 65 6d 23 44 61 74 61 23 53 51 4c 69 74 65  stem#Data#SQLite
16ae0 23 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f  #SQLiteConnectio
16af0 6e 23 2a 20 24 64 62 5d 7d 20 74 68 65 6e 20 7b  n#* $db]} then {
16b00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
16b10 20 7b 5b 63 61 74 63 68 20 7b 73 71 6c 20 63 6c   {[catch {sql cl
16b20 6f 73 65 20 24 64 62 7d 20 65 72 72 6f 72 5d 20  ose $db} error] 
16b30 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
16b40 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
16b50 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
16b60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16b70 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
16b80 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
16b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ba0 20 20 20 22 2d 2d 2d 2d 20 63 6c 6f 73 65 64 20     "---- closed 
16bb0 6c 65 61 6b 65 64 20 64 61 74 61 62 61 73 65 20  leaked database 
16bc0 5c 22 22 20 24 64 62 20 5c 22 5c 6e 5d 0d 0a 20  \"" $db \"\n].. 
16bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
16be0 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
16bf0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
16c00 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
16c10 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
16c20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
16c30 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
16c40 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
16c50 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
16c60 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
16c70 20 74 6f 20 63 6c 6f 73 65 20 6c 65 61 6b 65 64   to close leaked
16c80 20 64 61 74 61 62 61 73 65 20 5c 22 22 20 5c 0d   database \"" \.
16c90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16ca0 20 20 20 20 20 24 64 62 20 22 5c 22 2c 20 65 72       $db "\", er
16cb0 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72  ror: " \n\t $err
16cc0 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  or \n]..        
16cd0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
16ce0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
16cf0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
16d00 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
16d10 20 20 20 20 20 23 20 42 55 47 46 49 58 3a 20 42       # BUGFIX: B
16d20 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68  efore calling th
16d30 65 20 6e 61 74 69 76 65 20 73 68 75 74 64 6f 77  e native shutdow
16d40 6e 20 66 75 6e 63 74 69 6f 6e 2c 20 6d 61 6b 65  n function, make
16d50 20 73 75 72 65 20 62 6f 74 68 0d 0a 20 20 20 20   sure both..    
16d60 20 20 20 20 23 20 20 20 20 20 20 20 20 20 6f 66      #         of
16d70 20 74 68 65 20 50 52 41 47 4d 41 20 72 65 6c 61   the PRAGMA rela
16d80 74 65 64 20 64 69 72 65 63 74 6f 72 79 20 6e 61  ted directory na
16d90 6d 65 73 20 61 72 65 20 66 72 65 65 64 2e 0d 0a  mes are freed...
16da0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
16db0 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74     checkForSQLit
16dc0 65 44 69 72 65 63 74 6f 72 69 65 73 20 24 63 68  eDirectories $ch
16dd0 61 6e 6e 65 6c 20 74 72 75 65 0d 0a 0d 0a 20 20  annel true....  
16de0 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
16df0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62   {..          ob
16e00 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
16e10 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
16e20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  .              S
16e30 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
16e40 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  e.UnsafeNativeMe
16e50 74 68 6f 64 73 20 73 71 6c 69 74 65 33 5f 73 68  thods sqlite3_sh
16e60 75 74 64 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20  utdown..        
16e70 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20  } result] == 0} 
16e80 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
16e90 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
16ea0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
16eb0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
16ec0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
16ed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16ee0 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69   "---- call sqli
16ef0 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 2e 2e  te3_shutdown()..
16f00 2e 20 6f 6b 3a 20 22 20 24 72 65 73 75 6c 74 20  . ok: " $result 
16f10 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
16f20 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
16f30 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
16f40 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
16f50 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
16f60 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
16f70 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
16f80 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
16f90 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f  -- call sqlite3_
16fa0 73 68 75 74 64 6f 77 6e 28 29 2e 2e 2e 20 65 72  shutdown()... er
16fb0 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65 73  ror: " \n\t $res
16fc0 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ult \n]..       
16fd0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
16fe0 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
16ff0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 65 70  ....    proc rep
17000 6f 72 74 53 51 4c 69 74 65 52 65 73 6f 75 72 63  ortSQLiteResourc
17010 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
17020 20 20 63 68 61 6e 6e 65 6c 20 7b 71 75 69 65 74    channel {quiet
17030 20 66 61 6c 73 65 7d 20 7b 72 65 73 65 74 20 74   false} {reset t
17040 72 75 65 7d 20 7b 63 6f 6c 6c 65 63 74 20 74 72  rue} {collect tr
17050 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ue} } {..      #
17060 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
17070 49 66 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65  If available, re
17080 70 6f 72 74 20 6f 6e 20 28 61 6e 64 20 70 6f 73  port on (and pos
17090 73 69 62 6c 79 20 72 65 73 65 74 29 20 74 68 65  sibly reset) the
170a0 20 72 75 6e 74 69 6d 65 0d 0a 20 20 20 20 20 20   runtime..      
170b0 23 20 20 20 20 20 20 20 63 6f 6e 66 69 67 75 72  #       configur
170c0 61 74 69 6f 6e 20 73 74 61 74 69 73 74 69 63 73  ation statistics
170d0 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
170e0 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74    if {[haveSQLit
170f0 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 20  eObjectCommand] 
17100 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
17110 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
17120 62 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69  buildConfigurati
17130 6f 6e 2e 44 65 62 75 67 5d 20 26 26 20 5b 63 61  on.Debug] && [ca
17140 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f  tch {..        o
17150 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
17160 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d  ags +NonPublic -
17170 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20 20 20  alias \..       
17180 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
17190 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61  .SQLite.UnsafeNa
171a0 74 69 76 65 4d 65 74 68 6f 64 73 20 73 65 74 74  tiveMethods sett
171b0 69 6e 67 52 65 61 64 43 6f 75 6e 74 73 0d 0a 20  ingReadCounts.. 
171c0 20 20 20 20 20 7d 20 73 65 74 74 69 6e 67 52 65       } settingRe
171d0 61 64 43 6f 75 6e 74 73 5d 20 3d 3d 20 30 7d 20  adCounts] == 0} 
171e0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
171f0 73 65 74 20 6e 61 6d 65 43 6f 75 6e 74 20 5b 24  set nameCount [$
17200 73 65 74 74 69 6e 67 52 65 61 64 43 6f 75 6e 74  settingReadCount
17210 73 20 43 6f 75 6e 74 5d 0d 0a 20 20 20 20 20 20  s Count]..      
17220 20 20 73 65 74 20 76 61 6c 75 65 43 6f 75 6e 74    set valueCount
17230 20 30 0d 0a 0d 0a 20 20 20 20 20 20 20 20 6f 62   0....        ob
17240 6a 65 63 74 20 66 6f 72 65 61 63 68 20 2d 61 6c  ject foreach -al
17250 69 61 73 20 70 61 69 72 20 24 73 65 74 74 69 6e  ias pair $settin
17260 67 52 65 61 64 43 6f 75 6e 74 73 20 7b 0d 0a 20  gReadCounts {.. 
17270 20 20 20 20 20 20 20 20 20 69 6e 63 72 20 76 61           incr va
17280 6c 75 65 43 6f 75 6e 74 20 5b 24 70 61 69 72 20  lueCount [$pair 
17290 56 61 6c 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  Value]....      
172a0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
172b0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
172c0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
172d0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
172e0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
172f0 20 20 20 22 2d 2d 2d 2d 20 73 65 74 74 69 6e 67     "---- setting
17300 20 5c 22 22 20 5b 24 70 61 69 72 20 4b 65 79 5d   \"" [$pair Key]
17310 20 22 5c 22 20 77 61 73 20 72 65 61 64 20 22 20   "\" was read " 
17320 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
17330 20 20 20 5b 24 70 61 69 72 20 56 61 6c 75 65 5d     [$pair Value]
17340 20 22 20 74 69 6d 65 73 5c 6e 22 5d 0d 0a 20 20   " times\n"]..  
17350 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
17360 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
17370 69 66 20 7b 24 72 65 73 65 74 7d 20 74 68 65 6e  if {$reset} then
17380 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
17390 20 7b 5b 63 61 74 63 68 20 7b 24 73 65 74 74 69   {[catch {$setti
173a0 6e 67 52 65 61 64 43 6f 75 6e 74 73 20 43 6c 65  ngReadCounts Cle
173b0 61 72 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d  ar} error] == 0}
173c0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
173d0 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
173e0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
173f0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
17400 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
17410 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
17420 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 72 65          "---- re
17430 73 65 74 20 73 65 74 74 69 6e 67 20 73 74 61 74  set setting stat
17440 69 73 74 69 63 73 20 66 6f 72 20 74 68 65 20 70  istics for the p
17450 72 65 76 69 6f 75 73 20 22 20 5c 0d 0a 20 20 20  revious " \..   
17460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
17470 6e 61 6d 65 43 6f 75 6e 74 20 22 20 6e 61 6d 65  nameCount " name
17480 73 20 61 6e 64 20 22 20 24 76 61 6c 75 65 43 6f  s and " $valueCo
17490 75 6e 74 20 22 20 76 61 6c 75 65 73 20 72 65 61  unt " values rea
174a0 64 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  d\n"]..         
174b0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
174c0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
174d0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
174e0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
174f0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
17500 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
17510 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 72 65 73  G: failed to res
17520 65 74 20 73 65 74 74 69 6e 67 20 73 74 61 74 69  et setting stati
17530 73 74 69 63 73 20 66 6f 72 20 22 20 5c 0d 0a 20  stics for " \.. 
17540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
17550 74 68 65 20 70 72 65 76 69 6f 75 73 20 22 20 24  the previous " $
17560 6e 61 6d 65 43 6f 75 6e 74 20 22 20 6e 61 6d 65  nameCount " name
17570 73 20 61 6e 64 20 22 20 24 76 61 6c 75 65 43 6f  s and " $valueCo
17580 75 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  unt \..         
17590 20 20 20 20 20 20 20 22 20 76 61 6c 75 65 73 20         " values 
175a0 72 65 61 64 2c 20 65 72 72 6f 72 3a 20 22 20 5c  read, error: " \
175b0 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a  n\t $error \n]..
175c0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
175d0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
175e0 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61  ...      if {[ha
175f0 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f  veSQLiteObjectCo
17600 6d 6d 61 6e 64 5d 20 26 26 20 5b 68 61 76 65 43  mmand] && [haveC
17610 6f 6e 73 74 72 61 69 6e 74 20 5c 0d 0a 20 20 20  onstraint \..   
17620 20 20 20 20 20 20 20 20 20 20 20 64 65 66 69 6e             defin
17630 65 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74 65 6d  eConstant.System
17640 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 49 4e 54  .Data.SQLite.INT
17650 45 52 4f 50 5f 56 49 52 54 55 41 4c 5f 54 41 42  EROP_VIRTUAL_TAB
17660 4c 45 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  LE] && \..      
17670 20 20 20 20 5b 68 61 76 65 43 6f 6e 73 74 72 61      [haveConstra
17680 69 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  int \..         
17690 20 20 20 20 20 64 65 66 69 6e 65 43 6f 6e 73 74       defineConst
176a0 61 6e 74 2e 53 79 73 74 65 6d 2e 44 61 74 61 2e  ant.System.Data.
176b0 53 51 4c 69 74 65 2e 54 52 41 43 4b 5f 4d 45 4d  SQLite.TRACK_MEM
176c0 4f 52 59 5f 42 59 54 45 53 5d 7d 20 74 68 65 6e  ORY_BYTES]} then
176d0 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
176e0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
176f0 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
17700 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
17710 63 75 72 72 65 6e 74 20 6d 65 6d 6f 72 79 20 69  current memory i
17720 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74 65 4d  n use by SQLiteM
17730 65 6d 6f 72 79 2e 2e 2e 20 22 0d 0a 20 20 20 20  emory... "..    
17740 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
17750 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
17760 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
17770 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
17780 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
17790 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
177a0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
177b0 69 74 65 4d 65 6d 6f 72 79 20 62 79 74 65 73 41  iteMemory bytesA
177c0 6c 6c 6f 63 61 74 65 64 0d 0a 20 20 20 20 20 20  llocated..      
177d0 20 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30    } memory] == 0
177e0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
177f0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
17800 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
17810 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
17820 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
17830 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c  $memory " bytes\
17840 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  n"]..          }
17850 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
17860 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
17870 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e  t memory unknown
17880 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
17890 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
178a0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
178b0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
178c0 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72  ppendArgs $memor
178d0 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  y \n]..         
178e0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
178f0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71  .        if {!$q
17900 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
17910 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
17920 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 6d 61 78  hannel "---- max
17930 69 6d 75 6d 20 6d 65 6d 6f 72 79 20 69 6e 20 75  imum memory in u
17940 73 65 20 62 79 20 53 51 4c 69 74 65 4d 65 6d 6f  se by SQLiteMemo
17950 72 79 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 20  ry... "..       
17960 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
17970 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
17980 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
17990 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
179a0 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
179b0 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
179c0 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65  ta.SQLite.SQLite
179d0 4d 65 6d 6f 72 79 20 6d 61 78 69 6d 75 6d 42 79  Memory maximumBy
179e0 74 65 73 41 6c 6c 6f 63 61 74 65 64 0d 0a 20 20  tesAllocated..  
179f0 20 20 20 20 20 20 7d 20 6d 65 6d 6f 72 79 5d 20        } memory] 
17a00 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
17a10 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
17a20 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
17a30 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
17a40 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
17a50 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20 62 79  rgs $memory " by
17a60 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  tes\n"]..       
17a70 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
17a80 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
17a90 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b    set memory unk
17aa0 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nown....        
17ab0 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
17ac0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
17ad0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
17ae0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
17af0 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20  emory \n]..     
17b00 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
17b10 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
17b20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
17b30 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
17b40 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
17b50 22 2d 2d 2d 2d 20 63 75 72 72 65 6e 74 20 6d 65  "---- current me
17b60 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 53  mory in use by S
17b70 51 4c 69 74 65 2e 2e 2e 20 22 0d 0a 20 20 20 20  QLite... "..    
17b80 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
17b90 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65  {[haveSQLiteObje
17ba0 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e  ctCommand]} then
17bb0 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
17bc0 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
17bd0 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
17be0 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
17bf0 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
17c00 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
17c10 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61  .SQLite.UnsafeNa
17c20 74 69 76 65 4d 65 74 68 6f 64 73 20 73 71 6c 69  tiveMethods sqli
17c30 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 0d  te3_memory_used.
17c40 0a 20 20 20 20 20 20 20 20 7d 20 6d 65 6d 6f 72  .        } memor
17c50 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  y] == 0} then {.
17c60 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
17c70 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
17c80 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
17c90 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
17ca0 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22  ndArgs $memory "
17cb0 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20   bytes\n"]..    
17cc0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
17cd0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
17ce0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
17cf0 20 20 23 20 4e 4f 54 45 3a 20 4d 61 79 62 65 20    # NOTE: Maybe 
17d00 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20  the SQLite core 
17d10 6c 69 62 72 61 72 79 20 69 73 20 75 6e 61 76 61  library is unava
17d20 69 6c 61 62 6c 65 3f 0d 0a 20 20 20 20 20 20 20  ilable?..       
17d30 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
17d40 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f  set memory unkno
17d50 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  wn....          
17d60 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
17d70 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
17d80 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
17d90 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d  [appendArgs $mem
17da0 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ory \n]..       
17db0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
17dc0 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
17dd0 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d  .        set mem
17de0 6f 72 79 20 75 6e 61 76 61 69 6c 61 62 6c 65 0d  ory unavailable.
17df0 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
17e00 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
17e10 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
17e20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
17e30 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d  Args $memory \n]
17e40 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
17e50 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65     }....      se
17e60 74 20 72 65 73 75 6c 74 20 24 6d 65 6d 6f 72 79  t result $memory
17e70 3b 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e  ; # NOTE: Return
17e80 20 6d 65 6d 6f 72 79 20 69 6e 2d 75 73 65 20 74   memory in-use t
17e90 6f 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 0d  o our caller....
17ea0 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69  .      if {!$qui
17eb0 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
17ec0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
17ed0 65 6c 20 22 2d 2d 2d 2d 20 6d 61 78 69 6d 75 6d  el "---- maximum
17ee0 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62   memory in use b
17ef0 79 20 53 51 4c 69 74 65 2e 2e 2e 20 22 0d 0a 20  y SQLite... ".. 
17f00 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
17f10 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f  if {[haveSQLiteO
17f20 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74  bjectCommand]} t
17f30 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
17f40 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
17f50 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
17f60 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
17f70 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
17f80 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
17f90 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66  ata.SQLite.Unsaf
17fa0 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20 5c  eNativeMethods \
17fb0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17fc0 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 68  sqlite3_memory_h
17fd0 69 67 68 77 61 74 65 72 20 30 0d 0a 20 20 20 20  ighwater 0..    
17fe0 20 20 20 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d      } memory] ==
17ff0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
18000 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
18010 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
18020 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
18030 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
18040 73 20 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65  s $memory " byte
18050 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  s\n"]..         
18060 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c   }..        } el
18070 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
18080 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
18090 4f 54 45 3a 20 4d 61 79 62 65 20 74 68 65 20 53  OTE: Maybe the S
180a0 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61  QLite core libra
180b0 72 79 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c  ry is unavailabl
180c0 65 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  e?..          #.
180d0 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6d  .          set m
180e0 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d  emory unknown...
180f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
18100 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
18110 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
18120 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
18130 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c  ndArgs $memory \
18140 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
18150 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
18160 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
18170 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75      set memory u
18180 6e 61 76 61 69 6c 61 62 6c 65 0d 0a 0d 0a 20 20  navailable....  
18190 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
181a0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
181b0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
181c0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
181d0 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20  $memory \n]..   
181e0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
181f0 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 63 6f  ...      if {$co
18200 6c 6c 65 63 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  llect} then {.. 
18210 20 20 20 20 20 20 20 63 6f 6c 6c 65 63 74 47 61         collectGa
18220 72 62 61 67 65 20 24 63 68 61 6e 6e 65 6c 0d 0a  rbage $channel..
18230 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
18240 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
18250 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  en {..        tp
18260 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d  uts $channel "--
18270 2d 2d 20 63 75 72 72 65 6e 74 20 6d 65 6d 6f 72  -- current memor
18280 79 20 69 6e 20 75 73 65 20 62 79 20 74 68 65 20  y in use by the 
18290 43 4c 52 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20  CLR... "..      
182a0 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  }....      if {[
182b0 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74  haveSQLiteObject
182c0 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b  Command]} then {
182d0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
182e0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
182f0 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
18300 47 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72  GC GetTotalMemor
18310 79 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20  y false..       
18320 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d   } memory] == 0}
18330 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
18340 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 69     if {[string i
18350 73 20 69 6e 74 65 67 65 72 20 2d 73 74 72 69 63  s integer -stric
18360 74 20 24 6d 65 6d 6f 72 79 5d 7d 20 74 68 65 6e  t $memory]} then
18370 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
18380 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
18390 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
183a0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
183b0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
183c0 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e 22  emory " bytes\n"
183d0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
183e0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
183f0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
18400 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 69 6e 76    set memory inv
18410 61 6c 69 64 0d 0a 0d 0a 20 20 20 20 20 20 20 20  alid....        
18420 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
18430 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
18440 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
18450 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
18460 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20  s $memory \n].. 
18470 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
18480 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
18490 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
184a0 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72         set memor
184b0 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20  y unknown....   
184c0 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
184d0 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
184e0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
184f0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
18500 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a  gs $memory \n]..
18510 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
18520 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20       }..      } 
18530 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
18540 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 61 76 61  set memory unava
18550 69 6c 61 62 6c 65 0d 0a 0d 0a 20 20 20 20 20 20  ilable....      
18560 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
18570 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
18580 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
18590 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d  [appendArgs $mem
185a0 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ory \n]..       
185b0 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
185c0 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73       return $res
185d0 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  ult..    }..... 
185e0 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72     proc checkFor
185f0 53 51 4c 69 74 65 44 69 72 65 63 74 6f 72 69 65  SQLiteDirectorie
18600 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 72 65 73  s { channel {res
18610 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  et false} } {.. 
18620 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
18630 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74  NOTE: Check if t
18640 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  he sqlite3_win32
18650 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66  _set_directory f
18660 75 6e 63 74 69 6f 6e 20 69 73 20 61 76 61 69 6c  unction is avail
18670 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  able...      #..
18680 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
18690 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20  nnel \..        
186a0 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67    "---- checking
186b0 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 73 71   for function sq
186c0 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f  lite3_win32_set_
186d0 64 69 72 65 63 74 6f 72 79 2e 2e 2e 20 22 0d 0a  directory... "..
186e0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
186f0 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 63 61   # NOTE: This ca
18700 6c 6c 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65  ll to the sqlite
18710 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65  3_win32_set_dire
18720 63 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20 75  ctory function u
18730 73 65 73 20 74 68 65 0d 0a 20 20 20 20 20 20 23  ses the..      #
18740 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 20 76         invalid v
18750 61 6c 75 65 20 30 20 66 6f 72 20 74 68 65 20 66  alue 0 for the f
18760 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 20  irst argument.  
18770 54 68 69 73 20 63 6f 64 65 20 69 73 20 64 65 73  This code is des
18780 69 67 6e 65 64 0d 0a 20 20 20 20 20 20 23 20 20  igned..      #  
18790 20 20 20 20 20 74 6f 20 63 68 65 63 6b 20 69 66       to check if
187a0 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 66 75 6e   calling the fun
187b0 63 74 69 6f 6e 20 77 69 6c 6c 20 72 61 69 73 65  ction will raise
187c0 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 28 69   an exception (i
187d0 2e 65 2e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  .e...      #    
187e0 20 20 20 74 68 65 20 61 63 74 75 61 6c 20 72 65     the actual re
187f0 73 75 6c 74 20 6f 66 20 74 68 65 20 66 75 6e 63  sult of the func
18800 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6d 61  tion does not ma
18810 74 74 65 72 20 61 73 20 6c 6f 6e 67 20 61 73 20  tter as long as 
18820 6e 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  no..      #     
18830 20 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 63    directory is c
18840 68 61 6e 67 65 64 29 2e 0d 0a 20 20 20 20 20 20  hanged)...      
18850 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  #..      if {[ca
18860 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f  tch {..        o
18870 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
18880 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
18890 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79  ..            Sy
188a0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
188b0 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74  .UnsafeNativeMet
188c0 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  hods \..        
188d0 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33      sqlite3_win3
188e0 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20  2_set_directory 
188f0 30 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 7d 5d  0 null..      }]
18900 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
18910 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
18920 20 20 23 20 4e 4f 54 45 3a 20 43 61 6c 6c 69 6e    # NOTE: Callin
18930 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69  g the sqlite3_wi
18940 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
18950 79 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  y function does 
18960 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20  not..        #  
18970 20 20 20 20 20 63 61 75 73 65 20 61 6e 20 65 78       cause an ex
18980 63 65 70 74 69 6f 6e 3b 20 74 68 65 72 65 66 6f  ception; therefo
18990 72 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20 61  re, it must be a
189a0 76 61 69 6c 61 62 6c 65 20 28 69 2e 65 2e 0d 0a  vailable (i.e...
189b0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
189c0 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 73  even though it s
189d0 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 61 20 66  hould return a f
189e0 61 69 6c 75 72 65 20 72 65 74 75 72 6e 20 63 6f  ailure return co
189f0 64 65 20 69 6e 20 74 68 69 73 0d 0a 20 20 20 20  de in this..    
18a00 20 20 20 20 23 20 20 20 20 20 20 20 63 61 73 65      #       case
18a10 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  )...        #.. 
18a20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
18a30 61 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 69 6e  aint sqlite3_win
18a40 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79  32_set_directory
18a50 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74  ....        tput
18a60 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e  s $channel yes\n
18a70 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
18a80 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44         # NOTE: D
18a90 6f 65 73 20 6f 75 72 20 63 61 6c 6c 65 72 20 77  oes our caller w
18aa0 61 6e 74 20 74 6f 20 72 65 73 65 74 20 74 68 65  ant to reset the
18ab0 20 64 69 72 65 63 74 6f 72 69 65 73 3f 0d 0a 20   directories?.. 
18ac0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
18ad0 20 20 69 66 20 7b 24 72 65 73 65 74 7d 20 74 68    if {$reset} th
18ae0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
18af0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
18b00 4f 54 45 3a 20 4e 6f 77 20 6d 61 6b 65 20 73 75  OTE: Now make su
18b10 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
18b20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 64 69  and temporary di
18b30 72 65 63 74 6f 72 69 65 73 20 61 72 65 0d 0a 20  rectories are.. 
18b40 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
18b50 20 72 65 73 65 74 20 74 68 65 69 72 20 64 65 66   reset their def
18b60 61 75 6c 74 20 76 61 6c 75 65 73 2c 20 77 68 69  ault values, whi
18b70 63 68 20 73 68 6f 75 6c 64 20 62 65 20 6e 75 6c  ch should be nul
18b80 6c 20 66 6f 72 20 62 6f 74 68 2e 0d 0a 20 20 20  l for both...   
18b90 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 53         #       S
18ba0 69 6e 63 65 20 74 68 65 20 73 71 6c 69 74 65 33  ince the sqlite3
18bb0 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63  _win32_set_direc
18bc0 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20 69 73  tory function is
18bd0 20 61 76 61 69 6c 61 62 6c 65 2c 0d 0a 20 20 20   available,..   
18be0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75         #       u
18bf0 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20  se it...        
18c00 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 66    #..          f
18c10 6f 72 20 7b 73 65 74 20 69 6e 64 65 78 20 31 7d  or {set index 1}
18c20 20 7b 24 69 6e 64 65 78 20 3c 20 33 7d 20 7b 69   {$index < 3} {i
18c30 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20  ncr index} {..  
18c40 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63            if {[c
18c50 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
18c60 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
18c70 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
18c80 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
18c90 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
18ca0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e  m.Data.SQLite.Un
18cb0 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
18cc0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
18cd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77         sqlite3_w
18ce0 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
18cf0 72 79 20 24 69 6e 64 65 78 20 6e 75 6c 6c 0d 0a  ry $index null..
18d00 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 72 65              } re
18d10 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sult] == 0} then
18d20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
18d30 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
18d40 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
18d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d60 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c    "---- call sql
18d70 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
18d80 69 72 65 63 74 6f 72 79 28 22 20 24 69 6e 64 65  irectory(" $inde
18d90 78 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  x \..           
18da0 20 20 20 20 20 20 20 22 2c 20 6e 75 6c 6c 29 2e         ", null).
18db0 2e 2e 20 6f 6b 3a 20 22 20 24 72 65 73 75 6c 74  .. ok: " $result
18dc0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
18dd0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
18de0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
18df0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
18e00 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
18e10 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
18e20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 77 69 6e  call sqlite3_win
18e30 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79  32_set_directory
18e40 28 22 20 24 69 6e 64 65 78 20 5c 0d 0a 20 20 20  (" $index \..   
18e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
18e60 2c 20 6e 75 6c 6c 29 2e 2e 2e 20 65 72 72 6f 72  , null)... error
18e70 3a 20 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74  : " \n\t $result
18e80 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
18e90 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
18ea0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
18eb0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
18ec0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
18ed0 6e 65 6c 20 6e 6f 5c 6e 0d 0a 0d 0a 20 20 20 20  nel no\n....    
18ee0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
18ef0 20 4e 4f 54 45 3a 20 44 6f 65 73 20 6f 75 72 20   NOTE: Does our 
18f00 63 61 6c 6c 65 72 20 77 61 6e 74 20 74 6f 20 72  caller want to r
18f10 65 73 65 74 20 74 68 65 20 64 69 72 65 63 74 6f  eset the directo
18f20 72 69 65 73 3f 20 20 54 68 69 73 20 63 61 6e 20  ries?  This can 
18f30 6f 6e 6c 79 0d 0a 20 20 20 20 20 20 20 20 23 20  only..        # 
18f40 20 20 20 20 20 20 62 65 20 70 65 72 66 6f 72 6d        be perform
18f50 65 64 20 69 66 20 53 51 4c 69 74 65 20 69 73 20  ed if SQLite is 
18f60 6c 6f 61 64 65 64 20 61 6e 64 20 72 65 61 64 79  loaded and ready
18f70 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20   for use by the 
18f80 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20  test..        # 
18f90 20 20 20 20 20 20 73 75 69 74 65 2e 0d 0a 20 20        suite...  
18fa0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
18fb0 20 69 66 20 7b 24 72 65 73 65 74 20 26 26 20 5b   if {$reset && [
18fc0 69 73 53 51 4c 69 74 65 52 65 61 64 79 5d 7d 20  isSQLiteReady]} 
18fd0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
18fe0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
18ff0 20 4e 4f 54 45 3a 20 4e 6f 77 20 6d 61 6b 65 20   NOTE: Now make 
19000 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73  sure the databas
19010 65 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 20  e and temporary 
19020 64 69 72 65 63 74 6f 72 69 65 73 20 61 72 65 0d  directories are.
19030 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
19040 20 20 20 72 65 73 65 74 20 74 68 65 69 72 20 64     reset their d
19050 65 66 61 75 6c 74 20 76 61 6c 75 65 73 2c 20 77  efault values, w
19060 68 69 63 68 20 73 68 6f 75 6c 64 20 62 65 20 6e  hich should be n
19070 75 6c 6c 20 66 6f 72 20 62 6f 74 68 2e 0d 0a 20  ull for both... 
19080 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
19090 20 53 69 6e 63 65 20 74 68 65 20 73 71 6c 69 74   Since the sqlit
190a0 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72  e3_win32_set_dir
190b0 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20  ectory function 
190c0 64 6f 65 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20  does not..      
190d0 20 20 20 20 23 20 20 20 20 20 20 20 61 70 70 65      #       appe
190e0 61 72 20 74 6f 20 62 65 20 61 76 61 69 6c 61 62  ar to be availab
190f0 6c 65 2c 20 75 73 65 20 74 68 65 20 61 73 73 6f  le, use the asso
19100 63 69 61 74 65 64 20 50 52 41 47 4d 41 20 63 6f  ciated PRAGMA co
19110 6d 6d 61 6e 64 73 0d 0a 20 20 20 20 20 20 20 20  mmands..        
19120 20 20 23 20 20 20 20 20 20 20 69 6e 73 74 65 61    #       instea
19130 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  d...          #.
19140 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61  .          forea
19150 63 68 20 64 69 72 65 63 74 6f 72 79 20 5b 6c 69  ch directory [li
19160 73 74 20 64 61 74 61 5f 73 74 6f 72 65 5f 64 69  st data_store_di
19170 72 65 63 74 6f 72 79 20 74 65 6d 70 5f 73 74 6f  rectory temp_sto
19180 72 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 7b 0d  re_directory] {.
19190 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
191a0 20 73 71 6c 20 5b 61 70 70 65 6e 64 41 72 67 73   sql [appendArgs
191b0 20 22 50 52 41 47 4d 41 20 22 20 24 64 69 72 65   "PRAGMA " $dire
191c0 63 74 6f 72 79 20 22 20 3d 20 5c 22 5c 22 3b 22  ctory " = \"\";"
191d0 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
191e0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 65 78 65   if {[catch {exe
191f0 63 75 74 65 53 71 6c 20 24 73 71 6c 7d 20 72 65  cuteSql $sql} re
19200 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sult] == 0} then
19210 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
19220 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
19230 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
19240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19250 20 20 22 2d 2d 2d 2d 20 65 78 65 63 75 74 65 20    "---- execute 
19260 50 52 41 47 4d 41 20 22 20 24 64 69 72 65 63 74  PRAGMA " $direct
19270 6f 72 79 20 22 2e 2e 2e 20 6f 6b 3a 20 5c 22 22  ory "... ok: \""
19280 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
19290 20 20 20 20 20 20 24 72 65 73 75 6c 74 20 5c 22        $result \"
192a0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n]..           
192b0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
192c0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
192d0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
192e0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
192f0 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 65           "---- e
19300 78 65 63 75 74 65 20 50 52 41 47 4d 41 20 22 20  xecute PRAGMA " 
19310 24 64 69 72 65 63 74 6f 72 79 20 22 2e 2e 2e 20  $directory "... 
19320 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20  error: " \..    
19330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e                \n
19340 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a  \t $result \n]..
19350 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
19360 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
19370 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
19380 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
19390 20 23 20 4e 4f 54 45 3a 20 46 69 6e 61 6c 6c 79   # NOTE: Finally
193a0 2c 20 73 68 6f 77 20 74 68 65 20 63 75 72 72 65  , show the curre
193b0 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  nt value of the 
193c0 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 65 6d  database and tem
193d0 70 6f 72 61 72 79 0d 0a 20 20 20 20 20 20 23 20  porary..      # 
193e0 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 69 65        directorie
193f0 73 2e 20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c  s.  This can onl
19400 79 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 69  y be performed i
19410 66 20 53 51 4c 69 74 65 20 69 73 20 6c 6f 61 64  f SQLite is load
19420 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ed..      #     
19430 20 20 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20    and ready for 
19440 75 73 65 20 62 79 20 74 68 65 20 74 65 73 74 20  use by the test 
19450 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d  suite...      #.
19460 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 73 53 51  .      if {[isSQ
19470 4c 69 74 65 52 65 61 64 79 5d 7d 20 74 68 65 6e  LiteReady]} then
19480 20 7b 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65   {..        fore
19490 61 63 68 20 64 69 72 65 63 74 6f 72 79 20 5b 6c  ach directory [l
194a0 69 73 74 20 64 61 74 61 5f 73 74 6f 72 65 5f 64  ist data_store_d
194b0 69 72 65 63 74 6f 72 79 20 74 65 6d 70 5f 73 74  irectory temp_st
194c0 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 7b  ore_directory] {
194d0 0d 0a 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 22 2d 2d 2d 2d 20 63 68 65  ndArgs "---- che
19500 63 6b 69 6e 67 20 22 20 24 64 69 72 65 63 74 6f  cking " $directo
19510 72 79 20 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20  ry "... "]....  
19520 20 20 20 20 20 20 20 20 73 65 74 20 73 71 6c 20          set sql 
19530 5b 61 70 70 65 6e 64 41 72 67 73 20 22 50 52 41  [appendArgs "PRA
19540 47 4d 41 20 22 20 24 64 69 72 65 63 74 6f 72 79  GMA " $directory
19550 20 5c 3b 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20   \;]....        
19560 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 65 78    if {[catch {ex
19570 65 63 75 74 65 53 71 6c 20 24 73 71 6c 20 73 63  ecuteSql $sql sc
19580 61 6c 61 72 7d 20 72 65 73 75 6c 74 5d 20 3d 3d  alar} result] ==
19590 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
195a0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
195b0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
195c0 67 73 20 22 6f 6b 3a 20 5c 22 22 20 24 72 65 73  gs "ok: \"" $res
195d0 75 6c 74 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  ult \"\n]..     
195e0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
195f0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
19600 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
19610 64 41 72 67 73 20 22 65 72 72 6f 72 3a 20 22 20  dArgs "error: " 
19620 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d  \n\t $result \n]
19630 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
19640 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
19650 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
19660 20 70 72 6f 63 20 6c 6f 61 64 53 51 4c 69 74 65   proc loadSQLite
19670 54 65 73 74 53 65 74 74 69 6e 67 73 20 7b 20 63  TestSettings { c
19680 68 61 6e 6e 65 6c 20 7b 73 75 66 66 69 78 20 22  hannel {suffix "
19690 22 7d 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d  "} {quiet false}
196a0 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
196b0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69       # NOTE: Ski
196c0 70 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 73 65  p loading the se
196d0 74 74 69 6e 67 73 20 69 66 20 74 68 65 69 72 20  ttings if their 
196e0 75 73 61 67 65 20 68 61 73 20 62 65 65 6e 20 64  usage has been d
196f0 69 73 61 62 6c 65 64 2e 0d 0a 20 20 20 20 20 20  isabled...      
19700 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69  #..      if {![i
19710 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
19720 73 71 6c 69 74 65 54 65 73 74 53 65 74 74 69 6e  sqliteTestSettin
19730 67 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  gs)]} then {..  
19740 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
19750 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 63 75   # NOTE: Load cu
19760 73 74 6f 6d 20 70 65 72 2d 75 73 65 72 20 61 6e  stom per-user an
19770 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74 20 74 65  d/or per-host te
19780 73 74 20 73 65 74 74 69 6e 67 73 20 6e 6f 77 2e  st settings now.
19790 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
197a0 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
197b0 78 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74  xists ::tcl_plat
197c0 66 6f 72 6d 28 75 73 65 72 29 5d 7d 20 74 68 65  form(user)]} the
197d0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
197e0 65 74 20 75 73 65 72 53 65 74 74 69 6e 67 73 46  et userSettingsF
197f0 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ileName [file jo
19800 69 6e 20 5b 67 65 74 43 6f 6d 6d 6f 6e 44 69 72  in [getCommonDir
19810 65 63 74 6f 72 79 5d 20 5c 0d 0a 20 20 20 20 20  ectory] \..     
19820 20 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64           [append
19830 41 72 67 73 20 73 65 74 74 69 6e 67 73 20 24 73  Args settings $s
19840 75 66 66 69 78 20 2e 20 24 3a 3a 74 63 6c 5f 70  uffix . $::tcl_p
19850 6c 61 74 66 6f 72 6d 28 75 73 65 72 29 20 2e 65  latform(user) .e
19860 61 67 6c 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  agle]]....      
19870 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78      if {[file ex
19880 69 73 74 73 20 24 75 73 65 72 53 65 74 74 69 6e  ists $userSettin
19890 67 73 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65  gsFileName]} the
198a0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
198b0 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
198c0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
198d0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
198e0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
198f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19900 20 20 20 20 22 2d 2d 2d 2d 20 6c 6f 61 64 69 6e      "---- loadin
19910 67 20 70 65 72 2d 75 73 65 72 20 74 65 73 74 20  g per-user test 
19920 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22  settings file \"
19930 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
19940 20 20 20 20 20 20 20 24 75 73 65 72 53 65 74 74         $userSett
19950 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 5c 22 2e  ingsFileName \".
19960 2e 2e 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  ..\n]..         
19970 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
19980 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
19990 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
199a0 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20  uplevel 1 [list 
199b0 73 6f 75 72 63 65 20 24 75 73 65 72 53 65 74 74  source $userSett
199c0 69 6e 67 73 46 69 6c 65 4e 61 6d 65 5d 0d 0a 20  ingsFileName].. 
199d0 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 72 72             } err
199e0 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
199f0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
19a00 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
19a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
19a30 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
19a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a50 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
19a60 20 66 61 69 6c 65 64 20 74 6f 20 6c 6f 61 64 20   failed to load 
19a70 70 65 72 2d 75 73 65 72 20 73 65 74 74 69 6e 67  per-user setting
19a80 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20  s file \"" \..  
19a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19aa0 20 20 24 75 73 65 72 53 65 74 74 69 6e 67 73 46    $userSettingsF
19ab0 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 65 72 72  ileName "\", err
19ac0 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f  or: " \n\t $erro
19ad0 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  r \n]..         
19ae0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
19af0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
19b00 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
19b10 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
19b20 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
19b30 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
19b40 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
19b50 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
19b60 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
19b70 73 6b 69 70 70 65 64 20 6c 6f 61 64 69 6e 67 20  skipped loading 
19b80 70 65 72 2d 75 73 65 72 20 74 65 73 74 20 73 65  per-user test se
19b90 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20  ttings file \"" 
19ba0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
19bb0 20 20 20 20 20 24 75 73 65 72 53 65 74 74 69 6e       $userSettin
19bc0 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20  gsFileName "\", 
19bd0 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  it does not exis
19be0 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  t\n"]..         
19bf0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
19c00 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
19c10 20 20 20 20 20 20 20 20 23 23 23 23 23 23 23 23          ########
19c20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
19c30 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
19c40 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
19c50 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
19c60 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  ...        if {[
19c70 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63  info exists ::tc
19c80 6c 5f 70 6c 61 74 66 6f 72 6d 28 68 6f 73 74 29  l_platform(host)
19c90 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
19ca0 20 20 20 20 20 73 65 74 20 68 6f 73 74 53 65 74       set hostSet
19cb0 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 5b 66  tingsFileName [f
19cc0 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 43 6f 6d  ile join [getCom
19cd0 6d 6f 6e 44 69 72 65 63 74 6f 72 79 5d 20 5c 0d  monDirectory] \.
19ce0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
19cf0 61 70 70 65 6e 64 41 72 67 73 20 73 65 74 74 69  appendArgs setti
19d00 6e 67 73 20 24 73 75 66 66 69 78 20 2e 20 24 3a  ngs $suffix . $:
19d10 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 68 6f  :tcl_platform(ho
19d20 73 74 29 20 2e 65 61 67 6c 65 5d 5d 0d 0a 0d 0a  st) .eagle]]....
19d30 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66            if {[f
19d40 69 6c 65 20 65 78 69 73 74 73 20 24 68 6f 73 74  ile exists $host
19d50 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65  SettingsFileName
19d60 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
19d70 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
19d80 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
19d90 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
19da0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
19db0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
19dc0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
19dd0 6c 6f 61 64 69 6e 67 20 70 65 72 2d 68 6f 73 74  loading per-host
19de0 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 66   test settings f
19df0 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ile \"" \..     
19e00 20 20 20 20 20 20 20 20 20 20 20 20 20 24 68 6f               $ho
19e10 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61  stSettingsFileNa
19e20 6d 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 20 20 20  me \"...\n]..   
19e30 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
19e40 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63            if {[c
19e50 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
19e60 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20        uplevel 1 
19e70 5b 6c 69 73 74 20 73 6f 75 72 63 65 20 24 68 6f  [list source $ho
19e80 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61  stSettingsFileNa
19e90 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  me]..           
19ea0 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20   } error]} then 
19eb0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
19ec0 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
19ed0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
19ee0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
19ef0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
19f00 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
19f10 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
19f20 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
19f30 20 6c 6f 61 64 20 70 65 72 2d 68 6f 73 74 20 73   load per-host s
19f40 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22  ettings file \""
19f50 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
19f60 20 20 20 20 20 20 20 20 24 68 6f 73 74 53 65 74          $hostSet
19f70 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c  tingsFileName "\
19f80 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  ", error: " \n\t
19f90 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20   $error \n]..   
19fa0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
19fb0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
19fc0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
19fd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
19fe0 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
19ff0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1a000 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
1a010 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1a020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a030 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6c 6f  "---- skipped lo
1a040 61 64 69 6e 67 20 70 65 72 2d 68 6f 73 74 20 74  ading per-host t
1a050 65 73 74 20 73 65 74 74 69 6e 67 73 20 66 69 6c  est settings fil
1a060 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  e \"" \..       
1a070 20 20 20 20 20 20 20 20 20 20 20 24 68 6f 73 74             $host
1a080 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65  SettingsFileName
1a090 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f   "\", it does no
1a0a0 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20  t exist\n"]..   
1a0b0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1a0c0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1a0d0 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20   }..      }..   
1a0e0 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
1a0f0 72 75 6e 53 51 4c 69 74 65 54 65 73 74 50 72 6f  runSQLiteTestPro
1a100 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20 20 20 20  logue {} {..    
1a110 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
1a120 45 3a 20 53 6b 69 70 20 72 75 6e 6e 69 6e 67 20  E: Skip running 
1a130 6f 75 72 20 63 75 73 74 6f 6d 20 70 72 6f 6c 6f  our custom prolo
1a140 67 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20  gue if the main 
1a150 6f 6e 65 20 68 61 73 20 62 65 65 6e 0d 0a 20 20  one has been..  
1a160 20 20 20 20 23 20 20 20 20 20 20 20 73 6b 69 70      #       skip
1a170 70 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ped...      #.. 
1a180 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
1a190 65 78 69 73 74 73 20 3a 3a 6e 6f 28 70 72 6f 6c  exists ::no(prol
1a1a0 6f 67 75 65 2e 65 61 67 6c 65 29 5d 7d 20 74 68  ogue.eagle)]} th
1a1b0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
1a1c0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
1a1d0 20 4c 6f 61 64 20 74 68 65 20 22 62 65 66 6f 72   Load the "befor
1a1e0 65 2d 63 6f 6e 73 74 72 61 69 6e 74 73 22 20 63  e-constraints" c
1a1f0 75 73 74 6f 6d 20 70 65 72 2d 75 73 65 72 20 61  ustom per-user a
1a200 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74 0d 0a  nd/or per-host..
1a210 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1a220 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 6e 6f  test settings no
1a230 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  w...        #.. 
1a240 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31         uplevel 1
1a250 20 5b 6c 69 73 74 20 6c 6f 61 64 53 51 4c 69 74   [list loadSQLit
1a260 65 54 65 73 74 53 65 74 74 69 6e 67 73 20 24 3a  eTestSettings $:
1a270 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 2e 62  :test_channel .b
1a280 65 66 6f 72 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  efore]....      
1a290 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
1a2a0 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68  OTE: Check if th
1a2b0 65 20 5b 6f 62 6a 65 63 74 5d 20 63 6f 6d 6d 61  e [object] comma
1a2c0 6e 64 20 69 73 20 61 76 61 69 6c 61 62 6c 65 3b  nd is available;
1a2d0 20 69 66 20 6e 6f 74 2c 20 61 64 64 20 73 6f 6d   if not, add som
1a2e0 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
1a2f0 20 20 20 73 68 69 6d 73 20 74 6f 20 6d 61 6b 65     shims to make
1a300 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20   the test suite 
1a310 72 75 6e 20 73 6d 6f 6f 74 68 65 72 2e 0d 0a 20  run smoother... 
1a320 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1a330 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65    checkForSQLite
1a340 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 20 24 3a  ObjectCommand $:
1a350 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d  :test_channel...
1a360 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1a370 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 65 74 65      # NOTE: Dete
1a380 72 6d 69 6e 65 20 74 68 65 20 6e 61 6d 65 73 20  rmine the names 
1a390 6f 66 20 74 68 65 20 6e 61 74 69 76 65 20 70 6c  of the native pl
1a3a0 61 74 66 6f 72 6d 20 61 6e 64 20 61 72 63 68 69  atform and archi
1a3b0 74 65 63 74 75 72 65 2e 0d 0a 20 20 20 20 20 20  tecture...      
1a3c0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74    #..        set
1a3d0 20 70 6c 61 74 66 6f 72 6d 20 5b 67 65 74 42 75   platform [getBu
1a3e0 69 6c 64 50 6c 61 74 66 6f 72 6d 20 74 72 75 65  ildPlatform true
1a3f0 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 61  ]..        set a
1a400 72 63 68 69 74 65 63 74 75 72 65 20 5b 61 72 63  rchitecture [arc
1a410 68 69 74 65 63 74 75 72 65 46 6f 72 50 6c 61 74  hitectureForPlat
1a420 66 6f 72 6d 20 24 70 6c 61 74 66 6f 72 6d 5d 0d  form $platform].
1a430 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1a440 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68        # NOTE: Sh
1a450 6f 77 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 20  ow the platform 
1a460 61 6e 64 20 61 72 63 68 69 74 65 63 74 75 72 65  and architecture
1a470 20 75 73 65 64 20 74 6f 20 68 65 6c 70 20 6c 6f   used to help lo
1a480 63 61 74 65 20 74 68 65 0d 0a 20 20 20 20 20 20  cate the..      
1a490 20 20 23 20 20 20 20 20 20 20 6e 61 74 69 76 65    #       native
1a4a0 20 62 75 69 6c 64 20 66 69 6c 65 73 2e 0d 0a 20   build files... 
1a4b0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1a4c0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
1a4d0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1a4e0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1a4f0 20 20 20 22 2d 2d 2d 2d 20 70 6c 61 74 66 6f 72     "---- platfor
1a500 6d 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67 20 6e  m for locating n
1a510 61 74 69 76 65 20 62 75 69 6c 64 20 66 69 6c 65  ative build file
1a520 73 20 69 73 20 5c 22 22 20 5c 0d 0a 20 20 20 20  s is \"" \..    
1a530 20 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72          $platfor
1a540 6d 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20  m \"\n]....     
1a550 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
1a560 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
1a570 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1a580 20 20 20 20 22 2d 2d 2d 2d 20 61 72 63 68 69 74      "---- archit
1a590 65 63 74 75 72 65 20 66 6f 72 20 6c 6f 63 61 74  ecture for locat
1a5a0 69 6e 67 20 6e 61 74 69 76 65 20 62 75 69 6c 64  ing native build
1a5b0 20 66 69 6c 65 73 20 69 73 20 5c 22 22 20 5c 0d   files is \"" \.
1a5c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 61 72  .            $ar
1a5d0 63 68 69 74 65 63 74 75 72 65 20 5c 22 5c 6e 5d  chitecture \"\n]
1a5e0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
1a5f0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42         # NOTE: B
1a600 75 69 6c 64 20 61 20 6c 69 73 74 20 6f 66 20 63  uild a list of c
1a610 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 69 6c  onfiguration fil
1a620 65 73 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c  es that we handl
1a630 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
1a640 20 20 20 20 20 20 20 73 65 74 20 63 6f 6e 66 69         set confi
1a650 67 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74  gFileNames [list
1a660 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1a670 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
1a680 74 65 2e 64 6c 6c 2e 63 6f 6e 66 69 67 5d 0d 0a  te.dll.config]..
1a690 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1a6a0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69       # NOTE: Bui
1a6b0 6c 64 20 61 20 6c 69 73 74 20 6f 66 20 61 75 78  ld a list of aux
1a6c0 69 6c 69 61 72 79 20 4d 61 6e 61 67 65 64 20 44  iliary Managed D
1a6d0 65 62 75 67 67 69 6e 67 20 41 73 73 69 73 74 61  ebugging Assista
1a6e0 6e 74 73 20 28 4d 44 41 29 0d 0a 20 20 20 20 20  nts (MDA)..     
1a6f0 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 66 69     #       confi
1a700 67 75 72 61 74 69 6f 6e 20 66 69 6c 65 73 20 74  guration files t
1a710 68 61 74 20 77 65 20 68 61 6e 64 6c 65 2e 0d 0a  hat we handle...
1a720 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1a730 20 20 20 73 65 74 20 6d 64 61 43 6f 6e 66 69 67     set mdaConfig
1a740 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74 20  FileNames [list 
1a750 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 45  \..            E
1a760 61 67 6c 65 53 68 65 6c 6c 33 32 2e 65 78 65 2e  agleShell32.exe.
1a770 6d 64 61 2e 63 6f 6e 66 69 67 20 49 6e 73 74 61  mda.config Insta
1a780 6c 6c 65 72 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e  ller.exe.mda.con
1a790 66 69 67 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  fig \..         
1a7a0 20 20 20 74 65 73 74 2e 65 78 65 2e 6d 64 61 2e     test.exe.mda.
1a7b0 63 6f 6e 66 69 67 20 74 65 73 74 6c 69 6e 71 2e  config testlinq.
1a7c0 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 5c  exe.mda.config \
1a7d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ..            te
1a7e0 73 74 65 66 36 2e 65 78 65 2e 6d 64 61 2e 63 6f  stef6.exe.mda.co
1a7f0 6e 66 69 67 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  nfig]....       
1a800 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1a810 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 6c 69  TE: Build the li
1a820 73 74 20 6f 66 20 65 78 74 65 72 6e 61 6c 20 66  st of external f
1a830 69 6c 65 73 20 74 68 61 74 20 77 65 20 68 61 6e  iles that we han
1a840 64 6c 65 2e 20 20 53 6f 6d 65 20 6f 66 0d 0a 20  dle.  Some of.. 
1a850 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
1a860 68 65 73 65 20 66 69 6c 65 73 20 6d 61 79 20 62  hese files may b
1a870 65 20 6e 61 74 69 76 65 20 61 6e 64 2f 6f 72 20  e native and/or 
1a880 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 69  managed assembli
1a890 65 73 20 74 68 61 74 20 61 72 65 0d 0a 20 20 20  es that are..   
1a8a0 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65 71       #       req
1a8b0 75 69 72 65 64 20 74 6f 20 70 65 72 66 6f 72 6d  uired to perform
1a8c0 20 76 61 72 69 6f 75 73 20 74 65 73 74 73 2e 0d   various tests..
1a8d0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1a8e0 20 20 20 20 73 65 74 20 65 78 74 65 72 6e 61 6c      set external
1a8f0 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74 20  FileNames [list 
1a900 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
1a910 66 69 6c 65 20 6a 6f 69 6e 20 45 6e 74 69 74 79  file join Entity
1a920 46 72 61 6d 65 77 6f 72 6b 20 6c 69 62 20 5b 73  Framework lib [s
1a930 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20  tring map [list 
1a940 46 78 20 22 22 5d 20 5b 73 74 72 69 6e 67 20 5c  Fx ""] [string \
1a950 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 61  ..            ma
1a960 70 20 5b 6c 69 73 74 20 6e 65 74 46 78 34 35 31  p [list netFx451
1a970 20 6e 65 74 46 78 34 35 20 6e 65 74 46 78 34 35   netFx45 netFx45
1a980 32 20 6e 65 74 46 78 34 35 20 6e 65 74 46 78 34  2 netFx45 netFx4
1a990 36 20 6e 65 74 46 78 34 35 5d 20 5c 0d 0a 20 20  6 netFx45] \..  
1a9a0 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 75            [getBu
1a9b0 69 6c 64 4e 65 74 46 78 5d 5d 5d 20 45 6e 74 69  ildNetFx]]] Enti
1a9c0 74 79 46 72 61 6d 65 77 6f 72 6b 2e 64 6c 6c 5d  tyFramework.dll]
1a9d0 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
1a9e0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1a9f0 42 75 69 6c 64 20 74 68 65 20 6c 69 73 74 20 6f  Build the list o
1aa00 66 20 6e 61 74 69 76 65 20 61 73 73 65 6d 62 6c  f native assembl
1aa10 79 20 66 69 6c 65 73 20 74 68 61 74 20 77 65 20  y files that we 
1aa20 68 61 6e 64 6c 65 2e 20 20 54 68 65 0d 0a 20 20  handle.  The..  
1aa30 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65        #       re
1aa40 61 73 6f 6e 20 74 68 65 20 22 53 79 73 74 65 6d  ason the "System
1aa50 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
1aa60 22 20 66 69 6c 65 20 69 73 20 69 6e 63 6c 75 64  " file is includ
1aa70 65 64 20 68 65 72 65 20 69 73 0d 0a 20 20 20 20  ed here is..    
1aa80 20 20 20 20 23 20 20 20 20 20 20 20 62 65 63 61      #       beca
1aa90 75 73 65 20 69 74 20 63 6f 75 6c 64 20 62 65 20  use it could be 
1aaa0 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61  the mixed-mode a
1aab0 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20  ssembly...      
1aac0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74    #..        set
1aad0 20 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73   nativeFileNames
1aae0 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20   [list \..      
1aaf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 2e 64 6c        sqlite3.dl
1ab00 6c 20 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70  l SQLite.Interop
1ab10 2e 64 6c 6c 20 53 79 73 74 65 6d 2e 44 61 74 61  .dll System.Data
1ab20 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d 0d 0a 0d 0a  .SQLite.dll]....
1ab30 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1ab40 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64     # NOTE: Build
1ab50 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6d 61 6e   the list of man
1ab60 61 67 65 64 20 61 73 73 65 6d 62 6c 79 20 66 69  aged assembly fi
1ab70 6c 65 73 20 74 68 61 74 20 77 65 20 68 61 6e 64  les that we hand
1ab80 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  le...        #..
1ab90 20 20 20 20 20 20 20 20 73 65 74 20 6d 61 6e 61          set mana
1aba0 67 65 64 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69  gedFileNames [li
1abb0 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  st \..          
1abc0 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
1abd0 4c 69 74 65 2e 64 6c 6c 20 53 79 73 74 65 6d 2e  Lite.dll System.
1abe0 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71  Data.SQLite.Linq
1abf0 2e 64 6c 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20  .dll \..        
1ac00 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
1ac10 53 51 4c 69 74 65 2e 45 46 36 2e 64 6c 6c 5d 0d  SQLite.EF6.dll].
1ac20 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1ac30 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
1ac40 6d 6f 76 65 20 61 6e 79 20 74 65 73 74 20 63 6f  move any test co
1ac50 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74 20 72  nstraints that r
1ac60 65 66 65 72 20 74 6f 20 74 68 65 20 6e 61 74 69  efer to the nati
1ac70 76 65 20 61 6e 64 2f 6f 72 0d 0a 20 20 20 20 20  ve and/or..     
1ac80 20 20 20 23 20 20 20 20 20 20 20 6d 61 6e 61 67     #       manag
1ac90 65 64 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65  ed assembly file
1aca0 73 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65  s that we handle
1acb0 20 75 6e 6c 65 73 73 20 66 6f 72 62 69 64 64 65   unless forbidde
1acc0 6e 20 66 72 6f 6d 0d 0a 20 20 20 20 20 20 20 20  n from..        
1acd0 23 20 20 20 20 20 20 20 64 6f 69 6e 67 20 73 6f  #       doing so
1ace0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1acf0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
1ad00 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c   exists ::no(sql
1ad10 69 74 65 52 65 6d 6f 76 65 43 6f 6e 73 74 72 61  iteRemoveConstra
1ad20 69 6e 74 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ints)]} then {..
1ad30 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
1ad40 68 20 66 69 6c 65 4e 61 6d 65 20 24 63 6f 6e 66  h fileName $conf
1ad50 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  igFileNames {.. 
1ad60 20 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76             remov
1ad70 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  eConstraint [app
1ad80 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 24 66  endArgs file_ $f
1ad90 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20  ileName]..      
1ada0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1adb0 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
1adc0 61 6d 65 20 24 6d 64 61 43 6f 6e 66 69 67 46 69  ame $mdaConfigFi
1add0 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
1ade0 20 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e         removeCon
1adf0 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
1ae00 72 67 73 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e  rgs file_ $fileN
1ae10 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  ame]..          
1ae20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66  }....          f
1ae30 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
1ae40 24 65 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d  $externalFileNam
1ae50 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
1ae60 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69    removeConstrai
1ae70 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
1ae80 69 6c 65 5f 20 5b 66 69 6c 65 20 74 61 69 6c 20  ile_ [file tail 
1ae90 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20  $fileName]]..   
1aea0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1aeb0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
1aec0 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69  leName $nativeFi
1aed0 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
1aee0 20 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e         removeCon
1aef0 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
1af00 72 67 73 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e  rgs file_ $fileN
1af10 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  ame]..          
1af20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66  }....          f
1af30 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
1af40 24 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65  $managedFileName
1af50 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
1af60 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e   removeConstrain
1af70 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
1af80 6c 65 5f 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a  le_ $fileName]..
1af90 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1afa0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1afb0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
1afc0 4f 54 45 3a 20 53 6b 69 70 20 61 6c 6c 20 53 79  OTE: Skip all Sy
1afd0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
1afe0 20 72 65 6c 61 74 65 64 20 66 69 6c 65 20 68 61   related file ha
1aff0 6e 64 6c 69 6e 67 20 28 64 65 6c 65 74 69 6e 67  ndling (deleting
1b000 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ,..        #    
1b010 20 20 20 63 6f 70 79 69 6e 67 2c 20 61 6e 64 20     copying, and 
1b020 6c 6f 61 64 69 6e 67 29 20 69 66 20 69 6e 73 74  loading) if inst
1b030 72 75 63 74 65 64 2e 0d 0a 20 20 20 20 20 20 20  ructed...       
1b040 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
1b050 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
1b060 6e 6f 28 73 71 6c 69 74 65 46 69 6c 65 73 29 5d  no(sqliteFiles)]
1b070 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1b080 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1b090 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72   # NOTE: Skip tr
1b0a0 79 69 6e 67 20 74 6f 20 64 65 6c 65 74 65 20 61  ying to delete a
1b0b0 6e 79 20 66 69 6c 65 73 20 69 66 20 69 6e 73 74  ny files if inst
1b0c0 72 75 63 74 65 64 2e 0d 0a 20 20 20 20 20 20 20  ructed...       
1b0d0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1b0e0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
1b0f0 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c  s ::no(deleteSql
1b100 69 74 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  iteFiles)]} then
1b110 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1b120 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
1b130 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c  s ::no(deleteSql
1b140 69 74 65 43 6f 6e 66 69 67 46 69 6c 65 73 29 5d  iteConfigFiles)]
1b150 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1b160 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
1b170 66 69 6c 65 4e 61 6d 65 20 24 63 6f 6e 66 69 67  fileName $config
1b180 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
1b190 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
1b1a0 44 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65  DeleteBinaryFile
1b1b0 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20   $fileName..    
1b1c0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1b1d0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
1b1e0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
1b1f0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
1b200 28 64 65 6c 65 74 65 53 71 6c 69 74 65 45 78 74  (deleteSqliteExt
1b210 65 72 6e 61 6c 46 69 6c 65 73 29 5d 7d 20 74 68  ernalFiles)]} th
1b220 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1b230 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
1b240 4e 61 6d 65 20 24 6d 64 61 43 6f 6e 66 69 67 46  Name $mdaConfigF
1b250 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
1b260 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44              tryD
1b270 65 6c 65 74 65 42 75 69 6c 64 46 69 6c 65 20 24  eleteBuildFile $
1b280 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20  fileName..      
1b290 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1b2a0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61             forea
1b2b0 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 65 78 74  ch fileName $ext
1b2c0 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 73 20 7b  ernalFileNames {
1b2d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1b2e0 20 20 74 72 79 44 65 6c 65 74 65 42 69 6e 61 72    tryDeleteBinar
1b2f0 79 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d  yFile $fileName.
1b300 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
1b310 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
1b320 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
1b330 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
1b340 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69   ::no(deleteSqli
1b350 74 65 4e 61 74 69 76 65 46 69 6c 65 73 29 5d 7d  teNativeFiles)]}
1b360 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1b370 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
1b380 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65  o exists ::no(de
1b390 6c 65 74 65 53 71 6c 69 74 65 49 6d 70 6c 69 63  leteSqliteImplic
1b3a0 69 74 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  itFiles)]} then 
1b3b0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1b3c0 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
1b3d0 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e  ame $nativeFileN
1b3e0 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
1b3f0 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c            tryDel
1b400 65 74 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c  eteAssembly $fil
1b410 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20  eName..         
1b420 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1b430 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1b440 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
1b450 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
1b460 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 4e 6f  o(deleteSqliteNo
1b470 6e 49 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d  nImplicitFiles)]
1b480 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1b490 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
1b4a0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
1b4b0 28 64 65 6c 65 74 65 53 71 6c 69 74 65 50 6c 61  (deleteSqlitePla
1b4c0 74 66 6f 72 6d 46 69 6c 65 73 29 5d 20 26 26 20  tformFiles)] && 
1b4d0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1b4e0 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
1b4f0 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d  ength $platform]
1b500 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
1b510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b520 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
1b530 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65   $nativeFileName
1b540 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
1b550 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c 65           tryDele
1b560 74 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65  teAssembly $file
1b570 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 0d 0a  Name $platform..
1b580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b590 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
1b5a0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1b5b0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
1b5c0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
1b5d0 28 64 65 6c 65 74 65 53 71 6c 69 74 65 41 72 63  (deleteSqliteArc
1b5e0 68 69 74 65 63 74 75 72 65 46 69 6c 65 73 29 5d  hitectureFiles)]
1b5f0 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
1b600 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69             [stri
1b610 6e 67 20 6c 65 6e 67 74 68 20 24 61 72 63 68 69  ng length $archi
1b620 74 65 63 74 75 72 65 5d 20 3e 20 30 7d 20 74 68  tecture] > 0} th
1b630 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1b640 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
1b650 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65  fileName $native
1b660 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
1b670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b680 20 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62   tryDeleteAssemb
1b690 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 24 61 72  ly $fileName $ar
1b6a0 63 68 69 74 65 63 74 75 72 65 0d 0a 20 20 20 20  chitecture..    
1b6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
1b6c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b6d0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
1b6e0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
1b6f0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
1b700 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
1b710 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53  sts ::no(deleteS
1b720 71 6c 69 74 65 4d 61 6e 61 67 65 64 46 69 6c 65  qliteManagedFile
1b730 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
1b740 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61             forea
1b750 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 61 6e  ch fileName $man
1b760 61 67 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  agedFileNames {.
1b770 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b780 20 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62   tryDeleteAssemb
1b790 6c 79 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20  ly $fileName..  
1b7a0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1b7b0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
1b7c0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1b7d0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1b7e0 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
1b7f0 6b 20 66 6f 72 20 74 68 65 20 22 61 75 74 6f 53  k for the "autoS
1b800 65 6c 65 63 74 22 20 72 75 6e 74 69 6d 65 20 6f  elect" runtime o
1b810 70 74 69 6f 6e 2e 20 20 49 66 20 70 72 65 73 65  ption.  If prese
1b820 6e 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 23  nt,..          #
1b830 20 20 20 20 20 20 20 61 74 74 65 6d 70 74 20 74         attempt t
1b840 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  o automatically 
1b850 73 65 6c 65 63 74 20 74 68 65 20 66 69 72 73 74  select the first
1b860 20 61 76 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20   available..    
1b870 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 75        #       bu
1b880 69 6c 64 20 28 6f 72 20 22 72 65 6c 65 61 73 65  ild (or "release
1b890 22 29 20 6f 66 20 53 51 4c 69 74 65 20 61 6e 64  ") of SQLite and
1b8a0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
1b8b0 69 74 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ite..          #
1b8c0 20 20 20 20 20 20 20 66 6f 72 20 75 73 65 20 77         for use w
1b8d0 69 74 68 20 74 68 65 20 74 65 73 74 20 73 75 69  ith the test sui
1b8e0 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  te...          #
1b8f0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
1b900 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f  [hasRuntimeOptio
1b910 6e 20 61 75 74 6f 53 65 6c 65 63 74 5d 7d 20 74  n autoSelect]} t
1b920 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1b930 20 20 20 69 66 20 7b 21 5b 63 68 65 63 6b 46 6f     if {![checkFo
1b940 72 53 51 4c 69 74 65 42 75 69 6c 64 73 20 24 3a  rSQLiteBuilds $:
1b950 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72  :test_channel tr
1b960 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ue]} then {..   
1b970 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b             check
1b980 46 6f 72 53 51 4c 69 74 65 52 65 6c 65 61 73 65  ForSQLiteRelease
1b990 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1b9a0 6c 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20  l true..        
1b9b0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1b9c0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
1b9d0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
1b9e0 4f 54 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67  OTE: Skip trying
1b9f0 20 74 6f 20 76 65 72 69 66 79 20 74 68 65 20 62   to verify the b
1ba00 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20 69  uild directory i
1ba10 66 20 69 6e 73 74 72 75 63 74 65 64 3b 0d 0a 20  f instructed;.. 
1ba20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
1ba30 20 6f 74 68 65 72 77 69 73 65 2c 20 6d 61 6b 65   otherwise, make
1ba40 20 73 75 72 65 20 69 74 20 61 63 74 75 61 6c 6c   sure it actuall
1ba50 79 20 65 78 69 73 74 73 20 6f 72 20 68 61 6c 74  y exists or halt
1ba60 20 74 68 65 20 65 6e 74 69 72 65 0d 0a 20 20 20   the entire..   
1ba70 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
1ba80 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73 20 69  esting process i
1ba90 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78  f it does not ex
1baa0 69 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ist...          
1bab0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  #..          if 
1bac0 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
1bad0 3a 6e 6f 28 76 65 72 69 66 79 42 75 69 6c 64 44  :no(verifyBuildD
1bae0 69 72 65 63 74 6f 72 79 29 5d 7d 20 74 68 65 6e  irectory)]} then
1baf0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1bb00 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  #..            #
1bb10 20 4e 4f 54 45 3a 20 41 74 20 74 68 69 73 20 70   NOTE: At this p
1bb20 6f 69 6e 74 2c 20 74 68 65 20 62 75 69 6c 64 20  oint, the build 
1bb30 64 69 72 65 63 74 6f 72 79 20 4d 55 53 54 20 65  directory MUST e
1bb40 78 69 73 74 20 61 73 20 61 0d 0a 20 20 20 20 20  xist as a..     
1bb50 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76         #       v
1bb60 61 6c 69 64 20 64 69 72 65 63 74 6f 72 79 20 66  alid directory f
1bb70 6f 72 20 74 68 65 20 74 65 73 74 69 6e 67 20 70  or the testing p
1bb80 72 6f 63 65 73 73 20 74 6f 20 63 6f 6e 74 69 6e  rocess to contin
1bb90 75 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ue...           
1bba0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
1bbb0 73 65 74 20 64 69 72 65 63 74 6f 72 79 20 5b 67  set directory [g
1bbc0 65 74 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79  etBuildDirectory
1bbd0 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
1bbe0 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73   if {![file exis
1bbf0 74 73 20 24 64 69 72 65 63 74 6f 72 79 5d 20 7c  ts $directory] |
1bc00 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  | \..           
1bc10 20 20 20 20 20 21 5b 66 69 6c 65 20 69 73 64 69       ![file isdi
1bc20 72 65 63 74 6f 72 79 20 24 64 69 72 65 63 74 6f  rectory $directo
1bc30 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ry]} then {..   
1bc40 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
1bc50 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
1bc60 54 45 3a 20 4a 75 73 74 20 70 72 69 6f 72 20 74  TE: Just prior t
1bc70 6f 20 61 63 74 75 61 6c 6c 79 20 68 61 6c 74 69  o actually halti
1bc80 6e 67 20 74 68 65 20 74 65 73 74 69 6e 67 20 70  ng the testing p
1bc90 72 6f 63 65 73 73 2c 0d 0a 20 20 20 20 20 20 20  rocess,..       
1bca0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
1bcb0 64 64 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 74  dd an error to t
1bcc0 68 65 20 74 65 73 74 20 6c 6f 67 20 66 69 6c 65  he test log file
1bcd0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
1bce0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
1bcf0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
1bd00 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1bd10 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1bd20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
1bd30 6f 75 6c 64 20 6e 6f 74 20 76 65 72 69 66 79 20  ould not verify 
1bd40 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20  build directory 
1bd50 5c 22 22 20 24 64 69 72 65 63 74 6f 72 79 20 5c  \"" $directory \
1bd60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1bd70 20 20 20 20 22 5c 22 2c 20 61 6c 6c 20 74 65 73      "\", all tes
1bd80 74 69 6e 67 20 68 61 6c 74 65 64 5c 6e 22 5d 0d  ting halted\n"].
1bd90 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
1bda0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
1bdb0 20 20 23 20 4e 4f 54 45 3a 20 52 61 69 73 69 6e    # NOTE: Raisin
1bdc0 67 20 61 20 73 63 72 69 70 74 20 65 72 72 6f 72  g a script error
1bdd0 20 66 72 6f 6d 20 74 68 69 73 20 70 6f 69 6e 74   from this point
1bde0 20 73 68 6f 75 6c 64 20 68 61 6c 74 0d 0a 20 20   should halt..  
1bdf0 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
1be00 20 20 20 20 74 68 65 20 74 65 73 74 69 6e 67 20      the testing 
1be10 70 72 6f 63 65 73 73 2e 0d 0a 20 20 20 20 20 20  process...      
1be20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1be30 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 5b           error [
1be40 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1be50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be60 22 63 6f 75 6c 64 20 6e 6f 74 20 76 65 72 69 66  "could not verif
1be70 79 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72  y build director
1be80 79 20 5c 22 22 20 24 64 69 72 65 63 74 6f 72 79  y \"" $directory
1be90 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1bea0 20 20 20 20 20 20 22 5c 22 2c 20 61 6c 6c 20 74        "\", all t
1beb0 65 73 74 69 6e 67 20 68 61 6c 74 65 64 22 5d 0d  esting halted"].
1bec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
1bed0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
1bee0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1bef0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b        # NOTE: Sk
1bf00 69 70 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 70  ip trying to cop
1bf10 79 20 61 6e 79 20 66 69 6c 65 73 20 69 66 20 69  y any files if i
1bf20 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20  nstructed...    
1bf30 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1bf40 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
1bf50 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71  ists ::no(copySq
1bf60 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20 74 68 65  liteFiles)]} the
1bf70 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1bf80 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
1bf90 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69  ts ::no(copySqli
1bfa0 74 65 43 6f 6e 66 69 67 46 69 6c 65 73 29 5d 7d  teConfigFiles)]}
1bfb0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1bfc0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
1bfd0 69 6c 65 4e 61 6d 65 20 24 63 6f 6e 66 69 67 46  ileName $configF
1bfe0 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
1bff0 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43              tryC
1c000 6f 70 79 42 75 69 6c 64 46 69 6c 65 20 24 66 69  opyBuildFile $fi
1c010 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20  leName..        
1c020 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1c030 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1c040 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
1c050 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70   exists ::no(cop
1c060 79 53 71 6c 69 74 65 45 78 74 65 72 6e 61 6c 46  ySqliteExternalF
1c070 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
1c080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
1c090 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
1c0a0 20 4e 4f 54 45 3a 20 43 6f 70 79 20 74 68 65 20   NOTE: Copy the 
1c0b0 4d 61 6e 61 67 65 64 20 44 65 62 75 67 67 69 6e  Managed Debuggin
1c0c0 67 20 41 73 73 69 73 74 61 6e 74 73 20 28 4d 44  g Assistants (MD
1c0d0 41 29 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  A) configuration
1c0e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c0f0 23 20 20 20 20 20 20 20 66 69 6c 65 20 66 6f 72  #       file for
1c100 20 74 68 65 20 45 61 67 6c 65 20 73 68 65 6c 6c   the Eagle shell
1c110 20 74 6f 20 74 68 65 20 62 75 69 6c 64 20 6f 75   to the build ou
1c120 74 70 75 74 20 64 69 72 65 63 74 6f 72 79 2c 0d  tput directory,.
1c130 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
1c140 20 20 20 20 20 20 20 77 68 69 6c 65 20 75 73 69         while usi
1c150 6e 67 20 65 61 63 68 20 6f 66 20 74 68 65 20 6e  ng each of the n
1c160 61 6d 65 73 20 6f 66 20 74 68 65 20 76 61 72 69  ames of the vari
1c170 6f 75 73 20 6c 65 67 61 63 79 20 74 65 73 74 0d  ous legacy test.
1c180 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
1c190 20 20 20 20 20 20 20 65 78 65 63 75 74 61 62 6c         executabl
1c1a0 65 73 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 68  es.  This will h
1c1b0 65 6c 70 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  elp to make sure
1c1c0 20 74 68 61 74 20 61 6c 6c 20 74 68 65 0d 0a 20   that all the.. 
1c1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
1c1e0 20 20 20 20 20 6c 65 67 61 63 79 20 74 65 73 74       legacy test
1c1f0 73 20 72 75 6e 20 77 69 74 68 20 65 78 61 63 74  s run with exact
1c200 6c 79 20 74 68 65 20 73 61 6d 65 20 73 65 74 20  ly the same set 
1c210 6f 66 20 4d 61 6e 61 67 65 64 0d 0a 20 20 20 20  of Managed..    
1c220 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
1c230 20 20 44 65 62 75 67 67 69 6e 67 20 41 73 73 69    Debugging Assi
1c240 73 74 61 6e 74 73 20 63 6f 6e 66 69 67 75 72 65  stants configure
1c250 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  d...            
1c260 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1c270 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
1c280 61 6d 65 20 24 6d 64 61 43 6f 6e 66 69 67 46 69  ame $mdaConfigFi
1c290 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
1c2a0 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f             tryCo
1c2b0 70 79 42 69 6e 61 72 79 46 69 6c 65 20 45 61 67  pyBinaryFile Eag
1c2c0 6c 65 53 68 65 6c 6c 2e 65 78 65 2e 6d 64 61 2e  leShell.exe.mda.
1c2d0 63 6f 6e 66 69 67 20 22 22 20 24 66 69 6c 65 4e  config "" $fileN
1c2e0 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ame..           
1c2f0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1c300 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1c310 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
1c320 6f 70 79 20 74 68 65 20 65 78 74 65 72 6e 61 6c  opy the external
1c330 20 62 69 6e 61 72 69 65 73 2c 20 69 66 20 61 6e   binaries, if an
1c340 79 2c 20 74 6f 20 74 68 65 20 64 69 72 65 63 74  y, to the direct
1c350 6f 72 79 20 74 68 61 74 0d 0a 20 20 20 20 20 20  ory that..      
1c360 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1c370 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 45 61 67  contains the Eag
1c380 6c 65 20 73 68 65 6c 6c 2e 20 20 54 68 69 73 20  le shell.  This 
1c390 69 73 20 74 79 70 69 63 61 6c 6c 79 20 75 73 65  is typically use
1c3a0 64 20 74 6f 20 6d 61 6b 65 0d 0a 20 20 20 20 20  d to make..     
1c3b0 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
1c3c0 20 73 75 72 65 20 61 73 73 65 6d 62 6c 69 65 73   sure assemblies
1c3d0 20 72 65 66 65 72 65 6e 63 65 64 20 62 79 20 74   referenced by t
1c3e0 68 65 20 6f 6e 65 73 20 62 65 69 6e 67 20 74 65  he ones being te
1c3f0 73 74 65 64 20 61 72 65 0d 0a 20 20 20 20 20 20  sted are..      
1c400 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1c410 61 76 61 69 6c 61 62 6c 65 20 64 75 72 69 6e 67  available during
1c420 20 74 68 65 20 74 65 73 74 69 6e 67 20 70 72 6f   the testing pro
1c430 63 65 73 73 2e 0d 0a 20 20 20 20 20 20 20 20 20  cess...         
1c440 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1c450 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
1c460 6c 65 4e 61 6d 65 20 24 65 78 74 65 72 6e 61 6c  leName $external
1c470 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
1c480 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
1c490 43 6f 70 79 45 78 74 65 72 6e 61 6c 46 69 6c 65  CopyExternalFile
1c4a0 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20   $fileName..    
1c4b0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1c4c0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
1c4d0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
1c4e0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
1c4f0 28 63 6f 70 79 53 71 6c 69 74 65 4e 61 74 69 76  (copySqliteNativ
1c500 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  eFiles)]} then {
1c510 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c520 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
1c530 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20   # NOTE: If the 
1c540 74 65 73 74 20 70 6c 61 74 66 6f 72 6d 20 69 73  test platform is
1c550 20 6c 69 6b 65 6c 79 20 74 68 65 20 64 65 66 61   likely the defa
1c560 75 6c 74 20 66 6f 72 20 74 68 69 73 0d 0a 20 20  ult for this..  
1c570 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
1c580 20 20 20 20 6d 61 63 68 69 6e 65 2c 20 61 6c 73      machine, als
1c590 6f 20 74 72 79 20 74 6f 20 63 6f 70 79 20 74 68  o try to copy th
1c5a0 65 20 6e 61 74 69 76 65 20 66 69 6c 65 73 20 74  e native files t
1c5b0 6f 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20  o the..         
1c5c0 20 20 20 20 20 23 20 20 20 20 20 20 20 62 69 6e       #       bin
1c5d0 61 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0d 0a 20  ary location... 
1c5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
1c5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1c600 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
1c610 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 49  ::no(copySqliteI
1c620 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 20 26  mplicitFiles)] &
1c630 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
1c640 20 20 20 20 20 20 20 5b 69 73 44 65 66 61 75 6c         [isDefaul
1c650 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20 74  tBuildPlatform t
1c660 72 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  rue]} then {..  
1c670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
1c680 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
1c690 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20  nativeFileNames 
1c6a0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1c6b0 20 20 20 20 20 74 72 79 43 6f 70 79 41 73 73 65       tryCopyAsse
1c6c0 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 0d 0a  mbly $fileName..
1c6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6e0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
1c6f0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
1c700 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
1c710 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53  xists ::no(copyS
1c720 71 6c 69 74 65 4e 6f 6e 49 6d 70 6c 69 63 69 74  qliteNonImplicit
1c730 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
1c740 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c750 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
1c760 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69  ts ::no(copySqli
1c770 74 65 50 6c 61 74 66 6f 72 6d 46 69 6c 65 73 29  tePlatformFiles)
1c780 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
1c790 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72              [str
1c7a0 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74  ing length $plat
1c7b0 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20  form] > 0} then 
1c7c0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1c7d0 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
1c7e0 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c  eName $nativeFil
1c7f0 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
1c800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
1c810 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 24 66  yCopyAssembly $f
1c820 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72  ileName $platfor
1c830 6d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m..             
1c840 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1c850 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1c860 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
1c870 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
1c880 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 41 72  :no(copySqliteAr
1c890 63 68 69 74 65 63 74 75 72 65 46 69 6c 65 73 29  chitectureFiles)
1c8a0 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
1c8b0 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72              [str
1c8c0 69 6e 67 20 6c 65 6e 67 74 68 20 24 61 72 63 68  ing length $arch
1c8d0 69 74 65 63 74 75 72 65 5d 20 3e 20 30 7d 20 74  itecture] > 0} t
1c8e0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1c8f0 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
1c900 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76   fileName $nativ
1c910 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  eFileNames {..  
1c920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c930 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c    tryCopyAssembl
1c940 79 20 24 66 69 6c 65 4e 61 6d 65 20 24 61 72 63  y $fileName $arc
1c950 68 69 74 65 63 74 75 72 65 0d 0a 20 20 20 20 20  hitecture..     
1c960 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
1c970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c980 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
1c990 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
1c9a0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
1c9b0 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
1c9c0 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69  ts ::no(copySqli
1c9d0 74 65 4d 61 6e 61 67 65 64 46 69 6c 65 73 29 5d  teManagedFiles)]
1c9e0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1c9f0 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
1ca00 66 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65  fileName $manage
1ca10 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  dFileNames {..  
1ca20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
1ca30 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 24 66  yCopyAssembly $f
1ca40 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20  ileName..       
1ca50 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1ca60 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1ca70 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1ca80 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
1ca90 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72 79 69   NOTE: Skip tryi
1caa0 6e 67 20 74 6f 20 6c 6f 61 64 20 61 6e 79 20 66  ng to load any f
1cab0 69 6c 65 73 20 69 66 20 69 6e 73 74 72 75 63 74  iles if instruct
1cac0 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ed...          #
1cad0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
1cae0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
1caf0 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 46 69 6c  no(loadSqliteFil
1cb00 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
1cb10 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
1cb20 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
1cb30 28 6c 6f 61 64 53 71 6c 69 74 65 49 6d 70 6c 69  (loadSqliteImpli
1cb40 63 69 74 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  citFiles)]} then
1cb50 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1cb60 20 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c    tryLoadAssembl
1cb70 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  y System.Data.SQ
1cb80 4c 69 74 65 2e 64 6c 6c 0d 0a 20 20 20 20 20 20  Lite.dll..      
1cb90 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1cba0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
1cbb0 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f  o exists ::no(lo
1cbc0 61 64 53 71 6c 69 74 65 4c 69 6e 71 46 69 6c 65  adSqliteLinqFile
1cbd0 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
1cbe0 20 20 20 20 20 20 20 20 20 20 20 74 72 79 4c 6f             tryLo
1cbf0 61 64 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65  adAssembly Syste
1cc00 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69  m.Data.SQLite.Li
1cc10 6e 71 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20  nq.dll..        
1cc20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1cc30 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
1cc40 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64  exists ::no(load
1cc50 53 71 6c 69 74 65 45 66 36 46 69 6c 65 73 29 5d  SqliteEf6Files)]
1cc60 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1cc70 20 20 20 20 20 20 20 20 74 72 79 4c 6f 61 64 41          tryLoadA
1cc80 73 73 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44  ssembly System.D
1cc90 61 74 61 2e 53 51 4c 69 74 65 2e 45 46 36 2e 64  ata.SQLite.EF6.d
1cca0 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll..            
1ccb0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
1ccc0 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
1ccd0 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69  ts ::no(loadSqli
1cce0 74 65 4e 6f 6e 49 6d 70 6c 69 63 69 74 46 69 6c  teNonImplicitFil
1ccf0 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
1cd00 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
1cd10 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
1cd20 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 50 6c 61  no(loadSqlitePla
1cd30 74 66 6f 72 6d 46 69 6c 65 73 29 5d 20 26 26 20  tformFiles)] && 
1cd40 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1cd50 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
1cd60 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e  gth $platform] >
1cd70 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1cd80 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 4c              tryL
1cd90 6f 61 64 41 73 73 65 6d 62 6c 79 20 53 79 73 74  oadAssembly Syst
1cda0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
1cdb0 6c 6c 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 20 20  ll $platform..  
1cdc0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
1cdd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1cde0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
1cdf0 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65   ::no(loadSqlite
1ce00 41 72 63 68 69 74 65 63 74 75 72 65 46 69 6c 65  ArchitectureFile
1ce10 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  s)] && \..      
1ce20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72              [str
1ce30 69 6e 67 20 6c 65 6e 67 74 68 20 24 61 72 63 68  ing length $arch
1ce40 69 74 65 63 74 75 72 65 5d 20 3e 20 30 7d 20 74  itecture] > 0} t
1ce50 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1ce60 20 20 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73         tryLoadAs
1ce70 73 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61  sembly System.Da
1ce80 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 20 24 61  ta.SQLite.dll $a
1ce90 72 63 68 69 74 65 63 74 75 72 65 0d 0a 20 20 20  rchitecture..   
1cea0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
1ceb0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1cec0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1ced0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63    }....        c
1cee0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
1cef0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
1cf00 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1cf10 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1cf20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20       "---- file 
1cf30 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 73 71 6c  version of \"sql
1cf40 69 74 65 33 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20  ite3.dll\"... " 
1cf50 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1cf60 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b   [file version [
1cf70 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
1cf80 65 20 73 71 6c 69 74 65 33 2e 64 6c 6c 5d 5d 20  e sqlite3.dll]] 
1cf90 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  \n]..        }..
1cfa0 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20  ..        catch 
1cfb0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
1cfc0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
1cfd0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1cfe0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1cff0 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69  "---- file versi
1d000 6f 6e 20 6f 66 20 5c 22 53 51 4c 69 74 65 2e 49  on of \"SQLite.I
1d010 6e 74 65 72 6f 70 2e 64 6c 6c 5c 22 2e 2e 2e 20  nterop.dll\"... 
1d020 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
1d030 20 20 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e     [file version
1d040 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
1d050 61 6d 65 20 53 51 4c 69 74 65 2e 49 6e 74 65 72  ame SQLite.Inter
1d060 6f 70 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20  op.dll]] \n]..  
1d070 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1d080 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20     catch {..    
1d090 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
1d0a0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
1d0b0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1d0c0 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66           "---- f
1d0d0 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c  ile version of \
1d0e0 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  "System.Data.SQL
1d0f0 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5c  ite.dll\"... " \
1d100 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1d110 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67  [file version [g
1d120 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  etBinaryFileName
1d130 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
1d140 69 74 65 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20  ite.dll]] \n].. 
1d150 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1d160 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
1d170 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
1d180 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
1d190 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
1d1a0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
1d1b0 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20  file version of 
1d1c0 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  \"System.Data.SQ
1d1d0 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 5c 22 2e  Lite.Linq.dll\".
1d1e0 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  .. " \..        
1d1f0 20 20 20 20 20 20 5b 66 69 6c 65 20 76 65 72 73        [file vers
1d200 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69  ion [getBinaryFi
1d210 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44 61  leName System.Da
1d220 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64  ta.SQLite.Linq.d
1d230 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  ll]] \n]..      
1d240 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63    }....        c
1d250 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
1d260 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
1d270 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1d280 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1d290 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20       "---- file 
1d2a0 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53 79 73  version of \"Sys
1d2b0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
1d2c0 45 46 36 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5c  EF6.dll\"... " \
1d2d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1d2e0 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67  [file version [g
1d2f0 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  etBinaryFileName
1d300 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
1d310 69 74 65 2e 45 46 36 2e 64 6c 6c 5d 5d 20 5c 6e  ite.EF6.dll]] \n
1d320 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  ]..        }....
1d330 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
1d340 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74  ing length $plat
1d350 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20  form] > 0} then 
1d360 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61 74  {..          cat
1d370 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
1d380 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
1d390 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1d3a0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1d3b0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c         "---- fil
1d3c0 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22  e version of \""
1d3d0 20 24 70 6c 61 74 66 6f 72 6d 20 5c 0d 0a 20 20   $platform \..  
1d3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2f                "/
1d3f0 73 71 6c 69 74 65 33 2e 64 6c 6c 5c 22 2e 2e 2e  sqlite3.dll\"...
1d400 20 22 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e   " [file version
1d410 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1d420 20 20 20 20 5b 67 65 74 42 69 6e 61 72 79 46 69      [getBinaryFi
1d430 6c 65 4e 61 6d 65 20 73 71 6c 69 74 65 33 2e 64  leName sqlite3.d
1d440 6c 6c 20 24 70 6c 61 74 66 6f 72 6d 5d 5d 20 5c  ll $platform]] \
1d450 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
1d460 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61 74  ...          cat
1d470 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
1d480 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
1d490 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1d4a0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1d4b0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c         "---- fil
1d4c0 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22  e version of \""
1d4d0 20 24 70 6c 61 74 66 6f 72 6d 20 5c 0d 0a 20 20   $platform \..  
1d4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2f                "/
1d4f0 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64  SQLite.Interop.d
1d500 6c 6c 5c 22 2e 2e 2e 20 22 20 5b 66 69 6c 65 20  ll\"... " [file 
1d510 76 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20  version \..     
1d520 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42             [getB
1d530 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 53 51  inaryFileName SQ
1d540 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c  Lite.Interop.dll
1d550 20 24 70 6c 61 74 66 6f 72 6d 5d 5d 20 5c 6e 5d   $platform]] \n]
1d560 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
1d570 0a 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68  .          catch
1d580 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1d590 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
1d5a0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1d5b0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1d5c0 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20       "---- file 
1d5d0 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24  version of \"" $
1d5e0 70 6c 61 74 66 6f 72 6d 20 5c 0d 0a 20 20 20 20  platform \..    
1d5f0 20 20 20 20 20 20 20 20 20 20 20 20 22 2f 53 79              "/Sy
1d600 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
1d610 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5b 66 69 6c  .dll\"... " [fil
1d620 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20  e version \..   
1d630 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65               [ge
1d640 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
1d650 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
1d660 74 65 2e 64 6c 6c 20 24 70 6c 61 74 66 6f 72 6d  te.dll $platform
1d670 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ]] \n]..        
1d680 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
1d690 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73  ..        if {[s
1d6a0 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 61 72  tring length $ar
1d6b0 63 68 69 74 65 63 74 75 72 65 5d 20 3e 20 30 7d  chitecture] > 0}
1d6c0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1d6d0 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20     catch {..    
1d6e0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
1d6f0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
1d700 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
1d710 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
1d720 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20  -- file version 
1d730 6f 66 20 5c 22 22 20 24 61 72 63 68 69 74 65 63  of \"" $architec
1d740 74 75 72 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  ture \..        
1d750 20 20 20 20 20 20 20 20 22 2f 73 71 6c 69 74 65          "/sqlite
1d760 33 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5b 66 69  3.dll\"... " [fi
1d770 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20 20  le version \..  
1d780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67                [g
1d790 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  etBinaryFileName
1d7a0 20 73 71 6c 69 74 65 33 2e 64 6c 6c 20 24 61 72   sqlite3.dll $ar
1d7b0 63 68 69 74 65 63 74 75 72 65 5d 5d 20 5c 6e 5d  chitecture]] \n]
1d7c0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
1d7d0 0a 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68  .          catch
1d7e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1d7f0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
1d800 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1d810 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1d820 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20       "---- file 
1d830 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24  version of \"" $
1d840 61 72 63 68 69 74 65 63 74 75 72 65 20 5c 0d 0a  architecture \..
1d850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d860 22 2f 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70  "/SQLite.Interop
1d870 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5b 66 69 6c  .dll\"... " [fil
1d880 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20  e version \..   
1d890 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65               [ge
1d8a0 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
1d8b0 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64  SQLite.Interop.d
1d8c0 6c 6c 20 24 61 72 63 68 69 74 65 63 74 75 72 65  ll $architecture
1d8d0 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ]] \n]..        
1d8e0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
1d8f0 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20   catch {..      
1d900 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
1d910 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
1d920 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1d930 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
1d940 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66   file version of
1d950 20 5c 22 22 20 24 61 72 63 68 69 74 65 63 74 75   \"" $architectu
1d960 72 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  re \..          
1d970 20 20 20 20 20 20 22 2f 53 79 73 74 65 6d 2e 44        "/System.D
1d980 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c 22  ata.SQLite.dll\"
1d990 2e 2e 2e 20 22 20 5b 66 69 6c 65 20 76 65 72 73  ... " [file vers
1d9a0 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ion \..         
1d9b0 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61 72         [getBinar
1d9c0 79 46 69 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d  yFileName System
1d9d0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
1d9e0 20 24 61 72 63 68 69 74 65 63 74 75 72 65 5d 5d   $architecture]]
1d9f0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
1da00 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
1da10 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1da20 20 20 20 23 20 4e 4f 54 45 3a 20 47 72 61 62 20     # NOTE: Grab 
1da30 74 68 65 20 6c 69 73 74 20 6f 66 20 6d 61 6e 61  the list of mana
1da40 67 65 64 20 61 73 73 65 6d 62 6c 69 65 73 20 66  ged assemblies f
1da50 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  or the current p
1da60 72 6f 63 65 73 73 0d 0a 20 20 20 20 20 20 20 20  rocess..        
1da70 23 20 20 20 20 20 20 20 61 6e 64 20 72 65 70 6f  #       and repo
1da80 72 74 20 6f 6e 20 74 68 65 20 53 79 73 74 65 6d  rt on the System
1da90 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 72 65 6c  .Data.SQLite rel
1daa0 61 74 65 64 20 6f 6e 65 73 2e 0d 0a 20 20 20 20  ated ones...    
1dab0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
1dac0 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62  f {[haveSQLiteOb
1dad0 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68  jectCommand]} th
1dae0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1daf0 73 65 74 20 61 73 73 65 6d 62 6c 69 65 73 20 5b  set assemblies [
1db00 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 41 70  object invoke Ap
1db10 70 44 6f 6d 61 69 6e 2e 43 75 72 72 65 6e 74 44  pDomain.CurrentD
1db20 6f 6d 61 69 6e 20 47 65 74 41 73 73 65 6d 62 6c  omain GetAssembl
1db30 69 65 73 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ies]....        
1db40 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68    object foreach
1db50 20 61 73 73 65 6d 62 6c 79 20 24 61 73 73 65 6d   assembly $assem
1db60 62 6c 69 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  blies {..       
1db70 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
1db80 20 6d 61 74 63 68 20 5c 7b 53 79 73 74 65 6d 2e   match \{System.
1db90 44 61 74 61 2e 53 51 4c 69 74 65 2a 20 24 61 73  Data.SQLite* $as
1dba0 73 65 6d 62 6c 79 5d 7d 20 74 68 65 6e 20 7b 0d  sembly]} then {.
1dbb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
1dbc0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
1dbd0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1dbe0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1dbf0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 6f 75 6e        "---- foun
1dc00 64 20 6c 6f 61 64 65 64 20 61 73 73 65 6d 62 6c  d loaded assembl
1dc10 79 3a 20 22 20 24 61 73 73 65 6d 62 6c 79 20 5c  y: " $assembly \
1dc20 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
1dc30 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
1dc40 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1dc50 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
1dc60 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
1dc70 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d  :test_channel \.
1dc80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
1dc90 2d 2d 2d 2d 20 64 65 66 69 6e 65 20 63 6f 6e 73  ---- define cons
1dca0 74 61 6e 74 73 20 66 6f 72 20 5c 22 53 79 73 74  tants for \"Syst
1dcb0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 5c 22  em.Data.SQLite\"
1dcc0 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20  ... "....       
1dcd0 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
1dce0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a  .            obj
1dcf0 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
1dd00 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
1dd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
1dd30 74 65 2e 53 51 4c 69 74 65 33 20 44 65 66 69 6e  te.SQLite3 Defin
1dd40 65 43 6f 6e 73 74 61 6e 74 73 0d 0a 20 20 20 20  eConstants..    
1dd50 20 20 20 20 20 20 7d 20 64 65 66 69 6e 65 43 6f        } defineCo
1dd60 6e 73 74 61 6e 74 73 5d 20 3d 3d 20 30 7d 20 74  nstants] == 0} t
1dd70 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1dd80 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
1dd90 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
1dda0 41 72 67 73 20 5b 66 6f 72 6d 61 74 4c 69 73 74  Args [formatList
1ddb0 20 5b 6c 73 6f 72 74 20 5c 0d 0a 20 20 20 20 20   [lsort \..     
1ddc0 20 20 20 20 20 20 20 20 20 20 20 24 64 65 66 69             $defi
1ddd0 6e 65 43 6f 6e 73 74 61 6e 74 73 5d 20 3c 6e 6f  neConstants] <no
1dde0 6e 65 3e 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  ne>] \n]..      
1ddf0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1de00 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1de10 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
1de20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20  unknown\n..     
1de30 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1de40 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74  }....        cat
1de50 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
1de60 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
1de70 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20  annel \..       
1de80 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6f 75         "---- sou
1de90 72 63 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c  rce version of \
1dea0 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  "System.Data.SQL
1deb0 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 0d 0a  ite.dll\"... "..
1dec0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
1ded0 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
1dee0 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
1def0 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
1df00 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
1df10 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
1df20 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69  Data.SQLite.SQLi
1df30 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 50 72 6f  teConnection Pro
1df40 76 69 64 65 72 56 65 72 73 69 6f 6e 0d 0a 20 20  viderVersion..  
1df50 20 20 20 20 20 20 20 20 7d 20 76 65 72 73 69 6f          } versio
1df60 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  n] == 0} then {.
1df70 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
1df80 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
1df90 24 76 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20  $version] == 0} 
1dfa0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1dfb0 20 20 20 20 20 20 73 65 74 20 76 65 72 73 69 6f        set versio
1dfc0 6e 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20  n null..        
1dfd0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1dfe0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
1dff0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
1e000 41 72 67 73 20 24 76 65 72 73 69 6f 6e 20 5c 6e  Args $version \n
1e010 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  ]..          } e
1e020 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
1e030 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
1e040 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e  _channel unknown
1e050 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  \n..          }.
1e060 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
1e070 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20        catch {.. 
1e080 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1e090 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c  ::test_channel \
1e0a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1e0b0 22 2d 2d 2d 2d 20 73 6f 75 72 63 65 20 63 68 65  "---- source che
1e0c0 63 6b 6f 75 74 20 6f 66 20 5c 22 53 79 73 74 65  ckout of \"Syste
1e0d0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
1e0e0 6c 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  l\"... "....    
1e0f0 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
1e100 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1e110 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
1e120 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
1e130 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1e140 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
1e150 51 4c 69 74 65 2e 53 51 4c 69 74 65 43 6f 6e 6e  QLite.SQLiteConn
1e160 65 63 74 69 6f 6e 20 50 72 6f 76 69 64 65 72 53  ection ProviderS
1e170 6f 75 72 63 65 49 64 0d 0a 20 20 20 20 20 20 20  ourceId..       
1e180 20 20 20 7d 20 73 6f 75 72 63 65 49 64 5d 20 3d     } sourceId] =
1e190 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
1e1a0 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74           if {[st
1e1b0 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 6f 75  ring length $sou
1e1c0 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65  rceId] == 0} the
1e1d0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1e1e0 20 20 20 73 65 74 20 73 6f 75 72 63 65 49 64 20     set sourceId 
1e1f0 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20  null..          
1e200 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
1e210 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
1e220 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1e230 67 73 20 24 73 6f 75 72 63 65 49 64 20 5c 6e 5d  gs $sourceId \n]
1e240 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
1e250 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
1e260 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
1e270 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c  channel unknown\
1e280 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  n..          }..
1e290 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1e2a0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1e2b0 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68  # NOTE: Check th
1e2c0 65 20 61 76 61 69 6c 61 62 6c 65 20 62 75 69 6c  e available buil
1e2d0 64 73 20 28 61 6e 64 20 22 72 65 6c 65 61 73 65  ds (and "release
1e2e0 73 22 29 20 6f 66 20 53 51 4c 69 74 65 20 61 6e  s") of SQLite an
1e2f0 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  d..        #    
1e300 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
1e310 51 4c 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20  QLite...        
1e320 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  #..        check
1e330 46 6f 72 53 51 4c 69 74 65 42 75 69 6c 64 73 20  ForSQLiteBuilds 
1e340 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d  $::test_channel.
1e350 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f  .        checkFo
1e360 72 53 51 4c 69 74 65 52 65 6c 65 61 73 65 73 20  rSQLiteReleases 
1e370 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d  $::test_channel.
1e380 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1e390 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f        # NOTE: No
1e3a0 77 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 6b 6e  w, we need to kn
1e3b0 6f 77 20 69 66 20 74 68 65 20 53 51 4c 69 74 65  ow if the SQLite
1e3c0 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20 69 73   core library is
1e3d0 20 61 76 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20   available..    
1e3e0 20 20 20 20 23 20 20 20 20 20 20 20 28 69 2e 65      #       (i.e
1e3f0 2e 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 61  . because the ma
1e400 6e 61 67 65 64 2d 6f 6e 6c 79 20 53 79 73 74 65  naged-only Syste
1e410 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 61 73  m.Data.SQLite as
1e420 73 65 6d 62 6c 79 20 63 61 6e 0d 0a 20 20 20 20  sembly can..    
1e430 20 20 20 20 23 20 20 20 20 20 20 20 6c 6f 61 64      #       load
1e440 20 77 69 74 68 6f 75 74 20 69 74 3b 20 68 6f 77   without it; how
1e450 65 76 65 72 2c 20 69 74 20 63 61 6e 6e 6f 74 20  ever, it cannot 
1e460 64 6f 20 61 6e 79 74 68 69 6e 67 20 75 73 65 66  do anything usef
1e470 75 6c 20 77 69 74 68 6f 75 74 0d 0a 20 20 20 20  ul without..    
1e480 20 20 20 20 23 20 20 20 20 20 20 20 69 74 29 2e      #       it).
1e490 20 20 49 66 20 77 65 20 61 72 65 20 75 73 69 6e    If we are usin
1e4a0 67 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65  g the mixed-mode
1e4b0 20 61 73 73 65 6d 62 6c 79 20 61 6e 64 20 77 65   assembly and we
1e4c0 20 61 6c 72 65 61 64 79 0d 0a 20 20 20 20 20 20   already..      
1e4d0 20 20 23 20 20 20 20 20 20 20 66 6f 75 6e 64 20    #       found 
1e4e0 69 74 20 28 61 62 6f 76 65 29 2c 20 74 68 69 73  it (above), this
1e4f0 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 73   should always s
1e500 75 63 63 65 65 64 2e 0d 0a 20 20 20 20 20 20 20  ucceed...       
1e510 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63   #..        chec
1e520 6b 46 6f 72 53 51 4c 69 74 65 4c 69 62 72 61 72  kForSQLiteLibrar
1e530 79 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  y $::test_channe
1e540 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  l....        #..
1e550 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1e560 43 68 65 63 6b 20 69 66 20 74 68 65 20 53 51 4c  Check if the SQL
1e570 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65  ite interop asse
1e580 6d 62 6c 79 20 69 73 20 61 76 61 69 6c 61 62 6c  mbly is availabl
1e590 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
1e5a0 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53         checkForS
1e5b0 51 4c 69 74 65 49 6e 74 65 72 6f 70 20 24 3a 3a  QLiteInterop $::
1e5c0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a  test_channel....
1e5d0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1e5e0 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
1e5f0 20 74 68 65 20 53 51 4c 69 74 65 20 64 61 74 61   the SQLite data
1e600 62 61 73 65 20 61 6e 64 20 74 65 6d 70 6f 72 61  base and tempora
1e610 72 79 20 64 69 72 65 63 74 6f 72 69 65 73 2e 0d  ry directories..
1e620 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1e630 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69      checkForSQLi
1e640 74 65 44 69 72 65 63 74 6f 72 69 65 73 20 24 3a  teDirectories $:
1e650 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d  :test_channel...
1e660 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1e670 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
1e680 6d 70 74 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  mpt to determine
1e690 20 69 66 20 76 61 72 69 6f 75 73 20 63 6f 6d 70   if various comp
1e6a0 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73  ile-time options
1e6b0 20 6e 65 65 64 65 64 20 66 6f 72 0d 0a 20 20 20   needed for..   
1e6c0 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73       #       tes
1e6d0 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 65  t constraints we
1e6e0 72 65 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74  re enabled for t
1e6f0 68 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d  he managed assem
1e700 62 6c 79 2e 20 20 54 68 65 72 65 0d 0a 20 20 20  bly.  There..   
1e710 20 20 20 20 20 23 20 20 20 20 20 20 20 61 72 65       #       are
1e720 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 2d 74 69   some compile-ti
1e730 6d 65 20 6f 70 74 69 6f 6e 73 20 74 68 61 74 20  me options that 
1e740 6d 75 73 74 20 61 6c 73 6f 20 68 61 76 65 20 62  must also have b
1e750 65 65 6e 20 65 6e 61 62 6c 65 64 0d 0a 20 20 20  een enabled..   
1e760 20 20 20 20 20 23 20 20 20 20 20 20 20 66 6f 72       #       for
1e770 20 74 68 65 20 69 6e 74 65 72 6f 70 20 61 73 73   the interop ass
1e780 65 6d 62 6c 79 20 69 6e 20 6f 72 64 65 72 20 74  embly in order t
1e790 6f 20 62 65 20 65 66 66 65 63 74 69 76 65 2e 20  o be effective. 
1e7a0 20 46 6f 72 20 74 68 6f 73 65 0d 0a 20 20 20 20   For those..    
1e7b0 20 20 20 20 23 20 20 20 20 20 20 20 6f 70 74 69      #       opti
1e7c0 6f 6e 73 2c 20 69 74 20 77 69 6c 6c 20 62 65 20  ons, it will be 
1e7d0 61 73 73 75 6d 65 64 20 74 68 61 74 20 69 74 20  assumed that it 
1e7e0 77 61 73 20 65 6e 61 62 6c 65 64 20 66 6f 72 20  was enabled for 
1e7f0 74 68 65 20 69 6e 74 65 72 6f 70 0d 0a 20 20 20  the interop..   
1e800 20 20 20 20 20 23 20 20 20 20 20 20 20 61 73 73       #       ass
1e810 65 6d 62 6c 79 20 69 66 20 69 74 20 77 61 73 20  embly if it was 
1e820 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 68 65 20  enabled for the 
1e830 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79  managed assembly
1e840 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1e850 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 64 65        foreach de
1e860 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 5b 6c 69  fineConstant [li
1e870 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  st \..          
1e880 20 20 43 48 45 43 4b 5f 53 54 41 54 45 20 43 4f    CHECK_STATE CO
1e890 55 4e 54 5f 48 41 4e 44 4c 45 20 44 45 42 55 47  UNT_HANDLE DEBUG
1e8a0 20 49 4e 54 45 52 4f 50 5f 43 4f 44 45 43 20 49   INTEROP_CODEC I
1e8b0 4e 54 45 52 4f 50 5f 44 45 42 55 47 20 5c 0d 0a  NTEROP_DEBUG \..
1e8c0 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 54 45              INTE
1e8d0 52 4f 50 5f 45 58 54 45 4e 53 49 4f 4e 5f 46 55  ROP_EXTENSION_FU
1e8e0 4e 43 54 49 4f 4e 53 20 49 4e 54 45 52 4f 50 5f  NCTIONS INTEROP_
1e8f0 49 4e 43 4c 55 44 45 5f 43 45 52 4f 44 20 5c 0d  INCLUDE_CEROD \.
1e900 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 54  .            INT
1e910 45 52 4f 50 5f 49 4e 43 4c 55 44 45 5f 45 58 54  EROP_INCLUDE_EXT
1e920 52 41 20 49 4e 54 45 52 4f 50 5f 49 4e 43 4c 55  RA INTEROP_INCLU
1e930 44 45 5f 53 45 45 20 49 4e 54 45 52 4f 50 5f 49  DE_SEE INTEROP_I
1e940 4e 43 4c 55 44 45 5f 5a 49 50 56 46 53 20 5c 0d  NCLUDE_ZIPVFS \.
1e950 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 54  .            INT
1e960 45 52 4f 50 5f 4c 45 47 41 43 59 5f 43 4c 4f 53  EROP_LEGACY_CLOS
1e970 45 20 49 4e 54 45 52 4f 50 5f 4c 4f 47 20 49 4e  E INTEROP_LOG IN
1e980 54 45 52 4f 50 5f 54 45 53 54 5f 45 58 54 45 4e  TEROP_TEST_EXTEN
1e990 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20  SION \..        
1e9a0 20 20 20 20 49 4e 54 45 52 4f 50 5f 56 49 52 54      INTEROP_VIRT
1e9b0 55 41 4c 5f 54 41 42 4c 45 20 4e 45 54 5f 32 30  UAL_TABLE NET_20
1e9c0 20 4e 45 54 5f 33 35 20 4e 45 54 5f 34 30 20 4e   NET_35 NET_40 N
1e9d0 45 54 5f 34 35 20 4e 45 54 5f 34 35 31 20 4e 45  ET_45 NET_451 NE
1e9e0 54 5f 34 36 20 5c 0d 0a 20 20 20 20 20 20 20 20  T_46 \..        
1e9f0 20 20 20 20 4e 45 54 5f 43 4f 4d 50 41 43 54 5f      NET_COMPACT_
1ea00 32 30 20 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50  20 PLATFORM_COMP
1ea10 41 43 54 46 52 41 4d 45 57 4f 52 4b 20 50 52 45  ACTFRAMEWORK PRE
1ea20 4c 4f 41 44 5f 4e 41 54 49 56 45 5f 4c 49 42 52  LOAD_NATIVE_LIBR
1ea30 41 52 59 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ARY \..         
1ea40 20 20 20 52 45 54 41 52 47 45 54 41 42 4c 45 20     RETARGETABLE 
1ea50 53 51 4c 49 54 45 5f 53 54 41 4e 44 41 52 44 20  SQLITE_STANDARD 
1ea60 54 48 52 4f 57 5f 4f 4e 5f 44 49 53 50 4f 53 45  THROW_ON_DISPOSE
1ea70 44 20 54 52 41 43 45 20 5c 0d 0a 20 20 20 20 20  D TRACE \..     
1ea80 20 20 20 20 20 20 20 54 52 41 43 45 5f 43 4f 4e         TRACE_CON
1ea90 4e 45 43 54 49 4f 4e 20 54 52 41 43 45 5f 44 45  NECTION TRACE_DE
1eaa0 54 45 43 54 49 4f 4e 20 54 52 41 43 45 5f 48 41  TECTION TRACE_HA
1eab0 4e 44 4c 45 20 54 52 41 43 45 5f 50 52 45 4c 4f  NDLE TRACE_PRELO
1eac0 41 44 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  AD \..          
1ead0 20 20 54 52 41 43 45 5f 53 48 41 52 45 44 20 54    TRACE_SHARED T
1eae0 52 41 43 45 5f 53 54 41 54 45 4d 45 4e 54 20 54  RACE_STATEMENT T
1eaf0 52 41 43 45 5f 57 41 52 4e 49 4e 47 20 54 52 41  RACE_WARNING TRA
1eb00 43 4b 5f 4d 45 4d 4f 52 59 5f 42 59 54 45 53 20  CK_MEMORY_BYTES 
1eb10 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 55  \..            U
1eb20 53 45 5f 45 4e 54 49 54 59 5f 46 52 41 4d 45 57  SE_ENTITY_FRAMEW
1eb30 4f 52 4b 5f 36 20 55 53 45 5f 49 4e 54 45 52 4f  ORK_6 USE_INTERO
1eb40 50 5f 44 4c 4c 20 55 53 45 5f 50 52 45 50 41 52  P_DLL USE_PREPAR
1eb50 45 5f 56 32 20 57 49 4e 44 4f 57 53 5d 20 7b 0d  E_V2 WINDOWS] {.
1eb60 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
1eb70 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1eb80 43 68 65 63 6b 20 69 66 20 74 68 65 20 63 6f 6d  Check if the com
1eb90 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
1eba0 20 69 73 20 6c 69 73 74 65 64 20 69 6e 20 74 68   is listed in th
1ebb0 65 20 6c 69 73 74 20 6f 66 0d 0a 20 20 20 20 20  e list of..     
1ebc0 20 20 20 20 20 23 20 20 20 20 20 20 20 22 64 65       #       "de
1ebd0 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74 73 22 20  fine constants" 
1ebe0 6b 65 70 74 20 74 72 61 63 6b 20 6f 66 20 62 79  kept track of by
1ebf0 20 74 68 65 20 6d 61 6e 61 67 65 64 20 61 73 73   the managed ass
1ec00 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20  embly...        
1ec10 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 63    #..          c
1ec20 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 65 66  heckForSQLiteDef
1ec30 69 6e 65 43 6f 6e 73 74 61 6e 74 20 24 3a 3a 74  ineConstant $::t
1ec40 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 64 65 66  est_channel $def
1ec50 69 6e 65 43 6f 6e 73 74 61 6e 74 0d 0a 20 20 20  ineConstant..   
1ec60 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1ec70 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
1ec80 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68  OTE: Check if th
1ec90 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  e System.Data.SQ
1eca0 4c 69 74 65 20 70 72 6f 76 69 64 65 72 20 77 61  Lite provider wa
1ecb0 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 0d  s compiled with.
1ecc0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
1ecd0 20 73 75 70 70 6f 72 74 20 66 6f 72 20 61 6e 79   support for any
1ece0 20 65 6e 63 72 79 70 74 65 64 20 64 61 74 61 62   encrypted datab
1ecf0 61 73 65 73 2e 0d 0a 20 20 20 20 20 20 20 20 23  ases...        #
1ed00 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68  ..        if {[h
1ed10 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5c 0d  aveConstraint \.
1ed20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ed30 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 2e   defineConstant.
1ed40 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
1ed50 74 65 2e 49 4e 54 45 52 4f 50 5f 43 4f 44 45 43  te.INTEROP_CODEC
1ed60 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] || \..        
1ed70 20 20 20 20 5b 68 61 76 65 43 6f 6e 73 74 72 61      [haveConstra
1ed80 69 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  int \..         
1ed90 20 20 20 20 20 20 20 64 65 66 69 6e 65 43 6f 6e         defineCon
1eda0 73 74 61 6e 74 2e 53 79 73 74 65 6d 2e 44 61 74  stant.System.Dat
1edb0 61 2e 53 51 4c 69 74 65 2e 49 4e 54 45 52 4f 50  a.SQLite.INTEROP
1edc0 5f 49 4e 43 4c 55 44 45 5f 53 45 45 5d 7d 20 74  _INCLUDE_SEE]} t
1edd0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1ede0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
1edf0 4e 4f 54 45 3a 20 59 65 73 2c 20 61 64 64 20 67  NOTE: Yes, add g
1ee00 65 6e 65 72 69 63 20 63 6f 6e 73 74 72 61 69 6e  eneric constrain
1ee10 74 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65  t for use by the
1ee20 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20   test suite...  
1ee30 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1ee40 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
1ee50 6e 74 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  nt System.Data.S
1ee60 51 4c 69 74 65 2e 45 6e 63 72 79 70 74 69 6f 6e  QLite.Encryption
1ee70 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
1ee80 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1ee90 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
1eea0 74 68 65 20 63 75 72 72 65 6e 74 20 62 75 69 6c  the current buil
1eeb0 64 20 79 65 61 72 2e 20 20 42 61 73 69 63 61 6c  d year.  Basical
1eec0 6c 79 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74  ly, this indicat
1eed0 65 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  es..        #   
1eee0 20 20 20 20 77 68 69 63 68 20 76 65 72 73 69 6f      which versio
1eef0 6e 20 6f 66 20 4d 53 42 75 69 6c 64 20 61 6e 64  n of MSBuild and
1ef00 2f 6f 72 20 56 69 73 75 61 6c 20 53 74 75 64 69  /or Visual Studi
1ef10 6f 20 77 61 73 20 75 73 65 64 20 74 6f 0d 0a 20  o was used to.. 
1ef20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
1ef30 6f 6d 70 69 6c 65 20 74 68 65 20 61 73 73 65 6d  ompile the assem
1ef40 62 6c 79 20 62 69 6e 61 72 69 65 73 20 75 6e 64  bly binaries und
1ef50 65 72 20 74 65 73 74 2e 0d 0a 20 20 20 20 20 20  er test...      
1ef60 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75    #..        tpu
1ef70 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
1ef80 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  el \..          
1ef90 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67    "---- checking
1efa0 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61   for System.Data
1efb0 2e 53 51 4c 69 74 65 20 62 75 69 6c 64 20 79 65  .SQLite build ye
1efc0 61 72 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  ar... "....     
1efd0 20 20 20 73 65 74 20 79 65 61 72 20 5b 67 65 74     set year [get
1efe0 42 75 69 6c 64 59 65 61 72 5d 0d 0a 20 20 20 20  BuildYear]..    
1eff0 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
1f000 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 62 75  t [appendArgs bu
1f010 69 6c 64 59 65 61 72 2e 20 24 79 65 61 72 5d 0d  ildYear. $year].
1f020 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
1f030 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
1f040 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24 79  appendArgs \" $y
1f050 65 61 72 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20  ear \"\n]....   
1f060 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1f070 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68  # NOTE: Check th
1f080 65 20 63 75 72 72 65 6e 74 20 62 75 69 6c 64 20  e current build 
1f090 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 2e 20  .NET Framework. 
1f0a0 20 42 61 73 69 63 61 6c 6c 79 2c 20 74 68 69 73   Basically, this
1f0b0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1f0c0 20 20 69 6e 64 69 63 61 74 65 73 20 77 68 69 63    indicates whic
1f0d0 68 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  h version of the
1f0e0 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 20   .NET Framework 
1f0f0 69 73 20 62 65 69 6e 67 0d 0a 20 20 20 20 20 20  is being..      
1f100 20 20 23 20 20 20 20 20 20 20 75 73 65 64 20 62    #       used b
1f110 79 20 74 68 65 20 61 73 73 65 6d 62 6c 79 20 62  y the assembly b
1f120 69 6e 61 72 69 65 73 20 75 6e 64 65 72 20 74 65  inaries under te
1f130 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  st...        #..
1f140 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
1f150 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d  :test_channel \.
1f160 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
1f170 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
1f180 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
1f190 74 65 20 62 75 69 6c 64 20 2e 4e 45 54 20 46 72  te build .NET Fr
1f1a0 61 6d 65 77 6f 72 6b 2e 2e 2e 20 22 0d 0a 0d 0a  amework... "....
1f1b0 20 20 20 20 20 20 20 20 73 65 74 20 6e 65 74 46          set netF
1f1c0 78 20 5b 67 65 74 42 75 69 6c 64 4e 65 74 46 78  x [getBuildNetFx
1f1d0 5d 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  ]..        addCo
1f1e0 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
1f1f0 41 72 67 73 20 62 75 69 6c 64 46 72 61 6d 65 77  Args buildFramew
1f200 6f 72 6b 2e 20 24 6e 65 74 46 78 5d 0d 0a 20 20  ork. $netFx]..  
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 5c 22 20 24 6e 65 74 46  endArgs \" $netF
1f240 78 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20  x \"\n]....     
1f250 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1f260 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20  NOTE: Check the 
1f270 63 75 72 72 65 6e 74 20 62 75 69 6c 64 20 63 6f  current build co
1f280 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 20 54 68  nfiguration.  Th
1f290 69 73 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c  is should normal
1f2a0 6c 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ly..        #   
1f2b0 20 20 20 20 62 65 20 65 69 74 68 65 72 20 22 44      be either "D
1f2c0 65 62 75 67 22 20 6f 72 20 22 52 65 6c 65 61 73  ebug" or "Releas
1f2d0 65 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e"...        #..
1f2e0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
1f2f0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d  :test_channel \.
1f300 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
1f310 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
1f320 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
1f330 74 65 20 62 75 69 6c 64 20 63 6f 6e 66 69 67 75  te build configu
1f340 72 61 74 69 6f 6e 2e 2e 2e 20 22 0d 0a 0d 0a 20  ration... ".... 
1f350 20 20 20 20 20 20 20 73 65 74 20 63 6f 6e 66 69         set confi
1f360 67 75 72 61 74 69 6f 6e 20 5b 67 65 74 42 75 69  guration [getBui
1f370 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d  ldConfiguration]
1f380 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
1f390 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
1f3a0 72 67 73 20 62 75 69 6c 64 43 6f 6e 66 69 67 75  rgs buildConfigu
1f3b0 72 61 74 69 6f 6e 2e 20 24 63 6f 6e 66 69 67 75  ration. $configu
1f3c0 72 61 74 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 20  ration]..       
1f3d0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
1f3e0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1f3f0 67 73 20 5c 22 20 24 63 6f 6e 66 69 67 75 72 61  gs \" $configura
1f400 74 69 6f 6e 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20  tion \"\n]....  
1f410 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1f420 20 23 20 4e 4f 54 45 3a 20 54 72 79 20 74 6f 20   # NOTE: Try to 
1f430 73 65 74 75 70 20 61 6e 20 69 6e 74 65 72 72 75  setup an interru
1f440 70 74 20 63 61 6c 6c 62 61 63 6b 20 75 73 69 6e  pt callback usin
1f450 67 20 74 68 65 20 73 63 72 69 70 74 20 64 65 62  g the script deb
1f460 75 67 67 65 72 0d 0a 20 20 20 20 20 20 20 20 23  ugger..        #
1f470 20 20 20 20 20 20 20 74 68 61 74 20 77 69 6c 6c         that will
1f480 20 63 61 6e 63 65 6c 20 61 6c 6c 20 53 51 4c 20   cancel all SQL 
1f490 71 75 65 72 69 65 73 20 69 6e 20 70 72 6f 67 72  queries in progr
1f4a0 65 73 73 20 66 6f 72 20 61 6c 6c 20 64 61 74 61  ess for all data
1f4b0 62 61 73 65 0d 0a 20 20 20 20 20 20 20 20 23 20  base..        # 
1f4c0 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e        connection
1f4d0 73 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 69 73 20  s known to this 
1f4e0 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20  interpreter...  
1f4f0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1f500 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
1f510 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 49 6e  ts ::no(sqliteIn
1f520 74 65 72 72 75 70 74 43 61 6c 6c 62 61 63 6b 29  terruptCallback)
1f530 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1f540 20 20 20 20 20 73 65 74 75 70 44 62 49 6e 74 65       setupDbInte
1f550 72 72 75 70 74 43 61 6c 6c 62 61 63 6b 20 24 3a  rruptCallback $:
1f560 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 3a  :test_channel $:
1f570 3a 74 65 73 74 5f 6c 6f 67 0d 0a 20 20 20 20 20  :test_log..     
1f580 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1f590 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
1f5a0 45 3a 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65  E: Check for the
1f5b0 20 6e 61 74 69 76 65 20 72 75 6e 74 69 6d 65 20   native runtime 
1f5c0 6f 70 74 69 6f 6e 2c 20 77 68 69 63 68 20 77 6f  option, which wo
1f5d0 75 6c 64 20 6d 65 61 6e 20 77 65 20 61 72 65 0d  uld mean we are.
1f5e0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
1f5f0 20 75 73 69 6e 67 20 74 68 65 20 6d 69 78 65 64   using the mixed
1f600 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 2e 0d  -mode assembly..
1f610 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1f620 20 20 20 20 63 68 65 63 6b 46 6f 72 52 75 6e 74      checkForRunt
1f630 69 6d 65 4f 70 74 69 6f 6e 20 24 3a 3a 74 65 73  imeOption $::tes
1f640 74 5f 63 68 61 6e 6e 65 6c 20 6e 61 74 69 76 65  t_channel native
1f650 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
1f660 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
1f670 68 65 63 6b 20 69 66 20 74 68 65 20 74 65 73 74  heck if the test
1f680 20 73 75 69 74 65 20 73 68 6f 75 6c 64 20 63 6f   suite should co
1f690 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
1f6a0 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0d 0a 20  f connections.. 
1f6b0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22         #       "
1f6c0 6f 70 65 6e 65 64 22 20 61 6e 64 20 22 63 6c 6f  opened" and "clo
1f6d0 73 65 64 22 20 66 72 6f 6d 20 74 68 65 20 70 6f  sed" from the po
1f6e0 6f 6c 20 77 68 65 6e 20 64 65 74 65 72 6d 69 6e  ol when determin
1f6f0 69 6e 67 20 69 66 20 61 20 74 65 73 74 0d 0a 20  ing if a test.. 
1f700 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70         #       p
1f710 61 73 73 65 64 2e 20 20 44 69 73 61 62 6c 69 6e  assed.  Disablin
1f720 67 20 74 68 69 73 20 62 65 68 61 76 69 6f 72 20  g this behavior 
1f730 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 6e 65 63  is sometimes nec
1f740 65 73 73 61 72 79 20 28 65 2e 67 2e 0d 0a 20 20  essary (e.g...  
1f750 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 75        #       du
1f760 72 69 6e 67 20 74 68 65 20 72 65 6c 65 61 73 65  ring the release
1f770 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73   testing process
1f780 29 20 62 65 63 61 75 73 65 20 74 68 65 72 65 20  ) because there 
1f790 61 72 65 20 73 65 76 65 72 61 6c 0d 0a 20 20 20  are several..   
1f7a0 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73       #       tes
1f7b0 74 73 20 74 68 61 74 20 72 65 6c 79 20 6f 6e 20  ts that rely on 
1f7c0 74 68 65 20 22 6f 70 65 6e 65 64 20 66 72 6f 6d  the "opened from
1f7d0 20 70 6f 6f 6c 22 20 63 6f 75 6e 74 20 62 65 69   pool" count bei
1f7e0 6e 67 20 67 72 65 61 74 65 72 0d 0a 20 20 20 20  ng greater..    
1f7f0 20 20 20 20 23 20 20 20 20 20 20 20 74 68 61 6e      #       than
1f800 20 7a 65 72 6f 2e 20 20 54 68 65 73 65 20 74 65   zero.  These te
1f810 73 74 73 20 6d 61 79 20 66 61 69 6c 20 64 75 65  sts may fail due
1f820 20 74 6f 20 74 68 65 20 6e 6f 6e 2d 64 65 74 65   to the non-dete
1f830 72 6d 69 6e 69 73 74 69 63 0d 0a 20 20 20 20 20  rministic..     
1f840 20 20 20 23 20 20 20 20 20 20 20 62 65 68 61 76     #       behav
1f850 69 6f 72 20 6f 66 20 74 68 65 20 43 4c 52 20 47  ior of the CLR G
1f860 43 2c 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65  C, even when the
1f870 72 65 20 69 73 20 6e 6f 20 62 75 67 20 69 6e 20  re is no bug in 
1f880 74 68 65 20 63 6f 64 65 0d 0a 20 20 20 20 20 20  the code..      
1f890 20 20 23 20 20 20 20 20 20 20 62 65 69 6e 67 20    #       being 
1f8a0 74 65 73 74 65 64 2e 0d 0a 20 20 20 20 20 20 20  tested...       
1f8b0 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63   #..        chec
1f8c0 6b 46 6f 72 52 75 6e 74 69 6d 65 4f 70 74 69 6f  kForRuntimeOptio
1f8d0 6e 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  n $::test_channe
1f8e0 6c 20 6e 6f 50 6f 6f 6c 43 6f 75 6e 74 73 0d 0a  l noPoolCounts..
1f8f0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1f900 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
1f910 63 6b 20 69 66 20 74 68 65 20 74 65 73 74 20 73  ck if the test s
1f920 75 69 74 65 20 73 68 6f 75 6c 64 20 75 73 65 20  uite should use 
1f930 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64  shared-cache mod
1f940 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
1f950 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 52         checkForR
1f960 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 24 3a 3a  untimeOption $::
1f970 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 73 68 61  test_channel sha
1f980 72 65 64 43 61 63 68 65 0d 0a 0d 0a 20 20 20 20  redCache....    
1f990 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1f9a0 20 4e 4f 54 45 3a 20 52 65 70 6f 72 74 20 74 68   NOTE: Report th
1f9b0 65 20 72 65 73 6f 75 72 63 65 20 75 73 61 67 65  e resource usage
1f9c0 20 70 72 69 6f 72 20 74 6f 20 72 75 6e 6e 69 6e   prior to runnin
1f9d0 67 20 61 6e 79 20 74 65 73 74 73 2e 0d 0a 20 20  g any tests...  
1f9e0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1f9f0 20 72 65 70 6f 72 74 53 51 4c 69 74 65 52 65 73   reportSQLiteRes
1fa00 6f 75 72 63 65 73 20 24 3a 3a 74 65 73 74 5f 63  ources $::test_c
1fa10 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20  hannel....      
1fa20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
1fa30 4f 54 45 3a 20 47 72 61 62 20 74 68 65 20 6c 69  OTE: Grab the li
1fa40 73 74 20 6f 66 20 6e 61 74 69 76 65 20 6d 6f 64  st of native mod
1fa50 75 6c 65 73 20 66 6f 72 20 74 68 65 20 63 75 72  ules for the cur
1fa60 72 65 6e 74 20 70 72 6f 63 65 73 73 20 61 6e 64  rent process and
1fa70 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1fa80 20 20 72 65 70 6f 72 74 20 6f 6e 20 74 68 65 20    report on the 
1fa90 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
1faa0 74 65 20 72 65 6c 61 74 65 64 20 6f 6e 65 73 2e  te related ones.
1fab0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1fac0 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51       if {[haveSQ
1fad0 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e  LiteObjectComman
1fae0 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  d]} then {..    
1faf0 20 20 20 20 20 20 73 65 74 20 6d 6f 64 75 6c 65        set module
1fb00 73 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65  s [object invoke
1fb10 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1fb20 20 20 53 79 73 74 65 6d 2e 44 69 61 67 6e 6f 73    System.Diagnos
1fb30 74 69 63 73 2e 50 72 6f 63 65 73 73 2e 47 65 74  tics.Process.Get
1fb40 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 20 4d  CurrentProcess M
1fb50 6f 64 75 6c 65 73 5d 0d 0a 0d 0a 20 20 20 20 20  odules]....     
1fb60 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65       object fore
1fb70 61 63 68 20 2d 61 6c 69 61 73 20 6d 6f 64 75 6c  ach -alias modul
1fb80 65 20 24 6d 6f 64 75 6c 65 73 20 7b 0d 0a 20 20  e $modules {..  
1fb90 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1fba0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
1fbb0 20 54 68 65 20 6d 6f 64 75 6c 65 20 66 69 6c 65   The module file
1fbc0 20 6e 61 6d 65 20 68 65 72 65 20 6d 75 73 74 20   name here must 
1fbd0 62 65 20 6e 6f 72 6d 61 6c 69 7a 65 64 2e 0d 0a  be normalized...
1fbe0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
1fbf0 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 66             set f
1fc00 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 6f  ileName [file no
1fc10 72 6d 61 6c 69 7a 65 20 5b 24 6d 6f 64 75 6c 65  rmalize [$module
1fc20 20 46 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 0d 0a 20   FileName]].... 
1fc30 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
1fc40 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2d 6e 6f  string match -no
1fc50 63 61 73 65 20 2a 2f 73 71 6c 69 74 65 33 2e 64  case */sqlite3.d
1fc60 6c 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74  ll $fileName]} t
1fc70 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1fc80 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
1fc90 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
1fca0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1fcb0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
1fcc0 2d 20 66 6f 75 6e 64 20 6c 6f 61 64 65 64 20 53  - found loaded S
1fcd0 51 4c 69 74 65 20 6e 61 74 69 76 65 20 6c 69 62  QLite native lib
1fce0 72 61 72 79 20 6d 6f 64 75 6c 65 3a 20 22 20 5c  rary module: " \
1fcf0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1fd00 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 20 5c 6e      $fileName \n
1fd10 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
1fd20 20 65 6c 73 65 69 66 20 7b 5b 73 74 72 69 6e 67   elseif {[string
1fd30 20 6d 61 74 63 68 20 5c 0d 0a 20 20 20 20 20 20   match \..      
1fd40 20 20 20 20 20 20 20 20 20 20 2d 6e 6f 63 61 73            -nocas
1fd50 65 20 2a 2f 53 51 4c 69 74 65 2e 49 6e 74 65 72  e */SQLite.Inter
1fd60 6f 70 2e 64 6c 6c 20 24 66 69 6c 65 4e 61 6d 65  op.dll $fileName
1fd70 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1fd80 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1fd90 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
1fda0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1fdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fdc0 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c 6f 61 64  "---- found load
1fdd0 65 64 20 53 51 4c 69 74 65 20 69 6e 74 65 72 6f  ed SQLite intero
1fde0 70 20 61 73 73 65 6d 62 6c 79 20 6d 6f 64 75 6c  p assembly modul
1fdf0 65 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  e: " \..        
1fe00 20 20 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e            $fileN
1fe10 61 6d 65 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ame \n]..       
1fe20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1fe30 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
1fe40 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20  ..        catch 
1fe50 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
1fe60 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
1fe70 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  el \..          
1fe80 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 6d 70 69 6c      "---- compil
1fe90 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 66  e-time options f
1fea0 6f 72 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c  or SQLite core l
1feb0 69 62 72 61 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20  ibrary... ".... 
1fec0 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
1fed0 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
1fee0 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
1fef0 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
1ff00 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
1ff10 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
1ff20 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33  a.SQLite.SQLite3
1ff30 20 53 51 4c 69 74 65 43 6f 6d 70 69 6c 65 4f 70   SQLiteCompileOp
1ff40 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20 20  tions..         
1ff50 20 7d 20 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e   } compileOption
1ff60 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  s] == 0} then {.
1ff70 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
1ff80 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
1ff90 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b  el [appendArgs [
1ffa0 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73 6f 72  formatList [lsor
1ffb0 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
1ffc0 20 20 20 20 20 24 63 6f 6d 70 69 6c 65 4f 70 74       $compileOpt
1ffd0 69 6f 6e 73 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e  ions] <none>] \n
1ffe0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  ]..          } e
1fff0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
20000 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
20010 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e  _channel unknown
20020 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  \n..          }.
20030 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
20040 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20        catch {.. 
20050 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
20060 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c  ::test_channel \
20070 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
20080 22 2d 2d 2d 2d 20 63 6f 6d 70 69 6c 65 2d 74 69  "---- compile-ti
20090 6d 65 20 6f 70 74 69 6f 6e 73 20 66 6f 72 20 53  me options for S
200a0 51 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73  QLite interop as
200b0 73 65 6d 62 6c 79 2e 2e 2e 20 22 0d 0a 0d 0a 20  sembly... ".... 
200c0 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
200d0 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
200e0 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
200f0 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
20100 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
20110 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
20120 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33  a.SQLite.SQLite3
20130 20 49 6e 74 65 72 6f 70 43 6f 6d 70 69 6c 65 4f   InteropCompileO
20140 70 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20  ptions..        
20150 20 20 7d 20 63 6f 6d 70 69 6c 65 4f 70 74 69 6f    } compileOptio
20160 6e 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  ns] == 0} then {
20170 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
20180 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
20190 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
201a0 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73 6f  [formatList [lso
201b0 72 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  rt \..          
201c0 20 20 20 20 20 20 24 63 6f 6d 70 69 6c 65 4f 70        $compileOp
201d0 74 69 6f 6e 73 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c  tions] <none>] \
201e0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  n]..          } 
201f0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
20200 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
20210 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77  t_channel unknow
20220 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  n\n..          }
20230 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
20240 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
20250 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74    # NOTE: Show t
20260 68 65 20 61 63 74 69 76 65 20 74 65 73 74 20 63  he active test c
20270 6f 6e 73 74 72 61 69 6e 74 73 2e 0d 0a 20 20 20  onstraints...   
20280 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
20290 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
202a0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
202b0 73 20 22 2d 2d 2d 2d 20 63 6f 6e 73 74 72 61 69  s "---- constrai
202c0 6e 74 73 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20  nts: " \..      
202d0 20 20 20 20 20 20 5b 66 6f 72 6d 61 74 4c 69 73        [formatLis
202e0 74 20 5b 6c 73 6f 72 74 20 5b 67 65 74 43 6f 6e  t [lsort [getCon
202f0 73 74 72 61 69 6e 74 73 5d 5d 20 3c 6e 6f 6e 65  straints]] <none
20300 3e 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20  >] \n]....      
20310 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
20320 4f 54 45 3a 20 53 61 76 65 20 74 68 65 20 74 65  OTE: Save the te
20330 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66  st constraints f
20340 6f 72 20 75 73 65 20 62 79 20 74 68 72 65 61 64  or use by thread
20350 73 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 69  s created in thi
20360 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  s..        #    
20370 20 20 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64     application d
20380 6f 6d 61 69 6e 2e 20 20 54 68 69 73 20 69 73 20  omain.  This is 
20390 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73  necessary becaus
203a0 65 20 61 6c 6c 20 74 68 65 20 45 61 67 6c 65 0d  e all the Eagle.
203b0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
203c0 20 22 74 65 73 74 20 63 6f 6e 74 65 78 74 22 20   "test context" 
203d0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 70  information is p
203e0 65 72 2d 74 68 72 65 61 64 2e 0d 0a 20 20 20 20  er-thread...    
203f0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
20400 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
20410 20 3a 3a 74 65 73 74 5f 63 6f 6e 73 74 72 61 69   ::test_constrai
20420 6e 74 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  nts]} then {..  
20430 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65          set ::te
20440 73 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 24  st_constraints $
20450 3a 3a 65 61 67 6c 65 5f 74 65 73 74 73 28 63 6f  ::eagle_tests(co
20460 6e 73 74 72 61 69 6e 74 73 29 0d 0a 20 20 20 20  nstraints)..    
20470 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
20480 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
20490 54 45 3a 20 4c 6f 61 64 20 74 68 65 20 22 61 66  TE: Load the "af
204a0 74 65 72 2d 63 6f 6e 73 74 72 61 69 6e 74 73 22  ter-constraints"
204b0 20 63 75 73 74 6f 6d 20 70 65 72 2d 75 73 65 72   custom per-user
204c0 20 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74   and/or per-host
204d0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
204e0 20 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20    test settings 
204f0 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  now...        #.
20500 0a 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c  .        uplevel
20510 20 31 20 5b 6c 69 73 74 20 6c 6f 61 64 53 51 4c   1 [list loadSQL
20520 69 74 65 54 65 73 74 53 65 74 74 69 6e 67 73 20  iteTestSettings 
20530 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
20540 2e 61 66 74 65 72 5d 0d 0a 0d 0a 20 20 20 20 20  .after]....     
20550 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
20560 4e 4f 54 45 3a 20 49 66 20 6e 65 63 65 73 73 61  NOTE: If necessa
20570 72 79 2c 20 65 6e 61 62 6c 65 20 73 68 61 72 65  ry, enable share
20580 64 2d 63 61 63 68 65 20 6d 6f 64 65 20 6e 6f 77  d-cache mode now
20590 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
205a0 20 20 20 20 20 20 69 66 20 7b 5b 68 61 73 52 75        if {[hasRu
205b0 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 73 68 61 72  ntimeOption shar
205c0 65 64 43 61 63 68 65 5d 7d 20 74 68 65 6e 20 7b  edCache]} then {
205d0 0d 0a 20 20 20 20 20 20 20 20 20 20 65 6e 61 62  ..          enab
205e0 6c 65 53 68 61 72 65 64 43 61 63 68 65 20 24 3a  leSharedCache $:
205f0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72  :test_channel tr
20600 75 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ue..        }...
20610 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
20620 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77      # NOTE: Show
20630 20 77 68 65 6e 20 6f 75 72 20 74 65 73 74 73 20   when our tests 
20640 61 63 74 75 61 6c 6c 79 20 62 65 67 61 6e 20 28  actually began (
20650 6e 6f 77 29 2e 0d 0a 20 20 20 20 20 20 20 20 23  now)...        #
20660 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
20670 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
20680 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
20690 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
206a0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
206b0 69 74 65 20 74 65 73 74 73 20 62 65 67 61 6e 20  ite tests began 
206c0 61 74 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  at " \..        
206d0 20 20 20 20 5b 63 6c 6f 63 6b 20 66 6f 72 6d 61      [clock forma
206e0 74 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73  t [clock seconds
206f0 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d  ]] \n]..      }.
20700 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
20710 72 6f 63 20 72 75 6e 53 51 4c 69 74 65 54 65 73  roc runSQLiteTes
20720 74 46 69 6c 65 73 50 72 6f 6c 6f 67 75 65 20 7b  tFilesPrologue {
20730 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 6c 65 76  } {..      uplev
20740 65 6c 20 31 20 7b 0d 0a 20 20 20 20 20 20 20 20  el 1 {..        
20750 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
20760 45 3a 20 53 65 74 75 70 20 74 68 65 20 76 61 72  E: Setup the var
20770 69 61 62 6c 65 73 20 74 68 61 74 20 72 65 66 65  iables that refe
20780 72 20 74 6f 20 74 68 65 20 76 61 72 69 6f 75 73  r to the various
20790 20 6e 6f 6e 2d 64 61 74 61 20 66 69 6c 65 73 0d   non-data files.
207a0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
207b0 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
207c0 20 74 65 73 74 73 20 69 6e 20 74 68 69 73 20 66   tests in this f
207d0 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ile...        #.
207e0 0a 20 20 20 20 20 20 20 20 73 65 74 20 65 6e 74  .        set ent
207f0 69 74 79 46 72 61 6d 65 77 6f 72 6b 44 6c 6c 46  ityFrameworkDllF
20800 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ile \..         
20810 20 20 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65     [getBuildFile
20820 4e 61 6d 65 20 45 6e 74 69 74 79 46 72 61 6d 65  Name EntityFrame
20830 77 6f 72 6b 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20  work.dll]....   
20840 20 20 20 20 20 73 65 74 20 69 6e 73 74 61 6c 6c       set install
20850 65 72 45 78 65 46 69 6c 65 20 5b 67 65 74 42 75  erExeFile [getBu
20860 69 6c 64 46 69 6c 65 4e 61 6d 65 20 49 6e 73 74  ildFileName Inst
20870 61 6c 6c 65 72 2e 65 78 65 5d 0d 0a 20 20 20 20  aller.exe]..    
20880 20 20 20 20 73 65 74 20 73 71 6c 69 74 65 44 65      set sqliteDe
20890 73 69 67 6e 65 72 44 6c 6c 46 69 6c 65 20 5b 67  signerDllFile [g
208a0 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20  etBuildFileName 
208b0 53 51 4c 69 74 65 2e 44 65 73 69 67 6e 65 72 2e  SQLite.Designer.
208c0 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  dll]....        
208d0 73 65 74 20 73 79 73 74 65 6d 44 61 74 61 53 51  set systemDataSQ
208e0 4c 69 74 65 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20  LiteDllFile \.. 
208f0 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42             [getB
20900 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 53 79 73  uildFileName Sys
20910 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
20920 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  dll]....        
20930 73 65 74 20 73 79 73 74 65 6d 44 61 74 61 53 51  set systemDataSQ
20940 4c 69 74 65 4c 69 6e 71 44 6c 6c 46 69 6c 65 20  LiteLinqDllFile 
20950 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
20960 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65  getBuildFileName
20970 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
20980 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 5d 0d 0a 0d  ite.Linq.dll]...
20990 0a 20 20 20 20 20 20 20 20 73 65 74 20 73 79 73  .        set sys
209a0 74 65 6d 44 61 74 61 53 51 4c 69 74 65 45 66 36  temDataSQLiteEf6
209b0 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20  DllFile \..     
209c0 20 20 20 20 20 20 20 5b 67 65 74 42 75 69 6c 64         [getBuild
209d0 46 69 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e  FileName System.
209e0 44 61 74 61 2e 53 51 4c 69 74 65 2e 45 46 36 2e  Data.SQLite.EF6.
209f0 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  dll]....        
20a00 73 65 74 20 74 65 73 74 45 78 65 46 69 6c 65 20  set testExeFile 
20a10 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d  [getBuildFileNam
20a20 65 20 74 65 73 74 2e 65 78 65 5d 0d 0a 20 20 20  e test.exe]..   
20a30 20 20 20 20 20 73 65 74 20 74 65 73 74 4c 69 6e       set testLin
20a40 71 45 78 65 46 69 6c 65 20 5b 67 65 74 42 75 69  qExeFile [getBui
20a50 6c 64 46 69 6c 65 4e 61 6d 65 20 74 65 73 74 6c  ldFileName testl
20a60 69 6e 71 2e 65 78 65 5d 0d 0a 20 20 20 20 20 20  inq.exe]..      
20a70 20 20 73 65 74 20 74 65 73 74 45 66 36 45 78 65    set testEf6Exe
20a80 46 69 6c 65 20 5b 67 65 74 42 75 69 6c 64 46 69  File [getBuildFi
20a90 6c 65 4e 61 6d 65 20 74 65 73 74 65 66 36 2e 65  leName testef6.e
20aa0 78 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  xe]....        #
20ab0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
20ac0 3a 20 53 65 74 75 70 20 74 68 65 20 76 61 72 69  : Setup the vari
20ad0 61 62 6c 65 73 20 74 68 61 74 20 72 65 66 65 72  ables that refer
20ae0 20 74 6f 20 74 68 65 20 76 61 72 69 6f 75 73 20   to the various 
20af0 64 61 74 61 20 66 69 6c 65 73 0d 0a 20 20 20 20  data files..    
20b00 20 20 20 20 23 20 20 20 20 20 20 20 72 65 71 75      #       requ
20b10 69 72 65 64 20 62 79 20 74 68 65 20 74 65 73 74  ired by the test
20b20 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e 0d  s in this file..
20b30 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
20b40 20 20 20 20 73 65 74 20 74 65 73 74 4c 69 6e 71      set testLinq
20b50 4f 75 74 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61  OutFile [file na
20b60 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a  tivename [file j
20b70 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  oin \..         
20b80 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73     [getSQLiteTes
20b90 74 44 61 74 61 50 61 74 68 5d 20 74 65 73 74 6c  tDataPath] testl
20ba0 69 6e 71 2e 6f 75 74 5d 5d 0d 0a 0d 0a 20 20 20  inq.out]]....   
20bb0 20 20 20 20 20 73 65 74 20 6e 6f 72 74 68 77 69       set northwi
20bc0 6e 64 45 66 44 62 46 69 6c 65 20 5b 66 69 6c 65  ndEfDbFile [file
20bd0 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
20be0 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20  e join \..      
20bf0 20 20 20 20 20 20 5b 66 69 6c 65 20 64 69 72 6e        [file dirn
20c00 61 6d 65 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  ame [file dirnam
20c10 65 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74  e [getSQLiteTest
20c20 44 61 74 61 50 61 74 68 5d 5d 5d 20 5c 0d 0a 20  DataPath]]] \.. 
20c30 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 6c             testl
20c40 69 6e 71 20 6e 6f 72 74 68 77 69 6e 64 45 46 2e  inq northwindEF.
20c50 64 62 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  db]]....        
20c60 73 65 74 20 6e 6f 6e 57 61 6c 44 62 46 69 6c 65  set nonWalDbFile
20c70 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
20c80 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a  e [file join \..
20c90 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
20ca0 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61  SQLiteTestDataPa
20cb0 74 68 5d 20 6e 6f 6e 57 61 6c 2e 64 62 5d 5d 0d  th] nonWal.db]].
20cc0 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 77  ...        set w
20cd0 61 6c 44 62 46 69 6c 65 20 5b 66 69 6c 65 20 6e  alDbFile [file n
20ce0 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
20cf0 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  join \..        
20d00 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65      [getSQLiteTe
20d10 73 74 44 61 74 61 50 61 74 68 5d 20 77 61 6c 2e  stDataPath] wal.
20d20 64 62 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  db]]....        
20d30 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
20d40 45 3a 20 54 68 65 20 76 61 72 69 6f 75 73 20 69  E: The various i
20d50 6e 73 74 61 6c 6c 2f 75 6e 69 6e 73 74 61 6c 6c  nstall/uninstall
20d60 20 6c 6f 67 20 66 69 6c 65 73 20 75 73 65 64 20   log files used 
20d70 74 6f 20 74 65 73 74 20 74 68 65 0d 0a 20 20 20  to test the..   
20d80 20 20 20 20 20 23 20 20 20 20 20 20 20 64 65 73       #       des
20d90 69 67 6e 2d 74 69 6d 65 20 63 6f 6d 70 6f 6e 65  ign-time compone
20da0 6e 74 20 69 6e 73 74 61 6c 6c 65 72 2e 0d 0a 20  nt installer... 
20db0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
20dc0 20 20 73 65 74 20 74 65 73 74 49 6e 73 74 61 6c    set testInstal
20dd0 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 20 5b  lVs2005LogFile [
20de0 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
20df0 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20  [file join \..  
20e00 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51            [getSQ
20e10 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68  LiteTestDataPath
20e20 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74  ] Installer_Test
20e30 5f 56 73 32 30 30 35 2e 6c 6f 67 5d 5d 0d 0a 0d  _Vs2005.log]]...
20e40 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73  .        set tes
20e50 74 49 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f  tInstallVs2008Lo
20e60 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69  gFile [file nati
20e70 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  vename [file joi
20e80 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
20e90 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44   [getSQLiteTestD
20ea0 61 74 61 50 61 74 68 5d 20 49 6e 73 74 61 6c 6c  ataPath] Install
20eb0 65 72 5f 54 65 73 74 5f 56 73 32 30 30 38 2e 6c  er_Test_Vs2008.l
20ec0 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  og]]....        
20ed0 73 65 74 20 74 65 73 74 49 6e 73 74 61 6c 6c 56  set testInstallV
20ee0 73 32 30 31 30 4c 6f 67 46 69 6c 65 20 5b 66 69  s2010LogFile [fi
20ef0 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
20f00 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20  ile join \..    
20f10 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69          [getSQLi
20f20 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20  teTestDataPath] 
20f30 49 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56  Installer_Test_V
20f40 73 32 30 31 30 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20  s2010.log]].... 
20f50 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74 49         set testI
20f60 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46  nstallVs2012LogF
20f70 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ile [file native
20f80 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
20f90 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
20fa0 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74  getSQLiteTestDat
20fb0 61 50 61 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72  aPath] Installer
20fc0 5f 54 65 73 74 5f 56 73 32 30 31 32 2e 6c 6f 67  _Test_Vs2012.log
20fd0 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65  ]]....        se
20fe0 74 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32  t testInstallVs2
20ff0 30 31 33 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65  013LogFile [file
21000 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
21010 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20  e join \..      
21020 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65        [getSQLite
21030 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 49 6e  TestDataPath] In
21040 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32  staller_Test_Vs2
21050 30 31 33 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20  013.log]]....   
21060 20 20 20 20 20 73 65 74 20 74 65 73 74 49 6e 73       set testIns
21070 74 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c  tallVs2015LogFil
21080 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
21090 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d  me [file join \.
210a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65  .            [ge
210b0 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50  tSQLiteTestDataP
210c0 61 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54  ath] Installer_T
210d0 65 73 74 5f 56 73 32 30 31 35 2e 6c 6f 67 5d 5d  est_Vs2015.log]]
210e0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
210f0 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
21100 30 30 35 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65  005LogFile [file
21110 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
21120 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20  e join \..      
21130 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65        [getSQLite
21140 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 55 6e  TestDataPath] Un
21150 69 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56  installer_Test_V
21160 73 32 30 30 35 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20  s2005.log]].... 
21170 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74 55         set testU
21180 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f  ninstallVs2008Lo
21190 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69  gFile [file nati
211a0 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  vename [file joi
211b0 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
211c0 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44   [getSQLiteTestD
211d0 61 74 61 50 61 74 68 5d 20 55 6e 69 6e 73 74 61  ataPath] Uninsta
211e0 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 30 38  ller_Test_Vs2008
211f0 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  .log]]....      
21200 20 20 73 65 74 20 74 65 73 74 55 6e 69 6e 73 74    set testUninst
21210 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65  allVs2010LogFile
21220 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
21230 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a  e [file join \..
21240 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
21250 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61  SQLiteTestDataPa
21260 74 68 5d 20 55 6e 69 6e 73 74 61 6c 6c 65 72 5f  th] Uninstaller_
21270 54 65 73 74 5f 56 73 32 30 31 30 2e 6c 6f 67 5d  Test_Vs2010.log]
21280 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74  ]....        set
21290 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73   testUninstallVs
212a0 32 30 31 32 4c 6f 67 46 69 6c 65 20 5b 66 69 6c  2012LogFile [fil
212b0 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69  e nativename [fi
212c0 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20  le join \..     
212d0 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74         [getSQLit
212e0 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 55  eTestDataPath] U
212f0 6e 69 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f  ninstaller_Test_
21300 56 73 32 30 31 32 2e 6c 6f 67 5d 5d 0d 0a 0d 0a  Vs2012.log]]....
21310 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74          set test
21320 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c  UninstallVs2013L
21330 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74  ogFile [file nat
21340 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
21350 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  in \..          
21360 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74    [getSQLiteTest
21370 44 61 74 61 50 61 74 68 5d 20 55 6e 69 6e 73 74  DataPath] Uninst
21380 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31  aller_Test_Vs201
21390 33 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20  3.log]]....     
213a0 20 20 20 73 65 74 20 74 65 73 74 55 6e 69 6e 73     set testUnins
213b0 74 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c  tallVs2015LogFil
213c0 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
213d0 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d  me [file join \.
213e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65  .            [ge
213f0 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50  tSQLiteTestDataP
21400 61 74 68 5d 20 55 6e 69 6e 73 74 61 6c 6c 65 72  ath] Uninstaller
21410 5f 54 65 73 74 5f 56 73 32 30 31 35 2e 6c 6f 67  _Test_Vs2015.log
21420 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 23  ]]....        ##
21430 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
21440 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
21450 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
21460 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
21470 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20 20 20  #####....       
21480 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74   if {![haveConst
21490 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
214a0 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20  s file_ \..     
214b0 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69         [file tai
214c0 6c 20 24 65 6e 74 69 74 79 46 72 61 6d 65 77 6f  l $entityFramewo
214d0 72 6b 44 6c 6c 46 69 6c 65 5d 5d 5d 7d 20 74 68  rkDllFile]]]} th
214e0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
214f0 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
21500 73 74 5f 63 68 61 6e 6e 65 6c 20 24 65 6e 74 69  st_channel $enti
21510 74 79 46 72 61 6d 65 77 6f 72 6b 44 6c 6c 46 69  tyFrameworkDllFi
21520 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  le..        }...
21530 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68  .        if {![h
21540 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  aveConstraint [a
21550 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
21560 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
21570 66 69 6c 65 20 74 61 69 6c 20 24 69 6e 73 74 61  file tail $insta
21580 6c 6c 65 72 45 78 65 46 69 6c 65 5d 5d 5d 7d 20  llerExeFile]]]} 
21590 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
215a0 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24    checkForFile $
215b0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 69 6e  test_channel $in
215c0 73 74 61 6c 6c 65 72 45 78 65 46 69 6c 65 20 49  stallerExeFile I
215d0 6e 73 74 61 6c 6c 65 72 2e 65 78 65 0d 0a 20 20  nstaller.exe..  
215e0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
215f0 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e     if {![haveCon
21600 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
21610 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20  rgs file_ \..   
21620 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
21630 61 69 6c 20 24 73 71 6c 69 74 65 44 65 73 69 67  ail $sqliteDesig
21640 6e 65 72 44 6c 6c 46 69 6c 65 5d 5d 5d 7d 20 74  nerDllFile]]]} t
21650 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
21660 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
21670 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 73 71 6c  est_channel $sql
21680 69 74 65 44 65 73 69 67 6e 65 72 44 6c 6c 46 69  iteDesignerDllFi
21690 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  le..        }...
216a0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68  .        if {![h
216b0 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  aveConstraint [a
216c0 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
216d0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
216e0 66 69 6c 65 20 74 61 69 6c 20 24 73 79 73 74 65  file tail $syste
216f0 6d 44 61 74 61 53 51 4c 69 74 65 44 6c 6c 46 69  mDataSQLiteDllFi
21700 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  le]]]} then {.. 
21710 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f           checkFo
21720 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e  rFile $test_chan
21730 6e 65 6c 20 24 73 79 73 74 65 6d 44 61 74 61 53  nel $systemDataS
21740 51 4c 69 74 65 44 6c 6c 46 69 6c 65 0d 0a 20 20  QLiteDllFile..  
21750 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
21760 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e     if {![haveCon
21770 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
21780 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20  rgs file_ \..   
21790 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
217a0 61 69 6c 20 24 73 79 73 74 65 6d 44 61 74 61 53  ail $systemDataS
217b0 51 4c 69 74 65 4c 69 6e 71 44 6c 6c 46 69 6c 65  QLiteLinqDllFile
217c0 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
217d0 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
217e0 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
217f0 6c 20 24 73 79 73 74 65 6d 44 61 74 61 53 51 4c  l $systemDataSQL
21800 69 74 65 4c 69 6e 71 44 6c 6c 46 69 6c 65 0d 0a  iteLinqDllFile..
21810 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
21820 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43       if {![haveC
21830 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
21840 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20  dArgs file_ \.. 
21850 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
21860 20 74 61 69 6c 20 24 73 79 73 74 65 6d 44 61 74   tail $systemDat
21870 61 53 51 4c 69 74 65 45 66 36 44 6c 6c 46 69 6c  aSQLiteEf6DllFil
21880 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e]]]} then {..  
21890 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
218a0 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e  File $test_chann
218b0 65 6c 20 24 73 79 73 74 65 6d 44 61 74 61 53 51  el $systemDataSQ
218c0 4c 69 74 65 45 66 36 44 6c 6c 46 69 6c 65 0d 0a  LiteEf6DllFile..
218d0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
218e0 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43       if {![haveC
218f0 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
21900 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20  dArgs file_ \.. 
21910 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
21920 20 74 61 69 6c 20 24 74 65 73 74 45 78 65 46 69   tail $testExeFi
21930 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  le]]]} then {.. 
21940 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f           checkFo
21950 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e  rFile $test_chan
21960 6e 65 6c 20 24 74 65 73 74 45 78 65 46 69 6c 65  nel $testExeFile
21970 20 74 65 73 74 2e 65 78 65 0d 0a 20 20 20 20 20   test.exe..     
21980 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
21990 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
219a0 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
219b0 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
219c0 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c        [file tail
219d0 20 24 74 65 73 74 4c 69 6e 71 45 78 65 46 69 6c   $testLinqExeFil
219e0 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e]]]} then {..  
219f0 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
21a00 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e  File $test_chann
21a10 65 6c 20 24 74 65 73 74 4c 69 6e 71 45 78 65 46  el $testLinqExeF
21a20 69 6c 65 20 74 65 73 74 6c 69 6e 71 2e 65 78 65  ile testlinq.exe
21a30 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
21a40 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76         if {![hav
21a50 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  eConstraint [app
21a60 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d  endArgs file_ \.
21a70 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69  .            [fi
21a80 6c 65 20 74 61 69 6c 20 24 74 65 73 74 45 66 36  le tail $testEf6
21a90 45 78 65 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  ExeFile]]]} then
21aa0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   {..          ch
21ab0 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74  eckForFile $test
21ac0 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 45 66  _channel $testEf
21ad0 36 45 78 65 46 69 6c 65 20 74 65 73 74 65 66 36  6ExeFile testef6
21ae0 2e 65 78 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d  .exe..        }.
21af0 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
21b00 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
21b10 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
21b20 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  _ \..           
21b30 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73   [file tail $tes
21b40 74 4c 69 6e 71 4f 75 74 46 69 6c 65 5d 5d 5d 7d  tLinqOutFile]]]}
21b50 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
21b60 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20     checkForFile 
21b70 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74  $test_channel $t
21b80 65 73 74 4c 69 6e 71 4f 75 74 46 69 6c 65 0d 0a  estLinqOutFile..
21b90 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
21ba0 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43       if {![haveC
21bb0 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
21bc0 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20  dArgs file_ \.. 
21bd0 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
21be0 20 74 61 69 6c 20 24 6e 6f 72 74 68 77 69 6e 64   tail $northwind
21bf0 45 66 44 62 46 69 6c 65 5d 5d 5d 7d 20 74 68 65  EfDbFile]]]} the
21c00 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  n {..          c
21c10 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
21c20 74 5f 63 68 61 6e 6e 65 6c 20 24 6e 6f 72 74 68  t_channel $north
21c30 77 69 6e 64 45 66 44 62 46 69 6c 65 0d 0a 20 20  windEfDbFile..  
21c40 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
21c50 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e     if {![haveCon
21c60 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
21c70 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20  rgs file_ \..   
21c80 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
21c90 61 69 6c 20 24 6e 6f 6e 57 61 6c 44 62 46 69 6c  ail $nonWalDbFil
21ca0 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e]]]} then {..  
21cb0 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
21cc0 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e  File $test_chann
21cd0 65 6c 20 24 6e 6f 6e 57 61 6c 44 62 46 69 6c 65  el $nonWalDbFile
21ce0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
21cf0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76         if {![hav
21d00 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  eConstraint [app
21d10 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d  endArgs file_ \.
21d20 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69  .            [fi
21d30 6c 65 20 74 61 69 6c 20 24 77 61 6c 44 62 46 69  le tail $walDbFi
21d40 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  le]]]} then {.. 
21d50 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f           checkFo
21d60 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e  rFile $test_chan
21d70 6e 65 6c 20 24 77 61 6c 44 62 46 69 6c 65 0d 0a  nel $walDbFile..
21d80 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
21d90 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43       if {![haveC
21da0 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
21db0 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20  dArgs file_ \.. 
21dc0 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
21dd0 20 74 61 69 6c 20 24 74 65 73 74 49 6e 73 74 61   tail $testInsta
21de0 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 5d  llVs2005LogFile]
21df0 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
21e00 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69        checkForFi
21e10 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c  le $test_channel
21e20 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32   $testInstallVs2
21e30 30 30 35 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20  005LogFile..    
21e40 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
21e50 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74   if {![haveConst
21e60 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
21e70 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20  s file_ \..     
21e80 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69         [file tai
21e90 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73  l $testInstallVs
21ea0 32 30 30 38 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20  2008LogFile]]]} 
21eb0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
21ec0 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24    checkForFile $
21ed0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65  test_channel $te
21ee0 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c  stInstallVs2008L
21ef0 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20  ogFile..        
21f00 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
21f10 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e  {![haveConstrain
21f20 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
21f30 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  le_ \..         
21f40 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74     [file tail $t
21f50 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 30  estInstallVs2010
21f60 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  LogFile]]]} then
21f70 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   {..          ch
21f80 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74  eckForFile $test
21f90 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 49 6e  _channel $testIn
21fa0 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69  stallVs2010LogFi
21fb0 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  le..        }...
21fc0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68  .        if {![h
21fd0 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  aveConstraint [a
21fe0 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
21ff0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
22000 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74 49  file tail $testI
22010 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46  nstallVs2012LogF
22020 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ile]]]} then {..
22030 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
22040 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
22050 6e 6e 65 6c 20 24 74 65 73 74 49 6e 73 74 61 6c  nnel $testInstal
22060 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65 0d 0a  lVs2012LogFile..
22070 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
22080 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43       if {![haveC
22090 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
220a0 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20  dArgs file_ \.. 
220b0 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
220c0 20 74 61 69 6c 20 24 74 65 73 74 49 6e 73 74 61   tail $testInsta
220d0 6c 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 5d  llVs2013LogFile]
220e0 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
220f0 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69        checkForFi
22100 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c  le $test_channel
22110 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32   $testInstallVs2
22120 30 31 33 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20  013LogFile..    
22130 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
22140 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74   if {![haveConst
22150 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
22160 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20  s file_ \..     
22170 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69         [file tai
22180 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73  l $testInstallVs
22190 32 30 31 35 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20  2015LogFile]]]} 
221a0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
221b0 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24    checkForFile $
221c0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65  test_channel $te
221d0 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c  stInstallVs2015L
221e0 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20  ogFile..        
221f0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
22200 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e  {![haveConstrain
22210 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
22220 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  le_ \..         
22230 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74     [file tail $t
22240 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30  estUninstallVs20
22250 30 35 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68  05LogFile]]]} th
22260 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
22270 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
22280 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74  st_channel $test
22290 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c  UninstallVs2005L
222a0 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20  ogFile..        
222b0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
222c0 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e  {![haveConstrain
222d0 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
222e0 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  le_ \..         
222f0 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74     [file tail $t
22300 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30  estUninstallVs20
22310 30 38 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68  08LogFile]]]} th
22320 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
22330 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
22340 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74  st_channel $test
22350 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c  UninstallVs2008L
22360 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20  ogFile..        
22370 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
22380 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e  {![haveConstrain
22390 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
223a0 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  le_ \..         
223b0 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74     [file tail $t
223c0 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30  estUninstallVs20
223d0 31 30 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68  10LogFile]]]} th
223e0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
223f0 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
22400 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74  st_channel $test
22410 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c  UninstallVs2010L
22420 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20  ogFile..        
22430 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
22440 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e  {![haveConstrain
22450 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
22460 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  le_ \..         
22470 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74     [file tail $t
22480 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30  estUninstallVs20
22490 31 32 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68  12LogFile]]]} th
224a0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
224b0 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
224c0 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74  st_channel $test
224d0 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c  UninstallVs2012L
224e0 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20  ogFile..        
224f0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
22500 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e  {![haveConstrain
22510 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
22520 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  le_ \..         
22530 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74     [file tail $t
22540 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30  estUninstallVs20
22550 31 33 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68  13LogFile]]]} th
22560 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
22570 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
22580 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74  st_channel $test
22590 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c  UninstallVs2013L
225a0 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20  ogFile..        
225b0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
225c0 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e  {![haveConstrain
225d0 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
225e0 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  le_ \..         
225f0 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74     [file tail $t
22600 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30  estUninstallVs20
22610 31 35 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68  15LogFile]]]} th
22620 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
22630 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
22640 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74  st_channel $test
22650 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c  UninstallVs2015L
22660 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20  ogFile..        
22670 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
22680 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72  }.....    proc r
22690 75 6e 53 51 4c 69 74 65 54 65 73 74 46 69 6c 65  unSQLiteTestFile
226a0 73 45 70 69 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a  sEpilogue {} {..
226b0 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20        uplevel 1 
226c0 7b 0d 0a 20 20 20 20 20 20 20 20 75 6e 73 65 74  {..        unset
226d0 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 5c 0d 0a   -nocomplain \..
226e0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
226f0 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c  UninstallVs2015L
22700 6f 67 46 69 6c 65 20 74 65 73 74 55 6e 69 6e 73  ogFile testUnins
22710 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c  tallVs2013LogFil
22720 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
22730 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73   testUninstallVs
22740 32 30 31 32 4c 6f 67 46 69 6c 65 20 74 65 73 74  2012LogFile test
22750 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c  UninstallVs2010L
22760 6f 67 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20  ogFile \..      
22770 20 20 20 20 20 20 74 65 73 74 55 6e 69 6e 73 74        testUninst
22780 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c 65  allVs2008LogFile
22790 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73   testUninstallVs
227a0 32 30 30 35 4c 6f 67 46 69 6c 65 20 5c 0d 0a 20  2005LogFile \.. 
227b0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 49             testI
227c0 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46  nstallVs2015LogF
227d0 69 6c 65 20 74 65 73 74 49 6e 73 74 61 6c 6c 56  ile testInstallV
227e0 73 32 30 31 33 4c 6f 67 46 69 6c 65 20 5c 0d 0a  s2013LogFile \..
227f0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
22800 49 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67  InstallVs2012Log
22810 46 69 6c 65 20 74 65 73 74 49 6e 73 74 61 6c 6c  File testInstall
22820 56 73 32 30 31 30 4c 6f 67 46 69 6c 65 20 5c 0d  Vs2010LogFile \.
22830 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
22840 74 49 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f  tInstallVs2008Lo
22850 67 46 69 6c 65 20 74 65 73 74 49 6e 73 74 61 6c  gFile testInstal
22860 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 0d 0a  lVs2005LogFile..
22870 0d 0a 20 20 20 20 20 20 20 20 75 6e 73 65 74 20  ..        unset 
22880 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 5c 0d 0a 20  -nocomplain \.. 
22890 20 20 20 20 20 20 20 20 20 20 20 6e 6f 72 74 68             north
228a0 77 69 6e 64 45 66 44 62 46 69 6c 65 20 74 65 73  windEfDbFile tes
228b0 74 4c 69 6e 71 4f 75 74 46 69 6c 65 20 5c 0d 0a  tLinqOutFile \..
228c0 20 20 20 20 20 20 20 20 20 20 20 20 77 61 6c 44              walD
228d0 62 46 69 6c 65 20 6e 6f 6e 57 61 6c 44 62 46 69  bFile nonWalDbFi
228e0 6c 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 75 6e  le....        un
228f0 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20  set -nocomplain 
22900 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  \..            t
22910 65 73 74 45 66 36 45 78 65 46 69 6c 65 20 74 65  estEf6ExeFile te
22920 73 74 4c 69 6e 71 45 78 65 46 69 6c 65 20 5c 0d  stLinqExeFile \.
22930 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
22940 74 45 78 65 46 69 6c 65 20 73 79 73 74 65 6d 44  tExeFile systemD
22950 61 74 61 53 51 4c 69 74 65 45 66 36 44 6c 6c 46  ataSQLiteEf6DllF
22960 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ile \..         
22970 20 20 20 73 79 73 74 65 6d 44 61 74 61 53 51 4c     systemDataSQL
22980 69 74 65 4c 69 6e 71 44 6c 6c 46 69 6c 65 20 73  iteLinqDllFile s
22990 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65 44  ystemDataSQLiteD
229a0 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20  llFile \..      
229b0 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 73 69        sqliteDesi
229c0 67 6e 65 72 44 6c 6c 46 69 6c 65 20 69 6e 73 74  gnerDllFile inst
229d0 61 6c 6c 65 72 45 78 65 46 69 6c 65 20 5c 0d 0a  allerExeFile \..
229e0 20 20 20 20 20 20 20 20 20 20 20 20 65 6e 74 69              enti
229f0 74 79 46 72 61 6d 65 77 6f 72 6b 44 6c 6c 46 69  tyFrameworkDllFi
22a00 6c 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  le..      }..   
22a10 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
22a20 72 75 6e 53 51 4c 69 74 65 54 65 73 74 45 70 69  runSQLiteTestEpi
22a30 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20 20 20 20  logue {} {..    
22a40 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
22a50 45 3a 20 53 6b 69 70 20 72 75 6e 6e 69 6e 67 20  E: Skip running 
22a60 6f 75 72 20 63 75 73 74 6f 6d 20 65 70 69 6c 6f  our custom epilo
22a70 67 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20  gue if the main 
22a80 6f 6e 65 20 68 61 73 20 62 65 65 6e 0d 0a 20 20  one has been..  
22a90 20 20 20 20 23 20 20 20 20 20 20 20 73 6b 69 70      #       skip
22aa0 70 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ped...      #.. 
22ab0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
22ac0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 70 69 6c  exists ::no(epil
22ad0 6f 67 75 65 2e 65 61 67 6c 65 29 5d 7d 20 74 68  ogue.eagle)]} th
22ae0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
22af0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
22b00 20 53 68 6f 77 20 77 68 65 6e 20 6f 75 72 20 74   Show when our t
22b10 65 73 74 73 20 61 63 74 75 61 6c 6c 79 20 65 6e  ests actually en
22b20 64 65 64 20 28 6e 6f 77 29 2e 0d 0a 20 20 20 20  ded (now)...    
22b30 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74      #..        t
22b40 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
22b50 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
22b60 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
22b70 22 2d 2d 2d 2d 20 53 79 73 74 65 6d 2e 44 61 74  "---- System.Dat
22b80 61 2e 53 51 4c 69 74 65 20 74 65 73 74 73 20 65  a.SQLite tests e
22b90 6e 64 65 64 20 61 74 20 22 20 5c 0d 0a 20 20 20  nded at " \..   
22ba0 20 20 20 20 20 20 20 20 20 5b 63 6c 6f 63 6b 20           [clock 
22bb0 66 6f 72 6d 61 74 20 5b 63 6c 6f 63 6b 20 73 65  format [clock se
22bc0 63 6f 6e 64 73 5d 5d 20 5c 6e 5d 0d 0a 0d 0a 20  conds]] \n].... 
22bd0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
22be0 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 74    # NOTE: Load t
22bf0 68 65 20 22 65 70 69 6c 6f 67 75 65 22 20 63 75  he "epilogue" cu
22c00 73 74 6f 6d 20 70 65 72 2d 75 73 65 72 20 61 6e  stom per-user an
22c10 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74 20 74 65  d/or per-host te
22c20 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  st..        #   
22c30 20 20 20 20 73 65 74 74 69 6e 67 73 20 6e 6f 77      settings now
22c40 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
22c50 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20        uplevel 1 
22c60 5b 6c 69 73 74 20 6c 6f 61 64 53 51 4c 69 74 65  [list loadSQLite
22c70 54 65 73 74 53 65 74 74 69 6e 67 73 20 24 3a 3a  TestSettings $::
22c80 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 2e 65 70  test_channel .ep
22c90 69 6c 6f 67 75 65 5d 0d 0a 0d 0a 20 20 20 20 20  ilogue]....     
22ca0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
22cb0 42 55 47 46 49 58 3a 20 42 65 66 6f 72 65 20 63  BUGFIX: Before c
22cc0 68 65 63 6b 69 6e 67 20 74 68 65 20 66 69 6e 61  hecking the fina
22cd0 6c 20 72 65 73 6f 75 72 63 65 73 20 69 6e 20 75  l resources in u
22ce0 73 65 20 62 79 20 53 51 4c 69 74 65 2c 20 6d 61  se by SQLite, ma
22cf0 6b 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ke..        #   
22d00 20 20 20 20 20 20 73 75 72 65 20 62 6f 74 68 20        sure both 
22d10 6f 66 20 74 68 65 20 50 52 41 47 4d 41 20 72 65  of the PRAGMA re
22d20 6c 61 74 65 64 20 64 69 72 65 63 74 6f 72 79 20  lated directory 
22d30 6e 61 6d 65 73 20 61 72 65 20 66 72 65 65 64 2e  names are freed.
22d40 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
22d50 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c       checkForSQL
22d60 69 74 65 44 69 72 65 63 74 6f 72 69 65 73 20 24  iteDirectories $
22d70 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74  ::test_channel t
22d80 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  rue....        #
22d90 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
22da0 3a 20 41 6c 73 6f 20 72 65 70 6f 72 74 20 74 68  : Also report th
22db0 65 20 72 65 73 6f 75 72 63 65 20 75 73 61 67 65  e resource usage
22dc0 20 61 66 74 65 72 20 72 75 6e 6e 69 6e 67 20 74   after running t
22dd0 68 65 20 74 65 73 74 73 2e 0d 0a 20 20 20 20 20  he tests...     
22de0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
22df0 70 6f 72 74 53 51 4c 69 74 65 52 65 73 6f 75 72  portSQLiteResour
22e00 63 65 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  ces $::test_chan
22e10 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  nel....        #
22e20 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
22e30 3a 20 52 65 70 6f 72 74 20 74 68 65 20 63 72 69  : Report the cri
22e40 74 69 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75  tical handle cou
22e50 6e 74 73 20 61 66 74 65 72 20 72 75 6e 6e 69 6e  nts after runnin
22e60 67 20 74 68 65 20 74 65 73 74 73 2e 0d 0a 20 20  g the tests...  
22e70 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
22e80 20 67 65 74 53 51 4c 69 74 65 48 61 6e 64 6c 65   getSQLiteHandle
22e90 43 6f 75 6e 74 73 20 24 3a 3a 74 65 73 74 5f 63  Counts $::test_c
22ea0 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20  hannel....      
22eb0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
22ec0 4f 54 45 3a 20 49 66 20 6e 65 63 65 73 73 61 72  OTE: If necessar
22ed0 79 2c 20 64 69 73 61 62 6c 65 20 73 68 61 72 65  y, disable share
22ee0 64 2d 63 61 63 68 65 20 6d 6f 64 65 20 6e 6f 77  d-cache mode now
22ef0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
22f00 20 20 20 20 20 20 69 66 20 7b 5b 68 61 73 52 75        if {[hasRu
22f10 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 73 68 61 72  ntimeOption shar
22f20 65 64 43 61 63 68 65 5d 7d 20 74 68 65 6e 20 7b  edCache]} then {
22f30 0d 0a 20 20 20 20 20 20 20 20 20 20 65 6e 61 62  ..          enab
22f40 6c 65 53 68 61 72 65 64 43 61 63 68 65 20 24 3a  leSharedCache $:
22f50 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 66 61  :test_channel fa
22f60 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  lse..        }..
22f70 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
22f80 0c 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23  ...    #########
22f90 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
22fa0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
22fb0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
22fc0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
22fd0 23 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23  ##..    ########
22fe0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
22ff0 23 23 23 23 23 20 45 4e 44 20 45 61 67 6c 65 20  ##### END Eagle 
23000 4f 4e 4c 59 20 23 23 23 23 23 23 23 23 23 23 23  ONLY ###########
23010 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
23020 23 23 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23  ###..    #######
23030 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
23040 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
23050 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
23060 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
23070 23 23 23 23 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23  ####..  }....  #
23080 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 53 61 76 65  ..  # NOTE: Save
23090 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
230a0 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61   directory conta
230b0 69 6e 69 6e 67 20 74 68 69 73 20 66 69 6c 65 2e  ining this file.
230c0 0d 0a 20 20 23 0d 0a 20 20 69 66 20 7b 21 5b 69  ..  #..  if {![i
230d0 6e 66 6f 20 65 78 69 73 74 73 20 63 6f 6d 6d 6f  nfo exists commo
230e0 6e 5f 64 69 72 65 63 74 6f 72 79 5d 7d 20 74 68  n_directory]} th
230f0 65 6e 20 7b 0d 0a 20 20 20 20 73 65 74 20 63 6f  en {..    set co
23100 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 20 5b  mmon_directory [
23110 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b 69 6e  file dirname [in
23120 66 6f 20 73 63 72 69 70 74 5d 5d 0d 0a 20 20 7d  fo script]]..  }
23130 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54  ....  #..  # NOT
23140 45 3a 20 50 72 6f 76 69 64 65 20 74 68 65 20 53  E: Provide the S
23150 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
23160 65 20 74 65 73 74 20 70 61 63 6b 61 67 65 20 74  e test package t
23170 6f 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65  o the interprete
23180 72 2e 0d 0a 20 20 23 0d 0a 20 20 70 61 63 6b 61  r...  #..  packa
23190 67 65 20 70 72 6f 76 69 64 65 20 53 79 73 74 65  ge provide Syste
231a0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 54 65  m.Data.SQLite.Te
231b0 73 74 20 31 2e 30 0d 0a 7d 0d 0a                 st 1.0..}..