System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact d679554e540a068189c2a5c7b18b2f7eb2620740:


0000: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0010: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0020: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0030: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0040: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
0050: 0a 23 0d 0a 23 20 63 6f 6d 6d 6f 6e 2e 65 61 67  .#..# common.eag
0060: 6c 65 20 2d 2d 0d 0a 23 0d 0a 23 20 57 72 69 74  le --..#..# Writ
0070: 74 65 6e 20 62 79 20 4a 6f 65 20 4d 69 73 74 61  ten by Joe Mista
0080: 63 68 6b 69 6e 2e 0d 0a 23 20 52 65 6c 65 61 73  chkin...# Releas
0090: 65 64 20 74 6f 20 74 68 65 20 70 75 62 6c 69 63  ed to the public
00a0: 20 64 6f 6d 61 69 6e 2c 20 75 73 65 20 61 74 20   domain, use at 
00b0: 79 6f 75 72 20 6f 77 6e 20 72 69 73 6b 21 0d 0a  your own risk!..
00c0: 23 0d 0a 23 23 23 23 23 23 23 23 23 23 23 23 23  #..#############
00d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
00e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
00f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0100: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0110: 23 23 0d 0a 0d 0a 23 0d 0a 23 20 4e 4f 54 45 3a  ##....#..# NOTE:
0120: 20 55 73 65 20 6f 75 72 20 6f 77 6e 20 6e 61 6d   Use our own nam
0130: 65 73 70 61 63 65 20 68 65 72 65 20 62 65 63 61  espace here beca
0140: 75 73 65 20 65 76 65 6e 20 74 68 6f 75 67 68 20  use even though 
0150: 77 65 20 64 6f 20 6e 6f 74 20 64 69 72 65 63 74  we do not direct
0160: 6c 79 0d 0a 23 20 20 20 20 20 20 20 73 75 70 70  ly..#       supp
0170: 6f 72 74 20 6e 61 6d 65 73 70 61 63 65 73 20 6f  ort namespaces o
0180: 75 72 73 65 6c 76 65 73 2c 20 77 65 20 64 6f 20  urselves, we do 
0190: 6e 6f 74 20 77 61 6e 74 20 74 6f 20 70 6f 6c 6c  not want to poll
01a0: 75 74 65 20 74 68 65 20 67 6c 6f 62 61 6c 0d 0a  ute the global..
01b0: 23 20 20 20 20 20 20 20 6e 61 6d 65 73 70 61 63  #       namespac
01c0: 65 20 69 66 20 74 68 69 73 20 73 63 72 69 70 74  e if this script
01d0: 20 61 63 74 75 61 6c 6c 79 20 65 6e 64 73 20 75   actually ends u
01e0: 70 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65  p being evaluate
01f0: 64 20 69 6e 20 54 63 6c 2e 0d 0a 23 0d 0a 6e 61  d in Tcl...#..na
0200: 6d 65 73 70 61 63 65 20 65 76 61 6c 20 3a 3a 45  mespace eval ::E
0210: 61 67 6c 65 20 7b 0d 0a 20 20 69 66 20 7b 5b 69  agle {..  if {[i
0220: 73 45 61 67 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d  sEagle]} then {.
0230: 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23  .    ###########
0240: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0250: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0260: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0270: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0280: 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23  ..    ##########
0290: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02a0: 23 23 20 42 45 47 49 4e 20 45 61 67 6c 65 20 4f  ## BEGIN Eagle O
02b0: 4e 4c 59 20 23 23 23 23 23 23 23 23 23 23 23 23  NLY ############
02c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02d0: 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23  #..    #########
02e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0300: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0310: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0320: 23 23 0d 0a 0d 0a 20 20 20 20 70 72 6f 63 20 67  ##....    proc g
0330: 65 74 42 75 69 6c 64 59 65 61 72 20 7b 7d 20 7b  etBuildYear {} {
0340: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
0350: 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66 20   # NOTE: See if 
0360: 74 68 65 20 22 79 65 61 72 22 20 73 65 74 74 69  the "year" setti
0370: 6e 67 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  ng has been over
0380: 72 69 64 64 65 6e 20 62 79 20 74 68 65 20 75 73  ridden by the us
0390: 65 72 20 28 65 2e 67 2e 0d 0a 20 20 20 20 20 20  er (e.g...      
03a0: 23 20 20 20 20 20 20 20 6f 6e 20 74 68 65 20 63  #       on the c
03b0: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 20 20 54  ommand line).  T
03c0: 68 69 73 20 68 65 6c 70 73 20 63 6f 6e 74 72 6f  his helps contro
03d0: 6c 20 65 78 61 63 74 6c 79 20 77 68 69 63 68 20  l exactly which 
03e0: 73 65 74 20 6f 66 0d 0a 20 20 20 20 20 20 23 20  set of..      # 
03f0: 20 20 20 20 20 20 62 69 6e 61 72 69 65 73 20 77        binaries w
0400: 65 20 61 72 65 20 74 65 73 74 69 6e 67 2c 20 74  e are testing, t
0410: 68 6f 73 65 20 70 72 6f 64 75 63 65 64 20 75 73  hose produced us
0420: 69 6e 67 20 74 68 65 20 56 69 73 75 61 6c 20 53  ing the Visual S
0430: 74 75 64 69 6f 0d 0a 20 20 20 20 20 20 23 20 20  tudio..      #  
0440: 20 20 20 20 20 32 30 30 35 2c 20 32 30 30 38 2c       2005, 2008,
0450: 20 32 30 31 30 2c 20 32 30 31 32 2c 20 32 30 31   2010, 2012, 201
0460: 33 2c 20 6f 72 20 32 30 31 35 20 62 75 69 6c 64  3, or 2015 build
0470: 20 73 79 73 74 65 6d 73 2e 20 20 54 6f 20 6f 76   systems.  To ov
0480: 65 72 72 69 64 65 0d 0a 20 20 20 20 20 20 23 20  erride..      # 
0490: 20 20 20 20 20 20 74 68 69 73 20 76 61 6c 75 65        this value
04a0: 20 76 69 61 20 74 68 65 20 63 6f 6d 6d 61 6e 64   via the command
04b0: 20 6c 69 6e 65 2c 20 65 6e 74 65 72 20 61 20 63   line, enter a c
04c0: 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c 61 72 20 74  ommand similar t
04d0: 6f 20 6f 6e 65 0d 0a 20 20 20 20 20 20 23 20 20  o one..      #  
04e0: 20 20 20 20 20 6f 66 20 74 68 65 20 66 6f 6c 6c       of the foll
04f0: 6f 77 69 6e 67 20 28 61 6c 6c 20 6f 6e 20 6f 6e  owing (all on on
0500: 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20 20 20 20  e line):..      
0510: 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  #..      #      
0520: 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20   EagleShell.exe 
0530: 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20 22  -anyInitialize "
0540: 73 65 74 20 74 65 73 74 5f 79 65 61 72 20 32 30  set test_year 20
0550: 30 35 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20  05"..      #    
0560: 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74       -file .\pat
0570: 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a  h\to\all.eagle..
0580: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
0590: 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c         EagleShel
05a0: 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61  l.exe -anyInitia
05b0: 6c 69 7a 65 20 22 73 65 74 20 74 65 73 74 5f 79  lize "set test_y
05c0: 65 61 72 20 32 30 30 38 22 0d 0a 20 20 20 20 20  ear 2008"..     
05d0: 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65   #         -file
05e0: 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65   .\path\to\all.e
05f0: 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20  agle..      #.. 
0600: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
0610: 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79  leShell.exe -any
0620: 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20  Initialize "set 
0630: 74 65 73 74 5f 79 65 61 72 20 32 30 31 30 22 0d  test_year 2010".
0640: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20  .      #        
0650: 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f   -file .\path\to
0660: 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20  \all.eagle..    
0670: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20    #..      #    
0680: 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78     EagleShell.ex
0690: 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65  e -anyInitialize
06a0: 20 22 73 65 74 20 74 65 73 74 5f 79 65 61 72 20   "set test_year 
06b0: 32 30 31 32 22 0d 0a 20 20 20 20 20 20 23 20 20  2012"..      #  
06c0: 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70         -file .\p
06d0: 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65  ath\to\all.eagle
06e0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
06f0: 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68   #       EagleSh
0700: 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74  ell.exe -anyInit
0710: 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65 73 74  ialize "set test
0720: 5f 79 65 61 72 20 32 30 31 33 22 0d 0a 20 20 20  _year 2013"..   
0730: 20 20 20 23 20 20 20 20 20 20 20 20 20 2d 66 69     #         -fi
0740: 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c  le .\path\to\all
0750: 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d  .eagle..      #.
0760: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45  .      #       E
0770: 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61  agleShell.exe -a
0780: 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65  nyInitialize "se
0790: 74 20 74 65 73 74 5f 79 65 61 72 20 32 30 31 35  t test_year 2015
07a0: 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  "..      #      
07b0: 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c     -file .\path\
07c0: 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20  to\all.eagle..  
07d0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20      #..      #  
07e0: 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e       EagleShell.
07f0: 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69  exe -anyInitiali
0800: 7a 65 20 22 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d  ze "unset -nocom
0810: 70 6c 61 69 6e 20 74 65 73 74 5f 79 65 61 72 22  plain test_year"
0820: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
0830: 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74    -file .\path\t
0840: 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20  o\all.eagle..   
0850: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
0860: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
0870: 65 73 74 5f 79 65 61 72 5d 20 26 26 20 5b 73 74  est_year] && [st
0880: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74  ring length $::t
0890: 65 73 74 5f 79 65 61 72 5d 20 3e 20 30 7d 20 74  est_year] > 0} t
08a0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
08b0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
08c0: 3a 20 55 73 65 20 74 68 65 20 73 70 65 63 69 66  : Use the specif
08d0: 69 65 64 20 74 65 73 74 20 79 65 61 72 2e 20 20  ied test year.  
08e0: 49 66 20 74 68 69 73 20 76 61 72 69 61 62 6c 65  If this variable
08f0: 20 69 73 20 6e 6f 74 20 73 65 74 2c 20 74 68 65   is not set, the
0900: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
0910: 20 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20    default value 
0920: 77 69 6c 6c 20 62 65 20 62 61 73 65 64 20 6f 6e  will be based on
0930: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
0940: 45 61 67 6c 65 20 68 61 73 20 62 65 65 6e 0d 0a  Eagle has been..
0950: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
0960: 63 6f 6d 70 69 6c 65 64 20 61 67 61 69 6e 73 74  compiled against
0970: 20 74 68 65 20 43 4c 52 20 76 32 2e 30 20 6f 72   the CLR v2.0 or
0980: 20 43 4c 52 20 76 34 2e 30 2e 0d 0a 20 20 20 20   CLR v4.0...    
0990: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
09a0: 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 79 65  eturn $::test_ye
09b0: 61 72 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ar..      } else
09c0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
09d0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49         # NOTE: I
09e0: 66 20 45 61 67 6c 65 20 68 61 73 20 62 65 65 6e  f Eagle has been
09f0: 20 63 6f 6d 70 69 6c 65 64 20 61 67 61 69 6e 73   compiled agains
0a00: 74 20 74 68 65 20 43 4c 52 20 76 34 2e 30 2c 20  t the CLR v4.0, 
0a10: 75 73 65 20 22 32 30 31 30 22 20 62 79 0d 0a 20  use "2010" by.. 
0a20: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64         #       d
0a30: 65 66 61 75 6c 74 20 28 77 65 20 63 6f 75 6c 64  efault (we could
0a40: 20 75 73 65 20 22 32 30 31 32 22 2c 20 22 32 30   use "2012", "20
0a50: 31 33 22 2c 20 6f 72 20 22 32 30 31 35 22 20 69  13", or "2015" i
0a60: 6e 20 74 68 61 74 20 63 61 73 65 20 61 73 0d 0a  n that case as..
0a70: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
0a80: 77 65 6c 6c 29 20 61 73 20 74 68 65 20 74 65 73  well) as the tes
0a90: 74 20 79 65 61 72 3b 20 6f 74 68 65 72 77 69 73  t year; otherwis
0aa0: 65 2c 20 75 73 65 20 22 32 30 30 38 22 20 62 79  e, use "2008" by
0ab0: 20 64 65 66 61 75 6c 74 20 28 77 65 0d 0a 20 20   default (we..  
0ac0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
0ad0: 75 6c 64 20 75 73 65 20 22 32 30 30 35 22 20 69  uld use "2005" i
0ae0: 6e 20 74 68 61 74 20 63 61 73 65 20 61 73 20 77  n that case as w
0af0: 65 6c 6c 29 2e 20 20 49 66 20 61 6e 6f 74 68 65  ell).  If anothe
0b00: 72 20 6d 61 6a 6f 72 0d 0a 20 20 20 20 20 20 20  r major..       
0b10: 20 23 20 20 20 20 20 20 20 5b 69 6e 63 6f 6d 70   #       [incomp
0b20: 61 74 69 62 6c 65 5d 20 76 65 72 73 69 6f 6e 20  atible] version 
0b30: 6f 66 20 74 68 65 20 43 4c 52 20 69 73 20 72 65  of the CLR is re
0b40: 6c 65 61 73 65 64 2c 20 74 68 69 73 20 63 68 65  leased, this che
0b50: 63 6b 20 77 69 6c 6c 0d 0a 20 20 20 20 20 20 20  ck will..       
0b60: 20 23 20 20 20 20 20 20 20 68 61 76 65 20 74 6f   #       have to
0b70: 20 62 65 20 63 68 61 6e 67 65 64 2e 20 20 54 68   be changed.  Th
0b80: 65 20 64 65 66 61 75 6c 74 20 74 65 73 74 20 79  e default test y
0b90: 65 61 72 20 74 6f 20 75 73 65 20 66 6f 72 20 61  ear to use for a
0ba0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
0bb0: 20 20 70 61 72 74 69 63 75 6c 61 72 20 43 4c 52    particular CLR
0bc0: 20 76 65 72 73 69 6f 6e 20 6d 61 79 20 62 65 20   version may be 
0bd0: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 73 65  overridden by se
0be0: 74 74 69 6e 67 20 74 68 65 20 67 6c 6f 62 61 6c  tting the global
0bf0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
0c00: 20 20 76 61 72 69 61 62 6c 65 20 22 74 65 73 74    variable "test
0c10: 5f 79 65 61 72 5f 63 6c 72 5f 76 24 58 22 2c 20  _year_clr_v$X", 
0c20: 77 68 65 72 65 20 22 24 58 22 20 6d 61 79 20 5b  where "$X" may [
0c30: 63 75 72 72 65 6e 74 6c 79 5d 20 62 65 0d 0a 20  currently] be.. 
0c40: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65         #       e
0c50: 69 74 68 65 72 20 22 32 22 20 6f 72 20 22 34 22  ither "2" or "4"
0c60: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
0c70: 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 43        if {[haveC
0c80: 6f 6e 73 74 72 61 69 6e 74 20 69 6d 61 67 65 52  onstraint imageR
0c90: 75 6e 74 69 6d 65 34 30 5d 7d 20 74 68 65 6e 20  untime40]} then 
0ca0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
0cb0: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
0cc0: 74 65 73 74 5f 79 65 61 72 5f 63 6c 72 5f 76 34  test_year_clr_v4
0cd0: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
0ce0: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
0cf0: 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 79 65 61  ngth $::test_yea
0d00: 72 5f 63 6c 72 5f 76 34 5d 20 3e 20 30 7d 20 74  r_clr_v4] > 0} t
0d10: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
0d20: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
0d30: 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68    # NOTE: Use th
0d40: 65 20 73 70 65 63 69 66 69 65 64 20 74 65 73 74  e specified test
0d50: 20 79 65 61 72 20 66 6f 72 20 74 68 65 20 43 4c   year for the CL
0d60: 52 20 76 34 2e 30 2e 0d 0a 20 20 20 20 20 20 20  R v4.0...       
0d70: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
0d80: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65      return $::te
0d90: 73 74 5f 79 65 61 72 5f 63 6c 72 5f 76 34 0d 0a  st_year_clr_v4..
0da0: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
0db0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
0dc0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  #..            #
0dd0: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 64   NOTE: Use the d
0de0: 65 66 61 75 6c 74 20 74 65 73 74 20 79 65 61 72  efault test year
0df0: 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76 34 2e   for the CLR v4.
0e00: 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  0...            
0e10: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  #..            r
0e20: 65 74 75 72 6e 20 32 30 31 30 3b 20 23 20 54 4f  eturn 2010; # TO
0e30: 44 4f 3a 20 47 6f 6f 64 20 22 66 61 6c 6c 62 61  DO: Good "fallba
0e40: 63 6b 22 20 64 65 66 61 75 6c 74 3f 0d 0a 20 20  ck" default?..  
0e50: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
0e60: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
0e70: 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f         if {[info
0e80: 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 79   exists ::test_y
0e90: 65 61 72 5f 63 6c 72 5f 76 32 5d 20 26 26 20 5c  ear_clr_v2] && \
0ea0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
0eb0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
0ec0: 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c 72 5f  ::test_year_clr_
0ed0: 76 32 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  v2] > 0} then {.
0ee0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
0ef0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
0f00: 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63  TE: Use the spec
0f10: 69 66 69 65 64 20 74 65 73 74 20 79 65 61 72 20  ified test year 
0f20: 66 6f 72 20 74 68 65 20 43 4c 52 20 76 32 2e 30  for the CLR v2.0
0f30: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
0f40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
0f50: 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 79 65 61  turn $::test_yea
0f60: 72 5f 63 6c 72 5f 76 32 0d 0a 20 20 20 20 20 20  r_clr_v2..      
0f70: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
0f80: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
0f90: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
0fa0: 20 55 73 65 20 74 68 65 20 64 65 66 61 75 6c 74   Use the default
0fb0: 20 74 65 73 74 20 79 65 61 72 20 66 6f 72 20 74   test year for t
0fc0: 68 65 20 43 4c 52 20 76 32 2e 30 2e 0d 0a 20 20  he CLR v2.0...  
0fd0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
0fe0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
0ff0: 32 30 30 38 3b 20 23 20 54 4f 44 4f 3a 20 47 6f  2008; # TODO: Go
1000: 6f 64 20 22 66 61 6c 6c 62 61 63 6b 22 20 64 65  od "fallback" de
1010: 66 61 75 6c 74 3f 0d 0a 20 20 20 20 20 20 20 20  fault?..        
1020: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
1030: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
1040: 0c 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20  ...    #..    # 
1050: 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65  NOTE: This proce
1060: 64 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  dure is only use
1070: 64 20 77 68 65 6e 20 61 64 64 69 6e 67 20 73 68  d when adding sh
1080: 69 6d 6d 65 64 20 74 65 73 74 20 63 6f 6e 73 74  immed test const
1090: 72 61 69 6e 74 73 2e 0d 0a 20 20 20 20 23 0d 0a  raints...    #..
10a0: 20 20 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c      proc getBuil
10b0: 64 43 6c 72 56 65 72 73 69 6f 6e 20 7b 7d 20 7b  dClrVersion {} {
10c0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
10d0: 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f  o exists ::test_
10e0: 63 6c 72 5d 20 26 26 20 5b 73 74 72 69 6e 67 20  clr] && [string 
10f0: 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 63  length $::test_c
1100: 6c 72 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  lr] > 0} then {.
1110: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1120: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
1130: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65  the specified te
1140: 73 74 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 74  st version for t
1150: 68 65 20 43 4c 52 2e 20 20 49 66 20 74 68 69 73  he CLR.  If this
1160: 20 76 61 72 69 61 62 6c 65 0d 0a 20 20 20 20 20   variable..     
1170: 20 20 20 23 20 20 20 20 20 20 20 69 73 20 6e 6f     #       is no
1180: 74 20 73 65 74 2c 20 74 68 65 20 64 65 66 61 75  t set, the defau
1190: 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65  lt value will be
11a0: 20 62 61 73 65 64 20 6f 6e 20 77 68 65 74 68 65   based on whethe
11b0: 72 20 6f 72 20 6e 6f 74 0d 0a 20 20 20 20 20 20  r or not..      
11c0: 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 20    #       Eagle 
11d0: 68 61 73 20 62 65 65 6e 20 63 6f 6d 70 69 6c 65  has been compile
11e0: 64 20 61 67 61 69 6e 73 74 20 74 68 65 20 43 4c  d against the CL
11f0: 52 20 76 32 2e 30 20 6f 72 20 43 4c 52 20 76 34  R v2.0 or CLR v4
1200: 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  .0...        #..
1210: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
1220: 3a 3a 74 65 73 74 5f 63 6c 72 0d 0a 20 20 20 20  ::test_clr..    
1230: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1240: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1250: 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20   NOTE: Check if 
1260: 45 61 67 6c 65 20 68 61 73 20 62 65 65 6e 20 63  Eagle has been c
1270: 6f 6d 70 69 6c 65 64 20 61 67 61 69 6e 73 74 20  ompiled against 
1280: 74 68 65 20 43 4c 52 20 76 34 2e 30 2e 20 20 49  the CLR v4.0.  I
1290: 66 20 73 6f 2c 0d 0a 20 20 20 20 20 20 20 20 23  f so,..        #
12a0: 20 20 20 20 20 20 20 6a 75 73 74 20 75 73 65 20         just use 
12b0: 74 68 61 74 20 43 4c 52 20 76 65 72 73 69 6f 6e  that CLR version
12c0: 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73  .  Otherwise, us
12d0: 65 20 74 68 65 20 76 65 72 73 69 6f 6e 20 66 6f  e the version fo
12e0: 72 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23  r the..        #
12f0: 20 20 20 20 20 20 20 43 4c 52 20 76 32 2e 30 2e         CLR v2.0.
1300: 20 20 49 66 20 61 6e 6f 74 68 65 72 20 6d 61 6a    If another maj
1310: 6f 72 20 5b 69 6e 63 6f 6d 70 61 74 69 62 6c 65  or [incompatible
1320: 5d 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  ] version of the
1330: 20 43 4c 52 0d 0a 20 20 20 20 20 20 20 20 23 20   CLR..        # 
1340: 20 20 20 20 20 20 69 73 20 72 65 6c 65 61 73 65        is release
1350: 64 2c 20 74 68 69 73 20 63 68 65 63 6b 20 77 69  d, this check wi
1360: 6c 6c 20 68 61 76 65 20 74 6f 20 62 65 20 63 68  ll have to be ch
1370: 61 6e 67 65 64 2e 20 20 54 68 65 20 64 65 66 61  anged.  The defa
1380: 75 6c 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ult..        #  
1390: 20 20 20 20 20 76 65 72 73 69 6f 6e 20 76 61 6c       version val
13a0: 75 65 20 66 6f 72 20 61 20 70 61 72 74 69 63 75  ue for a particu
13b0: 6c 61 72 20 43 4c 52 20 76 65 72 73 69 6f 6e 20  lar CLR version 
13c0: 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64 64 65  may be overridde
13d0: 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  n..        #    
13e0: 20 20 20 62 79 20 73 65 74 74 69 6e 67 20 74 68     by setting th
13f0: 65 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  e global variabl
1400: 65 20 22 74 65 73 74 5f 63 6c 72 5f 76 24 58 22  e "test_clr_v$X"
1410: 2c 20 77 68 65 72 65 20 22 24 58 22 20 6d 61 79  , where "$X" may
1420: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1430: 20 20 5b 63 75 72 72 65 6e 74 6c 79 5d 20 62 65    [currently] be
1440: 20 65 69 74 68 65 72 20 22 32 22 20 6f 72 20 22   either "2" or "
1450: 34 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  4"...        #..
1460: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76          if {[hav
1470: 65 43 6f 6e 73 74 72 61 69 6e 74 20 69 6d 61 67  eConstraint imag
1480: 65 52 75 6e 74 69 6d 65 34 30 5d 7d 20 74 68 65  eRuntime40]} the
1490: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
14a0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
14b0: 3a 3a 74 65 73 74 5f 63 6c 72 5f 76 34 5d 20 26  ::test_clr_v4] &
14c0: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
14d0: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
14e0: 68 20 24 3a 3a 74 65 73 74 5f 63 6c 72 5f 76 34  h $::test_clr_v4
14f0: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
1500: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
1510: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
1520: 3a 20 55 73 65 20 74 68 65 20 73 70 65 63 69 66  : Use the specif
1530: 69 65 64 20 74 65 73 74 20 76 65 72 73 69 6f 6e  ied test version
1540: 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76 34 2e   for the CLR v4.
1550: 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  0...            
1560: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  #..            r
1570: 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 63 6c  eturn $::test_cl
1580: 72 5f 76 34 0d 0a 20 20 20 20 20 20 20 20 20 20  r_v4..          
1590: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
15a0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
15b0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65       # NOTE: Use
15c0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 74 65 73   the default tes
15d0: 74 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 74 68  t version for th
15e0: 65 20 43 4c 52 20 76 34 2e 30 2e 0d 0a 20 20 20  e CLR v4.0...   
15f0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1600: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 34          return 4
1610: 2e 30 2e 33 30 33 31 39 3b 20 23 20 54 4f 44 4f  .0.30319; # TODO
1620: 3a 20 47 6f 6f 64 20 22 66 61 6c 6c 62 61 63 6b  : Good "fallback
1630: 22 20 64 65 66 61 75 6c 74 3f 0d 0a 20 20 20 20  " default?..    
1640: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1650: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1660: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
1670: 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 63 6c 72  xists ::test_clr
1680: 5f 76 32 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  _v2] && \..     
1690: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
16a0: 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f   length $::test_
16b0: 63 6c 72 5f 76 32 5d 20 3e 20 30 7d 20 74 68 65  clr_v2] > 0} the
16c0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
16d0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
16e0: 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20  # NOTE: Use the 
16f0: 73 70 65 63 69 66 69 65 64 20 74 65 73 74 20 76  specified test v
1700: 65 72 73 69 6f 6e 20 66 6f 72 20 74 68 65 20 43  ersion for the C
1710: 4c 52 20 76 32 2e 30 2e 0d 0a 20 20 20 20 20 20  LR v2.0...      
1720: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1730: 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74       return $::t
1740: 65 73 74 5f 63 6c 72 5f 76 32 0d 0a 20 20 20 20  est_clr_v2..    
1750: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1760: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
1770: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
1780: 45 3a 20 55 73 65 20 74 68 65 20 64 65 66 61 75  E: Use the defau
1790: 6c 74 20 74 65 73 74 20 76 65 72 73 69 6f 6e 20  lt test version 
17a0: 66 6f 72 20 74 68 65 20 43 4c 52 20 76 32 2e 30  for the CLR v2.0
17b0: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
17c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
17d0: 74 75 72 6e 20 32 2e 30 2e 35 30 37 32 37 3b 20  turn 2.0.50727; 
17e0: 23 20 54 4f 44 4f 3a 20 47 6f 6f 64 20 22 66 61  # TODO: Good "fa
17f0: 6c 6c 62 61 63 6b 22 20 64 65 66 61 75 6c 74 3f  llback" default?
1800: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1810: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1820: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
1830: 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 59 65   proc getBuildYe
1840: 61 72 73 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  ars {} {..      
1850: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
1860: 20 53 65 65 20 69 66 20 74 68 65 20 6c 69 73 74   See if the list
1870: 20 6f 66 20 74 65 73 74 20 79 65 61 72 73 20 68   of test years h
1880: 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64  as been overridd
1890: 65 6e 20 62 79 20 74 68 65 20 75 73 65 72 0d 0a  en by the user..
18a0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 28 65        #       (e
18b0: 2e 67 2e 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61  .g. on the comma
18c0: 6e 64 20 6c 69 6e 65 29 2e 0d 0a 20 20 20 20 20  nd line)...     
18d0: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
18e0: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73  nfo exists ::tes
18f0: 74 5f 79 65 61 72 73 5d 20 26 26 20 5b 6c 6c 65  t_years] && [lle
1900: 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 79 65 61  ngth $::test_yea
1910: 72 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  rs] > 0} then {.
1920: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1930: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
1940: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 69  the specified li
1950: 73 74 20 6f 66 20 74 65 73 74 20 79 65 61 72 73  st of test years
1960: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1970: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
1980: 74 65 73 74 5f 79 65 61 72 73 0d 0a 20 20 20 20  test_years..    
1990: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
19a0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
19b0: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 64   NOTE: Use the d
19c0: 65 66 61 75 6c 74 20 6c 69 73 74 20 6f 66 20 74  efault list of t
19d0: 65 73 74 20 79 65 61 72 73 20 28 69 2e 65 2e 20  est years (i.e. 
19e0: 61 6c 6c 29 2e 0d 0a 20 20 20 20 20 20 20 20 23  all)...        #
19f0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
1a00: 20 5b 6c 69 73 74 20 32 30 30 35 20 32 30 30 38   [list 2005 2008
1a10: 20 32 30 31 30 20 32 30 31 32 20 32 30 31 33 20   2010 2012 2013 
1a20: 32 30 31 35 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  2015]..      }..
1a30: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
1a40: 6f 63 20 67 65 74 42 75 69 6c 64 4e 65 74 46 78  oc getBuildNetFx
1a50: 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
1a60: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 65        # NOTE: Se
1a70: 65 20 69 66 20 74 68 65 20 74 65 73 74 20 2e 4e  e if the test .N
1a80: 45 54 20 46 72 61 6d 65 77 6f 72 6b 20 73 65 74  ET Framework set
1a90: 74 69 6e 67 20 68 61 73 20 62 65 65 6e 20 6f 76  ting has been ov
1aa0: 65 72 72 69 64 64 65 6e 20 62 79 0d 0a 20 20 20  erridden by..   
1ab0: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 75     #       the u
1ac0: 73 65 72 20 28 65 2e 67 2e 20 6f 6e 20 74 68 65  ser (e.g. on the
1ad0: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 0d   command line)..
1ae0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1af0: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
1b00: 20 3a 3a 74 65 73 74 5f 6e 65 74 5f 66 78 5d 20   ::test_net_fx] 
1b10: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
1b20: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
1b30: 3a 3a 74 65 73 74 5f 6e 65 74 5f 66 78 5d 20 3e  ::test_net_fx] >
1b40: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1b50: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1b60: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73   NOTE: Use the s
1b70: 70 65 63 69 66 69 65 64 20 74 65 73 74 20 2e 4e  pecified test .N
1b80: 45 54 20 46 72 61 6d 65 77 6f 72 6b 2e 0d 0a 20  ET Framework... 
1b90: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1ba0: 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74    return $::test
1bb0: 5f 6e 65 74 5f 66 78 0d 0a 20 20 20 20 20 20 7d  _net_fx..      }
1bc0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1bd0: 20 73 65 74 20 79 65 61 72 20 5b 67 65 74 42 75   set year [getBu
1be0: 69 6c 64 59 65 61 72 5d 0d 0a 20 20 20 20 20 20  ildYear]..      
1bf0: 20 20 73 65 74 20 79 65 61 72 56 61 72 4e 61 6d    set yearVarNam
1c00: 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20 3a 3a  e [appendArgs ::
1c10: 74 65 73 74 5f 6e 65 74 5f 66 78 5f 20 24 79 65  test_net_fx_ $ye
1c20: 61 72 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69  ar]....        i
1c30: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
1c40: 24 79 65 61 72 56 61 72 4e 61 6d 65 5d 20 26 26  $yearVarName] &&
1c50: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1c60: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 5b  [string length [
1c70: 73 65 74 20 24 79 65 61 72 56 61 72 4e 61 6d 65  set $yearVarName
1c80: 5d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ]] > 0} then {..
1c90: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1ca0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55         # NOTE: U
1cb0: 73 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64  se the specified
1cc0: 20 74 65 73 74 20 2e 4e 45 54 20 46 72 61 6d 65   test .NET Frame
1cd0: 77 6f 72 6b 2c 20 62 61 73 65 64 20 6f 6e 20 74  work, based on t
1ce0: 68 65 20 62 75 69 6c 64 0d 0a 20 20 20 20 20 20  he build..      
1cf0: 20 20 20 20 23 20 20 20 20 20 20 20 79 65 61 72      #       year
1d00: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
1d10: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1d20: 20 5b 73 65 74 20 24 79 65 61 72 56 61 72 4e 61   [set $yearVarNa
1d30: 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65  me]..        } e
1d40: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
1d50: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
1d60: 4e 4f 54 45 3a 20 46 61 6c 6c 62 61 63 6b 20 74  NOTE: Fallback t
1d70: 6f 20 74 68 65 20 22 77 65 6c 6c 20 6b 6e 6f 77  o the "well know
1d80: 6e 22 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72  n" .NET Framewor
1d90: 6b 20 76 65 72 73 69 6f 6e 20 74 68 61 74 0d 0a  k version that..
1da0: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
1db0: 20 20 69 73 20 6d 6f 73 74 20 63 6c 6f 73 65 6c    is most closel
1dc0: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
1dd0: 68 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 76  h a particular v
1de0: 65 72 73 69 6f 6e 20 6f 66 0d 0a 20 20 20 20 20  ersion of..     
1df0: 20 20 20 20 20 23 20 20 20 20 20 20 20 56 69 73       #       Vis
1e00: 75 61 6c 20 53 74 75 64 69 6f 2e 0d 0a 20 20 20  ual Studio...   
1e10: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1e20: 20 20 20 20 73 77 69 74 63 68 20 2d 65 78 61 63      switch -exac
1e30: 74 20 2d 2d 20 24 79 65 61 72 20 7b 0d 0a 20 20  t -- $year {..  
1e40: 20 20 20 20 20 20 20 20 20 20 32 30 30 35 20 7b            2005 {
1e50: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1e60: 72 65 74 75 72 6e 20 6e 65 74 46 78 32 30 0d 0a  return netFx20..
1e70: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1e80: 20 20 20 20 20 20 20 20 20 20 20 32 30 30 38 20             2008 
1e90: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1ea0: 20 72 65 74 75 72 6e 20 6e 65 74 46 78 33 35 0d   return netFx35.
1eb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
1ec0: 20 20 20 20 20 20 20 20 20 20 20 20 32 30 31 30              2010
1ed0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1ee0: 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78 34 30    return netFx40
1ef0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
1f00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 32 30 31  .            201
1f10: 32 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  2 {..           
1f20: 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78 34     return netFx4
1f30: 35 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  5..            }
1f40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 32 30  ..            20
1f50: 31 33 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  13 {..          
1f60: 20 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78      return netFx
1f70: 34 35 31 3b 20 23 20 54 4f 44 4f 3a 20 4f 72 20  451; # TODO: Or 
1f80: 22 6e 65 74 46 78 34 35 32 22 3f 0d 0a 20 20 20  "netFx452"?..   
1f90: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1fa0: 20 20 20 20 20 20 20 20 32 30 31 35 20 7b 0d 0a          2015 {..
1fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1fc0: 74 75 72 6e 20 6e 65 74 46 78 34 36 3b 20 23 20  turn netFx46; # 
1fd0: 54 4f 44 4f 3a 20 4f 72 20 22 6e 65 74 46 78 34  TODO: Or "netFx4
1fe0: 36 31 22 3f 0d 0a 20 20 20 20 20 20 20 20 20 20  61"?..          
1ff0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
2000: 20 64 65 66 61 75 6c 74 20 7b 0d 0a 20 20 20 20   default {..    
2010: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2020: 20 6e 65 74 46 78 33 35 3b 20 23 20 54 4f 44 4f   netFx35; # TODO
2030: 3a 20 47 6f 6f 64 20 22 66 61 6c 6c 62 61 63 6b  : Good "fallback
2040: 22 20 64 65 66 61 75 6c 74 3f 0d 0a 20 20 20 20  " default?..    
2050: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
2060: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
2070: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
2080: 7d 0d 0a 0c 0d 0a 20 20 20 20 23 0d 0a 20 20 20  }.....    #..   
2090: 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72   # NOTE: This pr
20a0: 6f 63 65 64 75 72 65 20 73 68 6f 75 6c 64 20 72  ocedure should r
20b0: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
20c0: 66 20 74 68 65 20 63 6f 6e 66 69 67 75 72 65 64  f the configured
20d0: 20 74 65 73 74 0d 0a 20 20 20 20 23 20 20 20 20   test..    #    
20e0: 20 20 20 70 6c 61 74 66 6f 72 6d 20 69 73 20 6d     platform is m
20f0: 6f 73 74 20 6c 69 6b 65 6c 79 20 74 68 65 20 64  ost likely the d
2100: 65 66 61 75 6c 74 20 66 6f 72 20 74 68 69 73 20  efault for this 
2110: 6d 61 63 68 69 6e 65 2e 0d 0a 20 20 20 20 23 0d  machine...    #.
2120: 0a 20 20 20 20 70 72 6f 63 20 69 73 44 65 66 61  .    proc isDefa
2130: 75 6c 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d  ultBuildPlatform
2140: 20 7b 20 7b 76 65 72 62 6f 73 65 20 66 61 6c 73   { {verbose fals
2150: 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e} } {..      #.
2160: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
2170: 75 6e 6e 69 6e 67 20 6f 6e 20 57 6f 57 36 34 20  unning on WoW64 
2180: 69 73 20 6e 65 76 65 72 20 74 68 65 20 64 65 66  is never the def
2190: 61 75 6c 74 20 70 6c 61 74 66 6f 72 6d 2e 0d 0a  ault platform...
21a0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
21b0: 66 20 7b 5b 69 73 52 75 6e 6e 69 6e 67 57 6f 57  f {[isRunningWoW
21c0: 36 34 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  64]} then {..   
21d0: 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73       if {$verbos
21e0: 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
21f0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
2200: 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20  st_channel \..  
2210: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
2220: 2d 20 64 65 74 65 63 74 65 64 20 6e 6f 6e 2d 64  - detected non-d
2230: 65 66 61 75 6c 74 20 70 6c 61 74 66 6f 72 6d 20  efault platform 
2240: 28 57 6f 57 36 34 29 5c 6e 22 0d 0a 20 20 20 20  (WoW64)\n"..    
2250: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 72      }..        r
2260: 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20  eturn false..   
2270: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
2280: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
2290: 68 69 73 20 68 61 73 20 61 20 67 6f 6f 64 20 63  his has a good c
22a0: 68 61 6e 63 65 20 6f 66 20 62 65 69 6e 67 20 74  hance of being t
22b0: 68 65 20 64 65 66 61 75 6c 74 20 70 6c 61 74 66  he default platf
22c0: 6f 72 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  orm...      #.. 
22d0: 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73       if {$verbos
22e0: 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
22f0: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
2300: 5f 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 64  _channel "---- d
2310: 65 74 65 63 74 65 64 20 64 65 66 61 75 6c 74 20  etected default 
2320: 70 6c 61 74 66 6f 72 6d 5c 6e 22 0d 0a 20 20 20  platform\n"..   
2330: 20 20 20 7d 0d 0a 20 20 20 20 20 20 72 65 74 75     }..      retu
2340: 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 7d 0d 0a  rn true..    }..
2350: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42  ...    proc getB
2360: 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20 7b 20 6e  uildPlatform { n
2370: 61 74 69 76 65 20 7d 20 7b 0d 0a 20 20 20 20 20  ative } {..     
2380: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
2390: 73 20 3a 3a 74 65 73 74 5f 70 6c 61 74 66 6f 72  s ::test_platfor
23a0: 6d 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  m] && \..       
23b0: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
23c0: 68 20 24 3a 3a 74 65 73 74 5f 70 6c 61 74 66 6f  h $::test_platfo
23d0: 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  rm] > 0} then {.
23e0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
23f0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
2400: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65  the specified te
2410: 73 74 20 70 6c 61 74 66 6f 72 6d 2e 20 20 49 66  st platform.  If
2420: 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 69   this variable i
2430: 73 20 6e 6f 74 20 73 65 74 2c 0d 0a 20 20 20 20  s not set,..    
2440: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
2450: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 77 69  default value wi
2460: 6c 6c 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74  ll be based on t
2470: 68 65 20 6d 61 63 68 69 6e 65 20 61 72 63 68 69  he machine archi
2480: 74 65 63 74 75 72 65 2e 0d 0a 20 20 20 20 20 20  tecture...      
2490: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
24a0: 75 72 6e 20 5b 65 78 70 72 20 7b 24 6e 61 74 69  urn [expr {$nati
24b0: 76 65 20 3f 20 24 3a 3a 74 65 73 74 5f 70 6c 61  ve ? $::test_pla
24c0: 74 66 6f 72 6d 20 3a 20 22 22 7d 5d 0d 0a 20 20  tform : ""}]..  
24d0: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69      } elseif {[i
24e0: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73  nfo exists ::tes
24f0: 74 5f 6d 61 63 68 69 6e 65 5d 20 26 26 20 5c 0d  t_machine] && \.
2500: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
2510: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73  ng length $::tes
2520: 74 5f 6d 61 63 68 69 6e 65 5d 20 3e 20 30 7d 20  t_machine] > 0} 
2530: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
2540: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
2550: 45 3a 20 46 6f 72 20 6e 61 74 69 76 65 20 62 75  E: For native bu
2560: 69 6c 64 73 2c 20 72 65 74 75 72 6e 20 74 68 65  ilds, return the
2570: 20 70 6c 61 74 66 6f 72 6d 20 6e 61 6d 65 20 63   platform name c
2580: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 0d  orresponding to.
2590: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
25a0: 20 74 68 65 20 74 65 73 74 20 6d 61 63 68 69 6e   the test machin
25b0: 65 20 61 72 63 68 69 74 65 63 74 75 72 65 3b 20  e architecture; 
25c0: 6f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  otherwise, retur
25d0: 6e 20 61 6e 20 65 6d 70 74 79 0d 0a 20 20 20 20  n an empty..    
25e0: 20 20 20 20 23 20 20 20 20 20 20 20 73 74 72 69      #       stri
25f0: 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ng...        #..
2600: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
2610: 65 78 70 72 20 7b 0d 0a 20 20 20 20 20 20 20 20  expr {..        
2620: 20 20 24 6e 61 74 69 76 65 20 3f 20 5b 6d 61 63    $native ? [mac
2630: 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72 6d 20 24  hineToPlatform $
2640: 3a 3a 74 65 73 74 5f 6d 61 63 68 69 6e 65 5d 20  ::test_machine] 
2650: 3a 20 22 22 0d 0a 20 20 20 20 20 20 20 20 7d 5d  : ""..        }]
2660: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66  ..      } elseif
2670: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
2680: 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61  :tcl_platform(ma
2690: 63 68 69 6e 65 29 5d 7d 20 74 68 65 6e 20 7b 0d  chine)]} then {.
26a0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
26b0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20      # NOTE: For 
26c0: 6e 61 74 69 76 65 20 62 75 69 6c 64 73 2c 20 72  native builds, r
26d0: 65 74 75 72 6e 20 74 68 65 20 70 6c 61 74 66 6f  eturn the platfo
26e0: 72 6d 20 6e 61 6d 65 20 63 6f 72 72 65 73 70 6f  rm name correspo
26f0: 6e 64 69 6e 67 20 74 6f 0d 0a 20 20 20 20 20 20  nding to..      
2700: 20 20 23 20 20 20 20 20 20 20 74 68 65 20 6d 61    #       the ma
2710: 63 68 69 6e 65 20 61 72 63 68 69 74 65 63 74 75  chine architectu
2720: 72 65 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 72  re; otherwise, r
2730: 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73  eturn an empty s
2740: 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20  tring...        
2750: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
2760: 6e 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20 20  n [expr {..     
2770: 20 20 20 20 20 24 6e 61 74 69 76 65 20 3f 20 5b       $native ? [
2780: 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72  machineToPlatfor
2790: 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72  m $::tcl_platfor
27a0: 6d 28 6d 61 63 68 69 6e 65 29 5d 20 3a 20 22 22  m(machine)] : ""
27b0: 0d 0a 20 20 20 20 20 20 20 20 7d 5d 0d 0a 20 20  ..        }]..  
27c0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
27d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
27e0: 20 23 20 4e 4f 54 45 3a 20 4e 6f 20 6d 61 63 68   # NOTE: No mach
27f0: 69 6e 65 20 61 72 63 68 69 74 65 63 74 75 72 65  ine architecture
2800: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72   is available, r
2810: 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73  eturn an empty s
2820: 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20  tring...        
2830: 23 20 20 20 20 20 20 20 49 74 20 69 73 20 69 6d  #       It is im
2840: 70 6f 72 74 61 6e 74 20 74 6f 20 72 65 74 75 72  portant to retur
2850: 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  n an empty strin
2860: 67 20 68 65 72 65 20 62 65 63 61 75 73 65 20 74  g here because t
2870: 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  he..        #   
2880: 20 20 20 20 72 65 73 75 6c 74 20 6f 66 20 74 68      result of th
2890: 69 73 20 70 72 6f 63 65 64 75 72 65 20 6d 61 79  is procedure may
28a0: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 5b 66   be used with [f
28b0: 69 6c 65 20 6a 6f 69 6e 5d 2e 0d 0a 20 20 20 20  ile join]...    
28c0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
28d0: 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 20 20  eturn ""..      
28e0: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
28f0: 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 43 6f   proc getBuildCo
2900: 6e 66 69 67 75 72 61 74 69 6f 6e 20 7b 7d 20 7b  nfiguration {} {
2910: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
2920: 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66 20   # NOTE: See if 
2930: 74 68 65 20 22 63 6f 6e 66 69 67 75 72 61 74 69  the "configurati
2940: 6f 6e 22 20 73 65 74 74 69 6e 67 20 68 61 73 20  on" setting has 
2950: 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 20  been overridden 
2960: 62 79 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  by the..      # 
2970: 20 20 20 20 20 20 75 73 65 72 20 28 65 2e 67 2e        user (e.g.
2980: 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20   on the command 
2990: 6c 69 6e 65 29 2e 20 20 54 68 69 73 20 68 65 6c  line).  This hel
29a0: 70 73 20 63 6f 6e 74 72 6f 6c 20 65 78 61 63 74  ps control exact
29b0: 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ly..      #     
29c0: 20 20 77 68 69 63 68 20 73 65 74 20 6f 66 20 62    which set of b
29d0: 69 6e 61 72 69 65 73 20 77 65 20 61 72 65 20 74  inaries we are t
29e0: 65 73 74 69 6e 67 20 28 69 2e 65 2e 20 74 68 6f  esting (i.e. tho
29f0: 73 65 20 62 75 69 6c 74 20 69 6e 20 74 68 65 0d  se built in the.
2a00: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22  .      #       "
2a10: 44 65 62 75 67 22 20 6f 72 20 22 52 65 6c 65 61  Debug" or "Relea
2a20: 73 65 22 20 62 75 69 6c 64 20 63 6f 6e 66 69 67  se" build config
2a30: 75 72 61 74 69 6f 6e 73 29 2e 20 20 54 6f 20 6f  urations).  To o
2a40: 76 65 72 72 69 64 65 20 74 68 69 73 0d 0a 20 20  verride this..  
2a50: 20 20 20 20 23 20 20 20 20 20 20 20 76 61 6c 75      #       valu
2a60: 65 20 76 69 61 20 74 68 65 20 63 6f 6d 6d 61 6e  e via the comman
2a70: 64 20 6c 69 6e 65 2c 20 65 6e 74 65 72 20 61 20  d line, enter a 
2a80: 63 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c 61 72 20  command similar 
2a90: 74 6f 20 6f 6e 65 20 6f 66 0d 0a 20 20 20 20 20  to one of..     
2aa0: 20 23 20 20 20 20 20 20 20 74 68 65 20 66 6f 6c   #       the fol
2ab0: 6c 6f 77 69 6e 67 20 28 61 6c 6c 20 6f 6e 20 6f  lowing (all on o
2ac0: 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20 20 20  ne line):..     
2ad0: 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20   #..      #     
2ae0: 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65    EagleShell.exe
2af0: 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20   -anyInitialize 
2b00: 22 73 65 74 20 74 65 73 74 5f 63 6f 6e 66 69 67  "set test_config
2b10: 75 72 61 74 69 6f 6e 20 44 65 62 75 67 22 0d 0a  uration Debug"..
2b20: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
2b30: 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c  -file .\path\to\
2b40: 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20  all.eagle..     
2b50: 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20   #..      #     
2b60: 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65    EagleShell.exe
2b70: 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20   -anyInitialize 
2b80: 22 73 65 74 20 74 65 73 74 5f 63 6f 6e 66 69 67  "set test_config
2b90: 75 72 61 74 69 6f 6e 20 52 65 6c 65 61 73 65 22  uration Release"
2ba0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
2bb0: 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74    -file .\path\t
2bc0: 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20  o\all.eagle..   
2bd0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20     #..      #   
2be0: 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65      EagleShell.e
2bf0: 78 65 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c  xe -file .\path\
2c00: 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 20 2d 70 72  to\all.eagle -pr
2c10: 65 54 65 73 74 0d 0a 20 20 20 20 20 20 23 20 20  eTest..      #  
2c20: 20 20 20 20 20 20 20 22 75 6e 73 65 74 20 2d 6e         "unset -n
2c30: 6f 63 6f 6d 70 6c 61 69 6e 20 74 65 73 74 5f 63  ocomplain test_c
2c40: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 0d 0a 20  onfiguration".. 
2c50: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
2c60: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
2c70: 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74  :test_configurat
2c80: 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ion] && \..     
2c90: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
2ca0: 67 74 68 20 24 3a 3a 74 65 73 74 5f 63 6f 6e 66  gth $::test_conf
2cb0: 69 67 75 72 61 74 69 6f 6e 5d 20 3e 20 30 7d 20  iguration] > 0} 
2cc0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
2cd0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
2ce0: 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63 69  E: Use the speci
2cf0: 66 69 65 64 20 74 65 73 74 20 63 6f 6e 66 69 67  fied test config
2d00: 75 72 61 74 69 6f 6e 2e 20 20 54 68 65 20 64 65  uration.  The de
2d10: 66 61 75 6c 74 20 76 61 6c 75 65 20 75 73 65 64  fault value used
2d20: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
2d30: 20 20 66 6f 72 20 74 68 69 73 20 76 61 72 69 61    for this varia
2d40: 62 6c 65 20 69 73 20 74 79 70 69 63 61 6c 6c 79  ble is typically
2d50: 20 22 52 65 6c 65 61 73 65 22 2c 20 61 73 20 73   "Release", as s
2d60: 65 74 20 62 79 20 74 68 65 20 74 65 73 74 0d 0a  et by the test..
2d70: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2d80: 73 75 69 74 65 20 69 74 73 65 6c 66 2e 0d 0a 20  suite itself... 
2d90: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2da0: 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74    return $::test
2db0: 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0d 0a  _configuration..
2dc0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
2dd0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2de0: 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 72 6d 61     # NOTE: Norma
2df0: 6c 6c 79 2c 20 77 65 20 77 69 6c 6c 20 6e 65 76  lly, we will nev
2e00: 65 72 20 68 69 74 20 74 68 69 73 20 63 61 73 65  er hit this case
2e10: 20 62 65 63 61 75 73 65 20 74 68 65 20 76 61 6c   because the val
2e20: 75 65 20 6f 66 20 74 68 65 0d 0a 20 20 20 20 20  ue of the..     
2e30: 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74 20     #       test 
2e40: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 76 61  configuration va
2e50: 72 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73  riable is always
2e60: 20 73 65 74 20 62 79 20 74 68 65 20 74 65 73 74   set by the test
2e70: 20 73 75 69 74 65 0d 0a 20 20 20 20 20 20 20 20   suite..        
2e80: 23 20 20 20 20 20 20 20 69 74 73 65 6c 66 3b 20  #       itself; 
2e90: 68 6f 77 65 76 65 72 2c 20 69 74 20 63 61 6e 20  however, it can 
2ea0: 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 75 73  be overridden us
2eb0: 69 6e 67 20 74 68 65 20 75 6e 73 65 74 20 63 6f  ing the unset co
2ec0: 6d 6d 61 6e 64 0d 0a 20 20 20 20 20 20 20 20 23  mmand..        #
2ed0: 20 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20         from the 
2ee0: 2d 70 72 65 54 65 73 74 20 6f 70 74 69 6f 6e 20  -preTest option 
2ef0: 74 6f 20 74 68 65 20 74 65 73 74 20 73 75 69 74  to the test suit
2f00: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
2f10: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
2f20: 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d 28  :eagle_platform(
2f30: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 29 0d 0a  configuration)..
2f40: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
2f50: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42  ...    proc getB
2f60: 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f  uildConfiguratio
2f70: 6e 73 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ns {} {..      #
2f80: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
2f90: 53 65 65 20 69 66 20 74 68 65 20 6c 69 73 74 20  See if the list 
2fa0: 6f 66 20 74 65 73 74 20 63 6f 6e 66 69 67 75 72  of test configur
2fb0: 61 74 69 6f 6e 73 20 68 61 73 20 62 65 65 6e 20  ations has been 
2fc0: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 0d 0a 20  overridden by.. 
2fd0: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
2fe0: 20 75 73 65 72 20 28 65 2e 67 2e 20 6f 6e 20 74   user (e.g. on t
2ff0: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29  he command line)
3000: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
3010: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
3020: 74 73 20 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67  ts ::test_config
3030: 75 72 61 74 69 6f 6e 73 5d 20 26 26 20 5c 0d 0a  urations] && \..
3040: 20 20 20 20 20 20 20 20 20 20 5b 6c 6c 65 6e 67            [lleng
3050: 74 68 20 24 3a 3a 74 65 73 74 5f 63 6f 6e 66 69  th $::test_confi
3060: 67 75 72 61 74 69 6f 6e 73 5d 20 3e 20 30 7d 20  gurations] > 0} 
3070: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
3080: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
3090: 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63 69  E: Use the speci
30a0: 66 69 65 64 20 6c 69 73 74 20 6f 66 20 74 65 73  fied list of tes
30b0: 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  t configurations
30c0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
30d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
30e0: 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69  test_configurati
30f0: 6f 6e 73 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  ons..      } els
3100: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e {..        #..
3110: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
3120: 55 73 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  Use the default 
3130: 6c 69 73 74 20 6f 66 20 74 65 73 74 20 63 6f 6e  list of test con
3140: 66 69 67 75 72 61 74 69 6f 6e 73 2e 0d 0a 20 20  figurations...  
3150: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
3160: 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 44 65   return [list De
3170: 62 75 67 20 52 65 6c 65 61 73 65 5d 0d 0a 20 20  bug Release]..  
3180: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
3190: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 75 69  .    proc getBui
31a0: 6c 64 42 61 73 65 44 69 72 65 63 74 6f 72 79 20  ldBaseDirectory 
31b0: 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
31c0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 67       # NOTE: Fig
31d0: 75 72 65 20 6f 75 74 20 74 68 65 20 62 61 73 65  ure out the base
31e0: 20 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65   directory where
31f0: 20 61 6c 6c 20 74 68 65 20 62 75 69 6c 64 73 20   all the builds 
3200: 73 68 6f 75 6c 64 20 62 65 0d 0a 20 20 20 20 20  should be..     
3210: 20 23 20 20 20 20 20 20 20 6c 6f 63 61 74 65 64   #       located
3220: 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20  .  This will be 
3230: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68  the directory th
3240: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
3250: 61 63 74 75 61 6c 0d 0a 20 20 20 20 20 20 23 20  actual..      # 
3260: 20 20 20 20 20 20 62 75 69 6c 64 20 6f 75 74 70        build outp
3270: 75 74 20 64 69 72 65 63 74 6f 72 79 20 28 65 2e  ut directory (e.
3280: 67 2e 20 70 61 72 65 6e 74 20 6f 66 20 22 62 69  g. parent of "bi
3290: 6e 22 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  n")...      #.. 
32a0: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
32b0: 78 69 73 74 73 20 3a 3a 62 75 69 6c 64 5f 62 61  xists ::build_ba
32c0: 73 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26  se_directory] &&
32d0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
32e0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
32f0: 62 75 69 6c 64 5f 62 61 73 65 5f 64 69 72 65 63  build_base_direc
3300: 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20  tory] > 0} then 
3310: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
3320: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
3330: 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  e location of th
3340: 65 20 62 75 69 6c 64 20 62 61 73 65 20 64 69 72  e build base dir
3350: 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
3360: 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20  overridden;..   
3370: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
3380: 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 76  refore, use it v
3390: 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20  erbatim...      
33a0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
33b0: 75 72 6e 20 24 3a 3a 62 75 69 6c 64 5f 62 61 73  urn $::build_bas
33c0: 65 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  e_directory..   
33d0: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e     } elseif {[in
33e0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f 6d 6d  fo exists ::comm
33f0: 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26  on_directory] &&
3400: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
3410: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
3420: 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79  common_directory
3430: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
3440: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
3450: 20 20 23 20 4e 4f 54 45 3a 20 4e 65 78 74 2c 20    # NOTE: Next, 
3460: 66 61 6c 6c 62 61 63 6b 20 74 6f 20 74 68 65 20  fallback to the 
3470: 67 72 61 6e 64 70 61 72 65 6e 74 20 64 69 72 65  grandparent dire
3480: 63 74 6f 72 79 20 6f 66 20 74 68 65 20 6f 6e 65  ctory of the one
3490: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
34a0: 20 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69    containing thi
34b0: 73 20 66 69 6c 65 20 28 69 2e 65 2e 20 22 63 6f  s file (i.e. "co
34c0: 6d 6d 6f 6e 2e 65 61 67 6c 65 22 29 2c 20 69 66  mmon.eagle"), if
34d0: 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20   available...   
34e0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
34f0: 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 64 69 72  return [file dir
3500: 6e 61 6d 65 20 5b 66 69 6c 65 20 64 69 72 6e 61  name [file dirna
3510: 6d 65 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72  me $::common_dir
3520: 65 63 74 6f 72 79 5d 5d 0d 0a 20 20 20 20 20 20  ectory]]..      
3530: 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20  } elseif {[info 
3540: 65 78 69 73 74 73 20 3a 3a 70 61 74 68 5d 20 26  exists ::path] &
3550: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
3560: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
3570: 3a 70 61 74 68 5d 20 3e 20 30 7d 20 74 68 65 6e  :path] > 0} then
3580: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
3590: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46         # NOTE: F
35a0: 69 6e 61 6c 6c 79 2c 20 66 61 6c 6c 62 61 63 6b  inally, fallback
35b0: 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 64   to the parent d
35c0: 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20  irectory of the 
35d0: 45 61 67 6c 65 54 65 73 74 0d 0a 20 20 20 20 20  EagleTest..     
35e0: 20 20 20 23 20 20 20 20 20 20 20 70 61 74 68 2e     #       path.
35f0: 20 20 54 68 65 20 45 61 67 6c 65 54 65 73 74 20    The EagleTest 
3600: 70 61 63 6b 61 67 65 20 67 75 61 72 61 6e 74 65  package guarante
3610: 65 73 20 74 68 61 74 20 74 68 69 73 20 76 61 72  es that this var
3620: 69 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 23  iable..        #
3630: 20 20 20 20 20 20 20 77 69 6c 6c 20 62 65 20 73         will be s
3640: 65 74 20 74 6f 20 74 68 65 20 64 69 72 65 63 74  et to the direct
3650: 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ory containing t
3660: 68 65 20 66 69 72 73 74 20 66 69 6c 65 20 74 6f  he first file to
3670: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
3680: 20 20 65 78 65 63 75 74 65 20 74 68 65 20 5b 72    execute the [r
3690: 75 6e 54 65 73 74 50 72 6f 6c 6f 67 75 65 5d 20  unTestPrologue] 
36a0: 73 63 72 69 70 74 20 6c 69 62 72 61 72 79 20 70  script library p
36b0: 72 6f 63 65 64 75 72 65 2e 0d 0a 20 20 20 20 20  rocedure...     
36c0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
36d0: 74 75 72 6e 20 5b 66 69 6c 65 20 64 69 72 6e 61  turn [file dirna
36e0: 6d 65 20 24 3a 3a 70 61 74 68 5d 0d 0a 20 20 20  me $::path]..   
36f0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
3700: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
3710: 23 20 4e 4f 54 45 3a 20 4e 6f 20 70 61 74 68 20  # NOTE: No path 
3720: 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65  is available, re
3730: 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74  turn an empty st
3740: 72 69 6e 67 2e 20 20 54 68 69 73 20 70 6f 69 6e  ring.  This poin
3750: 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
3760: 20 20 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65     should not be
3770: 20 72 65 61 63 68 65 64 2e 0d 0a 20 20 20 20 20   reached...     
3780: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
3790: 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 20 20 7d  turn ""..      }
37a0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
37b0: 70 72 6f 63 20 67 65 74 53 51 4c 69 74 65 54 65  proc getSQLiteTe
37c0: 73 74 44 61 74 61 50 61 74 68 20 7b 7d 20 7b 0d  stDataPath {} {.
37d0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
37e0: 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f  # NOTE: Figure o
37f0: 75 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ut the directory
3800: 20 77 68 65 72 65 20 61 6c 6c 20 74 68 65 20 74   where all the t
3810: 65 73 74 20 64 61 74 61 20 66 69 6c 65 73 20 73  est data files s
3820: 68 6f 75 6c 64 0d 0a 20 20 20 20 20 20 23 20 20  hould..      #  
3830: 20 20 20 20 20 62 65 20 6c 6f 63 61 74 65 64 2e       be located.
3840: 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65    This should be
3850: 20 74 68 65 20 22 64 61 74 61 22 20 64 69 72 65   the "data" dire
3860: 63 74 6f 72 79 20 62 65 6e 65 61 74 68 20 74 68  ctory beneath th
3870: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
3880: 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61   directory conta
3890: 69 6e 69 6e 67 20 74 68 65 20 61 63 74 75 61 6c  ining the actual
38a0: 20 74 65 73 74 20 73 63 72 69 70 74 73 2e 0d 0a   test scripts...
38b0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72        #..      r
38c0: 65 74 75 72 6e 20 5b 66 69 6c 65 20 6a 6f 69 6e  eturn [file join
38d0: 20 24 3a 3a 70 61 74 68 20 64 61 74 61 5d 0d 0a   $::path data]..
38e0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
38f0: 6f 63 20 69 73 52 75 6e 6e 69 6e 67 57 6f 57 36  oc isRunningWoW6
3900: 34 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  4 {} {..      #.
3910: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46  .      # NOTE: F
3920: 6f 72 20 6e 6f 77 2c 20 6a 75 73 74 20 75 73 65  or now, just use
3930: 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 74 65   the existing te
3940: 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 6f  st constraint fo
3950: 72 20 64 65 74 65 63 74 69 6e 67 0d 0a 20 20 20  r detecting..   
3960: 20 20 20 23 20 20 20 20 20 20 20 61 20 57 6f 57     #       a WoW
3970: 36 34 20 70 72 6f 63 65 73 73 2e 0d 0a 20 20 20  64 process...   
3980: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
3990: 72 6e 20 5b 68 61 76 65 43 6f 6e 73 74 72 61 69  rn [haveConstrai
39a0: 6e 74 20 77 6f 77 36 34 5d 0d 0a 20 20 20 20 7d  nt wow64]..    }
39b0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73  .....    proc is
39c0: 4d 69 78 65 64 4d 6f 64 65 41 73 73 65 6d 62 6c  MixedModeAssembl
39d0: 79 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 76 61  y { fileName {va
39e0: 72 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20  rName ""} } {.. 
39f0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
3a00: 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20 6d 61 6b  NOTE: First, mak
3a10: 65 20 73 75 72 65 20 74 68 65 20 74 65 73 74 20  e sure the test 
3a20: 73 75 69 74 65 20 69 6e 66 72 61 73 74 72 75 63  suite infrastruc
3a30: 74 75 72 65 20 69 73 20 61 6c 6c 6f 77 65 64 20  ture is allowed 
3a40: 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  to..      #     
3a50: 20 20 75 73 65 20 74 68 65 20 5b 65 78 65 63 5d    use the [exec]
3a60: 20 63 6f 6d 6d 61 6e 64 2e 0d 0a 20 20 20 20 20   command...     
3a70: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b   #..      if {![
3a80: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
3a90: 28 65 78 65 63 29 5d 20 26 26 20 21 5b 69 6e 66  (exec)] && ![inf
3aa0: 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f  o exists ::no(co
3ab0: 72 46 6c 61 67 73 29 5d 7d 20 74 68 65 6e 20 7b  rFlags)]} then {
3ac0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
3ad0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
3ae0: 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  the location of 
3af0: 43 6f 72 46 6c 61 67 73 20 69 73 20 70 72 65 73  CorFlags is pres
3b00: 65 6e 74 20 69 6e 20 74 68 65 20 65 6e 76 69 72  ent in the envir
3b10: 6f 6e 6d 65 6e 74 2c 0d 0a 20 20 20 20 20 20 20  onment,..       
3b20: 20 23 20 20 20 20 20 20 20 75 73 65 20 69 74 3b   #       use it;
3b30: 20 6f 74 68 65 72 77 69 73 65 20 61 73 73 75 6d   otherwise assum
3b40: 65 20 69 74 20 69 73 20 69 6e 20 74 68 65 20 50  e it is in the P
3b50: 41 54 48 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ATH...        #.
3b60: 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 72  .        set cor
3b70: 46 6c 61 67 73 20 5b 65 78 70 72 20 7b 0d 0a 20  Flags [expr {.. 
3b80: 20 20 20 20 20 20 20 20 20 5b 69 6e 66 6f 20 65           [info e
3b90: 78 69 73 74 73 20 3a 3a 65 6e 76 28 43 6f 72 46  xists ::env(CorF
3ba0: 6c 61 67 73 29 5d 20 3f 20 24 3a 3a 65 6e 76 28  lags)] ? $::env(
3bb0: 43 6f 72 46 6c 61 67 73 29 20 3a 20 22 43 6f 72  CorFlags) : "Cor
3bc0: 46 6c 61 67 73 22 0d 0a 20 20 20 20 20 20 20 20  Flags"..        
3bd0: 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  }]....        #.
3be0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
3bf0: 20 41 74 74 65 6d 70 74 20 74 6f 20 65 78 65 63   Attempt to exec
3c00: 75 74 65 20 43 6f 72 46 6c 61 67 73 20 6f 6e 20  ute CorFlags on 
3c10: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
3c20: 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  le...        #..
3c30: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
3c40: 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
3c50: 65 78 65 63 20 2d 2d 20 24 63 6f 72 46 6c 61 67  exec -- $corFlag
3c60: 73 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  s [file nativena
3c70: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20  me $fileName].. 
3c80: 20 20 20 20 20 20 20 7d 20 65 78 65 63 5d 20 3d         } exec] =
3c90: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
3ca0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
3cb0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 72      # NOTE: If r
3cc0: 65 71 75 65 73 74 65 64 20 62 79 20 6f 75 72 20  equested by our 
3cd0: 63 61 6c 6c 65 72 2c 20 61 74 74 65 6d 70 74 20  caller, attempt 
3ce0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
3cf0: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
3d00: 20 20 20 20 70 6c 61 74 66 6f 72 6d 20 66 6f 72      platform for
3d10: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
3d20: 69 6c 65 20 61 73 20 77 65 6c 6c 2e 0d 0a 20 20  ile as well...  
3d30: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
3d40: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
3d50: 20 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d 65   length $varName
3d60: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
3d70: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
3d80: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
3d90: 3a 20 53 74 6f 72 65 20 74 68 65 20 70 6c 61 74  : Store the plat
3da0: 66 6f 72 6d 20 69 6e 20 74 68 65 20 6e 61 6d 65  form in the name
3db0: 64 20 76 61 72 69 61 62 6c 65 20 69 6e 20 74 68  d variable in th
3dc0: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  e..            #
3dd0: 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 20 6f         context o
3de0: 66 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20  f our caller... 
3df0: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
3e00: 20 20 20 20 20 20 20 20 20 20 75 70 76 61 72 20            upvar 
3e10: 31 20 24 76 61 72 4e 61 6d 65 20 70 6c 61 74 66  1 $varName platf
3e20: 6f 72 6d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  orm....         
3e30: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
3e40: 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
3e50: 74 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65  t to extract the
3e60: 20 50 45 20 6c 69 6e 65 20 66 72 6f 6d 20 74 68   PE line from th
3e70: 65 20 63 61 70 74 75 72 65 64 0d 0a 20 20 20 20  e captured..    
3e80: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
3e90: 6f 75 74 70 75 74 2e 20 20 49 66 20 74 68 69 73  output.  If this
3ea0: 20 76 61 6c 75 65 20 69 73 20 22 50 45 33 32 22   value is "PE32"
3eb0: 20 6f 72 20 22 50 45 33 32 2b 22 2c 20 74 68 65   or "PE32+", the
3ec0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
3ed0: 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 20 66        assembly f
3ee0: 69 6c 65 20 69 73 20 33 32 2d 62 69 74 20 6f 72  ile is 32-bit or
3ef0: 20 36 34 2d 62 69 74 2c 20 72 65 73 70 65 63 74   64-bit, respect
3f00: 69 76 65 6c 79 3b 0d 0a 20 20 20 20 20 20 20 20  ively;..        
3f10: 20 20 20 20 23 20 20 20 20 20 20 20 6f 74 68 65      #       othe
3f20: 72 77 69 73 65 2c 20 69 74 73 20 74 79 70 65 20  rwise, its type 
3f30: 69 73 20 75 6e 6b 6e 6f 77 6e 2e 0d 0a 20 20 20  is unknown...   
3f40: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
3f50: 20 20 20 20 20 20 20 20 73 65 74 20 70 61 74 74          set patt
3f60: 65 72 6e 20 7b 5e 50 45 20 20 20 20 20 20 20 20  ern {^PE        
3f70: 3a 20 28 50 45 33 32 7c 50 45 33 32 5c 2b 29 5c  : (PE32|PE32\+)\
3f80: 73 2b 24 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  s+$}....        
3f90: 20 20 20 20 69 66 20 7b 5b 72 65 67 65 78 70 20      if {[regexp 
3fa0: 2d 6c 69 6e 65 20 2d 2d 20 24 70 61 74 74 65 72  -line -- $patter
3fb0: 6e 20 24 65 78 65 63 20 64 75 6d 6d 79 20 70 65  n $exec dummy pe
3fc0: 33 32 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  32]} then {..   
3fd0: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
3fe0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 48 41              # HA
3ff0: 43 4b 3a 20 54 68 69 73 20 5b 73 77 69 74 63 68  CK: This [switch
4000: 5d 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 33  ] assumes that 3
4010: 32 2d 62 69 74 20 65 78 65 63 75 74 61 62 6c 65  2-bit executable
4020: 73 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20 20  s are..         
4030: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6c 77       #       alw
4040: 61 79 73 20 78 38 36 20 61 6e 64 20 74 68 61 74  ays x86 and that
4050: 20 36 34 2d 62 69 74 20 65 78 65 63 75 74 61 62   64-bit executab
4060: 6c 65 73 20 61 72 65 20 61 6c 77 61 79 73 0d 0a  les are always..
4070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
4080: 20 20 20 20 20 20 78 36 34 2e 0d 0a 20 20 20 20        x64...    
4090: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
40a0: 20 20 20 20 20 20 20 20 20 20 20 73 77 69 74 63             switc
40b0: 68 20 2d 65 78 61 63 74 20 2d 2d 20 24 70 65 33  h -exact -- $pe3
40c0: 32 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  2 {..           
40d0: 20 20 20 20 20 50 45 33 32 20 7b 0d 0a 20 20 20       PE32 {..   
40e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
40f0: 65 74 20 70 6c 61 74 66 6f 72 6d 20 57 69 6e 33  et platform Win3
4100: 32 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2..             
4110: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
4120: 20 20 20 20 20 20 50 45 33 32 2b 20 7b 0d 0a 20        PE32+ {.. 
4130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4140: 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 78 36   set platform x6
4150: 34 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  4..             
4160: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
4170: 20 20 20 20 20 20 64 65 66 61 75 6c 74 20 7b 0d        default {.
4180: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4190: 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20     set platform 
41a0: 22 22 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ""..            
41b0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
41c0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
41d0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
41e0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
41f0: 70 6c 61 74 66 6f 72 6d 20 22 22 0d 0a 20 20 20  platform ""..   
4200: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
4210: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
4220: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4230: 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
4240: 74 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65  t to extract the
4250: 20 49 4c 4f 4e 4c 59 20 6c 69 6e 65 20 66 72 6f   ILONLY line fro
4260: 6d 20 74 68 65 20 63 61 70 74 75 72 65 64 0d 0a  m the captured..
4270: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
4280: 20 20 6f 75 74 70 75 74 2e 20 20 49 66 20 74 68    output.  If th
4290: 69 73 20 76 61 6c 75 65 20 69 73 20 7a 65 72 6f  is value is zero
42a0: 2c 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  , the specified 
42b0: 66 69 6c 65 20 6d 75 73 74 0d 0a 20 20 20 20 20  file must..     
42c0: 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65 20       #       be 
42d0: 61 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73  a mixed-mode ass
42e0: 65 6d 62 6c 79 3b 20 6f 74 68 65 72 77 69 73 65  embly; otherwise
42f0: 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  , it contains on
4300: 6c 79 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  ly..          # 
4310: 20 20 20 20 20 20 6d 61 6e 61 67 65 64 20 63 6f        managed co
4320: 6d 70 6f 6e 65 6e 74 73 2e 0d 0a 20 20 20 20 20  mponents...     
4330: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4340: 20 20 73 65 74 20 70 61 74 74 65 72 6e 20 7b 5e    set pattern {^
4350: 49 4c 4f 4e 4c 59 20 20 20 20 3a 20 28 30 7c 31  ILONLY    : (0|1
4360: 29 5c 73 2b 24 7d 0d 0a 0d 0a 20 20 20 20 20 20  )\s+$}....      
4370: 20 20 20 20 69 66 20 7b 21 5b 72 65 67 65 78 70      if {![regexp
4380: 20 2d 6c 69 6e 65 20 2d 2d 20 24 70 61 74 74 65   -line -- $patte
4390: 72 6e 20 24 65 78 65 63 20 64 75 6d 6d 79 20 69  rn $exec dummy i
43a0: 6c 4f 6e 6c 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  lOnly]} then {..
43b0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
43c0: 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20  rn false..      
43d0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
43e0: 20 20 20 69 66 20 7b 21 24 69 6c 4f 6e 6c 79 7d     if {!$ilOnly}
43f0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
4400: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
4410: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
4420: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
4430: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
4440: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74      # NOTE: If t
4450: 68 65 20 74 65 73 74 20 73 75 69 74 65 20 63 61  he test suite ca
4460: 6e 6e 6f 74 20 75 73 65 20 5b 65 78 65 63 5d 20  nnot use [exec] 
4470: 6f 72 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  or execution of 
4480: 43 6f 72 46 6c 61 67 73 0d 0a 20 20 20 20 20 20  CorFlags..      
4490: 23 20 20 20 20 20 20 20 66 61 69 6c 65 64 2c 20  #       failed, 
44a0: 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 0d 0a 20  return false... 
44b0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
44c0: 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20  turn false..    
44d0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
44e0: 65 74 4e 61 74 69 76 65 4c 69 62 72 61 72 79 46  etNativeLibraryF
44f0: 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 20 7b 7d 20  ileNamesOnly {} 
4500: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
4510: 20 20 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c    # NOTE: First,
4520: 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 6c 69   check if the li
4530: 73 74 20 6f 66 20 6e 61 74 69 76 65 20 6c 69 62  st of native lib
4540: 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 73 20  rary file names 
4550: 68 61 73 20 62 65 65 6e 0d 0a 20 20 20 20 20 20  has been..      
4560: 23 20 20 20 20 20 20 20 6d 61 6e 75 61 6c 6c 79  #       manually
4570: 20 6f 76 65 72 72 69 64 64 65 6e 2e 0d 0a 20 20   overridden...  
4580: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
4590: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
45a0: 6e 61 74 69 76 65 5f 6c 69 62 72 61 72 79 5f 66  native_library_f
45b0: 69 6c 65 5f 6e 61 6d 65 73 5d 20 26 26 20 5c 0d  ile_names] && \.
45c0: 0a 20 20 20 20 20 20 20 20 20 20 5b 6c 6c 65 6e  .          [llen
45d0: 67 74 68 20 24 3a 3a 6e 61 74 69 76 65 5f 6c 69  gth $::native_li
45e0: 62 72 61 72 79 5f 66 69 6c 65 5f 6e 61 6d 65 73  brary_file_names
45f0: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
4600: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4610: 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 69    # NOTE: The li
4620: 73 74 20 6f 66 20 6e 61 74 69 76 65 20 6c 69 62  st of native lib
4630: 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 73 20  rary file names 
4640: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64  has been overrid
4650: 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20  den;..        # 
4660: 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c        therefore,
4670: 20 75 73 65 20 69 74 20 76 65 72 62 61 74 69 6d   use it verbatim
4680: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
4690: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
46a0: 6e 61 74 69 76 65 5f 6c 69 62 72 61 72 79 5f 66  native_library_f
46b0: 69 6c 65 5f 6e 61 6d 65 73 0d 0a 20 20 20 20 20  ile_names..     
46c0: 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 73 57 69   } elseif {[isWi
46d0: 6e 64 6f 77 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ndows]} then {..
46e0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
46f0: 20 20 20 23 20 4e 4f 54 45 3a 20 4f 74 68 65 72     # NOTE: Other
4700: 77 69 73 65 2c 20 6f 6e 20 57 69 6e 64 6f 77 73  wise, on Windows
4710: 2c 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65  , always use the
4720: 20 64 65 66 61 75 6c 74 20 66 69 6c 65 20 6e 61   default file na
4730: 6d 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  me..        #   
4740: 20 20 20 20 22 73 71 6c 69 74 65 33 2e 64 6c 6c      "sqlite3.dll
4750: 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  "...        #.. 
4760: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c         return [l
4770: 69 73 74 20 73 71 6c 69 74 65 33 2e 64 6c 6c 5d  ist sqlite3.dll]
4780: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
4790: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
47a0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4f 74 68       # NOTE: Oth
47b0: 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 62  erwise, return b
47c0: 6f 74 68 20 74 68 65 20 67 65 6e 65 72 69 63 20  oth the generic 
47d0: 50 4f 53 49 58 20 66 69 6c 65 20 6e 61 6d 65 20  POSIX file name 
47e0: 61 6e 64 20 74 68 65 0d 0a 20 20 20 20 20 20 20  and the..       
47f0: 20 23 20 20 20 20 20 20 20 4d 61 63 20 4f 53 20   #       Mac OS 
4800: 58 20 66 69 6c 65 20 6e 61 6d 65 2c 20 73 69 6e  X file name, sin
4810: 63 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 75 72  ce we do not cur
4820: 72 65 6e 74 6c 79 20 68 61 76 65 20 61 6e 20 65  rently have an e
4830: 61 73 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20  asy..        #  
4840: 20 20 20 20 20 77 61 79 20 74 6f 20 64 65 74 65       way to dete
4850: 63 74 20 77 68 69 63 68 20 6f 66 20 74 68 6f 73  ct which of thos
4860: 65 20 70 6c 61 74 66 6f 72 6d 73 20 77 65 20 61  e platforms we a
4870: 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 2e 0d 0a  re running on...
4880: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
4890: 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20     return [list 
48a0: 6c 69 62 73 71 6c 69 74 65 33 2e 73 6f 20 6c 69  libsqlite3.so li
48b0: 62 73 71 6c 69 74 65 33 2e 64 79 6c 69 62 5d 0d  bsqlite3.dylib].
48c0: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
48d0: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
48e0: 4e 61 74 69 76 65 4c 69 62 72 61 72 79 46 69 6c  NativeLibraryFil
48f0: 65 4e 61 6d 65 20 7b 20 7b 64 65 66 61 75 6c 74  eName { {default
4900: 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20   ""} } {..      
4910: 73 65 74 20 64 69 72 65 63 74 6f 72 79 20 5b 66  set directory [f
4920: 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b 67 65 74  ile dirname [get
4930: 43 6f 72 65 42 69 6e 61 72 79 46 69 6c 65 4e 61  CoreBinaryFileNa
4940: 6d 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 66 6f  me]]....      fo
4950: 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 4f 6e  reach fileNameOn
4960: 6c 79 20 5b 67 65 74 4e 61 74 69 76 65 4c 69 62  ly [getNativeLib
4970: 72 61 72 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c  raryFileNamesOnl
4980: 79 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  y] {..        se
4990: 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65  t fileName [file
49a0: 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79   join $directory
49b0: 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 0d   $fileNameOnly].
49c0: 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  ...        if {[
49d0: 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c  file exists $fil
49e0: 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
49f0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
4a00: 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20   $fileName..    
4a10: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
4a20: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24  ..      return $
4a30: 64 65 66 61 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a  default..    }..
4a40: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73 42 75  ...    proc isBu
4a50: 69 6c 64 41 76 61 69 6c 61 62 6c 65 20 7b 20 6e  ildAvailable { n
4a60: 61 74 69 76 65 20 64 69 72 65 63 74 6f 72 79 20  ative directory 
4a70: 7b 76 61 72 4e 61 6d 65 20 22 22 7d 20 7d 20 7b  {varName ""} } {
4a80: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
4a90: 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74   # NOTE: Build t
4aa0: 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  he fully qualifi
4ab0: 65 64 20 66 69 6c 65 20 6e 61 6d 65 20 66 6f 72  ed file name for
4ac0: 20 74 68 65 20 70 72 69 6d 61 72 79 20 61 73 73   the primary ass
4ad0: 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 23 20 20  embly..      #  
4ae0: 20 20 20 20 20 63 6f 6e 74 61 69 6e 69 6e 67 20       containing 
4af0: 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  the System.Data.
4b00: 53 51 4c 69 74 65 20 6d 61 6e 61 67 65 64 20 63  SQLite managed c
4b10: 6f 6d 70 6f 6e 65 6e 74 73 2e 20 20 49 74 0d 0a  omponents.  It..
4b20: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 68        #       sh
4b30: 6f 75 6c 64 20 62 65 20 6e 6f 74 65 64 20 74 68  ould be noted th
4b40: 61 74 20 74 68 69 73 20 61 73 73 65 6d 62 6c 79  at this assembly
4b50: 20 66 69 6c 65 20 6d 61 79 20 61 6c 73 6f 20 63   file may also c
4b60: 6f 6e 74 61 69 6e 20 74 68 65 0d 0a 20 20 20 20  ontain the..    
4b70: 20 20 23 20 20 20 20 20 20 20 6e 61 74 69 76 65    #       native
4b80: 20 63 6f 6d 70 6f 6e 65 6e 74 73 2c 20 69 66 20   components, if 
4b90: 61 20 6e 61 74 69 76 65 20 62 75 69 6c 64 20 69  a native build i
4ba0: 73 20 69 6e 20 75 73 65 2e 0d 0a 20 20 20 20 20  s in use...     
4bb0: 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69   #..      set fi
4bc0: 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74  leName [file nat
4bd0: 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
4be0: 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d  in $directory \.
4bf0: 0a 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65  .          Syste
4c00: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
4c10: 6c 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  l]]....      if 
4c20: 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24  {![file exists $
4c30: 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  fileName]} then 
4c40: 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
4c50: 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 7d  n false..      }
4c60: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
4c70: 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
4c80: 70 74 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61  pt to automatica
4c90: 6c 6c 79 20 64 65 74 65 63 74 20 69 66 20 74 68  lly detect if th
4ca0: 65 20 70 72 69 6d 61 72 79 20 61 73 73 65 6d 62  e primary assemb
4cb0: 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ly..      #     
4cc0: 20 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 6e    contains any n
4cd0: 61 74 69 76 65 20 63 6f 6d 70 6f 6e 65 6e 74 73  ative components
4ce0: 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0d  , if necessary..
4cf0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
4d00: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
4d10: 74 68 20 24 6e 61 74 69 76 65 5d 20 3d 3d 20 30  th $native] == 0
4d20: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
4d30: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
4d40: 6e 67 74 68 20 24 76 61 72 4e 61 6d 65 5d 20 3e  ngth $varName] >
4d50: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
4d60: 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76        upvar 1 $v
4d70: 61 72 4e 61 6d 65 20 24 76 61 72 4e 61 6d 65 0d  arName $varName.
4d80: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
4d90: 20 20 20 20 20 20 73 65 74 20 6e 61 74 69 76 65        set native
4da0: 20 5b 69 73 4d 69 78 65 64 4d 6f 64 65 41 73 73   [isMixedModeAss
4db0: 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20  embly $fileName 
4dc0: 24 76 61 72 4e 61 6d 65 5d 0d 0a 20 20 20 20 20  $varName]..     
4dd0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
4de0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
4df0: 74 68 65 20 70 72 69 6d 61 72 79 20 61 73 73 65  the primary asse
4e00: 6d 62 6c 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69  mbly also contai
4e10: 6e 73 20 74 68 65 20 6e 61 74 69 76 65 20 63 6f  ns the native co
4e20: 6d 70 6f 6e 65 6e 74 73 2c 0d 0a 20 20 20 20 20  mponents,..     
4e30: 20 23 20 20 20 20 20 20 20 77 65 20 68 61 76 65   #       we have
4e40: 20 65 76 65 72 79 74 68 69 6e 67 20 77 65 20 6e   everything we n
4e50: 65 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  eed...      #.. 
4e60: 20 20 20 20 20 69 66 20 7b 24 6e 61 74 69 76 65       if {$native
4e70: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
4e80: 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20    return true.. 
4e90: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
4ea0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
4eb0: 20 57 68 61 74 20 69 73 20 74 68 65 20 61 72 63   What is the arc
4ec0: 68 69 74 65 63 74 75 72 65 20 66 6f 72 20 74 68  hitecture for th
4ed0: 69 73 20 6d 61 63 68 69 6e 65 3f 0d 0a 20 20 20  is machine?..   
4ee0: 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
4ef0: 61 72 63 68 69 74 65 63 74 75 72 65 20 5b 6d 61  architecture [ma
4f00: 63 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72 6d 20  chineToPlatform 
4f10: 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28  $::tcl_platform(
4f20: 6d 61 63 68 69 6e 65 29 20 74 72 75 65 5d 0d 0a  machine) true]..
4f30: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
4f40: 20 23 20 4e 4f 54 45 3a 20 57 68 61 74 20 69 73   # NOTE: What is
4f50: 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 20 66 6f   the platform fo
4f60: 72 20 74 68 69 73 20 6d 61 63 68 69 6e 65 3f 0d  r this machine?.
4f70: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
4f80: 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 5b 6d 61  set platform [ma
4f90: 63 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72 6d 20  chineToPlatform 
4fa0: 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28  $::tcl_platform(
4fb0: 6d 61 63 68 69 6e 65 29 5d 0d 0a 0d 0a 20 20 20  machine)]....   
4fc0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
4fd0: 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 66 75  TE: Build the fu
4fe0: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 66 69  lly qualified fi
4ff0: 6c 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  le name for the 
5000: 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79  interop assembly
5010: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
5020: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 53  containing the S
5030: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
5040: 65 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e 65  e native compone
5050: 6e 74 73 2e 20 20 49 66 20 74 68 69 73 0d 0a 20  nts.  If this.. 
5060: 20 20 20 20 20 23 20 20 20 20 20 20 20 66 69 6c       #       fil
5070: 65 20 65 78 69 73 74 73 2c 20 77 65 20 73 68 6f  e exists, we sho
5080: 75 6c 64 20 68 61 76 65 20 65 76 65 72 79 74 68  uld have everyth
5090: 69 6e 67 20 77 65 20 6e 65 65 64 2e 0d 0a 20 20  ing we need...  
50a0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
50b0: 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20   fileName [file 
50c0: 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
50d0: 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79   join $directory
50e0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 24 61   \..          $a
50f0: 72 63 68 69 74 65 63 74 75 72 65 20 53 51 4c 69  rchitecture SQLi
5100: 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 5d 5d  te.Interop.dll]]
5110: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 66  ....      if {[f
5120: 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65  ile exists $file
5130: 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
5140: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
5150: 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ue..      }.... 
5160: 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d       set fileNam
5170: 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
5180: 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64  me [file join $d
5190: 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20  irectory \..    
51a0: 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72 6d 20        $platform 
51b0: 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64  SQLite.Interop.d
51c0: 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  ll]]....      if
51d0: 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24   {[file exists $
51e0: 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  fileName]} then 
51f0: 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
5200: 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d  n true..      }.
5210: 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c  ...      set fil
5220: 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69  eName [file nati
5230: 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  vename [file joi
5240: 6e 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a  n $directory \..
5250: 20 20 20 20 20 20 20 20 20 20 53 51 4c 69 74 65            SQLite
5260: 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 5d 5d 0d 0a  .Interop.dll]]..
5270: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c  ..      if {[fil
5280: 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61  e exists $fileNa
5290: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
52a0: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
52b0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
52c0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
52d0: 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 66 75  TE: Build the fu
52e0: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 66 69  lly qualified fi
52f0: 6c 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  le name for the 
5300: 53 51 4c 69 74 65 20 63 6f 72 65 0d 0a 20 20 20  SQLite core..   
5310: 20 20 20 23 20 20 20 20 20 20 20 6c 69 62 72 61     #       libra
5320: 72 79 2e 20 20 49 66 20 74 68 69 73 20 66 69 6c  ry.  If this fil
5330: 65 20 65 78 69 73 74 73 2c 20 77 65 20 73 68 6f  e exists, we sho
5340: 75 6c 64 20 68 61 76 65 20 65 76 65 72 79 74 68  uld have everyth
5350: 69 6e 67 20 77 65 0d 0a 20 20 20 20 20 20 23 20  ing we..      # 
5360: 20 20 20 20 20 20 6e 65 65 64 2e 0d 0a 20 20 20        need...   
5370: 20 20 20 23 0d 0a 20 20 20 20 20 20 66 6f 72 65     #..      fore
5380: 61 63 68 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79  ach fileNameOnly
5390: 20 5b 67 65 74 4e 61 74 69 76 65 4c 69 62 72 61   [getNativeLibra
53a0: 72 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d  ryFileNamesOnly]
53b0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
53c0: 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e  fileName [file n
53d0: 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
53e0: 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20  join $directory 
53f0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24  \..            $
5400: 61 72 63 68 69 74 65 63 74 75 72 65 20 24 66 69  architecture $fi
5410: 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a  leNameOnly]]....
5420: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c          if {[fil
5430: 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61  e exists $fileNa
5440: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
5450: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
5460: 75 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ue..        }...
5470: 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c  .        set fil
5480: 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69  eName [file nati
5490: 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  vename [file joi
54a0: 6e 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a  n $directory \..
54b0: 20 20 20 20 20 20 20 20 20 20 20 20 24 70 6c 61              $pla
54c0: 74 66 6f 72 6d 20 24 66 69 6c 65 4e 61 6d 65 4f  tform $fileNameO
54d0: 6e 6c 79 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  nly]]....       
54e0: 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74   if {[file exist
54f0: 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  s $fileName]} th
5500: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
5510: 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20  return true..   
5520: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
5530: 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b    set fileName [
5540: 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
5550: 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65  [file join $dire
5560: 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20  ctory \..       
5570: 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 4f 6e       $fileNameOn
5580: 6c 79 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ly]]....        
5590: 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73  if {[file exists
55a0: 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65   $fileName]} the
55b0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72  n {..          r
55c0: 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20  eturn true..    
55d0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
55e0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
55f0: 20 23 20 4e 4f 54 45 3a 20 4f 6e 65 20 6f 72 20   # NOTE: One or 
5600: 6d 6f 72 65 20 6e 61 74 69 76 65 20 63 6f 6d 70  more native comp
5610: 6f 6e 65 6e 74 73 20 6e 65 65 64 65 64 20 62 79  onents needed by
5620: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
5630: 69 74 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ite..      #    
5640: 20 20 20 61 72 65 20 6d 69 73 73 69 6e 67 2e 0d     are missing..
5650: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
5660: 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20  return false..  
5670: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
5680: 20 69 73 52 65 6c 65 61 73 65 41 76 61 69 6c 61   isReleaseAvaila
5690: 62 6c 65 20 7b 20 64 69 72 65 63 74 6f 72 79 20  ble { directory 
56a0: 7b 76 61 72 4e 61 6d 65 20 22 22 7d 20 7d 20 7b  {varName ""} } {
56b0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
56c0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 72 4e  ing length $varN
56d0: 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ame] > 0} then {
56e0: 0d 0a 20 20 20 20 20 20 20 20 75 70 76 61 72 20  ..        upvar 
56f0: 31 20 24 76 61 72 4e 61 6d 65 20 24 76 61 72 4e  1 $varName $varN
5700: 61 6d 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  ame..      }....
5710: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 69 73        return [is
5720: 42 75 69 6c 64 41 76 61 69 6c 61 62 6c 65 20 22  BuildAvailable "
5730: 22 20 24 64 69 72 65 63 74 6f 72 79 20 24 76 61  " $directory $va
5740: 72 4e 61 6d 65 5d 0d 0a 20 20 20 20 7d 0d 0a 0c  rName]..    }...
5750: 0d 0a 20 20 20 20 70 72 6f 63 20 6a 6f 69 6e 42  ..    proc joinB
5760: 75 69 6c 64 44 69 72 65 63 74 6f 72 79 20 7b 20  uildDirectory { 
5770: 6e 61 74 69 76 65 20 70 61 74 68 20 79 65 61 72  native path year
5780: 20 70 6c 61 74 66 6f 72 6d 20 63 6f 6e 66 69 67   platform config
5790: 75 72 61 74 69 6f 6e 20 7d 20 7b 0d 0a 20 20 20  uration } {..   
57a0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
57b0: 54 45 3a 20 46 69 67 75 72 65 20 6f 75 74 20 61  TE: Figure out a
57c0: 6e 64 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74  nd then return t
57d0: 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  he fully qualifi
57e0: 65 64 20 70 61 74 68 20 74 6f 20 74 68 65 20 62  ed path to the b
57f0: 75 69 6c 64 0d 0a 20 20 20 20 20 20 23 20 20 20  uild..      #   
5800: 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 62 61      directory ba
5810: 73 65 64 20 6f 6e 20 61 6c 6c 20 74 68 65 20 61  sed on all the a
5820: 72 67 75 6d 65 6e 74 73 20 70 72 6f 76 69 64 65  rguments provide
5830: 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e  d by our caller.
5840: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
5850: 20 69 66 20 7b 24 6e 61 74 69 76 65 7d 20 74 68   if {$native} th
5860: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
5870: 74 75 72 6e 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  turn [file join 
5880: 24 70 61 74 68 20 62 69 6e 20 24 79 65 61 72 20  $path bin $year 
5890: 24 70 6c 61 74 66 6f 72 6d 20 24 63 6f 6e 66 69  $platform $confi
58a0: 67 75 72 61 74 69 6f 6e 5d 0d 0a 20 20 20 20 20  guration]..     
58b0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
58c0: 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20     return [file 
58d0: 6a 6f 69 6e 20 24 70 61 74 68 20 62 69 6e 20 24  join $path bin $
58e0: 79 65 61 72 20 24 63 6f 6e 66 69 67 75 72 61 74  year $configurat
58f0: 69 6f 6e 20 62 69 6e 5d 0d 0a 20 20 20 20 20 20  ion bin]..      
5900: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
5910: 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 44 69   proc getBuildDi
5920: 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20  rectory {} {..  
5930: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
5940: 4f 54 45 3a 20 53 65 65 20 69 66 20 74 68 65 20  OTE: See if the 
5950: 22 6e 61 74 69 76 65 22 20 72 75 6e 74 69 6d 65  "native" runtime
5960: 20 6f 70 74 69 6f 6e 20 68 61 73 20 62 65 65 6e   option has been
5970: 20 73 65 74 2e 20 20 49 66 20 73 6f 2c 20 75 73   set.  If so, us
5980: 65 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  e the..      #  
5990: 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 66       directory f
59a0: 6f 72 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64  or the mixed-mod
59b0: 65 20 61 73 73 65 6d 62 6c 79 20 28 61 2e 6b 2e  e assembly (a.k.
59c0: 61 2e 20 74 68 65 20 6e 61 74 69 76 65 20 69 6e  a. the native in
59d0: 74 65 72 6f 70 0d 0a 20 20 20 20 20 20 23 20 20  terop..      #  
59e0: 20 20 20 20 20 61 73 73 65 6d 62 6c 79 29 2e 20       assembly). 
59f0: 20 54 6f 20 65 6e 61 62 6c 65 20 74 68 69 73 20   To enable this 
5a00: 6f 70 74 69 6f 6e 20 76 69 61 20 74 68 65 20 63  option via the c
5a10: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2c 20 65 6e 74  ommand line, ent
5a20: 65 72 20 61 0d 0a 20 20 20 20 20 20 23 20 20 20  er a..      #   
5a30: 20 20 20 20 63 6f 6d 6d 61 6e 64 20 73 69 6d 69      command simi
5a40: 6c 61 72 20 74 6f 20 6f 6e 65 20 6f 66 20 74 68  lar to one of th
5a50: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 28 61 6c 6c  e following (all
5a60: 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65 29 3a 0d 0a   on one line):..
5a70: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
5a80: 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c         EagleShel
5a90: 6c 2e 65 78 65 20 2d 69 6e 69 74 69 61 6c 69 7a  l.exe -initializ
5aa0: 65 20 2d 72 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  e -runtimeOption
5ab0: 20 6e 61 74 69 76 65 0d 0a 20 20 20 20 20 20 23   native..      #
5ac0: 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e           -file .
5ad0: 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67  \path\to\all.eag
5ae0: 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  le..      #..   
5af0: 20 20 20 23 20 20 20 20 20 20 20 54 6f 20 65 6e     #       To en
5b00: 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6f 6e  able this option
5b10: 20 76 69 61 20 74 68 65 20 63 6f 6d 6d 61 6e 64   via the command
5b20: 20 6c 69 6e 65 20 70 72 69 6f 72 20 74 6f 20 74   line prior to t
5b30: 68 65 20 22 62 65 74 61 20 31 36 22 0d 0a 20 20  he "beta 16"..  
5b40: 20 20 20 20 23 20 20 20 20 20 20 20 72 65 6c 65      #       rele
5b50: 61 73 65 20 6f 66 20 45 61 67 6c 65 2c 20 74 68  ase of Eagle, th
5b60: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 6d  e following comm
5b70: 61 6e 64 20 6d 75 73 74 20 62 65 20 75 73 65 64  and must be used
5b80: 20 69 6e 73 74 65 61 64 0d 0a 20 20 20 20 20 20   instead..      
5b90: 23 20 20 20 20 20 20 20 28 61 6c 73 6f 20 61 6c  #       (also al
5ba0: 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65 29 3a 0d  l on one line):.
5bb0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
5bc0: 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65  #       EagleShe
5bd0: 6c 6c 2e 65 78 65 20 2d 69 6e 69 74 69 61 6c 69  ll.exe -initiali
5be0: 7a 65 20 2d 70 6f 73 74 49 6e 69 74 69 61 6c 69  ze -postInitiali
5bf0: 7a 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ze..      #     
5c00: 20 20 20 20 22 6f 62 6a 65 63 74 20 69 6e 76 6f      "object invo
5c10: 6b 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47  ke Interpreter.G
5c20: 65 74 41 63 74 69 76 65 20 41 64 64 52 75 6e 74  etActive AddRunt
5c30: 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65  imeOption native
5c40: 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  "..      #      
5c50: 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c     -file .\path\
5c60: 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20  to\all.eagle..  
5c70: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
5c80: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
5c90: 62 75 69 6c 64 5f 64 69 72 65 63 74 6f 72 79 5d  build_directory]
5ca0: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
5cb0: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
5cc0: 24 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63 74 6f  $::build_directo
5cd0: 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ry] > 0} then {.
5ce0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
5cf0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
5d00: 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  location of the 
5d10: 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20  build directory 
5d20: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64  has been overrid
5d30: 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20  den;..        # 
5d40: 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c        therefore,
5d50: 20 75 73 65 20 69 74 20 76 65 72 62 61 74 69 6d   use it verbatim
5d60: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
5d70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
5d80: 62 75 69 6c 64 5f 64 69 72 65 63 74 6f 72 79 0d  build_directory.
5d90: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
5da0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
5db0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74      # NOTE: If t
5dc0: 68 65 20 22 6e 61 74 69 76 65 22 20 72 75 6e 74  he "native" runt
5dd0: 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 73 65  ime option is se
5de0: 74 2c 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64  t, the mixed-mod
5df0: 65 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20 20  e assembly..    
5e00: 20 20 20 20 23 20 20 20 20 20 20 20 69 73 20 62      #       is b
5e10: 65 69 6e 67 20 74 65 73 74 65 64 2e 20 20 49 6e  eing tested.  In
5e20: 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 20   that case, the 
5e30: 70 61 74 68 20 74 6f 20 74 68 65 20 62 75 69 6c  path to the buil
5e40: 64 20 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  d directory..   
5e50: 20 20 20 20 20 23 20 20 20 20 20 20 20 77 69 6c       #       wil
5e60: 6c 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 70 6c  l contain the pl
5e70: 61 74 66 6f 72 6d 20 6e 61 6d 65 20 61 6e 64 20  atform name and 
5e80: 61 6c 6c 20 74 68 65 20 62 69 6e 61 72 69 65 73  all the binaries
5e90: 20 75 6e 64 65 72 20 74 65 73 74 0d 0a 20 20 20   under test..   
5ea0: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 68 6f       #       sho
5eb0: 75 6c 64 20 62 65 20 70 72 65 73 65 6e 74 20 69  uld be present i
5ec0: 6e 20 74 68 61 74 20 64 69 72 65 63 74 6f 72 79  n that directory
5ed0: 2e 20 20 49 66 20 74 68 65 20 22 6e 61 74 69 76  .  If the "nativ
5ee0: 65 22 20 72 75 6e 74 69 6d 65 0d 0a 20 20 20 20  e" runtime..    
5ef0: 20 20 20 20 23 20 20 20 20 20 20 20 6f 70 74 69      #       opti
5f00: 6f 6e 20 69 73 20 6e 6f 74 20 73 65 74 2c 20 74  on is not set, t
5f10: 68 65 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f  he build directo
5f20: 72 79 20 77 69 6c 6c 20 62 65 20 63 6f 6e 73 69  ry will be consi
5f30: 64 65 72 65 64 20 74 6f 20 62 65 0d 0a 20 20 20  dered to be..   
5f40: 20 20 20 20 20 23 20 20 20 20 20 20 20 22 70 6c       #       "pl
5f50: 61 74 66 6f 72 6d 2d 6e 65 75 74 72 61 6c 22 2c  atform-neutral",
5f60: 20 77 69 74 68 20 74 68 65 20 6e 6f 74 61 62 6c   with the notabl
5f70: 65 20 65 78 63 65 70 74 69 6f 6e 20 6f 66 20 61  e exception of a
5f80: 6e 79 20 6e 61 74 69 76 65 0d 0a 20 20 20 20 20  ny native..     
5f90: 20 20 20 23 20 20 20 20 20 20 20 61 73 73 65 6d     #       assem
5fa0: 62 6c 79 20 28 65 2e 67 2e 20 22 53 51 4c 69 74  bly (e.g. "SQLit
5fb0: 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 22 29 20  e.Interop.dll") 
5fc0: 63 6f 70 69 65 64 20 74 68 65 72 65 20 64 75 72  copied there dur
5fd0: 69 6e 67 20 74 68 65 0d 0a 20 20 20 20 20 20 20  ing the..       
5fe0: 20 23 20 20 20 20 20 20 20 62 75 69 6c 64 20 70   #       build p
5ff0: 72 6f 63 65 73 73 20 69 74 73 65 6c 66 2e 20 20  rocess itself.  
6000: 49 66 20 74 68 65 20 62 75 69 6c 64 20 70 72 6f  If the build pro
6010: 63 65 73 73 20 73 6f 6d 65 68 6f 77 20 64 6f 65  cess somehow doe
6020: 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20 23  s not..        #
6030: 20 20 20 20 20 20 20 63 6f 70 79 20 74 68 65 20         copy the 
6040: 6e 61 74 69 76 65 20 61 73 73 65 6d 62 6c 79 20  native assembly 
6050: 66 6f 72 20 74 68 69 73 20 70 6c 61 74 66 6f 72  for this platfor
6060: 6d 2c 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 74  m, most of the t
6070: 65 73 74 73 0d 0a 20 20 20 20 20 20 20 20 23 20  ests..        # 
6080: 20 20 20 20 20 20 69 6e 20 74 68 65 20 73 75 69        in the sui
6090: 74 65 20 77 69 6c 6c 20 73 69 6d 70 6c 79 20 62  te will simply b
60a0: 65 20 73 6b 69 70 70 65 64 2e 20 20 47 65 6e 65  e skipped.  Gene
60b0: 72 61 6c 6c 79 20 73 70 65 61 6b 69 6e 67 2c 20  rally speaking, 
60c0: 74 68 65 72 65 0d 0a 20 20 20 20 20 20 20 20 23  there..        #
60d0: 20 20 20 20 20 20 20 61 72 65 20 74 77 6f 20 77         are two w
60e0: 61 79 73 20 74 6f 20 62 75 69 6c 64 20 74 68 65  ays to build the
60f0: 20 62 69 6e 61 72 69 65 73 20 77 68 65 6e 20 70   binaries when p
6100: 72 65 70 61 72 69 6e 67 20 74 6f 20 72 75 6e 20  reparing to run 
6110: 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  the..        #  
6120: 20 20 20 20 20 74 65 73 74 20 73 75 69 74 65 3a       test suite:
6130: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
6140: 20 20 20 20 20 23 20 20 20 20 20 20 20 31 2e 20       #       1. 
6150: 42 75 69 6c 64 20 74 68 65 20 73 65 70 61 72 61  Build the separa
6160: 74 65 20 6d 61 6e 61 67 65 64 20 61 6e 64 20 6e  te managed and n
6170: 61 74 69 76 65 20 61 73 73 65 6d 62 6c 69 65 73  ative assemblies
6180: 20 75 73 69 6e 67 20 73 6f 6d 65 0d 0a 20 20 20   using some..   
6190: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20       #          
61a0: 63 6f 6d 6d 61 6e 64 73 20 73 69 6d 69 6c 61 72  commands similar
61b0: 20 74 6f 3a 0d 0a 20 20 20 20 20 20 20 20 23 0d   to:..        #.
61c0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
61d0: 20 20 20 20 62 75 69 6c 64 2e 62 61 74 20 24 7b      build.bat ${
61e0: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 4d 61  Configuration}Ma
61f0: 6e 61 67 65 64 4f 6e 6c 79 20 24 7b 50 6c 61 74  nagedOnly ${Plat
6200: 66 6f 72 6d 7d 0d 0a 20 20 20 20 20 20 20 20 23  form}..        #
6210: 20 20 20 20 20 20 20 20 20 20 62 75 69 6c 64 2e            build.
6220: 62 61 74 20 24 7b 43 6f 6e 66 69 67 75 72 61 74  bat ${Configurat
6230: 69 6f 6e 7d 4e 61 74 69 76 65 4f 6e 6c 79 20 24  ion}NativeOnly $
6240: 7b 50 6c 61 74 66 6f 72 6d 7d 0d 0a 20 20 20 20  {Platform}..    
6250: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
6260: 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65 20            Where 
6270: 24 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d  ${Configuration}
6280: 20 69 73 20 65 69 74 68 65 72 20 22 44 65 62 75   is either "Debu
6290: 67 22 20 6f 72 20 22 52 65 6c 65 61 73 65 22 20  g" or "Release" 
62a0: 61 6e 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20  and..        #  
62b0: 20 20 20 20 20 20 20 20 24 7b 50 6c 61 74 66 6f          ${Platfo
62c0: 72 6d 7d 20 69 73 20 65 69 74 68 65 72 20 22 57  rm} is either "W
62d0: 69 6e 33 32 22 20 6f 72 20 22 78 36 34 22 2e 0d  in32" or "x64"..
62e0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
62f0: 20 20 20 20 23 20 20 20 20 20 20 20 32 2e 20 42      #       2. B
6300: 75 69 6c 64 20 74 68 65 20 6d 69 78 65 64 2d 6d  uild the mixed-m
6310: 6f 64 65 20 61 73 73 65 6d 62 6c 79 20 75 73 69  ode assembly usi
6320: 6e 67 20 61 20 63 6f 6d 6d 61 6e 64 20 73 69 6d  ng a command sim
6330: 69 6c 61 72 20 74 6f 3a 0d 0a 20 20 20 20 20 20  ilar to:..      
6340: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20    #..        #  
6350: 20 20 20 20 20 20 20 20 62 75 69 6c 64 2e 62 61          build.ba
6360: 74 20 24 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f  t ${Configuratio
6370: 6e 7d 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 0d 0a  n} ${Platform}..
6380: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
6390: 20 20 20 23 20 20 20 20 20 20 20 20 20 20 57 68     #          Wh
63a0: 65 72 65 20 24 7b 43 6f 6e 66 69 67 75 72 61 74  ere ${Configurat
63b0: 69 6f 6e 7d 20 69 73 20 65 69 74 68 65 72 20 22  ion} is either "
63c0: 44 65 62 75 67 22 20 6f 72 20 22 52 65 6c 65 61  Debug" or "Relea
63d0: 73 65 22 20 61 6e 64 0d 0a 20 20 20 20 20 20 20  se" and..       
63e0: 20 23 20 20 20 20 20 20 20 20 20 20 24 7b 50 6c   #          ${Pl
63f0: 61 74 66 6f 72 6d 7d 20 69 73 20 65 69 74 68 65  atform} is eithe
6400: 72 20 22 57 69 6e 33 32 22 20 6f 72 20 22 78 36  r "Win32" or "x6
6410: 34 22 2e 20 20 49 66 20 74 68 69 73 20 63 6f 6d  4".  If this com
6420: 6d 61 6e 64 20 69 73 0d 0a 20 20 20 20 20 20 20  mand is..       
6430: 20 23 20 20 20 20 20 20 20 20 20 20 75 73 65 64   #          used
6440: 2c 20 76 61 72 69 6f 75 73 20 74 65 73 74 73 20  , various tests 
6450: 74 68 61 74 20 72 65 71 75 69 72 65 20 73 75 70  that require sup
6460: 70 6c 65 6d 65 6e 74 61 72 79 20 6d 61 6e 61 67  plementary manag
6470: 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ed..        #   
6480: 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 69 65         assemblie
6490: 73 20 28 65 2e 67 2e 20 4c 49 4e 51 29 20 6d 61  s (e.g. LINQ) ma
64a0: 79 20 62 65 20 73 6b 69 70 70 65 64 20 75 6e 6c  y be skipped unl
64b0: 65 73 73 20 74 68 6f 73 65 20 62 69 6e 61 72 69  ess those binari
64c0: 65 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  es..        #   
64d0: 20 20 20 20 20 20 20 61 72 65 20 73 75 62 73 65         are subse
64e0: 71 75 65 6e 74 6c 79 20 63 6f 70 69 65 64 20 69  quently copied i
64f0: 6e 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20  nto the correct 
6500: 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 20  directory (i.e. 
6510: 62 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  by..        #   
6520: 20 20 20 20 20 20 20 22 74 65 73 74 5f 61 6c 6c         "test_all
6530: 2e 62 61 74 22 29 2e 0d 0a 20 20 20 20 20 20 20  .bat")...       
6540: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20   #..        #   
6550: 20 20 20 20 4e 6f 74 65 20 74 68 61 74 20 61 6c      Note that al
6560: 6c 20 6f 66 20 74 68 65 20 62 75 69 6c 64 20 63  l of the build c
6570: 6f 6d 6d 61 6e 64 73 20 61 62 6f 76 65 20 77 69  ommands above wi
6580: 6c 6c 20 64 65 66 61 75 6c 74 20 74 6f 20 75 73  ll default to us
6590: 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ing..        #  
65a0: 20 20 20 20 20 74 68 65 20 6c 61 74 65 73 74 20       the latest 
65b0: 76 65 72 73 69 6f 6e 20 6f 66 20 4d 53 42 75 69  version of MSBui
65c0: 6c 64 20 61 76 61 69 6c 61 62 6c 65 20 61 6e 64  ld available and
65d0: 20 74 68 65 20 22 74 65 73 74 5f 79 65 61 72 22   the "test_year"
65e0: 20 6d 61 79 0d 0a 20 20 20 20 20 20 20 20 23 20   may..        # 
65f0: 20 20 20 20 20 20 6e 65 65 64 20 74 6f 20 62 65        need to be
6600: 20 61 64 6a 75 73 74 65 64 20 61 63 63 6f 72 64   adjusted accord
6610: 69 6e 67 6c 79 20 74 6f 20 61 63 74 75 61 6c 6c  ingly to actuall
6620: 79 20 72 75 6e 20 74 68 65 20 74 65 73 74 20 73  y run the test s
6630: 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  uite...        #
6640: 20 20 20 20 20 20 20 52 65 66 65 72 20 74 6f 20         Refer to 
6650: 74 68 65 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20  the comments in 
6660: 5b 67 65 74 42 75 69 6c 64 59 65 61 72 5d 20 66  [getBuildYear] f
6670: 6f 72 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74  or more informat
6680: 69 6f 6e 20 6f 6e 0d 0a 20 20 20 20 20 20 20 20  ion on..        
6690: 23 20 20 20 20 20 20 20 68 6f 77 20 74 6f 20 73  #       how to s
66a0: 65 74 20 74 68 69 73 20 76 61 72 69 61 62 6c 65  et this variable
66b0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
66c0: 20 20 20 20 20 20 73 65 74 20 6e 61 74 69 76 65        set native
66d0: 20 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74 69   [hasRuntimeOpti
66e0: 6f 6e 20 6e 61 74 69 76 65 5d 0d 0a 0d 0a 20 20  on native]....  
66f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6a 6f        return [jo
6700: 69 6e 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79  inBuildDirectory
6710: 20 24 6e 61 74 69 76 65 20 5b 67 65 74 42 75 69   $native [getBui
6720: 6c 64 42 61 73 65 44 69 72 65 63 74 6f 72 79 5d  ldBaseDirectory]
6730: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
6740: 5b 67 65 74 42 75 69 6c 64 59 65 61 72 5d 20 5b  [getBuildYear] [
6750: 67 65 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d  getBuildPlatform
6760: 20 24 6e 61 74 69 76 65 5d 20 5b 67 65 74 42 75   $native] [getBu
6770: 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ildConfiguration
6780: 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  ]]..      }..   
6790: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
67a0: 67 65 74 52 65 6c 65 61 73 65 56 65 72 73 69 6f  getReleaseVersio
67b0: 6e 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  n {} {..      #.
67c0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46  .      # NOTE: F
67d0: 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 65  igure out the re
67e0: 6c 65 61 73 65 20 76 65 72 73 69 6f 6e 20 66 6f  lease version fo
67f0: 72 20 75 73 65 20 77 69 74 68 20 74 68 65 20 62  r use with the b
6800: 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 0d 0a  uild directory..
6810: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77 68        #       wh
6820: 65 6e 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  en checking for 
6830: 61 76 61 69 6c 61 62 6c 65 20 72 65 6c 65 61 73  available releas
6840: 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  es...      #..  
6850: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
6860: 69 73 74 73 20 3a 3a 72 65 6c 65 61 73 65 5f 76  ists ::release_v
6870: 65 72 73 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20 20  ersion] && \..  
6880: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
6890: 6c 65 6e 67 74 68 20 24 3a 3a 72 65 6c 65 61 73  length $::releas
68a0: 65 5f 76 65 72 73 69 6f 6e 5d 20 3e 20 30 7d 20  e_version] > 0} 
68b0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
68c0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
68d0: 45 3a 20 54 68 65 20 72 65 6c 65 61 73 65 20 76  E: The release v
68e0: 65 72 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 20  ersion has been 
68f0: 6f 76 65 72 72 69 64 64 65 6e 3b 20 74 68 65 72  overridden; ther
6900: 65 66 6f 72 65 2c 20 75 73 65 20 69 74 0d 0a 20  efore, use it.. 
6910: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76         #       v
6920: 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20  erbatim...      
6930: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
6940: 75 72 6e 20 24 3a 3a 72 65 6c 65 61 73 65 5f 76  urn $::release_v
6950: 65 72 73 69 6f 6e 0d 0a 20 20 20 20 20 20 7d 20  ersion..      } 
6960: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
6970: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
6980: 45 3a 20 4e 6f 20 72 65 6c 65 61 73 65 20 76 65  E: No release ve
6990: 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62  rsion is availab
69a0: 6c 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 6d  le, return an em
69b0: 70 74 79 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20  pty string...   
69c0: 20 20 20 20 20 23 20 20 20 20 20 20 20 49 74 20       #       It 
69d0: 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  is important to 
69e0: 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20  return an empty 
69f0: 73 74 72 69 6e 67 20 68 65 72 65 20 62 65 63 61  string here beca
6a00: 75 73 65 20 74 68 65 0d 0a 20 20 20 20 20 20 20  use the..       
6a10: 20 23 20 20 20 20 20 20 20 72 65 73 75 6c 74 20   #       result 
6a20: 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  of this procedur
6a30: 65 20 6d 61 79 20 62 65 20 75 73 65 64 20 77 69  e may be used wi
6a40: 74 68 20 5b 66 69 6c 65 20 6a 6f 69 6e 5d 2e 0d  th [file join]..
6a50: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
6a60: 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20      return "".. 
6a70: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
6a80: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 75  ..    proc getBu
6a90: 69 6c 64 46 69 6c 65 4e 61 6d 65 20 7b 20 66 69  ildFileName { fi
6aa0: 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d  leName {platform
6ab0: 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20   ""} } {..      
6ac0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
6ad0: 20 52 65 74 75 72 6e 73 20 74 68 65 20 73 70 65   Returns the spe
6ae0: 63 69 66 69 65 64 20 66 69 6c 65 20 6e 61 6d 65  cified file name
6af0: 20 61 73 20 69 66 20 69 74 20 77 65 72 65 20 6c   as if it were l
6b00: 6f 63 61 74 65 64 20 69 6e 20 74 68 65 0d 0a 20  ocated in the.. 
6b10: 20 20 20 20 20 23 20 20 20 20 20 20 20 62 75 69       #       bui
6b20: 6c 64 20 64 69 72 65 63 74 6f 72 79 2c 20 64 69  ld directory, di
6b30: 73 63 61 72 64 69 6e 67 20 61 6e 79 20 64 69 72  scarding any dir
6b40: 65 63 74 6f 72 79 20 69 6e 66 6f 72 6d 61 74 69  ectory informati
6b50: 6f 6e 20 70 72 65 73 65 6e 74 0d 0a 20 20 20 20  on present..    
6b60: 20 20 23 20 20 20 20 20 20 20 69 6e 20 74 68 65    #       in the
6b70: 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 70 72   file name as pr
6b80: 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20 63 61  ovided by our ca
6b90: 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ller...      #..
6ba0: 20 20 20 20 20 20 73 65 74 20 72 65 73 75 6c 74        set result
6bb0: 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
6bc0: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  e \..          [
6bd0: 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42 75  file join [getBu
6be0: 69 6c 64 44 69 72 65 63 74 6f 72 79 5d 20 24 70  ildDirectory] $p
6bf0: 6c 61 74 66 6f 72 6d 20 5b 66 69 6c 65 20 74 61  latform [file ta
6c00: 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 5d 0d  il $fileName]]].
6c10: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
6c20: 20 20 23 20 48 41 43 4b 3a 20 57 68 65 6e 20 72    # HACK: When r
6c30: 75 6e 6e 69 6e 67 20 6f 6e 20 57 6f 57 36 34 2c  unning on WoW64,
6c40: 20 61 73 73 75 6d 65 20 74 68 65 20 74 65 73 74   assume the test
6c50: 20 65 78 65 63 75 74 61 62 6c 65 73 20 61 72 65   executables are
6c60: 20 70 72 65 73 65 6e 74 0d 0a 20 20 20 20 20 20   present..      
6c70: 23 20 20 20 20 20 20 20 77 69 74 68 20 74 68 65  #       with the
6c80: 20 22 33 32 22 20 73 75 66 66 69 78 20 6f 6e 20   "32" suffix on 
6c90: 74 68 65 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  them...      #..
6ca0: 20 20 20 20 20 20 69 66 20 7b 5b 69 73 52 75 6e        if {[isRun
6cb0: 6e 69 6e 67 57 6f 57 36 34 5d 20 26 26 20 5b 66  ningWoW64] && [f
6cc0: 69 6c 65 20 65 78 74 65 6e 73 69 6f 6e 20 24 72  ile extension $r
6cd0: 65 73 75 6c 74 5d 20 65 71 20 22 2e 65 78 65 22  esult] eq ".exe"
6ce0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
6cf0: 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 61 70    set result [ap
6d00: 70 65 6e 64 41 72 67 73 20 5b 66 69 6c 65 20 72  pendArgs [file r
6d10: 6f 6f 74 6e 61 6d 65 20 24 72 65 73 75 6c 74 5d  ootname $result]
6d20: 20 33 32 2e 65 78 65 5d 0d 0a 20 20 20 20 20 20   32.exe]..      
6d30: 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
6d40: 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d  n $result..    }
6d50: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
6d60: 74 45 78 74 65 72 6e 61 6c 44 69 72 65 63 74 6f  tExternalDirecto
6d70: 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ry {} {..      #
6d80: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
6d90: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 72  This procedure r
6da0: 65 74 75 72 6e 73 20 74 68 65 20 64 69 72 65 63  eturns the direc
6db0: 74 6f 72 79 20 77 68 65 72 65 20 74 68 65 20 65  tory where the e
6dc0: 78 74 65 72 6e 61 6c 20 62 69 6e 61 72 79 0d 0a  xternal binary..
6dd0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66 69        #       fi
6de0: 6c 65 73 20 61 72 65 20 6c 6f 63 61 74 65 64 2e  les are located.
6df0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
6e00: 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61   return [file na
6e10: 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 64  tivename [file d
6e20: 69 72 6e 61 6d 65 20 5b 66 69 6c 65 20 64 69 72  irname [file dir
6e30: 6e 61 6d 65 20 5b 69 6e 66 6f 20 62 69 6e 61 72  name [info binar
6e40: 79 5d 5d 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  y]]]]..    }....
6e50: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 69 6e  .    proc getBin
6e60: 61 72 79 44 69 72 65 63 74 6f 72 79 20 7b 7d 20  aryDirectory {} 
6e70: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
6e80: 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70    # NOTE: This p
6e90: 72 6f 63 65 64 75 72 65 20 72 65 74 75 72 6e 73  rocedure returns
6ea0: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 77   the directory w
6eb0: 68 65 72 65 20 74 68 65 20 74 65 73 74 20 61 70  here the test ap
6ec0: 70 6c 69 63 61 74 69 6f 6e 0d 0a 20 20 20 20 20  plication..     
6ed0: 20 23 20 20 20 20 20 20 20 69 74 73 65 6c 66 20   #       itself 
6ee0: 28 69 2e 65 2e 20 74 68 65 20 45 61 67 6c 65 20  (i.e. the Eagle 
6ef0: 73 68 65 6c 6c 29 20 69 73 20 6c 6f 63 61 74 65  shell) is locate
6f00: 64 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 62 65  d.  This will be
6f10: 20 75 73 65 64 20 61 73 0d 0a 20 20 20 20 20 20   used as..      
6f20: 23 20 20 20 20 20 20 20 74 68 65 20 64 65 73 74  #       the dest
6f30: 69 6e 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  ination for the 
6f40: 63 6f 70 69 65 64 20 53 79 73 74 65 6d 2e 44 61  copied System.Da
6f50: 74 61 2e 53 51 4c 69 74 65 20 6e 61 74 69 76 65  ta.SQLite native
6f60: 20 61 6e 64 0d 0a 20 20 20 20 20 20 23 20 20 20   and..      #   
6f70: 20 20 20 20 6d 61 6e 61 67 65 64 20 61 73 73 65      managed asse
6f80: 6d 62 6c 69 65 73 20 28 69 2e 65 2e 20 62 65 63  mblies (i.e. bec
6f90: 61 75 73 65 20 74 68 69 73 20 69 73 20 6f 6e 65  ause this is one
6fa0: 20 6f 66 20 74 68 65 20 66 65 77 20 70 6c 61 63   of the few plac
6fb0: 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  es..      #     
6fc0: 20 20 77 68 65 72 65 20 74 68 65 20 43 4c 52 20    where the CLR 
6fd0: 77 69 6c 6c 20 61 63 74 75 61 6c 6c 79 20 66 69  will actually fi
6fe0: 6e 64 20 61 6e 64 20 6c 6f 61 64 20 74 68 65 6d  nd and load them
6ff0: 20 70 72 6f 70 65 72 6c 79 29 2e 0d 0a 20 20 20   properly)...   
7000: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
7010: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 62  [info exists ::b
7020: 69 6e 61 72 79 5f 64 69 72 65 63 74 6f 72 79 5d  inary_directory]
7030: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
7040: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
7050: 24 3a 3a 62 69 6e 61 72 79 5f 64 69 72 65 63 74  $::binary_direct
7060: 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ory] > 0} then {
7070: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
7080: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
7090: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
70a0: 20 62 69 6e 61 72 79 20 64 69 72 65 63 74 6f 72   binary director
70b0: 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  y has been overr
70c0: 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20  idden;..        
70d0: 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72  #       therefor
70e0: 65 2c 20 75 73 65 20 69 74 20 76 65 72 62 61 74  e, use it verbat
70f0: 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  im...        #..
7100: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
7110: 3a 3a 62 69 6e 61 72 79 5f 64 69 72 65 63 74 6f  ::binary_directo
7120: 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ry..      } else
7130: 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
7140: 72 6e 20 5b 69 6e 66 6f 20 62 69 6e 61 72 79 5d  rn [info binary]
7150: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
7160: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
7170: 74 45 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d  tExternalFileNam
7180: 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20 7b  e { fileName } {
7190: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
71a0: 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 73   # NOTE: Returns
71b0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
71c0: 69 6c 65 20 6e 61 6d 65 20 61 73 20 69 66 20 69  ile name as if i
71d0: 74 20 77 65 72 65 20 6c 6f 63 61 74 65 64 20 69  t were located i
71e0: 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  n the..      #  
71f0: 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 63       directory c
7200: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65 78  ontaining the ex
7210: 74 65 72 6e 61 6c 20 62 69 6e 61 72 69 65 73 2e  ternal binaries.
7220: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
7230: 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61   return [file na
7240: 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a  tivename [file j
7250: 6f 69 6e 20 5b 67 65 74 45 78 74 65 72 6e 61 6c  oin [getExternal
7260: 44 69 72 65 63 74 6f 72 79 5d 20 24 66 69 6c 65  Directory] $file
7270: 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c  Name]]..    }...
7280: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 69  ..    proc getBi
7290: 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 7b 20 66  naryFileName { f
72a0: 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72  ileName {platfor
72b0: 6d 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  m ""} } {..     
72c0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
72d0: 3a 20 52 65 74 75 72 6e 73 20 74 68 65 20 73 70  : Returns the sp
72e0: 65 63 69 66 69 65 64 20 66 69 6c 65 20 6e 61 6d  ecified file nam
72f0: 65 20 61 73 20 69 66 20 69 74 20 77 65 72 65 20  e as if it were 
7300: 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65 0d 0a  located in the..
7310: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 69        #       bi
7320: 6e 61 72 79 20 64 69 72 65 63 74 6f 72 79 2c 20  nary directory, 
7330: 64 69 73 63 61 72 64 69 6e 67 20 61 6e 79 20 64  discarding any d
7340: 69 72 65 63 74 6f 72 79 20 69 6e 66 6f 72 6d 61  irectory informa
7350: 74 69 6f 6e 20 70 72 65 73 65 6e 74 0d 0a 20 20  tion present..  
7360: 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 20 74      #       in t
7370: 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20  he file name as 
7380: 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20  provided by our 
7390: 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23  caller...      #
73a0: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b  ..      return [
73b0: 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
73c0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 66 69  \..          [fi
73d0: 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e 61  le join [getBina
73e0: 72 79 44 69 72 65 63 74 6f 72 79 5d 20 24 70 6c  ryDirectory] $pl
73f0: 61 74 66 6f 72 6d 20 5b 66 69 6c 65 20 74 61 69  atform [file tai
7400: 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 5d 0d 0a  l $fileName]]]..
7410: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
7420: 6f 63 20 67 65 74 43 6f 72 65 42 69 6e 61 72 79  oc getCoreBinary
7430: 46 69 6c 65 4e 61 6d 65 20 7b 20 7b 70 6c 61 74  FileName { {plat
7440: 66 6f 72 6d 20 22 22 7d 20 7b 73 74 61 6e 64 61  form ""} {standa
7450: 72 64 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  rd false} } {.. 
7460: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
7470: 4e 4f 54 45 3a 20 52 65 74 75 72 6e 73 20 74 68  NOTE: Returns th
7480: 65 20 66 75 6c 6c 20 70 61 74 68 20 66 6f 72 20  e full path for 
7490: 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  the file contain
74a0: 69 6e 67 20 74 68 65 20 53 51 4c 69 74 65 20 63  ing the SQLite c
74b0: 6f 72 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ore..      #    
74c0: 20 20 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72     native librar
74d0: 79 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20  y code for this 
74e0: 70 6c 61 74 66 6f 72 6d 2e 20 20 46 69 72 73 74  platform.  First
74f0: 2c 20 63 68 65 63 6b 20 61 6e 64 20 73 65 65 20  , check and see 
7500: 69 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  if..      #     
7510: 20 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72    the SQLite cor
7520: 65 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79  e native library
7530: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
7540: 6e 20 6c 6f 61 64 65 64 2e 20 20 4e 65 78 74 2c  n loaded.  Next,
7550: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
7560: 66 61 6c 6c 62 61 63 6b 20 74 6f 20 77 68 61 74  fallback to what
7570: 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 20 73   the full path s
7580: 68 6f 75 6c 64 20 62 65 2c 20 62 61 73 65 64 20  hould be, based 
7590: 6f 6e 20 77 68 65 74 68 65 72 20 74 68 65 0d 0a  on whether the..
75a0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 69        #       mi
75b0: 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c  xed-mode assembl
75c0: 79 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 20  y is being used 
75d0: 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  and the name of 
75e0: 74 68 65 20 63 75 72 72 65 6e 74 0d 0a 20 20 20  the current..   
75f0: 20 20 20 23 20 20 20 20 20 20 20 70 6c 61 74 66     #       platf
7600: 6f 72 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  orm...      #.. 
7610: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
7620: 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63  {..        objec
7630: 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
7640: 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
7650: 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
7660: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73  .Data.SQLite.Uns
7670: 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
7680: 20 5f 53 51 4c 69 74 65 4e 61 74 69 76 65 4d 6f   _SQLiteNativeMo
7690: 64 75 6c 65 46 69 6c 65 4e 61 6d 65 0d 0a 20 20  duleFileName..  
76a0: 20 20 20 20 7d 20 66 69 6c 65 4e 61 6d 65 5d 20      } fileName] 
76b0: 3d 3d 20 30 20 26 26 20 5b 73 74 72 69 6e 67 20  == 0 && [string 
76c0: 6c 65 6e 67 74 68 20 24 66 69 6c 65 4e 61 6d 65  length $fileName
76d0: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
76e0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
76f0: 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 53 51    # NOTE: The SQ
7700: 4c 69 74 65 20 63 6f 72 65 20 6e 61 74 69 76 65  Lite core native
7710: 20 6c 69 62 72 61 72 79 20 68 61 73 20 61 6c 72   library has alr
7720: 65 61 64 79 20 62 65 65 6e 20 6c 6f 61 64 65 64  eady been loaded
7730: 20 76 69 61 0d 0a 20 20 20 20 20 20 20 20 23 20   via..        # 
7740: 20 20 20 20 20 20 74 68 65 20 6e 61 74 69 76 65        the native
7750: 20 6c 69 62 72 61 72 79 20 70 72 65 2d 6c 6f 61   library pre-loa
7760: 64 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 61  der.  Return tha
7770: 74 20 66 69 6c 65 20 6e 61 6d 65 20 6e 6f 77 2e  t file name now.
7780: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
7790: 20 20 20 20 20 72 65 74 75 72 6e 20 24 66 69 6c       return $fil
77a0: 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 0d 0a  eName..      }..
77b0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 73  ..      if {[has
77c0: 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61  RuntimeOption na
77d0: 74 69 76 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  tive]} then {.. 
77e0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
77f0: 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e    # NOTE: Return
7800: 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20   the mixed-mode 
7810: 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 20 6e 61  assembly file na
7820: 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  me...        #..
7830: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
7840: 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
7850: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
7860: 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42 69  file join [getBi
7870: 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20 24  naryDirectory] $
7880: 70 6c 61 74 66 6f 72 6d 20 53 79 73 74 65 6d 2e  platform System.
7890: 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d  Data.SQLite.dll]
78a0: 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69  ]..      } elsei
78b0: 66 20 7b 24 73 74 61 6e 64 61 72 64 7d 20 74 68  f {$standard} th
78c0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
78d0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
78e0: 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65 74 65   Attempt to dete
78f0: 72 6d 69 6e 65 20 74 68 65 20 6e 61 74 69 76 65  rmine the native
7900: 2d 6f 6e 6c 79 20 73 74 61 6e 64 61 72 64 20 53  -only standard S
7910: 51 4c 69 74 65 20 6c 69 62 72 61 72 79 0d 0a 20  QLite library.. 
7920: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66         #       f
7930: 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 69  ile name for thi
7940: 73 20 70 6c 61 74 66 6f 72 6d 20 61 6e 64 20 74  s platform and t
7950: 68 65 6e 20 72 65 74 75 72 6e 20 69 74 2e 0d 0a  hen return it...
7960: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
7970: 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
7980: 61 6d 65 4f 6e 6c 79 20 5b 67 65 74 4e 61 74 69  ameOnly [getNati
7990: 76 65 4c 69 62 72 61 72 79 46 69 6c 65 4e 61 6d  veLibraryFileNam
79a0: 65 73 4f 6e 6c 79 5d 20 7b 0d 0a 20 20 20 20 20  esOnly] {..     
79b0: 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d       set fileNam
79c0: 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
79d0: 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
79e0: 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b      [file join [
79f0: 67 65 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f  getBinaryDirecto
7a00: 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d 20 24 66  ry] $platform $f
7a10: 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d  ileNameOnly]]...
7a20: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
7a30: 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c  file exists $fil
7a40: 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
7a50: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
7a60: 72 6e 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20  rn $fileName..  
7a70: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
7a80: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
7a90: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
7aa0: 45 3a 20 46 61 6c 6c 62 61 63 6b 20 74 6f 20 72  E: Fallback to r
7ab0: 65 74 75 72 6e 69 6e 67 20 74 68 65 20 6e 61 74  eturning the nat
7ac0: 69 76 65 2d 6f 6e 6c 79 20 73 74 61 6e 64 61 72  ive-only standar
7ad0: 64 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79  d SQLite library
7ae0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
7af0: 20 20 66 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20    file name for 
7b00: 57 69 6e 64 6f 77 73 2e 0d 0a 20 20 20 20 20 20  Windows...      
7b10: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
7b20: 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  urn [file native
7b30: 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  name \..        
7b40: 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b      [file join [
7b50: 67 65 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f  getBinaryDirecto
7b60: 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d 20 73 71  ry] $platform sq
7b70: 6c 69 74 65 33 2e 64 6c 6c 5d 5d 0d 0a 20 20 20  lite3.dll]]..   
7b80: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
7b90: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
7ba0: 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74  # NOTE: Return t
7bb0: 68 65 20 6e 61 74 69 76 65 2d 6f 6e 6c 79 20 69  he native-only i
7bc0: 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20  nterop assembly 
7bd0: 66 69 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20 20 20  file name...    
7be0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
7bf0: 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69  eturn [file nati
7c00: 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  vename \..      
7c10: 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e        [file join
7c20: 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65 63   [getBinaryDirec
7c30: 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d 20  tory] $platform 
7c40: 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64  SQLite.Interop.d
7c50: 6c 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  ll]]..      }.. 
7c60: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
7c70: 63 20 67 65 74 43 6f 6d 6d 6f 6e 44 69 72 65 63  c getCommonDirec
7c80: 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  tory {} {..     
7c90: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
7ca0: 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  : This procedure
7cb0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 64 69 72   returns the dir
7cc0: 65 63 74 6f 72 79 20 77 68 65 72 65 20 74 68 65  ectory where the
7cd0: 20 74 65 73 74 20 73 63 72 69 70 74 73 0d 0a 20   test scripts.. 
7ce0: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 68 6f       #       sho
7cf0: 75 6c 64 20 62 65 20 6c 6f 63 61 74 65 64 2e 20  uld be located. 
7d00: 20 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69   By default, thi
7d10: 73 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 74  s just returns t
7d20: 68 65 20 45 61 67 6c 65 0d 0a 20 20 20 20 20 20  he Eagle..      
7d30: 23 20 20 20 20 20 20 20 62 69 6e 61 72 79 20 64  #       binary d
7d40: 69 72 65 63 74 6f 72 79 2e 0d 0a 20 20 20 20 20  irectory...     
7d50: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
7d60: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f 6d  nfo exists ::com
7d70: 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20 26  mon_directory] &
7d80: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
7d90: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
7da0: 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72  :common_director
7db0: 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  y] > 0} then {..
7dc0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
7dd0: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c     # NOTE: The l
7de0: 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 63  ocation of the c
7df0: 6f 6d 6d 6f 6e 20 64 69 72 65 63 74 6f 72 79 20  ommon directory 
7e00: 68 61 73 20 62 65 65 6e 20 73 65 74 3b 0d 0a 20  has been set;.. 
7e10: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
7e20: 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
7e30: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
7e40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
7e50: 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79  common_directory
7e60: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66  ..      } elseif
7e70: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
7e80: 3a 76 65 6e 64 6f 72 5f 64 69 72 65 63 74 6f 72  :vendor_director
7e90: 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  y] && \..       
7ea0: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
7eb0: 68 20 24 3a 3a 76 65 6e 64 6f 72 5f 64 69 72 65  h $::vendor_dire
7ec0: 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e  ctory] > 0} then
7ed0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
7ee0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54         # NOTE: T
7ef0: 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74  he location of t
7f00: 68 65 20 76 65 6e 64 6f 72 20 64 69 72 65 63 74  he vendor direct
7f10: 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73 65 74  ory has been set
7f20: 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ;..        #    
7f30: 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73     therefore, us
7f40: 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  e it...        #
7f50: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
7f60: 20 24 3a 3a 76 65 6e 64 6f 72 5f 64 69 72 65 63   $::vendor_direc
7f70: 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c  tory..      } el
7f80: 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73  seif {[info exis
7f90: 74 73 20 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79  ts ::tcl_library
7fa0: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
7fb0: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
7fc0: 20 24 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79 5d   $::tcl_library]
7fd0: 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20 20 20 20   > 0 && \..     
7fe0: 20 20 20 20 20 5b 66 69 6c 65 20 69 73 64 69 72       [file isdir
7ff0: 65 63 74 6f 72 79 20 24 3a 3a 74 63 6c 5f 6c 69  ectory $::tcl_li
8000: 62 72 61 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  brary]} then {..
8010: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
8020: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 76     # NOTE: The v
8030: 61 72 69 61 62 6c 65 20 77 69 74 68 20 74 68 65  ariable with the
8040: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
8050: 20 73 63 72 69 70 74 20 6c 69 62 72 61 72 79 20   script library 
8060: 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  is..        #   
8070: 20 20 20 20 73 65 74 20 61 6e 64 20 61 70 70 65      set and appe
8080: 61 72 73 20 74 6f 20 62 65 20 61 20 72 65 61 6c  ars to be a real
8090: 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e   directory (i.e.
80a0: 20 6e 6f 74 20 65 6d 62 65 64 64 65 64 0d 0a 20   not embedded.. 
80b0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77         #       w
80c0: 69 74 68 69 6e 20 61 20 66 69 6c 65 29 3b 20 74  ithin a file); t
80d0: 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
80e0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
80f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
8100: 74 63 6c 5f 6c 69 62 72 61 72 79 0d 0a 20 20 20  tcl_library..   
8110: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
8120: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
8130: 23 20 4e 4f 54 45 3a 20 46 61 6c 6c 62 61 63 6b  # NOTE: Fallback
8140: 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72   to the director
8150: 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  y containing the
8160: 20 65 78 65 63 75 74 61 62 6c 65 2e 0d 0a 20 20   executable...  
8170: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
8180: 20 72 65 74 75 72 6e 20 5b 69 6e 66 6f 20 62 69   return [info bi
8190: 6e 61 72 79 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  nary]..      }..
81a0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
81b0: 6f 63 20 67 65 74 44 61 74 61 62 61 73 65 44 69  oc getDatabaseDi
81c0: 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20  rectory {} {..  
81d0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
81e0: 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64  OTE: This proced
81f0: 75 72 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ure returns the 
8200: 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65 20  directory where 
8210: 74 68 65 20 74 65 73 74 20 64 61 74 61 62 61 73  the test databas
8220: 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  es..      #     
8230: 20 20 73 68 6f 75 6c 64 20 62 65 20 6c 6f 63 61    should be loca
8240: 74 65 64 2e 20 20 42 79 20 64 65 66 61 75 6c 74  ted.  By default
8250: 2c 20 74 68 69 73 20 6a 75 73 74 20 75 73 65 73  , this just uses
8260: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0d 0a   the temporary..
8270: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 69        #       di
8280: 72 65 63 74 6f 72 79 20 63 6f 6e 66 69 67 75 72  rectory configur
8290: 65 64 20 66 6f 72 20 74 68 69 73 20 73 79 73 74  ed for this syst
82a0: 65 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  em...      #..  
82b0: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
82c0: 69 73 74 73 20 3a 3a 64 61 74 61 62 61 73 65 5f  ists ::database_
82d0: 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d  directory] && \.
82e0: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
82f0: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 64 61 74  ng length $::dat
8300: 61 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79 5d  abase_directory]
8310: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
8320: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
8330: 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63   # NOTE: The loc
8340: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74  ation of the dat
8350: 61 62 61 73 65 20 64 69 72 65 63 74 6f 72 79 20  abase directory 
8360: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64  has been overrid
8370: 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20  den;..        # 
8380: 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c        therefore,
8390: 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20   use it...      
83a0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
83b0: 75 72 6e 20 24 3a 3a 64 61 74 61 62 61 73 65 5f  urn $::database_
83c0: 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20  directory..     
83d0: 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f   } elseif {[info
83e0: 20 65 78 69 73 74 73 20 3a 3a 73 63 72 61 74 63   exists ::scratc
83f0: 68 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20  h_directory] && 
8400: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
8410: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 73  ring length $::s
8420: 63 72 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79  cratch_directory
8430: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
8440: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
8450: 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f    # NOTE: The lo
8460: 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 63  cation of the sc
8470: 72 61 74 63 68 20 64 69 72 65 63 74 6f 72 79 20  ratch directory 
8480: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64  has been overrid
8490: 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20  den;..        # 
84a0: 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c        therefore,
84b0: 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20   use it...      
84c0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
84d0: 75 72 6e 20 24 3a 3a 73 63 72 61 74 63 68 5f 64  urn $::scratch_d
84e0: 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20  irectory..      
84f0: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
8500: 20 20 72 65 74 75 72 6e 20 5b 67 65 74 54 65 6d    return [getTem
8510: 70 6f 72 61 72 79 50 61 74 68 5d 0d 0a 20 20 20  poraryPath]..   
8520: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
8530: 20 20 20 20 70 72 6f 63 20 67 65 74 54 65 6d 70      proc getTemp
8540: 6f 72 61 72 79 44 69 72 65 63 74 6f 72 79 20 7b  oraryDirectory {
8550: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
8560: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73      # NOTE: This
8570: 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72   procedure retur
8580: 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ns the directory
8590: 20 77 68 65 72 65 20 74 68 65 20 74 65 6d 70 6f   where the tempo
85a0: 72 61 72 79 20 66 69 6c 65 73 0d 0a 20 20 20 20  rary files..    
85b0: 20 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64    #       should
85c0: 20 62 65 20 6c 6f 63 61 74 65 64 2e 20 20 42 79   be located.  By
85d0: 20 64 65 66 61 75 6c 74 2c 20 74 68 69 73 20 6a   default, this j
85e0: 75 73 74 20 75 73 65 73 20 74 68 65 20 74 65 6d  ust uses the tem
85f0: 70 6f 72 61 72 79 0d 0a 20 20 20 20 20 20 23 20  porary..      # 
8600: 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20        directory 
8610: 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 74  configured for t
8620: 68 69 73 20 73 79 73 74 65 6d 2e 0d 0a 20 20 20  his system...   
8630: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
8640: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
8650: 65 6d 70 6f 72 61 72 79 5f 64 69 72 65 63 74 6f  emporary_directo
8660: 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  ry] && \..      
8670: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
8680: 74 68 20 24 3a 3a 74 65 6d 70 6f 72 61 72 79 5f  th $::temporary_
8690: 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20  directory] > 0} 
86a0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
86b0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
86c0: 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  E: The location 
86d0: 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
86e0: 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
86f0: 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d  een overridden;.
8700: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
8710: 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   therefore, use 
8720: 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  it...        #..
8730: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
8740: 3a 3a 74 65 6d 70 6f 72 61 72 79 5f 64 69 72 65  ::temporary_dire
8750: 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65  ctory..      } e
8760: 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69  lseif {[info exi
8770: 73 74 73 20 3a 3a 73 63 72 61 74 63 68 5f 64 69  sts ::scratch_di
8780: 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20  rectory] && \.. 
8790: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
87a0: 20 6c 65 6e 67 74 68 20 24 3a 3a 73 63 72 61 74   length $::scrat
87b0: 63 68 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20  ch_directory] > 
87c0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
87d0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
87e0: 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69  NOTE: The locati
87f0: 6f 6e 20 6f 66 20 74 68 65 20 73 63 72 61 74 63  on of the scratc
8800: 68 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20  h directory has 
8810: 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b  been overridden;
8820: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
8830: 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65    therefore, use
8840: 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d   it...        #.
8850: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
8860: 24 3a 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63  $::scratch_direc
8870: 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c  tory..      } el
8880: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  se {..        re
8890: 74 75 72 6e 20 5b 67 65 74 54 65 6d 70 6f 72 61  turn [getTempora
88a0: 72 79 50 61 74 68 5d 0d 0a 20 20 20 20 20 20 7d  ryPath]..      }
88b0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
88c0: 70 72 6f 63 20 67 65 74 45 78 65 63 75 74 65 4f  proc getExecuteO
88d0: 6e 53 65 74 75 70 20 7b 7d 20 7b 0d 0a 20 20 20  nSetup {} {..   
88e0: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
88f0: 73 74 73 20 3a 3a 65 78 65 63 75 74 65 5f 6f 6e  sts ::execute_on
8900: 5f 73 65 74 75 70 5d 20 26 26 20 5c 0d 0a 20 20  _setup] && \..  
8910: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
8920: 6c 65 6e 67 74 68 20 24 3a 3a 65 78 65 63 75 74  length $::execut
8930: 65 5f 6f 6e 5f 73 65 74 75 70 5d 20 3e 20 30 7d  e_on_setup] > 0}
8940: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
8950: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
8960: 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65 20 63  TE: Return the c
8970: 6f 6e 66 69 67 75 72 65 64 20 53 51 4c 20 74 6f  onfigured SQL to
8980: 20 65 78 65 63 75 74 65 20 64 75 72 69 6e 67 20   execute during 
8990: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a  the connection..
89a0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
89b0: 73 65 74 75 70 20 70 72 6f 63 65 64 75 72 65 20  setup procedure 
89c0: 28 69 2e 65 2e 20 66 6f 72 20 65 76 65 72 79 20  (i.e. for every 
89d0: 74 65 73 74 20 64 61 74 61 62 61 73 65 20 63 6f  test database co
89e0: 6e 6e 65 63 74 69 6f 6e 29 2e 0d 0a 20 20 20 20  nnection)...    
89f0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
8a00: 65 74 75 72 6e 20 24 3a 3a 65 78 65 63 75 74 65  eturn $::execute
8a10: 5f 6f 6e 5f 73 65 74 75 70 0d 0a 20 20 20 20 20  _on_setup..     
8a20: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
8a30: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
8a40: 4e 4f 54 45 3a 20 42 79 20 64 65 66 61 75 6c 74  NOTE: By default
8a50: 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 53 51  , there is no SQ
8a60: 4c 20 74 6f 20 65 78 65 63 75 74 65 20 64 75 72  L to execute dur
8a70: 69 6e 67 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ing the connecti
8a80: 6f 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  on..        #   
8a90: 20 20 20 20 73 65 74 75 70 20 70 72 6f 63 65 64      setup proced
8aa0: 75 72 65 20 28 69 2e 65 2e 20 66 6f 72 20 65 76  ure (i.e. for ev
8ab0: 65 72 79 20 74 65 73 74 20 64 61 74 61 62 61 73  ery test databas
8ac0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0d 0a  e connection)...
8ad0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
8ae0: 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20     return ""..  
8af0: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
8b00: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 54 65 73  .    proc getTes
8b10: 74 4f 76 65 72 72 69 64 65 73 50 72 65 61 6d 62  tOverridesPreamb
8b20: 6c 65 20 7b 20 7b 65 78 74 72 61 56 61 72 4e 61  le { {extraVarNa
8b30: 6d 65 73 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20  mes ""} } {..   
8b40: 20 20 20 73 65 74 20 76 61 72 4e 61 6d 65 73 20     set varNames 
8b50: 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20  [list]....      
8b60: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
8b70: 20 49 66 20 61 76 61 69 6c 61 62 6c 65 2c 20 73   If available, s
8b80: 74 61 72 74 20 77 69 74 68 20 74 68 65 20 6d 61  tart with the ma
8b90: 73 74 65 72 20 6c 69 73 74 20 6f 66 20 74 65 73  ster list of tes
8ba0: 74 20 6f 76 65 72 72 69 64 65 0d 0a 20 20 20 20  t override..    
8bb0: 20 20 23 20 20 20 20 20 20 20 76 61 72 69 61 62    #       variab
8bc0: 6c 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  les...      #.. 
8bd0: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
8be0: 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 6f 76 65  xists ::test_ove
8bf0: 72 72 69 64 65 73 5d 20 26 26 20 5c 0d 0a 20 20  rrides] && \..  
8c00: 20 20 20 20 20 20 20 20 5b 6c 6c 65 6e 67 74 68          [llength
8c10: 20 24 3a 3a 74 65 73 74 5f 6f 76 65 72 72 69 64   $::test_overrid
8c20: 65 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  es] > 0} then {.
8c30: 0a 20 20 20 20 20 20 20 20 65 76 61 6c 20 6c 61  .        eval la
8c40: 70 70 65 6e 64 20 76 61 72 4e 61 6d 65 73 20 24  ppend varNames $
8c50: 3a 3a 74 65 73 74 5f 6f 76 65 72 72 69 64 65 73  ::test_overrides
8c60: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
8c70: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
8c80: 54 45 3a 20 49 66 20 72 65 71 75 65 73 74 65 64  TE: If requested
8c90: 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2c 20   by our caller, 
8ca0: 61 64 64 20 61 6e 79 20 61 64 64 69 74 69 6f 6e  add any addition
8cb0: 61 6c 20 76 61 72 69 61 62 6c 65 0d 0a 20 20 20  al variable..   
8cc0: 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d 65 73     #       names
8cd0: 20 74 6f 20 63 6f 70 79 20 6e 6f 77 2e 0d 0a 20   to copy now... 
8ce0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
8cf0: 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 65 78 74 72   {[llength $extr
8d00: 61 56 61 72 4e 61 6d 65 73 5d 20 3e 20 30 7d 20  aVarNames] > 0} 
8d10: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
8d20: 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 76 61 72  eval lappend var
8d30: 4e 61 6d 65 73 20 24 65 78 74 72 61 56 61 72 4e  Names $extraVarN
8d40: 61 6d 65 73 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  ames..      }...
8d50: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
8d60: 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68  # NOTE: Build th
8d70: 65 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e  e script fragmen
8d80: 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  t to be returned
8d90: 20 62 79 20 70 72 6f 63 65 73 73 69 6e 67 20 65   by processing e
8da0: 61 63 68 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ach..      #    
8db0: 20 20 20 76 61 72 69 61 62 6c 65 20 6e 61 6d 65     variable name
8dc0: 20 61 6e 64 20 61 64 64 69 6e 67 20 74 68 65 20   and adding the 
8dd0: 6e 65 63 65 63 65 73 73 61 72 79 20 73 63 72 69  nececessary scri
8de0: 70 74 20 66 72 61 67 6d 65 6e 74 73 20 66 6f 72  pt fragments for
8df0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
8e00: 65 61 63 68 20 6f 6e 65 2e 0d 0a 20 20 20 20 20  each one...     
8e10: 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 72 65   #..      set re
8e20: 73 75 6c 74 20 22 22 0d 0a 0d 0a 20 20 20 20 20  sult ""....     
8e30: 20 66 6f 72 65 61 63 68 20 76 61 72 4e 61 6d 65   foreach varName
8e40: 20 24 76 61 72 4e 61 6d 65 73 20 7b 0d 0a 20 20   $varNames {..  
8e50: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
8e60: 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74   # NOTE: Build t
8e70: 68 65 20 71 75 61 6c 69 66 69 65 64 20 67 6c 6f  he qualified glo
8e80: 62 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 61 6d  bal variable nam
8e90: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
8ea0: 20 20 20 20 20 20 20 73 65 74 20 66 75 6c 6c 56         set fullV
8eb0: 61 72 4e 61 6d 65 20 5b 61 70 70 65 6e 64 41 72  arName [appendAr
8ec0: 67 73 20 3a 3a 20 24 76 61 72 4e 61 6d 65 5d 0d  gs :: $varName].
8ed0: 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
8ee0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f        # NOTE: Do
8ef0: 65 73 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  es the variable 
8f00: 65 78 69 73 74 20 69 6e 20 74 68 69 73 20 69 6e  exist in this in
8f10: 74 65 72 70 72 65 74 65 72 20 63 6f 6e 74 65 78  terpreter contex
8f20: 74 3f 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t?..        #.. 
8f30: 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f         if {[info
8f40: 20 65 78 69 73 74 73 20 24 66 75 6c 6c 56 61 72   exists $fullVar
8f50: 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
8f60: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
8f70: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 70        # NOTE: Ap
8f80: 70 65 6e 64 20 61 20 73 63 72 69 70 74 20 66 72  pend a script fr
8f90: 61 67 6d 65 6e 74 20 74 6f 20 74 68 65 20 72 65  agment to the re
8fa0: 73 75 6c 74 20 74 68 61 74 20 77 69 6c 6c 20 63  sult that will c
8fb0: 6f 72 72 65 63 74 6c 79 0d 0a 20 20 20 20 20 20  orrectly..      
8fc0: 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 70 79      #       copy
8fd0: 20 61 6e 79 20 63 6f 6e 74 61 69 6e 65 64 20 76   any contained v
8fe0: 61 6c 75 65 20 74 6f 20 61 6e 6f 74 68 65 72 20  alue to another 
8ff0: 69 6e 74 65 72 70 72 65 74 65 72 20 63 6f 6e 74  interpreter cont
9000: 65 78 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ext...          
9010: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 61 70 70  #..          app
9020: 65 6e 64 20 72 65 73 75 6c 74 20 5c 6e 20 22 73  end result \n "s
9030: 65 74 20 22 20 24 66 75 6c 6c 56 61 72 4e 61 6d  et " $fullVarNam
9040: 65 20 22 20 5c 7b 22 20 5b 73 65 74 20 24 66 75  e " \{" [set $fu
9050: 6c 6c 56 61 72 4e 61 6d 65 5d 20 5c 7d 0d 0a 20  llVarName] \}.. 
9060: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
9070: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
9080: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74      # NOTE: If t
9090: 68 65 20 72 65 73 75 6c 74 20 63 6f 6e 74 61 69  he result contai
90a0: 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  ns one or more s
90b0: 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 73 2c  cript fragments,
90c0: 20 61 70 70 65 6e 64 20 61 0d 0a 20 20 20 20 20   append a..     
90d0: 20 23 20 20 20 20 20 20 20 6e 65 77 6c 69 6e 65   #       newline
90e0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
90f0: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
9100: 6e 67 74 68 20 24 72 65 73 75 6c 74 5d 20 3e 20  ngth $result] > 
9110: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
9120: 20 20 20 61 70 70 65 6e 64 20 72 65 73 75 6c 74     append result
9130: 20 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a   \n..      }....
9140: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65        return $re
9150: 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  sult..    }.....
9160: 20 20 20 20 70 72 6f 63 20 6d 6f 76 65 53 79 73      proc moveSys
9170: 74 65 6d 44 61 74 61 53 51 4c 69 74 65 44 6c 6c  temDataSQLiteDll
9180: 43 6f 6e 66 69 67 20 7b 20 7b 72 65 73 74 6f 72  Config { {restor
9190: 65 20 66 61 6c 73 65 7d 20 7b 76 65 72 62 6f 73  e false} {verbos
91a0: 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20  e false} } {..  
91b0: 20 20 20 20 73 65 74 20 64 69 72 65 63 74 6f 72      set director
91c0: 79 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65  y [object invoke
91d0: 20 41 70 70 44 6f 6d 61 69 6e 20 43 75 72 72 65   AppDomain Curre
91e0: 6e 74 44 6f 6d 61 69 6e 2e 42 61 73 65 44 69 72  ntDomain.BaseDir
91f0: 65 63 74 6f 72 79 5d 0d 0a 0d 0a 20 20 20 20 20  ectory]....     
9200: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
9210: 67 74 68 20 24 64 69 72 65 63 74 6f 72 79 5d 20  gth $directory] 
9220: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
9230: 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f        if {$verbo
9240: 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  se} then {..    
9250: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
9260: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
9270: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
9280: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
9290: 6b 69 70 70 65 64 20 6d 6f 76 69 6e 67 20 5c 22  kipped moving \"
92a0: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
92b0: 74 65 2e 64 6c 6c 2e 63 6f 6e 66 69 67 5c 22 2c  te.dll.config\",
92c0: 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
92d0: 20 20 20 20 22 6e 6f 20 62 61 73 65 20 64 69 72      "no base dir
92e0: 65 63 74 6f 72 79 5c 6e 22 5d 0d 0a 20 20 20 20  ectory\n"]..    
92f0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 72      }..        r
9300: 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a  eturn..      }..
9310: 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65  ..      set file
9320: 4e 61 6d 65 28 31 29 20 5b 66 69 6c 65 20 6e 6f  Name(1) [file no
9330: 72 6d 61 6c 69 7a 65 20 5c 0d 0a 20 20 20 20 20  rmalize \..     
9340: 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20       [file join 
9350: 24 64 69 72 65 63 74 6f 72 79 20 53 79 73 74 65  $directory Syste
9360: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
9370: 6c 2e 63 6f 6e 66 69 67 5d 5d 0d 0a 0d 0a 20 20  l.config]]....  
9380: 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65      set fileName
9390: 28 32 29 20 5b 61 70 70 65 6e 64 41 72 67 73 20  (2) [appendArgs 
93a0: 24 66 69 6c 65 4e 61 6d 65 28 31 29 20 2e 6d 6f  $fileName(1) .mo
93b0: 76 65 64 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  ved]....      if
93c0: 20 7b 24 72 65 73 74 6f 72 65 7d 20 74 68 65 6e   {$restore} then
93d0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
93e0: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69  [file exists $fi
93f0: 6c 65 4e 61 6d 65 28 32 29 5d 7d 20 74 68 65 6e  leName(2)]} then
9400: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66 69   {..          fi
9410: 6c 65 20 72 65 6e 61 6d 65 20 24 66 69 6c 65 4e  le rename $fileN
9420: 61 6d 65 28 32 29 20 24 66 69 6c 65 4e 61 6d 65  ame(2) $fileName
9430: 28 31 29 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  (1)....         
9440: 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74   if {$verbose} t
9450: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
9460: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
9470: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
9480: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
9490: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6d 6f          "---- mo
94a0: 76 65 64 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d  ved \"" $fileNam
94b0: 65 28 32 29 20 22 5c 22 20 74 6f 20 5c 22 22 20  e(2) "\" to \"" 
94c0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
94d0: 20 20 20 24 66 69 6c 65 4e 61 6d 65 28 31 29 20     $fileName(1) 
94e0: 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  \"\n]..         
94f0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c   }..        } el
9500: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
9510: 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68  if {$verbose} th
9520: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
9530: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
9540: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
9550: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
9560: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69         "---- ski
9570: 70 70 65 64 20 6d 6f 76 69 6e 67 20 5c 22 22 20  pped moving \"" 
9580: 24 66 69 6c 65 4e 61 6d 65 28 32 29 20 5c 0d 0a  $fileName(2) \..
9590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95a0: 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74  "\", it does not
95b0: 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20   exist\n"]..    
95c0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
95d0: 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65   }..      } else
95e0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
95f0: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69  [file exists $fi
9600: 6c 65 4e 61 6d 65 28 31 29 5d 7d 20 74 68 65 6e  leName(1)]} then
9610: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66 69   {..          fi
9620: 6c 65 20 72 65 6e 61 6d 65 20 24 66 69 6c 65 4e  le rename $fileN
9630: 61 6d 65 28 31 29 20 24 66 69 6c 65 4e 61 6d 65  ame(1) $fileName
9640: 28 32 29 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  (2)....         
9650: 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74   if {$verbose} t
9660: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
9670: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
9680: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
9690: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
96a0: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6d 6f          "---- mo
96b0: 76 65 64 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d  ved \"" $fileNam
96c0: 65 28 31 29 20 22 5c 22 20 74 6f 20 5c 22 22 20  e(1) "\" to \"" 
96d0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
96e0: 20 20 20 24 66 69 6c 65 4e 61 6d 65 28 32 29 20     $fileName(2) 
96f0: 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  \"\n]..         
9700: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c   }..        } el
9710: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
9720: 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68  if {$verbose} th
9730: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
9740: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
9750: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
9760: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
9770: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69         "---- ski
9780: 70 70 65 64 20 6d 6f 76 69 6e 67 20 5c 22 22 20  pped moving \"" 
9790: 24 66 69 6c 65 4e 61 6d 65 28 31 29 20 5c 0d 0a  $fileName(1) \..
97a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97b0: 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74  "\", it does not
97c0: 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20   exist\n"]..    
97d0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
97e0: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20   }..      }..   
97f0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
9800: 67 65 74 41 70 70 44 6f 6d 61 69 6e 50 72 65 61  getAppDomainPrea
9810: 6d 62 6c 65 20 7b 20 7b 70 72 65 66 69 78 20 22  mble { {prefix "
9820: 22 7d 20 7b 73 75 66 66 69 78 20 22 22 7d 20 7d  "} {suffix ""} }
9830: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
9840: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20     # NOTE: This 
9850: 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72 6e  procedure return
9860: 73 20 61 20 74 65 73 74 20 73 65 74 75 70 20 73  s a test setup s
9870: 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20 73  cript fragment s
9880: 75 69 74 61 62 6c 65 20 66 6f 72 0d 0a 20 20 20  uitable for..   
9890: 20 20 20 23 20 20 20 20 20 20 20 65 76 61 6c 75     #       evalu
98a0: 61 74 69 6f 6e 20 62 79 20 61 6e 20 69 6e 74 65  ation by an inte
98b0: 72 70 72 65 74 65 72 20 63 72 65 61 74 65 64 20  rpreter created 
98c0: 69 6e 20 61 6e 20 69 73 6f 6c 61 74 65 64 20 61  in an isolated a
98d0: 70 70 6c 69 63 61 74 69 6f 6e 0d 0a 20 20 20 20  pplication..    
98e0: 20 20 23 20 20 20 20 20 20 20 64 6f 6d 61 69 6e    #       domain
98f0: 2e 20 20 54 68 65 20 73 63 72 69 70 74 20 66 72  .  The script fr
9900: 61 67 6d 65 6e 74 20 62 65 69 6e 67 20 72 65 74  agment being ret
9910: 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 73 75  urned will be su
9920: 72 72 6f 75 6e 64 65 64 20 62 79 0d 0a 20 20 20  rrounded by..   
9930: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 70     #       the p
9940: 72 65 66 69 78 20 61 6e 64 20 73 75 66 66 69 78  refix and suffix
9950: 20 22 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e   "script fragmen
9960: 74 73 22 20 73 70 65 63 69 66 69 65 64 20 62 79  ts" specified by
9970: 20 6f 75 72 20 63 61 6c 6c 65 72 2c 0d 0a 20 20   our caller,..  
9980: 20 20 20 20 23 20 20 20 20 20 20 20 69 66 20 61      #       if a
9990: 6e 79 2e 20 20 54 68 65 20 65 6e 74 69 72 65 20  ny.  The entire 
99a0: 73 63 72 69 70 74 20 62 65 69 6e 67 20 72 65 74  script being ret
99b0: 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 73 75  urned will be su
99c0: 62 73 74 69 74 75 74 65 64 20 76 69 61 0d 0a 20  bstituted via.. 
99d0: 20 20 20 20 20 23 20 20 20 20 20 20 20 5b 73 75       #       [su
99e0: 62 73 74 5d 2c 20 69 6e 20 74 68 65 20 63 6f 6e  bst], in the con
99f0: 74 65 78 74 20 6f 66 20 6f 75 72 20 63 61 6c 6c  text of our call
9a00: 65 72 2c 20 62 65 66 6f 72 65 20 62 65 69 6e 67  er, before being
9a10: 20 72 65 74 75 72 6e 65 64 2e 0d 0a 20 20 20 20   returned...    
9a20: 20 20 23 20 20 20 20 20 20 20 54 68 69 73 20 73    #       This s
9a30: 74 65 70 20 69 73 20 6e 65 63 65 73 73 61 72 79  tep is necessary
9a40: 20 73 6f 20 74 68 61 74 20 73 6f 6d 65 20 6c 69   so that some li
9a50: 6d 69 74 65 64 20 63 6f 6e 74 65 78 74 20 69 6e  mited context in
9a60: 66 6f 72 6d 61 74 69 6f 6e 2c 0d 0a 20 20 20 20  formation,..    
9a70: 20 20 23 20 20 20 20 20 20 20 70 72 69 6d 61 72    #       primar
9a80: 69 6c 79 20 72 65 6c 61 74 65 64 20 74 6f 20 74  ily related to t
9a90: 68 65 20 74 65 73 74 69 6e 67 20 64 69 72 65 63  he testing direc
9aa0: 74 6f 72 69 65 73 2c 20 63 61 6e 20 62 65 20 74  tories, can be t
9ab0: 72 61 6e 73 66 65 72 72 65 64 0d 0a 20 20 20 20  ransferred..    
9ac0: 20 20 23 20 20 20 20 20 20 20 74 6f 20 74 68 65    #       to the
9ad0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 69 6e 20   interpreter in 
9ae0: 74 68 65 20 69 73 6f 6c 61 74 65 64 20 61 70 70  the isolated app
9af0: 6c 69 63 61 74 69 6f 6e 20 64 6f 6d 61 69 6e 2c  lication domain,
9b00: 20 6d 61 6b 69 6e 67 20 69 74 0d 0a 20 20 20 20   making it..    
9b10: 20 20 23 20 20 20 20 20 20 20 61 62 6c 65 20 74    #       able t
9b20: 6f 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72  o successfully r
9b30: 75 6e 20 74 65 73 74 73 20 74 68 61 74 20 72 65  un tests that re
9b40: 71 75 69 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72  quire one or mor
9b50: 65 20 6f 66 20 74 68 65 0d 0a 20 20 20 20 20 20  e of the..      
9b60: 23 20 20 20 20 20 20 20 66 69 6c 65 73 20 69 6e  #       files in
9b70: 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 65 73 74   one of the test
9b80: 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65 73 2e  ing directories.
9b90: 20 20 43 61 6c 6c 65 72 73 20 73 68 6f 75 6c 64    Callers should
9ba0: 20 6b 65 65 70 20 69 6e 0d 0a 20 20 20 20 20 20   keep in..      
9bb0: 23 20 20 20 20 20 20 20 6d 69 6e 64 20 74 68 61  #       mind tha
9bc0: 74 20 74 68 65 20 74 65 73 74 20 73 63 72 69 70  t the test scrip
9bd0: 74 20 66 72 61 67 6d 65 6e 74 20 62 65 69 6e 67  t fragment being
9be0: 20 72 65 74 75 72 6e 65 64 20 63 61 6e 6e 6f 74   returned cannot
9bf0: 20 72 65 6c 79 20 6f 6e 0d 0a 20 20 20 20 20 20   rely on..      
9c00: 23 20 20 20 20 20 20 20 61 6e 79 20 73 63 72 69  #       any scri
9c10: 70 74 20 6c 69 62 72 61 72 79 20 70 72 6f 63 65  pt library proce
9c20: 64 75 72 65 73 20 74 68 61 74 20 61 72 65 20 6e  dures that are n
9c30: 6f 74 20 70 72 6f 76 69 64 65 64 20 62 79 20 74  ot provided by t
9c40: 68 65 20 45 61 67 6c 65 0d 0a 20 20 20 20 20 20  he Eagle..      
9c50: 23 20 20 20 20 20 20 20 6c 69 62 72 61 72 79 20  #       library 
9c60: 70 61 63 6b 61 67 65 20 28 69 2e 65 2e 20 22 69  package (i.e. "i
9c70: 6e 69 74 2e 65 61 67 6c 65 22 29 2c 20 69 6e 63  nit.eagle"), inc
9c80: 6c 75 64 69 6e 67 20 74 68 6f 73 65 20 70 72 6f  luding those pro
9c90: 76 69 64 65 64 20 62 79 0d 0a 20 20 20 20 20 20  vided by..      
9ca0: 23 20 20 20 20 20 20 20 74 68 65 20 45 61 67 6c  #       the Eagl
9cb0: 65 20 74 65 73 74 20 70 61 63 6b 61 67 65 2c 20  e test package, 
9cc0: 75 6e 6c 65 73 73 20 74 68 65 20 66 69 6c 65 20  unless the file 
9cd0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 6d 20  containing them 
9ce0: 69 73 20 6c 6f 61 64 65 64 0d 0a 20 20 20 20 20  is loaded..     
9cf0: 20 23 20 20 20 20 20 20 20 6d 61 6e 75 61 6c 6c   #       manuall
9d00: 79 20 76 69 61 20 73 6f 6d 65 20 6f 74 68 65 72  y via some other
9d10: 20 6d 65 63 68 61 6e 69 73 6d 20 28 65 2e 67 2e   mechanism (e.g.
9d20: 20 62 79 20 69 6e 63 6c 75 64 69 6e 67 20 61 70   by including ap
9d30: 70 72 6f 70 72 69 61 74 65 0d 0a 20 20 20 20 20  propriate..     
9d40: 20 23 20 20 20 20 20 20 20 5b 70 61 63 6b 61 67   #       [packag
9d50: 65 20 72 65 71 75 69 72 65 5d 20 6f 72 20 5b 73  e require] or [s
9d60: 6f 75 72 63 65 5d 20 63 6f 6d 6d 61 6e 64 73 20  ource] commands 
9d70: 69 6e 20 74 68 65 20 70 72 65 66 69 78 20 6f 72  in the prefix or
9d80: 20 73 75 66 66 69 78 0d 0a 20 20 20 20 20 20 23   suffix..      #
9d90: 20 20 20 20 20 20 20 73 63 72 69 70 74 20 66 72         script fr
9da0: 61 67 6d 65 6e 74 73 29 2e 20 20 41 6c 73 6f 2c  agments).  Also,
9db0: 20 61 6c 6c 20 76 61 72 69 61 62 6c 65 20 72 65   all variable re
9dc0: 66 65 72 65 6e 63 65 73 20 61 6e 64 20 61 6c 6c  ferences and all
9dd0: 20 6e 65 73 74 65 64 0d 0a 20 20 20 20 20 20 23   nested..      #
9de0: 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64 73 20         commands 
9df0: 28 69 2e 65 2e 20 74 68 6f 73 65 20 69 6e 20 73  (i.e. those in s
9e00: 71 75 61 72 65 20 62 72 61 63 6b 65 74 73 29 20  quare brackets) 
9e10: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
9e20: 20 66 69 6e 61 6c 0d 0a 20 20 20 20 20 20 23 20   final..      # 
9e30: 20 20 20 20 20 20 73 63 72 69 70 74 20 66 72 61        script fra
9e40: 67 6d 65 6e 74 20 77 69 6c 6c 20 65 6e 64 20 75  gment will end u
9e50: 70 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65  p being evaluate
9e60: 64 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74  d in the context
9e70: 20 6f 66 20 74 68 65 0d 0a 20 20 20 20 20 20 23   of the..      #
9e80: 20 20 20 20 20 20 20 63 61 6c 6c 69 6e 67 20 69         calling i
9e90: 6e 74 65 72 70 72 65 74 65 72 20 61 6e 64 20 6e  nterpreter and n
9ea0: 6f 74 20 74 68 65 20 74 61 72 67 65 74 20 69 6e  ot the target in
9eb0: 74 65 72 70 72 65 74 65 72 20 63 72 65 61 74 65  terpreter create
9ec0: 64 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20  d in the..      
9ed0: 23 20 20 20 20 20 20 20 69 73 6f 6c 61 74 65 64  #       isolated
9ee0: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 6f 6d   application dom
9ef0: 61 69 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 64  ain unless the d
9f00: 6f 6c 6c 61 72 20 73 69 67 6e 73 20 61 6e 64 2f  ollar signs and/
9f10: 6f 72 20 73 71 75 61 72 65 0d 0a 20 20 20 20 20  or square..     
9f20: 20 23 20 20 20 20 20 20 20 62 72 61 63 6b 65 74   #       bracket
9f30: 73 20 61 72 65 20 73 70 65 63 69 61 6c 6c 79 20  s are specially 
9f40: 71 75 6f 74 65 64 20 77 69 74 68 20 62 61 63 6b  quoted with back
9f50: 73 6c 61 73 68 65 73 2e 0d 0a 20 20 20 20 20 20  slashes...      
9f60: 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  #..      return 
9f70: 5b 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74  [uplevel 1 [list
9f80: 20 73 75 62 73 74 20 5b 61 70 70 65 6e 64 41 72   subst [appendAr
9f90: 67 73 20 24 70 72 65 66 69 78 20 7b 0d 0a 20 20  gs $prefix {..  
9fa0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
9fb0: 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 5c 5b 6f   # NOTE: The \[o
9fc0: 62 6a 65 63 74 5c 5d 20 63 6f 6d 6d 61 6e 64 20  bject\] command 
9fd0: 6d 61 79 20 62 65 20 6d 69 73 73 69 6e 67 20 69  may be missing i
9fe0: 6e 20 73 6f 6d 65 20 45 61 67 6c 65 20 63 6f 72  n some Eagle cor
9ff0: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
a000: 20 20 20 6c 69 62 72 61 72 79 20 63 6f 6e 66 69     library confi
a010: 67 75 72 61 74 69 6f 6e 73 2e 20 20 43 6c 6f 6e  gurations.  Clon
a020: 69 6e 67 20 61 6e 64 20 75 73 69 6e 67 20 74 68  ing and using th
a030: 65 20 70 72 6f 63 65 64 75 72 65 0d 0a 20 20 20  e procedure..   
a040: 20 20 20 20 20 23 20 20 20 20 20 20 20 5c 5b 63       #       \[c
a050: 68 61 6e 67 65 4e 61 74 69 76 65 52 75 6e 74 69  hangeNativeRunti
a060: 6d 65 4f 70 74 69 6f 6e 5c 5d 20 6d 61 79 20 68  meOption\] may h
a070: 65 6c 70 20 74 6f 20 6d 69 74 69 67 61 74 65 20  elp to mitigate 
a080: 74 68 69 73 2e 0d 0a 20 20 20 20 20 20 20 20 23  this...        #
a090: 0d 0a 20 20 20 20 20 20 20 20 70 72 6f 63 20 63  ..        proc c
a0a0: 68 61 6e 67 65 4e 61 74 69 76 65 52 75 6e 74 69  hangeNativeRunti
a0b0: 6d 65 4f 70 74 69 6f 6e 20 5c 0d 0a 20 20 20 20  meOption \..    
a0c0: 20 20 20 20 20 20 20 20 7b 5b 69 6e 66 6f 20 61          {[info a
a0d0: 72 67 73 20 63 68 61 6e 67 65 4e 61 74 69 76 65  rgs changeNative
a0e0: 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 5d 7d 20  RuntimeOption]} 
a0f0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  \..            {
a100: 5b 69 6e 66 6f 20 62 6f 64 79 20 63 68 61 6e 67  [info body chang
a110: 65 4e 61 74 69 76 65 52 75 6e 74 69 6d 65 4f 70  eNativeRuntimeOp
a120: 74 69 6f 6e 5d 7d 0d 0a 0d 0a 20 20 20 20 20 20  tion]}....      
a130: 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20    catch {..     
a140: 20 20 20 20 20 63 68 61 6e 67 65 4e 61 74 69 76       changeNativ
a150: 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 5b  eRuntimeOption [
a160: 68 61 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  hasRuntimeOption
a170: 20 6e 61 74 69 76 65 5d 0d 0a 20 20 20 20 20 20   native]..      
a180: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 5b 67 65    }..      } [ge
a190: 74 54 65 73 74 4f 76 65 72 72 69 64 65 73 50 72  tTestOverridesPr
a1a0: 65 61 6d 62 6c 65 20 5b 6c 69 73 74 20 70 61 74  eamble [list pat
a1b0: 68 20 74 65 73 74 5f 63 68 61 6e 6e 65 6c 5d 5d  h test_channel]]
a1c0: 20 24 73 75 66 66 69 78 5d 5d 5d 0d 0a 20 20 20   $suffix]]]..   
a1d0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
a1e0: 74 72 79 43 6f 70 79 45 78 74 65 72 6e 61 6c 46  tryCopyExternalF
a1f0: 69 6c 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  ile {..         
a200: 20 20 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61     fileName {pla
a210: 74 66 6f 72 6d 20 22 22 7d 20 7b 6e 65 77 46 69  tform ""} {newFi
a220: 6c 65 4e 61 6d 65 20 22 22 7d 20 7b 76 65 72 62  leName ""} {verb
a230: 6f 73 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  ose false} } {..
a240: 20 20 20 20 20 20 73 65 74 20 73 6f 75 72 63 65        set source
a250: 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 45 78 74  FileName [getExt
a260: 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 20 24 66  ernalFileName $f
a270: 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20  ileName]....    
a280: 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69    if {![file exi
a290: 73 74 73 20 24 73 6f 75 72 63 65 46 69 6c 65 4e  sts $sourceFileN
a2a0: 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
a2b0: 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f        if {$verbo
a2c0: 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  se} then {..    
a2d0: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
a2e0: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
a2f0: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
a300: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
a310: 6b 69 70 70 65 64 20 63 6f 70 79 69 6e 67 20 65  kipped copying e
a320: 78 74 65 72 6e 61 6c 20 66 69 6c 65 20 5c 22 22  xternal file \""
a330: 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65   $sourceFileName
a340: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
a350: 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e    "\", it does n
a360: 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20  ot exist\n"]..  
a370: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
a380: 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d   return..      }
a390: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73  ....      if {[s
a3a0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e 65  tring length $ne
a3b0: 77 46 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20  wFileName] > 0} 
a3c0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
a3d0: 73 65 74 20 74 61 72 67 65 74 46 69 6c 65 4e 61  set targetFileNa
a3e0: 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c  me [getBinaryFil
a3f0: 65 4e 61 6d 65 20 24 6e 65 77 46 69 6c 65 4e 61  eName $newFileNa
a400: 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20  me $platform].. 
a410: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
a420: 20 20 20 20 20 20 20 73 65 74 20 74 61 72 67 65         set targe
a430: 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69  tFileName [getBi
a440: 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69  naryFileName $fi
a450: 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d  leName $platform
a460: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ]..      }....  
a470: 20 20 20 20 73 65 74 20 74 61 72 67 65 74 44 69      set targetDi
a480: 72 65 63 74 6f 72 79 20 5b 66 69 6c 65 20 64 69  rectory [file di
a490: 72 6e 61 6d 65 20 24 74 61 72 67 65 74 46 69 6c  rname $targetFil
a4a0: 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  eName]....      
a4b0: 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
a4c0: 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65        if {![file
a4d0: 20 65 78 69 73 74 73 20 24 74 61 72 67 65 74 44   exists $targetD
a4e0: 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20  irectory]} then 
a4f0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66 69 6c  {..          fil
a500: 65 20 6d 6b 64 69 72 20 24 74 61 72 67 65 74 44  e mkdir $targetD
a510: 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20  irectory..      
a520: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 66 69 6c    }..        fil
a530: 65 20 63 6f 70 79 20 2d 66 6f 72 63 65 20 24 73  e copy -force $s
a540: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 24 74  ourceFileName $t
a550: 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 0d 0a 20  argetFileName.. 
a560: 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68       }] == 0} th
a570: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  en {..        tp
a580: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
a590: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
a5a0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
a5b0: 2d 2d 2d 2d 20 63 6f 70 69 65 64 20 65 78 74 65  ---- copied exte
a5c0: 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 5c  rnal file from \
a5d0: 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61  "" $sourceFileNa
a5e0: 6d 65 20 22 5c 22 20 74 6f 20 5c 22 22 20 5c 0d  me "\" to \"" \.
a5f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 74 61  .            $ta
a600: 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c  rgetFileName \"\
a610: 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  n]..      } else
a620: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
a630: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
a640: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
a650: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
a660: 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20 63 6f 70  -- failed to cop
a670: 79 20 65 78 74 65 72 6e 61 6c 20 66 69 6c 65 20  y external file 
a680: 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63 65  from \"" $source
a690: 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20  FileName \..    
a6a0: 20 20 20 20 20 20 20 20 22 5c 22 20 74 6f 20 5c          "\" to \
a6b0: 22 22 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61  "" $targetFileNa
a6c0: 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  me \"\n]..      
a6d0: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
a6e0: 20 70 72 6f 63 20 74 72 79 43 6f 70 79 42 69 6e   proc tryCopyBin
a6f0: 61 72 79 46 69 6c 65 20 7b 0d 0a 20 20 20 20 20  aryFile {..     
a700: 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65 20         fileName 
a710: 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 6e  {platform ""} {n
a720: 65 77 46 69 6c 65 4e 61 6d 65 20 22 22 7d 20 7b  ewFileName ""} {
a730: 76 65 72 62 6f 73 65 20 66 61 6c 73 65 7d 20 7d  verbose false} }
a740: 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 73 6f   {..      set so
a750: 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5b 67 65  urceFileName [ge
a760: 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
a770: 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66  $fileName $platf
a780: 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  orm]....      if
a790: 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20   {![file exists 
a7a0: 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 5d  $sourceFileName]
a7b0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
a7c0: 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20    if {$verbose} 
a7d0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
a7e0: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
a7f0: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
a800: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
a810: 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70       "---- skipp
a820: 65 64 20 63 6f 70 79 69 6e 67 20 62 69 6e 61 72  ed copying binar
a830: 79 20 66 69 6c 65 20 5c 22 22 20 24 73 6f 75 72  y file \"" $sour
a840: 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20  ceFileName \..  
a850: 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c              "\",
a860: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
a870: 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  st\n"]..        
a880: 7d 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  }..        retur
a890: 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  n..      }....  
a8a0: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
a8b0: 6c 65 6e 67 74 68 20 24 6e 65 77 46 69 6c 65 4e  length $newFileN
a8c0: 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ame] > 0} then {
a8d0: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 61  ..        set ta
a8e0: 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65  rgetFileName [ge
a8f0: 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 24  tBuildFileName $
a900: 6e 65 77 46 69 6c 65 4e 61 6d 65 20 24 70 6c 61  newFileName $pla
a910: 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 7d 20  tform]..      } 
a920: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
a930: 73 65 74 20 74 61 72 67 65 74 46 69 6c 65 4e 61  set targetFileNa
a940: 6d 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65  me [getBuildFile
a950: 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24  Name $fileName $
a960: 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20  platform]..     
a970: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20   }....      set 
a980: 74 61 72 67 65 74 44 69 72 65 63 74 6f 72 79 20  targetDirectory 
a990: 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 74  [file dirname $t
a9a0: 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 5d 0d 0a  argetFileName]..
a9b0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74  ..      if {[cat
a9c0: 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  ch {..        if
a9d0: 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20   {![file exists 
a9e0: 24 74 61 72 67 65 74 44 69 72 65 63 74 6f 72 79  $targetDirectory
a9f0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
aa00: 20 20 20 20 20 66 69 6c 65 20 6d 6b 64 69 72 20       file mkdir 
aa10: 24 74 61 72 67 65 74 44 69 72 65 63 74 6f 72 79  $targetDirectory
aa20: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
aa30: 20 20 20 20 20 66 69 6c 65 20 63 6f 70 79 20 2d       file copy -
aa40: 66 6f 72 63 65 20 24 73 6f 75 72 63 65 46 69 6c  force $sourceFil
aa50: 65 4e 61 6d 65 20 24 74 61 72 67 65 74 46 69 6c  eName $targetFil
aa60: 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 5d 20  eName..      }] 
aa70: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
aa80: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
aa90: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
aaa0: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
aab0: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70         "---- cop
aac0: 69 65 64 20 62 69 6e 61 72 79 20 66 69 6c 65 20  ied binary file 
aad0: 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63 65  from \"" $source
aae0: 46 69 6c 65 4e 61 6d 65 20 22 5c 22 20 74 6f 20  FileName "\" to 
aaf0: 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
ab00: 20 20 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61     $targetFileNa
ab10: 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  me \"\n]..      
ab20: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
ab30: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
ab40: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
ab50: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
ab60: 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20     "---- failed 
ab70: 74 6f 20 63 6f 70 79 20 62 69 6e 61 72 79 20 66  to copy binary f
ab80: 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f  ile from \"" $so
ab90: 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a  urceFileName \..
aba0: 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20              "\" 
abb0: 74 6f 20 5c 22 22 20 24 74 61 72 67 65 74 46 69  to \"" $targetFi
abc0: 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20  leName \"\n]..  
abd0: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
abe0: 0a 20 20 20 20 70 72 6f 63 20 74 72 79 43 6f 70  .    proc tryCop
abf0: 79 42 75 69 6c 64 46 69 6c 65 20 7b 0d 0a 20 20  yBuildFile {..  
ac00: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61            fileNa
ac10: 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d  me {platform ""}
ac20: 20 7b 6e 65 77 46 69 6c 65 4e 61 6d 65 20 22 22   {newFileName ""
ac30: 7d 20 7b 76 65 72 62 6f 73 65 20 66 61 6c 73 65  } {verbose false
ac40: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  } } {..      set
ac50: 20 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20   sourceFileName 
ac60: 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d  [getBuildFileNam
ac70: 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61  e $fileName $pla
ac80: 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20  tform]....      
ac90: 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74  if {![file exist
aca0: 73 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  s $sourceFileNam
acb0: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
acc0: 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65      if {$verbose
acd0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
ace0: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
acf0: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
ad00: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
ad10: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69         "---- ski
ad20: 70 70 65 64 20 63 6f 70 79 69 6e 67 20 62 75 69  pped copying bui
ad30: 6c 64 20 66 69 6c 65 20 5c 22 22 20 24 73 6f 75  ld file \"" $sou
ad40: 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  rceFileName \.. 
ad50: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22               "\"
ad60: 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78  , it does not ex
ad70: 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  ist\n"]..       
ad80: 20 7d 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   }..        retu
ad90: 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  rn..      }.... 
ada0: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
adb0: 20 6c 65 6e 67 74 68 20 24 6e 65 77 46 69 6c 65   length $newFile
adc0: 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  Name] > 0} then 
add0: 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74  {..        set t
ade0: 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67  argetFileName [g
adf0: 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  etBinaryFileName
ae00: 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65 20 24 70   $newFileName $p
ae10: 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20 20  latform]..      
ae20: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
ae30: 20 20 73 65 74 20 74 61 72 67 65 74 46 69 6c 65    set targetFile
ae40: 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46  Name [getBinaryF
ae50: 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d  ileName $fileNam
ae60: 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20  e $platform]..  
ae70: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73      }....      s
ae80: 65 74 20 74 61 72 67 65 74 44 69 72 65 63 74 6f  et targetDirecto
ae90: 72 79 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65  ry [file dirname
aea0: 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65   $targetFileName
aeb0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  ]....      if {[
aec0: 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
aed0: 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73   if {![file exis
aee0: 74 73 20 24 74 61 72 67 65 74 44 69 72 65 63 74  ts $targetDirect
aef0: 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ory]} then {..  
af00: 20 20 20 20 20 20 20 20 66 69 6c 65 20 6d 6b 64          file mkd
af10: 69 72 20 24 74 61 72 67 65 74 44 69 72 65 63 74  ir $targetDirect
af20: 6f 72 79 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ory..        }..
af30: 20 20 20 20 20 20 20 20 66 69 6c 65 20 63 6f 70          file cop
af40: 79 20 2d 66 6f 72 63 65 20 24 73 6f 75 72 63 65  y -force $source
af50: 46 69 6c 65 4e 61 6d 65 20 24 74 61 72 67 65 74  FileName $target
af60: 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20  FileName..      
af70: 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  }] == 0} then {.
af80: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
af90: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
afa0: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
afb0: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
afc0: 63 6f 70 69 65 64 20 62 75 69 6c 64 20 66 69 6c  copied build fil
afd0: 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72  e from \"" $sour
afe0: 63 65 46 69 6c 65 4e 61 6d 65 20 22 5c 22 20 74  ceFileName "\" t
aff0: 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  o \"" \..       
b000: 20 20 20 20 20 24 74 61 72 67 65 74 46 69 6c 65       $targetFile
b010: 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20  Name \"\n]..    
b020: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
b030: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
b040: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
b050: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
b060: 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65       "---- faile
b070: 64 20 74 6f 20 63 6f 70 79 20 62 75 69 6c 64 20  d to copy build 
b080: 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73  file from \"" $s
b090: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d  ourceFileName \.
b0a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22  .            "\"
b0b0: 20 74 6f 20 5c 22 22 20 24 74 61 72 67 65 74 46   to \"" $targetF
b0c0: 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20  ileName \"\n].. 
b0d0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
b0e0: 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79 44 65  ..    proc tryDe
b0f0: 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20 7b  leteBinaryFile {
b100: 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66   fileName {platf
b110: 6f 72 6d 20 22 22 7d 20 7b 76 65 72 62 6f 73 65  orm ""} {verbose
b120: 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20   false} } {..   
b130: 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20     set fileName 
b140: 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61  [getBinaryFileNa
b150: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c  me $fileName $pl
b160: 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20  atform]....     
b170: 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73   if {![file exis
b180: 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74  ts $fileName]} t
b190: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
b1a0: 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65  f {$verbose} the
b1b0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
b1c0: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
b1d0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
b1e0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
b1f0: 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20    "---- skipped 
b200: 64 65 6c 65 74 69 6e 67 20 62 69 6e 61 72 79 20  deleting binary 
b210: 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61  file \"" $fileNa
b220: 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
b230: 20 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73      "\", it does
b240: 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a   not exist\n"]..
b250: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
b260: 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20     return..     
b270: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   }....      if {
b280: 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c  [catch {file del
b290: 65 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d 5d 20  ete $fileName}] 
b2a0: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
b2b0: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
b2c0: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
b2d0: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
b2e0: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 64 65 6c         "---- del
b2f0: 65 74 65 64 20 62 69 6e 61 72 79 20 66 69 6c 65  eted binary file
b300: 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c   \"" $fileName \
b310: 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  "\n]..      } el
b320: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  se {..        tp
b330: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
b340: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
b350: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
b360: 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20 64  ---- failed to d
b370: 65 6c 65 74 65 20 62 69 6e 61 72 79 20 66 69 6c  elete binary fil
b380: 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20  e \"" $fileName 
b390: 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  \"\n]..      }..
b3a0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
b3b0: 6f 63 20 74 72 79 44 65 6c 65 74 65 42 75 69 6c  oc tryDeleteBuil
b3c0: 64 46 69 6c 65 20 7b 20 66 69 6c 65 4e 61 6d 65  dFile { fileName
b3d0: 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b   {platform ""} {
b3e0: 76 65 72 62 6f 73 65 20 66 61 6c 73 65 7d 20 7d  verbose false} }
b3f0: 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69   {..      set fi
b400: 6c 65 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c 64  leName [getBuild
b410: 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61  FileName $fileNa
b420: 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d  me $platform]...
b430: 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c  .      if {![fil
b440: 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61  e exists $fileNa
b450: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
b460: 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73       if {$verbos
b470: 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
b480: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
b490: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
b4a0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
b4b0: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b          "---- sk
b4c0: 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20 62  ipped deleting b
b4d0: 75 69 6c 64 20 66 69 6c 65 20 5c 22 22 20 24 66  uild file \"" $f
b4e0: 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20  ileName \..     
b4f0: 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69 74           "\", it
b500: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c   does not exist\
b510: 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  n"]..        }..
b520: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a          return..
b530: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
b540: 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 66 69 6c   if {[catch {fil
b550: 65 20 64 65 6c 65 74 65 20 24 66 69 6c 65 4e 61  e delete $fileNa
b560: 6d 65 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  me}] == 0} then 
b570: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
b580: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
b590: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
b5a0: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
b5b0: 2d 20 64 65 6c 65 74 65 64 20 62 75 69 6c 64 20  - deleted build 
b5c0: 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61  file \"" $fileNa
b5d0: 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  me \"\n]..      
b5e0: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
b5f0: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
b600: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
b610: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
b620: 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20     "---- failed 
b630: 74 6f 20 64 65 6c 65 74 65 20 62 75 69 6c 64 20  to delete build 
b640: 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61  file \"" $fileNa
b650: 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  me \"\n]..      
b660: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
b670: 20 70 72 6f 63 20 74 72 79 43 6f 70 79 41 73 73   proc tryCopyAss
b680: 65 6d 62 6c 79 20 7b 0d 0a 20 20 20 20 20 20 20  embly {..       
b690: 20 20 20 20 20 66 69 6c 65 4e 61 6d 65 20 7b 70       fileName {p
b6a0: 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 70 64 62  latform ""} {pdb
b6b0: 20 74 72 75 65 7d 20 7b 76 65 72 62 6f 73 65 20   true} {verbose 
b6c0: 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20  false} } {..    
b6d0: 20 20 74 72 79 43 6f 70 79 42 75 69 6c 64 46 69    tryCopyBuildFi
b6e0: 6c 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c  le $fileName $pl
b6f0: 61 74 66 6f 72 6d 20 22 22 20 24 76 65 72 62 6f  atform "" $verbo
b700: 73 65 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  se....      if {
b710: 24 70 64 62 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  $pdb} then {..  
b720: 20 20 20 20 20 20 74 72 79 43 6f 70 79 42 75 69        tryCopyBui
b730: 6c 64 46 69 6c 65 20 5b 61 70 70 65 6e 64 41 72  ldFile [appendAr
b740: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
b750: 20 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65    [file rootname
b760: 20 24 66 69 6c 65 4e 61 6d 65 5d 20 2e 70 64 62   $fileName] .pdb
b770: 5d 20 24 70 6c 61 74 66 6f 72 6d 20 22 22 20 24  ] $platform "" $
b780: 76 65 72 62 6f 73 65 0d 0a 20 20 20 20 20 20 7d  verbose..      }
b790: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
b7a0: 70 72 6f 63 20 74 72 79 44 65 6c 65 74 65 41 73  proc tryDeleteAs
b7b0: 73 65 6d 62 6c 79 20 7b 0d 0a 20 20 20 20 20 20  sembly {..      
b7c0: 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65 20 7b        fileName {
b7d0: 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 70 64  platform ""} {pd
b7e0: 62 20 74 72 75 65 7d 20 7b 76 65 72 62 6f 73 65  b true} {verbose
b7f0: 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20   false} } {..   
b800: 20 20 20 74 72 79 44 65 6c 65 74 65 42 69 6e 61     tryDeleteBina
b810: 72 79 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65  ryFile $fileName
b820: 20 24 70 6c 61 74 66 6f 72 6d 20 24 76 65 72 62   $platform $verb
b830: 6f 73 65 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  ose....      if 
b840: 7b 24 70 64 62 7d 20 74 68 65 6e 20 7b 0d 0a 20  {$pdb} then {.. 
b850: 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65         tryDelete
b860: 42 69 6e 61 72 79 46 69 6c 65 20 5b 61 70 70 65  BinaryFile [appe
b870: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
b880: 20 20 20 20 20 20 5b 66 69 6c 65 20 72 6f 6f 74        [file root
b890: 6e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 20  name $fileName] 
b8a0: 2e 70 64 62 5d 20 24 70 6c 61 74 66 6f 72 6d 20  .pdb] $platform 
b8b0: 24 76 65 72 62 6f 73 65 0d 0a 20 20 20 20 20 20  $verbose..      
b8c0: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
b8d0: 20 70 72 6f 63 20 74 72 79 4c 6f 61 64 41 73 73   proc tryLoadAss
b8e0: 65 6d 62 6c 79 20 7b 20 66 69 6c 65 4e 61 6d 65  embly { fileName
b8f0: 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7d   {platform ""} }
b900: 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69   {..      set fi
b910: 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72  leName [getBinar
b920: 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e  yFileName $fileN
b930: 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a  ame $platform]..
b940: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74  ..      if {[cat
b950: 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  ch {..        se
b960: 74 20 61 73 73 65 6d 62 6c 79 20 5b 6f 62 6a 65  t assembly [obje
b970: 63 74 20 6c 6f 61 64 20 2d 6c 6f 61 64 74 79 70  ct load -loadtyp
b980: 65 20 46 69 6c 65 20 2d 61 6c 69 61 73 20 24 66  e File -alias $f
b990: 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20  ileName]..      
b9a0: 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  }] == 0} then {.
b9b0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
b9c0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 2c      # NOTE: Now,
b9d0: 20 61 64 64 20 74 68 65 20 6e 65 63 65 73 73 61   add the necessa
b9e0: 72 79 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69  ry test constrai
b9f0: 6e 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  nt...        #..
ba00: 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
ba10: 72 61 69 6e 74 20 5b 66 69 6c 65 20 72 6f 6f 74  raint [file root
ba20: 6e 61 6d 65 20 5b 66 69 6c 65 20 74 61 69 6c 20  name [file tail 
ba30: 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 0d 0a 20  $fileName]].... 
ba40: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
ba50: 20 20 23 20 4e 4f 54 45 3a 20 47 72 61 62 20 74    # NOTE: Grab t
ba60: 68 65 20 69 6d 61 67 65 20 72 75 6e 74 69 6d 65  he image runtime
ba70: 20 76 65 72 73 69 6f 6e 20 66 72 6f 6d 20 74 68   version from th
ba80: 65 20 61 73 73 65 6d 62 6c 79 20 62 65 63 61 75  e assembly becau
ba90: 73 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  se..        #   
baa0: 20 20 20 20 73 65 76 65 72 61 6c 20 74 65 73 74      several test
bab0: 73 20 72 65 6c 79 20 6f 6e 20 69 74 20 68 61 76  s rely on it hav
bac0: 69 6e 67 20 61 20 63 65 72 74 61 69 6e 20 76 61  ing a certain va
bad0: 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  lue...        #.
bae0: 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73  .        addCons
baf0: 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
bb00: 67 73 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66  gs [file tail $f
bb10: 69 6c 65 4e 61 6d 65 5d 20 5f 20 5c 0d 0a 20 20  ileName] _ \..  
bb20: 20 20 20 20 20 20 20 20 20 20 5b 24 61 73 73 65            [$asse
bb30: 6d 62 6c 79 20 49 6d 61 67 65 52 75 6e 74 69 6d  mbly ImageRuntim
bb40: 65 56 65 72 73 69 6f 6e 5d 5d 0d 0a 0d 0a 20 20  eVersion]]....  
bb50: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
bb60: 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20   # NOTE: Return 
bb70: 74 68 65 20 66 75 6c 6c 20 70 61 74 68 20 6f 66  the full path of
bb80: 20 74 68 65 20 6c 6f 61 64 65 64 20 66 69 6c 65   the loaded file
bb90: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
bba0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 66 69        return $fi
bbb0: 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 0d  leName..      }.
bbc0: 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
bbd0: 22 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  ""..    }.....  
bbe0: 20 20 70 72 6f 63 20 69 73 53 51 4c 69 74 65 52    proc isSQLiteR
bbf0: 65 61 64 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  eady {} {..     
bc00: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
bc10: 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  : This procedure
bc20: 20 6d 75 73 74 20 72 65 74 75 72 6e 20 6e 6f 6e   must return non
bc30: 2d 7a 65 72 6f 20 6f 6e 6c 79 20 69 66 20 74 68  -zero only if th
bc40: 65 20 53 51 4c 69 74 65 20 6e 61 74 69 76 65 0d  e SQLite native.
bc50: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6c  .      #       l
bc60: 69 62 72 61 72 79 20 61 6e 64 20 74 68 65 20 53  ibrary and the S
bc70: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
bc80: 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62  e managed assemb
bc90: 6c 79 20 61 72 65 20 6c 6f 61 64 65 64 0d 0a 20  ly are loaded.. 
bca0: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6e 64       #       and
bcb0: 20 72 65 61 64 79 20 66 6f 72 20 75 73 65 20 62   ready for use b
bcc0: 79 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  y the test suite
bcd0: 2e 20 20 43 75 72 72 65 6e 74 6c 79 2c 20 74 68  .  Currently, th
bce0: 69 73 20 70 72 6f 63 65 64 75 72 65 0d 0a 20 20  is procedure..  
bcf0: 20 20 20 20 23 20 20 20 20 20 20 20 73 68 6f 75      #       shou
bd00: 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 6c  ld be called onl
bd10: 79 20 61 66 74 65 72 20 74 68 65 20 5b 74 72 79  y after the [try
bd20: 4c 6f 61 64 41 73 73 65 6d 62 6c 79 5d 20 70 72  LoadAssembly] pr
bd30: 6f 63 65 64 75 72 65 20 68 61 73 0d 0a 20 20 20  ocedure has..   
bd40: 20 20 20 23 20 20 20 20 20 20 20 62 65 65 6e 20     #       been 
bd50: 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 62 65 20  called to probe 
bd60: 66 6f 72 20 74 68 65 20 53 79 73 74 65 6d 2e 44  for the System.D
bd70: 61 74 61 2e 53 51 4c 69 74 65 20 6d 61 6e 61 67  ata.SQLite manag
bd80: 65 64 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20  ed assembly..   
bd90: 20 20 20 23 20 20 20 20 20 20 20 61 6e 64 20 74     #       and t
bda0: 68 65 20 5b 63 68 65 63 6b 46 6f 72 53 51 4c 69  he [checkForSQLi
bdb0: 74 65 5d 20 70 72 6f 63 65 64 75 72 65 20 68 61  te] procedure ha
bdc0: 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f  s been called to
bdd0: 20 70 72 6f 62 65 20 66 6f 72 0d 0a 20 20 20 20   probe for..    
bde0: 20 20 23 20 20 20 20 20 20 20 74 68 65 20 53 51    #       the SQ
bdf0: 4c 69 74 65 20 6e 61 74 69 76 65 20 6c 69 62 72  Lite native libr
be00: 61 72 79 3b 20 6f 74 68 65 72 77 69 73 65 2c 20  ary; otherwise, 
be10: 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 77  this procedure w
be20: 69 6c 6c 20 73 69 6d 70 6c 79 0d 0a 20 20 20 20  ill simply..    
be30: 20 20 23 20 20 20 20 20 20 20 61 6c 77 61 79 73    #       always
be40: 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e 0d 0a 20   return zero... 
be50: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
be60: 74 75 72 6e 20 5b 65 78 70 72 20 7b 0d 0a 20 20  turn [expr {..  
be70: 20 20 20 20 20 20 5b 68 61 76 65 43 6f 6e 73 74        [haveConst
be80: 72 61 69 6e 74 20 53 79 73 74 65 6d 2e 44 61 74  raint System.Dat
be90: 61 2e 53 51 4c 69 74 65 5d 20 26 26 20 5b 68 61  a.SQLite] && [ha
bea0: 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 53 51 4c  veConstraint SQL
beb0: 69 74 65 5d 0d 0a 20 20 20 20 20 20 7d 5d 0d 0a  ite]..      }]..
bec0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
bed0: 6f 63 20 6d 61 74 63 68 50 6c 61 74 66 6f 72 6d  oc matchPlatform
bee0: 20 7b 20 70 6c 61 74 66 6f 72 6d 20 7d 20 7b 0d   { platform } {.
bef0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
bf00: 23 20 4e 4f 54 45 3a 20 41 6e 20 65 6d 70 74 79  # NOTE: An empty
bf10: 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65 20   string for the 
bf20: 70 6c 61 74 66 6f 72 6d 20 6d 65 61 6e 73 20 74  platform means t
bf30: 68 61 74 20 74 68 65 20 62 75 69 6c 64 20 69 73  hat the build is
bf40: 20 6e 6f 74 0d 0a 20 20 20 20 20 20 23 20 20 20   not..      #   
bf50: 20 20 20 20 5b 70 72 69 6d 61 72 69 6c 79 5d 20      [primarily] 
bf60: 61 20 6e 61 74 69 76 65 20 62 75 69 6c 64 3b 20  a native build; 
bf70: 74 68 65 72 65 66 6f 72 65 2c 20 69 74 20 61 6c  therefore, it al
bf80: 77 61 79 73 20 6d 61 74 63 68 65 73 2e 0d 0a 20  ways matches... 
bf90: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
bfa0: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
bfb0: 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3d 3d 20 30   $platform] == 0
bfc0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
bfd0: 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20    return true.. 
bfe0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
bff0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
c000: 20 44 6f 65 73 20 74 68 65 20 73 70 65 63 69 66   Does the specif
c010: 69 65 64 20 70 6c 61 74 66 6f 72 6d 20 6d 61 74  ied platform mat
c020: 63 68 20 75 70 20 74 6f 20 74 68 65 20 63 75 72  ch up to the cur
c030: 72 65 6e 74 20 70 72 6f 63 65 73 73 3f 0d 0a 20  rent process?.. 
c040: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
c050: 20 7b 24 70 6c 61 74 66 6f 72 6d 20 65 71 20 5b   {$platform eq [
c060: 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72  machineToPlatfor
c070: 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72  m $::tcl_platfor
c080: 6d 28 6d 61 63 68 69 6e 65 29 5d 7d 20 74 68 65  m(machine)]} the
c090: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  n {..        ret
c0a0: 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
c0b0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
c0c0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
c0d0: 73 70 65 63 69 66 69 65 64 20 70 6c 61 74 66 6f  specified platfo
c0e0: 72 6d 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  rm does not matc
c0f0: 68 20 75 70 20 77 69 74 68 20 74 68 65 20 70 6c  h up with the pl
c100: 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 23 20  atform..      # 
c110: 20 20 20 20 20 20 66 6f 72 20 74 68 65 20 63 75        for the cu
c120: 72 72 65 6e 74 20 70 72 6f 63 65 73 73 2e 0d 0a  rrent process...
c130: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72        #..      r
c140: 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20  eturn false..   
c150: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
c160: 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74  haveSQLiteObject
c170: 43 6f 6d 6d 61 6e 64 20 7b 7d 20 7b 0d 0a 20 20  Command {} {..  
c180: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
c190: 4f 54 45 3a 20 49 73 20 74 68 65 20 5b 6f 62 6a  OTE: Is the [obj
c1a0: 65 63 74 5d 20 63 6f 6d 6d 61 6e 64 20 63 75 72  ect] command cur
c1b0: 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65  rently available
c1c0: 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ?..      #..    
c1d0: 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b    return [expr {
c1e0: 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66 6f 20 63  [llength [info c
c1f0: 6f 6d 6d 61 6e 64 73 20 6f 62 6a 65 63 74 5d 5d  ommands object]]
c200: 20 3e 20 30 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c   > 0}]..    }...
c210: 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b  ..    proc check
c220: 46 6f 72 53 51 4c 69 74 65 4f 62 6a 65 63 74 43  ForSQLiteObjectC
c230: 6f 6d 6d 61 6e 64 20 7b 20 63 68 61 6e 6e 65 6c  ommand { channel
c240: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74   } {..      tput
c250: 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
c260: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 5c 22   checking for \"
c270: 6f 62 6a 65 63 74 5c 22 20 63 6f 6d 6d 61 6e 64  object\" command
c280: 20 75 73 61 67 65 2e 2e 2e 20 22 0d 0a 0d 0a 20   usage... ".... 
c290: 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
c2a0: 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69  exists ::no(sqli
c2b0: 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 29  teObjectCommand)
c2c0: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
c2d0: 20 20 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a    [haveSQLiteObj
c2e0: 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65  ectCommand]} the
c2f0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  n {..        tpu
c300: 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c  ts $channel yes\
c310: 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  n..      } else 
c320: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
c330: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 6e        # NOTE: Un
c340: 6c 65 73 73 20 77 65 20 61 72 65 20 66 6f 72 62  less we are forb
c350: 69 64 64 65 6e 20 66 72 6f 6d 20 64 6f 69 6e 67  idden from doing
c360: 20 73 6f 2c 20 61 64 64 20 73 6f 6d 65 20 63 6f   so, add some co
c370: 6e 73 74 72 61 69 6e 74 73 0d 0a 20 20 20 20 20  nstraints..     
c380: 20 20 20 23 20 20 20 20 20 20 20 74 68 61 74 20     #       that 
c390: 77 69 6c 6c 20 61 6c 6c 6f 77 20 6d 6f 73 74 20  will allow most 
c3a0: 6f 66 20 74 68 65 20 74 65 73 74 20 73 75 69 74  of the test suit
c3b0: 65 20 74 6f 20 72 75 6e 20 28 69 2e 65 2e 20 74  e to run (i.e. t
c3c0: 68 6f 73 65 0d 0a 20 20 20 20 20 20 20 20 23 20  hose..        # 
c3d0: 20 20 20 20 20 20 74 65 73 74 73 20 74 68 61 74        tests that
c3e0: 20 64 6f 20 6e 6f 74 20 64 69 72 65 63 74 6c 79   do not directly
c3f0: 20 72 65 6c 79 20 75 70 6f 6e 20 74 68 65 20 5b   rely upon the [
c400: 6f 62 6a 65 63 74 5d 20 63 6f 6d 6d 61 6e 64 29  object] command)
c410: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
c420: 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
c430: 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 68 69   exists ::no(shi
c440: 6d 53 51 4c 69 74 65 41 73 73 65 6d 62 6c 79 43  mSQLiteAssemblyC
c450: 6f 6e 73 74 72 61 69 6e 74 73 29 5d 7d 20 74 68  onstraints)]} th
c460: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
c470: 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 53 51  addConstraint SQ
c480: 4c 69 74 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Lite..          
c490: 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 53 51  addConstraint SQ
c4a0: 4c 69 74 65 49 6e 74 65 72 6f 70 0d 0a 20 20 20  LiteInterop..   
c4b0: 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
c4c0: 61 69 6e 74 20 53 79 73 74 65 6d 2e 44 61 74 61  aint System.Data
c4d0: 2e 53 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 20  .SQLite..       
c4e0: 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
c4f0: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
c500: 69 74 65 2e 45 6e 63 72 79 70 74 69 6f 6e 0d 0a  ite.Encryption..
c510: 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
c520: 73 74 72 61 69 6e 74 20 53 79 73 74 65 6d 2e 44  straint System.D
c530: 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 0d  ata.SQLite.Linq.
c540: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  ...          add
c550: 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
c560: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
c570: 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
c580: 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5f 76  ata.SQLite.dll_v
c590: 20 5b 67 65 74 42 75 69 6c 64 43 6c 72 56 65 72   [getBuildClrVer
c5a0: 73 69 6f 6e 5d 5d 0d 0a 20 20 20 20 20 20 20 20  sion]]..        
c5b0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
c5c0: 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
c5d0: 3a 6e 6f 28 73 68 69 6d 53 51 4c 69 74 65 44 65  :no(shimSQLiteDe
c5e0: 66 69 6e 65 43 6f 6e 73 74 61 6e 74 43 6f 6e 73  fineConstantCons
c5f0: 74 72 61 69 6e 74 73 29 5d 7d 20 74 68 65 6e 20  traints)]} then 
c600: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  {..          for
c610: 65 61 63 68 20 64 65 66 69 6e 65 43 6f 6e 73 74  each defineConst
c620: 61 6e 74 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20  ant [list \..   
c630: 20 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52             INTER
c640: 4f 50 5f 45 58 54 45 4e 53 49 4f 4e 5f 46 55 4e  OP_EXTENSION_FUN
c650: 43 54 49 4f 4e 53 20 49 4e 54 45 52 4f 50 5f 46  CTIONS INTEROP_F
c660: 54 53 35 5f 45 58 54 45 4e 53 49 4f 4e 20 5c 0d  TS5_EXTENSION \.
c670: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49  .              I
c680: 4e 54 45 52 4f 50 5f 4a 53 4f 4e 31 5f 45 58 54  NTEROP_JSON1_EXT
c690: 45 4e 53 49 4f 4e 20 49 4e 54 45 52 4f 50 5f 50  ENSION INTEROP_P
c6a0: 45 52 43 45 4e 54 49 4c 45 5f 45 58 54 45 4e 53  ERCENTILE_EXTENS
c6b0: 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ION \..         
c6c0: 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 52 45 47       INTEROP_REG
c6d0: 45 58 50 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e  EXP_EXTENSION IN
c6e0: 54 45 52 4f 50 5f 54 45 53 54 5f 45 58 54 45 4e  TEROP_TEST_EXTEN
c6f0: 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20  SION \..        
c700: 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 54 4f        INTEROP_TO
c710: 54 59 50 45 5f 45 58 54 45 4e 53 49 4f 4e 20 49  TYPE_EXTENSION I
c720: 4e 54 45 52 4f 50 5f 56 49 52 54 55 41 4c 5f 54  NTEROP_VIRTUAL_T
c730: 41 42 4c 45 20 5c 0d 0a 20 20 20 20 20 20 20 20  ABLE \..        
c740: 20 20 20 20 20 20 55 53 45 5f 49 4e 54 45 52 4f        USE_INTERO
c750: 50 5f 44 4c 4c 5d 20 7b 0d 0a 20 20 20 20 20 20  P_DLL] {..      
c760: 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
c770: 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
c780: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
c790: 20 20 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e     defineConstan
c7a0: 74 2e 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  t.System.Data.SQ
c7b0: 4c 69 74 65 2e 20 24 64 65 66 69 6e 65 43 6f 6e  Lite. $defineCon
c7c0: 73 74 61 6e 74 5d 0d 0a 20 20 20 20 20 20 20 20  stant]..        
c7d0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
c7e0: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
c7f0: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
c800: 28 73 68 69 6d 53 51 4c 69 74 65 56 69 73 75 61  (shimSQLiteVisua
c810: 6c 53 74 75 64 69 6f 43 6f 6e 73 74 72 61 69 6e  lStudioConstrain
c820: 74 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ts)]} then {..  
c830: 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
c840: 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
c850: 73 20 76 69 73 75 61 6c 53 74 75 64 69 6f 20 5b  s visualStudio [
c860: 67 65 74 42 75 69 6c 64 59 65 61 72 5d 5d 0d 0a  getBuildYear]]..
c870: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
c880: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
c890: 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20  nel no\n..      
c8a0: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
c8b0: 20 70 72 6f 63 20 63 68 61 6e 67 65 4e 61 74 69   proc changeNati
c8c0: 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20  veRuntimeOption 
c8d0: 7b 20 6e 61 74 69 76 65 20 7d 20 7b 0d 0a 20 20  { native } {..  
c8e0: 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68      if {[llength
c8f0: 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73 20   [info commands 
c900: 64 65 62 75 67 5d 5d 20 3e 20 30 20 26 26 20 5c  debug]] > 0 && \
c910: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 6c 6c 65  ..          [lle
c920: 6e 67 74 68 20 5b 69 6e 66 6f 20 73 75 62 63 6f  ngth [info subco
c930: 6d 6d 61 6e 64 73 20 64 65 62 75 67 20 72 75 6e  mmands debug run
c940: 74 69 6d 65 6f 70 74 69 6f 6e 5d 5d 20 3e 20 30  timeoption]] > 0
c950: 20 26 26 20 5b 63 61 74 63 68 20 7b 0d 0a 20 20   && [catch {..  
c960: 20 20 20 20 20 20 64 65 62 75 67 20 72 75 6e 74        debug runt
c970: 69 6d 65 6f 70 74 69 6f 6e 20 5b 65 78 70 72 20  imeoption [expr 
c980: 7b 24 6e 61 74 69 76 65 20 3f 20 22 61 64 64 22  {$native ? "add"
c990: 20 3a 20 22 72 65 6d 6f 76 65 22 7d 5d 20 6e 61   : "remove"}] na
c9a0: 74 69 76 65 0d 0a 20 20 20 20 20 20 7d 5d 20 3d  tive..      }] =
c9b0: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
c9c0: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
c9d0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
c9e0: 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69     if {[haveSQLi
c9f0: 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d  teObjectCommand]
ca00: 20 26 26 20 5b 63 61 74 63 68 20 7b 0d 0a 20 20   && [catch {..  
ca10: 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
ca20: 6f 6b 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e  oke Interpreter.
ca30: 47 65 74 41 63 74 69 76 65 20 5b 65 78 70 72 20  GetActive [expr 
ca40: 7b 24 6e 61 74 69 76 65 20 3f 20 5c 0d 0a 20 20  {$native ? \..  
ca50: 20 20 20 20 20 20 20 20 20 20 22 41 64 64 52 75            "AddRu
ca60: 6e 74 69 6d 65 4f 70 74 69 6f 6e 22 20 3a 20 22  ntimeOption" : "
ca70: 52 65 6d 6f 76 65 52 75 6e 74 69 6d 65 4f 70 74  RemoveRuntimeOpt
ca80: 69 6f 6e 22 7d 5d 20 6e 61 74 69 76 65 0d 0a 20  ion"}] native.. 
ca90: 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68       }] == 0} th
caa0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
cab0: 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20  turn true..     
cac0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
cad0: 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d  rn false..    }.
cae0: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65  ....    proc che
caf0: 63 6b 46 6f 72 53 51 4c 69 74 65 42 75 69 6c 64  ckForSQLiteBuild
cb00: 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 73 65 6c  s { channel {sel
cb10: 65 63 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  ect false} } {..
cb20: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
cb30: 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f 72   NOTE: Check for
cb40: 20 65 76 65 72 79 20 70 6f 73 73 69 62 6c 65 20   every possible 
cb50: 76 61 6c 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f  valid combinatio
cb60: 6e 20 6f 66 20 76 61 6c 75 65 73 20 75 73 65 64  n of values used
cb70: 20 77 68 65 6e 0d 0a 20 20 20 20 20 20 23 20 20   when..      #  
cb80: 20 20 20 20 20 6c 6f 63 61 74 69 6e 67 20 6f 75       locating ou
cb90: 74 20 74 68 65 20 62 75 69 6c 64 20 6f 75 74 70  t the build outp
cba0: 75 74 20 64 69 72 65 63 74 6f 72 79 2c 20 73 68  ut directory, sh
cbb0: 6f 77 69 6e 67 20 65 61 63 68 20 61 76 61 69 6c  owing each avail
cbc0: 61 62 6c 65 0d 0a 20 20 20 20 20 20 23 20 20 20  able..      #   
cbd0: 20 20 20 20 62 75 69 6c 64 20 76 61 72 69 61 74      build variat
cbe0: 69 6f 6e 20 61 6c 6f 6e 67 20 74 68 65 20 77 61  ion along the wa
cbf0: 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  y...      #..   
cc00: 20 20 20 66 6f 72 65 61 63 68 20 6e 61 74 69 76     foreach nativ
cc10: 65 20 5b 6c 69 73 74 20 66 61 6c 73 65 20 74 72  e [list false tr
cc20: 75 65 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 66  ue] {..        f
cc30: 6f 72 65 61 63 68 20 79 65 61 72 20 5b 67 65 74  oreach year [get
cc40: 42 75 69 6c 64 59 65 61 72 73 5d 20 7b 0d 0a 20  BuildYears] {.. 
cc50: 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
cc60: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 5b   configuration [
cc70: 67 65 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72  getBuildConfigur
cc80: 61 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20  ations] {..     
cc90: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
cca0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69        # NOTE: Fi
ccb0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 65 66 66  gure out the eff
ccc0: 65 63 74 69 76 65 20 62 75 69 6c 64 20 70 6c 61  ective build pla
ccd0: 74 66 6f 72 6d 2e 20 20 54 68 69 73 20 69 73 0d  tform.  This is.
cce0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20  .            #  
ccf0: 20 20 20 20 20 62 61 73 65 64 20 6f 6e 20 77 68       based on wh
cd00: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 5b  ether or not a [
cd10: 70 72 69 6d 61 72 69 6c 79 5d 20 6e 61 74 69 76  primarily] nativ
cd20: 65 20 62 75 69 6c 64 0d 0a 20 20 20 20 20 20 20  e build..       
cd30: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 73 20       #       is 
cd40: 62 65 69 6e 67 20 75 73 65 64 2e 20 20 46 6f 72  being used.  For
cd50: 20 5b 70 72 69 6d 61 72 69 6c 79 5d 20 6e 6f 6e   [primarily] non
cd60: 2d 6e 61 74 69 76 65 20 62 75 69 6c 64 73 2c 0d  -native builds,.
cd70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20  .            #  
cd80: 20 20 20 20 20 74 68 69 73 20 77 69 6c 6c 20 62       this will b
cd90: 65 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  e an empty strin
cda0: 67 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  g...            
cdb0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  #..            s
cdc0: 65 74 20 70 6c 61 74 66 6f 72 6d 20 5b 67 65 74  et platform [get
cdd0: 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20 24 6e  BuildPlatform $n
cde0: 61 74 69 76 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  ative]....      
cdf0: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
ce00: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
ce10: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
ce20: 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69      "---- checki
ce30: 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61  ng for System.Da
ce40: 74 61 2e 53 51 4c 69 74 65 20 62 75 69 6c 64 20  ta.SQLite build 
ce50: 5c 22 22 20 5b 65 78 70 72 20 5c 0d 0a 20 20 20  \"" [expr \..   
ce60: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 24 6e               {$n
ce70: 61 74 69 76 65 20 3f 20 22 6e 61 74 69 76 65 2f  ative ? "native/
ce80: 22 20 3a 20 22 22 7d 5d 20 5b 65 78 70 72 20 7b  " : ""}] [expr {
ce90: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 5c  [string length \
cea0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
ceb0: 20 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30    $platform] > 0
cec0: 20 3f 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24   ? [appendArgs $
ced0: 70 6c 61 74 66 6f 72 6d 20 2f 5d 20 3a 20 22 22  platform /] : ""
cee0: 7d 5d 20 24 79 65 61 72 20 5c 0d 0a 20 20 20 20  }] $year \..    
cef0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 20 24 63              / $c
cf00: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 22 5c 22  onfiguration "\"
cf10: 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20  ... "]....      
cf20: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
cf30: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69       # NOTE: Bui
cf40: 6c 64 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61  ld the fully qua
cf50: 6c 69 66 69 65 64 20 64 69 72 65 63 74 6f 72 79  lified directory
cf60: 20 77 68 65 72 65 20 74 68 65 20 6e 65 63 65 73   where the neces
cf70: 73 61 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20  sary..          
cf80: 20 20 23 20 20 20 20 20 20 20 63 6f 6d 70 6f 6e    #       compon
cf90: 65 6e 74 73 20 66 6f 72 20 53 79 73 74 65 6d 2e  ents for System.
cfa0: 44 61 74 61 2e 53 51 4c 69 74 65 20 73 68 6f 75  Data.SQLite shou
cfb0: 6c 64 20 62 65 20 66 6f 75 6e 64 2e 0d 0a 20 20  ld be found...  
cfc0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
cfd0: 20 20 20 20 20 20 20 20 20 73 65 74 20 64 69 72           set dir
cfe0: 65 63 74 6f 72 79 20 5b 6a 6f 69 6e 42 75 69 6c  ectory [joinBuil
cff0: 64 44 69 72 65 63 74 6f 72 79 20 24 6e 61 74 69  dDirectory $nati
d000: 76 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ve \..          
d010: 20 20 20 20 20 20 5b 67 65 74 42 75 69 6c 64 42        [getBuildB
d020: 61 73 65 44 69 72 65 63 74 6f 72 79 5d 20 24 79  aseDirectory] $y
d030: 65 61 72 20 24 70 6c 61 74 66 6f 72 6d 20 24 63  ear $platform $c
d040: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 0d  onfiguration]...
d050: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
d060: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
d070: 54 45 3a 20 44 6f 20 74 68 65 20 6e 65 63 65 73  TE: Do the neces
d080: 73 61 72 79 20 66 69 6c 65 73 20 65 78 69 73 74  sary files exist
d090: 3f 20 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f  ?  Currently, no
d0a0: 20 6f 74 68 65 72 20 73 74 65 70 73 0d 0a 20 20   other steps..  
d0b0: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
d0c0: 20 20 61 72 65 20 74 61 6b 65 6e 20 74 6f 20 76    are taken to v
d0d0: 65 72 69 66 79 20 74 68 69 73 20 62 75 69 6c 64  erify this build
d0e0: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 76 69 61   is actually via
d0f0: 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ble...          
d100: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
d110: 20 69 66 20 7b 5b 69 73 42 75 69 6c 64 41 76 61   if {[isBuildAva
d120: 69 6c 61 62 6c 65 20 24 6e 61 74 69 76 65 20 24  ilable $native $
d130: 64 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e  directory]} then
d140: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
d150: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
d160: 20 20 20 23 20 4e 4f 54 45 3a 20 57 68 65 6e 20     # NOTE: When 
d170: 69 6e 20 22 73 65 6c 65 63 74 22 20 6d 6f 64 65  in "select" mode
d180: 2c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  , automatically 
d190: 73 65 6c 65 63 74 20 74 68 65 20 66 69 72 73 74  select the first
d1a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
d1b0: 23 20 20 20 20 20 20 20 61 76 61 69 6c 61 62 6c  #       availabl
d1c0: 65 20 62 75 69 6c 64 20 6f 66 20 53 79 73 74 65  e build of Syste
d1d0: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 61 6e  m.Data.SQLite an
d1e0: 64 20 74 68 65 6e 20 72 65 74 75 72 6e 0d 0a 20  d then return.. 
d1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
d200: 20 20 20 20 20 69 6d 6d 65 64 69 61 74 65 6c 79       immediately
d210: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
d220: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
d230: 20 20 69 66 20 7b 24 73 65 6c 65 63 74 20 26 26    if {$select &&
d240: 20 5b 6d 61 74 63 68 50 6c 61 74 66 6f 72 6d 20   [matchPlatform 
d250: 24 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e  $platform]} then
d260: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
d270: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
d280: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d         # NOTE: M
d290: 61 6e 75 61 6c 6c 79 20 6f 76 65 72 72 69 64 65  anually override
d2a0: 20 61 6c 6c 20 74 68 65 20 62 75 69 6c 64 20 64   all the build d
d2b0: 69 72 65 63 74 6f 72 79 20 73 65 6c 65 63 74 69  irectory selecti
d2c0: 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  on..            
d2d0: 20 20 20 20 23 20 20 20 20 20 20 20 72 65 6c 61      #       rela
d2e0: 74 65 64 20 74 65 73 74 20 73 65 74 74 69 6e 67  ted test setting
d2f0: 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 6f  s in order to fo
d300: 72 63 65 20 74 68 69 73 20 62 75 69 6c 64 0d 0a  rce this build..
d310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d320: 23 20 20 20 20 20 20 20 6f 66 20 53 79 73 74 65  #       of Syste
d330: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 74 6f  m.Data.SQLite to
d340: 20 62 65 20 75 73 65 64 2e 0d 0a 20 20 20 20 20   be used...     
d350: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
d360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
d370: 20 7b 21 5b 63 68 61 6e 67 65 4e 61 74 69 76 65   {![changeNative
d380: 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 24 6e  RuntimeOption $n
d390: 61 74 69 76 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ative]} then {..
d3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3b0: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
d3c0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
d3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3e0: 20 20 20 20 20 20 22 6e 6f 2c 20 66 61 69 6c 65        "no, faile
d3f0: 64 20 74 6f 20 22 20 5b 65 78 70 72 20 7b 24 6e  d to " [expr {$n
d400: 61 74 69 76 65 20 3f 20 22 61 64 64 22 20 3a 20  ative ? "add" : 
d410: 22 72 65 6d 6f 76 65 22 7d 5d 20 5c 0d 0a 20 20  "remove"}] \..  
d420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d430: 20 20 20 20 22 20 74 68 65 20 5c 22 6e 61 74 69      " the \"nati
d440: 76 65 5c 22 20 72 75 6e 74 69 6d 65 20 6f 70 74  ve\" runtime opt
d450: 69 6f 6e 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20  ion\n"]....     
d460: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
d470: 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 20  urn false..     
d480: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
d490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4a0: 73 65 74 20 3a 3a 74 65 73 74 5f 79 65 61 72 20  set ::test_year 
d4b0: 24 79 65 61 72 0d 0a 20 20 20 20 20 20 20 20 20  $year..         
d4c0: 20 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73         set ::tes
d4d0: 74 5f 70 6c 61 74 66 6f 72 6d 20 24 70 6c 61 74  t_platform $plat
d4e0: 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20 20 20  form..          
d4f0: 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74        set ::test
d500: 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 24  _configuration $
d510: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0d 0a 0d  configuration...
d520: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d530: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
d540: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
d550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d560: 20 20 20 22 79 65 73 2c 20 73 65 6c 65 63 74 65     "yes, selecte
d570: 64 20 28 22 20 5b 65 78 70 72 20 7b 24 6e 61 74  d (" [expr {$nat
d580: 69 76 65 20 3f 20 22 6e 61 74 69 76 65 2f 22 20  ive ? "native/" 
d590: 3a 20 22 22 7d 5d 20 5c 0d 0a 20 20 20 20 20 20  : ""}] \..      
d5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 65                [e
d5b0: 78 70 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e  xpr {[string len
d5c0: 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e  gth $platform] >
d5d0: 20 30 20 3f 20 5b 61 70 70 65 6e 64 41 72 67 73   0 ? [appendArgs
d5e0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
d5f0: 20 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72          $platfor
d600: 6d 20 2f 5d 20 3a 20 22 22 7d 5d 20 24 79 65 61  m /] : ""}] $yea
d610: 72 20 2f 20 24 63 6f 6e 66 69 67 75 72 61 74 69  r / $configurati
d620: 6f 6e 20 22 29 5c 6e 22 5d 0d 0a 0d 0a 20 20 20  on ")\n"]....   
d630: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
d640: 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
d650: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
d660: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
d670: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
d680: 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 20 20   yes\n..        
d690: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
d6a0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
d6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
d6c0: 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e  ts $channel no\n
d6d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
d6e0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
d6f0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
d700: 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ....      return
d710: 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c   false..    }...
d720: 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b  ..    proc check
d730: 46 6f 72 53 51 4c 69 74 65 52 65 6c 65 61 73 65  ForSQLiteRelease
d740: 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 73 65 6c  s { channel {sel
d750: 65 63 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  ect false} } {..
d760: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
d770: 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f 72   NOTE: Check for
d780: 20 70 61 73 74 20 72 65 6c 65 61 73 65 73 20 6f   past releases o
d790: 66 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  f System.Data.SQ
d7a0: 4c 69 74 65 20 69 6e 20 74 68 65 20 64 69 72 65  Lite in the dire
d7b0: 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 23 20 20  ctory..      #  
d7c0: 20 20 20 20 20 63 6f 6e 74 61 69 6e 65 64 20 69       contained i
d7d0: 6e 20 74 68 65 20 22 53 79 73 74 65 6d 2e 44 61  n the "System.Da
d7e0: 74 61 2e 53 51 4c 69 74 65 22 20 65 6e 76 69 72  ta.SQLite" envir
d7f0: 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 2c  onment variable,
d800: 20 69 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20   if..      #    
d810: 20 20 20 70 72 65 73 65 6e 74 2e 0d 0a 20 20 20     present...   
d820: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
d830: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65  [info exists ::e
d840: 6e 76 28 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  nv(System.Data.S
d850: 51 4c 69 74 65 29 5d 20 26 26 20 5c 0d 0a 20 20  QLite)] && \..  
d860: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
d870: 6c 65 6e 67 74 68 20 24 3a 3a 65 6e 76 28 53 79  length $::env(Sy
d880: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
d890: 29 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  )] > 0} then {..
d8a0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
d8b0: 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64     # NOTE: Build
d8c0: 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69   the fully quali
d8d0: 66 69 65 64 20 64 69 72 65 63 74 6f 72 79 20 77  fied directory w
d8e0: 68 65 72 65 20 74 68 65 20 6e 65 63 65 73 73 61  here the necessa
d8f0: 72 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ry..        #   
d900: 20 20 20 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 66      components f
d910: 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  or System.Data.S
d920: 51 4c 69 74 65 20 73 68 6f 75 6c 64 20 62 65 20  QLite should be 
d930: 66 6f 75 6e 64 2e 0d 0a 20 20 20 20 20 20 20 20  found...        
d940: 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 64  #..        set d
d950: 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65 20 6e  irectory [file n
d960: 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
d970: 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  join \..        
d980: 20 20 20 20 24 3a 3a 65 6e 76 28 53 79 73 74 65      $::env(Syste
d990: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 29 20 5b  m.Data.SQLite) [
d9a0: 67 65 74 52 65 6c 65 61 73 65 56 65 72 73 69 6f  getReleaseVersio
d9b0: 6e 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  n]]]....        
d9c0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
d9d0: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
d9e0: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
d9f0: 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73  checking for Sys
da00: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
da10: 72 65 6c 65 61 73 65 20 5c 22 22 20 5c 0d 0a 20  release \"" \.. 
da20: 20 20 20 20 20 20 20 20 20 20 20 24 64 69 72 65             $dire
da30: 63 74 6f 72 79 20 22 5c 22 2e 2e 2e 20 22 5d 0d  ctory "\"... "].
da40: 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  ...        if {[
da50: 69 73 52 65 6c 65 61 73 65 41 76 61 69 6c 61 62  isReleaseAvailab
da60: 6c 65 20 24 64 69 72 65 63 74 6f 72 79 20 70 6c  le $directory pl
da70: 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d  atform]} then {.
da80: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
da90: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70  string length $p
daa0: 6c 61 74 66 6f 72 6d 5d 20 3d 3d 20 30 7d 20 74  latform] == 0} t
dab0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
dac0: 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20     set platform 
dad0: 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20  unknown..       
dae0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
daf0: 20 20 69 66 20 7b 24 73 65 6c 65 63 74 20 26 26    if {$select &&
db00: 20 5b 6d 61 74 63 68 50 6c 61 74 66 6f 72 6d 20   [matchPlatform 
db10: 24 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e  $platform]} then
db20: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
db30: 73 65 74 20 3a 3a 62 75 69 6c 64 5f 64 69 72 65  set ::build_dire
db40: 63 74 6f 72 79 20 24 64 69 72 65 63 74 6f 72 79  ctory $directory
db50: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
db60: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
db70: 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73 2c  appendArgs "yes,
db80: 20 73 65 6c 65 63 74 65 64 20 28 22 20 24 70 6c   selected (" $pl
db90: 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a 0d  atform ")\n"]...
dba0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
dbb0: 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
dbc0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
dbd0: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
dbe0: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
dbf0: 41 72 67 73 20 22 79 65 73 20 28 22 20 24 70 6c  Args "yes (" $pl
dc00: 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a 20  atform ")\n"].. 
dc10: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
dc20: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
dc30: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
dc40: 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 0d 0a 20  hannel no\n.... 
dc50: 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
dc60: 20 70 61 74 68 20 5b 6c 73 6f 72 74 20 2d 64 65   path [lsort -de
dc70: 63 72 65 61 73 69 6e 67 20 5b 66 69 6c 65 20 6c  creasing [file l
dc80: 69 73 74 20 24 64 69 72 65 63 74 6f 72 79 20 2a  ist $directory *
dc90: 5d 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ]] {..          
dca0: 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73    if {[file exis
dcb0: 74 73 20 24 70 61 74 68 5d 20 26 26 20 5b 66 69  ts $path] && [fi
dcc0: 6c 65 20 69 73 64 69 72 65 63 74 6f 72 79 20 24  le isdirectory $
dcd0: 70 61 74 68 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  path]} then {.. 
dce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
dcf0: 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
dd00: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
dd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
dd20: 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
dd30: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
dd40: 74 65 20 72 65 6c 65 61 73 65 20 5c 22 22 20 5c  te release \"" \
dd50: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
dd60: 20 20 20 20 24 70 61 74 68 20 22 5c 22 2e 2e 2e      $path "\"...
dd70: 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20   "]....         
dd80: 20 20 20 20 20 69 66 20 7b 5b 69 73 52 65 6c 65       if {[isRele
dd90: 61 73 65 41 76 61 69 6c 61 62 6c 65 20 24 70 61  aseAvailable $pa
dda0: 74 68 20 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68  th platform]} th
ddb0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
ddc0: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
ddd0: 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f  g length $platfo
dde0: 72 6d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  rm] == 0} then {
ddf0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
de00: 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d      set platform
de10: 20 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20   unknown..      
de20: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
de30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
de40: 66 20 7b 24 73 65 6c 65 63 74 20 26 26 20 5b 6d  f {$select && [m
de50: 61 74 63 68 50 6c 61 74 66 6f 72 6d 20 24 70 6c  atchPlatform $pl
de60: 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d  atform]} then {.
de70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
de80: 20 20 20 73 65 74 20 3a 3a 62 75 69 6c 64 5f 64     set ::build_d
de90: 69 72 65 63 74 6f 72 79 20 24 70 61 74 68 0d 0a  irectory $path..
dea0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
deb0: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
dec0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  el [appendArgs "
ded0: 79 65 73 2c 20 73 65 6c 65 63 74 65 64 20 28 22  yes, selected ("
dee0: 20 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22   $platform ")\n"
def0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
df00: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
df10: 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue..            
df20: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
df30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df40: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
df50: 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73 20  appendArgs "yes 
df60: 28 22 20 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c  (" $platform ")\
df70: 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n"]..           
df80: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
df90: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
dfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfb0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e  tputs $channel n
dfc0: 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  o\n..           
dfd0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
dfe0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
dff0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
e000: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
e010: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
e020: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
e030: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
e040: 2d 2d 2d 2d 20 65 6e 76 69 72 6f 6e 6d 65 6e 74  ---- environment
e050: 20 76 61 72 69 61 62 6c 65 20 5c 22 53 79 73 74   variable \"Syst
e060: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 5c 22  em.Data.SQLite\"
e070: 20 69 73 20 6e 6f 74 20 22 20 5c 0d 0a 20 20 20   is not " \..   
e080: 20 20 20 20 20 20 20 20 20 22 73 65 74 2c 20 73           "set, s
e090: 6b 69 70 70 69 6e 67 20 63 68 65 63 6b 20 66 6f  kipping check fo
e0a0: 72 20 72 65 6c 65 61 73 65 73 2e 2e 2e 5c 6e 22  r releases...\n"
e0b0: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ]..      }....  
e0c0: 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
e0d0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
e0e0: 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51 4c  proc checkForSQL
e0f0: 69 74 65 4c 69 62 72 61 72 79 20 7b 20 63 68 61  iteLibrary { cha
e100: 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20  nnel } {..      
e110: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
e120: 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
e130: 72 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69  r SQLite core li
e140: 62 72 61 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20  brary... "....  
e150: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
e160: 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74  ..        object
e170: 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
e180: 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
e190: 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
e1a0: 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69  Data.SQLite.SQLi
e1b0: 74 65 33 20 53 51 4c 69 74 65 56 65 72 73 69 6f  te3 SQLiteVersio
e1c0: 6e 0d 0a 20 20 20 20 20 20 7d 20 76 65 72 73 69  n..      } versi
e1d0: 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  on] == 0} then {
e1e0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
e1f0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
e200: 63 6b 20 69 66 20 74 68 65 20 72 65 74 75 72 6e  ck if the return
e210: 65 64 20 76 65 72 73 69 6f 6e 20 77 61 73 20 6e  ed version was n
e220: 75 6c 6c 2e 20 20 49 66 20 73 6f 2c 20 6d 61 6b  ull.  If so, mak
e230: 65 20 69 74 20 65 61 73 79 0d 0a 20 20 20 20 20  e it easy..     
e240: 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 73 70     #       to sp
e250: 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ot...        #..
e260: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
e270: 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72 73  ing length $vers
e280: 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ion] == 0} then 
e290: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
e2a0: 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20   version null.. 
e2b0: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
e2c0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
e2d0: 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
e2e0: 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f 73 73  o query the Foss
e2f0: 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69  il source identi
e300: 66 69 65 72 20 66 6f 72 20 74 68 65 20 53 51 4c  fier for the SQL
e310: 69 74 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ite..        #  
e320: 20 20 20 20 20 63 6f 72 65 20 6c 69 62 72 61 72       core librar
e330: 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  y...        #.. 
e340: 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
e350: 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f  h {..          o
e360: 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
e370: 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
e380: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
e390: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
e3a0: 74 65 2e 53 51 4c 69 74 65 33 20 53 51 4c 69 74  te.SQLite3 SQLit
e3b0: 65 53 6f 75 72 63 65 49 64 0d 0a 20 20 20 20 20  eSourceId..     
e3c0: 20 20 20 7d 20 73 6f 75 72 63 65 49 64 5d 7d 20     } sourceId]} 
e3d0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
e3e0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
e3f0: 20 4e 4f 54 45 3a 20 57 65 20 66 61 69 6c 65 64   NOTE: We failed
e400: 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f   to query the Fo
e410: 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e  ssil source iden
e420: 74 69 66 69 65 72 2e 0d 0a 20 20 20 20 20 20 20  tifier...       
e430: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
e440: 73 65 74 20 73 6f 75 72 63 65 49 64 20 75 6e 6b  set sourceId unk
e450: 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d  nown..        }.
e460: 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
e470: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
e480: 65 63 6b 20 69 66 20 74 68 65 20 72 65 74 75 72  eck if the retur
e490: 6e 65 64 20 46 6f 73 73 69 6c 20 73 6f 75 72 63  ned Fossil sourc
e4a0: 65 20 69 64 65 6e 74 69 66 69 65 72 20 77 61 73  e identifier was
e4b0: 20 6e 75 6c 6c 2e 20 20 49 66 0d 0a 20 20 20 20   null.  If..    
e4c0: 20 20 20 20 23 20 20 20 20 20 20 20 73 6f 2c 20      #       so, 
e4d0: 6d 61 6b 65 20 69 74 20 65 61 73 79 20 74 6f 20  make it easy to 
e4e0: 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  spot...        #
e4f0: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73  ..        if {[s
e500: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 6f  tring length $so
e510: 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68  urceId] == 0} th
e520: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
e530: 73 65 74 20 73 6f 75 72 63 65 49 64 20 6e 75 6c  set sourceId nul
e540: 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  l..        }....
e550: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
e560: 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20     # NOTE: Yes, 
e570: 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20  the SQLite core 
e580: 6c 69 62 72 61 72 79 20 61 70 70 65 61 72 73 20  library appears 
e590: 74 6f 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2e  to be available.
e5a0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
e5b0: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
e5c0: 6e 74 20 53 51 4c 69 74 65 0d 0a 0d 0a 20 20 20  nt SQLite....   
e5d0: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
e5e0: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
e5f0: 22 79 65 73 20 28 22 20 24 76 65 72 73 69 6f 6e  "yes (" $version
e600: 20 22 20 22 20 24 73 6f 75 72 63 65 49 64 20 22   " " $sourceId "
e610: 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65  )\n"]..      } e
e620: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
e630: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
e640: 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  \n..      }..   
e650: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
e660: 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 49 6e  checkForSQLiteIn
e670: 74 65 72 6f 70 20 7b 20 63 68 61 6e 6e 65 6c 20  terop { channel 
e680: 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73  } {..      tputs
e690: 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
e6a0: 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 51 4c  checking for SQL
e6b0: 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65  ite interop asse
e6c0: 6d 62 6c 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  mbly... "....   
e6d0: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
e6e0: 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20  .        object 
e6f0: 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
e700: 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
e710: 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
e720: 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74  ata.SQLite.SQLit
e730: 65 33 20 49 6e 74 65 72 6f 70 56 65 72 73 69 6f  e3 InteropVersio
e740: 6e 0d 0a 20 20 20 20 20 20 7d 20 76 65 72 73 69  n..      } versi
e750: 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  on] == 0} then {
e760: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
e770: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
e780: 63 6b 20 69 66 20 74 68 65 20 72 65 74 75 72 6e  ck if the return
e790: 65 64 20 76 65 72 73 69 6f 6e 20 77 61 73 20 6e  ed version was n
e7a0: 75 6c 6c 2e 20 20 49 66 20 73 6f 2c 20 6d 61 6b  ull.  If so, mak
e7b0: 65 20 69 74 20 65 61 73 79 0d 0a 20 20 20 20 20  e it easy..     
e7c0: 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 73 70     #       to sp
e7d0: 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ot...        #..
e7e0: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
e7f0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72 73  ing length $vers
e800: 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ion] == 0} then 
e810: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
e820: 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20   version null.. 
e830: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
e840: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
e850: 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
e860: 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f 73 73  o query the Foss
e870: 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69  il source identi
e880: 66 69 65 72 20 66 6f 72 20 74 68 65 20 53 51 4c  fier for the SQL
e890: 69 74 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ite..        #  
e8a0: 20 20 20 20 20 63 6f 72 65 20 6c 69 62 72 61 72       core librar
e8b0: 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  y...        #.. 
e8c0: 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
e8d0: 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f  h {..          o
e8e0: 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
e8f0: 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
e900: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
e910: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
e920: 74 65 2e 53 51 4c 69 74 65 33 20 49 6e 74 65 72  te.SQLite3 Inter
e930: 6f 70 53 6f 75 72 63 65 49 64 0d 0a 20 20 20 20  opSourceId..    
e940: 20 20 20 20 7d 20 73 6f 75 72 63 65 49 64 5d 7d      } sourceId]}
e950: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
e960: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
e970: 23 20 4e 4f 54 45 3a 20 57 65 20 66 61 69 6c 65  # NOTE: We faile
e980: 64 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 46  d to query the F
e990: 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65  ossil source ide
e9a0: 6e 74 69 66 69 65 72 2e 0d 0a 20 20 20 20 20 20  ntifier...      
e9b0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
e9c0: 20 73 65 74 20 73 6f 75 72 63 65 49 64 20 75 6e   set sourceId un
e9d0: 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20 7d  known..        }
e9e0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
e9f0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
ea00: 68 65 63 6b 20 69 66 20 74 68 65 20 72 65 74 75  heck if the retu
ea10: 72 6e 65 64 20 46 6f 73 73 69 6c 20 73 6f 75 72  rned Fossil sour
ea20: 63 65 20 69 64 65 6e 74 69 66 69 65 72 20 77 61  ce identifier wa
ea30: 73 20 6e 75 6c 6c 2e 20 20 49 66 0d 0a 20 20 20  s null.  If..   
ea40: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6f 2c       #       so,
ea50: 20 6d 61 6b 65 20 69 74 20 65 61 73 79 20 74 6f   make it easy to
ea60: 20 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20   spot...        
ea70: 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  #..        if {[
ea80: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73  string length $s
ea90: 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74  ourceId] == 0} t
eaa0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
eab0: 20 73 65 74 20 73 6f 75 72 63 65 49 64 20 6e 75   set sourceId nu
eac0: 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ll..        }...
ead0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
eae0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 65 66 6f      # NOTE: Befo
eaf0: 72 65 20 61 63 74 75 61 6c 6c 79 20 61 64 64 69  re actually addi
eb00: 6e 67 20 74 68 65 20 74 65 73 74 20 63 6f 6e 73  ng the test cons
eb10: 74 72 61 69 6e 74 2c 20 6d 61 6b 65 20 73 75 72  traint, make sur
eb20: 65 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23  e the..        #
eb30: 20 20 20 20 20 20 20 76 65 72 73 69 6f 6e 20 69         version i
eb40: 73 20 76 61 6c 69 64 20 28 69 2e 65 2e 20 6e 6f  s valid (i.e. no
eb50: 74 20 6a 75 73 74 20 74 68 61 74 20 77 65 20 63  t just that we c
eb60: 6f 75 6c 64 20 71 75 65 72 79 20 69 74 29 2e 0d  ould query it)..
eb70: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
eb80: 20 20 20 20 69 66 20 7b 24 76 65 72 73 69 6f 6e      if {$version
eb90: 20 6e 65 20 22 6e 75 6c 6c 22 7d 20 74 68 65 6e   ne "null"} then
eba0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
ebb0: 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
ebc0: 45 3a 20 59 65 73 2c 20 74 68 65 20 53 51 4c 69  E: Yes, the SQLi
ebd0: 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d  te interop assem
ebe0: 62 6c 79 20 61 70 70 65 61 72 73 20 74 6f 20 62  bly appears to b
ebf0: 65 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20  e available...  
ec00: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
ec10: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
ec20: 6e 74 20 53 51 4c 69 74 65 49 6e 74 65 72 6f 70  nt SQLiteInterop
ec30: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65  ....          se
ec40: 74 20 61 6e 73 77 65 72 20 79 65 73 0d 0a 20 20  t answer yes..  
ec50: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
ec60: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 61 6e            set an
ec70: 73 77 65 72 20 6e 6f 0d 0a 20 20 20 20 20 20 20  swer no..       
ec80: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70   }....        tp
ec90: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
eca0: 70 65 6e 64 41 72 67 73 20 24 61 6e 73 77 65 72  pendArgs $answer
ecb0: 20 22 20 28 22 20 24 76 65 72 73 69 6f 6e 20 22   " (" $version "
ecc0: 20 22 20 24 73 6f 75 72 63 65 49 64 20 22 29 5c   " $sourceId ")\
ecd0: 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  n"]..      } els
ece0: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e {..        tpu
ecf0: 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e  ts $channel no\n
ed00: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
ed10: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68  .....    proc ch
ed20: 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 65 66 69  eckForSQLiteDefi
ed30: 6e 65 43 6f 6e 73 74 61 6e 74 20 7b 20 63 68 61  neConstant { cha
ed40: 6e 6e 65 6c 20 6e 61 6d 65 20 7d 20 7b 0d 0a 20  nnel name } {.. 
ed50: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
ed60: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
ed70: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 22 2d 2d  \..          "--
ed80: 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
ed90: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
eda0: 74 65 20 64 65 66 69 6e 65 20 63 6f 6e 73 74 61  te define consta
edb0: 6e 74 20 5c 22 22 20 24 6e 61 6d 65 20 5c 0d 0a  nt \"" $name \..
edc0: 20 20 20 20 20 20 20 20 20 20 22 5c 22 2e 2e 2e            "\"...
edd0: 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20   "]....      if 
ede0: 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
edf0: 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
ee00: 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
ee10: 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
ee20: 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
ee30: 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 44 65 66  Lite.SQLite3 Def
ee40: 69 6e 65 43 6f 6e 73 74 61 6e 74 73 0d 0a 20 20  ineConstants..  
ee50: 20 20 20 20 7d 20 64 65 66 69 6e 65 43 6f 6e 73      } defineCons
ee60: 74 61 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68 65  tants] == 0} the
ee70: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
ee80: 7b 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74  {[lsearch -exact
ee90: 20 2d 6e 6f 63 61 73 65 20 24 64 65 66 69 6e 65   -nocase $define
eea0: 43 6f 6e 73 74 61 6e 74 73 20 24 6e 61 6d 65 5d  Constants $name]
eeb0: 20 21 3d 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a   != -1} then {..
eec0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
eed0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59         # NOTE: Y
eee0: 65 73 2c 20 74 68 69 73 20 64 65 66 69 6e 65 20  es, this define 
eef0: 63 6f 6e 73 74 61 6e 74 20 77 61 73 20 65 6e 61  constant was ena
ef00: 62 6c 65 64 20 77 68 65 6e 20 74 68 65 20 6d 61  bled when the ma
ef10: 6e 61 67 65 64 0d 0a 20 20 20 20 20 20 20 20 20  naged..         
ef20: 20 23 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c   #       assembl
ef30: 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 2e 0d  y was compiled..
ef40: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
ef50: 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
ef60: 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
ef70: 73 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74  s defineConstant
ef80: 2e 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  .System.Data.SQL
ef90: 69 74 65 2e 20 24 6e 61 6d 65 5d 0d 0a 0d 0a 20  ite. $name].... 
efa0: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
efb0: 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20  channel yes\n.. 
efc0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
efd0: 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
efe0: 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a   $channel no\n..
eff0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
f000: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
f010: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
f020: 6c 20 65 72 72 6f 72 5c 6e 0d 0a 20 20 20 20 20  l error\n..     
f030: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
f040: 20 20 70 72 6f 63 20 67 65 74 44 61 74 65 54 69    proc getDateTi
f050: 6d 65 46 6f 72 6d 61 74 20 7b 7d 20 7b 0d 0a 20  meFormat {} {.. 
f060: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
f070: 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65  NOTE: This proce
f080: 64 75 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75  dure simply retu
f090: 72 6e 73 20 74 68 65 20 22 64 65 66 61 75 6c 74  rns the "default
f0a0: 22 20 44 61 74 65 54 69 6d 65 20 66 6f 72 6d 61  " DateTime forma
f0b0: 74 20 75 73 65 64 0d 0a 20 20 20 20 20 20 23 20  t used..      # 
f0c0: 20 20 20 20 20 20 62 79 20 74 68 65 20 74 65 73        by the tes
f0d0: 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20  t suite...      
f0e0: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
f0f0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 64 61 74 65  fo exists ::date
f100: 74 69 6d 65 5f 66 6f 72 6d 61 74 5d 20 26 26 20  time_format] && 
f110: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
f120: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 64  ring length $::d
f130: 61 74 65 74 69 6d 65 5f 66 6f 72 6d 61 74 5d 20  atetime_format] 
f140: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
f150: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
f160: 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74  # NOTE: Return t
f170: 68 65 20 6d 61 6e 75 61 6c 6c 79 20 6f 76 65 72  he manually over
f180: 72 69 64 64 65 6e 20 76 61 6c 75 65 20 66 6f 72  ridden value for
f190: 20 74 68 65 20 44 61 74 65 54 69 6d 65 20 66 6f   the DateTime fo
f1a0: 72 6d 61 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  rmat...        #
f1b0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
f1c0: 20 24 3a 3a 64 61 74 65 74 69 6d 65 5f 66 6f 72   $::datetime_for
f1d0: 6d 61 74 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  mat..      } els
f1e0: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e {..        #..
f1f0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
f200: 52 65 74 75 72 6e 20 61 6e 20 49 53 4f 38 36 30  Return an ISO860
f210: 31 20 44 61 74 65 54 69 6d 65 20 66 6f 72 6d 61  1 DateTime forma
f220: 74 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  t compatible wit
f230: 68 20 53 51 4c 69 74 65 2c 0d 0a 20 20 20 20 20  h SQLite,..     
f240: 20 20 20 23 20 20 20 20 20 20 20 53 79 73 74 65     #       Syste
f250: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2c 20 61  m.Data.SQLite, a
f260: 6e 64 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  nd suitable for 
f270: 72 6f 75 6e 64 2d 74 72 69 70 70 69 6e 67 20 77  round-tripping w
f280: 69 74 68 20 74 68 65 0d 0a 20 20 20 20 20 20 20  ith the..       
f290: 20 23 20 20 20 20 20 20 20 44 61 74 65 54 69 6d   #       DateTim
f2a0: 65 20 63 6c 61 73 73 20 6f 66 20 74 68 65 20 66  e class of the f
f2b0: 72 61 6d 65 77 6f 72 6b 2e 20 20 49 66 20 74 68  ramework.  If th
f2c0: 69 73 20 76 61 6c 75 65 20 69 73 20 63 68 61 6e  is value is chan
f2d0: 67 65 64 2c 0d 0a 20 20 20 20 20 20 20 20 23 20  ged,..        # 
f2e0: 20 20 20 20 20 20 76 61 72 69 6f 75 73 20 74 65        various te
f2f0: 73 74 73 20 6d 61 79 20 66 61 69 6c 2e 0d 0a 20  sts may fail... 
f300: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
f310: 20 20 72 65 74 75 72 6e 20 22 79 79 79 79 2d 4d    return "yyyy-M
f320: 4d 2d 64 64 20 48 48 3a 6d 6d 3a 73 73 2e 46 46  M-dd HH:mm:ss.FF
f330: 46 46 46 46 46 4b 22 0d 0a 20 20 20 20 20 20 7d  FFFFFK"..      }
f340: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
f350: 70 72 6f 63 20 65 6e 75 6d 65 72 61 62 6c 65 54  proc enumerableT
f360: 6f 4c 69 73 74 20 7b 20 65 6e 75 6d 65 72 61 62  oList { enumerab
f370: 6c 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  le } {..      se
f380: 74 20 72 65 73 75 6c 74 20 5b 6c 69 73 74 5d 0d  t result [list].
f390: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  ...      if {[st
f3a0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 65 6e 75  ring length $enu
f3b0: 6d 65 72 61 62 6c 65 5d 20 3d 3d 20 30 20 7c 7c  merable] == 0 ||
f3c0: 20 24 65 6e 75 6d 65 72 61 62 6c 65 20 65 71 20   $enumerable eq 
f3d0: 22 6e 75 6c 6c 22 7d 20 74 68 65 6e 20 7b 0d 0a  "null"} then {..
f3e0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
f3f0: 72 65 73 75 6c 74 0d 0a 20 20 20 20 20 20 7d 0d  result..      }.
f400: 0a 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63 74 20  ...      object 
f410: 66 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20 69  foreach -alias i
f420: 74 65 6d 20 24 65 6e 75 6d 65 72 61 62 6c 65 20  tem $enumerable 
f430: 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  {..        if {[
f440: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 69  string length $i
f450: 74 65 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  tem] > 0} then {
f460: 0d 0a 20 20 20 20 20 20 20 20 20 20 6c 61 70 70  ..          lapp
f470: 65 6e 64 20 72 65 73 75 6c 74 20 5b 24 69 74 65  end result [$ite
f480: 6d 20 54 6f 53 74 72 69 6e 67 5d 0d 0a 20 20 20  m ToString]..   
f490: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
f4a0: 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
f4b0: 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a  $result..    }..
f4c0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 61 74 63  ...    proc catc
f4d0: 68 41 6e 64 52 65 74 75 72 6e 20 7b 20 73 63 72  hAndReturn { scr
f4e0: 69 70 74 20 7b 73 74 61 63 6b 54 72 61 63 65 20  ipt {stackTrace 
f4f0: 66 61 6c 73 65 7d 20 7b 73 74 72 69 63 74 20 74  false} {strict t
f500: 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  rue} } {..      
f510: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
f520: 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 73 63   Evaluate the sc
f530: 72 69 70 74 20 70 72 6f 76 69 64 65 64 20 62 79  ript provided by
f540: 20 6f 75 72 20 63 61 6c 6c 65 72 20 69 6e 20 74   our caller in t
f550: 68 65 69 72 20 63 6f 6e 74 65 78 74 2c 0d 0a 20  heir context,.. 
f560: 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61 70       #       cap
f570: 74 75 72 69 6e 67 20 62 6f 74 68 20 74 68 65 20  turing both the 
f580: 72 65 73 75 6c 74 20 61 6e 64 20 74 68 65 20 72  result and the r
f590: 65 74 75 72 6e 20 63 6f 64 65 2e 0d 0a 20 20 20  eturn code...   
f5a0: 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
f5b0: 63 6f 64 65 20 5b 63 61 74 63 68 20 7b 75 70 6c  code [catch {upl
f5c0: 65 76 65 6c 20 31 20 24 73 63 72 69 70 74 7d 20  evel 1 $script} 
f5d0: 72 65 73 75 6c 74 5d 0d 0a 0d 0a 20 20 20 20 20  result]....     
f5e0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
f5f0: 3a 20 44 69 64 20 74 68 65 20 73 63 72 69 70 74  : Did the script
f600: 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72   provided by our
f610: 20 63 61 6c 6c 65 72 20 4e 4f 54 20 72 61 69 73   caller NOT rais
f620: 65 20 61 6e 20 65 72 72 6f 72 3f 0d 0a 20 20 20  e an error?..   
f630: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
f640: 24 73 74 72 69 63 74 20 26 26 20 24 63 6f 64 65  $strict && $code
f650: 20 3d 3d 20 30 20 7c 7c 20 21 24 73 74 72 69 63   == 0 || !$stric
f660: 74 20 26 26 20 24 63 6f 64 65 20 21 3d 20 31 7d  t && $code != 1}
f670: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
f680: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
f690: 54 45 3a 20 53 75 63 63 65 73 73 2e 20 20 52 65  TE: Success.  Re
f6a0: 74 75 72 6e 20 61 20 6c 69 73 74 20 77 69 74 68  turn a list with
f6b0: 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
f6c0: 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 2e   and the result.
f6d0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
f6e0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73       return [lis
f6f0: 74 20 24 63 6f 64 65 20 24 72 65 73 75 6c 74 5d  t $code $result]
f700: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66  ..      } elseif
f710: 20 7b 24 73 74 61 63 6b 54 72 61 63 65 7d 20 74   {$stackTrace} t
f720: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
f730: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
f740: 3a 20 46 61 69 6c 75 72 65 2e 20 20 4f 75 72 20  : Failure.  Our 
f750: 63 61 6c 6c 65 72 20 77 61 6e 74 73 20 61 20 66  caller wants a f
f760: 75 6c 6c 20 73 74 61 63 6b 20 74 72 61 63 65 20  ull stack trace 
f770: 28 69 66 20 61 70 70 6c 69 63 61 62 6c 65 29 2c  (if applicable),
f780: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
f790: 20 20 72 65 74 75 72 6e 20 61 20 6c 69 73 74 20    return a list 
f7a0: 77 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 20  with the return 
f7b0: 63 6f 64 65 20 61 6e 64 20 74 68 65 20 72 65 73  code and the res
f7c0: 75 6c 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20  ult verbatim... 
f7d0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
f7e0: 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 24    return [list $
f7f0: 63 6f 64 65 20 24 72 65 73 75 6c 74 5d 0d 0a 20  code $result].. 
f800: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
f810: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
f820: 20 20 23 20 4e 4f 54 45 3a 20 46 61 69 6c 75 72    # NOTE: Failur
f830: 65 2e 20 20 4f 75 72 20 63 61 6c 6c 65 72 20 64  e.  Our caller d
f840: 6f 65 73 20 6e 6f 74 20 77 61 6e 74 20 61 20 66  oes not want a f
f850: 75 6c 6c 20 73 74 61 63 6b 20 74 72 61 63 65 20  ull stack trace 
f860: 28 69 66 0d 0a 20 20 20 20 20 20 20 20 23 20 20  (if..        #  
f870: 20 20 20 20 20 61 70 70 6c 69 63 61 62 6c 65 29       applicable)
f880: 2c 20 72 65 74 75 72 6e 20 61 20 6c 69 73 74 20  , return a list 
f890: 77 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 20  with the return 
f8a0: 63 6f 64 65 2c 20 74 68 65 20 65 72 72 6f 72 0d  code, the error.
f8b0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
f8c0: 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69 6e   code for the in
f8d0: 74 65 72 70 72 65 74 65 72 2c 20 61 6e 64 20 74  terpreter, and t
f8e0: 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
f8f0: 20 75 70 20 74 6f 20 74 68 65 0d 0a 20 20 20 20   up to the..    
f900: 20 20 20 20 23 20 20 20 20 20 20 20 70 6f 69 6e      #       poin
f910: 74 20 77 68 65 72 65 20 74 68 65 20 73 74 61 63  t where the stac
f920: 6b 20 74 72 61 63 65 20 73 68 6f 75 6c 64 20 73  k trace should s
f930: 74 61 72 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  tart...        #
f940: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
f950: 20 5b 6c 69 73 74 20 24 63 6f 64 65 20 24 3a 3a   [list $code $::
f960: 65 72 72 6f 72 43 6f 64 65 20 5c 0d 0a 20 20 20  errorCode \..   
f970: 20 20 20 20 20 20 20 20 20 5b 65 78 74 72 61 63           [extrac
f980: 74 53 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74  tSystemDataSQLit
f990: 65 45 78 63 65 70 74 69 6f 6e 4d 65 73 73 61 67  eExceptionMessag
f9a0: 65 20 24 72 65 73 75 6c 74 5d 5d 0d 0a 20 20 20  e $result]]..   
f9b0: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
f9c0: 20 20 20 20 70 72 6f 63 20 63 6f 6d 70 69 6c 65      proc compile
f9d0: 43 53 68 61 72 70 57 69 74 68 20 7b 0d 0a 20 20  CSharpWith {..  
f9e0: 20 20 20 20 20 20 20 20 20 20 74 65 78 74 20 6d            text m
f9f0: 65 6d 6f 72 79 20 73 79 6d 62 6f 6c 73 20 73 74  emory symbols st
fa00: 72 69 63 74 20 72 65 73 75 6c 74 73 56 61 72 4e  rict resultsVarN
fa10: 61 6d 65 20 65 72 72 6f 72 73 56 61 72 4e 61 6d  ame errorsVarNam
fa20: 65 20 66 69 6c 65 4e 61 6d 65 73 0d 0a 20 20 20  e fileNames..   
fa30: 20 20 20 20 20 20 20 20 20 61 72 67 73 20 7d 20           args } 
fa40: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
fa50: 20 20 23 20 4e 4f 54 45 3a 20 53 69 6e 63 65 20    # NOTE: Since 
fa60: 77 65 20 61 72 65 20 67 6f 69 6e 67 20 74 6f 20  we are going to 
fa70: 75 73 65 20 74 68 69 73 20 6d 65 74 68 6f 64 20  use this method 
fa80: 6e 61 6d 65 20 61 20 6c 6f 74 2c 20 61 73 73 69  name a lot, assi
fa90: 67 6e 20 69 74 20 74 6f 20 61 0d 0a 20 20 20 20  gn it to a..    
faa0: 20 20 23 20 20 20 20 20 20 20 76 61 72 69 61 62    #       variab
fab0: 6c 65 20 66 69 72 73 74 2e 0d 0a 20 20 20 20 20  le first...     
fac0: 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 61 64   #..      set ad
fad0: 64 20 52 65 66 65 72 65 6e 63 65 64 41 73 73 65  d ReferencedAsse
fae0: 6d 62 6c 69 65 73 2e 41 64 64 0d 0a 0d 0a 20 20  mblies.Add....  
faf0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
fb00: 4f 54 45 3a 20 43 72 65 61 74 65 20 74 68 65 20  OTE: Create the 
fb10: 62 61 73 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  base command to 
fb20: 65 76 61 6c 75 61 74 65 20 61 6e 64 20 61 64 64  evaluate and add
fb30: 20 74 68 65 20 70 72 6f 70 65 72 74 79 20 73 65   the property se
fb40: 74 74 69 6e 67 73 0d 0a 20 20 20 20 20 20 23 20  ttings..      # 
fb50: 20 20 20 20 20 20 74 68 61 74 20 61 72 65 20 61        that are a
fb60: 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 6e 65 65  lmost always nee
fb70: 64 65 64 20 62 79 20 6f 75 72 20 75 6e 69 74 20  ded by our unit 
fb80: 74 65 73 74 73 20 28 69 2e 65 2e 20 74 68 65 20  tests (i.e. the 
fb90: 53 79 73 74 65 6d 0d 0a 20 20 20 20 20 20 23 20  System..      # 
fba0: 20 20 20 20 20 20 61 6e 64 20 53 79 73 74 65 6d        and System
fbb0: 2e 44 61 74 61 20 61 73 73 65 6d 62 6c 79 20 72  .Data assembly r
fbc0: 65 66 65 72 65 6e 63 65 73 29 2e 0d 0a 20 20 20  eferences)...   
fbd0: 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
fbe0: 63 6f 6d 6d 61 6e 64 20 5b 6c 69 73 74 20 5c 0d  command [list \.
fbf0: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6d 70 69  .          compi
fc00: 6c 65 43 53 68 61 72 70 20 24 74 65 78 74 20 24  leCSharp $text $
fc10: 6d 65 6d 6f 72 79 20 24 73 79 6d 62 6f 6c 73 20  memory $symbols 
fc20: 24 73 74 72 69 63 74 20 72 65 73 75 6c 74 73 20  $strict results 
fc30: 65 72 72 6f 72 73 20 5c 0d 0a 20 20 20 20 20 20  errors \..      
fc40: 20 20 20 20 24 61 64 64 20 53 79 73 74 65 6d 2e      $add System.
fc50: 64 6c 6c 20 24 61 64 64 20 53 79 73 74 65 6d 2e  dll $add System.
fc60: 44 61 74 61 2e 64 6c 6c 20 24 61 64 64 20 53 79  Data.dll $add Sy
fc70: 73 74 65 6d 2e 54 72 61 6e 73 61 63 74 69 6f 6e  stem.Transaction
fc80: 73 2e 64 6c 6c 20 5c 0d 0a 20 20 20 20 20 20 20  s.dll \..       
fc90: 20 20 20 24 61 64 64 20 53 79 73 74 65 6d 2e 58     $add System.X
fca0: 6d 6c 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20  ml.dll]....     
fcb0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
fcc0: 3a 20 41 64 64 20 61 6c 6c 20 74 68 65 20 70 72  : Add all the pr
fcd0: 6f 76 69 64 65 64 20 66 69 6c 65 20 6e 61 6d 65  ovided file name
fce0: 73 20 61 73 20 61 73 73 65 6d 62 6c 79 20 72 65  s as assembly re
fcf0: 66 65 72 65 6e 63 65 73 2e 0d 0a 20 20 20 20 20  ferences...     
fd00: 20 23 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63   #..      foreac
fd10: 68 20 66 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  h fileName $file
fd20: 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
fd30: 20 6c 61 70 70 65 6e 64 20 63 6f 6d 6d 61 6e 64   lappend command
fd40: 20 24 61 64 64 20 5b 67 65 74 42 69 6e 61 72 79   $add [getBinary
fd50: 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61  FileName $fileNa
fd60: 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  me]..      }....
fd70: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
fd80: 20 4e 4f 54 45 3a 20 41 64 64 20 74 68 65 20 65   NOTE: Add the e
fd90: 78 74 72 61 20 61 72 67 75 6d 65 6e 74 73 2c 20  xtra arguments, 
fda0: 69 66 20 61 6e 79 2c 20 74 6f 20 74 68 65 20 63  if any, to the c
fdb0: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 75 61  ommand to evalua
fdc0: 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  te...      #..  
fdd0: 20 20 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64      eval lappend
fde0: 20 63 6f 6d 6d 61 6e 64 20 24 61 72 67 73 0d 0a   command $args..
fdf0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
fe00: 20 23 20 4e 4f 54 45 3a 20 41 6c 69 61 73 20 74   # NOTE: Alias t
fe10: 68 65 20 63 6f 6d 70 69 6c 65 72 20 6c 6f 63 61  he compiler loca
fe20: 6c 20 72 65 73 75 6c 74 73 20 61 6e 64 20 65 72  l results and er
fe30: 72 6f 72 73 20 76 61 72 69 61 62 6c 65 73 20 74  rors variables t
fe40: 6f 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  o the..      #  
fe50: 20 20 20 20 20 76 61 72 69 61 62 6c 65 20 6e 61       variable na
fe60: 6d 65 73 20 70 72 6f 76 69 64 65 64 20 62 79 20  mes provided by 
fe70: 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20  our caller...   
fe80: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
fe90: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
fea0: 72 65 73 75 6c 74 73 56 61 72 4e 61 6d 65 5d 20  resultsVarName] 
feb0: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
fec0: 20 20 20 20 20 75 70 76 61 72 20 31 20 24 72 65       upvar 1 $re
fed0: 73 75 6c 74 73 56 61 72 4e 61 6d 65 20 72 65 73  sultsVarName res
fee0: 75 6c 74 73 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  ults..      }...
fef0: 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
ff00: 6e 67 20 6c 65 6e 67 74 68 20 24 65 72 72 6f 72  ng length $error
ff10: 73 56 61 72 4e 61 6d 65 5d 20 3e 20 30 7d 20 74  sVarName] > 0} t
ff20: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 75  hen {..        u
ff30: 70 76 61 72 20 31 20 24 65 72 72 6f 72 73 56 61  pvar 1 $errorsVa
ff40: 72 4e 61 6d 65 20 65 72 72 6f 72 73 0d 0a 20 20  rName errors..  
ff50: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
ff60: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
ff70: 45 76 61 6c 75 61 74 65 20 74 68 65 20 63 6f 6e  Evaluate the con
ff80: 73 74 72 75 63 74 65 64 20 5b 63 6f 6d 70 69 6c  structed [compil
ff90: 65 43 53 68 61 72 70 5d 20 63 6f 6d 6d 61 6e 64  eCSharp] command
ffa0: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0d   and return the.
ffb0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72  .      #       r
ffc0: 65 73 75 6c 74 2e 0d 0a 20 20 20 20 20 20 23 0d  esult...      #.
ffd0: 0a 20 20 20 20 20 20 65 76 61 6c 20 24 63 6f 6d  .      eval $com
ffe0: 6d 61 6e 64 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  mand..    }.....
fff0: 20 20 20 20 70 72 6f 63 20 69 73 4d 65 6d 6f 72      proc isMemor
10000 79 44 62 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d  yDb { fileName }
10010 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
10020 20 20 20 23 20 4e 4f 54 45 3a 20 49 73 20 74 68     # NOTE: Is th
10030 65 20 73 70 65 63 69 66 69 65 64 20 64 61 74 61  e specified data
10040 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 72  base file name r
10050 65 61 6c 6c 79 20 61 6e 20 69 6e 2d 6d 65 6d 6f  eally an in-memo
10060 72 79 20 64 61 74 61 62 61 73 65 3f 0d 0a 20 20  ry database?..  
10070 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74      #..      ret
10080 75 72 6e 20 5b 65 78 70 72 20 7b 24 66 69 6c 65  urn [expr {$file
10090 4e 61 6d 65 20 65 71 20 22 3a 6d 65 6d 6f 72 79  Name eq ":memory
100a0 3a 22 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20  :" || \..       
100b0 20 20 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65     [string range
100c0 20 24 66 69 6c 65 4e 61 6d 65 20 30 20 31 32 5d   $fileName 0 12]
100d0 20 65 71 20 22 66 69 6c 65 3a 3a 6d 65 6d 6f 72   eq "file::memor
100e0 79 3a 22 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  y:"}]..    }....
100f0 0a 20 20 20 20 70 72 6f 63 20 69 73 54 61 62 6c  .    proc isTabl
10100 65 49 6e 44 62 20 7b 20 6e 61 6d 65 20 7b 76 61  eInDb { name {va
10110 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a 20  rName db} } {.. 
10120 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
10130 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74  NOTE: Refer to t
10140 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72  he specified var
10150 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22  iable (e.g. "db"
10160 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74  ) in the context
10170 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23   of our..      #
10180 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20 20         caller.  
10190 49 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  It contains the 
101a0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
101b0 69 6f 6e 20 68 61 6e 64 6c 65 20 74 68 61 74 20  ion handle that 
101c0 77 69 6c 6c 20 62 65 0d 0a 20 20 20 20 20 20 23  will be..      #
101d0 20 20 20 20 20 20 20 75 73 65 64 20 74 6f 20 65         used to e
101e0 78 65 63 75 74 65 20 74 68 65 20 71 75 65 72 79  xecute the query
101f0 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
10200 6e 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  ne if the named 
10210 74 61 62 6c 65 20 69 73 0d 0a 20 20 20 20 20 20  table is..      
10220 23 20 20 20 20 20 20 20 70 72 65 73 65 6e 74 20  #       present 
10230 69 6e 20 74 68 61 74 20 64 61 74 61 62 61 73 65  in that database
10240 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
10250 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
10260 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23  me db....      #
10270 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
10280 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  Use the sqlite_m
10290 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f 20 64  aster table to d
102a0 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
102b0 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73 0d 0a  named table is..
102c0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 72        #       pr
102d0 65 73 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74  esent in the dat
102e0 61 62 61 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d  abase...      #.
102f0 0a 20 20 20 20 20 20 73 65 74 20 73 71 6c 20 7b  .      set sql {
10300 0d 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  ..        SELECT
10310 20 43 4f 55 4e 54 28 2a 29 20 46 52 4f 4d 20 73   COUNT(*) FROM s
10320 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45  qlite_master WHE
10330 52 45 20 74 79 70 65 20 3d 20 27 74 61 62 6c 65  RE type = 'table
10340 27 20 41 4e 44 20 6e 61 6d 65 20 3d 20 3f 3b 0d  ' AND name = ?;.
10350 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
10360 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
10370 45 3a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  E: Return non-ze
10380 72 6f 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  ro if the named 
10390 74 61 62 6c 65 20 69 73 20 70 72 65 73 65 6e 74  table is present
103a0 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
103b0 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b    return [expr {
103c0 0d 0a 20 20 20 20 20 20 20 20 5b 73 71 6c 20 65  ..        [sql e
103d0 78 65 63 75 74 65 20 2d 65 78 65 63 75 74 65 20  xecute -execute 
103e0 73 63 61 6c 61 72 20 24 64 62 20 24 73 71 6c 20  scalar $db $sql 
103f0 5b 6c 69 73 74 20 70 61 72 61 6d 31 20 53 74 72  [list param1 Str
10400 69 6e 67 20 24 6e 61 6d 65 5d 5d 20 3e 20 30 0d  ing $name]] > 0.
10410 0a 20 20 20 20 20 20 7d 5d 0d 0a 20 20 20 20 7d  .      }]..    }
10420 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
10430 74 44 62 44 65 66 61 75 6c 74 50 61 67 65 53 69  tDbDefaultPageSi
10440 7a 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 74  ze {} {..      t
10450 72 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  ry {..        se
10460 74 20 64 62 20 5b 73 71 6c 20 6f 70 65 6e 20 2d  t db [sql open -
10470 74 79 70 65 20 53 51 4c 69 74 65 20 7b 44 61 74  type SQLite {Dat
10480 61 20 53 6f 75 72 63 65 3d 3a 6d 65 6d 6f 72 79  a Source=:memory
10490 3a 3b 7d 5d 0d 0a 20 20 20 20 20 20 20 20 72 65  :;}]..        re
104a0 74 75 72 6e 20 5b 73 71 6c 20 65 78 65 63 75 74  turn [sql execut
104b0 65 20 2d 65 78 65 63 75 74 65 20 73 63 61 6c 61  e -execute scala
104c0 72 20 24 64 62 20 22 50 52 41 47 4d 41 20 70 61  r $db "PRAGMA pa
104d0 67 65 5f 73 69 7a 65 3b 22 5d 0d 0a 20 20 20 20  ge_size;"]..    
104e0 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0d 0a 20    } finally {.. 
104f0 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f         if {[info
10500 20 65 78 69 73 74 73 20 64 62 5d 7d 20 74 68 65   exists db]} the
10510 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  n {..          c
10520 61 74 63 68 20 7b 73 71 6c 20 63 6c 6f 73 65 20  atch {sql close 
10530 24 64 62 7d 0d 0a 20 20 20 20 20 20 20 20 20 20  $db}..          
10540 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69  unset -nocomplai
10550 6e 20 64 62 0d 0a 20 20 20 20 20 20 20 20 7d 0d  n db..        }.
10560 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
10570 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
10580 44 62 44 65 66 61 75 6c 74 43 61 63 68 65 53 69  DbDefaultCacheSi
10590 7a 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 74  ze {} {..      t
105a0 72 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  ry {..        se
105b0 74 20 64 62 20 5b 73 71 6c 20 6f 70 65 6e 20 2d  t db [sql open -
105c0 74 79 70 65 20 53 51 4c 69 74 65 20 7b 44 61 74  type SQLite {Dat
105d0 61 20 53 6f 75 72 63 65 3d 3a 6d 65 6d 6f 72 79  a Source=:memory
105e0 3a 3b 7d 5d 0d 0a 20 20 20 20 20 20 20 20 72 65  :;}]..        re
105f0 74 75 72 6e 20 5b 73 71 6c 20 65 78 65 63 75 74  turn [sql execut
10600 65 20 2d 65 78 65 63 75 74 65 20 73 63 61 6c 61  e -execute scala
10610 72 20 24 64 62 20 22 50 52 41 47 4d 41 20 63 61  r $db "PRAGMA ca
10620 63 68 65 5f 73 69 7a 65 3b 22 5d 0d 0a 20 20 20  che_size;"]..   
10630 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0d 0a     } finally {..
10640 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66          if {[inf
10650 6f 20 65 78 69 73 74 73 20 64 62 5d 7d 20 74 68  o exists db]} th
10660 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
10670 63 61 74 63 68 20 7b 73 71 6c 20 63 6c 6f 73 65  catch {sql close
10680 20 24 64 62 7d 0d 0a 20 20 20 20 20 20 20 20 20   $db}..         
10690 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61   unset -nocompla
106a0 69 6e 20 64 62 0d 0a 20 20 20 20 20 20 20 20 7d  in db..        }
106b0 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
106c0 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 75 73  .....    proc us
106d0 65 4c 65 67 61 63 79 44 62 50 61 67 65 41 6e 64  eLegacyDbPageAnd
106e0 43 61 63 68 65 53 69 7a 65 73 20 7b 20 76 61 72  CacheSizes { var
106f0 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20  Name } {..      
10700 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
10710 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 73 70   Refer to the sp
10720 65 63 69 66 69 65 64 20 76 61 72 69 61 62 6c 65  ecified variable
10730 20 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20   (e.g. "db") in 
10740 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f  the context of o
10750 75 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ur..      #     
10760 20 20 63 61 6c 6c 65 72 2e 20 20 49 74 20 63 6f    caller.  It co
10770 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62  ntains the datab
10780 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  ase connection h
10790 61 6e 64 6c 65 20 74 68 61 74 20 77 69 6c 6c 20  andle that will 
107a0 62 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  be..      #     
107b0 20 20 75 73 65 64 20 74 6f 20 65 78 65 63 75 74    used to execut
107c0 65 20 71 75 65 72 69 65 73 20 75 73 65 64 20 74  e queries used t
107d0 6f 20 73 65 74 20 74 68 65 20 70 61 67 65 20 61  o set the page a
107e0 6e 64 20 63 61 63 68 65 20 73 69 7a 65 73 2e 0d  nd cache sizes..
107f0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
10800 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65  upvar 1 $varName
10810 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 73 71 6c   db....      sql
10820 20 65 78 65 63 75 74 65 20 24 64 62 20 7b 0d 0a   execute $db {..
10830 20 20 20 20 20 20 20 20 50 52 41 47 4d 41 20 70          PRAGMA p
10840 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b  age_size = 1024;
10850 0d 0a 20 20 20 20 20 20 20 20 50 52 41 47 4d 41  ..        PRAGMA
10860 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 32 30   cache_size = 20
10870 30 30 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  00;..      }....
10880 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69        return [li
10890 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  st \..          
108a0 5b 73 71 6c 20 65 78 65 63 75 74 65 20 2d 65 78  [sql execute -ex
108b0 65 63 75 74 65 20 73 63 61 6c 61 72 20 24 64 62  ecute scalar $db
108c0 20 22 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69   "PRAGMA page_si
108d0 7a 65 3b 22 5d 20 5c 0d 0a 20 20 20 20 20 20 20  ze;"] \..       
108e0 20 20 20 5b 73 71 6c 20 65 78 65 63 75 74 65 20     [sql execute 
108f0 2d 65 78 65 63 75 74 65 20 73 63 61 6c 61 72 20  -execute scalar 
10900 24 64 62 20 22 50 52 41 47 4d 41 20 63 61 63 68  $db "PRAGMA cach
10910 65 5f 73 69 7a 65 3b 22 5d 5d 0d 0a 20 20 20 20  e_size;"]]..    
10920 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 65  }.....    proc e
10930 78 74 72 61 63 74 53 79 73 74 65 6d 44 61 74 61  xtractSystemData
10940 53 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 4d  SQLiteExceptionM
10950 65 73 73 61 67 65 20 7b 20 76 61 6c 75 65 20 7d  essage { value }
10960 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
10970 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68     # NOTE: If th
10980 65 20 73 74 72 69 6e 67 20 63 6f 6e 66 6f 72 6d  e string conform
10990 73 20 74 6f 20 66 6f 72 6d 61 74 20 6f 66 20 74  s to format of t
109a0 68 65 20 6e 6f 72 6d 61 6c 20 65 78 63 65 70 74  he normal except
109b0 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ion..      #    
109c0 20 20 20 65 72 72 6f 72 20 73 74 72 69 6e 67 73     error strings
109d0 2c 20 65 78 74 72 61 63 74 20 61 6e 64 20 72 65  , extract and re
109e0 74 75 72 6e 20 6f 6e 6c 79 20 74 68 65 20 65 72  turn only the er
109f0 72 6f 72 20 6d 65 73 73 61 67 65 0d 0a 20 20 20  ror message..   
10a00 20 20 20 23 20 20 20 20 20 20 20 70 6f 72 74 69     #       porti
10a10 6f 6e 20 69 74 73 65 6c 66 2e 0d 0a 20 20 20 20  on itself...    
10a20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 70    #..      set p
10a30 61 74 74 65 72 6e 73 20 5b 6c 69 73 74 20 5c 0d  atterns [list \.
10a40 0a 20 20 20 20 20 20 7b 53 79 73 74 65 6d 5c 2e  .      {System\.
10a50 44 61 74 61 5c 2e 53 51 4c 69 74 65 5c 2e 53 51  Data\.SQLite\.SQ
10a60 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 20 5c 28  LiteException \(
10a70 30 78 38 30 30 30 34 30 30 35 5c 29 3a 20 28 2e  0x80004005\): (.
10a80 2b 3f 29 20 20 28 3f 3a 20 29 3f 61 74 7d 20 5c  +?)  (?: )?at} \
10a90 0d 0a 20 20 20 20 20 20 7b 53 79 73 74 65 6d 5c  ..      {System\
10aa0 2e 44 61 74 61 5c 2e 53 51 4c 69 74 65 5c 2e 53  .Data\.SQLite\.S
10ab0 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 3a 20  QLiteException: 
10ac0 28 2e 2b 3f 29 20 20 28 3f 3a 20 29 3f 61 74 7d  (.+?)  (?: )?at}
10ad0 5d 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65 61  ]....      forea
10ae0 63 68 20 70 61 74 74 65 72 6e 20 24 70 61 74 74  ch pattern $patt
10af0 65 72 6e 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  erns {..        
10b00 69 66 20 7b 5b 72 65 67 65 78 70 20 2d 2d 20 24  if {[regexp -- $
10b10 70 61 74 74 65 72 6e 20 24 76 61 6c 75 65 20 64  pattern $value d
10b20 75 6d 6d 79 20 6d 65 73 73 61 67 65 5d 7d 20 74  ummy message]} t
10b30 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
10b40 20 73 65 74 20 6d 65 73 73 61 67 65 20 5b 73 74   set message [st
10b50 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20 5c  ring map [list \
10b60 72 5c 6e 20 5c 6e 5d 20 5b 73 74 72 69 6e 67 20  r\n \n] [string 
10b70 74 72 69 6d 20 24 6d 65 73 73 61 67 65 5d 5d 0d  trim $message]].
10b80 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6c  .          set l
10b90 69 6e 65 73 20 5b 73 70 6c 69 74 20 24 6d 65 73  ines [split $mes
10ba0 73 61 67 65 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  sage \n]....    
10bb0 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67        if {[lleng
10bc0 74 68 20 24 6c 69 6e 65 73 5d 20 3d 3d 20 32 7d  th $lines] == 2}
10bd0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
10be0 20 20 20 20 20 69 66 20 7b 5b 6c 69 6e 64 65 78       if {[lindex
10bf0 20 24 6c 69 6e 65 73 20 30 5d 20 65 71 20 5b 6c   $lines 0] eq [l
10c00 69 6e 64 65 78 20 24 6c 69 6e 65 73 20 31 5d 7d  index $lines 1]}
10c10 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
10c20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c         return [l
10c30 69 6e 64 65 78 20 24 6c 69 6e 65 73 20 30 5d 0d  index $lines 0].
10c40 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
10c50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
10c60 74 75 72 6e 20 5b 61 70 70 65 6e 64 41 72 67 73  turn [appendArgs
10c70 20 5b 6c 69 6e 64 65 78 20 24 6c 69 6e 65 73 20   [lindex $lines 
10c80 30 5d 20 22 20 2d 2d 20 22 20 5b 6c 69 6e 64 65  0] " -- " [linde
10c90 78 20 24 6c 69 6e 65 73 20 31 5d 5d 0d 0a 20 20  x $lines 1]]..  
10ca0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
10cb0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 6d         return $m
10cc0 65 73 73 61 67 65 0d 0a 20 20 20 20 20 20 20 20  essage..        
10cd0 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
10ce0 20 20 20 20 72 65 74 75 72 6e 20 24 76 61 6c 75      return $valu
10cf0 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  e..    }.....   
10d00 20 70 72 6f 63 20 74 72 69 6d 53 71 6c 20 7b 20   proc trimSql { 
10d10 73 71 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 72  sql } {..      r
10d20 65 74 75 72 6e 20 5b 72 65 67 73 75 62 20 2d 61  eturn [regsub -a
10d30 6c 6c 20 2d 2d 20 7b 5c 73 2b 7d 20 5b 73 74 72  ll -- {\s+} [str
10d40 69 6e 67 20 74 72 69 6d 20 24 73 71 6c 5d 20 22  ing trim $sql] "
10d50 20 22 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20   "]..    }..... 
10d60 20 20 20 70 72 6f 63 20 65 78 65 63 75 74 65 53     proc executeS
10d70 71 6c 20 7b 20 73 71 6c 20 7b 65 78 65 63 75 74  ql { sql {execut
10d80 65 20 6e 6f 6e 65 7d 20 7b 66 6f 72 6d 61 74 20  e none} {format 
10d90 6e 6f 6e 65 7d 20 7b 66 69 6c 65 4e 61 6d 65 20  none} {fileName 
10da0 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69  ""} } {..      i
10db0 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
10dc0 68 20 24 66 69 6c 65 4e 61 6d 65 5d 20 3d 3d 20  h $fileName] == 
10dd0 30 7d 20 74 68 65 6e 20 7b 73 65 74 20 66 69 6c  0} then {set fil
10de0 65 4e 61 6d 65 20 3a 6d 65 6d 6f 72 79 3a 7d 0d  eName :memory:}.
10df0 0a 20 20 20 20 20 20 73 65 74 75 70 44 62 20 24  .      setupDb $
10e00 66 69 6c 65 4e 61 6d 65 20 22 22 20 22 22 20 22  fileName "" "" "
10e10 22 20 22 22 20 22 22 20 66 61 6c 73 65 20 66 61  " "" "" false fa
10e20 6c 73 65 20 66 61 6c 73 65 20 66 61 6c 73 65 20  lse false false 
10e30 64 62 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20  db true....     
10e40 20 74 72 79 20 7b 0d 0a 20 20 20 20 20 20 20 20   try {..        
10e50 72 65 74 75 72 6e 20 5b 75 70 6c 65 76 65 6c 20  return [uplevel 
10e60 31 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20  1 [list \..     
10e70 20 20 20 20 20 20 20 73 71 6c 20 65 78 65 63 75         sql execu
10e80 74 65 20 2d 65 78 65 63 75 74 65 20 24 65 78 65  te -execute $exe
10e90 63 75 74 65 20 2d 66 6f 72 6d 61 74 20 24 66 6f  cute -format $fo
10ea0 72 6d 61 74 20 24 64 62 20 24 73 71 6c 5d 5d 0d  rmat $db $sql]].
10eb0 0a 20 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79  .      } finally
10ec0 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6c 65 61   {..        clea
10ed0 6e 75 70 44 62 20 24 66 69 6c 65 4e 61 6d 65 20  nupDb $fileName 
10ee0 64 62 20 66 61 6c 73 65 20 66 61 6c 73 65 20 66  db false false f
10ef0 61 6c 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  alse..      }.. 
10f00 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
10f10 63 20 68 61 73 4e 6f 46 6c 61 67 73 20 7b 20 76  c hasNoFlags { v
10f20 61 72 4e 61 6d 65 20 6e 6f 6e 65 20 7d 20 7b 0d  arName none } {.
10f30 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24  .      upvar 1 $
10f40 76 61 72 4e 61 6d 65 20 66 6c 61 67 73 0d 0a 0d  varName flags...
10f50 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66  .      if {![inf
10f60 6f 20 65 78 69 73 74 73 20 66 6c 61 67 73 5d 7d  o exists flags]}
10f70 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
10f80 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20   return true..  
10f90 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69      }....      i
10fa0 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
10fb0 68 20 24 66 6c 61 67 73 5d 20 3d 3d 20 30 7d 20  h $flags] == 0} 
10fc0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
10fd0 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20  return true..   
10fe0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
10ff0 20 7b 24 6e 6f 6e 65 20 26 26 20 24 66 6c 61 67   {$none && $flag
11000 73 20 65 71 20 22 4e 6f 6e 65 22 7d 20 74 68 65  s eq "None"} the
11010 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  n {..        ret
11020 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
11030 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
11040 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a  n false..    }..
11050 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 43  ...    proc getC
11060 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 20 7b  onnectionFlags {
11070 20 66 69 6c 65 4e 61 6d 65 20 66 6c 61 67 73 20   fileName flags 
11080 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20  {quiet false} } 
11090 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
110a0 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65    # NOTE: Figure
110b0 20 6f 75 74 20 77 68 69 63 68 20 64 61 74 61 62   out which datab
110c0 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 6f 72  ase file name or
110d0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69   connection stri
110e0 6e 67 20 74 68 65 73 65 0d 0a 20 20 20 20 20 20  ng these..      
110f0 23 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69  #       connecti
11100 6f 6e 20 66 6c 61 67 73 20 77 69 6c 6c 20 61 63  on flags will ac
11110 74 75 61 6c 6c 79 20 61 70 70 6c 79 20 74 6f 2e  tually apply to.
11120 20 20 54 68 69 73 20 69 73 20 6e 6f 74 20 6e 65    This is not ne
11130 63 65 73 73 61 72 79 0d 0a 20 20 20 20 20 20 23  cessary..      #
11140 20 20 20 20 20 20 20 69 6e 20 71 75 69 65 74 20         in quiet 
11150 6d 6f 64 65 20 62 65 63 61 75 73 65 20 74 68 69  mode because thi
11160 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
11170 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 6c   only used for l
11180 6f 67 67 69 6e 67 0d 0a 20 20 20 20 20 20 23 20  ogging..      # 
11190 20 20 20 20 20 20 61 6e 64 20 72 65 70 6f 72 74        and report
111a0 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 0d 0a 20  ing purposes... 
111b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
111c0 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
111d0 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  {..        if {[
111e0 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66  string length $f
111f0 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68  ileName] > 0} th
11200 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
11210 73 65 74 20 64 61 74 61 62 61 73 65 20 5b 61 70  set database [ap
11220 70 65 6e 64 41 72 67 73 20 22 66 69 6c 65 20 6e  pendArgs "file n
11230 61 6d 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d  ame \"" $fileNam
11240 65 20 5c 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d  e \"]..        }
11250 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65   elseif {[info e
11260 78 69 73 74 73 20 3a 3a 64 61 74 61 53 6f 75 72  xists ::dataSour
11270 63 65 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  ce] && \..      
11280 20 20 20 20 20 20 21 5b 61 72 72 61 79 20 65 78        ![array ex
11290 69 73 74 73 20 3a 3a 64 61 74 61 53 6f 75 72 63  ists ::dataSourc
112a0 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
112b0 20 20 20 20 20 20 73 65 74 20 64 61 74 61 62 61        set databa
112c0 73 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  se [appendArgs "
112d0 64 61 74 61 20 73 6f 75 72 63 65 20 5c 22 22 20  data source \"" 
112e0 24 3a 3a 64 61 74 61 53 6f 75 72 63 65 20 5c 22  $::dataSource \"
112f0 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  ]..        } els
11300 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  e {..          s
11310 65 74 20 64 61 74 61 62 61 73 65 20 3c 75 6e 6b  et database <unk
11320 6e 6f 77 6e 3e 0d 0a 20 20 20 20 20 20 20 20 7d  nown>..        }
11330 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
11340 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
11350 54 45 3a 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f  TE: Show (and lo
11360 67 29 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e  g) the local con
11370 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 61 6e  nection flags an
11380 64 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  d the associated
11390 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
113a0 64 61 74 61 20 73 6f 75 72 63 65 20 6f 72 20 66  data source or f
113b0 69 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20  ile name...     
113c0 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24   #..      if {!$
113d0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
113e0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
113f0 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d  o exists ::no(em
11400 69 74 4c 6f 63 61 6c 46 6c 61 67 73 29 5d 20 26  itLocalFlags)] &
11410 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
11420 20 28 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   (![info exists 
11430 3a 3a 6e 6f 28 65 6d 69 74 4c 6f 63 61 6c 46 6c  ::no(emitLocalFl
11440 61 67 73 49 66 4e 6f 6e 65 29 5d 20 7c 7c 20 5c  agsIfNone)] || \
11450 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 21  ..             !
11460 5b 68 61 73 4e 6f 46 6c 61 67 73 20 66 6c 61 67  [hasNoFlags flag
11470 73 20 66 61 6c 73 65 5d 29 7d 20 74 68 65 6e 20  s false])} then 
11480 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
11490 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
114a0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
114b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
114c0 22 2d 2d 2d 2d 20 6c 6f 63 61 6c 20 63 6f 6e 6e  "---- local conn
114d0 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 66 6f 72  ection flags for
114e0 20 22 20 24 64 61 74 61 62 61 73 65 20 5c 0d 0a   " $database \..
114f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
11500 61 72 65 3a 20 22 20 5b 65 78 70 72 20 7b 21 5b  are: " [expr {![
11510 68 61 73 4e 6f 46 6c 61 67 73 20 66 6c 61 67 73  hasNoFlags flags
11520 20 66 61 6c 73 65 5d 20 3f 20 5c 0d 0a 20 20 20   false] ? \..   
11530 20 20 20 20 20 20 20 20 20 20 20 5b 61 70 70 65             [appe
11540 6e 64 41 72 67 73 20 5c 22 20 24 66 6c 61 67 73  ndArgs \" $flags
11550 20 5c 22 5d 20 3a 20 22 3c 6e 6f 6e 65 3e 22 7d   \"] : "<none>"}
11560 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d  ] \n]..        }
11570 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
11580 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
11590 54 45 3a 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f  TE: Show (and lo
115a0 67 29 20 74 68 65 20 73 68 61 72 65 64 20 63 6f  g) the shared co
115b0 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 2e 0d  nnection flags..
115c0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
115d0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
115e0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
115f0 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
11600 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
11610 6b 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  ke System.Data.S
11620 51 4c 69 74 65 2e 53 51 4c 69 74 65 43 6f 6e 6e  QLite.SQLiteConn
11630 65 63 74 69 6f 6e 20 53 68 61 72 65 64 46 6c 61  ection SharedFla
11640 67 73 0d 0a 20 20 20 20 20 20 20 20 7d 20 73 68  gs..        } sh
11650 61 72 65 64 46 6c 61 67 73 5d 20 3d 3d 20 30 7d  aredFlags] == 0}
11660 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
11670 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
11680 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 53 68  ists ::no(emitSh
11690 61 72 65 64 46 6c 61 67 73 29 5d 20 26 26 20 5c  aredFlags)] && \
116a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
116b0 28 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  (![info exists :
116c0 3a 6e 6f 28 65 6d 69 74 53 68 61 72 65 64 46 6c  :no(emitSharedFl
116d0 61 67 73 49 66 4e 6f 6e 65 29 5d 20 7c 7c 20 5c  agsIfNone)] || \
116e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
116f0 20 21 5b 68 61 73 4e 6f 46 6c 61 67 73 20 73 68   ![hasNoFlags sh
11700 61 72 65 64 46 6c 61 67 73 20 74 72 75 65 5d 29  aredFlags true])
11710 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
11720 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
11730 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
11740 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
11750 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
11760 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63 74 69   shared connecti
11770 6f 6e 20 66 6c 61 67 73 20 66 6f 72 20 22 20 24  on flags for " $
11780 64 61 74 61 62 61 73 65 20 5c 0d 0a 20 20 20 20  database \..    
11790 20 20 20 20 20 20 20 20 20 20 20 20 22 20 61 72              " ar
117a0 65 3a 20 22 20 5b 65 78 70 72 20 7b 21 5b 68 61  e: " [expr {![ha
117b0 73 4e 6f 46 6c 61 67 73 20 73 68 61 72 65 64 46  sNoFlags sharedF
117c0 6c 61 67 73 20 74 72 75 65 5d 20 3f 20 5c 0d 0a  lags true] ? \..
117d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117e0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24  [appendArgs \" $
117f0 73 68 61 72 65 64 46 6c 61 67 73 20 5c 22 5d 20  sharedFlags \"] 
11800 3a 20 22 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d  : "<none>"}] \n]
11810 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
11820 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
11830 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
11840 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
11850 6f 28 65 6d 69 74 53 68 61 72 65 64 46 6c 61 67  o(emitSharedFlag
11860 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  s)] && \..      
11870 20 20 20 20 20 20 20 20 21 5b 69 6e 66 6f 20 65          ![info e
11880 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 53  xists ::no(emitS
11890 68 61 72 65 64 46 6c 61 67 73 49 66 55 6e 61 76  haredFlagsIfUnav
118a0 61 69 6c 61 62 6c 65 29 5d 7d 20 74 68 65 6e 20  ailable)]} then 
118b0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
118c0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
118d0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
118e0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
118f0 20 20 20 20 22 2d 2d 2d 2d 20 73 68 61 72 65 64      "---- shared
11900 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67   connection flag
11910 73 20 66 6f 72 20 22 20 24 64 61 74 61 62 61 73  s for " $databas
11920 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
11930 20 20 20 20 20 22 20 61 72 65 3a 20 3c 75 6e 61       " are: <una
11940 76 61 69 6c 61 62 6c 65 3e 5c 6e 22 5d 0d 0a 20  vailable>\n"].. 
11950 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
11960 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
11970 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
11980 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 28 61   # NOTE: Show (a
11990 6e 64 20 6c 6f 67 29 20 74 68 65 20 64 65 74 65  nd log) the dete
119a0 63 74 65 64 20 67 6c 6f 62 61 6c 20 63 6f 6e 6e  cted global conn
119b0 65 63 74 69 6f 6e 20 66 6c 61 67 73 2c 20 69 66  ection flags, if
119c0 20 61 6e 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a   any...      #..
119d0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
119e0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
119f0 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
11a00 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 47 6c  ists ::no(emitGl
11a10 6f 62 61 6c 46 6c 61 67 73 29 5d 20 26 26 20 5c  obalFlags)] && \
11a20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 21  ..            (!
11a30 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
11a40 6f 28 65 6d 69 74 47 6c 6f 62 61 6c 46 6c 61 67  o(emitGlobalFlag
11a50 73 49 66 4e 6f 6e 65 29 5d 20 7c 7c 20 5c 0d 0a  sIfNone)] || \..
11a60 20 20 20 20 20 20 20 20 20 20 20 20 20 21 5b 68               ![h
11a70 61 73 4e 6f 46 6c 61 67 73 20 3a 3a 63 6f 6e 6e  asNoFlags ::conn
11a80 65 63 74 69 6f 6e 5f 66 6c 61 67 73 20 66 61 6c  ection_flags fal
11a90 73 65 5d 29 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  se])} then {..  
11aa0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
11ab0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
11ac0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
11ad0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
11ae0 20 67 6c 6f 62 61 6c 20 63 6f 6e 6e 65 63 74 69   global connecti
11af0 6f 6e 20 66 6c 61 67 73 20 61 72 65 3a 20 22 20  on flags are: " 
11b00 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
11b10 20 5b 65 78 70 72 20 7b 21 5b 68 61 73 4e 6f 46   [expr {![hasNoF
11b20 6c 61 67 73 20 3a 3a 63 6f 6e 6e 65 63 74 69 6f  lags ::connectio
11b30 6e 5f 66 6c 61 67 73 20 66 61 6c 73 65 5d 20 3f  n_flags false] ?
11b40 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
11b50 20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22    [appendArgs \"
11b60 20 24 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66   $::connection_f
11b70 6c 61 67 73 20 5c 22 5d 20 3a 20 22 3c 6e 6f 6e  lags \"] : "<non
11b80 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20  e>"}] \n]..     
11b90 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
11ba0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
11bb0 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 72 65  # NOTE: If there
11bc0 20 61 72 65 20 61 6e 79 20 67 6c 6f 62 61 6c 20   are any global 
11bd0 28 70 65 72 20 74 65 73 74 20 72 75 6e 29 20 63  (per test run) c
11be0 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20  onnection flags 
11bf0 63 75 72 72 65 6e 74 6c 79 0d 0a 20 20 20 20 20  currently..     
11c00 20 23 20 20 20 20 20 20 20 73 65 74 2c 20 75 73   #       set, us
11c10 65 20 74 68 65 6d 20 6e 6f 77 20 28 69 2e 65 2e  e them now (i.e.
11c20 20 62 79 20 63 6f 6d 62 69 6e 69 6e 67 20 74 68   by combining th
11c30 65 6d 20 77 69 74 68 20 74 68 65 20 6f 6e 65 73  em with the ones
11c40 20 66 6f 72 20 74 68 69 73 0d 0a 20 20 20 20 20   for this..     
11c50 20 23 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74   #       connect
11c60 69 6f 6e 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ion)...      #..
11c70 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
11c80 65 78 69 73 74 73 20 3a 3a 63 6f 6e 6e 65 63 74  exists ::connect
11c90 69 6f 6e 5f 66 6c 61 67 73 5d 7d 20 74 68 65 6e  ion_flags]} then
11ca0 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
11cb0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
11cc0 6f 6d 62 69 6e 65 20 61 6e 64 2f 6f 72 20 72 65  ombine and/or re
11cd0 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 6e 65 63  place the connec
11ce0 74 69 6f 6e 20 66 6c 61 67 73 20 61 6e 64 20 74  tion flags and t
11cf0 68 65 6e 20 73 68 6f 77 20 74 68 65 0d 0a 20 20  hen show the..  
11d00 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 65        #       ne
11d10 77 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20  w value...      
11d20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74    #..        set
11d30 20 66 6c 61 67 73 20 5b 63 6f 6d 62 69 6e 65 46   flags [combineF
11d40 6c 61 67 73 20 24 66 6c 61 67 73 20 24 3a 3a 63  lags $flags $::c
11d50 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73 5d  onnection_flags]
11d60 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
11d70 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
11d80 68 6f 77 20 28 61 6e 64 20 6c 6f 67 29 20 74 68  how (and log) th
11d90 65 20 6e 65 77 20 65 66 66 65 63 74 69 76 65 20  e new effective 
11da0 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
11db0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
11dc0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
11dd0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
11de0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
11df0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74  exists ::no(emit
11e00 43 6f 6d 62 69 6e 65 64 46 6c 61 67 73 29 5d 20  CombinedFlags)] 
11e10 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
11e20 20 20 20 20 28 21 5b 69 6e 66 6f 20 65 78 69 73      (![info exis
11e30 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 43 6f 6d 62  ts ::no(emitComb
11e40 69 6e 65 64 46 6c 61 67 73 49 66 4e 6f 6e 65 29  inedFlagsIfNone)
11e50 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] || \..        
11e60 20 20 20 20 20 20 20 21 5b 68 61 73 4e 6f 46 6c         ![hasNoFl
11e70 61 67 73 20 66 6c 61 67 73 20 66 61 6c 73 65 5d  ags flags false]
11e80 29 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  )} then {..     
11e90 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
11ea0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
11eb0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
11ec0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
11ed0 2d 20 63 6f 6d 62 69 6e 65 64 20 63 6f 6e 6e 65  - combined conne
11ee0 63 74 69 6f 6e 20 66 6c 61 67 73 20 66 6f 72 20  ction flags for 
11ef0 22 20 24 64 61 74 61 62 61 73 65 20 5c 0d 0a 20  " $database \.. 
11f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
11f10 20 61 72 65 3a 20 22 20 5b 65 78 70 72 20 7b 21   are: " [expr {!
11f20 5b 68 61 73 4e 6f 46 6c 61 67 73 20 66 6c 61 67  [hasNoFlags flag
11f30 73 20 66 61 6c 73 65 5d 20 3f 20 5c 0d 0a 20 20  s false] ? \..  
11f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 61                [a
11f50 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24 66 6c  ppendArgs \" $fl
11f60 61 67 73 20 5c 22 5d 20 3a 20 22 3c 6e 6f 6e 65  ags \"] : "<none
11f70 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  >"}] \n]..      
11f80 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
11f90 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
11fa0 20 20 20 72 65 74 75 72 6e 20 24 66 6c 61 67 73     return $flags
11fb0 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
11fc0 70 72 6f 63 20 67 65 74 46 6c 61 67 73 50 72 6f  proc getFlagsPro
11fd0 70 65 72 74 79 20 7b 20 7b 66 6c 61 67 73 20 22  perty { {flags "
11fe0 22 7d 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d  "} {quiet false}
11ff0 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
12000 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 65 74       # NOTE: Det
12010 65 72 6d 69 6e 65 20 77 68 61 74 20 74 68 65 20  ermine what the 
12020 63 6f 6d 62 69 6e 65 64 20 28 67 6c 6f 62 61 6c  combined (global
12030 20 61 6e 64 20 6c 6f 63 61 6c 29 20 63 6f 6e 6e   and local) conn
12040 65 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20  ection..      # 
12050 20 20 20 20 20 20 66 6c 61 67 73 20 73 68 6f 75        flags shou
12060 6c 64 20 62 65 2c 20 70 6f 73 73 69 62 6c 79 20  ld be, possibly 
12070 71 75 69 65 74 6c 79 2e 0d 0a 20 20 20 20 20 20  quietly...      
12080 23 0d 0a 20 20 20 20 20 20 73 65 74 20 66 6c 61  #..      set fla
12090 67 73 20 5b 67 65 74 43 6f 6e 6e 65 63 74 69 6f  gs [getConnectio
120a0 6e 46 6c 61 67 73 20 22 22 20 24 66 6c 61 67 73  nFlags "" $flags
120b0 20 24 71 75 69 65 74 5d 0d 0a 0d 0a 20 20 20 20   $quiet]....    
120c0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
120d0 45 3a 20 49 66 20 6e 6f 20 67 6c 6f 62 61 6c 20  E: If no global 
120e0 6f 72 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74  or local connect
120f0 69 6f 6e 20 66 6c 61 67 73 20 77 65 72 65 20 73  ion flags were s
12100 70 65 63 69 66 69 65 64 2c 20 74 68 65 0d 0a 20  pecified, the.. 
12110 20 20 20 20 20 23 20 20 20 20 20 20 20 64 65 66       #       def
12120 61 75 6c 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ault connection 
12130 66 6c 61 67 73 20 73 68 6f 75 6c 64 20 62 65 20  flags should be 
12140 75 73 65 64 3b 20 74 68 65 72 65 66 6f 72 65 2c  used; therefore,
12150 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 23   return..      #
12160 20 20 20 20 20 20 20 61 6e 20 65 6d 70 74 79 20         an empty 
12170 73 74 72 69 6e 67 20 69 6e 20 74 68 61 74 20 63  string in that c
12180 61 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ase...      #.. 
12190 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
121a0 20 6c 65 6e 67 74 68 20 24 66 6c 61 67 73 5d 20   length $flags] 
121b0 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
121c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d        return "".
121d0 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
121e0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
121f0 45 3a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 63  E: In order to c
12200 68 65 63 6b 20 69 66 20 74 68 65 20 64 65 66 61  heck if the defa
12210 75 6c 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  ult connection f
12220 6c 61 67 73 20 61 72 65 20 62 65 69 6e 67 20 75  lags are being u
12230 73 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20  sed..      #    
12240 20 20 20 69 74 20 69 73 20 6e 65 63 65 73 73 61     it is necessa
12250 72 79 20 74 6f 20 61 74 74 65 6d 70 74 20 61 20  ry to attempt a 
12260 63 6f 6e 76 65 72 73 69 6f 6e 20 74 6f 20 74 68  conversion to th
12270 65 20 61 63 74 75 61 6c 20 65 6e 75 6d 65 72 61  e actual enumera
12280 74 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ted..      #    
12290 20 20 20 74 79 70 65 2e 20 20 46 61 69 6c 69 6e     type.  Failin
122a0 67 20 74 68 61 74 2c 20 74 68 65 20 63 68 65 63  g that, the chec
122b0 6b 20 61 67 61 69 6e 73 74 20 74 68 65 20 64 65  k against the de
122c0 66 61 75 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c  fault value will
122d0 20 62 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20   be..      #    
122e0 20 20 20 73 6b 69 70 70 65 64 2e 0d 0a 20 20 20     skipped...   
122f0 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
12300 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
12310 20 20 73 65 74 20 65 72 72 6f 72 20 6e 75 6c 6c    set error null
12320 3b 20 23 20 49 47 4e 4f 52 45 44 0d 0a 0d 0a 20  ; # IGNORED.... 
12330 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
12340 76 6f 6b 65 20 55 74 69 6c 69 74 79 20 54 72 79  voke Utility Try
12350 50 61 72 73 65 46 6c 61 67 73 45 6e 75 6d 20 22  ParseFlagsEnum "
12360 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
12370 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
12380 69 74 65 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63  ite.SQLiteConnec
12390 74 69 6f 6e 46 6c 61 67 73 20 22 22 20 24 66 6c  tionFlags "" $fl
123a0 61 67 73 20 6e 75 6c 6c 20 74 72 75 65 20 5c 0d  ags null true \.
123b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72 75  .            tru
123c0 65 20 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 7d  e error..      }
123d0 20 76 61 6c 75 65 5d 7d 20 74 68 65 6e 20 7b 0d   value]} then {.
123e0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
123f0 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
12400 6d 70 74 69 6e 67 20 74 6f 20 70 61 72 73 65 20  mpting to parse 
12410 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  the connection f
12420 6c 61 67 73 20 63 61 75 73 65 64 20 61 20 73 63  lags caused a sc
12430 72 69 70 74 0d 0a 20 20 20 20 20 20 20 20 23 20  ript..        # 
12440 20 20 20 20 20 20 65 72 72 6f 72 2e 20 20 45 6d        error.  Em
12450 69 74 20 61 20 77 61 72 6e 69 6e 67 20 74 6f 20  it a warning to 
12460 74 68 65 20 74 65 73 74 20 6c 6f 67 20 66 69 6c  the test log fil
12470 65 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65 0d 0a  e and continue..
12480 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
12490 75 73 69 6e 67 20 61 6e 20 65 6d 74 70 79 20 73  using an emtpy s
124a0 74 72 69 6e 67 20 69 6e 73 74 65 61 64 2e 0d 0a  tring instead...
124b0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
124c0 20 20 20 74 6c 6f 67 20 5b 61 70 70 65 6e 64 41     tlog [appendA
124d0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
124e0 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
124f0 3a 20 66 61 69 6c 65 64 20 74 6f 20 70 61 72 73  : failed to pars
12500 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61  e connection fla
12510 67 73 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a  gs, error: " \..
12520 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74              \n\t
12530 20 24 76 61 6c 75 65 20 5c 6e 5d 0d 0a 0d 0a 20   $value \n].... 
12540 20 20 20 20 20 20 20 73 65 74 20 76 61 6c 75 65         set value
12550 20 22 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a   ""..      }....
12560 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
12570 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 63 6f   NOTE: If the co
12580 6d 62 69 6e 65 64 20 66 6c 61 67 73 20 73 74 72  mbined flags str
12590 69 6e 67 20 63 6f 75 6c 64 20 6e 6f 74 20 61 63  ing could not ac
125a0 74 75 61 6c 6c 79 20 62 65 20 63 6f 6e 76 65 72  tually be conver
125b0 74 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ted..      #    
125c0 20 20 20 74 6f 20 74 68 65 20 65 6e 75 6d 65 72     to the enumer
125d0 61 74 65 64 20 74 79 70 65 20 69 74 20 69 73 20  ated type it is 
125e0 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  the default valu
125f0 65 2c 20 74 68 65 6e 20 6a 75 73 74 20 75 73 65  e, then just use
12600 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
12610 69 74 20 76 65 72 62 61 74 69 6d 3b 20 6f 74 68  it verbatim; oth
12620 65 72 77 69 73 65 2c 20 6a 75 73 74 20 72 65 74  erwise, just ret
12630 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72  urn an empty str
12640 69 6e 67 2e 20 20 49 6e 20 74 68 61 74 0d 0a 20  ing.  In that.. 
12650 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61 73       #       cas
12660 65 2c 20 74 68 65 20 64 65 66 61 75 6c 74 20 63  e, the default c
12670 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20  onnection flags 
12680 77 69 6c 6c 20 62 65 20 75 73 65 64 2e 0d 0a 20  will be used... 
12690 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
126a0 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
126b0 20 24 76 61 6c 75 65 5d 20 3d 3d 20 30 20 7c 7c   $value] == 0 ||
126c0 20 24 76 61 6c 75 65 20 6e 65 20 22 44 65 66 61   $value ne "Defa
126d0 75 6c 74 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ult"} then {..  
126e0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
126f0 20 23 20 57 41 52 4e 49 4e 47 3a 20 54 68 69 73   # WARNING: This
12700 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 74 72   returns the str
12710 69 6e 67 20 76 61 6c 75 65 20 6f 66 20 74 68 65  ing value of the
12720 20 63 6f 6d 62 69 6e 65 64 20 66 6c 61 67 73 2c   combined flags,
12730 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20 23 20   not..        # 
12740 20 20 20 20 20 20 20 20 20 74 68 65 20 65 6e 75           the enu
12750 6d 65 72 61 74 65 64 20 76 61 6c 75 65 2e 20 20  merated value.  
12760 54 68 69 73 20 69 73 20 62 79 20 64 65 73 69 67  This is by desig
12770 6e 20 61 6e 64 20 73 68 6f 75 6c 64 20 6e 6f 74  n and should not
12780 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
12790 20 20 20 20 20 62 65 20 63 68 61 6e 67 65 64 20       be changed 
127a0 77 69 74 68 6f 75 74 20 63 61 72 65 66 75 6c 20  without careful 
127b0 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20 28 65  consideration (e
127c0 2e 67 2e 20 69 74 20 77 6f 75 6c 64 0d 0a 20 20  .g. it would..  
127d0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
127e0 20 70 72 65 76 65 6e 74 20 74 68 65 20 53 51 4c   prevent the SQL
127f0 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 63 6c  iteConnection cl
12800 61 73 73 20 66 72 6f 6d 20 61 6c 6c 6f 77 69 6e  ass from allowin
12810 67 20 69 6e 76 61 6c 69 64 0d 0a 20 20 20 20 20  g invalid..     
12820 20 20 20 23 20 20 20 20 20 20 20 20 20 20 5b 22     #          ["
12830 6d 61 67 69 63 61 6c 22 5d 20 6d 65 74 61 2d 66  magical"] meta-f
12840 6c 61 67 73 29 2e 0d 0a 20 20 20 20 20 20 20 20  lags)...        
12850 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
12860 6e 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 46  n [appendArgs "F
12870 6c 61 67 73 3d 22 20 24 66 6c 61 67 73 20 5c 3b  lags=" $flags \;
12880 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ]..      }....  
12890 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20      return "".. 
128a0 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
128b0 63 20 65 6e 61 62 6c 65 53 68 61 72 65 64 43 61  c enableSharedCa
128c0 63 68 65 20 7b 20 63 68 61 6e 6e 65 6c 20 65 6e  che { channel en
128d0 61 62 6c 65 20 7b 71 75 69 65 74 20 66 61 6c 73  able {quiet fals
128e0 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66  e} } {..      if
128f0 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
12900 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
12910 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
12920 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
12930 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
12940 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69  QLite.UnsafeNati
12950 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20  veMethods \..   
12960 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
12970 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63  _enable_shared_c
12980 61 63 68 65 20 5b 65 78 70 72 20 69 6e 74 28 24  ache [expr int($
12990 65 6e 61 62 6c 65 29 5d 0d 0a 20 20 20 20 20 20  enable)]..      
129a0 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20  } result] == 0} 
129b0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
129c0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
129d0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
129e0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
129f0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
12a00 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
12a10 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 65 6e   call sqlite3_en
12a20 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68  able_shared_cach
12a30 65 28 22 20 24 65 6e 61 62 6c 65 20 5c 0d 0a 20  e(" $enable \.. 
12a40 20 20 20 20 20 20 20 20 20 20 20 20 20 22 29 2e               ").
12a50 2e 2e 20 6f 6b 3a 20 22 20 24 72 65 73 75 6c 74  .. ok: " $result
12a60 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d   \n]..        }.
12a70 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
12a80 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71  .        if {!$q
12a90 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
12aa0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
12ab0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
12ac0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
12ad0 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73      "---- call s
12ae0 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68  qlite3_enable_sh
12af0 61 72 65 64 5f 63 61 63 68 65 28 22 20 24 65 6e  ared_cache(" $en
12b00 61 62 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  able \..        
12b10 20 20 20 20 20 20 22 29 2e 2e 2e 20 65 72 72 6f        ")... erro
12b20 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c  r: " \n\t $resul
12b30 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d  t \n]..        }
12b40 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
12b50 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 65  .....    proc se
12b60 74 75 70 44 62 20 7b 0d 0a 20 20 20 20 20 20 20  tupDb {..       
12b70 20 20 20 20 20 66 69 6c 65 4e 61 6d 65 20 7b 6d       fileName {m
12b80 6f 64 65 20 22 22 7d 20 7b 64 61 74 65 54 69 6d  ode ""} {dateTim
12b90 65 46 6f 72 6d 61 74 20 22 22 7d 20 7b 64 61 74  eFormat ""} {dat
12ba0 65 54 69 6d 65 4b 69 6e 64 20 22 22 7d 20 7b 66  eTimeKind ""} {f
12bb0 6c 61 67 73 20 22 22 7d 0d 0a 20 20 20 20 20 20  lags ""}..      
12bc0 20 20 20 20 20 20 7b 65 78 74 72 61 20 22 22 7d        {extra ""}
12bd0 20 7b 71 75 61 6c 69 66 79 20 74 72 75 65 7d 20   {qualify true} 
12be0 7b 64 65 6c 65 74 65 20 74 72 75 65 7d 20 7b 75  {delete true} {u
12bf0 72 69 20 66 61 6c 73 65 7d 0d 0a 20 20 20 20 20  ri false}..     
12c00 20 20 20 20 20 20 20 7b 74 65 6d 70 6f 72 61 72         {temporar
12c10 79 20 74 72 75 65 7d 20 7b 76 61 72 4e 61 6d 65  y true} {varName
12c20 20 64 62 7d 20 7b 71 75 69 65 74 20 66 61 6c 73   db} {quiet fals
12c30 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e} } {..      #.
12c40 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46  .      # NOTE: F
12c50 69 72 73 74 2c 20 73 65 65 20 69 66 20 6f 75 72  irst, see if our
12c60 20 63 61 6c 6c 65 72 20 68 61 73 20 72 65 71 75   caller has requ
12c70 65 73 74 65 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ested an in-memo
12c80 72 79 20 64 61 74 61 62 61 73 65 2e 0d 0a 20 20  ry database...  
12c90 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
12ca0 20 69 73 4d 65 6d 6f 72 79 20 5b 69 73 4d 65 6d   isMemory [isMem
12cb0 6f 72 79 44 62 20 24 66 69 6c 65 4e 61 6d 65 5d  oryDb $fileName]
12cc0 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
12cd0 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 6e     # NOTE: For n
12ce0 6f 77 2c 20 61 6c 6c 20 74 65 73 74 20 64 61 74  ow, all test dat
12cf0 61 62 61 73 65 73 20 75 73 65 64 20 62 79 20 74  abases used by t
12d00 68 65 20 74 65 73 74 20 73 75 69 74 65 20 61 72  he test suite ar
12d10 65 20 70 6c 61 63 65 64 0d 0a 20 20 20 20 20 20  e placed..      
12d20 23 20 20 20 20 20 20 20 69 6e 74 6f 20 74 68 65  #       into the
12d30 20 64 61 74 61 62 61 73 65 20 64 69 72 65 63 74   database direct
12d40 6f 72 79 2e 20 20 45 61 63 68 20 64 61 74 61 62  ory.  Each datab
12d50 61 73 65 20 61 6e 64 20 72 65 6c 61 74 65 64 20  ase and related 
12d60 66 69 6c 65 73 0d 0a 20 20 20 20 20 20 23 20 20  files..      #  
12d70 20 20 20 20 20 75 73 65 64 20 62 79 20 61 20 74       used by a t
12d80 65 73 74 20 73 68 6f 75 6c 64 20 62 65 20 63 6c  est should be cl
12d90 65 61 6e 65 64 20 75 70 20 62 79 20 74 68 61 74  eaned up by that
12da0 20 74 65 73 74 20 75 73 69 6e 67 20 74 68 65 0d   test using the.
12db0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22  .      #       "
12dc0 63 6c 65 61 6e 75 70 44 62 22 20 70 72 6f 63 65  cleanupDb" proce
12dd0 64 75 72 65 2c 20 62 65 6c 6f 77 2e 0d 0a 20 20  dure, below...  
12de0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
12df0 7b 21 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24  {!$isMemory && $
12e00 71 75 61 6c 69 66 79 7d 20 74 68 65 6e 20 7b 0d  qualify} then {.
12e10 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c  .        set fil
12e20 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  eName [file join
12e30 20 5b 67 65 74 44 61 74 61 62 61 73 65 44 69 72   [getDatabaseDir
12e40 65 63 74 6f 72 79 5d 20 5b 66 69 6c 65 20 74 61  ectory] [file ta
12e50 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a  il $fileName]]..
12e60 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
12e70 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
12e80 3a 20 42 79 20 64 65 66 61 75 6c 74 2c 20 64 65  : By default, de
12e90 6c 65 74 65 20 61 6e 79 20 70 72 65 2d 65 78 69  lete any pre-exi
12ea0 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20 77  sting database w
12eb0 69 74 68 20 74 68 65 20 73 61 6d 65 20 66 69 6c  ith the same fil
12ec0 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
12ed0 20 6e 61 6d 65 20 69 66 20 69 74 20 63 75 72 72   name if it curr
12ee0 65 6e 74 6c 79 20 65 78 69 73 74 73 2e 0d 0a 20  ently exists... 
12ef0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
12f00 20 7b 21 24 69 73 4d 65 6d 6f 72 79 20 26 26 20   {!$isMemory && 
12f10 24 64 65 6c 65 74 65 20 26 26 20 5b 66 69 6c 65  $delete && [file
12f20 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d   exists $fileNam
12f30 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
12f40 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
12f50 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
12f60 6f 20 64 65 6c 65 74 65 20 61 6e 79 20 70 72 65  o delete any pre
12f70 2d 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61  -existing databa
12f80 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  se with the same
12f90 20 66 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 23   file..        #
12fa0 20 20 20 20 20 20 20 6e 61 6d 65 2e 0d 0a 20 20         name...  
12fb0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
12fc0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 66 69 6c   if {[catch {fil
12fd0 65 20 64 65 6c 65 74 65 20 24 66 69 6c 65 4e 61  e delete $fileNa
12fe0 6d 65 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e  me} error]} then
12ff0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
13000 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
13010 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20 66 61  E: We somehow fa
13020 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 74  iled to delete t
13030 68 65 20 66 69 6c 65 2c 20 72 65 70 6f 72 74 20  he file, report 
13040 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  why...          
13050 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  #..          if 
13060 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
13070 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
13080 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
13090 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
130a0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
130b0 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
130c0 3a 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65  : failed to dele
130d0 74 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  te database file
130e0 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c   \"" $fileName \
130f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
13100 20 20 22 5c 22 20 64 75 72 69 6e 67 20 73 65 74    "\" during set
13110 75 70 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  up, error: " \n\
13120 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20  t $error \n]..  
13130 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
13140 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
13150 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
13160 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f  # NOTE: Refer to
13170 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76   the specified v
13180 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64  ariable (e.g. "d
13190 62 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  b") in the conte
131a0 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20  xt of our..     
131b0 20 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e   #       caller.
131c0 20 20 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20    The handle to 
131d0 74 68 65 20 6f 70 65 6e 65 64 20 64 61 74 61 62  the opened datab
131e0 61 73 65 20 77 69 6c 6c 20 62 65 20 73 74 6f 72  ase will be stor
131f0 65 64 20 74 68 65 72 65 2e 0d 0a 20 20 20 20 20  ed there...     
13200 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20   #..      upvar 
13210 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d  1 $varName db...
13220 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
13230 23 20 4e 4f 54 45 3a 20 53 74 61 72 74 20 62 75  # NOTE: Start bu
13240 69 6c 64 69 6e 67 20 74 68 65 20 63 6f 6e 6e 65  ilding the conne
13250 63 74 69 6f 6e 20 73 74 72 69 6e 67 2e 20 20 54  ction string.  T
13260 68 65 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 64  he only required
13270 20 70 6f 72 74 69 6f 6e 0d 0a 20 20 20 20 20 20   portion..      
13280 23 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63  #       of the c
13290 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67  onnection string
132a0 20 69 73 20 74 68 65 20 64 61 74 61 20 73 6f 75   is the data sou
132b0 72 63 65 2c 20 77 68 69 63 68 20 63 6f 6e 74 61  rce, which conta
132c0 69 6e 73 20 74 68 65 0d 0a 20 20 20 20 20 20 23  ins the..      #
132d0 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
132e0 66 69 6c 65 20 6e 61 6d 65 20 69 74 73 65 6c 66  file name itself
132f0 2e 20 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72  .  If our caller
13300 20 77 61 6e 74 73 20 74 6f 20 75 73 65 20 61 20   wants to use a 
13310 55 52 49 20 61 73 0d 0a 20 20 20 20 20 20 23 20  URI as..      # 
13320 20 20 20 20 20 20 74 68 65 20 64 61 74 61 20 73        the data s
13330 6f 75 72 63 65 2c 20 75 73 65 20 74 68 65 20 46  ource, use the F
13340 75 6c 6c 55 72 69 20 63 6f 6e 6e 65 63 74 69 6f  ullUri connectio
13350 6e 20 73 74 72 69 6e 67 20 70 72 6f 70 65 72 74  n string propert
13360 79 20 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20  y to..      #   
13370 20 20 20 20 70 72 65 76 65 6e 74 20 74 68 65 20      prevent the 
13380 64 61 74 61 20 73 6f 75 72 63 65 20 73 74 72 69  data source stri
13390 6e 67 20 66 72 6f 6d 20 62 65 69 6e 67 20 6d 61  ng from being ma
133a0 6e 67 6c 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d  ngled...      #.
133b0 0a 20 20 20 20 20 20 69 66 20 7b 24 75 72 69 7d  .      if {$uri}
133c0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
133d0 20 73 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   set connection 
133e0 7b 46 75 6c 6c 55 72 69 3d 24 7b 66 69 6c 65 4e  {FullUri=${fileN
133f0 61 6d 65 7d 7d 0d 0a 20 20 20 20 20 20 7d 20 65  ame}}..      } e
13400 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  lse {..        s
13410 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 44  et connection {D
13420 61 74 61 20 53 6f 75 72 63 65 3d 24 7b 66 69 6c  ata Source=${fil
13430 65 4e 61 6d 65 7d 7d 0d 0a 20 20 20 20 20 20 7d  eName}}..      }
13440 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
13450 20 20 20 23 20 4e 4f 54 45 3a 20 53 69 6e 63 65     # NOTE: Since
13460 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   this procedure 
13470 68 61 73 20 6e 6f 20 73 70 65 63 69 61 6c 20 6b  has no special k
13480 6e 6f 77 6c 65 64 67 65 20 6f 66 20 77 68 61 74  nowledge of what
13490 20 74 68 65 20 64 65 66 61 75 6c 74 0d 0a 20 20   the default..  
134a0 20 20 20 20 23 20 20 20 20 20 20 20 73 65 74 74      #       sett
134b0 69 6e 67 20 69 73 20 66 6f 72 20 74 68 65 20 54  ing is for the T
134c0 6f 46 75 6c 6c 50 61 74 68 20 63 6f 6e 6e 65 63  oFullPath connec
134d0 74 69 6f 6e 20 73 74 72 69 6e 67 20 70 72 6f 70  tion string prop
134e0 65 72 79 2c 20 61 6c 77 61 79 73 0d 0a 20 20 20  ery, always..   
134f0 20 20 20 23 20 20 20 20 20 20 20 61 64 64 20 74     #       add t
13500 68 65 20 76 61 6c 75 65 20 77 65 20 6b 6e 6f 77  he value we know
13510 20 61 62 6f 75 74 20 74 6f 20 74 68 65 20 63 6f   about to the co
13520 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 2e  nnection string.
13530 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
13540 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69   append connecti
13550 6f 6e 20 7b 3b 54 6f 46 75 6c 6c 50 61 74 68 3d  on {;ToFullPath=
13560 24 7b 71 75 61 6c 69 66 79 7d 7d 0d 0a 0d 0a 20  ${qualify}}.... 
13570 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
13580 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20 63 61 6c  NOTE: If our cal
13590 6c 65 72 20 73 70 65 63 69 66 69 65 64 20 61 20  ler specified a 
135a0 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 61 64  journal mode, ad
135b0 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  d the necessary 
135c0 70 6f 72 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23  portion..      #
135d0 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f         of the co
135e0 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20  nnection string 
135f0 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  now...      #.. 
13600 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
13610 20 6c 65 6e 67 74 68 20 24 6d 6f 64 65 5d 20 3e   length $mode] >
13620 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
13630 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65      append conne
13640 63 74 69 6f 6e 20 7b 3b 4a 6f 75 72 6e 61 6c 20  ction {;Journal 
13650 4d 6f 64 65 3d 24 7b 6d 6f 64 65 7d 7d 0d 0a 20  Mode=${mode}}.. 
13660 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
13670 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
13680 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 73   If our caller s
13690 70 65 63 69 66 69 65 64 20 61 20 44 61 74 65 54  pecified a DateT
136a0 69 6d 65 20 66 6f 72 6d 61 74 2c 20 61 64 64 20  ime format, add 
136b0 74 68 65 20 6e 65 63 65 73 73 61 72 79 0d 0a 20  the necessary.. 
136c0 20 20 20 20 20 23 20 20 20 20 20 20 20 70 6f 72       #       por
136d0 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6e 6e  tion of the conn
136e0 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f  ection string no
136f0 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  w...      #..   
13700 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
13710 65 6e 67 74 68 20 24 64 61 74 65 54 69 6d 65 46  ength $dateTimeF
13720 6f 72 6d 61 74 5d 20 3e 20 30 7d 20 74 68 65 6e  ormat] > 0} then
13730 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65   {..        appe
13740 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b  nd connection {;
13750 44 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 3d 24  DateTimeFormat=$
13760 7b 64 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 7d  {dateTimeFormat}
13770 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
13780 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
13790 4f 54 45 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c  OTE: If our call
137a0 65 72 20 73 70 65 63 69 66 69 65 64 20 61 20 44  er specified a D
137b0 61 74 65 54 69 6d 65 4b 69 6e 64 2c 20 61 64 64  ateTimeKind, add
137c0 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 70   the necessary p
137d0 6f 72 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20  ortion..      # 
137e0 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6e        of the con
137f0 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e  nection string n
13800 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ow...      #..  
13810 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
13820 6c 65 6e 67 74 68 20 24 64 61 74 65 54 69 6d 65  length $dateTime
13830 4b 69 6e 64 5d 20 3e 20 30 7d 20 74 68 65 6e 20  Kind] > 0} then 
13840 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  {..        appen
13850 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 44  d connection {;D
13860 61 74 65 54 69 6d 65 4b 69 6e 64 3d 24 7b 64 61  ateTimeKind=${da
13870 74 65 54 69 6d 65 4b 69 6e 64 7d 7d 0d 0a 20 20  teTimeKind}}..  
13880 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
13890 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
138a0 46 69 67 75 72 65 20 6f 75 74 20 77 68 61 74 20  Figure out what 
138b0 74 68 65 20 66 69 6e 61 6c 20 66 6c 61 67 73 20  the final flags 
138c0 66 6f 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74  for this connect
138d0 69 6f 6e 20 6e 65 65 64 20 74 6f 20 62 65 2e 0d  ion need to be..
138e0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
138f0 73 65 74 20 66 6c 61 67 73 20 5b 67 65 74 43 6f  set flags [getCo
13900 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 20 24 66  nnectionFlags $f
13910 69 6c 65 4e 61 6d 65 20 24 66 6c 61 67 73 20 24  ileName $flags $
13920 71 75 69 65 74 5d 0d 0a 0d 0a 20 20 20 20 20 20  quiet]....      
13930 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
13940 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 73   If our caller s
13950 70 65 63 69 66 69 65 64 20 73 6f 6d 65 20 53 51  pecified some SQ
13960 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c  LiteConnectionFl
13970 61 67 73 2c 20 61 64 64 20 74 68 65 0d 0a 20 20  ags, add the..  
13980 20 20 20 20 23 20 20 20 20 20 20 20 6e 65 63 65      #       nece
13990 73 73 61 72 79 20 70 6f 72 74 69 6f 6e 20 6f 66  ssary portion of
139a0 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
139b0 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20  string now...   
139c0 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
139d0 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
139e0 66 6c 61 67 73 5d 20 3e 20 30 7d 20 74 68 65 6e  flags] > 0} then
139f0 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65   {..        appe
13a00 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b  nd connection {;
13a10 46 6c 61 67 73 3d 24 7b 66 6c 61 67 73 7d 7d 0d  Flags=${flags}}.
13a20 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
13a30 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
13a40 45 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72  E: If our caller
13a50 20 73 70 65 63 69 66 69 65 64 20 61 6e 20 65 78   specified an ex
13a60 74 72 61 20 70 61 79 6c 6f 61 64 20 74 6f 20 74  tra payload to t
13a70 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20  he connection.. 
13a80 20 20 20 20 20 23 20 20 20 20 20 20 20 73 74 72       #       str
13a90 69 6e 67 2c 20 61 70 70 65 6e 64 20 69 74 20 6e  ing, append it n
13aa0 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ow...      #..  
13ab0 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
13ac0 6c 65 6e 67 74 68 20 24 65 78 74 72 61 5d 20 3e  length $extra] >
13ad0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
13ae0 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65      append conne
13af0 63 74 69 6f 6e 20 5c 3b 20 24 65 78 74 72 61 0d  ction \; $extra.
13b00 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
13b10 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
13b20 45 3a 20 4f 70 65 6e 20 74 68 65 20 64 61 74 61  E: Open the data
13b30 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
13b40 6e 6f 77 2c 20 70 6c 61 63 69 6e 67 20 74 68 65  now, placing the
13b50 20 6f 70 61 71 75 65 20 68 61 6e 64 6c 65 20 76   opaque handle v
13b60 61 6c 75 65 0d 0a 20 20 20 20 20 20 23 20 20 20  alue..      #   
13b70 20 20 20 20 69 6e 74 6f 20 74 68 65 20 76 61 72      into the var
13b80 69 61 62 6c 65 20 73 70 65 63 69 66 69 65 64 20  iable specified 
13b90 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a  by our caller...
13ba0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73        #..      s
13bb0 65 74 20 64 62 20 5b 73 71 6c 20 6f 70 65 6e 20  et db [sql open 
13bc0 2d 74 79 70 65 20 53 51 4c 69 74 65 20 5b 73 75  -type SQLite [su
13bd0 62 73 74 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 5d  bst $connection]
13be0 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ]....      #..  
13bf0 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 6e 66      # NOTE: Conf
13c00 69 67 75 72 65 20 74 68 65 20 74 65 6d 70 6f 72  igure the tempor
13c10 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 66 6f  ary directory fo
13c20 72 20 74 68 65 20 6e 65 77 6c 79 20 6f 70 65 6e  r the newly open
13c30 65 64 20 64 61 74 61 62 61 73 65 0d 0a 20 20 20  ed database..   
13c40 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 6e 65     #       conne
13c50 63 74 69 6f 6e 20 6e 6f 77 20 75 6e 6c 65 73 73  ction now unless
13c60 20 6f 75 72 20 63 61 6c 6c 65 72 20 66 6f 72 62   our caller forb
13c70 69 64 73 20 69 74 2e 0d 0a 20 20 20 20 20 20 23  ids it...      #
13c80 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 74 65 6d  ..      if {$tem
13c90 70 6f 72 61 72 79 20 26 26 20 21 5b 69 6e 66 6f  porary && ![info
13ca0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 65 74   exists ::no(set
13cb0 54 65 6d 70 6f 72 61 72 79 44 69 72 65 63 74 6f  TemporaryDirecto
13cc0 72 79 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ry)]} then {..  
13cd0 20 20 20 20 20 20 73 71 6c 20 65 78 65 63 75 74        sql execut
13ce0 65 20 24 64 62 20 5b 61 70 70 65 6e 64 41 72 67  e $db [appendArg
13cf0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
13d00 20 22 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74   "PRAGMA temp_st
13d10 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  ore_directory = 
13d20 5c 22 22 20 5b 67 65 74 54 65 6d 70 6f 72 61 72  \"" [getTemporar
13d30 79 44 69 72 65 63 74 6f 72 79 5d 20 5c 22 5c 3b  yDirectory] \"\;
13d40 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ]..      }....  
13d50 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
13d60 4f 54 45 3a 20 50 65 72 66 6f 72 6d 20 61 6e 79  OTE: Perform any
13d70 20 65 78 74 72 61 20 70 65 72 2d 63 6f 6e 6e 65   extra per-conne
13d80 63 74 69 6f 6e 20 73 65 74 75 70 20 66 6f 72 20  ction setup for 
13d90 74 68 65 20 6e 65 77 6c 79 20 6f 70 65 6e 65 64  the newly opened
13da0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
13db0 64 61 74 61 62 61 73 65 20 6e 6f 77 20 75 6e 6c  database now unl
13dc0 65 73 73 20 6f 75 72 20 63 61 6c 6c 65 72 20 66  ess our caller f
13dd0 6f 72 62 69 64 73 20 69 74 2e 0d 0a 20 20 20 20  orbids it...    
13de0 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 65    #..      set e
13df0 78 65 63 75 74 65 4f 6e 53 65 74 75 70 20 5b 67  xecuteOnSetup [g
13e00 65 74 45 78 65 63 75 74 65 4f 6e 53 65 74 75 70  etExecuteOnSetup
13e10 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  ]....      if {[
13e20 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 65  string length $e
13e30 78 65 63 75 74 65 4f 6e 53 65 74 75 70 5d 20 3e  xecuteOnSetup] >
13e40 20 30 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20   0 && \..       
13e50 20 20 20 21 5b 69 6e 66 6f 20 65 78 69 73 74 73     ![info exists
13e60 20 3a 3a 6e 6f 28 65 78 65 63 75 74 65 4f 6e 53   ::no(executeOnS
13e70 65 74 75 70 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  etup)]} then {..
13e80 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
13e90 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20     # NOTE: This 
13ea0 63 6f 6d 6d 61 6e 64 20 6d 61 79 20 72 61 69 73  command may rais
13eb0 65 20 61 6e 20 65 72 72 6f 72 3b 20 69 66 20 73  e an error; if s
13ec0 6f 2c 20 74 68 61 74 20 69 73 20 66 69 6e 65 2c  o, that is fine,
13ed0 20 61 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20   as..        #  
13ee0 20 20 20 20 20 74 68 65 20 65 6e 63 6c 6f 73 69       the enclosi
13ef0 6e 67 20 74 65 73 74 20 77 69 6c 6c 20 74 68 65  ng test will the
13f00 6e 20 66 61 69 6c 2e 20 20 54 68 65 20 5b 73 75  n fail.  The [su
13f10 62 73 74 5d 20 63 6f 6d 6d 61 6e 64 20 69 73 0d  bst] command is.
13f20 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
13f30 20 75 73 65 64 20 6f 6e 20 74 68 65 20 53 51 4c   used on the SQL
13f40 20 69 6e 20 63 61 73 65 20 69 74 20 6e 65 65 64   in case it need
13f50 73 20 74 6f 20 72 65 66 65 72 20 74 6f 20 73 74  s to refer to st
13f60 61 74 65 20 69 6e 20 6f 75 72 0d 0a 20 20 20 20  ate in our..    
13f70 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74      #       cont
13f80 65 78 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ext...        #.
13f90 0a 20 20 20 20 20 20 20 20 73 71 6c 20 65 78 65  .        sql exe
13fa0 63 75 74 65 20 24 64 62 20 5b 73 75 62 73 74 20  cute $db [subst 
13fb0 24 65 78 65 63 75 74 65 4f 6e 53 65 74 75 70 5d  $executeOnSetup]
13fc0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
13fd0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
13fe0 54 45 3a 20 41 6c 77 61 79 73 20 72 65 74 75 72  TE: Always retur
13ff0 6e 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  n the connection
14000 20 68 61 6e 64 6c 65 20 75 70 6f 6e 20 73 75 63   handle upon suc
14010 63 65 73 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  cess...      #..
14020 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 64 62        return $db
14030 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
14040 70 72 6f 63 20 67 65 74 44 62 43 6f 6e 6e 65 63  proc getDbConnec
14050 74 69 6f 6e 20 7b 20 7b 76 61 72 4e 61 6d 65 20  tion { {varName 
14060 64 62 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  db} } {..      #
14070 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
14080 52 65 66 65 72 20 74 6f 20 74 68 65 20 73 70 65  Refer to the spe
14090 63 69 66 69 65 64 20 76 61 72 69 61 62 6c 65 20  cified variable 
140a0 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74  (e.g. "db") in t
140b0 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75  he context of ou
140c0 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  r..      #      
140d0 20 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 68 61   caller.  The ha
140e0 6e 64 6c 65 20 74 6f 20 74 68 65 20 64 61 74 61  ndle to the data
140f0 62 61 73 65 20 70 72 65 76 69 6f 75 73 6c 79 20  base previously 
14100 6f 70 65 6e 65 64 20 76 69 61 20 74 68 65 0d 0a  opened via the..
14110 20 20 20 20 20 20 23 20 20 20 20 20 20 20 5b 73        #       [s
14120 65 74 75 70 44 62 5d 20 70 72 6f 63 65 64 75 72  etupDb] procedur
14130 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72  e should be stor
14140 65 64 20 74 68 65 72 65 2e 0d 0a 20 20 20 20 20  ed there...     
14150 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20   #..      upvar 
14160 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d  1 $varName db...
14170 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
14180 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 72 65 74  # NOTE: This ret
14190 75 72 6e 73 20 74 68 65 20 41 44 4f 2e 4e 45 54  urns the ADO.NET
141a0 20 49 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 6f   IDbConnection o
141b0 62 6a 65 63 74 20 69 6e 73 74 61 6e 63 65 20 66  bject instance f
141c0 6f 72 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  or the..      # 
141d0 20 20 20 20 20 20 73 70 65 63 69 66 69 65 64 20        specified 
141e0 64 61 74 61 62 73 65 20 68 61 6e 64 6c 65 2e 20  databse handle. 
141f0 20 53 69 6e 63 65 20 67 65 74 74 69 6e 67 20 74   Since getting t
14200 68 69 73 20 6f 62 6a 65 63 74 20 72 65 6c 69 65  his object relie
14210 73 20 75 70 6f 6e 0d 0a 20 20 20 20 20 20 23 20  s upon..      # 
14220 20 20 20 20 20 20 45 61 67 6c 65 20 69 6e 74 65        Eagle inte
14230 72 6e 61 6c 73 2c 20 67 72 65 61 74 20 63 61 72  rnals, great car
14240 65 20 73 68 6f 75 6c 64 20 62 65 20 74 61 6b 65  e should be take
14250 6e 20 74 6f 20 61 76 6f 69 64 20 64 69 73 70 6f  n to avoid dispo
14260 73 69 6e 67 20 6f 66 0d 0a 20 20 20 20 20 20 23  sing of..      #
14270 20 20 20 20 20 20 20 74 68 69 73 20 6f 62 6a 65         this obje
14280 63 74 20 6f 72 20 6f 74 68 65 72 77 69 73 65 20  ct or otherwise 
14290 70 75 74 74 69 6e 67 20 69 74 20 69 6e 74 6f 20  putting it into 
142a0 61 6e 20 69 6e 76 61 6c 69 64 20 73 74 61 74 65  an invalid state
142b0 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
142c0 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
142d0 74 73 20 64 62 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ts db]} then {..
142e0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
142f0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
14300 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
14310 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
14320 2d 6f 62 6a 65 63 74 66 6c 61 67 73 20 2b 4e 6f  -objectflags +No
14330 44 69 73 70 6f 73 65 20 2d 61 6c 69 61 73 20 5c  Dispose -alias \
14340 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
14350 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74 41  Interpreter.GetA
14360 63 74 69 76 65 2e 63 6f 6e 6e 65 63 74 69 6f 6e  ctive.connection
14370 73 20 49 74 65 6d 20 24 64 62 0d 0a 20 20 20 20  s Item $db..    
14380 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d      } result] ==
14390 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
143a0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
143b0 20 20 20 23 20 4e 4f 54 45 3a 20 53 75 63 63 65     # NOTE: Succe
143c0 73 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6f  ss, return the o
143d0 70 61 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e  paque object han
143e0 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  dle...          
143f0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  #..          ret
14400 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20  urn $result..   
14410 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
14420 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
14430 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61        # NOTE: Fa
14440 69 6c 75 72 65 2c 20 72 65 70 6f 72 74 20 77 68  ilure, report wh
14450 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  y...          #.
14460 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
14470 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
14480 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
14490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
144a0 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
144b0 6c 65 64 20 74 6f 20 67 65 74 20 63 6f 6e 6e 65  led to get conne
144c0 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 66 6f 72  ction handle for
144d0 20 64 61 74 61 62 61 73 65 20 5c 22 22 20 5c 0d   database \"" \.
144e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24  .              $
144f0 64 62 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22  db "\", error: "
14500 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e   \n\t $result \n
14510 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
14520 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
14530 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
14540 46 61 69 6c 75 72 65 2c 20 72 65 74 75 72 6e 20  Failure, return 
14550 61 6e 20 6f 62 76 69 6f 75 73 6c 79 20 69 6e 76  an obviously inv
14560 61 6c 69 64 20 6f 70 61 71 75 65 20 6f 62 6a 65  alid opaque obje
14570 63 74 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20  ct handle...    
14580 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72    #..      retur
14590 6e 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  n ""..    }.....
145a0 20 20 20 20 70 72 6f 63 20 66 72 65 65 44 62 43      proc freeDbC
145b0 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20 7b 76 61 72  onnection { {var
145c0 4e 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 7d  Name connection}
145d0 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
145e0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66       # NOTE: Ref
145f0 65 72 20 74 6f 20 74 68 65 20 73 70 65 63 69 66  er to the specif
14600 69 65 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e  ied variable (e.
14610 67 2e 20 22 63 6f 6e 6e 65 63 74 69 6f 6e 22 29  g. "connection")
14620 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23   in the..      #
14630 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 20 6f         context o
14640 66 20 6f 75 72 20 63 61 6c 6c 65 72 2e 20 20 54  f our caller.  T
14650 68 65 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74  he opaque object
14660 20 68 61 6e 64 6c 65 20 66 6f 72 20 61 6e 20 41   handle for an A
14670 44 4f 2e 4e 45 54 0d 0a 20 20 20 20 20 20 23 20  DO.NET..      # 
14680 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e        connection
14690 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 74 75   previously retu
146a0 72 6e 65 64 20 62 79 20 5b 67 65 74 44 62 43 6f  rned by [getDbCo
146b0 6e 6e 65 63 74 69 6f 6e 5d 20 73 68 6f 75 6c 64  nnection] should
146c0 20 62 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20   be..      #    
146d0 20 20 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e     stored there.
146e0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
146f0 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d   upvar 1 $varNam
14700 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 0d 0a  e connection....
14710 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
14720 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
14730 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 6f 70 61  o remove the opa
14740 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c  que object handl
14750 65 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72  e from the inter
14760 70 72 65 74 65 72 0d 0a 20 20 20 20 20 20 23 20  preter..      # 
14770 20 20 20 20 20 20 6e 6f 77 2e 20 20 54 68 69 73        now.  This
14780 20 5b 6f 62 6a 65 63 74 20 64 69 73 70 6f 73 65   [object dispose
14790 5d 20 63 61 6c 6c 20 77 69 6c 6c 20 6e 6f 74 20  ] call will not 
147a0 61 63 74 75 61 6c 6c 79 20 64 69 73 70 6f 73 65  actually dispose
147b0 20 6f 66 20 74 68 65 0d 0a 20 20 20 20 20 20 23   of the..      #
147c0 20 20 20 20 20 20 20 75 6e 64 65 72 6c 79 69 6e         underlyin
147d0 67 20 6f 62 6a 65 63 74 20 62 65 63 61 75 73 65  g object because
147e0 20 74 68 65 20 2b 4e 6f 44 69 73 70 6f 73 65 20   the +NoDispose 
147f0 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20  flag was set on 
14800 69 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  it..      #     
14810 20 20 64 75 72 69 6e 67 20 63 72 65 61 74 69 6f    during creatio
14820 6e 20 6f 66 20 74 68 65 20 6f 70 61 71 75 65 20  n of the opaque 
14830 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 2e 0d 0a  object handle...
14840 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
14850 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
14860 63 6f 6e 6e 65 63 74 69 6f 6e 5d 20 26 26 20 5c  connection] && \
14870 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 63 61 74  ..          [cat
14880 63 68 20 7b 6f 62 6a 65 63 74 20 64 69 73 70 6f  ch {object dispo
14890 73 65 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 7d 20  se $connection} 
148a0 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a  error]} then {..
148b0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
148c0 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f     # NOTE: We so
148d0 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f 20  mehow failed to 
148e0 72 65 6d 6f 76 65 20 74 68 65 20 68 61 6e 64 6c  remove the handl
148f0 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a  e, report why...
14900 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
14910 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
14920 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
14930 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
14940 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
14950 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 72 65 6d  G: failed to rem
14960 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  ove connection h
14970 61 6e 64 6c 65 20 5c 22 22 20 24 63 6f 6e 6e 65  andle \"" $conne
14980 63 74 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20  ction \..       
14990 20 20 20 20 20 22 5c 22 2c 20 65 72 72 6f 72 3a       "\", error:
149a0 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c   " \n\t $error \
149b0 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  n]..      }..   
149c0 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
149d0 61 64 64 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20  addDbConnection 
149e0 7b 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 76 61  { connection {va
149f0 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a 20  rName db} } {.. 
14a00 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
14a10 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74  NOTE: Refer to t
14a20 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72  he specified var
14a30 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22  iable (e.g. "db"
14a40 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74  ) in the context
14a50 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23   of our..      #
14a60 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 0d 0a         caller...
14a70 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75        #..      u
14a80 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20  pvar 1 $varName 
14a90 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  db....      #.. 
14aa0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 72 65       # NOTE: Cre
14ab0 61 74 65 20 61 20 63 6f 72 72 65 63 74 6c 79 20  ate a correctly 
14ac0 66 6f 72 6d 61 74 74 65 64 20 6e 61 6d 65 20 66  formatted name f
14ad0 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
14ae0 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 0d 0a 20  connection to.. 
14af0 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65 20       #       be 
14b00 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c 69 73  added to the lis
14b10 74 20 6d 61 6e 61 67 65 64 20 62 79 20 74 68 65  t managed by the
14b20 20 45 61 67 6c 65 20 69 6e 74 65 72 70 72 65 74   Eagle interpret
14b30 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  er...      #..  
14b40 20 20 20 20 73 65 74 20 64 62 20 5b 6f 62 6a 65      set db [obje
14b50 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
14b60 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
14b70 20 20 20 20 20 20 20 20 20 45 61 67 6c 65 2e 5f           Eagle._
14b80 43 6f 6d 70 6f 6e 65 6e 74 73 2e 50 72 69 76 61  Components.Priva
14b90 74 65 2e 46 6f 72 6d 61 74 4f 70 73 20 44 61 74  te.FormatOps Dat
14ba0 61 62 61 73 65 4f 62 6a 65 63 74 4e 61 6d 65 20  abaseObjectName 
14bb0 24 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 0d 0a 20  $connection \.. 
14bc0 20 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 43           SQLiteC
14bd0 6f 6e 6e 65 63 74 69 6f 6e 20 5b 6f 62 6a 65 63  onnection [objec
14be0 74 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72  t invoke Interpr
14bf0 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 20 4e  eter.GetActive N
14c00 65 78 74 49 64 5d 5d 0d 0a 0d 0a 20 20 20 20 20  extId]]....     
14c10 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
14c20 3a 20 41 64 64 20 74 68 65 20 64 61 74 61 62 61  : Add the databa
14c30 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72  se connection pr
14c40 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20 63 61  ovided by our ca
14c50 6c 6c 65 72 20 74 6f 20 74 68 65 20 6c 69 73 74  ller to the list
14c60 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
14c70 6f 66 20 74 68 6f 73 65 20 6b 6e 6f 77 6e 20 74  of those known t
14c80 6f 20 74 68 65 20 45 61 67 6c 65 20 69 6e 74 65  o the Eagle inte
14c90 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20  rpreter...      
14ca0 23 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63 74 20  #..      object 
14cb0 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
14cc0 6f 6e 50 75 62 6c 69 63 20 49 6e 74 65 72 70 72  onPublic Interpr
14cd0 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 2e 63  eter.GetActive.c
14ce0 6f 6e 6e 65 63 74 69 6f 6e 73 20 41 64 64 20 5c  onnections Add \
14cf0 0d 0a 20 20 20 20 20 20 20 20 20 20 24 64 62 20  ..          $db 
14d00 24 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20  $connection..   
14d10 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
14d20 67 65 74 52 6f 77 73 46 72 6f 6d 44 61 74 61 54  getRowsFromDataT
14d30 61 62 6c 65 20 7b 20 64 61 74 61 54 61 62 6c 65  able { dataTable
14d40 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20   } {..      set 
14d50 72 6f 77 73 20 5b 6c 69 73 74 5d 0d 0a 20 20 20  rows [list]..   
14d60 20 20 20 73 65 74 20 63 6f 75 6e 74 20 5b 24 64     set count [$d
14d70 61 74 61 54 61 62 6c 65 20 43 6f 6c 75 6d 6e 73  ataTable Columns
14d80 2e 43 6f 75 6e 74 5d 0d 0a 0d 0a 20 20 20 20 20  .Count]....     
14d90 20 66 6f 72 20 7b 73 65 74 20 69 6e 64 65 78 20   for {set index 
14da0 30 7d 20 7b 24 69 6e 64 65 78 20 3c 20 24 63 6f  0} {$index < $co
14db0 75 6e 74 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78  unt} {incr index
14dc0 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  } {..        set
14dd0 20 64 61 74 61 43 6f 6c 75 6d 6e 20 5b 24 64 61   dataColumn [$da
14de0 74 61 54 61 62 6c 65 20 2d 61 6c 69 61 73 20 43  taTable -alias C
14df0 6f 6c 75 6d 6e 73 2e 67 65 74 5f 49 74 65 6d 20  olumns.get_Item 
14e00 24 69 6e 64 65 78 5d 0d 0a 20 20 20 20 20 20 20  $index]..       
14e10 20 73 65 74 20 6e 61 6d 65 73 28 24 69 6e 64 65   set names($inde
14e20 78 29 20 5b 24 64 61 74 61 43 6f 6c 75 6d 6e 20  x) [$dataColumn 
14e30 43 6f 6c 75 6d 6e 4e 61 6d 65 5d 0d 0a 20 20 20  ColumnName]..   
14e40 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 6f 62     }....      ob
14e50 6a 65 63 74 20 66 6f 72 65 61 63 68 20 2d 61 6c  ject foreach -al
14e60 69 61 73 20 64 61 74 61 52 6f 77 20 5b 73 65 74  ias dataRow [set
14e70 20 64 61 74 61 52 6f 77 73 20 5b 24 64 61 74 61   dataRows [$data
14e80 54 61 62 6c 65 20 52 6f 77 73 5d 5d 20 7b 0d 0a  Table Rows]] {..
14e90 20 20 20 20 20 20 20 20 73 65 74 20 72 6f 77 20          set row 
14ea0 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20  [list]....      
14eb0 20 20 66 6f 72 20 7b 73 65 74 20 69 6e 64 65 78    for {set index
14ec0 20 30 7d 20 7b 24 69 6e 64 65 78 20 3c 20 24 63   0} {$index < $c
14ed0 6f 75 6e 74 7d 20 7b 69 6e 63 72 20 69 6e 64 65  ount} {incr inde
14ee0 78 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  x} {..          
14ef0 73 65 74 20 76 61 6c 75 65 20 5b 24 64 61 74 61  set value [$data
14f00 52 6f 77 20 2d 63 72 65 61 74 65 20 2d 61 6c 69  Row -create -ali
14f10 61 73 20 67 65 74 5f 49 74 65 6d 20 24 69 6e 64  as get_Item $ind
14f20 65 78 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ex]....         
14f30 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
14f40 67 74 68 20 24 76 61 6c 75 65 5d 20 3e 20 30 20  gth $value] > 0 
14f50 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
14f60 20 20 20 20 21 5b 6f 62 6a 65 63 74 20 69 6e 76      ![object inv
14f70 6f 6b 65 20 43 6f 6e 76 65 72 74 20 49 73 44 42  oke Convert IsDB
14f80 4e 75 6c 6c 20 24 76 61 6c 75 65 5d 7d 20 74 68  Null $value]} th
14f90 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
14fa0 20 20 6c 61 70 70 65 6e 64 20 72 6f 77 20 5b 6c    lappend row [l
14fb0 69 73 74 20 24 6e 61 6d 65 73 28 24 69 6e 64 65  ist $names($inde
14fc0 78 29 20 5b 24 76 61 6c 75 65 20 54 6f 53 74 72  x) [$value ToStr
14fd0 69 6e 67 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20  ing]]..         
14fe0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
14ff0 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72         lappend r
15000 6f 77 20 5b 6c 69 73 74 20 24 6e 61 6d 65 73 28  ow [list $names(
15010 24 69 6e 64 65 78 29 5d 0d 0a 20 20 20 20 20 20  $index)]..      
15020 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
15030 0d 0a 0d 0a 20 20 20 20 20 20 20 20 6c 61 70 70  ....        lapp
15040 65 6e 64 20 72 6f 77 73 20 24 72 6f 77 0d 0a 20  end rows $row.. 
15050 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
15060 72 65 74 75 72 6e 20 24 72 6f 77 73 0d 0a 20 20  return $rows..  
15070 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
15080 20 64 75 6d 70 52 6f 77 73 46 72 6f 6d 44 61 74   dumpRowsFromDat
15090 61 54 61 62 6c 65 20 7b 20 63 68 61 6e 6e 65 6c  aTable { channel
150a0 20 72 6f 77 73 20 7d 20 7b 0d 0a 20 20 20 20 20   rows } {..     
150b0 20 73 65 74 20 73 65 71 75 65 6e 63 65 20 31 0d   set sequence 1.
150c0 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68  ...      foreach
150d0 20 72 6f 77 20 24 72 6f 77 73 20 7b 0d 0a 20 20   row $rows {..  
150e0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
150f0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
15100 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
15110 5b 65 78 70 72 20 7b 24 73 65 71 75 65 6e 63 65  [expr {$sequence
15120 20 3e 20 31 20 3f 20 22 5c 6e 22 20 3a 20 22 22   > 1 ? "\n" : ""
15130 7d 5d 20 22 2d 2d 2d 2d 20 52 4f 57 20 23 22 20  }] "---- ROW #" 
15140 24 73 65 71 75 65 6e 63 65 20 3a 5c 6e 5d 0d 0a  $sequence :\n]..
15150 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  ..        foreac
15160 68 20 70 61 69 72 20 24 72 6f 77 20 7b 0d 0a 20  h pair $row {.. 
15170 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c           if {[ll
15180 65 6e 67 74 68 20 24 70 61 69 72 5d 20 3e 3d 20  ength $pair] >= 
15190 32 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  2} then {..     
151a0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
151b0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
151c0 73 20 5c 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  s \t \..        
151d0 20 20 20 20 20 20 20 20 5b 6c 69 73 74 20 5b 6c          [list [l
151e0 69 6e 64 65 78 20 24 70 61 69 72 20 30 5d 5d 20  index $pair 0]] 
151f0 22 3a 20 22 20 5b 6c 69 73 74 20 5b 6c 69 6e 64  ": " [list [lind
15200 65 78 20 24 70 61 69 72 20 31 5d 5d 20 5c 6e 5d  ex $pair 1]] \n]
15210 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
15220 73 65 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24  seif {[llength $
15230 70 61 69 72 5d 20 3d 3d 20 31 7d 20 74 68 65 6e  pair] == 1} then
15240 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
15250 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
15260 61 70 70 65 6e 64 41 72 67 73 20 5c 74 20 5c 0d  appendArgs \t \.
15270 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15280 20 5b 6c 69 73 74 20 5b 6c 69 6e 64 65 78 20 24   [list [lindex $
15290 70 61 69 72 20 30 5d 5d 20 22 3a 20 3c 6e 75 6c  pair 0]] ": <nul
152a0 6c 3e 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  l>\n"]..        
152b0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
152c0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
152d0 68 61 6e 6e 65 6c 20 5c 74 3c 65 6d 70 74 79 3e  hannel \t<empty>
152e0 5c 6e 3b 20 23 20 4e 4f 54 45 3a 20 4e 6f 20 64  \n; # NOTE: No d
152f0 61 74 61 3f 0d 0a 20 20 20 20 20 20 20 20 20 20  ata?..          
15300 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
15310 20 20 20 20 20 20 20 20 69 6e 63 72 20 73 65 71          incr seq
15320 75 65 6e 63 65 0d 0a 20 20 20 20 20 20 7d 0d 0a  uence..      }..
15330 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
15340 6f 63 20 63 6c 65 61 6e 75 70 44 62 20 7b 20 66  oc cleanupDb { f
15350 69 6c 65 4e 61 6d 65 20 7b 76 61 72 4e 61 6d 65  ileName {varName
15360 20 64 62 7d 20 7b 63 6f 6c 6c 65 63 74 20 74 72   db} {collect tr
15370 75 65 7d 20 7b 71 75 61 6c 69 66 79 20 74 72 75  ue} {qualify tru
15380 65 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e}..            
15390 20 20 20 20 20 20 20 20 20 7b 64 65 6c 65 74 65           {delete
153a0 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20   true} } {..    
153b0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
153c0 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 66 6f  E: Attempt to fo
153d0 72 63 65 20 61 6c 6c 20 70 65 6e 64 69 6e 67 20  rce all pending 
153e0 22 67 61 72 62 61 67 65 22 20 6f 62 6a 65 63 74  "garbage" object
153f0 73 20 74 6f 20 62 65 20 63 6f 6c 6c 65 63 74 65  s to be collecte
15400 64 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  d,..      #     
15410 20 20 69 6e 63 6c 75 64 69 6e 67 20 53 51 4c 69    including SQLi
15420 74 65 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6e  te statements an
15430 64 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73  d backup objects
15440 3b 20 74 68 69 73 20 73 68 6f 75 6c 64 20 61 6c  ; this should al
15450 6c 6f 77 0d 0a 20 20 20 20 20 20 23 20 20 20 20  low..      #    
15460 20 20 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e     the underlyin
15470 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
15480 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 0d 0a  to be deleted...
15490 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
154a0 66 20 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65  f {$collect} the
154b0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c  n {..        col
154c0 6c 65 63 74 47 61 72 62 61 67 65 20 24 3a 3a 74  lectGarbage $::t
154d0 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20  est_channel..   
154e0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
154f0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
15500 65 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63  efer to the spec
15510 69 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28  ified variable (
15520 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68  e.g. "db") in th
15530 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72  e context of our
15540 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
15550 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 68 61 6e  caller.  The han
15560 64 6c 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  dle to the datab
15570 61 73 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6f  ase previously o
15580 70 65 6e 65 64 20 76 69 61 20 74 68 65 0d 0a 20  pened via the.. 
15590 20 20 20 20 20 23 20 20 20 20 20 20 20 5b 73 65       #       [se
155a0 74 75 70 44 62 5d 20 70 72 6f 63 65 64 75 72 65  tupDb] procedure
155b0 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65   should be store
155c0 64 20 74 68 65 72 65 2e 0d 0a 20 20 20 20 20 20  d there...      
155d0 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31  #..      upvar 1
155e0 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a   $varName db....
155f0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
15600 20 4e 4f 54 45 3a 20 43 6c 6f 73 65 20 74 68 65   NOTE: Close the
15610 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74   connection to t
15620 68 65 20 64 61 74 61 62 61 73 65 20 6e 6f 77 2e  he database now.
15630 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 61 6c    This should al
15640 6c 6f 77 20 75 73 0d 0a 20 20 20 20 20 20 23 20  low us..      # 
15650 20 20 20 20 20 20 74 6f 20 64 65 6c 65 74 65 20        to delete 
15660 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  the underlying d
15670 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0d 0a 20  atabase file... 
15680 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
15690 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 64   {[info exists d
156a0 62 5d 20 26 26 20 5b 63 61 74 63 68 20 7b 73 71  b] && [catch {sq
156b0 6c 20 63 6c 6f 73 65 20 24 64 62 7d 20 65 72 72  l close $db} err
156c0 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
156d0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
156e0 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68  # NOTE: We someh
156f0 6f 77 20 66 61 69 6c 65 64 20 74 6f 20 63 6c 6f  ow failed to clo
15700 73 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  se the database,
15710 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20   report why...  
15720 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
15730 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
15740 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
15750 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
15760 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
15770 20 66 61 69 6c 65 64 20 74 6f 20 63 6c 6f 73 65   failed to close
15780 20 64 61 74 61 62 61 73 65 20 5c 22 22 20 24 64   database \"" $d
15790 62 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20  b "\", error: " 
157a0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5c  \..            \
157b0 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a  n\t $error \n]..
157c0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
157d0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
157e0 3a 20 46 69 72 73 74 2c 20 73 65 65 20 69 66 20  : First, see if 
157f0 6f 75 72 20 63 61 6c 6c 65 72 20 68 61 73 20 72  our caller has r
15800 65 71 75 65 73 74 65 64 20 61 6e 20 69 6e 2d 6d  equested an in-m
15810 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0d  emory database..
15820 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
15830 73 65 74 20 69 73 4d 65 6d 6f 72 79 20 5b 69 73  set isMemory [is
15840 4d 65 6d 6f 72 79 44 62 20 24 66 69 6c 65 4e 61  MemoryDb $fileNa
15850 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  me]....      #..
15860 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75        # NOTE: Bu
15870 69 6c 64 20 74 68 65 20 66 75 6c 6c 20 70 61 74  ild the full pat
15880 68 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  h to the databas
15890 65 20 66 69 6c 65 20 6e 61 6d 65 2e 20 20 46 6f  e file name.  Fo
158a0 72 20 6e 6f 77 2c 20 61 6c 6c 20 74 65 73 74 0d  r now, all test.
158b0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64  .      #       d
158c0 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 61 72  atabase files ar
158d0 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
158e0 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
158f0 6f 72 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ory...      #.. 
15900 20 20 20 20 20 69 66 20 7b 21 24 69 73 4d 65 6d       if {!$isMem
15910 6f 72 79 20 26 26 20 24 71 75 61 6c 69 66 79 7d  ory && $qualify}
15920 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
15930 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66   set fileName [f
15940 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 44 61 74  ile join [getDat
15950 61 62 61 73 65 44 69 72 65 63 74 6f 72 79 5d 20  abaseDirectory] 
15960 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65  [file tail $file
15970 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d  Name]]..      }.
15980 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
15990 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
159a0 69 66 20 74 68 65 20 66 69 6c 65 20 73 74 69 6c  if the file stil
159b0 6c 20 65 78 69 73 74 73 2e 0d 0a 20 20 20 20 20  l exists...     
159c0 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24   #..      if {!$
159d0 69 73 4d 65 6d 6f 72 79 20 26 26 20 24 64 65 6c  isMemory && $del
159e0 65 74 65 20 26 26 20 5b 66 69 6c 65 20 65 78 69  ete && [file exi
159f0 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20  sts $fileName]} 
15a00 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
15a10 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
15a20 45 3a 20 53 6b 69 70 20 64 65 6c 65 74 69 6e 67  E: Skip deleting
15a30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
15a40 69 66 20 73 6f 6d 65 62 6f 64 79 20 73 65 74 73  if somebody sets
15a50 20 74 68 65 20 67 6c 6f 62 61 6c 0d 0a 20 20 20   the global..   
15a60 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61 72       #       var
15a70 69 61 62 6c 65 20 74 6f 20 70 72 65 76 65 6e 74  iable to prevent
15a80 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d   it...        #.
15a90 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69  .        if {![i
15aa0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
15ab0 63 6c 65 61 6e 75 70 44 62 46 69 6c 65 29 5d 7d  cleanupDbFile)]}
15ac0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
15ad0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
15ae0 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
15af0 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  to delete the te
15b00 73 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  st database file
15b10 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 20   now...         
15b20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   #..          if
15b30 20 7b 5b 73 65 74 20 63 6f 64 65 20 5b 63 61 74   {[set code [cat
15b40 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20  ch {file delete 
15b50 24 66 69 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72  $fileName} error
15b60 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
15b70 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
15b80 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57         # NOTE: W
15b90 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64  e somehow failed
15ba0 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 66   to delete the f
15bb0 69 6c 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e  ile, report why.
15bc0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
15bd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
15be0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
15bf0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
15c00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
15c10 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
15c20 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74   failed to delet
15c30 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
15c40 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d  \"" $fileName \.
15c50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15c60 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c 65 61   "\" during clea
15c70 6e 75 70 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e  nup, error: " \n
15c80 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20  \t $error \n].. 
15c90 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
15ca0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
15cb0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
15cc0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f       # NOTE: Sho
15cd0 77 20 74 68 61 74 20 77 65 20 73 6b 69 70 70 65  w that we skippe
15ce0 64 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66  d deleting the f
15cf0 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ile...          
15d00 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  #..          set
15d10 20 63 6f 64 65 20 30 0d 0a 0d 0a 20 20 20 20 20   code 0....     
15d20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
15d30 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
15d40 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
15d50 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
15d60 52 4e 49 4e 47 3a 20 73 6b 69 70 70 65 64 20 64  RNING: skipped d
15d70 65 6c 65 74 69 6e 67 20 64 61 74 61 62 61 73 65  eleting database
15d80 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e   file \"" $fileN
15d90 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
15da0 20 20 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20       "\" during 
15db0 63 6c 65 61 6e 75 70 5c 6e 22 5d 0d 0a 20 20 20  cleanup\n"]..   
15dc0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20       }..      } 
15dd0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
15de0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
15df0 45 3a 20 54 68 65 20 66 69 6c 65 20 64 6f 65 73  E: The file does
15e00 20 6e 6f 74 20 65 78 69 73 74 2c 20 73 75 63 63   not exist, succ
15e10 65 73 73 21 0d 0a 20 20 20 20 20 20 20 20 23 0d  ess!..        #.
15e20 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 64  .        set cod
15e30 65 20 30 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  e 0..      }....
15e40 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 63 6f        return $co
15e50 64 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  de..    }.....  
15e60 20 20 70 72 6f 63 20 73 61 76 65 45 6e 76 69 72    proc saveEnvir
15e70 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20  onmentVariables 
15e80 7b 20 6e 61 6d 65 73 20 7b 76 61 72 4e 61 6d 65  { names {varName
15e90 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20   ""} } {..      
15ea0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
15eb0 20 46 6f 72 20 65 61 63 68 20 6e 61 6d 65 2c 20   For each name, 
15ec0 64 6f 65 73 20 74 68 65 20 6c 69 76 65 20 65 6e  does the live en
15ed0 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62  vironment variab
15ee0 6c 65 20 65 78 69 73 74 3f 20 20 49 66 0d 0a 20  le exist?  If.. 
15ef0 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6f 2c       #       so,
15f00 20 73 61 76 65 20 74 68 65 20 76 61 6c 75 65 20   save the value 
15f10 66 6f 72 20 6c 61 74 65 72 3b 20 6f 74 68 65 72  for later; other
15f20 77 69 73 65 2c 20 6d 61 6b 65 20 73 75 72 65 20  wise, make sure 
15f30 74 68 65 20 73 61 76 65 64 0d 0a 20 20 20 20 20  the saved..     
15f40 20 23 20 20 20 20 20 20 20 76 61 6c 75 65 20 64   #       value d
15f50 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 65 69  oes not exist ei
15f60 74 68 65 72 2e 20 20 54 68 65 20 6c 69 76 65 20  ther.  The live 
15f70 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69  environment vari
15f80 61 62 6c 65 73 0d 0a 20 20 20 20 20 20 23 20 20  ables..      #  
15f90 20 20 20 20 20 41 52 45 20 4e 4f 54 20 63 68 61       ARE NOT cha
15fa0 6e 67 65 64 20 62 79 20 74 68 69 73 20 70 72 6f  nged by this pro
15fb0 63 65 64 75 72 65 2e 0d 0a 20 20 20 20 20 20 23  cedure...      #
15fc0 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
15fd0 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 72 4e  ing length $varN
15fe0 61 6d 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ame] == 0} then 
15ff0 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 76  {..        set v
16000 61 72 4e 61 6d 65 20 73 61 76 65 64 45 6e 76 0d  arName savedEnv.
16010 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
16020 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
16030 6d 65 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20  me savedEnv.... 
16040 20 20 20 20 20 66 6f 72 65 61 63 68 20 6e 61 6d       foreach nam
16050 65 20 24 6e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  e $names {..    
16060 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
16070 69 73 74 73 20 3a 3a 65 6e 76 28 24 6e 61 6d 65  ists ::env($name
16080 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
16090 20 20 20 20 20 20 73 65 74 20 73 61 76 65 64 45        set savedE
160a0 6e 76 28 24 6e 61 6d 65 29 20 24 3a 3a 65 6e 76  nv($name) $::env
160b0 28 24 6e 61 6d 65 29 0d 0a 20 20 20 20 20 20 20  ($name)..       
160c0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
160d0 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f       unset -noco
160e0 6d 70 6c 61 69 6e 20 73 61 76 65 64 45 6e 76 28  mplain savedEnv(
160f0 24 6e 61 6d 65 29 0d 0a 20 20 20 20 20 20 20 20  $name)..        
16100 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
16110 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
16120 4f 54 45 3a 20 54 68 69 73 20 69 73 20 73 65 6c  OTE: This is sel
16130 66 2d 63 6c 65 61 6e 69 6e 67 2e 20 20 49 66 20  f-cleaning.  If 
16140 6e 6f 20 73 61 76 65 64 20 65 6e 76 69 72 6f 6e  no saved environ
16150 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 73 20 6e  ment variables n
16160 6f 77 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ow..      #     
16170 20 20 65 78 69 73 74 2c 20 72 65 6d 6f 76 65 20    exist, remove 
16180 74 68 65 20 61 72 72 61 79 2e 0d 0a 20 20 20 20  the array...    
16190 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
161a0 61 72 72 61 79 20 73 69 7a 65 20 73 61 76 65 64  array size saved
161b0 45 6e 76 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  Env] == 0} then 
161c0 7b 0d 0a 20 20 20 20 20 20 20 20 75 6e 73 65 74  {..        unset
161d0 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 73 61 76   -nocomplain sav
161e0 65 64 45 6e 76 0d 0a 20 20 20 20 20 20 7d 0d 0a  edEnv..      }..
161f0 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
16200 6f 63 20 72 65 73 74 6f 72 65 45 6e 76 69 72 6f  oc restoreEnviro
16210 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20 7b  nmentVariables {
16220 20 6e 61 6d 65 73 20 7b 76 61 72 4e 61 6d 65 20   names {varName 
16230 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ""} } {..      #
16240 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
16250 46 6f 72 20 65 61 63 68 20 6e 61 6d 65 2c 20 64  For each name, d
16260 6f 65 73 20 74 68 65 20 73 61 76 65 64 20 65 6e  oes the saved en
16270 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62  vironment variab
16280 6c 65 20 65 78 69 73 74 3f 20 20 49 66 0d 0a 20  le exist?  If.. 
16290 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6f 2c       #       so,
162a0 20 72 65 73 74 6f 72 65 20 74 68 65 20 73 61 76   restore the sav
162b0 65 64 20 76 61 6c 75 65 20 61 6e 64 20 75 6e 73  ed value and uns
162c0 65 74 20 69 74 3b 20 6f 74 68 65 72 77 69 73 65  et it; otherwise
162d0 2c 20 6d 61 6b 65 20 73 75 72 65 0d 0a 20 20 20  , make sure..   
162e0 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 6c     #       the l
162f0 69 76 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  ive environment 
16300 76 61 72 69 61 62 6c 65 20 64 6f 65 73 20 6e 6f  variable does no
16310 74 20 65 78 69 73 74 20 65 69 74 68 65 72 20 28  t exist either (
16320 69 2e 65 2e 20 69 74 0d 0a 20 20 20 20 20 20 23  i.e. it..      #
16330 20 20 20 20 20 20 20 77 61 73 20 6e 6f 74 20 73         was not s
16340 65 74 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68  et to begin with
16350 29 2e 20 20 42 6f 74 68 20 73 61 76 65 64 20 61  ).  Both saved a
16360 6e 64 20 6c 69 76 65 20 65 6e 76 69 72 6f 6e 6d  nd live environm
16370 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ent..      #    
16380 20 20 20 76 61 72 69 61 62 6c 65 73 20 41 52 45     variables ARE
16390 20 63 68 61 6e 67 65 64 20 62 79 20 74 68 69 73   changed by this
163a0 20 70 72 6f 63 65 64 75 72 65 2e 0d 0a 20 20 20   procedure...   
163b0 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
163c0 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
163d0 76 61 72 4e 61 6d 65 5d 20 3d 3d 20 30 7d 20 74  varName] == 0} t
163e0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  hen {..        s
163f0 65 74 20 76 61 72 4e 61 6d 65 20 73 61 76 65 64  et varName saved
16400 45 6e 76 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  Env..      }....
16410 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76        upvar 1 $v
16420 61 72 4e 61 6d 65 20 73 61 76 65 64 45 6e 76 0d  arName savedEnv.
16430 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68  ...      foreach
16440 20 6e 61 6d 65 20 24 6e 61 6d 65 73 20 7b 0d 0a   name $names {..
16450 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66          if {[inf
16460 6f 20 65 78 69 73 74 73 20 73 61 76 65 64 45 6e  o exists savedEn
16470 76 28 24 6e 61 6d 65 29 5d 7d 20 74 68 65 6e 20  v($name)]} then 
16480 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
16490 20 3a 3a 65 6e 76 28 24 6e 61 6d 65 29 20 24 73   ::env($name) $s
164a0 61 76 65 64 45 6e 76 28 24 6e 61 6d 65 29 0d 0a  avedEnv($name)..
164b0 20 20 20 20 20 20 20 20 20 20 75 6e 73 65 74 20            unset 
164c0 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 73 61 76 65  -nocomplain save
164d0 64 45 6e 76 28 24 6e 61 6d 65 29 0d 0a 20 20 20  dEnv($name)..   
164e0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
164f0 20 20 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d           unset -
16500 6e 6f 63 6f 6d 70 6c 61 69 6e 20 3a 3a 65 6e 76  nocomplain ::env
16510 28 24 6e 61 6d 65 29 0d 0a 20 20 20 20 20 20 20  ($name)..       
16520 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
16530 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
16540 4e 4f 54 45 3a 20 54 68 69 73 20 69 73 20 73 65  NOTE: This is se
16550 6c 66 2d 63 6c 65 61 6e 69 6e 67 2e 20 20 49 66  lf-cleaning.  If
16560 20 6e 6f 20 73 61 76 65 64 20 65 6e 76 69 72 6f   no saved enviro
16570 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 73 20  nment variables 
16580 6e 6f 77 0d 0a 20 20 20 20 20 20 23 20 20 20 20  now..      #    
16590 20 20 20 65 78 69 73 74 2c 20 72 65 6d 6f 76 65     exist, remove
165a0 20 74 68 65 20 61 72 72 61 79 2e 0d 0a 20 20 20   the array...   
165b0 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
165c0 5b 61 72 72 61 79 20 73 69 7a 65 20 73 61 76 65  [array size save
165d0 64 45 6e 76 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  dEnv] == 0} then
165e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 6e 73 65   {..        unse
165f0 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 73 61  t -nocomplain sa
16600 76 65 64 45 6e 76 0d 0a 20 20 20 20 20 20 7d 0d  vedEnv..      }.
16610 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
16620 72 6f 63 20 73 61 76 65 53 51 4c 69 74 65 43 6f  roc saveSQLiteCo
16630 6e 6e 65 63 74 69 6f 6e 45 6e 76 69 72 6f 6e 6d  nnectionEnvironm
16640 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  ent {} {..      
16650 75 70 76 61 72 20 31 20 73 61 76 65 64 45 6e 76  upvar 1 savedEnv
16660 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20   savedEnv....   
16670 20 20 20 73 61 76 65 45 6e 76 69 72 6f 6e 6d 65     saveEnvironme
16680 6e 74 56 61 72 69 61 62 6c 65 73 20 5b 6c 69 73  ntVariables [lis
16690 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 44  t \..          D
166a0 65 66 61 75 6c 74 46 6c 61 67 73 5f 53 51 4c 69  efaultFlags_SQLi
166b0 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 4e 6f 5f  teConnection No_
166c0 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
166d0 4e 65 77 50 61 72 73 65 72 5d 20 5c 0d 0a 20 20  NewParser] \..  
166e0 20 20 20 20 20 20 20 20 73 61 76 65 64 45 6e 76          savedEnv
166f0 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
16700 70 72 6f 63 20 72 65 73 74 6f 72 65 53 51 4c 69  proc restoreSQLi
16710 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 45 6e 76 69  teConnectionEnvi
16720 72 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20  ronment {} {..  
16730 20 20 20 20 75 70 76 61 72 20 31 20 73 61 76 65      upvar 1 save
16740 64 45 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d  dEnv savedEnv...
16750 0a 20 20 20 20 20 20 72 65 73 74 6f 72 65 45 6e  .      restoreEn
16760 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c  vironmentVariabl
16770 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20  es [list \..    
16780 20 20 20 20 20 20 44 65 66 61 75 6c 74 46 6c 61        DefaultFla
16790 67 73 5f 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74  gs_SQLiteConnect
167a0 69 6f 6e 20 4e 6f 5f 53 51 4c 69 74 65 43 6f 6e  ion No_SQLiteCon
167b0 6e 65 63 74 69 6f 6e 4e 65 77 50 61 72 73 65 72  nectionNewParser
167c0 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 73  ] \..          s
167d0 61 76 65 64 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a  avedEnv..    }..
167e0 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 61 76 65  ...    proc save
167f0 53 51 4c 69 74 65 43 6f 6e 76 65 72 74 45 6e 76  SQLiteConvertEnv
16800 69 72 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20  ironment {} {.. 
16810 20 20 20 20 20 75 70 76 61 72 20 31 20 73 61 76       upvar 1 sav
16820 65 64 45 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a  edEnv savedEnv..
16830 0d 0a 20 20 20 20 20 20 73 61 76 65 45 6e 76 69  ..      saveEnvi
16840 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73  ronmentVariables
16850 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20   [list \..      
16860 20 20 20 20 55 73 65 5f 53 51 4c 69 74 65 43 6f      Use_SQLiteCo
16870 6e 76 65 72 74 5f 44 65 66 61 75 6c 74 44 62 54  nvert_DefaultDbT
16880 79 70 65 20 55 73 65 5f 53 51 4c 69 74 65 43 6f  ype Use_SQLiteCo
16890 6e 76 65 72 74 5f 44 65 66 61 75 6c 74 54 79 70  nvert_DefaultTyp
168a0 65 4e 61 6d 65 5d 20 5c 0d 0a 20 20 20 20 20 20  eName] \..      
168b0 20 20 20 20 73 61 76 65 64 45 6e 76 0d 0a 20 20      savedEnv..  
168c0 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
168d0 20 72 65 73 74 6f 72 65 53 51 4c 69 74 65 43 6f   restoreSQLiteCo
168e0 6e 76 65 72 74 45 6e 76 69 72 6f 6e 6d 65 6e 74  nvertEnvironment
168f0 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76   {} {..      upv
16900 61 72 20 31 20 73 61 76 65 64 45 6e 76 20 73 61  ar 1 savedEnv sa
16910 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20  vedEnv....      
16920 72 65 73 74 6f 72 65 45 6e 76 69 72 6f 6e 6d 65  restoreEnvironme
16930 6e 74 56 61 72 69 61 62 6c 65 73 20 5b 6c 69 73  ntVariables [lis
16940 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 55  t \..          U
16950 73 65 5f 53 51 4c 69 74 65 43 6f 6e 76 65 72 74  se_SQLiteConvert
16960 5f 44 65 66 61 75 6c 74 44 62 54 79 70 65 20 55  _DefaultDbType U
16970 73 65 5f 53 51 4c 69 74 65 43 6f 6e 76 65 72 74  se_SQLiteConvert
16980 5f 44 65 66 61 75 6c 74 54 79 70 65 4e 61 6d 65  _DefaultTypeName
16990 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 73  ] \..          s
169a0 61 76 65 64 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a  avedEnv..    }..
169b0 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 65 74 75  ...    proc setu
169c0 70 44 62 49 6e 74 65 72 72 75 70 74 43 61 6c 6c  pDbInterruptCall
169d0 62 61 63 6b 20 7b 20 63 68 61 6e 6e 65 6c 20 6c  back { channel l
169e0 6f 67 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70  og } {..      tp
169f0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d  uts $channel "--
16a00 2d 2d 20 73 65 74 74 69 6e 67 20 75 70 20 64 65  -- setting up de
16a10 62 75 67 67 65 72 20 69 6e 74 65 72 72 75 70 74  bugger interrupt
16a20 20 63 61 6c 6c 62 61 63 6b 2e 2e 2e 20 22 0d 0a   callback... "..
16a30 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74  ..      if {[cat
16a40 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 61  ch {..        sa
16a50 76 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72  veEnvironmentVar
16a60 69 61 62 6c 65 73 20 5b 6c 69 73 74 20 5c 0d 0a  iables [list \..
16a70 20 20 20 20 20 20 20 20 20 20 20 20 71 75 69 65              quie
16a80 74 46 69 6e 64 49 6e 74 65 72 70 72 65 74 65 72  tFindInterpreter
16a90 54 65 73 74 50 61 74 68 20 71 75 69 65 74 53 65  TestPath quietSe
16aa0 74 75 70 49 6e 74 65 72 70 72 65 74 65 72 54 65  tupInterpreterTe
16ab0 73 74 50 61 74 68 5d 0d 0a 0d 0a 20 20 20 20 20  stPath]....     
16ac0 20 20 20 74 72 79 20 7b 0d 0a 20 20 20 20 20 20     try {..      
16ad0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
16ae0 20 23 20 4e 4f 54 45 3a 20 50 72 65 76 65 6e 74   # NOTE: Prevent
16af0 20 74 68 65 20 76 65 6e 64 6f 72 20 73 63 72 69   the vendor scri
16b00 70 74 20 66 72 6f 6d 20 62 65 69 6e 67 20 6e 6f  pt from being no
16b10 69 73 79 20 77 68 65 6e 20 63 72 65 61 74 69 6e  isy when creatin
16b20 67 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  g..          #  
16b30 20 20 20 20 20 74 68 65 20 69 73 6f 6c 61 74 65       the isolate
16b40 64 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a  d interpreter...
16b50 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
16b60 20 20 20 20 20 20 20 73 65 74 20 3a 3a 65 6e 76         set ::env
16b70 28 71 75 69 65 74 46 69 6e 64 49 6e 74 65 72 70  (quietFindInterp
16b80 72 65 74 65 72 54 65 73 74 50 61 74 68 29 20 31  reterTestPath) 1
16b90 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
16ba0 3a 3a 65 6e 76 28 71 75 69 65 74 53 65 74 75 70  ::env(quietSetup
16bb0 49 6e 74 65 72 70 72 65 74 65 72 54 65 73 74 50  InterpreterTestP
16bc0 61 74 68 29 20 31 0d 0a 0d 0a 20 20 20 20 20 20  ath) 1....      
16bd0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
16be0 20 23 20 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75   # NOTE: Make su
16bf0 72 65 20 74 68 65 20 73 63 72 69 70 74 20 64 65  re the script de
16c00 62 75 67 67 65 72 20 61 6e 64 20 74 68 65 20 69  bugger and the i
16c10 73 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72 65  solated interpre
16c20 74 65 72 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ter..          #
16c30 20 20 20 20 20 20 20 61 72 65 20 73 65 74 75 70         are setup
16c40 20 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20 75   and ready for u
16c50 73 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  se...          #
16c60 0d 0a 20 20 20 20 20 20 20 20 20 20 64 65 62 75  ..          debu
16c70 67 20 73 65 74 75 70 20 74 72 75 65 20 74 72 75  g setup true tru
16c80 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23  e....          #
16c90 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
16ca0 54 45 3a 20 4c 6f 61 64 20 74 68 65 20 6e 65 63  TE: Load the nec
16cb0 65 73 73 61 72 79 20 70 61 63 6b 61 67 65 73 20  essary packages 
16cc0 69 6e 74 6f 20 74 68 65 20 69 73 6f 6c 61 74 65  into the isolate
16cd0 64 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a  d interpreter...
16ce0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
16cf0 20 20 20 20 20 20 20 64 65 62 75 67 20 65 76 61         debug eva
16d00 6c 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l {..           
16d10 20 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65   package require
16d20 20 45 61 67 6c 65 0d 0a 20 20 20 20 20 20 20 20   Eagle..        
16d30 20 20 20 20 70 61 63 6b 61 67 65 20 72 65 71 75      package requ
16d40 69 72 65 20 45 61 67 6c 65 2e 4c 69 62 72 61 72  ire Eagle.Librar
16d50 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  y..            p
16d60 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 45  ackage require E
16d70 61 67 6c 65 2e 54 65 73 74 0d 0a 20 20 20 20 20  agle.Test..     
16d80 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
16d90 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
16da0 20 23 20 4e 4f 54 45 3a 20 43 6f 70 79 20 74 68   # NOTE: Copy th
16db0 65 20 6e 65 63 65 73 73 61 72 79 20 76 61 72 69  e necessary vari
16dc0 61 62 6c 65 73 20 69 6e 74 6f 20 74 68 65 20 69  ables into the i
16dd0 73 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72 65  solated interpre
16de0 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ter...          
16df0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 64 65 62  #..          deb
16e00 75 67 20 69 6e 76 6f 6b 65 20 30 20 73 65 74 20  ug invoke 0 set 
16e10 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24  ::test_channel $
16e20 63 68 61 6e 6e 65 6c 3b 20 23 20 4e 4f 54 45 3a  channel; # NOTE:
16e30 20 46 6f 72 20 5b 74 70 75 74 73 5d 2e 0d 0a 20   For [tputs]... 
16e40 20 20 20 20 20 20 20 20 20 64 65 62 75 67 20 69           debug i
16e50 6e 76 6f 6b 65 20 30 20 73 65 74 20 3a 3a 74 65  nvoke 0 set ::te
16e60 73 74 5f 6c 6f 67 20 24 6c 6f 67 3b 20 23 20 4e  st_log $log; # N
16e70 4f 54 45 3a 20 46 6f 72 20 5b 74 6c 6f 67 5d 2e  OTE: For [tlog].
16e80 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  ....          #.
16e90 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
16ea0 45 3a 20 49 6e 73 74 61 6c 6c 20 74 68 65 20 63  E: Install the c
16eb0 61 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 20 74  allback script t
16ec0 6f 20 62 65 20 65 76 61 6c 75 61 74 65 64 20 69  o be evaluated i
16ed0 6e 20 74 68 65 20 69 73 6f 6c 61 74 65 64 0d 0a  n the isolated..
16ee0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
16ef0 20 20 69 6e 74 65 72 70 72 65 74 65 72 20 77 68    interpreter wh
16f00 65 6e 20 74 68 69 73 20 69 6e 74 65 72 70 72 65  en this interpre
16f10 74 65 72 20 69 73 20 69 6e 74 65 72 72 75 70 74  ter is interrupt
16f20 65 64 20 62 79 20 73 63 72 69 70 74 0d 0a 20 20  ed by script..  
16f30 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
16f40 63 61 6e 63 65 6c 6c 61 74 69 6f 6e 2c 20 65 74  cancellation, et
16f50 63 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  c...          #.
16f60 0a 20 20 20 20 20 20 20 20 20 20 64 65 62 75 67  .          debug
16f70 20 63 61 6c 6c 62 61 63 6b 20 61 70 70 6c 79 20   callback apply 
16f80 7b 7b 73 65 6e 64 65 72 20 65 7d 20 7b 0d 0a 20  {{sender e} {.. 
16f90 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
16fa0 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
16fb0 3a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20  : Check if this 
16fc0 64 65 62 75 67 67 65 72 20 63 61 6c 6c 62 61 63  debugger callbac
16fd0 6b 20 69 73 20 6f 6e 65 20 74 68 61 74 20 77 65  k is one that we
16fe0 20 63 61 72 65 20 61 62 6f 75 74 2e 0d 0a 20 20   care about...  
16ff0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
17000 20 20 20 20 20 20 20 20 20 73 65 74 20 69 6e 74           set int
17010 65 72 72 75 70 74 54 79 70 65 73 20 5b 73 70 6c  erruptTypes [spl
17020 69 74 20 5b 24 65 20 49 6e 74 65 72 72 75 70 74  it [$e Interrupt
17030 54 79 70 65 5d 20 22 2c 20 22 5d 0d 0a 0d 0a 20  Type] ", "].... 
17040 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 22             if {"
17050 43 61 6e 63 65 6c 65 64 22 20 69 6e 20 24 69 6e  Canceled" in $in
17060 74 65 72 72 75 70 74 54 79 70 65 73 20 7c 7c 20  terruptTypes || 
17070 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
17080 20 20 20 22 55 6e 77 6f 75 6e 64 22 20 69 6e 20     "Unwound" in 
17090 24 69 6e 74 65 72 72 75 70 74 54 79 70 65 73 7d  $interruptTypes}
170a0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
170b0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
170c0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
170d0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 5b 6f  Make sure the [o
170e0 62 6a 65 63 74 5d 20 63 6f 6d 6d 61 6e 64 20 69  bject] command i
170f0 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 53 69  s available.  Si
17100 6e 63 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  nce..           
17110 20 20 20 23 20 20 20 20 20 20 20 74 68 69 73 20     #       this 
17120 69 73 20 61 6e 20 69 73 6f 6c 61 74 65 64 20 69  is an isolated i
17130 6e 74 65 72 70 72 65 74 65 72 2c 20 63 68 65 63  nterpreter, chec
17140 6b 20 66 6f 72 20 69 74 20 74 68 65 20 68 61 72  k for it the har
17150 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d..             
17160 20 23 20 20 20 20 20 20 20 77 61 79 2e 0d 0a 20   #       way... 
17170 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
17180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
17190 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66 6f   {[llength [info
171a0 20 63 6f 6d 6d 61 6e 64 73 20 6f 62 6a 65 63 74   commands object
171b0 5d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ]] > 0} then {..
171c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171d0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
171e0 20 20 20 23 20 4e 4f 54 45 3a 20 49 74 65 72 61     # NOTE: Itera
171f0 74 65 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 64  te through all d
17200 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
17210 6f 6e 73 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 65  ons known to the
17220 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17230 20 20 23 20 20 20 20 20 20 20 70 61 72 65 6e 74    #       parent
17240 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20   interpreter... 
17250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
17260 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17270 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68    object foreach
17280 20 2d 61 6c 69 61 73 20 70 61 69 72 20 5b 6f 62   -alias pair [ob
17290 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
172a0 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
172b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
172c0 20 20 20 20 20 24 65 20 49 6e 74 65 72 70 72 65       $e Interpre
172d0 74 65 72 2e 63 6f 6e 6e 65 63 74 69 6f 6e 73 5d  ter.connections]
172e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
172f0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
17300 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
17310 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 63 61  E: Attempt to ca
17320 6e 63 65 6c 20 61 6e 79 20 53 51 4c 20 71 75 65  ncel any SQL que
17330 72 69 65 73 20 69 6e 20 70 72 6f 67 72 65 73 73  ries in progress
17340 20 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20   on..           
17350 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
17360 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e  his database con
17370 6e 65 63 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20  nection...      
17380 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
17390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173a0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 24 70 61   if {[catch {$pa
173b0 69 72 20 56 61 6c 75 65 2e 43 61 6e 63 65 6c 7d  ir Value.Cancel}
173c0 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d   error]} then {.
173d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
173e0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
173f0 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
17400 6e 64 41 72 67 73 20 5c 6e 20 5c 0d 0a 20 20 20  ndArgs \n \..   
17410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17420 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
17430 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 63 61  NG: failed to ca
17440 6e 63 65 6c 20 71 75 65 72 79 20 66 6f 72 20 22  ncel query for "
17450 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
17460 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 6e              "con
17470 6e 65 63 74 69 6f 6e 20 5c 22 22 20 5b 24 70 61  nection \"" [$pa
17480 69 72 20 4b 65 79 5d 20 22 5c 22 2c 20 65 72 72  ir Key] "\", err
17490 6f 72 3a 20 22 20 5c 6e 5c 74 20 5c 0d 0a 20 20  or: " \n\t \..  
174a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
174b0 20 20 20 20 20 20 24 65 72 72 6f 72 20 5c 6e 5d        $error \n]
174c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
174d0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
174e0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
174f0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
17500 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17510 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
17520 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
17530 72 67 73 20 5c 6e 20 5c 0d 0a 20 20 20 20 20 20  rgs \n \..      
17540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
17550 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 63 61 6e  === WARNING: can
17560 6e 6f 74 20 63 61 6e 63 65 6c 20 61 6e 79 20 71  not cancel any q
17570 75 65 72 69 65 73 3a 20 22 20 5c 0d 0a 20 20 20  ueries: " \..   
17580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17590 20 22 74 68 65 20 5c 22 6f 62 6a 65 63 74 5c 22   "the \"object\"
175a0 20 63 6f 6d 6d 61 6e 64 20 69 73 20 6e 6f 74 20   command is not 
175b0 61 76 61 69 6c 61 62 6c 65 5c 6e 22 5d 0d 0a 20  available\n"].. 
175c0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
175d0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
175e0 20 20 20 20 20 20 20 20 20 7d 7d 0d 0a 20 20 20           }}..   
175f0 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b       } finally {
17600 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 74  ..          rest
17610 6f 72 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61  oreEnvironmentVa
17620 72 69 61 62 6c 65 73 20 5b 6c 69 73 74 20 5c 0d  riables [list \.
17630 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 71  .              q
17640 75 69 65 74 46 69 6e 64 49 6e 74 65 72 70 72 65  uietFindInterpre
17650 74 65 72 54 65 73 74 50 61 74 68 20 71 75 69 65  terTestPath quie
17660 74 53 65 74 75 70 49 6e 74 65 72 70 72 65 74 65  tSetupInterprete
17670 72 54 65 73 74 50 61 74 68 5d 0d 0a 20 20 20 20  rTestPath]..    
17680 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65      }..      } e
17690 72 72 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  rror] == 0} then
176a0 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43   {..        addC
176b0 6f 6e 73 74 72 61 69 6e 74 20 69 6e 74 65 72 72  onstraint interr
176c0 75 70 74 43 61 6c 6c 62 61 63 6b 2e 73 71 6c 69  uptCallback.sqli
176d0 74 65 33 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74  te3....        t
176e0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65  puts $channel ye
176f0 73 5c 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  s\n..      } els
17700 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e {..        tpu
17710 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
17720 65 6e 64 41 72 67 73 20 22 6e 6f 2c 20 65 72 72  endArgs "no, err
17730 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f  or: " \n\t $erro
17740 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  r \n]..      }..
17750 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
17760 6f 63 20 63 6c 65 61 6e 75 70 46 69 6c 65 20 7b  oc cleanupFile {
17770 20 66 69 6c 65 4e 61 6d 65 20 7b 63 6f 6c 6c 65   fileName {colle
17780 63 74 20 74 72 75 65 7d 20 7b 66 6f 72 63 65 20  ct true} {force 
17790 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20  false} } {..    
177a0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
177b0 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 66 6f  E: Attempt to fo
177c0 72 63 65 20 61 6c 6c 20 70 65 6e 64 69 6e 67 20  rce all pending 
177d0 22 67 61 72 62 61 67 65 22 20 6f 62 6a 65 63 74  "garbage" object
177e0 73 20 74 6f 20 62 65 20 63 6f 6c 6c 65 63 74 65  s to be collecte
177f0 64 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  d,..      #     
17800 20 20 69 6e 63 6c 75 64 69 6e 67 20 53 51 4c 69    including SQLi
17810 74 65 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6e  te statements an
17820 64 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73  d backup objects
17830 3b 20 74 68 69 73 20 73 68 6f 75 6c 64 20 61 6c  ; this should al
17840 6c 6f 77 0d 0a 20 20 20 20 20 20 23 20 20 20 20  low..      #    
17850 20 20 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e     the underlyin
17860 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
17870 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 0d 0a  to be deleted...
17880 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
17890 66 20 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65  f {$collect} the
178a0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c  n {..        col
178b0 6c 65 63 74 47 61 72 62 61 67 65 20 24 3a 3a 74  lectGarbage $::t
178c0 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20  est_channel..   
178d0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
178e0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43  .      # NOTE: C
178f0 68 65 63 6b 20 69 66 20 74 68 65 20 66 69 6c 65  heck if the file
17900 20 73 74 69 6c 6c 20 65 78 69 73 74 73 2e 0d 0a   still exists...
17910 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
17920 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20  f {[file exists 
17930 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  $fileName]} then
17940 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
17950 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
17960 6b 69 70 20 64 65 6c 65 74 69 6e 67 20 74 65 73  kip deleting tes
17970 74 20 66 69 6c 65 73 20 69 66 20 73 6f 6d 65 62  t files if someb
17980 6f 64 79 20 73 65 74 73 20 74 68 65 20 67 6c 6f  ody sets the glo
17990 62 61 6c 20 76 61 72 69 61 62 6c 65 0d 0a 20 20  bal variable..  
179a0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f        #       to
179b0 20 70 72 65 76 65 6e 74 20 69 74 2e 0d 0a 20 20   prevent it...  
179c0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
179d0 20 69 66 20 7b 24 66 6f 72 63 65 20 7c 7c 20 21   if {$force || !
179e0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
179f0 6f 28 63 6c 65 61 6e 75 70 46 69 6c 65 29 5d 7d  o(cleanupFile)]}
17a00 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
17a10 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
17a20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
17a30 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  to delete the te
17a40 73 74 20 66 69 6c 65 20 6e 6f 77 2e 0d 0a 20 20  st file now...  
17a50 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
17a60 20 20 20 20 20 69 66 20 7b 5b 73 65 74 20 63 6f       if {[set co
17a70 64 65 20 5b 63 61 74 63 68 20 7b 66 69 6c 65 20  de [catch {file 
17a80 64 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65  delete $fileName
17a90 7d 20 65 72 72 6f 72 5d 5d 7d 20 74 68 65 6e 20  } error]]} then 
17aa0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  {..            #
17ab0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
17ac0 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77  NOTE: We somehow
17ad0 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74   failed to delet
17ae0 65 20 74 68 65 20 66 69 6c 65 2c 20 72 65 70 6f  e the file, repo
17af0 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20  rt why...       
17b00 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
17b10 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
17b20 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
17b30 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
17b40 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
17b50 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
17b60 6f 20 64 65 6c 65 74 65 20 74 65 73 74 20 66 69  o delete test fi
17b70 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65  le \"" $fileName
17b80 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
17b90 20 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63      "\" during c
17ba0 6c 65 61 6e 75 70 2c 20 65 72 72 6f 72 3a 20 22  leanup, error: "
17bb0 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d   \n\t $error \n]
17bc0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
17bd0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
17be0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
17bf0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
17c00 53 68 6f 77 20 74 68 61 74 20 77 65 20 73 6b 69  Show that we ski
17c10 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20 74 68  pped deleting th
17c20 65 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20  e file...       
17c30 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
17c40 73 65 74 20 63 6f 64 65 20 30 0d 0a 0d 0a 20 20  set code 0....  
17c50 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
17c60 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
17c70 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
17c80 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
17c90 20 57 41 52 4e 49 4e 47 3a 20 73 6b 69 70 70 65   WARNING: skippe
17ca0 64 20 64 65 6c 65 74 69 6e 67 20 74 65 73 74 20  d deleting test 
17cb0 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61  file \"" $fileNa
17cc0 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
17cd0 20 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63      "\" during c
17ce0 6c 65 61 6e 75 70 5c 6e 22 5d 0d 0a 20 20 20 20  leanup\n"]..    
17cf0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65      }..      } e
17d00 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
17d10 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
17d20 3a 20 54 68 65 20 66 69 6c 65 20 64 6f 65 73 20  : The file does 
17d30 6e 6f 74 20 65 78 69 73 74 2c 20 73 75 63 63 65  not exist, succe
17d40 73 73 21 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ss!..        #..
17d50 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 64 65          set code
17d60 20 30 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   0..      }.... 
17d70 20 20 20 20 20 72 65 74 75 72 6e 20 24 63 6f 64       return $cod
17d80 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  e..    }.....   
17d90 20 70 72 6f 63 20 63 6c 65 61 6e 75 70 4d 65 6d   proc cleanupMem
17da0 6f 72 79 20 7b 20 76 61 72 4e 61 6d 65 20 7b 71  ory { varName {q
17db0 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  uiet false} } {.
17dc0 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65  .      if {[have
17dd0 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d  SQLiteObjectComm
17de0 61 6e 64 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  and] && \..     
17df0 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
17e00 67 74 68 20 24 76 61 72 4e 61 6d 65 5d 20 3e 20  gth $varName] > 
17e10 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
17e20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
17e30 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74  NOTE: Refer to t
17e40 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72  he specified var
17e50 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 63 6f 6e  iable (e.g. "con
17e60 6e 65 63 74 69 6f 6e 22 29 20 69 6e 20 74 68 65  nection") in the
17e70 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
17e80 20 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72    context of our
17e90 20 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 6f 70   caller.  The op
17ea0 61 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64  aque object hand
17eb0 6c 65 20 66 6f 72 20 61 6e 0d 0a 20 20 20 20 20  le for an..     
17ec0 20 20 20 23 20 20 20 20 20 20 20 41 44 4f 2e 4e     #       ADO.N
17ed0 45 54 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72  ET connection pr
17ee0 65 76 69 6f 75 73 6c 79 20 72 65 74 75 72 6e 65  eviously returne
17ef0 64 20 62 79 20 5b 67 65 74 44 62 43 6f 6e 6e 65  d by [getDbConne
17f00 63 74 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ction]..        
17f10 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62  #       should b
17f20 65 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e 0d  e stored there..
17f30 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
17f40 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72      upvar 1 $var
17f50 4e 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d  Name connection.
17f60 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  ...        if {[
17f70 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
17f80 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
17f90 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 20 52 65 6c   $connection Rel
17fa0 65 61 73 65 4d 65 6d 6f 72 79 0d 0a 20 20 20 20  easeMemory..    
17fb0 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 7d 20 74      } result]} t
17fc0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
17fd0 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
17fe0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
17ff0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
18000 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
18010 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
18020 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
18030 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
18040 72 65 6c 65 61 73 65 20 64 61 74 61 62 61 73 65  release database
18050 20 6d 65 6d 6f 72 79 2c 20 65 72 72 6f 72 3a 20   memory, error: 
18060 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
18070 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c       \n\t $resul
18080 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  t \n]..         
18090 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
180a0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
180b0 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e  if {[llength [in
180c0 66 6f 20 63 6f 6d 6d 61 6e 64 73 20 64 65 62 75  fo commands debu
180d0 67 5d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  g]] > 0} then {.
180e0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
180f0 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
18100 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74   uplevel 1 [list
18110 20 64 65 62 75 67 20 70 75 72 67 65 5d 0d 0a 20   debug purge].. 
18120 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d         } result]
18130 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
18140 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
18150 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
18160 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
18170 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
18180 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
18190 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
181a0 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
181b0 74 6f 20 70 75 72 67 65 20 63 61 6c 6c 20 66 72  to purge call fr
181c0 61 6d 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d  ame, error: " \.
181d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
181e0 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e   \n\t $result \n
181f0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
18200 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
18210 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
18220 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 75 70 6c  {..          upl
18230 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 64 65 62  evel 1 [list deb
18240 75 67 20 63 6c 65 61 6e 75 70 5d 0d 0a 20 20 20  ug cleanup]..   
18250 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 7d 20       } result]} 
18260 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
18270 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
18280 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
18290 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
182a0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
182b0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
182c0 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
182d0 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
182e0 20 63 6c 65 61 6e 75 70 20 69 6e 74 65 72 70 72   cleanup interpr
182f0 65 74 65 72 2c 20 65 72 72 6f 72 3a 20 22 20 5c  eter, error: " \
18300 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18310 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c    \n\t $result \
18320 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
18330 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
18340 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
18350 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 75 70   {..          up
18360 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 64 65  level 1 [list de
18370 62 75 67 20 63 6f 6c 6c 65 63 74 5d 0d 0a 20 20  bug collect]..  
18380 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 7d        } result]}
18390 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
183a0 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
183b0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
183c0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
183d0 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
183e0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
183f0 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
18400 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
18410 6f 20 63 6f 6c 6c 65 63 74 20 67 61 72 62 61 67  o collect garbag
18420 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20  e, error: " \.. 
18430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
18440 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d  n\t $result \n].
18450 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
18460 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
18470 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
18480 70 72 6f 63 20 73 65 74 75 70 4d 65 6d 6f 72 79  proc setupMemory
18490 43 6f 75 6e 74 65 72 73 20 7b 20 76 61 72 4e 61  Counters { varNa
184a0 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66  me } {..      if
184b0 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a   {[haveSQLiteObj
184c0 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65  ectCommand]} the
184d0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 70 76  n {..        upv
184e0 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 63 6f  ar 1 $varName co
184f0 75 6e 74 65 72 0d 0a 0d 0a 20 20 20 20 20 20 20  unter....       
18500 20 73 65 74 20 63 6f 75 6e 74 65 72 28 31 29 20   set counter(1) 
18510 5b 6f 62 6a 65 63 74 20 63 72 65 61 74 65 20 2d  [object create -
18520 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20 20 20  alias \..       
18530 20 20 20 20 20 53 79 73 74 65 6d 2e 44 69 61 67       System.Diag
18540 6e 6f 73 74 69 63 73 2e 50 65 72 66 6f 72 6d 61  nostics.Performa
18550 6e 63 65 43 6f 75 6e 74 65 72 20 50 72 6f 63 65  nceCounter Proce
18560 73 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ss \..          
18570 20 20 22 57 6f 72 6b 69 6e 67 20 53 65 74 22 20    "Working Set" 
18580 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 5b  [file rootname [
18590 66 69 6c 65 20 74 61 69 6c 20 24 3a 3a 62 69 6e  file tail $::bin
185a0 5f 66 69 6c 65 5d 5d 5d 0d 0a 0d 0a 20 20 20 20  _file]]]....    
185b0 20 20 20 20 73 65 74 20 63 6f 75 6e 74 65 72 28      set counter(
185c0 32 29 20 5b 6f 62 6a 65 63 74 20 63 72 65 61 74  2) [object creat
185d0 65 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20  e -alias \..    
185e0 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
185f0 69 61 67 6e 6f 73 74 69 63 73 2e 50 65 72 66 6f  iagnostics.Perfo
18600 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 20 50 72  rmanceCounter Pr
18610 6f 63 65 73 73 20 5c 0d 0a 20 20 20 20 20 20 20  ocess \..       
18620 20 20 20 20 20 22 57 6f 72 6b 69 6e 67 20 53 65       "Working Se
18630 74 20 50 65 61 6b 22 20 5b 66 69 6c 65 20 72 6f  t Peak" [file ro
18640 6f 74 6e 61 6d 65 20 5b 66 69 6c 65 20 74 61 69  otname [file tai
18650 6c 20 24 3a 3a 62 69 6e 5f 66 69 6c 65 5d 5d 5d  l $::bin_file]]]
18660 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
18670 63 6f 75 6e 74 65 72 28 33 29 20 5b 6f 62 6a 65  counter(3) [obje
18680 63 74 20 63 72 65 61 74 65 20 2d 61 6c 69 61 73  ct create -alias
18690 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
186a0 53 79 73 74 65 6d 2e 44 69 61 67 6e 6f 73 74 69  System.Diagnosti
186b0 63 73 2e 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f  cs.PerformanceCo
186c0 75 6e 74 65 72 20 50 72 6f 63 65 73 73 20 5c 0d  unter Process \.
186d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 50 72  .            "Pr
186e0 69 76 61 74 65 20 42 79 74 65 73 22 20 5b 66 69  ivate Bytes" [fi
186f0 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 5b 66 69 6c  le rootname [fil
18700 65 20 74 61 69 6c 20 24 3a 3a 62 69 6e 5f 66 69  e tail $::bin_fi
18710 6c 65 5d 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  le]]]..      }..
18720 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 22  ..      return "
18730 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  "..    }.....   
18740 20 70 72 6f 63 20 72 65 70 6f 72 74 4d 65 6d 6f   proc reportMemo
18750 72 79 43 6f 75 6e 74 65 72 73 20 7b 20 63 68 61  ryCounters { cha
18760 6e 6e 65 6c 20 76 61 72 4e 61 6d 65 20 70 72 65  nnel varName pre
18770 66 69 78 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69  fix } {..      i
18780 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62  f {[haveSQLiteOb
18790 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68  jectCommand]} th
187a0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 70  en {..        up
187b0 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 63  var 1 $varName c
187c0 6f 75 6e 74 65 72 0d 0a 0d 0a 20 20 20 20 20 20  ounter....      
187d0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
187e0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
187f0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
18800 2d 20 22 20 24 70 72 65 66 69 78 20 22 20 63 6f  - " $prefix " co
18810 75 6e 74 65 72 20 5c 22 22 20 5c 0d 0a 20 20 20  unter \"" \..   
18820 20 20 20 20 20 20 20 20 20 5b 6f 62 6a 65 63 74           [object
18830 20 69 6e 76 6f 6b 65 20 24 63 6f 75 6e 74 65 72   invoke $counter
18840 28 31 29 20 43 6f 75 6e 74 65 72 4e 61 6d 65 5d  (1) CounterName]
18850 20 22 5c 22 20 76 61 6c 75 65 20 69 73 20 22 20   "\" value is " 
18860 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
18870 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24 63  object invoke $c
18880 6f 75 6e 74 65 72 28 31 29 20 52 61 77 56 61 6c  ounter(1) RawVal
18890 75 65 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20  ue] \n]....     
188a0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
188b0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
188c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
188d0 2d 2d 20 22 20 24 70 72 65 66 69 78 20 22 20 63  -- " $prefix " c
188e0 6f 75 6e 74 65 72 20 5c 22 22 20 5c 0d 0a 20 20  ounter \"" \..  
188f0 20 20 20 20 20 20 20 20 20 20 5b 6f 62 6a 65 63            [objec
18900 74 20 69 6e 76 6f 6b 65 20 24 63 6f 75 6e 74 65  t invoke $counte
18910 72 28 32 29 20 43 6f 75 6e 74 65 72 4e 61 6d 65  r(2) CounterName
18920 5d 20 22 5c 22 20 76 61 6c 75 65 20 69 73 20 22  ] "\" value is "
18930 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
18940 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24  [object invoke $
18950 63 6f 75 6e 74 65 72 28 32 29 20 52 61 77 56 61  counter(2) RawVa
18960 6c 75 65 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  lue] \n]....    
18970 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
18980 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
18990 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
189a0 2d 2d 2d 20 22 20 24 70 72 65 66 69 78 20 22 20  --- " $prefix " 
189b0 63 6f 75 6e 74 65 72 20 5c 22 22 20 5c 0d 0a 20  counter \"" \.. 
189c0 20 20 20 20 20 20 20 20 20 20 20 5b 6f 62 6a 65             [obje
189d0 63 74 20 69 6e 76 6f 6b 65 20 24 63 6f 75 6e 74  ct invoke $count
189e0 65 72 28 33 29 20 43 6f 75 6e 74 65 72 4e 61 6d  er(3) CounterNam
189f0 65 5d 20 22 5c 22 20 76 61 6c 75 65 20 69 73 20  e] "\" value is 
18a00 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
18a10 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   [object invoke 
18a20 24 63 6f 75 6e 74 65 72 28 33 29 20 52 61 77 56  $counter(3) RawV
18a30 61 6c 75 65 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20  alue] \n]..     
18a40 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
18a50 20 20 70 72 6f 63 20 63 6f 6c 6c 65 63 74 47 61    proc collectGa
18a60 72 62 61 67 65 20 7b 20 63 68 61 6e 6e 65 6c 20  rbage { channel 
18a70 7b 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 31 30  {milliseconds 10
18a80 30 30 7d 20 7b 71 75 69 65 74 20 74 72 75 65 7d  00} {quiet true}
18a90 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b   } {..      if {
18aa0 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63  [haveSQLiteObjec
18ab0 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20  tCommand]} then 
18ac0 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  {..        if {[
18ad0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
18ae0 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
18af0 20 47 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f   GC GetTotalMemo
18b00 72 79 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20  ry false..      
18b10 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30    } result] == 0
18b20 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
18b30 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
18b40 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
18b50 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
18b60 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
18b70 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
18b80 20 20 20 22 2d 2d 2d 2d 20 6d 65 6d 6f 72 79 20     "---- memory 
18b90 69 6e 20 75 73 65 20 62 79 20 74 68 65 20 43 4c  in use by the CL
18ba0 52 20 62 65 66 6f 72 65 20 63 6f 6c 6c 65 63 74  R before collect
18bb0 69 6f 6e 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20  ion... " \..    
18bc0 20 20 20 20 20 20 20 20 20 20 20 20 24 72 65 73              $res
18bd0 75 6c 74 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d  ult " bytes\n"].
18be0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
18bf0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
18c00 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
18c10 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
18c20 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
18c30 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
18c40 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 67  ING: failed to g
18c50 65 74 20 43 4c 52 20 6d 65 6d 6f 72 79 20 75 73  et CLR memory us
18c60 61 67 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d  age, error: " \.
18c70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c  .              \
18c80 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d  n\t $result \n].
18c90 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
18ca0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 23 23    }....      ###
18cb0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18cc0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18cd0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18ce0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18cf0 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20 20  ######....      
18d00 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
18d10 20 52 65 70 65 61 74 65 64 6c 79 20 61 74 74 65   Repeatedly atte
18d20 6d 70 74 20 74 6f 20 63 6f 6c 6c 65 63 74 20 67  mpt to collect g
18d30 61 72 62 61 67 65 20 75 6e 74 69 6c 20 74 68 65  arbage until the
18d40 20 61 6c 6c 6f 74 74 65 64 20 6e 75 6d 62 65 72   allotted number
18d50 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
18d60 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  of milliseconds 
18d70 68 61 73 20 65 6c 61 70 73 65 64 2e 20 20 41 6c  has elapsed.  Al
18d80 77 61 79 73 20 61 74 74 65 6d 70 74 20 74 6f 20  ways attempt to 
18d90 63 6f 6c 6c 65 63 74 20 67 61 72 62 61 67 65 0d  collect garbage.
18da0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
18db0 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 0d 0a 20  t least once... 
18dc0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
18dd0 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a   {[haveSQLiteObj
18de0 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65  ectCommand]} the
18df0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  n {..        set
18e00 20 73 74 61 72 74 20 5b 63 6c 6f 63 6b 20 73 65   start [clock se
18e10 63 6f 6e 64 73 5d 0d 0a 20 20 20 20 20 20 20 20  conds]..        
18e20 73 65 74 20 73 74 6f 70 20 5b 65 78 70 72 20 7b  set stop [expr {
18e30 24 73 74 61 72 74 20 2b 20 28 24 6d 69 6c 6c 69  $start + ($milli
18e40 73 65 63 6f 6e 64 73 20 2f 20 31 30 30 30 29 7d  seconds / 1000)}
18e50 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 64 6f 20  ]....        do 
18e60 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
18e70 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
18e80 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 66 6f 72  : Attempt to for
18e90 63 65 20 61 20 66 75 6c 6c 20 67 61 72 62 61 67  ce a full garbag
18ea0 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 6e 6f 77  e collection now
18eb0 2e 20 20 52 65 70 6f 72 74 20 61 6e 79 0d 0a 20  .  Report any.. 
18ec0 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
18ed0 20 65 72 72 6f 72 20 74 68 61 74 20 69 73 20 65   error that is e
18ee0 6e 63 6f 75 6e 74 65 72 65 64 20 69 66 20 77 65  ncountered if we
18ef0 20 66 61 69 6c 2e 0d 0a 20 20 20 20 20 20 20 20   fail...        
18f00 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69    #..          i
18f10 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
18f20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
18f30 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54 6f 74  invoke GC GetTot
18f40 61 6c 4d 65 6d 6f 72 79 20 74 72 75 65 0d 0a 20  alMemory true.. 
18f50 20 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f 72           } error
18f60 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
18f70 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
18f80 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
18f90 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
18fa0 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
18fb0 4e 47 3a 20 66 61 69 6c 65 64 20 66 75 6c 6c 20  NG: failed full 
18fc0 67 61 72 62 61 67 65 20 63 6f 6c 6c 65 63 74 69  garbage collecti
18fd0 6f 6e 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a  on, error: " \..
18fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ff0 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
19000 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
19010 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6e 6f            set no
19020 77 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73  w [clock seconds
19030 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69  ]..        } whi
19040 6c 65 20 7b 24 73 74 61 72 74 20 3c 3d 20 24 6e  le {$start <= $n
19050 6f 77 20 26 26 20 24 6e 6f 77 20 3c 20 24 73 74  ow && $now < $st
19060 6f 70 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  op}..      }....
19070 20 20 20 20 20 20 23 23 23 23 23 23 23 23 23 23        ##########
19080 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
19090 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
190a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
190b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
190c0 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61  ...      if {[ha
190d0 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f  veSQLiteObjectCo
190e0 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a  mmand]} then {..
190f0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
19100 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
19110 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47 43  object invoke GC
19120 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79 20   GetTotalMemory 
19130 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 7d  false..        }
19140 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74   result] == 0} t
19150 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
19160 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
19170 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
19180 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
19190 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
191a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191b0 22 2d 2d 2d 2d 20 6d 65 6d 6f 72 79 20 69 6e 20  "---- memory in 
191c0 75 73 65 20 62 79 20 74 68 65 20 43 4c 52 20 61  use by the CLR a
191d0 66 74 65 72 20 63 6f 6c 6c 65 63 74 69 6f 6e 2e  fter collection.
191e0 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  .. " \..        
191f0 20 20 20 20 20 20 20 20 24 72 65 73 75 6c 74 20          $result 
19200 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20  " bytes\n"]..   
19210 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
19220 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
19230 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
19240 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
19250 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
19260 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
19270 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 43   failed to get C
19280 4c 52 20 6d 65 6d 6f 72 79 20 75 73 61 67 65 2c  LR memory usage,
19290 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20   error: " \..   
192a0 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20             \n\t 
192b0 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
192c0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
192d0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
192e0 72 6f 63 20 67 65 74 53 51 4c 69 74 65 48 61 6e  roc getSQLiteHan
192f0 64 6c 65 43 6f 75 6e 74 73 20 7b 20 63 68 61 6e  dleCounts { chan
19300 6e 65 6c 20 7b 71 75 69 65 74 20 66 61 6c 73 65  nel {quiet false
19310 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  } } {..      set
19320 20 72 65 73 75 6c 74 20 5b 6c 69 73 74 5d 0d 0a   result [list]..
19330 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76  ..      if {[hav
19340 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d  eSQLiteObjectCom
19350 6d 61 6e 64 5d 20 26 26 20 5b 68 61 76 65 43 6f  mand] && [haveCo
19360 6e 73 74 72 61 69 6e 74 20 5c 0d 0a 20 20 20 20  nstraint \..    
19370 20 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65            define
19380 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74 65 6d 2e  Constant.System.
19390 44 61 74 61 2e 53 51 4c 69 74 65 2e 43 4f 55 4e  Data.SQLite.COUN
193a0 54 5f 48 41 4e 44 4c 45 5d 7d 20 74 68 65 6e 20  T_HANDLE]} then 
193b0 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
193c0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64        # NOTE: Ad
193d0 64 20 65 61 63 68 20 63 72 69 74 69 63 61 6c 20  d each critical 
193e0 68 61 6e 64 6c 65 20 63 6f 75 6e 74 20 74 6f 20  handle count to 
193f0 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20 6c 69  the resulting li
19400 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  st...        #..
19410 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
19420 6e 61 6d 65 20 5b 6c 69 73 74 20 63 6f 6e 6e 65  name [list conne
19430 63 74 69 6f 6e 43 6f 75 6e 74 20 73 74 61 74 65  ctionCount state
19440 6d 65 6e 74 43 6f 75 6e 74 20 62 61 63 6b 75 70  mentCount backup
19450 43 6f 75 6e 74 5d 20 7b 0d 0a 20 20 20 20 20 20  Count] {..      
19460 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
19470 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 62  ..            ob
19480 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
19490 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
194a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
194b0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
194c0 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65  ite.UnsafeNative
194d0 4d 65 74 68 6f 64 73 20 24 6e 61 6d 65 0d 0a 20  Methods $name.. 
194e0 20 20 20 20 20 20 20 20 20 7d 20 76 61 6c 75 65           } value
194f0 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
19500 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
19510 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
19520 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
19530 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
19540 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
19550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
19560 2d 2d 2d 2d 20 63 72 69 74 69 63 61 6c 20 68 61  ---- critical ha
19570 6e 64 6c 65 20 63 6f 75 6e 74 20 5c 22 22 20 24  ndle count \"" $
19580 6e 61 6d 65 20 22 5c 22 20 69 73 20 22 20 24 76  name "\" is " $v
19590 61 6c 75 65 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  alue \n]..      
195a0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
195b0 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72         lappend r
195c0 65 73 75 6c 74 20 24 76 61 6c 75 65 0d 0a 20 20  esult $value..  
195d0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
195e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
195f0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
19600 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
19610 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
19620 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
19630 64 20 74 6f 20 67 65 74 20 63 72 69 74 69 63 61  d to get critica
19640 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 20 5c  l handle count \
19650 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
19660 20 20 20 20 20 20 24 6e 61 6d 65 20 22 5c 22 2c        $name "\",
19670 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24   error: " \n\t $
19680 76 61 6c 75 65 20 5c 6e 5d 0d 0a 20 20 20 20 20  value \n]..     
19690 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
196a0 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69  }..      } elsei
196b0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
196c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
196d0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54         # NOTE: T
196e0 68 65 20 61 63 74 75 61 6c 20 68 61 6e 64 6c 65  he actual handle
196f0 20 63 6f 75 6e 74 73 20 61 72 65 20 6e 6f 74 20   counts are not 
19700 61 76 61 69 6c 61 62 6c 65 3b 20 74 68 65 72 65  available; there
19710 66 6f 72 65 2c 20 6a 75 73 74 0d 0a 20 20 20 20  fore, just..    
19720 20 20 20 20 23 20 20 20 20 20 20 20 72 65 74 75      #       retu
19730 72 6e 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74  rn an empty list
19740 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
19750 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
19760 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 72 69 74 69  nnel "---- criti
19770 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74  cal handle count
19780 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 5c 6e 22  s unavailable\n"
19790 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
197a0 20 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c     return $resul
197b0 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  t..    }.....   
197c0 20 70 72 6f 63 20 73 68 75 74 64 6f 77 6e 53 51   proc shutdownSQ
197d0 4c 69 74 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7b  Lite { channel {
197e0 66 6f 72 63 65 20 66 61 6c 73 65 7d 20 7b 71 75  force false} {qu
197f0 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  iet false} } {..
19800 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
19810 20 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75 72 65   NOTE: Make sure
19820 20 74 68 61 74 20 53 51 4c 69 74 65 20 63 6f 72   that SQLite cor
19830 65 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d  e library is com
19840 70 6c 65 74 65 6c 79 20 73 68 75 74 64 6f 77 6e  pletely shutdown
19850 2e 20 20 54 68 69 73 0d 0a 20 20 20 20 20 20 23  .  This..      #
19860 20 20 20 20 20 20 20 69 73 20 75 73 65 64 20 62         is used b
19870 79 20 74 65 73 74 73 20 74 68 61 74 20 63 68 61  y tests that cha
19880 6e 67 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  nge configuratio
19890 6e 20 6f 70 74 69 6f 6e 73 20 61 6e 64 2f 6f 72  n options and/or
198a0 20 74 68 6f 73 65 0d 0a 20 20 20 20 20 20 23 20   those..      # 
198b0 20 20 20 20 20 20 74 68 61 74 20 6e 65 65 64 20        that need 
198c0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 6c 6f 67  to make sure log
198d0 67 69 6e 67 20 69 73 20 69 6e 69 74 69 61 6c 69  ging is initiali
198e0 7a 65 64 20 28 69 2e 65 2e 20 6a 75 73 74 20 69  zed (i.e. just i
198f0 6e 20 63 61 73 65 0d 0a 20 20 20 20 20 20 23 20  n case..      # 
19900 20 20 20 20 20 20 74 68 65 20 53 51 4c 69 74 65        the SQLite
19910 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20 77 61   core library wa
19920 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 69 6e  s initialized in
19930 20 74 68 65 20 70 72 6f 63 65 73 73 20 70 72 69   the process pri
19940 6f 72 20 74 6f 0d 0a 20 20 20 20 20 20 23 20 20  or to..      #  
19950 20 20 20 20 20 74 68 65 20 53 51 4c 69 74 65 4c       the SQLiteL
19960 6f 67 20 63 6c 61 73 73 20 62 65 69 6e 67 20 61  og class being a
19970 62 6c 65 20 74 6f 20 73 65 74 75 70 20 69 74 73  ble to setup its
19980 20 6c 6f 67 67 69 6e 67 20 63 61 6c 6c 62 61 63   logging callbac
19990 6b 29 2e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  k)...      #    
199a0 20 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69     Normally, thi
199b0 73 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  s should only be
199c0 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20 53 51   performed if SQ
199d0 4c 69 74 65 20 69 73 20 6c 6f 61 64 65 64 20 61  Lite is loaded a
199e0 6e 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  nd..      #     
199f0 20 20 72 65 61 64 79 20 66 6f 72 20 75 73 65 20    ready for use 
19a00 62 79 20 74 68 65 20 74 65 73 74 20 73 75 69 74  by the test suit
19a10 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
19a20 20 20 20 69 66 20 7b 24 66 6f 72 63 65 20 7c 7c     if {$force ||
19a30 20 5b 69 73 53 51 4c 69 74 65 52 65 61 64 79 5d   [isSQLiteReady]
19a40 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
19a50 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 42    #..        # B
19a60 55 47 46 49 58 3a 20 4d 61 6b 65 20 73 75 72 65  UGFIX: Make sure
19a70 20 74 68 61 74 20 61 6e 79 20 22 6c 65 61 6b 65   that any "leake
19a80 64 22 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  d" transactions 
19a90 61 6e 64 2f 6f 72 20 63 6f 6e 6e 65 63 74 69 6f  and/or connectio
19aa0 6e 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ns..        #   
19ab0 20 20 20 20 20 20 61 72 65 20 63 6c 65 61 6e 65        are cleane
19ac0 64 20 75 70 20 62 65 66 6f 72 65 20 63 61 6c 6c  d up before call
19ad0 69 6e 67 20 74 68 65 20 6e 61 74 69 76 65 20 73  ing the native s
19ae0 68 75 74 64 6f 77 6e 20 66 75 6e 63 74 69 6f 6e  hutdown function
19af0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
19b00 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 74 72        foreach tr
19b10 61 6e 73 61 63 74 69 6f 6e 20 5b 69 6e 66 6f 20  ansaction [info 
19b20 74 72 61 6e 73 61 63 74 69 6f 6e 73 5d 20 7b 0d  transactions] {.
19b30 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
19b40 73 74 72 69 6e 67 20 6d 61 74 63 68 20 5c 0d 0a  string match \..
19b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
19b60 73 74 65 6d 23 44 61 74 61 23 53 51 4c 69 74 65  stem#Data#SQLite
19b70 23 53 51 4c 69 74 65 54 72 61 6e 73 61 63 74 69  #SQLiteTransacti
19b80 6f 6e 23 2a 20 24 74 72 61 6e 73 61 63 74 69 6f  on#* $transactio
19b90 6e 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  n]} then {..    
19ba0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
19bb0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
19bc0 20 20 20 20 73 71 6c 20 74 72 61 6e 73 61 63 74      sql transact
19bd0 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 24 74 72  ion rollback $tr
19be0 61 6e 73 61 63 74 69 6f 6e 0d 0a 20 20 20 20 20  ansaction..     
19bf0 20 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d 20         } error] 
19c00 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
19c10 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
19c20 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
19c30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19c40 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
19c50 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
19c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c70 20 20 20 22 2d 2d 2d 2d 20 72 6f 6c 6c 65 64 20     "---- rolled 
19c80 62 61 63 6b 20 6c 65 61 6b 65 64 20 74 72 61 6e  back leaked tran
19c90 73 61 63 74 69 6f 6e 20 5c 22 22 20 5c 0d 0a 20  saction \"" \.. 
19ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cb0 20 20 20 24 74 72 61 6e 73 61 63 74 69 6f 6e 20     $transaction 
19cc0 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  \"\n]..         
19cd0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
19ce0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
19cf0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
19d00 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
19d10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19d20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
19d30 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
19d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d50 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
19d60 3a 20 66 61 69 6c 65 64 20 74 6f 20 72 6f 6c 6c  : failed to roll
19d70 62 61 63 6b 20 6c 65 61 6b 65 64 20 74 72 61 6e  back leaked tran
19d80 73 61 63 74 69 6f 6e 20 5c 22 22 20 5c 0d 0a 20  saction \"" \.. 
19d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19da0 20 20 20 24 74 72 61 6e 73 61 63 74 69 6f 6e 20     $transaction 
19db0 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e  "\", error: " \n
19dc0 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20  \t $error \n].. 
19dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
19de0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
19df0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
19e00 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
19e10 20 66 6f 72 65 61 63 68 20 64 62 20 5b 69 6e 66   foreach db [inf
19e20 6f 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 5d 20 7b  o connections] {
19e30 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
19e40 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 5c 0d  [string match \.
19e50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  .              S
19e60 79 73 74 65 6d 23 44 61 74 61 23 53 51 4c 69 74  ystem#Data#SQLit
19e70 65 23 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69  e#SQLiteConnecti
19e80 6f 6e 23 2a 20 24 64 62 5d 7d 20 74 68 65 6e 20  on#* $db]} then 
19e90 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
19ea0 66 20 7b 5b 63 61 74 63 68 20 7b 73 71 6c 20 63  f {[catch {sql c
19eb0 6c 6f 73 65 20 24 64 62 7d 20 65 72 72 6f 72 5d  lose $db} error]
19ec0 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
19ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
19ee0 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
19ef0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19f00 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
19f10 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
19f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f30 20 20 20 20 22 2d 2d 2d 2d 20 63 6c 6f 73 65 64      "---- closed
19f40 20 6c 65 61 6b 65 64 20 64 61 74 61 62 61 73 65   leaked database
19f50 20 5c 22 22 20 24 64 62 20 5c 22 5c 6e 5d 0d 0a   \"" $db \"\n]..
19f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
19f70 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65  .            } e
19f80 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
19f90 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
19fa0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
19fb0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
19fc0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
19fd0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
19fe0 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
19ff0 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
1a000 64 20 74 6f 20 63 6c 6f 73 65 20 6c 65 61 6b 65  d to close leake
1a010 64 20 64 61 74 61 62 61 73 65 20 5c 22 22 20 5c  d database \"" \
1a020 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1a030 20 20 20 20 20 20 24 64 62 20 22 5c 22 2c 20 65        $db "\", e
1a040 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72  rror: " \n\t $er
1a050 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ror \n]..       
1a060 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1a070 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1a080 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
1a090 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1a0a0 20 20 20 20 20 20 23 20 42 55 47 46 49 58 3a 20        # BUGFIX: 
1a0b0 42 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74  Before calling t
1a0c0 68 65 20 6e 61 74 69 76 65 20 73 68 75 74 64 6f  he native shutdo
1a0d0 77 6e 20 66 75 6e 63 74 69 6f 6e 2c 20 6d 61 6b  wn function, mak
1a0e0 65 20 73 75 72 65 20 62 6f 74 68 0d 0a 20 20 20  e sure both..   
1a0f0 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 6f       #         o
1a100 66 20 74 68 65 20 50 52 41 47 4d 41 20 72 65 6c  f the PRAGMA rel
1a110 61 74 65 64 20 64 69 72 65 63 74 6f 72 79 20 6e  ated directory n
1a120 61 6d 65 73 20 61 72 65 20 66 72 65 65 64 2e 0d  ames are freed..
1a130 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1a140 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69      checkForSQLi
1a150 74 65 44 69 72 65 63 74 6f 72 69 65 73 20 24 63  teDirectories $c
1a160 68 61 6e 6e 65 6c 20 74 72 75 65 0d 0a 0d 0a 20  hannel true.... 
1a170 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
1a180 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f  h {..          o
1a190 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
1a1a0 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
1a1b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1a1c0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
1a1d0 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d  te.UnsafeNativeM
1a1e0 65 74 68 6f 64 73 20 73 71 6c 69 74 65 33 5f 73  ethods sqlite3_s
1a1f0 68 75 74 64 6f 77 6e 0d 0a 20 20 20 20 20 20 20  hutdown..       
1a200 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d   } result] == 0}
1a210 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1a220 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
1a230 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1a240 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1a250 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1a260 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1a270 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c    "---- call sql
1a280 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 2e  ite3_shutdown().
1a290 2e 2e 20 6f 6b 3a 20 22 20 24 72 65 73 75 6c 74  .. ok: " $result
1a2a0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
1a2b0 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  }..        } els
1a2c0 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  e {..          i
1a2d0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
1a2e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1a2f0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
1a300 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1a310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
1a320 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  --- call sqlite3
1a330 5f 73 68 75 74 64 6f 77 6e 28 29 2e 2e 2e 20 65  _shutdown()... e
1a340 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65  rror: " \n\t $re
1a350 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  sult \n]..      
1a360 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1a370 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
1a380 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 65  .....    proc re
1a390 70 6f 72 74 53 51 4c 69 74 65 52 65 73 6f 75 72  portSQLiteResour
1a3a0 63 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  ces {..         
1a3b0 20 20 20 63 68 61 6e 6e 65 6c 20 7b 71 75 69 65     channel {quie
1a3c0 74 20 66 61 6c 73 65 7d 20 7b 72 65 73 65 74 20  t false} {reset 
1a3d0 74 72 75 65 7d 20 7b 63 6f 6c 6c 65 63 74 20 74  true} {collect t
1a3e0 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  rue} } {..      
1a3f0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
1a400 20 49 66 20 61 76 61 69 6c 61 62 6c 65 2c 20 72   If available, r
1a410 65 70 6f 72 74 20 6f 6e 20 28 61 6e 64 20 70 6f  eport on (and po
1a420 73 73 69 62 6c 79 20 72 65 73 65 74 29 20 74 68  ssibly reset) th
1a430 65 20 72 75 6e 74 69 6d 65 0d 0a 20 20 20 20 20  e runtime..     
1a440 20 23 20 20 20 20 20 20 20 63 6f 6e 66 69 67 75   #       configu
1a450 72 61 74 69 6f 6e 20 73 74 61 74 69 73 74 69 63  ration statistic
1a460 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s...      #..   
1a470 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69     if {[haveSQLi
1a480 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d  teObjectCommand]
1a490 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
1a4a0 20 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74   [haveConstraint
1a4b0 20 62 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74   buildConfigurat
1a4c0 69 6f 6e 2e 44 65 62 75 67 5d 20 26 26 20 5b 63  ion.Debug] && [c
1a4d0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
1a4e0 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
1a4f0 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
1a500 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20 20  -alias \..      
1a510 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
1a520 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e  a.SQLite.UnsafeN
1a530 61 74 69 76 65 4d 65 74 68 6f 64 73 20 73 65 74  ativeMethods set
1a540 74 69 6e 67 52 65 61 64 43 6f 75 6e 74 73 0d 0a  tingReadCounts..
1a550 20 20 20 20 20 20 7d 20 73 65 74 74 69 6e 67 52        } settingR
1a560 65 61 64 43 6f 75 6e 74 73 5d 20 3d 3d 20 30 7d  eadCounts] == 0}
1a570 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1a580 20 73 65 74 20 6e 61 6d 65 43 6f 75 6e 74 20 5b   set nameCount [
1a590 24 73 65 74 74 69 6e 67 52 65 61 64 43 6f 75 6e  $settingReadCoun
1a5a0 74 73 20 43 6f 75 6e 74 5d 0d 0a 20 20 20 20 20  ts Count]..     
1a5b0 20 20 20 73 65 74 20 76 61 6c 75 65 43 6f 75 6e     set valueCoun
1a5c0 74 20 30 0d 0a 0d 0a 20 20 20 20 20 20 20 20 6f  t 0....        o
1a5d0 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20 2d 61  bject foreach -a
1a5e0 6c 69 61 73 20 70 61 69 72 20 24 73 65 74 74 69  lias pair $setti
1a5f0 6e 67 52 65 61 64 43 6f 75 6e 74 73 20 7b 0d 0a  ngReadCounts {..
1a600 20 20 20 20 20 20 20 20 20 20 69 6e 63 72 20 76            incr v
1a610 61 6c 75 65 43 6f 75 6e 74 20 5b 24 70 61 69 72  alueCount [$pair
1a620 20 56 61 6c 75 65 5d 0d 0a 0d 0a 20 20 20 20 20   Value]....     
1a630 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
1a640 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1a650 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1a660 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1a670 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1a680 20 20 20 20 22 2d 2d 2d 2d 20 73 65 74 74 69 6e      "---- settin
1a690 67 20 5c 22 22 20 5b 24 70 61 69 72 20 4b 65 79  g \"" [$pair Key
1a6a0 5d 20 22 5c 22 20 77 61 73 20 72 65 61 64 20 22  ] "\" was read "
1a6b0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1a6c0 20 20 20 20 5b 24 70 61 69 72 20 56 61 6c 75 65      [$pair Value
1a6d0 5d 20 22 20 74 69 6d 65 73 5c 6e 22 5d 0d 0a 20  ] " times\n"].. 
1a6e0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1a6f0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1a700 20 69 66 20 7b 24 72 65 73 65 74 7d 20 74 68 65   if {$reset} the
1a710 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
1a720 66 20 7b 5b 63 61 74 63 68 20 7b 24 73 65 74 74  f {[catch {$sett
1a730 69 6e 67 52 65 61 64 43 6f 75 6e 74 73 20 43 6c  ingReadCounts Cl
1a740 65 61 72 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30  ear} error] == 0
1a750 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1a760 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
1a770 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
1a780 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1a790 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1a7a0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1a7b0 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 72           "---- r
1a7c0 65 73 65 74 20 73 65 74 74 69 6e 67 20 73 74 61  eset setting sta
1a7d0 74 69 73 74 69 63 73 20 66 6f 72 20 74 68 65 20  tistics for the 
1a7e0 70 72 65 76 69 6f 75 73 20 22 20 5c 0d 0a 20 20  previous " \..  
1a7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a800 24 6e 61 6d 65 43 6f 75 6e 74 20 22 20 6e 61 6d  $nameCount " nam
1a810 65 73 20 61 6e 64 20 22 20 24 76 61 6c 75 65 43  es and " $valueC
1a820 6f 75 6e 74 20 22 20 76 61 6c 75 65 73 20 72 65  ount " values re
1a830 61 64 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  ad\n"]..        
1a840 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1a850 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1a860 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1a870 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1a880 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1a890 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
1a8a0 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 72 65  NG: failed to re
1a8b0 73 65 74 20 73 65 74 74 69 6e 67 20 73 74 61 74  set setting stat
1a8c0 69 73 74 69 63 73 20 66 6f 72 20 22 20 5c 0d 0a  istics for " \..
1a8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8e0 22 74 68 65 20 70 72 65 76 69 6f 75 73 20 22 20  "the previous " 
1a8f0 24 6e 61 6d 65 43 6f 75 6e 74 20 22 20 6e 61 6d  $nameCount " nam
1a900 65 73 20 61 6e 64 20 22 20 24 76 61 6c 75 65 43  es and " $valueC
1a910 6f 75 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  ount \..        
1a920 20 20 20 20 20 20 20 20 22 20 76 61 6c 75 65 73          " values
1a930 20 72 65 61 64 2c 20 65 72 72 6f 72 3a 20 22 20   read, error: " 
1a940 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
1a950 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
1a960 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
1a970 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68  ....      if {[h
1a980 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43  aveSQLiteObjectC
1a990 6f 6d 6d 61 6e 64 5d 20 26 26 20 5b 68 61 76 65  ommand] && [have
1a9a0 43 6f 6e 73 74 72 61 69 6e 74 20 5c 0d 0a 20 20  Constraint \..  
1a9b0 20 20 20 20 20 20 20 20 20 20 20 20 64 65 66 69              defi
1a9c0 6e 65 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74 65  neConstant.Syste
1a9d0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 49 4e  m.Data.SQLite.IN
1a9e0 54 45 52 4f 50 5f 56 49 52 54 55 41 4c 5f 54 41  TEROP_VIRTUAL_TA
1a9f0 42 4c 45 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  BLE] && \..     
1aa00 20 20 20 20 20 5b 68 61 76 65 43 6f 6e 73 74 72       [haveConstr
1aa10 61 69 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  aint \..        
1aa20 20 20 20 20 20 20 64 65 66 69 6e 65 43 6f 6e 73        defineCons
1aa30 74 61 6e 74 2e 53 79 73 74 65 6d 2e 44 61 74 61  tant.System.Data
1aa40 2e 53 51 4c 69 74 65 2e 54 52 41 43 4b 5f 4d 45  .SQLite.TRACK_ME
1aa50 4d 4f 52 59 5f 42 59 54 45 53 5d 7d 20 74 68 65  MORY_BYTES]} the
1aa60 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
1aa70 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
1aa80 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
1aa90 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
1aaa0 20 63 75 72 72 65 6e 74 20 6d 65 6d 6f 72 79 20   current memory 
1aab0 69 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74 65  in use by SQLite
1aac0 4d 65 6d 6f 72 79 2e 2e 2e 20 22 0d 0a 20 20 20  Memory... "..   
1aad0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1aae0 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
1aaf0 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
1ab00 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
1ab10 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
1ab20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
1ab30 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51  m.Data.SQLite.SQ
1ab40 4c 69 74 65 4d 65 6d 6f 72 79 20 62 79 74 65 73  LiteMemory bytes
1ab50 41 6c 6c 6f 63 61 74 65 64 0d 0a 20 20 20 20 20  Allocated..     
1ab60 20 20 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20     } memory] == 
1ab70 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
1ab80 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
1ab90 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1aba0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1abb0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1abc0 20 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65 73   $memory " bytes
1abd0 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
1abe0 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  }..        } els
1abf0 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  e {..          s
1ac00 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77  et memory unknow
1ac10 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n....          i
1ac20 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
1ac30 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1ac40 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
1ac50 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f  appendArgs $memo
1ac60 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ry \n]..        
1ac70 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
1ac80 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24  ..        if {!$
1ac90 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
1aca0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1acb0 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 6d 61  channel "---- ma
1acc0 78 69 6d 75 6d 20 6d 65 6d 6f 72 79 20 69 6e 20  ximum memory in 
1acd0 75 73 65 20 62 79 20 53 51 4c 69 74 65 4d 65 6d  use by SQLiteMem
1ace0 6f 72 79 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20  ory... "..      
1acf0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69    }....        i
1ad00 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
1ad10 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
1ad20 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
1ad30 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
1ad40 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
1ad50 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74  ata.SQLite.SQLit
1ad60 65 4d 65 6d 6f 72 79 20 6d 61 78 69 6d 75 6d 42  eMemory maximumB
1ad70 79 74 65 73 41 6c 6c 6f 63 61 74 65 64 0d 0a 20  ytesAllocated.. 
1ad80 20 20 20 20 20 20 20 7d 20 6d 65 6d 6f 72 79 5d         } memory]
1ad90 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
1ada0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
1adb0 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
1adc0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1add0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
1ade0 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20 62  Args $memory " b
1adf0 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  ytes\n"]..      
1ae00 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1ae10 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1ae20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e     set memory un
1ae30 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20  known....       
1ae40 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
1ae50 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1ae60 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1ae70 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  el [appendArgs $
1ae80 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20  memory \n]..    
1ae90 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1aea0 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
1aeb0 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
1aec0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1aed0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1aee0 20 22 2d 2d 2d 2d 20 63 75 72 72 65 6e 74 20 6d   "---- current m
1aef0 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20  emory in use by 
1af00 53 51 4c 69 74 65 2e 2e 2e 20 22 0d 0a 20 20 20  SQLite... "..   
1af10 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
1af20 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a   {[haveSQLiteObj
1af30 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65  ectCommand]} the
1af40 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
1af50 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
1af60 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
1af70 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
1af80 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
1af90 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
1afa0 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e  a.SQLite.UnsafeN
1afb0 61 74 69 76 65 4d 65 74 68 6f 64 73 20 73 71 6c  ativeMethods sql
1afc0 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64  ite3_memory_used
1afd0 0d 0a 20 20 20 20 20 20 20 20 7d 20 6d 65 6d 6f  ..        } memo
1afe0 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  ry] == 0} then {
1aff0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
1b000 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
1b010 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
1b020 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
1b030 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20  endArgs $memory 
1b040 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20  " bytes\n"]..   
1b050 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1b060 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1b070 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1b080 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 79 62 65     # NOTE: Maybe
1b090 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65   the SQLite core
1b0a0 20 6c 69 62 72 61 72 79 20 69 73 20 75 6e 61 76   library is unav
1b0b0 61 69 6c 61 62 6c 65 3f 0d 0a 20 20 20 20 20 20  ailable?..      
1b0c0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1b0d0 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e   set memory unkn
1b0e0 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  own....         
1b0f0 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
1b100 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1b110 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1b120 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65   [appendArgs $me
1b130 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  mory \n]..      
1b140 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1b150 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
1b160 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d 65  ..        set me
1b170 6d 6f 72 79 20 75 6e 61 76 61 69 6c 61 62 6c 65  mory unavailable
1b180 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
1b190 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
1b1a0 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
1b1b0 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
1b1c0 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e  dArgs $memory \n
1b1d0 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
1b1e0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73      }....      s
1b1f0 65 74 20 72 65 73 75 6c 74 20 24 6d 65 6d 6f 72  et result $memor
1b200 79 3b 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72  y; # NOTE: Retur
1b210 6e 20 6d 65 6d 6f 72 79 20 69 6e 2d 75 73 65 20  n memory in-use 
1b220 74 6f 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a  to our caller...
1b230 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71 75  ..      if {!$qu
1b240 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
1b250 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1b260 6e 65 6c 20 22 2d 2d 2d 2d 20 6d 61 78 69 6d 75  nel "---- maximu
1b270 6d 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20  m memory in use 
1b280 62 79 20 53 51 4c 69 74 65 2e 2e 2e 20 22 0d 0a  by SQLite... "..
1b290 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1b2a0 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65   if {[haveSQLite
1b2b0 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20  ObjectCommand]} 
1b2c0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1b2d0 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
1b2e0 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
1b2f0 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
1b300 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
1b310 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
1b320 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61  Data.SQLite.Unsa
1b330 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20  feNativeMethods 
1b340 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1b350 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f   sqlite3_memory_
1b360 68 69 67 68 77 61 74 65 72 20 30 0d 0a 20 20 20  highwater 0..   
1b370 20 20 20 20 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d       } memory] =
1b380 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
1b390 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
1b3a0 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
1b3b0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1b3c0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1b3d0 67 73 20 24 6d 65 6d 6f 72 79 20 22 20 62 79 74  gs $memory " byt
1b3e0 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  es\n"]..        
1b3f0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65    }..        } e
1b400 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
1b410 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
1b420 4e 4f 54 45 3a 20 4d 61 79 62 65 20 74 68 65 20  NOTE: Maybe the 
1b430 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72  SQLite core libr
1b440 61 72 79 20 69 73 20 75 6e 61 76 61 69 6c 61 62  ary is unavailab
1b450 6c 65 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 23  le?..          #
1b460 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
1b470 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a  memory unknown..
1b480 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
1b490 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
1b4a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
1b4b0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
1b4c0 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20  endArgs $memory 
1b4d0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
1b4e0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
1b4f0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1b500 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20       set memory 
1b510 75 6e 61 76 61 69 6c 61 62 6c 65 0d 0a 0d 0a 20  unavailable.... 
1b520 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
1b530 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
1b540 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1b550 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1b560 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20   $memory \n]..  
1b570 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
1b580 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 63  ....      if {$c
1b590 6f 6c 6c 65 63 74 7d 20 74 68 65 6e 20 7b 0d 0a  ollect} then {..
1b5a0 20 20 20 20 20 20 20 20 63 6f 6c 6c 65 63 74 47          collectG
1b5b0 61 72 62 61 67 65 20 24 63 68 61 6e 6e 65 6c 0d  arbage $channel.
1b5c0 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
1b5d0 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
1b5e0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  hen {..        t
1b5f0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
1b600 2d 2d 2d 20 63 75 72 72 65 6e 74 20 6d 65 6d 6f  --- current memo
1b610 72 79 20 69 6e 20 75 73 65 20 62 79 20 74 68 65  ry in use by the
1b620 20 43 4c 52 2e 2e 2e 20 22 0d 0a 20 20 20 20 20   CLR... "..     
1b630 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   }....      if {
1b640 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63  [haveSQLiteObjec
1b650 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20  tCommand]} then 
1b660 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  {..        if {[
1b670 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
1b680 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
1b690 20 47 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f   GC GetTotalMemo
1b6a0 72 79 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20  ry false..      
1b6b0 20 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30    } memory] == 0
1b6c0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1b6d0 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
1b6e0 69 73 20 69 6e 74 65 67 65 72 20 2d 73 74 72 69  is integer -stri
1b6f0 63 74 20 24 6d 65 6d 6f 72 79 5d 7d 20 74 68 65  ct $memory]} the
1b700 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1b710 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
1b720 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1b730 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1b740 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  el [appendArgs $
1b750 6d 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e  memory " bytes\n
1b760 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  "]..            
1b770 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  }..          } e
1b780 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
1b790 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 69 6e     set memory in
1b7a0 76 61 6c 69 64 0d 0a 0d 0a 20 20 20 20 20 20 20  valid....       
1b7b0 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
1b7c0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1b7d0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1b7e0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1b7f0 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a  gs $memory \n]..
1b800 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1b810 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1b820 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1b830 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f          set memo
1b840 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20  ry unknown....  
1b850 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
1b860 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
1b870 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1b880 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1b890 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d  rgs $memory \n].
1b8a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
1b8b0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
1b8c0 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1b8d0 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 61 76   set memory unav
1b8e0 61 69 6c 61 62 6c 65 0d 0a 0d 0a 20 20 20 20 20  ailable....     
1b8f0 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
1b900 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1b910 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1b920 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65   [appendArgs $me
1b930 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  mory \n]..      
1b940 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
1b950 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65        return $re
1b960 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  sult..    }.....
1b970 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f      proc checkFo
1b980 72 53 51 4c 69 74 65 44 69 72 65 63 74 6f 72 69  rSQLiteDirectori
1b990 65 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 72 65  es { channel {re
1b9a0 73 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  set false} } {..
1b9b0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
1b9c0 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20   NOTE: Check if 
1b9d0 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  the sqlite3_win3
1b9e0 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20  2_set_directory 
1b9f0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 76 61 69  function is avai
1ba00 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d  lable...      #.
1ba10 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68  .      tputs $ch
1ba20 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20  annel \..       
1ba30 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e     "---- checkin
1ba40 67 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 73  g for function s
1ba50 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
1ba60 5f 64 69 72 65 63 74 6f 72 79 2e 2e 2e 20 22 0d  _directory... ".
1ba70 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
1ba80 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 63    # NOTE: This c
1ba90 61 6c 6c 20 74 6f 20 74 68 65 20 73 71 6c 69 74  all to the sqlit
1baa0 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72  e3_win32_set_dir
1bab0 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20  ectory function 
1bac0 75 73 65 73 20 74 68 65 0d 0a 20 20 20 20 20 20  uses the..      
1bad0 23 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 20  #       invalid 
1bae0 76 61 6c 75 65 20 30 20 66 6f 72 20 74 68 65 20  value 0 for the 
1baf0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
1bb00 20 54 68 69 73 20 63 6f 64 65 20 69 73 20 64 65   This code is de
1bb10 73 69 67 6e 65 64 0d 0a 20 20 20 20 20 20 23 20  signed..      # 
1bb20 20 20 20 20 20 20 74 6f 20 63 68 65 63 6b 20 69        to check i
1bb30 66 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 66 75  f calling the fu
1bb40 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 61 69 73  nction will rais
1bb50 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 28  e an exception (
1bb60 69 2e 65 2e 0d 0a 20 20 20 20 20 20 23 20 20 20  i.e...      #   
1bb70 20 20 20 20 74 68 65 20 61 63 74 75 61 6c 20 72      the actual r
1bb80 65 73 75 6c 74 20 6f 66 20 74 68 65 20 66 75 6e  esult of the fun
1bb90 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6d  ction does not m
1bba0 61 74 74 65 72 20 61 73 20 6c 6f 6e 67 20 61 73  atter as long as
1bbb0 20 6e 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20   no..      #    
1bbc0 20 20 20 64 69 72 65 63 74 6f 72 79 20 69 73 20     directory is 
1bbd0 63 68 61 6e 67 65 64 29 2e 0d 0a 20 20 20 20 20  changed)...     
1bbe0 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63   #..      if {[c
1bbf0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
1bc00 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
1bc10 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
1bc20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  \..            S
1bc30 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
1bc40 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  e.UnsafeNativeMe
1bc50 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20  thods \..       
1bc60 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e       sqlite3_win
1bc70 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79  32_set_directory
1bc80 20 30 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 7d   0 null..      }
1bc90 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
1bca0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1bcb0 20 20 20 23 20 4e 4f 54 45 3a 20 43 61 6c 6c 69     # NOTE: Calli
1bcc0 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 77  ng the sqlite3_w
1bcd0 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
1bce0 72 79 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  ry function does
1bcf0 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20 23 20   not..        # 
1bd00 20 20 20 20 20 20 63 61 75 73 65 20 61 6e 20 65        cause an e
1bd10 78 63 65 70 74 69 6f 6e 3b 20 74 68 65 72 65 66  xception; theref
1bd20 6f 72 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20  ore, it must be 
1bd30 61 76 61 69 6c 61 62 6c 65 20 28 69 2e 65 2e 0d  available (i.e..
1bd40 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
1bd50 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20   even though it 
1bd60 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 61 20  should return a 
1bd70 66 61 69 6c 75 72 65 20 72 65 74 75 72 6e 20 63  failure return c
1bd80 6f 64 65 20 69 6e 20 74 68 69 73 0d 0a 20 20 20  ode in this..   
1bd90 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61 73       #       cas
1bda0 65 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e)...        #..
1bdb0 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
1bdc0 72 61 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 69  raint sqlite3_wi
1bdd0 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
1bde0 79 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75  y....        tpu
1bdf0 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c  ts $channel yes\
1be00 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n....        #..
1be10 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1be20 44 6f 65 73 20 6f 75 72 20 63 61 6c 6c 65 72 20  Does our caller 
1be30 77 61 6e 74 20 74 6f 20 72 65 73 65 74 20 74 68  want to reset th
1be40 65 20 64 69 72 65 63 74 6f 72 69 65 73 3f 0d 0a  e directories?..
1be50 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1be60 20 20 20 69 66 20 7b 24 72 65 73 65 74 7d 20 74     if {$reset} t
1be70 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1be80 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
1be90 4e 4f 54 45 3a 20 4e 6f 77 20 6d 61 6b 65 20 73  NOTE: Now make s
1bea0 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ure the database
1beb0 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 64   and temporary d
1bec0 69 72 65 63 74 6f 72 69 65 73 20 61 72 65 0d 0a  irectories are..
1bed0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
1bee0 20 20 72 65 73 65 74 20 74 68 65 69 72 20 64 65    reset their de
1bef0 66 61 75 6c 74 20 76 61 6c 75 65 73 2c 20 77 68  fault values, wh
1bf00 69 63 68 20 73 68 6f 75 6c 64 20 62 65 20 6e 75  ich should be nu
1bf10 6c 6c 20 66 6f 72 20 62 6f 74 68 2e 0d 0a 20 20  ll for both...  
1bf20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1bf30 53 69 6e 63 65 20 74 68 65 20 73 71 6c 69 74 65  Since the sqlite
1bf40 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65  3_win32_set_dire
1bf50 63 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20 69  ctory function i
1bf60 73 20 61 76 61 69 6c 61 62 6c 65 2c 0d 0a 20 20  s available,..  
1bf70 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1bf80 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20  use it...       
1bf90 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1bfa0 66 6f 72 20 7b 73 65 74 20 69 6e 64 65 78 20 31  for {set index 1
1bfb0 7d 20 7b 24 69 6e 64 65 78 20 3c 20 33 7d 20 7b  } {$index < 3} {
1bfc0 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20  incr index} {.. 
1bfd0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
1bfe0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
1bff0 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
1c000 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
1c010 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
1c020 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
1c030 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55  em.Data.SQLite.U
1c040 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
1c050 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ds \..          
1c060 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1c070 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
1c080 6f 72 79 20 24 69 6e 64 65 78 20 6e 75 6c 6c 0d  ory $index null.
1c090 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 72  .            } r
1c0a0 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65  esult] == 0} the
1c0b0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1c0c0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1c0d0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1c0e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c0f0 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71     "---- call sq
1c100 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f  lite3_win32_set_
1c110 64 69 72 65 63 74 6f 72 79 28 22 20 24 69 6e 64  directory(" $ind
1c120 65 78 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ex \..          
1c130 20 20 20 20 20 20 20 20 22 2c 20 6e 75 6c 6c 29          ", null)
1c140 2e 2e 2e 20 6f 6b 3a 20 22 20 24 72 65 73 75 6c  ... ok: " $resul
1c150 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  t \n]..         
1c160 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1c170 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1c180 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
1c190 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1c1a0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
1c1b0 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 77 69   call sqlite3_wi
1c1c0 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
1c1d0 79 28 22 20 24 69 6e 64 65 78 20 5c 0d 0a 20 20  y(" $index \..  
1c1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1f0 22 2c 20 6e 75 6c 6c 29 2e 2e 2e 20 65 72 72 6f  ", null)... erro
1c200 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c  r: " \n\t $resul
1c210 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  t \n]..         
1c220 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
1c230 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
1c240 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1c250 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1c260 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 0d 0a 20 20 20  nnel no\n....   
1c270 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1c280 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20 6f 75 72  # NOTE: Does our
1c290 20 63 61 6c 6c 65 72 20 77 61 6e 74 20 74 6f 20   caller want to 
1c2a0 72 65 73 65 74 20 74 68 65 20 64 69 72 65 63 74  reset the direct
1c2b0 6f 72 69 65 73 3f 20 20 54 68 69 73 20 63 61 6e  ories?  This can
1c2c0 20 6f 6e 6c 79 0d 0a 20 20 20 20 20 20 20 20 23   only..        #
1c2d0 20 20 20 20 20 20 20 62 65 20 70 65 72 66 6f 72         be perfor
1c2e0 6d 65 64 20 69 66 20 53 51 4c 69 74 65 20 69 73  med if SQLite is
1c2f0 20 6c 6f 61 64 65 64 20 61 6e 64 20 72 65 61 64   loaded and read
1c300 79 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65  y for use by the
1c310 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20 23   test..        #
1c320 20 20 20 20 20 20 20 73 75 69 74 65 2e 0d 0a 20         suite... 
1c330 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1c340 20 20 69 66 20 7b 24 72 65 73 65 74 20 26 26 20    if {$reset && 
1c350 5b 69 73 53 51 4c 69 74 65 52 65 61 64 79 5d 7d  [isSQLiteReady]}
1c360 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1c370 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1c380 23 20 4e 4f 54 45 3a 20 4e 6f 77 20 6d 61 6b 65  # NOTE: Now make
1c390 20 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61   sure the databa
1c3a0 73 65 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79  se and temporary
1c3b0 20 64 69 72 65 63 74 6f 72 69 65 73 20 61 72 65   directories are
1c3c0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
1c3d0 20 20 20 20 72 65 73 65 74 20 74 68 65 69 72 20      reset their 
1c3e0 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 2c 20  default values, 
1c3f0 77 68 69 63 68 20 73 68 6f 75 6c 64 20 62 65 20  which should be 
1c400 6e 75 6c 6c 20 66 6f 72 20 62 6f 74 68 2e 0d 0a  null for both...
1c410 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
1c420 20 20 53 69 6e 63 65 20 74 68 65 20 73 71 6c 69    Since the sqli
1c430 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69  te3_win32_set_di
1c440 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e  rectory function
1c450 20 64 6f 65 73 20 6e 6f 74 0d 0a 20 20 20 20 20   does not..     
1c460 20 20 20 20 20 23 20 20 20 20 20 20 20 61 70 70       #       app
1c470 65 61 72 20 74 6f 20 62 65 20 61 76 61 69 6c 61  ear to be availa
1c480 62 6c 65 2c 20 75 73 65 20 74 68 65 20 61 73 73  ble, use the ass
1c490 6f 63 69 61 74 65 64 20 50 52 41 47 4d 41 20 63  ociated PRAGMA c
1c4a0 6f 6d 6d 61 6e 64 73 0d 0a 20 20 20 20 20 20 20  ommands..       
1c4b0 20 20 20 23 20 20 20 20 20 20 20 69 6e 73 74 65     #       inste
1c4c0 61 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ad...          #
1c4d0 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65  ..          fore
1c4e0 61 63 68 20 64 69 72 65 63 74 6f 72 79 20 5b 6c  ach directory [l
1c4f0 69 73 74 20 64 61 74 61 5f 73 74 6f 72 65 5f 64  ist data_store_d
1c500 69 72 65 63 74 6f 72 79 20 74 65 6d 70 5f 73 74  irectory temp_st
1c510 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 7b  ore_directory] {
1c520 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ..            se
1c530 74 20 73 71 6c 20 5b 61 70 70 65 6e 64 41 72 67  t sql [appendArg
1c540 73 20 22 50 52 41 47 4d 41 20 22 20 24 64 69 72  s "PRAGMA " $dir
1c550 65 63 74 6f 72 79 20 22 20 3d 20 5c 22 5c 22 3b  ectory " = \"\";
1c560 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  "]....          
1c570 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 65 78    if {[catch {ex
1c580 65 63 75 74 65 53 71 6c 20 24 73 71 6c 7d 20 72  ecuteSql $sql} r
1c590 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65  esult] == 0} the
1c5a0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1c5b0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1c5c0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1c5d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c5e0 20 20 20 22 2d 2d 2d 2d 20 65 78 65 63 75 74 65     "---- execute
1c5f0 20 50 52 41 47 4d 41 20 22 20 24 64 69 72 65 63   PRAGMA " $direc
1c600 74 6f 72 79 20 22 2e 2e 2e 20 6f 6b 3a 20 5c 22  tory "... ok: \"
1c610 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
1c620 20 20 20 20 20 20 20 24 72 65 73 75 6c 74 20 5c         $result \
1c630 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  "\n]..          
1c640 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1c650 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1c660 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
1c670 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1c680 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
1c690 65 78 65 63 75 74 65 20 50 52 41 47 4d 41 20 22  execute PRAGMA "
1c6a0 20 24 64 69 72 65 63 74 6f 72 79 20 22 2e 2e 2e   $directory "...
1c6b0 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20   error: " \..   
1c6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1c6d0 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d  n\t $result \n].
1c6e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
1c6f0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1c700 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
1c710 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
1c720 20 20 23 20 4e 4f 54 45 3a 20 46 69 6e 61 6c 6c    # NOTE: Finall
1c730 79 2c 20 73 68 6f 77 20 74 68 65 20 63 75 72 72  y, show the curr
1c740 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65  ent value of the
1c750 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 65   database and te
1c760 6d 70 6f 72 61 72 79 0d 0a 20 20 20 20 20 20 23  mporary..      #
1c770 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 69         directori
1c780 65 73 2e 20 20 54 68 69 73 20 63 61 6e 20 6f 6e  es.  This can on
1c790 6c 79 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20  ly be performed 
1c7a0 69 66 20 53 51 4c 69 74 65 20 69 73 20 6c 6f 61  if SQLite is loa
1c7b0 64 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ded..      #    
1c7c0 20 20 20 61 6e 64 20 72 65 61 64 79 20 66 6f 72     and ready for
1c7d0 20 75 73 65 20 62 79 20 74 68 65 20 74 65 73 74   use by the test
1c7e0 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 23   suite...      #
1c7f0 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 73 53  ..      if {[isS
1c800 51 4c 69 74 65 52 65 61 64 79 5d 7d 20 74 68 65  QLiteReady]} the
1c810 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 66 6f 72  n {..        for
1c820 65 61 63 68 20 64 69 72 65 63 74 6f 72 79 20 5b  each directory [
1c830 6c 69 73 74 20 64 61 74 61 5f 73 74 6f 72 65 5f  list data_store_
1c840 64 69 72 65 63 74 6f 72 79 20 74 65 6d 70 5f 73  directory temp_s
1c850 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 5d 20  tore_directory] 
1c860 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
1c870 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
1c880 65 6e 64 41 72 67 73 20 22 2d 2d 2d 2d 20 63 68  endArgs "---- ch
1c890 65 63 6b 69 6e 67 20 22 20 24 64 69 72 65 63 74  ecking " $direct
1c8a0 6f 72 79 20 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20  ory "... "].... 
1c8b0 20 20 20 20 20 20 20 20 20 73 65 74 20 73 71 6c           set sql
1c8c0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 50 52   [appendArgs "PR
1c8d0 41 47 4d 41 20 22 20 24 64 69 72 65 63 74 6f 72  AGMA " $director
1c8e0 79 20 5c 3b 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  y \;]....       
1c8f0 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 65     if {[catch {e
1c900 78 65 63 75 74 65 53 71 6c 20 24 73 71 6c 20 73  xecuteSql $sql s
1c910 63 61 6c 61 72 7d 20 72 65 73 75 6c 74 5d 20 3d  calar} result] =
1c920 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
1c930 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1c940 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1c950 72 67 73 20 22 6f 6b 3a 20 5c 22 22 20 24 72 65  rgs "ok: \"" $re
1c960 73 75 6c 74 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20  sult \"\n]..    
1c970 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1c980 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1c990 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1c9a0 6e 64 41 72 67 73 20 22 65 72 72 6f 72 3a 20 22  ndArgs "error: "
1c9b0 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e   \n\t $result \n
1c9c0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
1c9d0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1c9e0 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
1c9f0 20 20 70 72 6f 63 20 6c 6f 61 64 53 51 4c 69 74    proc loadSQLit
1ca00 65 54 65 73 74 53 65 74 74 69 6e 67 73 20 7b 20  eTestSettings { 
1ca10 63 68 61 6e 6e 65 6c 20 7b 73 75 66 66 69 78 20  channel {suffix 
1ca20 22 22 7d 20 7b 71 75 69 65 74 20 66 61 6c 73 65  ""} {quiet false
1ca30 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
1ca40 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b        # NOTE: Sk
1ca50 69 70 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 73  ip loading the s
1ca60 65 74 74 69 6e 67 73 20 69 66 20 74 68 65 69 72  ettings if their
1ca70 20 75 73 61 67 65 20 68 61 73 20 62 65 65 6e 20   usage has been 
1ca80 64 69 73 61 62 6c 65 64 2e 0d 0a 20 20 20 20 20  disabled...     
1ca90 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b   #..      if {![
1caa0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
1cab0 28 73 71 6c 69 74 65 54 65 73 74 53 65 74 74 69  (sqliteTestSetti
1cac0 6e 67 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ngs)]} then {.. 
1cad0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1cae0 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 63    # NOTE: Load c
1caf0 75 73 74 6f 6d 20 70 65 72 2d 75 73 65 72 20 61  ustom per-user a
1cb00 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74 20 74  nd/or per-host t
1cb10 65 73 74 20 73 65 74 74 69 6e 67 73 20 6e 6f 77  est settings now
1cb20 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1cb30 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
1cb40 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61  exists ::tcl_pla
1cb50 74 66 6f 72 6d 28 75 73 65 72 29 5d 7d 20 74 68  tform(user)]} th
1cb60 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1cb70 73 65 74 20 75 73 65 72 53 65 74 74 69 6e 67 73  set userSettings
1cb80 46 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a  FileName [file j
1cb90 6f 69 6e 20 5b 67 65 74 43 6f 6d 6d 6f 6e 44 69  oin [getCommonDi
1cba0 72 65 63 74 6f 72 79 5d 20 5c 0d 0a 20 20 20 20  rectory] \..    
1cbb0 20 20 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e            [appen
1cbc0 64 41 72 67 73 20 73 65 74 74 69 6e 67 73 20 24  dArgs settings $
1cbd0 73 75 66 66 69 78 20 2e 20 24 3a 3a 74 63 6c 5f  suffix . $::tcl_
1cbe0 70 6c 61 74 66 6f 72 6d 28 75 73 65 72 29 20 2e  platform(user) .
1cbf0 65 61 67 6c 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20  eagle]]....     
1cc00 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65       if {[file e
1cc10 78 69 73 74 73 20 24 75 73 65 72 53 65 74 74 69  xists $userSetti
1cc20 6e 67 73 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  ngsFileName]} th
1cc30 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1cc40 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
1cc50 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1cc60 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1cc70 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1cc80 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1cc90 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 6f 61 64 69       "---- loadi
1cca0 6e 67 20 70 65 72 2d 75 73 65 72 20 74 65 73 74  ng per-user test
1ccb0 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c   settings file \
1ccc0 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
1ccd0 20 20 20 20 20 20 20 20 24 75 73 65 72 53 65 74          $userSet
1cce0 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 5c 22  tingsFileName \"
1ccf0 2e 2e 2e 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ...\n]..        
1cd00 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1cd10 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
1cd20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1cd30 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74   uplevel 1 [list
1cd40 20 73 6f 75 72 63 65 20 24 75 73 65 72 53 65 74   source $userSet
1cd50 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 5d 0d 0a  tingsFileName]..
1cd60 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 72              } er
1cd70 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ror]} then {..  
1cd80 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
1cd90 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
1cda0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cdb0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1cdc0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1cdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cde0 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
1cdf0 3a 20 66 61 69 6c 65 64 20 74 6f 20 6c 6f 61 64  : failed to load
1ce00 20 70 65 72 2d 75 73 65 72 20 73 65 74 74 69 6e   per-user settin
1ce10 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20  gs file \"" \.. 
1ce20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce30 20 20 20 24 75 73 65 72 53 65 74 74 69 6e 67 73     $userSettings
1ce40 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 65 72  FileName "\", er
1ce50 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72  ror: " \n\t $err
1ce60 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  or \n]..        
1ce70 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1ce80 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1ce90 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1cea0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
1ceb0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
1cec0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1ced0 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
1cee0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1cef0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
1cf00 20 73 6b 69 70 70 65 64 20 6c 6f 61 64 69 6e 67   skipped loading
1cf10 20 70 65 72 2d 75 73 65 72 20 74 65 73 74 20 73   per-user test s
1cf20 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22  ettings file \""
1cf30 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1cf40 20 20 20 20 20 20 24 75 73 65 72 53 65 74 74 69        $userSetti
1cf50 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c  ngsFileName "\",
1cf60 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
1cf70 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  st\n"]..        
1cf80 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1cf90 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
1cfa0 0a 20 20 20 20 20 20 20 20 23 23 23 23 23 23 23  .        #######
1cfb0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1cfc0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1cfd0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1cfe0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1cff0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
1d000 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
1d010 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 68 6f 73 74  cl_platform(host
1d020 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
1d030 20 20 20 20 20 20 73 65 74 20 68 6f 73 74 53 65        set hostSe
1d040 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 5b  ttingsFileName [
1d050 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 43 6f  file join [getCo
1d060 6d 6d 6f 6e 44 69 72 65 63 74 6f 72 79 5d 20 5c  mmonDirectory] \
1d070 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1d080 5b 61 70 70 65 6e 64 41 72 67 73 20 73 65 74 74  [appendArgs sett
1d090 69 6e 67 73 20 24 73 75 66 66 69 78 20 2e 20 24  ings $suffix . $
1d0a0 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 68  ::tcl_platform(h
1d0b0 6f 73 74 29 20 2e 65 61 67 6c 65 5d 5d 0d 0a 0d  ost) .eagle]]...
1d0c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
1d0d0 66 69 6c 65 20 65 78 69 73 74 73 20 24 68 6f 73  file exists $hos
1d0e0 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d  tSettingsFileNam
1d0f0 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
1d100 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
1d110 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
1d120 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1d130 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
1d140 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1d150 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
1d160 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d 68 6f 73   loading per-hos
1d170 74 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20  t test settings 
1d180 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20  file \"" \..    
1d190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 68                $h
1d1a0 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e  ostSettingsFileN
1d1b0 61 6d 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 20 20  ame \"...\n]..  
1d1c0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
1d1d0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
1d1e0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
1d1f0 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31         uplevel 1
1d200 20 5b 6c 69 73 74 20 73 6f 75 72 63 65 20 24 68   [list source $h
1d210 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e  ostSettingsFileN
1d220 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  ame]..          
1d230 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e    } error]} then
1d240 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1d250 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
1d260 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1d270 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1d280 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1d290 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1d2a0 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
1d2b0 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
1d2c0 6f 20 6c 6f 61 64 20 70 65 72 2d 68 6f 73 74 20  o load per-host 
1d2d0 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22  settings file \"
1d2e0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
1d2f0 20 20 20 20 20 20 20 20 20 24 68 6f 73 74 53 65           $hostSe
1d300 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22  ttingsFileName "
1d310 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  \", error: " \n\
1d320 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20  t $error \n]..  
1d330 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1d340 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
1d350 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
1d360 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
1d370 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
1d380 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1d390 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1d3a0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1d3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3c0 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6c   "---- skipped l
1d3d0 6f 61 64 69 6e 67 20 70 65 72 2d 68 6f 73 74 20  oading per-host 
1d3e0 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 66 69  test settings fi
1d3f0 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  le \"" \..      
1d400 20 20 20 20 20 20 20 20 20 20 20 20 24 68 6f 73              $hos
1d410 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d  tSettingsFileNam
1d420 65 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e  e "\", it does n
1d430 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20  ot exist\n"]..  
1d440 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1d450 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1d460 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
1d470 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
1d480 20 72 75 6e 53 51 4c 69 74 65 54 65 73 74 50 72   runSQLiteTestPr
1d490 6f 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20 20 20  ologue {} {..   
1d4a0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
1d4b0 54 45 3a 20 53 6b 69 70 20 72 75 6e 6e 69 6e 67  TE: Skip running
1d4c0 20 6f 75 72 20 63 75 73 74 6f 6d 20 70 72 6f 6c   our custom prol
1d4d0 6f 67 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e  ogue if the main
1d4e0 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 0d 0a 20   one has been.. 
1d4f0 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6b 69       #       ski
1d500 70 70 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  pped...      #..
1d510 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
1d520 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 70 72 6f   exists ::no(pro
1d530 6c 6f 67 75 65 2e 65 61 67 6c 65 29 5d 7d 20 74  logue.eagle)]} t
1d540 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
1d550 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1d560 3a 20 4c 6f 61 64 20 74 68 65 20 22 62 65 66 6f  : Load the "befo
1d570 72 65 2d 63 6f 6e 73 74 72 61 69 6e 74 73 22 20  re-constraints" 
1d580 63 75 73 74 6f 6d 20 70 65 72 2d 75 73 65 72 20  custom per-user 
1d590 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74 0d  and/or per-host.
1d5a0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
1d5b0 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 6e   test settings n
1d5c0 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ow...        #..
1d5d0 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20          uplevel 
1d5e0 31 20 5b 6c 69 73 74 20 6c 6f 61 64 53 51 4c 69  1 [list loadSQLi
1d5f0 74 65 54 65 73 74 53 65 74 74 69 6e 67 73 20 24  teTestSettings $
1d600 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 2e  ::test_channel .
1d610 62 65 66 6f 72 65 5d 0d 0a 0d 0a 20 20 20 20 20  before]....     
1d620 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1d630 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74  NOTE: Check if t
1d640 68 65 20 5b 6f 62 6a 65 63 74 5d 20 63 6f 6d 6d  he [object] comm
1d650 61 6e 64 20 69 73 20 61 76 61 69 6c 61 62 6c 65  and is available
1d660 3b 20 69 66 20 6e 6f 74 2c 20 61 64 64 20 73 6f  ; if not, add so
1d670 6d 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  me..        #   
1d680 20 20 20 20 73 68 69 6d 73 20 74 6f 20 6d 61 6b      shims to mak
1d690 65 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  e the test suite
1d6a0 20 72 75 6e 20 73 6d 6f 6f 74 68 65 72 2e 0d 0a   run smoother...
1d6b0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1d6c0 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74     checkForSQLit
1d6d0 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 20 24  eObjectCommand $
1d6e0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a  ::test_channel..
1d6f0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1d700 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 65 74       # NOTE: Det
1d710 65 72 6d 69 6e 65 20 74 68 65 20 6e 61 6d 65 73  ermine the names
1d720 20 6f 66 20 74 68 65 20 6e 61 74 69 76 65 20 70   of the native p
1d730 6c 61 74 66 6f 72 6d 20 61 6e 64 20 61 72 63 68  latform and arch
1d740 69 74 65 63 74 75 72 65 2e 0d 0a 20 20 20 20 20  itecture...     
1d750 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65     #..        se
1d760 74 20 70 6c 61 74 66 6f 72 6d 20 5b 67 65 74 42  t platform [getB
1d770 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20 74 72 75  uildPlatform tru
1d780 65 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  e]..        set 
1d790 61 72 63 68 69 74 65 63 74 75 72 65 20 5b 61 72  architecture [ar
1d7a0 63 68 69 74 65 63 74 75 72 65 46 6f 72 50 6c 61  chitectureForPla
1d7b0 74 66 6f 72 6d 20 24 70 6c 61 74 66 6f 72 6d 5d  tform $platform]
1d7c0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
1d7d0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
1d7e0 68 6f 77 20 74 68 65 20 70 6c 61 74 66 6f 72 6d  how the platform
1d7f0 20 61 6e 64 20 61 72 63 68 69 74 65 63 74 75 72   and architectur
1d800 65 20 75 73 65 64 20 74 6f 20 68 65 6c 70 20 6c  e used to help l
1d810 6f 63 61 74 65 20 74 68 65 0d 0a 20 20 20 20 20  ocate the..     
1d820 20 20 20 23 20 20 20 20 20 20 20 6e 61 74 69 76     #       nativ
1d830 65 20 62 75 69 6c 64 20 66 69 6c 65 73 2e 0d 0a  e build files...
1d840 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1d850 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
1d860 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
1d870 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1d880 20 20 20 20 22 2d 2d 2d 2d 20 70 6c 61 74 66 6f      "---- platfo
1d890 72 6d 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67 20  rm for locating 
1d8a0 6e 61 74 69 76 65 20 62 75 69 6c 64 20 66 69 6c  native build fil
1d8b0 65 73 20 69 73 20 5c 22 22 20 5c 0d 0a 20 20 20  es is \"" \..   
1d8c0 20 20 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f           $platfo
1d8d0 72 6d 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  rm \"\n]....    
1d8e0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
1d8f0 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
1d900 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1d910 20 20 20 20 20 22 2d 2d 2d 2d 20 61 72 63 68 69       "---- archi
1d920 74 65 63 74 75 72 65 20 66 6f 72 20 6c 6f 63 61  tecture for loca
1d930 74 69 6e 67 20 6e 61 74 69 76 65 20 62 75 69 6c  ting native buil
1d940 64 20 66 69 6c 65 73 20 69 73 20 5c 22 22 20 5c  d files is \"" \
1d950 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 61  ..            $a
1d960 72 63 68 69 74 65 63 74 75 72 65 20 5c 22 5c 6e  rchitecture \"\n
1d970 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
1d980 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1d990 42 75 69 6c 64 20 61 20 6c 69 73 74 20 6f 66 20  Build a list of 
1d9a0 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 69  configuration fi
1d9b0 6c 65 73 20 74 68 61 74 20 77 65 20 68 61 6e 64  les that we hand
1d9c0 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  le...        #..
1d9d0 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 6e 66          set conf
1d9e0 69 67 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73  igFileNames [lis
1d9f0 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
1da00 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
1da10 69 74 65 2e 64 6c 6c 2e 63 6f 6e 66 69 67 5d 0d  ite.dll.config].
1da20 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1da30 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75        # NOTE: Bu
1da40 69 6c 64 20 61 20 6c 69 73 74 20 6f 66 20 61 75  ild a list of au
1da50 78 69 6c 69 61 72 79 20 4d 61 6e 61 67 65 64 20  xiliary Managed 
1da60 44 65 62 75 67 67 69 6e 67 20 41 73 73 69 73 74  Debugging Assist
1da70 61 6e 74 73 20 28 4d 44 41 29 0d 0a 20 20 20 20  ants (MDA)..    
1da80 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 66      #       conf
1da90 69 67 75 72 61 74 69 6f 6e 20 66 69 6c 65 73 20  iguration files 
1daa0 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65 2e 0d  that we handle..
1dab0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1dac0 20 20 20 20 73 65 74 20 6d 64 61 43 6f 6e 66 69      set mdaConfi
1dad0 67 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74  gFileNames [list
1dae0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1daf0 45 61 67 6c 65 53 68 65 6c 6c 33 32 2e 65 78 65  EagleShell32.exe
1db00 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 49 6e 73 74  .mda.config Inst
1db10 61 6c 6c 65 72 2e 65 78 65 2e 6d 64 61 2e 63 6f  aller.exe.mda.co
1db20 6e 66 69 67 20 5c 0d 0a 20 20 20 20 20 20 20 20  nfig \..        
1db30 20 20 20 20 74 65 73 74 2e 65 78 65 2e 6d 64 61      test.exe.mda
1db40 2e 63 6f 6e 66 69 67 20 74 65 73 74 6c 69 6e 71  .config testlinq
1db50 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20  .exe.mda.config 
1db60 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  \..            t
1db70 65 73 74 65 66 36 2e 65 78 65 2e 6d 64 61 2e 63  estef6.exe.mda.c
1db80 6f 6e 66 69 67 5d 0d 0a 0d 0a 20 20 20 20 20 20  onfig]....      
1db90 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
1dba0 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 6c  OTE: Build the l
1dbb0 69 73 74 20 6f 66 20 65 78 74 65 72 6e 61 6c 20  ist of external 
1dbc0 66 69 6c 65 73 20 74 68 61 74 20 77 65 20 68 61  files that we ha
1dbd0 6e 64 6c 65 2e 20 20 53 6f 6d 65 20 6f 66 0d 0a  ndle.  Some of..
1dbe0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1dbf0 74 68 65 73 65 20 66 69 6c 65 73 20 6d 61 79 20  these files may 
1dc00 62 65 20 6e 61 74 69 76 65 20 61 6e 64 2f 6f 72  be native and/or
1dc10 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c   managed assembl
1dc20 69 65 73 20 74 68 61 74 20 61 72 65 0d 0a 20 20  ies that are..  
1dc30 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65        #       re
1dc40 71 75 69 72 65 64 20 74 6f 20 70 65 72 66 6f 72  quired to perfor
1dc50 6d 20 76 61 72 69 6f 75 73 20 74 65 73 74 73 2e  m various tests.
1dc60 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1dc70 20 20 20 20 20 73 65 74 20 65 78 74 65 72 6e 61       set externa
1dc80 6c 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74  lFileNames [list
1dc90 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1dca0 5b 66 69 6c 65 20 6a 6f 69 6e 20 45 6e 74 69 74  [file join Entit
1dcb0 79 46 72 61 6d 65 77 6f 72 6b 20 6c 69 62 20 5b  yFramework lib [
1dcc0 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74  string map [list
1dcd0 20 46 78 20 22 22 5d 20 5b 73 74 72 69 6e 67 20   Fx ""] [string 
1dce0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  \..            m
1dcf0 61 70 20 5b 6c 69 73 74 20 6e 65 74 46 78 34 35  ap [list netFx45
1dd00 31 20 6e 65 74 46 78 34 35 20 6e 65 74 46 78 34  1 netFx45 netFx4
1dd10 35 32 20 6e 65 74 46 78 34 35 20 6e 65 74 46 78  52 netFx45 netFx
1dd20 34 36 20 6e 65 74 46 78 34 35 20 5c 0d 0a 20 20  46 netFx45 \..  
1dd30 20 20 20 20 20 20 20 20 20 20 6e 65 74 46 78 34            netFx4
1dd40 36 31 20 6e 65 74 46 78 34 35 5d 20 5b 67 65 74  61 netFx45] [get
1dd50 42 75 69 6c 64 4e 65 74 46 78 5d 5d 5d 20 45 6e  BuildNetFx]]] En
1dd60 74 69 74 79 46 72 61 6d 65 77 6f 72 6b 2e 64 6c  tityFramework.dl
1dd70 6c 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  l]]....        #
1dd80 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1dd90 3a 20 42 75 69 6c 64 20 74 68 65 20 6c 69 73 74  : Build the list
1dda0 20 6f 66 20 6e 61 74 69 76 65 20 61 73 73 65 6d   of native assem
1ddb0 62 6c 79 20 66 69 6c 65 73 20 74 68 61 74 20 77  bly files that w
1ddc0 65 20 68 61 6e 64 6c 65 2e 20 20 54 68 65 0d 0a  e handle.  The..
1ddd0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1dde0 72 65 61 73 6f 6e 20 74 68 65 20 22 53 79 73 74  reason the "Syst
1ddf0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
1de00 6c 6c 22 20 66 69 6c 65 20 69 73 20 69 6e 63 6c  ll" file is incl
1de10 75 64 65 64 20 68 65 72 65 20 69 73 0d 0a 20 20  uded here is..  
1de20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65        #       be
1de30 63 61 75 73 65 20 69 74 20 63 6f 75 6c 64 20 62  cause it could b
1de40 65 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65  e the mixed-mode
1de50 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20   assembly...    
1de60 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
1de70 65 74 20 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d  et nativeFileNam
1de80 65 73 20 5b 67 65 74 4e 61 74 69 76 65 4c 69 62  es [getNativeLib
1de90 72 61 72 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c  raryFileNamesOnl
1dea0 79 5d 0d 0a 20 20 20 20 20 20 20 20 6c 61 70 70  y]..        lapp
1deb0 65 6e 64 20 6e 61 74 69 76 65 46 69 6c 65 4e 61  end nativeFileNa
1dec0 6d 65 73 20 53 51 4c 69 74 65 2e 49 6e 74 65 72  mes SQLite.Inter
1ded0 6f 70 2e 64 6c 6c 20 53 79 73 74 65 6d 2e 44 61  op.dll System.Da
1dee0 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 0d 0a 0d  ta.SQLite.dll...
1def0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1df00 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c      # NOTE: Buil
1df10 64 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6d 61  d the list of ma
1df20 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 20 66  naged assembly f
1df30 69 6c 65 73 20 74 68 61 74 20 77 65 20 68 61 6e  iles that we han
1df40 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  dle...        #.
1df50 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d 61 6e  .        set man
1df60 61 67 65 64 46 69 6c 65 4e 61 6d 65 73 20 5b 6c  agedFileNames [l
1df70 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ist \..         
1df80 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
1df90 51 4c 69 74 65 2e 64 6c 6c 20 53 79 73 74 65 6d  QLite.dll System
1dfa0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e  .Data.SQLite.Lin
1dfb0 71 2e 64 6c 6c 20 5c 0d 0a 20 20 20 20 20 20 20  q.dll \..       
1dfc0 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
1dfd0 2e 53 51 4c 69 74 65 2e 45 46 36 2e 64 6c 6c 5d  .SQLite.EF6.dll]
1dfe0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
1dff0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52         # NOTE: R
1e000 65 6d 6f 76 65 20 61 6e 79 20 74 65 73 74 20 63  emove any test c
1e010 6f 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74 20  onstraints that 
1e020 72 65 66 65 72 20 74 6f 20 74 68 65 20 6e 61 74  refer to the nat
1e030 69 76 65 20 61 6e 64 2f 6f 72 0d 0a 20 20 20 20  ive and/or..    
1e040 20 20 20 20 23 20 20 20 20 20 20 20 6d 61 6e 61      #       mana
1e050 67 65 64 20 61 73 73 65 6d 62 6c 79 20 66 69 6c  ged assembly fil
1e060 65 73 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c  es that we handl
1e070 65 20 75 6e 6c 65 73 73 20 66 6f 72 62 69 64 64  e unless forbidd
1e080 65 6e 20 66 72 6f 6d 0d 0a 20 20 20 20 20 20 20  en from..       
1e090 20 23 20 20 20 20 20 20 20 64 6f 69 6e 67 20 73   #       doing s
1e0a0 6f 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  o...        #.. 
1e0b0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
1e0c0 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71  o exists ::no(sq
1e0d0 6c 69 74 65 52 65 6d 6f 76 65 43 6f 6e 73 74 72  liteRemoveConstr
1e0e0 61 69 6e 74 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  aints)]} then {.
1e0f0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61  .          forea
1e100 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 63 6f 6e  ch fileName $con
1e110 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  figFileNames {..
1e120 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f              remo
1e130 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
1e140 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 24  pendArgs file_ $
1e150 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20  fileName]..     
1e160 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1e170 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
1e180 4e 61 6d 65 20 24 6d 64 61 43 6f 6e 66 69 67 46  Name $mdaConfigF
1e190 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
1e1a0 20 20 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f          removeCo
1e1b0 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
1e1c0 41 72 67 73 20 66 69 6c 65 5f 20 24 66 69 6c 65  Args file_ $file
1e1d0 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20  Name]..         
1e1e0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
1e1f0 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
1e200 20 24 65 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61   $externalFileNa
1e210 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
1e220 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61     removeConstra
1e230 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
1e240 66 69 6c 65 5f 20 5b 66 69 6c 65 20 74 61 69 6c  file_ [file tail
1e250 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20   $fileName]]..  
1e260 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1e270 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
1e280 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46  ileName $nativeF
1e290 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
1e2a0 20 20 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f          removeCo
1e2b0 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
1e2c0 41 72 67 73 20 66 69 6c 65 5f 20 24 66 69 6c 65  Args file_ $file
1e2d0 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20  Name]..         
1e2e0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
1e2f0 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
1e300 20 24 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d   $managedFileNam
1e310 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
1e320 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69    removeConstrai
1e330 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
1e340 69 6c 65 5f 20 24 66 69 6c 65 4e 61 6d 65 5d 0d  ile_ $fileName].
1e350 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
1e360 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1e370 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1e380 4e 4f 54 45 3a 20 53 6b 69 70 20 61 6c 6c 20 53  NOTE: Skip all S
1e390 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
1e3a0 65 20 72 65 6c 61 74 65 64 20 66 69 6c 65 20 68  e related file h
1e3b0 61 6e 64 6c 69 6e 67 20 28 64 65 6c 65 74 69 6e  andling (deletin
1e3c0 67 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  g,..        #   
1e3d0 20 20 20 20 63 6f 70 79 69 6e 67 2c 20 61 6e 64      copying, and
1e3e0 20 6c 6f 61 64 69 6e 67 29 20 69 66 20 69 6e 73   loading) if ins
1e3f0 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20 20 20  tructed...      
1e400 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
1e410 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
1e420 3a 6e 6f 28 73 71 6c 69 74 65 46 69 6c 65 73 29  :no(sqliteFiles)
1e430 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1e440 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1e450 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74    # NOTE: Skip t
1e460 72 79 69 6e 67 20 74 6f 20 64 65 6c 65 74 65 20  rying to delete 
1e470 61 6e 79 20 66 69 6c 65 73 20 69 66 20 69 6e 73  any files if ins
1e480 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20 20 20  tructed...      
1e490 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1e4a0 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
1e4b0 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71  ts ::no(deleteSq
1e4c0 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20 74 68 65  liteFiles)]} the
1e4d0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1e4e0 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
1e4f0 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71  ts ::no(deleteSq
1e500 6c 69 74 65 43 6f 6e 66 69 67 46 69 6c 65 73 29  liteConfigFiles)
1e510 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1e520 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
1e530 20 66 69 6c 65 4e 61 6d 65 20 24 63 6f 6e 66 69   fileName $confi
1e540 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  gFileNames {..  
1e550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
1e560 79 44 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c  yDeleteBinaryFil
1e570 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  e $fileName..   
1e580 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
1e590 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
1e5a0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
1e5b0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
1e5c0 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 45 78  o(deleteSqliteEx
1e5d0 74 65 72 6e 61 6c 46 69 6c 65 73 29 5d 7d 20 74  ternalFiles)]} t
1e5e0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1e5f0 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
1e600 65 4e 61 6d 65 20 24 6d 64 61 43 6f 6e 66 69 67  eName $mdaConfig
1e610 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
1e620 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
1e630 44 65 6c 65 74 65 42 75 69 6c 64 46 69 6c 65 20  DeleteBuildFile 
1e640 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  $fileName..     
1e650 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
1e660 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
1e670 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 65 78  ach fileName $ex
1e680 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 73 20  ternalFileNames 
1e690 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1e6a0 20 20 20 74 72 79 44 65 6c 65 74 65 42 69 6e 61     tryDeleteBina
1e6b0 72 79 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65  ryFile $fileName
1e6c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1e6d0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
1e6e0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1e6f0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
1e700 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c  s ::no(deleteSql
1e710 69 74 65 4e 61 74 69 76 65 46 69 6c 65 73 29 5d  iteNativeFiles)]
1e720 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1e730 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
1e740 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64  fo exists ::no(d
1e750 65 6c 65 74 65 53 71 6c 69 74 65 49 6d 70 6c 69  eleteSqliteImpli
1e760 63 69 74 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  citFiles)]} then
1e770 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1e780 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
1e790 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65  Name $nativeFile
1e7a0 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
1e7b0 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65             tryDe
1e7c0 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 24 66 69  leteAssembly $fi
1e7d0 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20  leName..        
1e7e0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1e7f0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
1e800 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
1e810 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
1e820 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 4e  no(deleteSqliteN
1e830 6f 6e 49 6d 70 6c 69 63 69 74 46 69 6c 65 73 29  onImplicitFiles)
1e840 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1e850 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
1e860 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
1e870 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 50 6c  o(deleteSqlitePl
1e880 61 74 66 6f 72 6d 46 69 6c 65 73 29 5d 20 26 26  atformFiles)] &&
1e890 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1e8a0 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
1e8b0 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d  length $platform
1e8c0 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
1e8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8e0 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
1e8f0 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d  e $nativeFileNam
1e900 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
1e910 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c            tryDel
1e920 65 74 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c  eteAssembly $fil
1e930 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 0d  eName $platform.
1e940 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e950 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
1e960 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1e970 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
1e980 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
1e990 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 41 72  o(deleteSqliteAr
1e9a0 63 68 69 74 65 63 74 75 72 65 46 69 6c 65 73 29  chitectureFiles)
1e9b0 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
1e9c0 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72              [str
1e9d0 69 6e 67 20 6c 65 6e 67 74 68 20 24 61 72 63 68  ing length $arch
1e9e0 69 74 65 63 74 75 72 65 5d 20 3e 20 30 7d 20 74  itecture] > 0} t
1e9f0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1ea00 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
1ea10 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76   fileName $nativ
1ea20 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  eFileNames {..  
1ea30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea40 20 20 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d    tryDeleteAssem
1ea50 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 24 61  bly $fileName $a
1ea60 72 63 68 69 74 65 63 74 75 72 65 0d 0a 20 20 20  rchitecture..   
1ea70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1ea80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1ea90 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
1eaa0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
1eab0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
1eac0 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
1ead0 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65  ists ::no(delete
1eae0 53 71 6c 69 74 65 4d 61 6e 61 67 65 64 46 69 6c  SqliteManagedFil
1eaf0 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
1eb00 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
1eb10 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 61  ach fileName $ma
1eb20 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b  nagedFileNames {
1eb30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1eb40 20 20 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d    tryDeleteAssem
1eb50 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20  bly $fileName.. 
1eb60 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
1eb70 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1eb80 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
1eb90 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1eba0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
1ebb0 63 6b 20 66 6f 72 20 74 68 65 20 22 61 75 74 6f  ck for the "auto
1ebc0 53 65 6c 65 63 74 22 20 72 75 6e 74 69 6d 65 20  Select" runtime 
1ebd0 6f 70 74 69 6f 6e 2e 20 20 49 66 20 70 72 65 73  option.  If pres
1ebe0 65 6e 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ent,..          
1ebf0 23 20 20 20 20 20 20 20 61 74 74 65 6d 70 74 20  #       attempt 
1ec00 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  to automatically
1ec10 20 73 65 6c 65 63 74 20 74 68 65 20 66 69 72 73   select the firs
1ec20 74 20 61 76 61 69 6c 61 62 6c 65 0d 0a 20 20 20  t available..   
1ec30 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62         #       b
1ec40 75 69 6c 64 20 28 6f 72 20 22 72 65 6c 65 61 73  uild (or "releas
1ec50 65 22 29 20 6f 66 20 53 51 4c 69 74 65 20 61 6e  e") of SQLite an
1ec60 64 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  d System.Data.SQ
1ec70 4c 69 74 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Lite..          
1ec80 23 20 20 20 20 20 20 20 66 6f 72 20 75 73 65 20  #       for use 
1ec90 77 69 74 68 20 74 68 65 20 74 65 73 74 20 73 75  with the test su
1eca0 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ite...          
1ecb0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  #..          if 
1ecc0 7b 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74 69  {[hasRuntimeOpti
1ecd0 6f 6e 20 61 75 74 6f 53 65 6c 65 63 74 5d 7d 20  on autoSelect]} 
1ece0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1ecf0 20 20 20 20 69 66 20 7b 21 5b 63 68 65 63 6b 46      if {![checkF
1ed00 6f 72 53 51 4c 69 74 65 42 75 69 6c 64 73 20 24  orSQLiteBuilds $
1ed10 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74  ::test_channel t
1ed20 72 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  rue]} then {..  
1ed30 20 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63              chec
1ed40 6b 46 6f 72 53 51 4c 69 74 65 52 65 6c 65 61 73  kForSQLiteReleas
1ed50 65 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  es $::test_chann
1ed60 65 6c 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20  el true..       
1ed70 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1ed80 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
1ed90 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
1eda0 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72 79 69 6e  NOTE: Skip tryin
1edb0 67 20 74 6f 20 76 65 72 69 66 79 20 74 68 65 20  g to verify the 
1edc0 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20  build directory 
1edd0 69 66 20 69 6e 73 74 72 75 63 74 65 64 3b 0d 0a  if instructed;..
1ede0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
1edf0 20 20 6f 74 68 65 72 77 69 73 65 2c 20 6d 61 6b    otherwise, mak
1ee00 65 20 73 75 72 65 20 69 74 20 61 63 74 75 61 6c  e sure it actual
1ee10 6c 79 20 65 78 69 73 74 73 20 6f 72 20 68 61 6c  ly exists or hal
1ee20 74 20 74 68 65 20 65 6e 74 69 72 65 0d 0a 20 20  t the entire..  
1ee30 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1ee40 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73 20  testing process 
1ee50 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65  if it does not e
1ee60 78 69 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 20  xist...         
1ee70 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   #..          if
1ee80 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
1ee90 3a 3a 6e 6f 28 76 65 72 69 66 79 42 75 69 6c 64  ::no(verifyBuild
1eea0 44 69 72 65 63 74 6f 72 79 29 5d 7d 20 74 68 65  Directory)]} the
1eeb0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1eec0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
1eed0 23 20 4e 4f 54 45 3a 20 41 74 20 74 68 69 73 20  # NOTE: At this 
1eee0 70 6f 69 6e 74 2c 20 74 68 65 20 62 75 69 6c 64  point, the build
1eef0 20 64 69 72 65 63 74 6f 72 79 20 4d 55 53 54 20   directory MUST 
1ef00 65 78 69 73 74 20 61 73 20 61 0d 0a 20 20 20 20  exist as a..    
1ef10 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1ef20 76 61 6c 69 64 20 64 69 72 65 63 74 6f 72 79 20  valid directory 
1ef30 66 6f 72 20 74 68 65 20 74 65 73 74 69 6e 67 20  for the testing 
1ef40 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6e 74 69  process to conti
1ef50 6e 75 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  nue...          
1ef60 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1ef70 20 73 65 74 20 64 69 72 65 63 74 6f 72 79 20 5b   set directory [
1ef80 67 65 74 42 75 69 6c 64 44 69 72 65 63 74 6f 72  getBuildDirector
1ef90 79 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  y]....          
1efa0 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69    if {![file exi
1efb0 73 74 73 20 24 64 69 72 65 63 74 6f 72 79 5d 20  sts $directory] 
1efc0 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  || \..          
1efd0 20 20 20 20 20 20 21 5b 66 69 6c 65 20 69 73 64        ![file isd
1efe0 69 72 65 63 74 6f 72 79 20 24 64 69 72 65 63 74  irectory $direct
1eff0 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ory]} then {..  
1f000 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
1f010 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
1f020 4f 54 45 3a 20 4a 75 73 74 20 70 72 69 6f 72 20  OTE: Just prior 
1f030 74 6f 20 61 63 74 75 61 6c 6c 79 20 68 61 6c 74  to actually halt
1f040 69 6e 67 20 74 68 65 20 74 65 73 74 69 6e 67 20  ing the testing 
1f050 70 72 6f 63 65 73 73 2c 0d 0a 20 20 20 20 20 20  process,..      
1f060 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1f070 61 64 64 20 61 6e 20 65 72 72 6f 72 20 74 6f 20  add an error to 
1f080 74 68 65 20 74 65 73 74 20 6c 6f 67 20 66 69 6c  the test log fil
1f090 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e...            
1f0a0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1f0b0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
1f0c0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
1f0d0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1f0e0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
1f0f0 63 6f 75 6c 64 20 6e 6f 74 20 76 65 72 69 66 79  could not verify
1f100 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79   build directory
1f110 20 5c 22 22 20 24 64 69 72 65 63 74 6f 72 79 20   \"" $directory 
1f120 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1f130 20 20 20 20 20 22 5c 22 2c 20 61 6c 6c 20 74 65       "\", all te
1f140 73 74 69 6e 67 20 68 61 6c 74 65 64 5c 6e 22 5d  sting halted\n"]
1f150 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1f160 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1f170 20 20 20 23 20 4e 4f 54 45 3a 20 52 61 69 73 69     # NOTE: Raisi
1f180 6e 67 20 61 20 73 63 72 69 70 74 20 65 72 72 6f  ng a script erro
1f190 72 20 66 72 6f 6d 20 74 68 69 73 20 70 6f 69 6e  r from this poin
1f1a0 74 20 73 68 6f 75 6c 64 20 68 61 6c 74 0d 0a 20  t should halt.. 
1f1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
1f1c0 20 20 20 20 20 74 68 65 20 74 65 73 74 69 6e 67       the testing
1f1d0 20 70 72 6f 63 65 73 73 2e 0d 0a 20 20 20 20 20   process...     
1f1e0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1f1f0 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20            error 
1f200 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1f210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f220 20 22 63 6f 75 6c 64 20 6e 6f 74 20 76 65 72 69   "could not veri
1f230 66 79 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f  fy build directo
1f240 72 79 20 5c 22 22 20 24 64 69 72 65 63 74 6f 72  ry \"" $director
1f250 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  y \..           
1f260 20 20 20 20 20 20 20 22 5c 22 2c 20 61 6c 6c 20         "\", all 
1f270 74 65 73 74 69 6e 67 20 68 61 6c 74 65 64 22 5d  testing halted"]
1f280 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
1f290 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
1f2a0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1f2b0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
1f2c0 6b 69 70 20 74 72 79 69 6e 67 20 74 6f 20 63 6f  kip trying to co
1f2d0 70 79 20 61 6e 79 20 66 69 6c 65 73 20 69 66 20  py any files if 
1f2e0 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20  instructed...   
1f2f0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1f300 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
1f310 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53  xists ::no(copyS
1f320 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20 74 68  qliteFiles)]} th
1f330 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1f340 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
1f350 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c  sts ::no(copySql
1f360 69 74 65 43 6f 6e 66 69 67 46 69 6c 65 73 29 5d  iteConfigFiles)]
1f370 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1f380 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
1f390 66 69 6c 65 4e 61 6d 65 20 24 63 6f 6e 66 69 67  fileName $config
1f3a0 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
1f3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
1f3c0 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20 24 66  CopyBuildFile $f
1f3d0 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20  ileName..       
1f3e0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1f3f0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1f400 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
1f410 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f  o exists ::no(co
1f420 70 79 53 71 6c 69 74 65 45 78 74 65 72 6e 61 6c  pySqliteExternal
1f430 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
1f440 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
1f450 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1f460 23 20 4e 4f 54 45 3a 20 43 6f 70 79 20 74 68 65  # NOTE: Copy the
1f470 20 4d 61 6e 61 67 65 64 20 44 65 62 75 67 67 69   Managed Debuggi
1f480 6e 67 20 41 73 73 69 73 74 61 6e 74 73 20 28 4d  ng Assistants (M
1f490 44 41 29 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  DA) configuratio
1f4a0 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n..             
1f4b0 20 23 20 20 20 20 20 20 20 66 69 6c 65 20 66 6f   #       file fo
1f4c0 72 20 74 68 65 20 45 61 67 6c 65 20 73 68 65 6c  r the Eagle shel
1f4d0 6c 20 74 6f 20 74 68 65 20 62 75 69 6c 64 20 6f  l to the build o
1f4e0 75 74 70 75 74 20 64 69 72 65 63 74 6f 72 79 2c  utput directory,
1f4f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1f500 23 20 20 20 20 20 20 20 77 68 69 6c 65 20 75 73  #       while us
1f510 69 6e 67 20 65 61 63 68 20 6f 66 20 74 68 65 20  ing each of the 
1f520 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 76 61 72  names of the var
1f530 69 6f 75 73 20 6c 65 67 61 63 79 20 74 65 73 74  ious legacy test
1f540 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1f550 23 20 20 20 20 20 20 20 65 78 65 63 75 74 61 62  #       executab
1f560 6c 65 73 2e 20 20 54 68 69 73 20 77 69 6c 6c 20  les.  This will 
1f570 68 65 6c 70 20 74 6f 20 6d 61 6b 65 20 73 75 72  help to make sur
1f580 65 20 74 68 61 74 20 61 6c 6c 20 74 68 65 0d 0a  e that all the..
1f590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
1f5a0 20 20 20 20 20 20 6c 65 67 61 63 79 20 74 65 73        legacy tes
1f5b0 74 73 20 72 75 6e 20 77 69 74 68 20 65 78 61 63  ts run with exac
1f5c0 74 6c 79 20 74 68 65 20 73 61 6d 65 20 73 65 74  tly the same set
1f5d0 20 6f 66 20 4d 61 6e 61 67 65 64 0d 0a 20 20 20   of Managed..   
1f5e0 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
1f5f0 20 20 20 44 65 62 75 67 67 69 6e 67 20 41 73 73     Debugging Ass
1f600 69 73 74 61 6e 74 73 20 63 6f 6e 66 69 67 75 72  istants configur
1f610 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ed...           
1f620 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1f630 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
1f640 4e 61 6d 65 20 24 6d 64 61 43 6f 6e 66 69 67 46  Name $mdaConfigF
1f650 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
1f660 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43              tryC
1f670 6f 70 79 42 69 6e 61 72 79 46 69 6c 65 20 45 61  opyBinaryFile Ea
1f680 67 6c 65 53 68 65 6c 6c 2e 65 78 65 2e 6d 64 61  gleShell.exe.mda
1f690 2e 63 6f 6e 66 69 67 20 22 22 20 24 66 69 6c 65  .config "" $file
1f6a0 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Name..          
1f6b0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1f6c0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1f6d0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1f6e0 43 6f 70 79 20 74 68 65 20 65 78 74 65 72 6e 61  Copy the externa
1f6f0 6c 20 62 69 6e 61 72 69 65 73 2c 20 69 66 20 61  l binaries, if a
1f700 6e 79 2c 20 74 6f 20 74 68 65 20 64 69 72 65 63  ny, to the direc
1f710 74 6f 72 79 20 74 68 61 74 0d 0a 20 20 20 20 20  tory that..     
1f720 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
1f730 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 45 61   contains the Ea
1f740 67 6c 65 20 73 68 65 6c 6c 2e 20 20 54 68 69 73  gle shell.  This
1f750 20 69 73 20 74 79 70 69 63 61 6c 6c 79 20 75 73   is typically us
1f760 65 64 20 74 6f 20 6d 61 6b 65 0d 0a 20 20 20 20  ed to make..    
1f770 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
1f780 20 20 73 75 72 65 20 61 73 73 65 6d 62 6c 69 65    sure assemblie
1f790 73 20 72 65 66 65 72 65 6e 63 65 64 20 62 79 20  s referenced by 
1f7a0 74 68 65 20 6f 6e 65 73 20 62 65 69 6e 67 20 74  the ones being t
1f7b0 65 73 74 65 64 20 61 72 65 0d 0a 20 20 20 20 20  ested are..     
1f7c0 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
1f7d0 20 61 76 61 69 6c 61 62 6c 65 20 64 75 72 69 6e   available durin
1f7e0 67 20 74 68 65 20 74 65 73 74 69 6e 67 20 70 72  g the testing pr
1f7f0 6f 63 65 73 73 2e 0d 0a 20 20 20 20 20 20 20 20  ocess...        
1f800 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1f810 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
1f820 69 6c 65 4e 61 6d 65 20 24 65 78 74 65 72 6e 61  ileName $externa
1f830 6c 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  lFileNames {..  
1f840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
1f850 79 43 6f 70 79 45 78 74 65 72 6e 61 6c 46 69 6c  yCopyExternalFil
1f860 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  e $fileName..   
1f870 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
1f880 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
1f890 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
1f8a0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
1f8b0 6f 28 63 6f 70 79 53 71 6c 69 74 65 4e 61 74 69  o(copySqliteNati
1f8c0 76 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  veFiles)]} then 
1f8d0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1f8e0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
1f8f0 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65    # NOTE: If the
1f900 20 74 65 73 74 20 70 6c 61 74 66 6f 72 6d 20 69   test platform i
1f910 73 20 6c 69 6b 65 6c 79 20 74 68 65 20 64 65 66  s likely the def
1f920 61 75 6c 74 20 66 6f 72 20 74 68 69 73 0d 0a 20  ault for this.. 
1f930 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
1f940 20 20 20 20 20 6d 61 63 68 69 6e 65 2c 20 61 6c       machine, al
1f950 73 6f 20 74 72 79 20 74 6f 20 63 6f 70 79 20 74  so try to copy t
1f960 68 65 20 6e 61 74 69 76 65 20 66 69 6c 65 73 20  he native files 
1f970 74 6f 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  to the..        
1f980 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 69        #       bi
1f990 6e 61 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0d 0a  nary location...
1f9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
1f9b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1f9c0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
1f9d0 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65   ::no(copySqlite
1f9e0 49 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 20  ImplicitFiles)] 
1f9f0 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
1fa00 20 20 20 20 20 20 20 20 5b 69 73 44 65 66 61 75          [isDefau
1fa10 6c 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20  ltBuildPlatform 
1fa20 74 72 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  true]} then {.. 
1fa30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
1fa40 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
1fa50 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73  $nativeFileNames
1fa60 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1fa70 20 20 20 20 20 20 74 72 79 43 6f 70 79 41 73 73        tryCopyAss
1fa80 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 0d  embly $fileName.
1fa90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1faa0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
1fab0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
1fac0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
1fad0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79  exists ::no(copy
1fae0 53 71 6c 69 74 65 4e 6f 6e 49 6d 70 6c 69 63 69  SqliteNonImplici
1faf0 74 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  tFiles)]} then {
1fb00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1fb10 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
1fb20 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c  sts ::no(copySql
1fb30 69 74 65 50 6c 61 74 66 6f 72 6d 46 69 6c 65 73  itePlatformFiles
1fb40 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  )] && \..       
1fb50 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74               [st
1fb60 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61  ring length $pla
1fb70 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e  tform] > 0} then
1fb80 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1fb90 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
1fba0 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69  leName $nativeFi
1fbb0 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
1fbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
1fbd0 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 24  ryCopyAssembly $
1fbe0 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f  fileName $platfo
1fbf0 72 6d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  rm..            
1fc00 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1fc10 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
1fc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1fc30 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
1fc40 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 41  ::no(copySqliteA
1fc50 72 63 68 69 74 65 63 74 75 72 65 46 69 6c 65 73  rchitectureFiles
1fc60 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  )] && \..       
1fc70 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74               [st
1fc80 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 61 72 63  ring length $arc
1fc90 68 69 74 65 63 74 75 72 65 5d 20 3e 20 30 7d 20  hitecture] > 0} 
1fca0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1fcb0 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
1fcc0 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69  h fileName $nati
1fcd0 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  veFileNames {.. 
1fce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fcf0 20 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62     tryCopyAssemb
1fd00 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 24 61 72  ly $fileName $ar
1fd10 63 68 69 74 65 63 74 75 72 65 0d 0a 20 20 20 20  chitecture..    
1fd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
1fd30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fd40 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
1fd50 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
1fd60 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
1fd70 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
1fd80 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c  sts ::no(copySql
1fd90 69 74 65 4d 61 6e 61 67 65 64 46 69 6c 65 73 29  iteManagedFiles)
1fda0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1fdb0 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
1fdc0 20 66 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67   fileName $manag
1fdd0 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  edFileNames {.. 
1fde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
1fdf0 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 24  ryCopyAssembly $
1fe00 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20  fileName..      
1fe10 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1fe20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1fe30 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1fe40 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1fe50 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72 79  # NOTE: Skip try
1fe60 69 6e 67 20 74 6f 20 6c 6f 61 64 20 61 6e 79 20  ing to load any 
1fe70 66 69 6c 65 73 20 69 66 20 69 6e 73 74 72 75 63  files if instruc
1fe80 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ted...          
1fe90 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  #..          if 
1fea0 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
1feb0 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 46 69  :no(loadSqliteFi
1fec0 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
1fed0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
1fee0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
1fef0 6f 28 6c 6f 61 64 53 71 6c 69 74 65 49 6d 70 6c  o(loadSqliteImpl
1ff00 69 63 69 74 46 69 6c 65 73 29 5d 7d 20 74 68 65  icitFiles)]} the
1ff10 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1ff20 20 20 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62     tryLoadAssemb
1ff30 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  ly System.Data.S
1ff40 51 4c 69 74 65 2e 64 6c 6c 0d 0a 20 20 20 20 20  QLite.dll..     
1ff50 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1ff60 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
1ff70 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c  fo exists ::no(l
1ff80 6f 61 64 53 71 6c 69 74 65 4c 69 6e 71 46 69 6c  oadSqliteLinqFil
1ff90 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
1ffa0 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 4c              tryL
1ffb0 6f 61 64 41 73 73 65 6d 62 6c 79 20 53 79 73 74  oadAssembly Syst
1ffc0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c  em.Data.SQLite.L
1ffd0 69 6e 71 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20  inq.dll..       
1ffe0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1fff0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
20000 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61   exists ::no(loa
20010 64 53 71 6c 69 74 65 45 66 36 46 69 6c 65 73 29  dSqliteEf6Files)
20020 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
20030 20 20 20 20 20 20 20 20 20 74 72 79 4c 6f 61 64           tryLoad
20040 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e  Assembly System.
20050 44 61 74 61 2e 53 51 4c 69 74 65 2e 45 46 36 2e  Data.SQLite.EF6.
20060 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  dll..           
20070 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
20080 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
20090 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c  sts ::no(loadSql
200a0 69 74 65 4e 6f 6e 49 6d 70 6c 69 63 69 74 46 69  iteNonImplicitFi
200b0 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
200c0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
200d0 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
200e0 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 50 6c  :no(loadSqlitePl
200f0 61 74 66 6f 72 6d 46 69 6c 65 73 29 5d 20 26 26  atformFiles)] &&
20100 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
20110 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
20120 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20  ngth $platform] 
20130 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
20140 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
20150 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20 53 79 73  LoadAssembly Sys
20160 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
20170 64 6c 6c 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 20  dll $platform.. 
20180 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
20190 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
201a0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
201b0 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74  s ::no(loadSqlit
201c0 65 41 72 63 68 69 74 65 63 74 75 72 65 46 69 6c  eArchitectureFil
201d0 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  es)] && \..     
201e0 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74               [st
201f0 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 61 72 63  ring length $arc
20200 68 69 74 65 63 74 75 72 65 5d 20 3e 20 30 7d 20  hitecture] > 0} 
20210 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
20220 20 20 20 20 20 20 20 20 74 72 79 4c 6f 61 64 41          tryLoadA
20230 73 73 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44  ssembly System.D
20240 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 20 24  ata.SQLite.dll $
20250 61 72 63 68 69 74 65 63 74 75 72 65 0d 0a 20 20  architecture..  
20260 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
20270 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
20280 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
20290 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
202a0 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
202b0 4f 6e 6c 79 20 5b 67 65 74 4e 61 74 69 76 65 4c  Only [getNativeL
202c0 69 62 72 61 72 79 46 69 6c 65 4e 61 6d 65 73 4f  ibraryFileNamesO
202d0 6e 6c 79 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20  nly] {..        
202e0 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20    catch {..     
202f0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
20300 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
20310 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
20320 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
20330 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f  - file version o
20340 66 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 4f  f \"" $fileNameO
20350 6e 6c 79 20 22 5c 22 2e 2e 2e 20 5c 22 22 20 5c  nly "\"... \"" \
20360 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
20370 20 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20    [file version 
20380 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61  [getBinaryFileNa
20390 6d 65 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79  me $fileNameOnly
203a0 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  ]] \"\n]..      
203b0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
203c0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63  ....        catc
203d0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  h {..          t
203e0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
203f0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
20400 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
20410 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72    "---- file ver
20420 73 69 6f 6e 20 6f 66 20 5c 22 53 51 4c 69 74 65  sion of \"SQLite
20430 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 5c 22 2e 2e  .Interop.dll\"..
20440 2e 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  . \"" \..       
20450 20 20 20 20 20 20 20 5b 66 69 6c 65 20 76 65 72         [file ver
20460 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79 46  sion [getBinaryF
20470 69 6c 65 4e 61 6d 65 20 53 51 4c 69 74 65 2e 49  ileName SQLite.I
20480 6e 74 65 72 6f 70 2e 64 6c 6c 5d 5d 20 5c 22 5c  nterop.dll]] \"\
20490 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  n]..        }...
204a0 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b  .        catch {
204b0 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
204c0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
204d0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
204e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
204f0 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f  ---- file versio
20500 6e 20 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44 61  n of \"System.Da
20510 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e  ta.SQLite.dll\".
20520 2e 2e 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  .. \"" \..      
20530 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 76 65          [file ve
20540 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79  rsion [getBinary
20550 46 69 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e  FileName System.
20560 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d  Data.SQLite.dll]
20570 5d 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ] \"\n]..       
20580 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61   }....        ca
20590 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
205a0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
205b0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
205c0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
205d0 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76      "---- file v
205e0 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53 79 73 74  ersion of \"Syst
205f0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c  em.Data.SQLite.L
20600 69 6e 71 2e 64 6c 6c 5c 22 2e 2e 2e 20 5c 22 22  inq.dll\"... \""
20610 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
20620 20 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20    [file version 
20630 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61  [getBinaryFileNa
20640 6d 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  me System.Data.S
20650 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 5d 5d  QLite.Linq.dll]]
20660 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
20670 20 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20    \"\n]..       
20680 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61   }....        ca
20690 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
206a0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
206b0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
206c0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
206d0 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76      "---- file v
206e0 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53 79 73 74  ersion of \"Syst
206f0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 45  em.Data.SQLite.E
20700 46 36 2e 64 6c 6c 5c 22 2e 2e 2e 20 5c 22 22 20  F6.dll\"... \"" 
20710 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
20720 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b   [file version [
20730 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
20740 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  e System.Data.SQ
20750 4c 69 74 65 2e 45 46 36 2e 64 6c 6c 5d 5d 20 5c  Lite.EF6.dll]] \
20760 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
20770 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d  \"\n]..        }
20780 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
20790 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
207a0 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74  platform] > 0} t
207b0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
207c0 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
207d0 65 4f 6e 6c 79 20 5b 67 65 74 4e 61 74 69 76 65  eOnly [getNative
207e0 4c 69 62 72 61 72 79 46 69 6c 65 4e 61 6d 65 73  LibraryFileNames
207f0 4f 6e 6c 79 5d 20 7b 0d 0a 20 20 20 20 20 20 20  Only] {..       
20800 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
20810 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
20820 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
20830 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
20840 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20850 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65     "---- file ve
20860 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24 70 6c  rsion of \"" $pl
20870 61 74 66 6f 72 6d 20 5c 0d 0a 20 20 20 20 20 20  atform \..      
20880 20 20 20 20 20 20 20 20 20 20 20 20 2f 20 24 66              / $f
20890 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 22 5c 22 2e  ileNameOnly "\".
208a0 2e 2e 20 5c 22 22 20 5b 66 69 6c 65 20 76 65 72  .. \"" [file ver
208b0 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  sion \..        
208c0 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 69            [getBi
208d0 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69  naryFileName $fi
208e0 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24 70 6c 61 74  leNameOnly $plat
208f0 66 6f 72 6d 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20 20  form]] \"\n]..  
20900 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
20910 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
20920 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20        catch {.. 
20930 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
20940 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
20950 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
20960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20970 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69  "---- file versi
20980 6f 6e 20 6f 66 20 5c 22 22 20 24 70 6c 61 74 66  on of \"" $platf
20990 6f 72 6d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  orm \..         
209a0 20 20 20 20 20 20 20 22 2f 53 51 4c 69 74 65 2e         "/SQLite.
209b0 49 6e 74 65 72 6f 70 2e 64 6c 6c 5c 22 2e 2e 2e  Interop.dll\"...
209c0 20 5c 22 22 20 5b 66 69 6c 65 20 76 65 72 73 69   \"" [file versi
209d0 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  on \..          
209e0 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61 72 79        [getBinary
209f0 46 69 6c 65 4e 61 6d 65 20 53 51 4c 69 74 65 2e  FileName SQLite.
20a00 49 6e 74 65 72 6f 70 2e 64 6c 6c 20 24 70 6c 61  Interop.dll $pla
20a10 74 66 6f 72 6d 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20  tform]] \"\n].. 
20a20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
20a30 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d          catch {.
20a40 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
20a50 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
20a60 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
20a70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
20a80 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72    "---- file ver
20a90 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24 70 6c 61  sion of \"" $pla
20aa0 74 66 6f 72 6d 20 5c 0d 0a 20 20 20 20 20 20 20  tform \..       
20ab0 20 20 20 20 20 20 20 20 20 22 2f 53 79 73 74 65           "/Syste
20ac0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
20ad0 6c 5c 22 2e 2e 2e 20 5c 22 22 20 5b 66 69 6c 65  l\"... \"" [file
20ae0 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20   version \..    
20af0 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
20b00 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 53  BinaryFileName S
20b10 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
20b20 65 2e 64 6c 6c 20 24 70 6c 61 74 66 6f 72 6d 5d  e.dll $platform]
20b30 5d 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ] \"\n]..       
20b40 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
20b50 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  ...        if {[
20b60 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 61  string length $a
20b70 72 63 68 69 74 65 63 74 75 72 65 5d 20 3e 20 30  rchitecture] > 0
20b80 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
20b90 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
20ba0 4e 61 6d 65 4f 6e 6c 79 20 5b 67 65 74 4e 61 74  NameOnly [getNat
20bb0 69 76 65 4c 69 62 72 61 72 79 46 69 6c 65 4e 61  iveLibraryFileNa
20bc0 6d 65 73 4f 6e 6c 79 5d 20 7b 0d 0a 20 20 20 20  mesOnly] {..    
20bd0 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d          catch {.
20be0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
20bf0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
20c00 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
20c10 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
20c20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65        "---- file
20c30 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20   version of \"" 
20c40 24 61 72 63 68 69 74 65 63 74 75 72 65 20 5c 0d  $architecture \.
20c50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20c60 20 20 20 2f 20 24 66 69 6c 65 4e 61 6d 65 4f 6e     / $fileNameOn
20c70 6c 79 20 22 5c 22 2e 2e 2e 20 5c 22 22 20 5b 66  ly "\"... \"" [f
20c80 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20  ile version \.. 
20c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ca0 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
20cb0 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c  ame $fileNameOnl
20cc0 79 20 24 61 72 63 68 69 74 65 63 74 75 72 65 5d  y $architecture]
20cd0 5d 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ] \"\n]..       
20ce0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
20cf0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
20d00 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20   catch {..      
20d10 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
20d20 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
20d30 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
20d40 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
20d50 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66   file version of
20d60 20 5c 22 22 20 24 61 72 63 68 69 74 65 63 74 75   \"" $architectu
20d70 72 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  re \..          
20d80 20 20 20 20 20 20 22 2f 53 51 4c 69 74 65 2e 49        "/SQLite.I
20d90 6e 74 65 72 6f 70 2e 64 6c 6c 5c 22 2e 2e 2e 20  nterop.dll\"... 
20da0 5c 22 22 20 5b 66 69 6c 65 20 76 65 72 73 69 6f  \"" [file versio
20db0 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
20dc0 20 20 20 20 20 5b 67 65 74 42 69 6e 61 72 79 46       [getBinaryF
20dd0 69 6c 65 4e 61 6d 65 20 53 51 4c 69 74 65 2e 49  ileName SQLite.I
20de0 6e 74 65 72 6f 70 2e 64 6c 6c 20 24 61 72 63 68  nterop.dll $arch
20df0 69 74 65 63 74 75 72 65 5d 5d 20 5c 22 5c 6e 5d  itecture]] \"\n]
20e00 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
20e10 0a 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68  .          catch
20e20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
20e30 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
20e40 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
20e50 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
20e60 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20       "---- file 
20e70 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24  version of \"" $
20e80 61 72 63 68 69 74 65 63 74 75 72 65 20 5c 0d 0a  architecture \..
20e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ea0 22 2f 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  "/System.Data.SQ
20eb0 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 5c 22  Lite.dll\"... \"
20ec0 22 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20  " [file version 
20ed0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
20ee0 20 20 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c     [getBinaryFil
20ef0 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74  eName System.Dat
20f00 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 20 24 61 72  a.SQLite.dll $ar
20f10 63 68 69 74 65 63 74 75 72 65 5d 5d 20 5c 0d 0a  chitecture]] \..
20f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f30 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  \"\n]..         
20f40 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
20f50 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
20f60 20 20 20 20 23 20 4e 4f 54 45 3a 20 47 72 61 62      # NOTE: Grab
20f70 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6d 61 6e   the list of man
20f80 61 67 65 64 20 61 73 73 65 6d 62 6c 69 65 73 20  aged assemblies 
20f90 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
20fa0 70 72 6f 63 65 73 73 0d 0a 20 20 20 20 20 20 20  process..       
20fb0 20 23 20 20 20 20 20 20 20 61 6e 64 20 72 65 70   #       and rep
20fc0 6f 72 74 20 6f 6e 20 74 68 65 20 53 79 73 74 65  ort on the Syste
20fd0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 72 65  m.Data.SQLite re
20fe0 6c 61 74 65 64 20 6f 6e 65 73 2e 0d 0a 20 20 20  lated ones...   
20ff0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
21000 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f  if {[haveSQLiteO
21010 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74  bjectCommand]} t
21020 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
21030 20 73 65 74 20 61 73 73 65 6d 62 6c 69 65 73 20   set assemblies 
21040 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 41  [object invoke A
21050 70 70 44 6f 6d 61 69 6e 2e 43 75 72 72 65 6e 74  ppDomain.Current
21060 44 6f 6d 61 69 6e 20 47 65 74 41 73 73 65 6d 62  Domain GetAssemb
21070 6c 69 65 73 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  lies]....       
21080 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63     object foreac
21090 68 20 61 73 73 65 6d 62 6c 79 20 24 61 73 73 65  h assembly $asse
210a0 6d 62 6c 69 65 73 20 7b 0d 0a 20 20 20 20 20 20  mblies {..      
210b0 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
210c0 67 20 6d 61 74 63 68 20 5c 7b 53 79 73 74 65 6d  g match \{System
210d0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2a 20 24 61  .Data.SQLite* $a
210e0 73 73 65 6d 62 6c 79 5d 7d 20 74 68 65 6e 20 7b  ssembly]} then {
210f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21100 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
21110 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
21120 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
21130 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 6f 75         "---- fou
21140 6e 64 20 6c 6f 61 64 65 64 20 61 73 73 65 6d 62  nd loaded assemb
21150 6c 79 3a 20 22 20 24 61 73 73 65 6d 62 6c 79 20  ly: " $assembly 
21160 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n]..           
21170 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
21180 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
21190 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20        catch {.. 
211a0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
211b0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c  ::test_channel \
211c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
211d0 22 2d 2d 2d 2d 20 64 65 66 69 6e 65 20 63 6f 6e  "---- define con
211e0 73 74 61 6e 74 73 20 66 6f 72 20 5c 22 53 79 73  stants for \"Sys
211f0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 5c  tem.Data.SQLite\
21200 22 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  "... "....      
21210 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
21220 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 62  ..            ob
21230 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
21240 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
21250 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21260 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
21270 69 74 65 2e 53 51 4c 69 74 65 33 20 44 65 66 69  ite.SQLite3 Defi
21280 6e 65 43 6f 6e 73 74 61 6e 74 73 0d 0a 20 20 20  neConstants..   
21290 20 20 20 20 20 20 20 7d 20 64 65 66 69 6e 65 43         } defineC
212a0 6f 6e 73 74 61 6e 74 73 5d 20 3d 3d 20 30 7d 20  onstants] == 0} 
212b0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
212c0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
212d0 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
212e0 64 41 72 67 73 20 5b 66 6f 72 6d 61 74 4c 69 73  dArgs [formatLis
212f0 74 20 5b 6c 73 6f 72 74 20 5c 0d 0a 20 20 20 20  t [lsort \..    
21300 20 20 20 20 20 20 20 20 20 20 20 20 24 64 65 66              $def
21310 69 6e 65 43 6f 6e 73 74 61 6e 74 73 5d 20 3c 6e  ineConstants] <n
21320 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20  one>] \n]..     
21330 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
21340 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
21350 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
21360 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20   unknown\n..    
21370 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
21380 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61   }....        ca
21390 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
213a0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
213b0 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20  hannel \..      
213c0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6f          "---- so
213d0 75 72 63 65 20 76 65 72 73 69 6f 6e 20 6f 66 20  urce version of 
213e0 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  \"System.Data.SQ
213f0 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 0d  Lite.dll\"... ".
21400 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
21410 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
21420 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
21430 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
21440 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
21450 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
21460 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
21470 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 50 72  iteConnection Pr
21480 6f 76 69 64 65 72 56 65 72 73 69 6f 6e 0d 0a 20  oviderVersion.. 
21490 20 20 20 20 20 20 20 20 20 7d 20 76 65 72 73 69           } versi
214a0 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  on] == 0} then {
214b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
214c0 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
214d0 20 24 76 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d   $version] == 0}
214e0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
214f0 20 20 20 20 20 20 20 73 65 74 20 76 65 72 73 69         set versi
21500 6f 6e 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20  on null..       
21510 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
21520 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
21530 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
21540 64 41 72 67 73 20 24 76 65 72 73 69 6f 6e 20 5c  dArgs $version \
21550 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  n]..          } 
21560 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
21570 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
21580 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77  t_channel unknow
21590 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  n\n..          }
215a0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
215b0 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a         catch {..
215c0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
215d0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
215e0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
215f0 20 22 2d 2d 2d 2d 20 73 6f 75 72 63 65 20 63 68   "---- source ch
21600 65 63 6b 6f 75 74 20 6f 66 20 5c 22 53 79 73 74  eckout of \"Syst
21610 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
21620 6c 6c 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  ll\"... "....   
21630 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
21640 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
21650 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
21660 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
21670 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
21680 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
21690 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 43 6f 6e  SQLite.SQLiteCon
216a0 6e 65 63 74 69 6f 6e 20 50 72 6f 76 69 64 65 72  nection Provider
216b0 53 6f 75 72 63 65 49 64 0d 0a 20 20 20 20 20 20  SourceId..      
216c0 20 20 20 20 7d 20 73 6f 75 72 63 65 49 64 5d 20      } sourceId] 
216d0 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
216e0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73            if {[s
216f0 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 6f  tring length $so
21700 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68  urceId] == 0} th
21710 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
21720 20 20 20 20 73 65 74 20 73 6f 75 72 63 65 49 64      set sourceId
21730 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20   null..         
21740 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
21750 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
21760 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
21770 72 67 73 20 24 73 6f 75 72 63 65 49 64 20 5c 6e  rgs $sourceId \n
21780 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  ]..          } e
21790 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
217a0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
217b0 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e  _channel unknown
217c0 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  \n..          }.
217d0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
217e0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
217f0 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74   # NOTE: Check t
21800 68 65 20 61 76 61 69 6c 61 62 6c 65 20 62 75 69  he available bui
21810 6c 64 73 20 28 61 6e 64 20 22 72 65 6c 65 61 73  lds (and "releas
21820 65 73 22 29 20 6f 66 20 53 51 4c 69 74 65 20 61  es") of SQLite a
21830 6e 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  nd..        #   
21840 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
21850 53 51 4c 69 74 65 2e 0d 0a 20 20 20 20 20 20 20  SQLite...       
21860 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63   #..        chec
21870 6b 46 6f 72 53 51 4c 69 74 65 42 75 69 6c 64 73  kForSQLiteBuilds
21880 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
21890 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46  ..        checkF
218a0 6f 72 53 51 4c 69 74 65 52 65 6c 65 61 73 65 73  orSQLiteReleases
218b0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
218c0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
218d0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e         # NOTE: N
218e0 6f 77 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 6b  ow, we need to k
218f0 6e 6f 77 20 69 66 20 74 68 65 20 53 51 4c 69 74  now if the SQLit
21900 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20 69  e core library i
21910 73 20 61 76 61 69 6c 61 62 6c 65 0d 0a 20 20 20  s available..   
21920 20 20 20 20 20 23 20 20 20 20 20 20 20 28 69 2e       #       (i.
21930 65 2e 20 62 65 63 61 75 73 65 20 74 68 65 20 6d  e. because the m
21940 61 6e 61 67 65 64 2d 6f 6e 6c 79 20 53 79 73 74  anaged-only Syst
21950 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 61  em.Data.SQLite a
21960 73 73 65 6d 62 6c 79 20 63 61 6e 0d 0a 20 20 20  ssembly can..   
21970 20 20 20 20 20 23 20 20 20 20 20 20 20 6c 6f 61       #       loa
21980 64 20 77 69 74 68 6f 75 74 20 69 74 3b 20 68 6f  d without it; ho
21990 77 65 76 65 72 2c 20 69 74 20 63 61 6e 6e 6f 74  wever, it cannot
219a0 20 64 6f 20 61 6e 79 74 68 69 6e 67 20 75 73 65   do anything use
219b0 66 75 6c 20 77 69 74 68 6f 75 74 0d 0a 20 20 20  ful without..   
219c0 20 20 20 20 20 23 20 20 20 20 20 20 20 69 74 29       #       it)
219d0 2e 20 20 49 66 20 77 65 20 61 72 65 20 75 73 69  .  If we are usi
219e0 6e 67 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64  ng the mixed-mod
219f0 65 20 61 73 73 65 6d 62 6c 79 20 61 6e 64 20 77  e assembly and w
21a00 65 20 61 6c 72 65 61 64 79 0d 0a 20 20 20 20 20  e already..     
21a10 20 20 20 23 20 20 20 20 20 20 20 66 6f 75 6e 64     #       found
21a20 20 69 74 20 28 61 62 6f 76 65 29 2c 20 74 68 69   it (above), thi
21a30 73 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  s should always 
21a40 73 75 63 63 65 65 64 2e 0d 0a 20 20 20 20 20 20  succeed...      
21a50 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65    #..        che
21a60 63 6b 46 6f 72 53 51 4c 69 74 65 4c 69 62 72 61  ckForSQLiteLibra
21a70 72 79 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ry $::test_chann
21a80 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  el....        #.
21a90 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
21aa0 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 53 51   Check if the SQ
21ab0 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73  Lite interop ass
21ac0 65 6d 62 6c 79 20 69 73 20 61 76 61 69 6c 61 62  embly is availab
21ad0 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  le...        #..
21ae0 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
21af0 53 51 4c 69 74 65 49 6e 74 65 72 6f 70 20 24 3a  SQLiteInterop $:
21b00 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d  :test_channel...
21b10 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
21b20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
21b30 6b 20 74 68 65 20 53 51 4c 69 74 65 20 64 61 74  k the SQLite dat
21b40 61 62 61 73 65 20 61 6e 64 20 74 65 6d 70 6f 72  abase and tempor
21b50 61 72 79 20 64 69 72 65 63 74 6f 72 69 65 73 2e  ary directories.
21b60 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
21b70 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c       checkForSQL
21b80 69 74 65 44 69 72 65 63 74 6f 72 69 65 73 20 24  iteDirectories $
21b90 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a  ::test_channel..
21ba0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
21bb0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74       # NOTE: Att
21bc0 65 6d 70 74 20 74 6f 20 64 65 74 65 72 6d 69 6e  empt to determin
21bd0 65 20 69 66 20 76 61 72 69 6f 75 73 20 63 6f 6d  e if various com
21be0 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
21bf0 73 20 6e 65 65 64 65 64 20 66 6f 72 0d 0a 20 20  s needed for..  
21c00 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65        #       te
21c10 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77  st constraints w
21c20 65 72 65 20 65 6e 61 62 6c 65 64 20 66 6f 72 20  ere enabled for 
21c30 74 68 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65  the managed asse
21c40 6d 62 6c 79 2e 20 20 54 68 65 72 65 0d 0a 20 20  mbly.  There..  
21c50 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 72        #       ar
21c60 65 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 2d 74  e some compile-t
21c70 69 6d 65 20 6f 70 74 69 6f 6e 73 20 74 68 61 74  ime options that
21c80 20 6d 75 73 74 20 61 6c 73 6f 20 68 61 76 65 20   must also have 
21c90 62 65 65 6e 20 65 6e 61 62 6c 65 64 0d 0a 20 20  been enabled..  
21ca0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66 6f        #       fo
21cb0 72 20 74 68 65 20 69 6e 74 65 72 6f 70 20 61 73  r the interop as
21cc0 73 65 6d 62 6c 79 20 69 6e 20 6f 72 64 65 72 20  sembly in order 
21cd0 74 6f 20 62 65 20 65 66 66 65 63 74 69 76 65 2e  to be effective.
21ce0 20 20 46 6f 72 20 74 68 6f 73 65 0d 0a 20 20 20    For those..   
21cf0 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 70 74       #       opt
21d00 69 6f 6e 73 2c 20 69 74 20 77 69 6c 6c 20 62 65  ions, it will be
21d10 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 69 74   assumed that it
21d20 20 77 61 73 20 65 6e 61 62 6c 65 64 20 66 6f 72   was enabled for
21d30 20 74 68 65 20 69 6e 74 65 72 6f 70 0d 0a 20 20   the interop..  
21d40 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 73        #       as
21d50 73 65 6d 62 6c 79 20 69 66 20 69 74 20 77 61 73  sembly if it was
21d60 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 68 65   enabled for the
21d70 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c   managed assembl
21d80 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  y...        #.. 
21d90 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 64         foreach d
21da0 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 5b 6c  efineConstant [l
21db0 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ist \..         
21dc0 20 20 20 43 48 45 43 4b 5f 53 54 41 54 45 20 43     CHECK_STATE C
21dd0 4f 55 4e 54 5f 48 41 4e 44 4c 45 20 44 45 42 55  OUNT_HANDLE DEBU
21de0 47 20 49 4e 54 45 52 4f 50 5f 43 4f 44 45 43 20  G INTEROP_CODEC 
21df0 49 4e 54 45 52 4f 50 5f 44 45 42 55 47 20 5c 0d  INTEROP_DEBUG \.
21e00 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 54  .            INT
21e10 45 52 4f 50 5f 45 58 54 45 4e 53 49 4f 4e 5f 46  EROP_EXTENSION_F
21e20 55 4e 43 54 49 4f 4e 53 20 49 4e 54 45 52 4f 50  UNCTIONS INTEROP
21e30 5f 46 54 53 35 5f 45 58 54 45 4e 53 49 4f 4e 20  _FTS5_EXTENSION 
21e40 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 49  \..            I
21e50 4e 54 45 52 4f 50 5f 49 4e 43 4c 55 44 45 5f 43  NTEROP_INCLUDE_C
21e60 45 52 4f 44 20 49 4e 54 45 52 4f 50 5f 49 4e 43  EROD INTEROP_INC
21e70 4c 55 44 45 5f 45 58 54 52 41 20 49 4e 54 45 52  LUDE_EXTRA INTER
21e80 4f 50 5f 49 4e 43 4c 55 44 45 5f 53 45 45 20 5c  OP_INCLUDE_SEE \
21e90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 4e  ..            IN
21ea0 54 45 52 4f 50 5f 49 4e 43 4c 55 44 45 5f 5a 49  TEROP_INCLUDE_ZI
21eb0 50 56 46 53 20 49 4e 54 45 52 4f 50 5f 4a 53 4f  PVFS INTEROP_JSO
21ec0 4e 31 5f 45 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a  N1_EXTENSION \..
21ed0 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 54 45              INTE
21ee0 52 4f 50 5f 4c 45 47 41 43 59 5f 43 4c 4f 53 45  ROP_LEGACY_CLOSE
21ef0 20 49 4e 54 45 52 4f 50 5f 4c 4f 47 20 49 4e 54   INTEROP_LOG INT
21f00 45 52 4f 50 5f 50 45 52 43 45 4e 54 49 4c 45 5f  EROP_PERCENTILE_
21f10 45 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20  EXTENSION \..   
21f20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50           INTEROP
21f30 5f 52 45 47 45 58 50 5f 45 58 54 45 4e 53 49 4f  _REGEXP_EXTENSIO
21f40 4e 20 49 4e 54 45 52 4f 50 5f 54 45 53 54 5f 45  N INTEROP_TEST_E
21f50 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20  XTENSION \..    
21f60 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f          INTEROP_
21f70 54 4f 54 59 50 45 5f 45 58 54 45 4e 53 49 4f 4e  TOTYPE_EXTENSION
21f80 20 49 4e 54 45 52 4f 50 5f 56 49 52 54 55 41 4c   INTEROP_VIRTUAL
21f90 5f 54 41 42 4c 45 20 4e 45 54 5f 32 30 20 4e 45  _TABLE NET_20 NE
21fa0 54 5f 33 35 20 5c 0d 0a 20 20 20 20 20 20 20 20  T_35 \..        
21fb0 20 20 20 20 4e 45 54 5f 34 30 20 4e 45 54 5f 34      NET_40 NET_4
21fc0 35 20 4e 45 54 5f 34 35 31 20 4e 45 54 5f 34 35  5 NET_451 NET_45
21fd0 32 20 4e 45 54 5f 34 36 20 4e 45 54 5f 34 36 31  2 NET_46 NET_461
21fe0 20 4e 45 54 5f 43 4f 4d 50 41 43 54 5f 32 30 20   NET_COMPACT_20 
21ff0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 50  \..            P
22000 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50 41 43 54 46  LATFORM_COMPACTF
22010 52 41 4d 45 57 4f 52 4b 20 50 52 45 4c 4f 41 44  RAMEWORK PRELOAD
22020 5f 4e 41 54 49 56 45 5f 4c 49 42 52 41 52 59 20  _NATIVE_LIBRARY 
22030 52 45 54 41 52 47 45 54 41 42 4c 45 20 5c 0d 0a  RETARGETABLE \..
22040 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
22050 54 45 5f 53 54 41 4e 44 41 52 44 20 53 51 4c 49  TE_STANDARD SQLI
22060 54 45 5f 53 54 41 4e 44 41 52 44 5f 4c 49 42 52  TE_STANDARD_LIBR
22070 41 52 59 5f 4e 41 4d 45 20 54 48 52 4f 57 5f 4f  ARY_NAME THROW_O
22080 4e 5f 44 49 53 50 4f 53 45 44 20 5c 0d 0a 20 20  N_DISPOSED \..  
22090 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45 20            TRACE 
220a0 54 52 41 43 45 5f 43 4f 4e 4e 45 43 54 49 4f 4e  TRACE_CONNECTION
220b0 20 54 52 41 43 45 5f 44 45 54 45 43 54 49 4f 4e   TRACE_DETECTION
220c0 20 54 52 41 43 45 5f 48 41 4e 44 4c 45 20 54 52   TRACE_HANDLE TR
220d0 41 43 45 5f 50 52 45 4c 4f 41 44 20 5c 0d 0a 20  ACE_PRELOAD \.. 
220e0 20 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45             TRACE
220f0 5f 53 48 41 52 45 44 20 54 52 41 43 45 5f 53 54  _SHARED TRACE_ST
22100 41 54 45 4d 45 4e 54 20 54 52 41 43 45 5f 57 41  ATEMENT TRACE_WA
22110 52 4e 49 4e 47 20 54 52 41 43 4b 5f 4d 45 4d 4f  RNING TRACK_MEMO
22120 52 59 5f 42 59 54 45 53 20 5c 0d 0a 20 20 20 20  RY_BYTES \..    
22130 20 20 20 20 20 20 20 20 55 53 45 5f 45 4e 54 49          USE_ENTI
22140 54 59 5f 46 52 41 4d 45 57 4f 52 4b 5f 36 20 55  TY_FRAMEWORK_6 U
22150 53 45 5f 49 4e 54 45 52 4f 50 5f 44 4c 4c 20 55  SE_INTEROP_DLL U
22160 53 45 5f 50 52 45 50 41 52 45 5f 56 32 20 57 49  SE_PREPARE_V2 WI
22170 4e 44 4f 57 53 5d 20 7b 0d 0a 20 20 20 20 20 20  NDOWS] {..      
22180 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
22190 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
221a0 66 20 74 68 65 20 63 6f 6d 70 69 6c 65 2d 74 69  f the compile-ti
221b0 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 6c 69 73  me option is lis
221c0 74 65 64 20 69 6e 20 74 68 65 20 6c 69 73 74 20  ted in the list 
221d0 6f 66 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  of..          # 
221e0 20 20 20 20 20 20 22 64 65 66 69 6e 65 20 63 6f        "define co
221f0 6e 73 74 61 6e 74 73 22 20 6b 65 70 74 20 74 72  nstants" kept tr
22200 61 63 6b 20 6f 66 20 62 79 20 74 68 65 20 6d 61  ack of by the ma
22210 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 2e 0d  naged assembly..
22220 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
22230 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
22240 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73  SQLiteDefineCons
22250 74 61 6e 74 20 24 3a 3a 74 65 73 74 5f 63 68 61  tant $::test_cha
22260 6e 6e 65 6c 20 24 64 65 66 69 6e 65 43 6f 6e 73  nnel $defineCons
22270 74 61 6e 74 0d 0a 20 20 20 20 20 20 20 20 7d 0d  tant..        }.
22280 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
22290 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
222a0 65 63 6b 20 69 66 20 74 68 65 20 53 79 73 74 65  eck if the Syste
222b0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 70 72  m.Data.SQLite pr
222c0 6f 76 69 64 65 72 20 77 61 73 20 63 6f 6d 70 69  ovider was compi
222d0 6c 65 64 20 77 69 74 68 0d 0a 20 20 20 20 20 20  led with..      
222e0 20 20 23 20 20 20 20 20 20 20 73 75 70 70 6f 72    #       suppor
222f0 74 20 66 6f 72 20 61 6e 79 20 65 6e 63 72 79 70  t for any encryp
22300 74 65 64 20 64 61 74 61 62 61 73 65 73 2e 0d 0a  ted databases...
22310 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
22320 20 20 20 69 66 20 7b 5b 68 61 76 65 43 6f 6e 73     if {[haveCons
22330 74 72 61 69 6e 74 20 5c 0d 0a 20 20 20 20 20 20  traint \..      
22340 20 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65            define
22350 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74 65 6d 2e  Constant.System.
22360 44 61 74 61 2e 53 51 4c 69 74 65 2e 49 4e 54 45  Data.SQLite.INTE
22370 52 4f 50 5f 43 4f 44 45 43 5d 20 7c 7c 20 5c 0d  ROP_CODEC] || \.
22380 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 68 61  .            [ha
22390 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5c 0d 0a  veConstraint \..
223a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223b0 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 2e 53  defineConstant.S
223c0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
223d0 65 2e 49 4e 54 45 52 4f 50 5f 49 4e 43 4c 55 44  e.INTEROP_INCLUD
223e0 45 5f 53 45 45 5d 7d 20 74 68 65 6e 20 7b 0d 0a  E_SEE]} then {..
223f0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
22400 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59         # NOTE: Y
22410 65 73 2c 20 61 64 64 20 67 65 6e 65 72 69 63 20  es, add generic 
22420 63 6f 6e 73 74 72 61 69 6e 74 20 66 6f 72 20 75  constraint for u
22430 73 65 20 62 79 20 74 68 65 20 74 65 73 74 20 73  se by the test s
22440 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 20  uite...         
22450 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64   #..          ad
22460 64 43 6f 6e 73 74 72 61 69 6e 74 20 53 79 73 74  dConstraint Syst
22470 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 45  em.Data.SQLite.E
22480 6e 63 72 79 70 74 69 6f 6e 0d 0a 20 20 20 20 20  ncryption..     
22490 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
224a0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
224b0 45 3a 20 43 68 65 63 6b 20 74 68 65 20 63 75 72  E: Check the cur
224c0 72 65 6e 74 20 62 75 69 6c 64 20 79 65 61 72 2e  rent build year.
224d0 20 20 42 61 73 69 63 61 6c 6c 79 2c 20 74 68 69    Basically, thi
224e0 73 20 69 6e 64 69 63 61 74 65 73 0d 0a 20 20 20  s indicates..   
224f0 20 20 20 20 20 23 20 20 20 20 20 20 20 77 68 69       #       whi
22500 63 68 20 76 65 72 73 69 6f 6e 20 6f 66 20 4d 53  ch version of MS
22510 42 75 69 6c 64 20 61 6e 64 2f 6f 72 20 56 69 73  Build and/or Vis
22520 75 61 6c 20 53 74 75 64 69 6f 20 77 61 73 20 75  ual Studio was u
22530 73 65 64 20 74 6f 0d 0a 20 20 20 20 20 20 20 20  sed to..        
22540 23 20 20 20 20 20 20 20 63 6f 6d 70 69 6c 65 20  #       compile 
22550 74 68 65 20 61 73 73 65 6d 62 6c 79 20 62 69 6e  the assembly bin
22560 61 72 69 65 73 20 75 6e 64 65 72 20 74 65 73 74  aries under test
22570 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
22580 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
22590 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20  est_channel \.. 
225a0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
225b0 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79   checking for Sy
225c0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
225d0 20 62 75 69 6c 64 20 79 65 61 72 2e 2e 2e 20 22   build year... "
225e0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
225f0 79 65 61 72 20 5b 67 65 74 42 75 69 6c 64 59 65  year [getBuildYe
22600 61 72 5d 0d 0a 20 20 20 20 20 20 20 20 61 64 64  ar]..        add
22610 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
22620 6e 64 41 72 67 73 20 62 75 69 6c 64 59 65 61 72  ndArgs buildYear
22630 2e 20 24 79 65 61 72 5d 0d 0a 20 20 20 20 20 20  . $year]..      
22640 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
22650 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
22660 72 67 73 20 5c 22 20 24 79 65 61 72 20 5c 22 5c  rgs \" $year \"\
22670 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  n]....        #.
22680 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
22690 20 43 68 65 63 6b 20 74 68 65 20 63 75 72 72 65   Check the curre
226a0 6e 74 20 62 75 69 6c 64 20 2e 4e 45 54 20 46 72  nt build .NET Fr
226b0 61 6d 65 77 6f 72 6b 2e 20 20 42 61 73 69 63 61  amework.  Basica
226c0 6c 6c 79 2c 20 74 68 69 73 0d 0a 20 20 20 20 20  lly, this..     
226d0 20 20 20 23 20 20 20 20 20 20 20 69 6e 64 69 63     #       indic
226e0 61 74 65 73 20 77 68 69 63 68 20 76 65 72 73 69  ates which versi
226f0 6f 6e 20 6f 66 20 74 68 65 20 2e 4e 45 54 20 46  on of the .NET F
22700 72 61 6d 65 77 6f 72 6b 20 69 73 20 62 65 69 6e  ramework is bein
22710 67 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  g..        #    
22720 20 20 20 75 73 65 64 20 62 79 20 74 68 65 20 61     used by the a
22730 73 73 65 6d 62 6c 79 20 62 69 6e 61 72 69 65 73  ssembly binaries
22740 20 75 6e 64 65 72 20 74 65 73 74 2e 0d 0a 20 20   under test...  
22750 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
22760 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
22770 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20  hannel \..      
22780 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63        "---- chec
22790 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e  king for System.
227a0 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75 69 6c  Data.SQLite buil
227b0 64 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b  d .NET Framework
227c0 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20  ... "....       
227d0 20 73 65 74 20 6e 65 74 46 78 20 5b 67 65 74 42   set netFx [getB
227e0 75 69 6c 64 4e 65 74 46 78 5d 0d 0a 20 20 20 20  uildNetFx]..    
227f0 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
22800 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 62 75  t [appendArgs bu
22810 69 6c 64 46 72 61 6d 65 77 6f 72 6b 2e 20 24 6e  ildFramework. $n
22820 65 74 46 78 5d 0d 0a 20 20 20 20 20 20 20 20 74  etFx]..        t
22830 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
22840 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
22850 20 5c 22 20 24 6e 65 74 46 78 20 5c 22 5c 6e 5d   \" $netFx \"\n]
22860 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
22870 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
22880 68 65 63 6b 20 74 68 65 20 63 75 72 72 65 6e 74  heck the current
22890 20 62 75 69 6c 64 20 63 6f 6e 66 69 67 75 72 61   build configura
228a0 74 69 6f 6e 2e 20 20 54 68 69 73 20 73 68 6f 75  tion.  This shou
228b0 6c 64 20 6e 6f 72 6d 61 6c 6c 79 0d 0a 20 20 20  ld normally..   
228c0 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65 20       #       be 
228d0 65 69 74 68 65 72 20 22 44 65 62 75 67 22 20 6f  either "Debug" o
228e0 72 20 22 52 65 6c 65 61 73 65 22 2e 0d 0a 20 20  r "Release"...  
228f0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
22900 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
22910 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20  hannel \..      
22920 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63        "---- chec
22930 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e  king for System.
22940 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75 69 6c  Data.SQLite buil
22950 64 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  d configuration.
22960 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20  .. "....        
22970 73 65 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  set configuratio
22980 6e 20 5b 67 65 74 42 75 69 6c 64 43 6f 6e 66 69  n [getBuildConfi
22990 67 75 72 61 74 69 6f 6e 5d 0d 0a 20 20 20 20 20  guration]..     
229a0 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
229b0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 62 75 69   [appendArgs bui
229c0 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  ldConfiguration.
229d0 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d   $configuration]
229e0 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
229f0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
22a00 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24  [appendArgs \" $
22a10 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 5c 22  configuration \"
22a20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  \n]....        #
22a30 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
22a40 3a 20 54 72 79 20 74 6f 20 73 65 74 75 70 20 61  : Try to setup a
22a50 6e 20 69 6e 74 65 72 72 75 70 74 20 63 61 6c 6c  n interrupt call
22a60 62 61 63 6b 20 75 73 69 6e 67 20 74 68 65 20 73  back using the s
22a70 63 72 69 70 74 20 64 65 62 75 67 67 65 72 0d 0a  cript debugger..
22a80 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
22a90 74 68 61 74 20 77 69 6c 6c 20 63 61 6e 63 65 6c  that will cancel
22aa0 20 61 6c 6c 20 53 51 4c 20 71 75 65 72 69 65 73   all SQL queries
22ab0 20 69 6e 20 70 72 6f 67 72 65 73 73 20 66 6f 72   in progress for
22ac0 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0d 0a 20   all database.. 
22ad0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
22ae0 6f 6e 6e 65 63 74 69 6f 6e 73 20 6b 6e 6f 77 6e  onnections known
22af0 20 74 6f 20 74 68 69 73 20 69 6e 74 65 72 70 72   to this interpr
22b00 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 23  eter...        #
22b10 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
22b20 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
22b30 28 73 71 6c 69 74 65 49 6e 74 65 72 72 75 70 74  (sqliteInterrupt
22b40 43 61 6c 6c 62 61 63 6b 29 5d 7d 20 74 68 65 6e  Callback)]} then
22b50 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
22b60 74 75 70 44 62 49 6e 74 65 72 72 75 70 74 43 61  tupDbInterruptCa
22b70 6c 6c 62 61 63 6b 20 24 3a 3a 74 65 73 74 5f 63  llback $::test_c
22b80 68 61 6e 6e 65 6c 20 24 3a 3a 74 65 73 74 5f 6c  hannel $::test_l
22b90 6f 67 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  og..        }...
22ba0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
22bb0 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
22bc0 6b 20 66 6f 72 20 74 68 65 20 6e 61 74 69 76 65  k for the native
22bd0 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 2c   runtime option,
22be0 20 77 68 69 63 68 20 77 6f 75 6c 64 20 6d 65 61   which would mea
22bf0 6e 20 77 65 20 61 72 65 0d 0a 20 20 20 20 20 20  n we are..      
22c00 20 20 23 20 20 20 20 20 20 20 75 73 69 6e 67 20    #       using 
22c10 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61  the mixed-mode a
22c20 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20  ssembly...      
22c30 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65    #..        che
22c40 63 6b 46 6f 72 52 75 6e 74 69 6d 65 4f 70 74 69  ckForRuntimeOpti
22c50 6f 6e 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  on $::test_chann
22c60 65 6c 20 6e 61 74 69 76 65 0d 0a 0d 0a 20 20 20  el native....   
22c70 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
22c80 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66  # NOTE: Check if
22c90 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20   the test suite 
22ca0 73 68 6f 75 6c 64 20 63 6f 75 6e 74 20 74 68 65  should count the
22cb0 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 6e 65   number of conne
22cc0 63 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20  ctions..        
22cd0 23 20 20 20 20 20 20 20 22 6f 70 65 6e 65 64 22  #       "opened"
22ce0 20 61 6e 64 20 22 63 6c 6f 73 65 64 22 20 66 72   and "closed" fr
22cf0 6f 6d 20 74 68 65 20 70 6f 6f 6c 20 77 68 65 6e  om the pool when
22d00 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 69 66 20   determining if 
22d10 61 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20  a test..        
22d20 23 20 20 20 20 20 20 20 70 61 73 73 65 64 2e 20  #       passed. 
22d30 20 44 69 73 61 62 6c 69 6e 67 20 74 68 69 73 20   Disabling this 
22d40 62 65 68 61 76 69 6f 72 20 69 73 20 73 6f 6d 65  behavior is some
22d50 74 69 6d 65 73 20 6e 65 63 65 73 73 61 72 79 20  times necessary 
22d60 28 65 2e 67 2e 0d 0a 20 20 20 20 20 20 20 20 23  (e.g...        #
22d70 20 20 20 20 20 20 20 64 75 72 69 6e 67 20 74 68         during th
22d80 65 20 72 65 6c 65 61 73 65 20 74 65 73 74 69 6e  e release testin
22d90 67 20 70 72 6f 63 65 73 73 29 20 62 65 63 61 75  g process) becau
22da0 73 65 20 74 68 65 72 65 20 61 72 65 20 73 65 76  se there are sev
22db0 65 72 61 6c 0d 0a 20 20 20 20 20 20 20 20 23 20  eral..        # 
22dc0 20 20 20 20 20 20 74 65 73 74 73 20 74 68 61 74        tests that
22dd0 20 72 65 6c 79 20 6f 6e 20 74 68 65 20 22 6f 70   rely on the "op
22de0 65 6e 65 64 20 66 72 6f 6d 20 70 6f 6f 6c 22 20  ened from pool" 
22df0 63 6f 75 6e 74 20 62 65 69 6e 67 20 67 72 65 61  count being grea
22e00 74 65 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ter..        #  
22e10 20 20 20 20 20 74 68 61 6e 20 7a 65 72 6f 2e 20       than zero. 
22e20 20 54 68 65 73 65 20 74 65 73 74 73 20 6d 61 79   These tests may
22e30 20 66 61 69 6c 20 64 75 65 20 74 6f 20 74 68 65   fail due to the
22e40 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74   non-determinist
22e50 69 63 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ic..        #   
22e60 20 20 20 20 62 65 68 61 76 69 6f 72 20 6f 66 20      behavior of 
22e70 74 68 65 20 43 4c 52 20 47 43 2c 20 65 76 65 6e  the CLR GC, even
22e80 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   when there is n
22e90 6f 20 62 75 67 20 69 6e 20 74 68 65 20 63 6f 64  o bug in the cod
22ea0 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
22eb0 20 20 20 62 65 69 6e 67 20 74 65 73 74 65 64 2e     being tested.
22ec0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
22ed0 20 20 20 20 20 63 68 65 63 6b 46 6f 72 52 75 6e       checkForRun
22ee0 74 69 6d 65 4f 70 74 69 6f 6e 20 24 3a 3a 74 65  timeOption $::te
22ef0 73 74 5f 63 68 61 6e 6e 65 6c 20 6e 6f 50 6f 6f  st_channel noPoo
22f00 6c 43 6f 75 6e 74 73 0d 0a 0d 0a 20 20 20 20 20  lCounts....     
22f10 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
22f20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74  NOTE: Check if t
22f30 68 65 20 74 65 73 74 20 73 75 69 74 65 20 73 68  he test suite sh
22f40 6f 75 6c 64 20 75 73 65 20 73 68 61 72 65 64 2d  ould use shared-
22f50 63 61 63 68 65 20 6d 6f 64 65 2e 0d 0a 20 20 20  cache mode...   
22f60 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
22f70 63 68 65 63 6b 46 6f 72 52 75 6e 74 69 6d 65 4f  checkForRuntimeO
22f80 70 74 69 6f 6e 20 24 3a 3a 74 65 73 74 5f 63 68  ption $::test_ch
22f90 61 6e 6e 65 6c 20 73 68 61 72 65 64 43 61 63 68  annel sharedCach
22fa0 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e....        #..
22fb0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
22fc0 52 65 70 6f 72 74 20 74 68 65 20 72 65 73 6f 75  Report the resou
22fd0 72 63 65 20 75 73 61 67 65 20 70 72 69 6f 72 20  rce usage prior 
22fe0 74 6f 20 72 75 6e 6e 69 6e 67 20 61 6e 79 20 74  to running any t
22ff0 65 73 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 23  ests...        #
23000 0d 0a 20 20 20 20 20 20 20 20 72 65 70 6f 72 74  ..        report
23010 53 51 4c 69 74 65 52 65 73 6f 75 72 63 65 73 20  SQLiteResources 
23020 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d  $::test_channel.
23030 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
23040 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 47 72        # NOTE: Gr
23050 61 62 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6e  ab the list of n
23060 61 74 69 76 65 20 6d 6f 64 75 6c 65 73 20 66 6f  ative modules fo
23070 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72  r the current pr
23080 6f 63 65 73 73 20 61 6e 64 0d 0a 20 20 20 20 20  ocess and..     
23090 20 20 20 23 20 20 20 20 20 20 20 72 65 70 6f 72     #       repor
230a0 74 20 6f 6e 20 74 68 65 20 53 79 73 74 65 6d 2e  t on the System.
230b0 44 61 74 61 2e 53 51 4c 69 74 65 20 72 65 6c 61  Data.SQLite rela
230c0 74 65 64 20 6f 6e 65 73 2e 0d 0a 20 20 20 20 20  ted ones...     
230d0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
230e0 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a   {[haveSQLiteObj
230f0 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65  ectCommand]} the
23100 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
23110 65 74 20 6d 6f 64 75 6c 65 73 20 5b 6f 62 6a 65  et modules [obje
23120 63 74 20 69 6e 76 6f 6b 65 20 5c 0d 0a 20 20 20  ct invoke \..   
23130 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
23140 6d 2e 44 69 61 67 6e 6f 73 74 69 63 73 2e 50 72  m.Diagnostics.Pr
23150 6f 63 65 73 73 2e 47 65 74 43 75 72 72 65 6e 74  ocess.GetCurrent
23160 50 72 6f 63 65 73 73 20 4d 6f 64 75 6c 65 73 5d  Process Modules]
23170 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62  ....          ob
23180 6a 65 63 74 20 66 6f 72 65 61 63 68 20 2d 61 6c  ject foreach -al
23190 69 61 73 20 6d 6f 64 75 6c 65 20 24 6d 6f 64 75  ias module $modu
231a0 6c 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  les {..         
231b0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
231c0 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6d 6f    # NOTE: The mo
231d0 64 75 6c 65 20 66 69 6c 65 20 6e 61 6d 65 20 68  dule file name h
231e0 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 72 6d  ere must be norm
231f0 61 6c 69 7a 65 64 2e 0d 0a 20 20 20 20 20 20 20  alized...       
23200 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
23210 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65      set fileName
23220 20 5b 66 69 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65   [file normalize
23230 20 5b 24 6d 6f 64 75 6c 65 20 46 69 6c 65 4e 61   [$module FileNa
23240 6d 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  me]]....        
23250 20 20 20 20 69 66 20 7b 5b 6c 73 65 61 72 63 68      if {[lsearch
23260 20 2d 65 78 61 63 74 20 2d 6e 6f 63 61 73 65 20   -exact -nocase 
23270 2d 2d 20 5b 67 65 74 4e 61 74 69 76 65 4c 69 62  -- [getNativeLib
23280 72 61 72 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c  raryFileNamesOnl
23290 79 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  y] \..          
232a0 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c        [file tail
232b0 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 20 21 3d 20   $fileName]] != 
232c0 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  -1} then {..    
232d0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
232e0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
232f0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
23300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23310 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c 6f 61   "---- found loa
23320 64 65 64 20 53 51 4c 69 74 65 20 6e 61 74 69 76  ded SQLite nativ
23330 65 20 6c 69 62 72 61 72 79 20 6d 6f 64 75 6c 65  e library module
23340 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  : " \..         
23350 20 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61           $fileNa
23360 6d 65 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  me \n]..        
23370 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 73      } elseif {[s
23380 74 72 69 6e 67 20 6d 61 74 63 68 20 5c 0d 0a 20  tring match \.. 
23390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
233a0 6e 6f 63 61 73 65 20 2a 2f 53 51 4c 69 74 65 2e  nocase */SQLite.
233b0 49 6e 74 65 72 6f 70 2e 64 6c 6c 20 24 66 69 6c  Interop.dll $fil
233c0 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
233d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
233e0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
233f0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
23400 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
23410 20 20 20 20 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64       "---- found
23420 20 6c 6f 61 64 65 64 20 53 51 4c 69 74 65 20 69   loaded SQLite i
23430 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20  nterop assembly 
23440 6d 6f 64 75 6c 65 3a 20 22 20 5c 0d 0a 20 20 20  module: " \..   
23450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
23460 66 69 6c 65 4e 61 6d 65 20 5c 6e 5d 0d 0a 20 20  fileName \n]..  
23470 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
23480 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
23490 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63    }....        c
234a0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
234b0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
234c0 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20  channel \..     
234d0 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
234e0 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69  ompile-time opti
234f0 6f 6e 73 20 66 6f 72 20 53 51 4c 69 74 65 20 63  ons for SQLite c
23500 6f 72 65 20 6c 69 62 72 61 72 79 2e 2e 2e 20 22  ore library... "
23510 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
23520 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
23530 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
23540 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
23550 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
23560 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
23570 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51  m.Data.SQLite.SQ
23580 4c 69 74 65 33 20 53 51 4c 69 74 65 43 6f 6d 70  Lite3 SQLiteComp
23590 69 6c 65 4f 70 74 69 6f 6e 73 0d 0a 20 20 20 20  ileOptions..    
235a0 20 20 20 20 20 20 7d 20 63 6f 6d 70 69 6c 65 4f        } compileO
235b0 70 74 69 6f 6e 73 5d 20 3d 3d 20 30 7d 20 74 68  ptions] == 0} th
235c0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
235d0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
235e0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
235f0 72 67 73 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20  rgs [formatList 
23600 5b 6c 73 6f 72 74 20 5c 0d 0a 20 20 20 20 20 20  [lsort \..      
23610 20 20 20 20 20 20 20 20 20 20 24 63 6f 6d 70 69            $compi
23620 6c 65 4f 70 74 69 6f 6e 73 5d 20 3c 6e 6f 6e 65  leOptions] <none
23630 3e 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  >] \n]..        
23640 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
23650 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
23660 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e  :test_channel un
23670 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20  known\n..       
23680 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
23690 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68  ...        catch
236a0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
236b0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
236c0 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  nel \..         
236d0 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 6d 70 69       "---- compi
236e0 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20  le-time options 
236f0 66 6f 72 20 53 51 4c 69 74 65 20 69 6e 74 65 72  for SQLite inter
23700 6f 70 20 61 73 73 65 6d 62 6c 79 2e 2e 2e 20 22  op assembly... "
23710 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
23720 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
23730 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
23740 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
23750 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
23760 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
23770 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51  m.Data.SQLite.SQ
23780 4c 69 74 65 33 20 49 6e 74 65 72 6f 70 43 6f 6d  Lite3 InteropCom
23790 70 69 6c 65 4f 70 74 69 6f 6e 73 0d 0a 20 20 20  pileOptions..   
237a0 20 20 20 20 20 20 20 7d 20 63 6f 6d 70 69 6c 65         } compile
237b0 4f 70 74 69 6f 6e 73 5d 20 3d 3d 20 30 7d 20 74  Options] == 0} t
237c0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
237d0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
237e0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
237f0 41 72 67 73 20 5b 66 6f 72 6d 61 74 4c 69 73 74  Args [formatList
23800 20 5b 6c 73 6f 72 74 20 5c 0d 0a 20 20 20 20 20   [lsort \..     
23810 20 20 20 20 20 20 20 20 20 20 20 24 63 6f 6d 70             $comp
23820 69 6c 65 4f 70 74 69 6f 6e 73 5d 20 3c 6e 6f 6e  ileOptions] <non
23830 65 3e 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  e>] \n]..       
23840 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
23850 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
23860 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75  ::test_channel u
23870 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20  nknown\n..      
23880 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
23890 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
238a0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
238b0 68 6f 77 20 74 68 65 20 61 63 74 69 76 65 20 74  how the active t
238c0 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  est constraints.
238d0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
238e0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
238f0 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
23900 6e 64 41 72 67 73 20 22 2d 2d 2d 2d 20 63 6f 6e  ndArgs "---- con
23910 73 74 72 61 69 6e 74 73 3a 20 22 20 5c 0d 0a 20  straints: " \.. 
23920 20 20 20 20 20 20 20 20 20 20 20 5b 66 6f 72 6d             [form
23930 61 74 4c 69 73 74 20 5b 6c 73 6f 72 74 20 5b 67  atList [lsort [g
23940 65 74 43 6f 6e 73 74 72 61 69 6e 74 73 5d 5d 20  etConstraints]] 
23950 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a 0d 0a 20  <none>] \n].... 
23960 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
23970 20 20 23 20 4e 4f 54 45 3a 20 53 61 76 65 20 74    # NOTE: Save t
23980 68 65 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69  he test constrai
23990 6e 74 73 20 66 6f 72 20 75 73 65 20 62 79 20 74  nts for use by t
239a0 68 72 65 61 64 73 20 63 72 65 61 74 65 64 20 69  hreads created i
239b0 6e 20 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20  n this..        
239c0 23 20 20 20 20 20 20 20 61 70 70 6c 69 63 61 74  #       applicat
239d0 69 6f 6e 20 64 6f 6d 61 69 6e 2e 20 20 54 68 69  ion domain.  Thi
239e0 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62  s is necessary b
239f0 65 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20 45  ecause all the E
23a00 61 67 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20  agle..        # 
23a10 20 20 20 20 20 20 22 74 65 73 74 20 63 6f 6e 74        "test cont
23a20 65 78 74 22 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ext" information
23a30 20 69 73 20 70 65 72 2d 74 68 72 65 61 64 2e 0d   is per-thread..
23a40 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
23a50 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
23a60 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 63 6f 6e  xists ::test_con
23a70 73 74 72 61 69 6e 74 73 5d 7d 20 74 68 65 6e 20  straints]} then 
23a80 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
23a90 20 3a 3a 74 65 73 74 5f 63 6f 6e 73 74 72 61 69   ::test_constrai
23aa0 6e 74 73 20 24 3a 3a 65 61 67 6c 65 5f 74 65 73  nts $::eagle_tes
23ab0 74 73 28 63 6f 6e 73 74 72 61 69 6e 74 73 29 0d  ts(constraints).
23ac0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
23ad0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
23ae0 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 74 68   # NOTE: Load th
23af0 65 20 22 61 66 74 65 72 2d 63 6f 6e 73 74 72 61  e "after-constra
23b00 69 6e 74 73 22 20 63 75 73 74 6f 6d 20 70 65 72  ints" custom per
23b10 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20 70 65 72  -user and/or per
23b20 2d 68 6f 73 74 0d 0a 20 20 20 20 20 20 20 20 23  -host..        #
23b30 20 20 20 20 20 20 20 74 65 73 74 20 73 65 74 74         test sett
23b40 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  ings now...     
23b50 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 75 70     #..        up
23b60 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 6c 6f  level 1 [list lo
23b70 61 64 53 51 4c 69 74 65 54 65 73 74 53 65 74 74  adSQLiteTestSett
23b80 69 6e 67 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  ings $::test_cha
23b90 6e 6e 65 6c 20 2e 61 66 74 65 72 5d 0d 0a 0d 0a  nnel .after]....
23ba0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
23bb0 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6e 65     # NOTE: If ne
23bc0 63 65 73 73 61 72 79 2c 20 65 6e 61 62 6c 65 20  cessary, enable 
23bd0 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64  shared-cache mod
23be0 65 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20  e now...        
23bf0 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  #..        if {[
23c00 68 61 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  hasRuntimeOption
23c10 20 73 68 61 72 65 64 43 61 63 68 65 5d 7d 20 74   sharedCache]} t
23c20 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
23c30 20 65 6e 61 62 6c 65 53 68 61 72 65 64 43 61 63   enableSharedCac
23c40 68 65 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  he $::test_chann
23c50 65 6c 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20  el true..       
23c60 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
23c70 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
23c80 20 53 68 6f 77 20 77 68 65 6e 20 6f 75 72 20 74   Show when our t
23c90 65 73 74 73 20 61 63 74 75 61 6c 6c 79 20 62 65  ests actually be
23ca0 67 61 6e 20 28 6e 6f 77 29 2e 0d 0a 20 20 20 20  gan (now)...    
23cb0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74      #..        t
23cc0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
23cd0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
23ce0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
23cf0 22 2d 2d 2d 2d 20 53 79 73 74 65 6d 2e 44 61 74  "---- System.Dat
23d00 61 2e 53 51 4c 69 74 65 20 74 65 73 74 73 20 62  a.SQLite tests b
23d10 65 67 61 6e 20 61 74 20 22 20 5c 0d 0a 20 20 20  egan at " \..   
23d20 20 20 20 20 20 20 20 20 20 5b 63 6c 6f 63 6b 20           [clock 
23d30 66 6f 72 6d 61 74 20 5b 63 6c 6f 63 6b 20 73 65  format [clock se
23d40 63 6f 6e 64 73 5d 5d 20 5c 6e 5d 0d 0a 20 20 20  conds]] \n]..   
23d50 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
23d60 20 20 20 20 70 72 6f 63 20 72 75 6e 53 51 4c 69      proc runSQLi
23d70 74 65 54 65 73 74 46 69 6c 65 73 50 72 6f 6c 6f  teTestFilesProlo
23d80 67 75 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  gue {} {..      
23d90 75 70 6c 65 76 65 6c 20 31 20 7b 0d 0a 20 20 20  uplevel 1 {..   
23da0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
23db0 23 20 4e 4f 54 45 3a 20 53 65 74 75 70 20 74 68  # NOTE: Setup th
23dc0 65 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74  e variables that
23dd0 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 76 61   refer to the va
23de0 72 69 6f 75 73 20 6e 6f 6e 2d 64 61 74 61 20 66  rious non-data f
23df0 69 6c 65 73 0d 0a 20 20 20 20 20 20 20 20 23 20  iles..        # 
23e00 20 20 20 20 20 20 72 65 71 75 69 72 65 64 20 62        required b
23e10 79 20 74 68 65 20 74 65 73 74 73 20 69 6e 20 74  y the tests in t
23e20 68 69 73 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20  his file...     
23e30 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65     #..        se
23e40 74 20 65 6e 74 69 74 79 46 72 61 6d 65 77 6f 72  t entityFramewor
23e50 6b 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20  kDllFile \..    
23e60 20 20 20 20 20 20 20 20 5b 67 65 74 42 75 69 6c          [getBuil
23e70 64 46 69 6c 65 4e 61 6d 65 20 45 6e 74 69 74 79  dFileName Entity
23e80 46 72 61 6d 65 77 6f 72 6b 2e 64 6c 6c 5d 0d 0a  Framework.dll]..
23e90 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 69 6e  ..        set in
23ea0 73 74 61 6c 6c 65 72 45 78 65 46 69 6c 65 20 5b  stallerExeFile [
23eb0 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65  getBuildFileName
23ec0 20 49 6e 73 74 61 6c 6c 65 72 2e 65 78 65 5d 0d   Installer.exe].
23ed0 0a 20 20 20 20 20 20 20 20 73 65 74 20 73 71 6c  .        set sql
23ee0 69 74 65 44 65 73 69 67 6e 65 72 44 6c 6c 46 69  iteDesignerDllFi
23ef0 6c 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65  le [getBuildFile
23f00 4e 61 6d 65 20 53 51 4c 69 74 65 2e 44 65 73 69  Name SQLite.Desi
23f10 67 6e 65 72 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20  gner.dll]....   
23f20 20 20 20 20 20 73 65 74 20 73 79 73 74 65 6d 44       set systemD
23f30 61 74 61 53 51 4c 69 74 65 44 6c 6c 46 69 6c 65  ataSQLiteDllFile
23f40 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
23f50 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d  [getBuildFileNam
23f60 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  e System.Data.SQ
23f70 4c 69 74 65 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20  Lite.dll]....   
23f80 20 20 20 20 20 73 65 74 20 73 79 73 74 65 6d 44       set systemD
23f90 61 74 61 53 51 4c 69 74 65 4c 69 6e 71 44 6c 6c  ataSQLiteLinqDll
23fa0 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  File \..        
23fb0 20 20 20 20 5b 67 65 74 42 75 69 6c 64 46 69 6c      [getBuildFil
23fc0 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74  eName System.Dat
23fd0 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c  a.SQLite.Linq.dl
23fe0 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65  l]....        se
23ff0 74 20 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69  t systemDataSQLi
24000 74 65 45 66 36 44 6c 6c 46 69 6c 65 20 5c 0d 0a  teEf6DllFile \..
24010 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
24020 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 53 79  BuildFileName Sy
24030 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
24040 2e 45 46 36 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20  .EF6.dll]....   
24050 20 20 20 20 20 73 65 74 20 74 65 73 74 45 78 65       set testExe
24060 46 69 6c 65 20 5b 67 65 74 42 75 69 6c 64 46 69  File [getBuildFi
24070 6c 65 4e 61 6d 65 20 74 65 73 74 2e 65 78 65 5d  leName test.exe]
24080 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 65  ..        set te
24090 73 74 4c 69 6e 71 45 78 65 46 69 6c 65 20 5b 67  stLinqExeFile [g
240a0 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20  etBuildFileName 
240b0 74 65 73 74 6c 69 6e 71 2e 65 78 65 5d 0d 0a 20  testlinq.exe].. 
240c0 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74 45         set testE
240d0 66 36 45 78 65 46 69 6c 65 20 5b 67 65 74 42 75  f6ExeFile [getBu
240e0 69 6c 64 46 69 6c 65 4e 61 6d 65 20 74 65 73 74  ildFileName test
240f0 65 66 36 2e 65 78 65 5d 0d 0a 0d 0a 20 20 20 20  ef6.exe]....    
24100 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
24110 20 4e 4f 54 45 3a 20 53 65 74 75 70 20 74 68 65   NOTE: Setup the
24120 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20   variables that 
24130 72 65 66 65 72 20 74 6f 20 74 68 65 20 76 61 72  refer to the var
24140 69 6f 75 73 20 64 61 74 61 20 66 69 6c 65 73 0d  ious data files.
24150 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
24160 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
24170 20 74 65 73 74 73 20 69 6e 20 74 68 69 73 20 66   tests in this f
24180 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ile...        #.
24190 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73  .        set tes
241a0 74 4c 69 6e 71 4f 75 74 46 69 6c 65 20 5b 66 69  tLinqOutFile [fi
241b0 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
241c0 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20  ile join \..    
241d0 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69          [getSQLi
241e0 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20  teTestDataPath] 
241f0 74 65 73 74 6c 69 6e 71 2e 6f 75 74 5d 5d 0d 0a  testlinq.out]]..
24200 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 6f  ..        set no
24210 72 74 68 77 69 6e 64 45 66 44 62 46 69 6c 65 20  rthwindEfDbFile 
24220 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
24230 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20   [file join \.. 
24240 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
24250 20 64 69 72 6e 61 6d 65 20 5b 66 69 6c 65 20 64   dirname [file d
24260 69 72 6e 61 6d 65 20 5b 67 65 74 53 51 4c 69 74  irname [getSQLit
24270 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 5d 5d  eTestDataPath]]]
24280 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
24290 74 65 73 74 6c 69 6e 71 20 6e 6f 72 74 68 77 69  testlinq northwi
242a0 6e 64 45 46 2e 64 62 5d 5d 0d 0a 0d 0a 20 20 20  ndEF.db]]....   
242b0 20 20 20 20 20 73 65 74 20 6e 6f 6e 57 61 6c 44       set nonWalD
242c0 62 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69  bFile [file nati
242d0 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  vename [file joi
242e0 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
242f0 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44   [getSQLiteTestD
24300 61 74 61 50 61 74 68 5d 20 6e 6f 6e 57 61 6c 2e  ataPath] nonWal.
24310 64 62 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  db]]....        
24320 73 65 74 20 77 61 6c 44 62 46 69 6c 65 20 5b 66  set walDbFile [f
24330 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b  ile nativename [
24340 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20  file join \..   
24350 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c           [getSQL
24360 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d  iteTestDataPath]
24370 20 77 61 6c 2e 64 62 5d 5d 0d 0a 0d 0a 20 20 20   wal.db]]....   
24380 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
24390 23 20 4e 4f 54 45 3a 20 54 68 65 20 76 61 72 69  # NOTE: The vari
243a0 6f 75 73 20 69 6e 73 74 61 6c 6c 2f 75 6e 69 6e  ous install/unin
243b0 73 74 61 6c 6c 20 6c 6f 67 20 66 69 6c 65 73 20  stall log files 
243c0 75 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 65  used to test the
243d0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
243e0 20 20 64 65 73 69 67 6e 2d 74 69 6d 65 20 63 6f    design-time co
243f0 6d 70 6f 6e 65 6e 74 20 69 6e 73 74 61 6c 6c 65  mponent installe
24400 72 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  r...        #.. 
24410 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74 49         set testI
24420 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46  nstallVs2005LogF
24430 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ile [file native
24440 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
24450 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
24460 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74  getSQLiteTestDat
24470 61 50 61 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72  aPath] Installer
24480 5f 54 65 73 74 5f 56 73 32 30 30 35 2e 6c 6f 67  _Test_Vs2005.log
24490 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65  ]]....        se
244a0 74 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32  t testInstallVs2
244b0 30 30 38 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65  008LogFile [file
244c0 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
244d0 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20  e join \..      
244e0 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65        [getSQLite
244f0 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 49 6e  TestDataPath] In
24500 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32  staller_Test_Vs2
24510 30 30 38 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20  008.log]]....   
24520 20 20 20 20 20 73 65 74 20 74 65 73 74 49 6e 73       set testIns
24530 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c  tallVs2010LogFil
24540 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
24550 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d  me [file join \.
24560 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65  .            [ge
24570 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50  tSQLiteTestDataP
24580 61 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54  ath] Installer_T
24590 65 73 74 5f 56 73 32 30 31 30 2e 6c 6f 67 5d 5d  est_Vs2010.log]]
245a0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
245b0 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31  testInstallVs201
245c0 32 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e  2LogFile [file n
245d0 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
245e0 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  join \..        
245f0 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65      [getSQLiteTe
24600 73 74 44 61 74 61 50 61 74 68 5d 20 49 6e 73 74  stDataPath] Inst
24610 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31  aller_Test_Vs201
24620 32 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20  2.log]]....     
24630 20 20 20 73 65 74 20 74 65 73 74 49 6e 73 74 61     set testInsta
24640 6c 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 20  llVs2013LogFile 
24650 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
24660 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20   [file join \.. 
24670 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53             [getS
24680 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74  QLiteTestDataPat
24690 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54 65 73  h] Installer_Tes
246a0 74 5f 56 73 32 30 31 33 2e 6c 6f 67 5d 5d 0d 0a  t_Vs2013.log]]..
246b0 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 65  ..        set te
246c0 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c  stInstallVs2015L
246d0 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74  ogFile [file nat
246e0 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
246f0 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  in \..          
24700 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74    [getSQLiteTest
24710 44 61 74 61 50 61 74 68 5d 20 49 6e 73 74 61 6c  DataPath] Instal
24720 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31 35 2e  ler_Test_Vs2015.
24730 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  log]]....       
24740 20 73 65 74 20 74 65 73 74 55 6e 69 6e 73 74 61   set testUninsta
24750 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 20  llVs2005LogFile 
24760 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
24770 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20   [file join \.. 
24780 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53             [getS
24790 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74  QLiteTestDataPat
247a0 68 5d 20 55 6e 69 6e 73 74 61 6c 6c 65 72 5f 54  h] Uninstaller_T
247b0 65 73 74 5f 56 73 32 30 30 35 2e 6c 6f 67 5d 5d  est_Vs2005.log]]
247c0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
247d0 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
247e0 30 30 38 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65  008LogFile [file
247f0 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
24800 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20  e join \..      
24810 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65        [getSQLite
24820 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 55 6e  TestDataPath] Un
24830 69 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56  installer_Test_V
24840 73 32 30 30 38 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20  s2008.log]].... 
24850 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74 55         set testU
24860 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f  ninstallVs2010Lo
24870 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69  gFile [file nati
24880 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  vename [file joi
24890 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
248a0 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44   [getSQLiteTestD
248b0 61 74 61 50 61 74 68 5d 20 55 6e 69 6e 73 74 61  ataPath] Uninsta
248c0 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31 30  ller_Test_Vs2010
248d0 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  .log]]....      
248e0 20 20 73 65 74 20 74 65 73 74 55 6e 69 6e 73 74    set testUninst
248f0 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65  allVs2012LogFile
24900 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
24910 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a  e [file join \..
24920 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
24930 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61  SQLiteTestDataPa
24940 74 68 5d 20 55 6e 69 6e 73 74 61 6c 6c 65 72 5f  th] Uninstaller_
24950 54 65 73 74 5f 56 73 32 30 31 32 2e 6c 6f 67 5d  Test_Vs2012.log]
24960 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74  ]....        set
24970 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73   testUninstallVs
24980 32 30 31 33 4c 6f 67 46 69 6c 65 20 5b 66 69 6c  2013LogFile [fil
24990 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69  e nativename [fi
249a0 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20  le join \..     
249b0 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74         [getSQLit
249c0 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 55  eTestDataPath] U
249d0 6e 69 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f  ninstaller_Test_
249e0 56 73 32 30 31 33 2e 6c 6f 67 5d 5d 0d 0a 0d 0a  Vs2013.log]]....
249f0 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74          set test
24a00 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c  UninstallVs2015L
24a10 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74  ogFile [file nat
24a20 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
24a30 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  in \..          
24a40 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74    [getSQLiteTest
24a50 44 61 74 61 50 61 74 68 5d 20 55 6e 69 6e 73 74  DataPath] Uninst
24a60 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31  aller_Test_Vs201
24a70 35 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20  5.log]]....     
24a80 20 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23     #############
24a90 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
24aa0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
24ab0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
24ac0 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20  ##########....  
24ad0 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
24ae0 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
24af0 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
24b00 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
24b10 65 20 74 61 69 6c 20 24 65 6e 74 69 74 79 46 72  e tail $entityFr
24b20 61 6d 65 77 6f 72 6b 44 6c 6c 46 69 6c 65 5d 5d  ameworkDllFile]]
24b30 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
24b40 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
24b50 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
24b60 24 65 6e 74 69 74 79 46 72 61 6d 65 77 6f 72 6b  $entityFramework
24b70 44 6c 6c 46 69 6c 65 0d 0a 20 20 20 20 20 20 20  DllFile..       
24b80 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
24b90 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69   {![haveConstrai
24ba0 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
24bb0 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ile_ \..        
24bc0 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
24bd0 69 6e 73 74 61 6c 6c 65 72 45 78 65 46 69 6c 65  installerExeFile
24be0 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
24bf0 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
24c00 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
24c10 6c 20 24 69 6e 73 74 61 6c 6c 65 72 45 78 65 46  l $installerExeF
24c20 69 6c 65 20 49 6e 73 74 61 6c 6c 65 72 2e 65 78  ile Installer.ex
24c30 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  e..        }....
24c40 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61          if {![ha
24c50 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
24c60 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c  pendArgs file_ \
24c70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
24c80 69 6c 65 20 74 61 69 6c 20 24 73 71 6c 69 74 65  ile tail $sqlite
24c90 44 65 73 69 67 6e 65 72 44 6c 6c 46 69 6c 65 5d  DesignerDllFile]
24ca0 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
24cb0 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69        checkForFi
24cc0 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c  le $test_channel
24cd0 20 24 73 71 6c 69 74 65 44 65 73 69 67 6e 65 72   $sqliteDesigner
24ce0 44 6c 6c 46 69 6c 65 0d 0a 20 20 20 20 20 20 20  DllFile..       
24cf0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
24d00 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69   {![haveConstrai
24d10 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
24d20 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ile_ \..        
24d30 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
24d40 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65  systemDataSQLite
24d50 44 6c 6c 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  DllFile]]]} then
24d60 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   {..          ch
24d70 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74  eckForFile $test
24d80 5f 63 68 61 6e 6e 65 6c 20 24 73 79 73 74 65 6d  _channel $system
24d90 44 61 74 61 53 51 4c 69 74 65 44 6c 6c 46 69 6c  DataSQLiteDllFil
24da0 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  e..        }....
24db0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61          if {![ha
24dc0 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
24dd0 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c  pendArgs file_ \
24de0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
24df0 69 6c 65 20 74 61 69 6c 20 24 73 79 73 74 65 6d  ile tail $system
24e00 44 61 74 61 53 51 4c 69 74 65 4c 69 6e 71 44 6c  DataSQLiteLinqDl
24e10 6c 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b  lFile]]]} then {
24e20 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63  ..          chec
24e30 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63  kForFile $test_c
24e40 68 61 6e 6e 65 6c 20 24 73 79 73 74 65 6d 44 61  hannel $systemDa
24e50 74 61 53 51 4c 69 74 65 4c 69 6e 71 44 6c 6c 46  taSQLiteLinqDllF
24e60 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ile..        }..
24e70 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
24e80 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
24e90 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
24ea0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
24eb0 5b 66 69 6c 65 20 74 61 69 6c 20 24 73 79 73 74  [file tail $syst
24ec0 65 6d 44 61 74 61 53 51 4c 69 74 65 45 66 36 44  emDataSQLiteEf6D
24ed0 6c 6c 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  llFile]]]} then 
24ee0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65  {..          che
24ef0 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f  ckForFile $test_
24f00 63 68 61 6e 6e 65 6c 20 24 73 79 73 74 65 6d 44  channel $systemD
24f10 61 74 61 53 51 4c 69 74 65 45 66 36 44 6c 6c 46  ataSQLiteEf6DllF
24f20 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ile..        }..
24f30 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
24f40 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
24f50 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
24f60 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
24f70 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74  [file tail $test
24f80 45 78 65 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  ExeFile]]]} then
24f90 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   {..          ch
24fa0 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74  eckForFile $test
24fb0 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 45 78  _channel $testEx
24fc0 65 46 69 6c 65 20 74 65 73 74 2e 65 78 65 0d 0a  eFile test.exe..
24fd0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
24fe0 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43       if {![haveC
24ff0 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
25000 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20  dArgs file_ \.. 
25010 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
25020 20 74 61 69 6c 20 24 74 65 73 74 4c 69 6e 71 45   tail $testLinqE
25030 78 65 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  xeFile]]]} then 
25040 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65  {..          che
25050 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f  ckForFile $test_
25060 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 4c 69 6e  channel $testLin
25070 71 45 78 65 46 69 6c 65 20 74 65 73 74 6c 69 6e  qExeFile testlin
25080 71 2e 65 78 65 0d 0a 20 20 20 20 20 20 20 20 7d  q.exe..        }
25090 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
250a0 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
250b0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
250c0 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
250d0 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65    [file tail $te
250e0 73 74 45 66 36 45 78 65 46 69 6c 65 5d 5d 5d 7d  stEf6ExeFile]]]}
250f0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
25100 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20     checkForFile 
25110 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74  $test_channel $t
25120 65 73 74 45 66 36 45 78 65 46 69 6c 65 20 74 65  estEf6ExeFile te
25130 73 74 65 66 36 2e 65 78 65 0d 0a 20 20 20 20 20  stef6.exe..     
25140 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
25150 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
25160 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
25170 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
25180 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c        [file tail
25190 20 24 74 65 73 74 4c 69 6e 71 4f 75 74 46 69 6c   $testLinqOutFil
251a0 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e]]]} then {..  
251b0 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
251c0 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e  File $test_chann
251d0 65 6c 20 24 74 65 73 74 4c 69 6e 71 4f 75 74 46  el $testLinqOutF
251e0 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ile..        }..
251f0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
25200 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
25210 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
25220 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
25230 5b 66 69 6c 65 20 74 61 69 6c 20 24 6e 6f 72 74  [file tail $nort
25240 68 77 69 6e 64 45 66 44 62 46 69 6c 65 5d 5d 5d  hwindEfDbFile]]]
25250 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
25260 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65      checkForFile
25270 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24   $test_channel $
25280 6e 6f 72 74 68 77 69 6e 64 45 66 44 62 46 69 6c  northwindEfDbFil
25290 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  e..        }....
252a0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61          if {![ha
252b0 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
252c0 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c  pendArgs file_ \
252d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
252e0 69 6c 65 20 74 61 69 6c 20 24 6e 6f 6e 57 61 6c  ile tail $nonWal
252f0 44 62 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  DbFile]]]} then 
25300 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65  {..          che
25310 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f  ckForFile $test_
25320 63 68 61 6e 6e 65 6c 20 24 6e 6f 6e 57 61 6c 44  channel $nonWalD
25330 62 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d  bFile..        }
25340 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
25350 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
25360 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
25370 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
25380 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 77 61    [file tail $wa
25390 6c 44 62 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  lDbFile]]]} then
253a0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   {..          ch
253b0 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74  eckForFile $test
253c0 5f 63 68 61 6e 6e 65 6c 20 24 77 61 6c 44 62 46  _channel $walDbF
253d0 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ile..        }..
253e0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
253f0 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
25400 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
25410 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
25420 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74  [file tail $test
25430 49 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67  InstallVs2005Log
25440 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d  File]]]} then {.
25450 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b  .          check
25460 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
25470 61 6e 6e 65 6c 20 24 74 65 73 74 49 6e 73 74 61  annel $testInsta
25480 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 0d  llVs2005LogFile.
25490 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
254a0 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
254b0 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
254c0 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
254d0 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
254e0 65 20 74 61 69 6c 20 24 74 65 73 74 49 6e 73 74  e tail $testInst
254f0 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c 65  allVs2008LogFile
25500 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
25510 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
25520 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
25530 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73  l $testInstallVs
25540 32 30 30 38 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2008LogFile..   
25550 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
25560 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
25570 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
25580 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
25590 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
255a0 69 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56  il $testInstallV
255b0 73 32 30 31 30 4c 6f 67 46 69 6c 65 5d 5d 5d 7d  s2010LogFile]]]}
255c0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
255d0 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20     checkForFile 
255e0 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74  $test_channel $t
255f0 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 30  estInstallVs2010
25600 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20  LogFile..       
25610 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
25620 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69   {![haveConstrai
25630 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
25640 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ile_ \..        
25650 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
25660 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31  testInstallVs201
25670 32 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65  2LogFile]]]} the
25680 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  n {..          c
25690 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
256a0 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 49  t_channel $testI
256b0 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46  nstallVs2012LogF
256c0 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ile..        }..
256d0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
256e0 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
256f0 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
25700 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
25710 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74  [file tail $test
25720 49 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67  InstallVs2013Log
25730 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d  File]]]} then {.
25740 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b  .          check
25750 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
25760 61 6e 6e 65 6c 20 24 74 65 73 74 49 6e 73 74 61  annel $testInsta
25770 6c 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 0d  llVs2013LogFile.
25780 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
25790 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
257a0 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
257b0 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
257c0 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
257d0 65 20 74 61 69 6c 20 24 74 65 73 74 49 6e 73 74  e tail $testInst
257e0 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c 65  allVs2015LogFile
257f0 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
25800 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
25810 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
25820 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73  l $testInstallVs
25830 32 30 31 35 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2015LogFile..   
25840 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
25850 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
25860 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
25870 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
25880 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
25890 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c  il $testUninstal
258a0 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 5d 5d  lVs2005LogFile]]
258b0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
258c0 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
258d0 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
258e0 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
258f0 32 30 30 35 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2005LogFile..   
25900 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
25910 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
25920 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
25930 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
25940 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
25950 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c  il $testUninstal
25960 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c 65 5d 5d  lVs2008LogFile]]
25970 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
25980 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
25990 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
259a0 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
259b0 32 30 30 38 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2008LogFile..   
259c0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
259d0 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
259e0 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
259f0 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
25a00 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
25a10 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c  il $testUninstal
25a20 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65 5d 5d  lVs2010LogFile]]
25a30 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
25a40 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
25a50 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
25a60 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
25a70 32 30 31 30 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2010LogFile..   
25a80 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
25a90 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
25aa0 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
25ab0 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
25ac0 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
25ad0 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c  il $testUninstal
25ae0 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65 5d 5d  lVs2012LogFile]]
25af0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
25b00 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
25b10 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
25b20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
25b30 32 30 31 32 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2012LogFile..   
25b40 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
25b50 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
25b60 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
25b70 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
25b80 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
25b90 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c  il $testUninstal
25ba0 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 5d 5d  lVs2013LogFile]]
25bb0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
25bc0 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
25bd0 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
25be0 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
25bf0 32 30 31 33 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2013LogFile..   
25c00 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
25c10 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
25c20 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
25c30 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
25c40 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
25c50 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c  il $testUninstal
25c60 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c 65 5d 5d  lVs2015LogFile]]
25c70 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
25c80 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
25c90 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
25ca0 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
25cb0 32 30 31 35 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2015LogFile..   
25cc0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
25cd0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
25ce0 72 6f 63 20 72 75 6e 53 51 4c 69 74 65 54 65 73  roc runSQLiteTes
25cf0 74 46 69 6c 65 73 45 70 69 6c 6f 67 75 65 20 7b  tFilesEpilogue {
25d00 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 6c 65 76  } {..      uplev
25d10 65 6c 20 31 20 7b 0d 0a 20 20 20 20 20 20 20 20  el 1 {..        
25d20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69  unset -nocomplai
25d30 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
25d40 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73   testUninstallVs
25d50 32 30 31 35 4c 6f 67 46 69 6c 65 20 74 65 73 74  2015LogFile test
25d60 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c  UninstallVs2013L
25d70 6f 67 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20  ogFile \..      
25d80 20 20 20 20 20 20 74 65 73 74 55 6e 69 6e 73 74        testUninst
25d90 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65  allVs2012LogFile
25da0 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73   testUninstallVs
25db0 32 30 31 30 4c 6f 67 46 69 6c 65 20 5c 0d 0a 20  2010LogFile \.. 
25dc0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 55             testU
25dd0 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f  ninstallVs2008Lo
25de0 67 46 69 6c 65 20 74 65 73 74 55 6e 69 6e 73 74  gFile testUninst
25df0 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65  allVs2005LogFile
25e00 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
25e10 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31  testInstallVs201
25e20 35 4c 6f 67 46 69 6c 65 20 74 65 73 74 49 6e 73  5LogFile testIns
25e30 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c  tallVs2013LogFil
25e40 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
25e50 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30   testInstallVs20
25e60 31 32 4c 6f 67 46 69 6c 65 20 74 65 73 74 49 6e  12LogFile testIn
25e70 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69  stallVs2010LogFi
25e80 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  le \..          
25e90 20 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32    testInstallVs2
25ea0 30 30 38 4c 6f 67 46 69 6c 65 20 74 65 73 74 49  008LogFile testI
25eb0 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46  nstallVs2005LogF
25ec0 69 6c 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 75  ile....        u
25ed0 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e  nset -nocomplain
25ee0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
25ef0 6e 6f 72 74 68 77 69 6e 64 45 66 44 62 46 69 6c  northwindEfDbFil
25f00 65 20 74 65 73 74 4c 69 6e 71 4f 75 74 46 69 6c  e testLinqOutFil
25f10 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
25f20 20 77 61 6c 44 62 46 69 6c 65 20 6e 6f 6e 57 61   walDbFile nonWa
25f30 6c 44 62 46 69 6c 65 0d 0a 0d 0a 20 20 20 20 20  lDbFile....     
25f40 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70     unset -nocomp
25f50 6c 61 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  lain \..        
25f60 20 20 20 20 74 65 73 74 45 66 36 45 78 65 46 69      testEf6ExeFi
25f70 6c 65 20 74 65 73 74 4c 69 6e 71 45 78 65 46 69  le testLinqExeFi
25f80 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  le \..          
25f90 20 20 74 65 73 74 45 78 65 46 69 6c 65 20 73 79    testExeFile sy
25fa0 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65 45 66  stemDataSQLiteEf
25fb0 36 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20  6DllFile \..    
25fc0 20 20 20 20 20 20 20 20 73 79 73 74 65 6d 44 61          systemDa
25fd0 74 61 53 51 4c 69 74 65 4c 69 6e 71 44 6c 6c 46  taSQLiteLinqDllF
25fe0 69 6c 65 20 73 79 73 74 65 6d 44 61 74 61 53 51  ile systemDataSQ
25ff0 4c 69 74 65 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20  LiteDllFile \.. 
26000 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
26010 65 44 65 73 69 67 6e 65 72 44 6c 6c 46 69 6c 65  eDesignerDllFile
26020 20 69 6e 73 74 61 6c 6c 65 72 45 78 65 46 69 6c   installerExeFil
26030 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
26040 20 65 6e 74 69 74 79 46 72 61 6d 65 77 6f 72 6b   entityFramework
26050 44 6c 6c 46 69 6c 65 0d 0a 20 20 20 20 20 20 7d  DllFile..      }
26060 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
26070 70 72 6f 63 20 72 75 6e 53 51 4c 69 74 65 54 65  proc runSQLiteTe
26080 73 74 45 70 69 6c 6f 67 75 65 20 7b 7d 20 7b 0d  stEpilogue {} {.
26090 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
260a0 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 72 75 6e  # NOTE: Skip run
260b0 6e 69 6e 67 20 6f 75 72 20 63 75 73 74 6f 6d 20  ning our custom 
260c0 65 70 69 6c 6f 67 75 65 20 69 66 20 74 68 65 20  epilogue if the 
260d0 6d 61 69 6e 20 6f 6e 65 20 68 61 73 20 62 65 65  main one has bee
260e0 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  n..      #      
260f0 20 73 6b 69 70 70 65 64 2e 0d 0a 20 20 20 20 20   skipped...     
26100 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b   #..      if {![
26110 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
26120 28 65 70 69 6c 6f 67 75 65 2e 65 61 67 6c 65 29  (epilogue.eagle)
26130 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
26140 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
26150 4e 4f 54 45 3a 20 53 68 6f 77 20 77 68 65 6e 20  NOTE: Show when 
26160 6f 75 72 20 74 65 73 74 73 20 61 63 74 75 61 6c  our tests actual
26170 6c 79 20 65 6e 64 65 64 20 28 6e 6f 77 29 2e 0d  ly ended (now)..
26180 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
26190 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
261a0 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
261b0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
261c0 20 20 20 20 20 22 2d 2d 2d 2d 20 53 79 73 74 65       "---- Syste
261d0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 74 65  m.Data.SQLite te
261e0 73 74 73 20 65 6e 64 65 64 20 61 74 20 22 20 5c  sts ended at " \
261f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 63  ..            [c
26200 6c 6f 63 6b 20 66 6f 72 6d 61 74 20 5b 63 6c 6f  lock format [clo
26210 63 6b 20 73 65 63 6f 6e 64 73 5d 5d 20 5c 6e 5d  ck seconds]] \n]
26220 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
26230 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c         # NOTE: L
26240 6f 61 64 20 74 68 65 20 22 65 70 69 6c 6f 67 75  oad the "epilogu
26250 65 22 20 63 75 73 74 6f 6d 20 70 65 72 2d 75 73  e" custom per-us
26260 65 72 20 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f  er and/or per-ho
26270 73 74 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20  st test..       
26280 20 23 20 20 20 20 20 20 20 73 65 74 74 69 6e 67   #       setting
26290 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20  s now...        
262a0 23 0d 0a 20 20 20 20 20 20 20 20 75 70 6c 65 76  #..        uplev
262b0 65 6c 20 31 20 5b 6c 69 73 74 20 6c 6f 61 64 53  el 1 [list loadS
262c0 51 4c 69 74 65 54 65 73 74 53 65 74 74 69 6e 67  QLiteTestSetting
262d0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
262e0 6c 20 2e 65 70 69 6c 6f 67 75 65 5d 0d 0a 0d 0a  l .epilogue]....
262f0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
26300 20 20 20 23 20 42 55 47 46 49 58 3a 20 42 65 66     # BUGFIX: Bef
26310 6f 72 65 20 63 68 65 63 6b 69 6e 67 20 74 68 65  ore checking the
26320 20 66 69 6e 61 6c 20 72 65 73 6f 75 72 63 65 73   final resources
26330 20 69 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74   in use by SQLit
26340 65 2c 20 6d 61 6b 65 0d 0a 20 20 20 20 20 20 20  e, make..       
26350 20 23 20 20 20 20 20 20 20 20 20 73 75 72 65 20   #         sure 
26360 62 6f 74 68 20 6f 66 20 74 68 65 20 50 52 41 47  both of the PRAG
26370 4d 41 20 72 65 6c 61 74 65 64 20 64 69 72 65 63  MA related direc
26380 74 6f 72 79 20 6e 61 6d 65 73 20 61 72 65 20 66  tory names are f
26390 72 65 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23  reed...        #
263a0 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46  ..        checkF
263b0 6f 72 53 51 4c 69 74 65 44 69 72 65 63 74 6f 72  orSQLiteDirector
263c0 69 65 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  ies $::test_chan
263d0 6e 65 6c 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20  nel true....    
263e0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
263f0 20 4e 4f 54 45 3a 20 41 6c 73 6f 20 72 65 70 6f   NOTE: Also repo
26400 72 74 20 74 68 65 20 72 65 73 6f 75 72 63 65 20  rt the resource 
26410 75 73 61 67 65 20 61 66 74 65 72 20 72 75 6e 6e  usage after runn
26420 69 6e 67 20 74 68 65 20 74 65 73 74 73 2e 0d 0a  ing the tests...
26430 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
26440 20 20 20 72 65 70 6f 72 74 53 51 4c 69 74 65 52     reportSQLiteR
26450 65 73 6f 75 72 63 65 73 20 24 3a 3a 74 65 73 74  esources $::test
26460 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20  _channel....    
26470 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
26480 20 4e 4f 54 45 3a 20 52 65 70 6f 72 74 20 74 68   NOTE: Report th
26490 65 20 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c  e critical handl
264a0 65 20 63 6f 75 6e 74 73 20 61 66 74 65 72 20 72  e counts after r
264b0 75 6e 6e 69 6e 67 20 74 68 65 20 74 65 73 74 73  unning the tests
264c0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
264d0 20 20 20 20 20 20 67 65 74 53 51 4c 69 74 65 48        getSQLiteH
264e0 61 6e 64 6c 65 43 6f 75 6e 74 73 20 24 3a 3a 74  andleCounts $::t
264f0 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20  est_channel.... 
26500 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
26510 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6e 65 63    # NOTE: If nec
26520 65 73 73 61 72 79 2c 20 64 69 73 61 62 6c 65 20  essary, disable 
26530 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64  shared-cache mod
26540 65 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20  e now...        
26550 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  #..        if {[
26560 68 61 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  hasRuntimeOption
26570 20 73 68 61 72 65 64 43 61 63 68 65 5d 7d 20 74   sharedCache]} t
26580 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
26590 20 65 6e 61 62 6c 65 53 68 61 72 65 64 43 61 63   enableSharedCac
265a0 68 65 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  he $::test_chann
265b0 65 6c 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20  el false..      
265c0 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
265d0 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 23 23 23 23    }.....    ####
265e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
265f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
26600 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
26610 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
26620 23 23 23 23 23 23 23 0d 0a 20 20 20 20 23 23 23  #######..    ###
26630 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
26640 23 23 23 23 23 23 23 23 23 23 20 45 4e 44 20 45  ########## END E
26650 61 67 6c 65 20 4f 4e 4c 59 20 23 23 23 23 23 23  agle ONLY ######
26660 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
26670 23 23 23 23 23 23 23 23 0d 0a 20 20 20 20 23 23  ########..    ##
26680 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
26690 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
266a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
266b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
266c0 23 23 23 23 23 23 23 23 23 0d 0a 20 20 7d 0d 0a  #########..  }..
266d0 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a  ..  #..  # NOTE:
266e0 20 53 61 76 65 20 74 68 65 20 6e 61 6d 65 20 6f   Save the name o
266f0 66 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  f the directory 
26700 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20  containing this 
26710 66 69 6c 65 2e 0d 0a 20 20 23 0d 0a 20 20 69 66  file...  #..  if
26720 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
26730 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79  common_directory
26740 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 73  ]} then {..    s
26750 65 74 20 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74  et common_direct
26760 6f 72 79 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  ory [file dirnam
26770 65 20 5b 69 6e 66 6f 20 73 63 72 69 70 74 5d 5d  e [info script]]
26780 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 0d 0a 20 20  ..  }....  #..  
26790 23 20 4e 4f 54 45 3a 20 50 72 6f 76 69 64 65 20  # NOTE: Provide 
267a0 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  the System.Data.
267b0 53 51 4c 69 74 65 20 74 65 73 74 20 70 61 63 6b  SQLite test pack
267c0 61 67 65 20 74 6f 20 74 68 65 20 69 6e 74 65 72  age to the inter
267d0 70 72 65 74 65 72 2e 0d 0a 20 20 23 0d 0a 20 20  preter...  #..  
267e0 70 61 63 6b 61 67 65 20 70 72 6f 76 69 64 65 20  package provide 
267f0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
26800 74 65 2e 54 65 73 74 20 31 2e 30 0d 0a 7d 0d 0a  te.Test 1.0..}..