System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 5916ec7066e46ae4923012b23734dc63530356c6:


0000: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0010: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0020: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0030: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0040: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
0050: 0a 23 0d 0a 23 20 63 6f 6d 6d 6f 6e 2e 65 61 67  .#..# common.eag
0060: 6c 65 20 2d 2d 0d 0a 23 0d 0a 23 20 57 72 69 74  le --..#..# Writ
0070: 74 65 6e 20 62 79 20 4a 6f 65 20 4d 69 73 74 61  ten by Joe Mista
0080: 63 68 6b 69 6e 2e 0d 0a 23 20 52 65 6c 65 61 73  chkin...# Releas
0090: 65 64 20 74 6f 20 74 68 65 20 70 75 62 6c 69 63  ed to the public
00a0: 20 64 6f 6d 61 69 6e 2c 20 75 73 65 20 61 74 20   domain, use at 
00b0: 79 6f 75 72 20 6f 77 6e 20 72 69 73 6b 21 0d 0a  your own risk!..
00c0: 23 0d 0a 23 23 23 23 23 23 23 23 23 23 23 23 23  #..#############
00d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
00e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
00f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0100: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0110: 23 23 0d 0a 0d 0a 23 0d 0a 23 20 4e 4f 54 45 3a  ##....#..# NOTE:
0120: 20 55 73 65 20 6f 75 72 20 6f 77 6e 20 6e 61 6d   Use our own nam
0130: 65 73 70 61 63 65 20 68 65 72 65 20 62 65 63 61  espace here beca
0140: 75 73 65 20 65 76 65 6e 20 74 68 6f 75 67 68 20  use even though 
0150: 77 65 20 64 6f 20 6e 6f 74 20 64 69 72 65 63 74  we do not direct
0160: 6c 79 0d 0a 23 20 20 20 20 20 20 20 73 75 70 70  ly..#       supp
0170: 6f 72 74 20 6e 61 6d 65 73 70 61 63 65 73 20 6f  ort namespaces o
0180: 75 72 73 65 6c 76 65 73 2c 20 77 65 20 64 6f 20  urselves, we do 
0190: 6e 6f 74 20 77 61 6e 74 20 74 6f 20 70 6f 6c 6c  not want to poll
01a0: 75 74 65 20 74 68 65 20 67 6c 6f 62 61 6c 0d 0a  ute the global..
01b0: 23 20 20 20 20 20 20 20 6e 61 6d 65 73 70 61 63  #       namespac
01c0: 65 20 69 66 20 74 68 69 73 20 73 63 72 69 70 74  e if this script
01d0: 20 61 63 74 75 61 6c 6c 79 20 65 6e 64 73 20 75   actually ends u
01e0: 70 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65  p being evaluate
01f0: 64 20 69 6e 20 54 63 6c 2e 0d 0a 23 0d 0a 6e 61  d in Tcl...#..na
0200: 6d 65 73 70 61 63 65 20 65 76 61 6c 20 3a 3a 45  mespace eval ::E
0210: 61 67 6c 65 20 7b 0d 0a 20 20 69 66 20 7b 5b 69  agle {..  if {[i
0220: 73 45 61 67 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d  sEagle]} then {.
0230: 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23  .    ###########
0240: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0250: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0260: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0270: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0280: 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23  ..    ##########
0290: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02a0: 23 23 20 42 45 47 49 4e 20 45 61 67 6c 65 20 4f  ## BEGIN Eagle O
02b0: 4e 4c 59 20 23 23 23 23 23 23 23 23 23 23 23 23  NLY ############
02c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02d0: 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23  #..    #########
02e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0300: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0310: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0320: 23 23 0d 0a 0d 0a 20 20 20 20 70 72 6f 63 20 67  ##....    proc g
0330: 65 74 42 75 69 6c 64 59 65 61 72 20 7b 7d 20 7b  etBuildYear {} {
0340: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
0350: 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66 20   # NOTE: See if 
0360: 74 68 65 20 22 79 65 61 72 22 20 73 65 74 74 69  the "year" setti
0370: 6e 67 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  ng has been over
0380: 72 69 64 64 65 6e 20 62 79 20 74 68 65 20 75 73  ridden by the us
0390: 65 72 20 28 65 2e 67 2e 0d 0a 20 20 20 20 20 20  er (e.g...      
03a0: 23 20 20 20 20 20 20 20 6f 6e 20 74 68 65 20 63  #       on the c
03b0: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 20 20 54  ommand line).  T
03c0: 68 69 73 20 68 65 6c 70 73 20 63 6f 6e 74 72 6f  his helps contro
03d0: 6c 20 65 78 61 63 74 6c 79 20 77 68 69 63 68 20  l exactly which 
03e0: 73 65 74 20 6f 66 0d 0a 20 20 20 20 20 20 23 20  set of..      # 
03f0: 20 20 20 20 20 20 62 69 6e 61 72 69 65 73 20 77        binaries w
0400: 65 20 61 72 65 20 74 65 73 74 69 6e 67 2c 20 74  e are testing, t
0410: 68 6f 73 65 20 70 72 6f 64 75 63 65 64 20 75 73  hose produced us
0420: 69 6e 67 20 74 68 65 20 56 69 73 75 61 6c 20 53  ing the Visual S
0430: 74 75 64 69 6f 0d 0a 20 20 20 20 20 20 23 20 20  tudio..      #  
0440: 20 20 20 20 20 32 30 30 35 2c 20 32 30 30 38 2c       2005, 2008,
0450: 20 32 30 31 30 2c 20 32 30 31 32 2c 20 32 30 31   2010, 2012, 201
0460: 33 2c 20 6f 72 20 32 30 31 35 20 62 75 69 6c 64  3, or 2015 build
0470: 20 73 79 73 74 65 6d 73 2e 20 20 54 6f 20 6f 76   systems.  To ov
0480: 65 72 72 69 64 65 0d 0a 20 20 20 20 20 20 23 20  erride..      # 
0490: 20 20 20 20 20 20 74 68 69 73 20 76 61 6c 75 65        this value
04a0: 20 76 69 61 20 74 68 65 20 63 6f 6d 6d 61 6e 64   via the command
04b0: 20 6c 69 6e 65 2c 20 65 6e 74 65 72 20 61 20 63   line, enter a c
04c0: 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c 61 72 20 74  ommand similar t
04d0: 6f 20 6f 6e 65 0d 0a 20 20 20 20 20 20 23 20 20  o one..      #  
04e0: 20 20 20 20 20 6f 66 20 74 68 65 20 66 6f 6c 6c       of the foll
04f0: 6f 77 69 6e 67 20 28 61 6c 6c 20 6f 6e 20 6f 6e  owing (all on on
0500: 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20 20 20 20  e line):..      
0510: 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  #..      #      
0520: 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20   EagleShell.exe 
0530: 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20 22  -anyInitialize "
0540: 73 65 74 20 74 65 73 74 5f 79 65 61 72 20 32 30  set test_year 20
0550: 30 35 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20  05"..      #    
0560: 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74       -file .\pat
0570: 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a  h\to\all.eagle..
0580: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
0590: 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c         EagleShel
05a0: 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61  l.exe -anyInitia
05b0: 6c 69 7a 65 20 22 73 65 74 20 74 65 73 74 5f 79  lize "set test_y
05c0: 65 61 72 20 32 30 30 38 22 0d 0a 20 20 20 20 20  ear 2008"..     
05d0: 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65   #         -file
05e0: 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65   .\path\to\all.e
05f0: 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20  agle..      #.. 
0600: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
0610: 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79  leShell.exe -any
0620: 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20  Initialize "set 
0630: 74 65 73 74 5f 79 65 61 72 20 32 30 31 30 22 0d  test_year 2010".
0640: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20  .      #        
0650: 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f   -file .\path\to
0660: 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20  \all.eagle..    
0670: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20    #..      #    
0680: 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78     EagleShell.ex
0690: 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65  e -anyInitialize
06a0: 20 22 73 65 74 20 74 65 73 74 5f 79 65 61 72 20   "set test_year 
06b0: 32 30 31 32 22 0d 0a 20 20 20 20 20 20 23 20 20  2012"..      #  
06c0: 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70         -file .\p
06d0: 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65  ath\to\all.eagle
06e0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
06f0: 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68   #       EagleSh
0700: 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74  ell.exe -anyInit
0710: 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65 73 74  ialize "set test
0720: 5f 79 65 61 72 20 32 30 31 33 22 0d 0a 20 20 20  _year 2013"..   
0730: 20 20 20 23 20 20 20 20 20 20 20 20 20 2d 66 69     #         -fi
0740: 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c  le .\path\to\all
0750: 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d  .eagle..      #.
0760: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45  .      #       E
0770: 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61  agleShell.exe -a
0780: 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65  nyInitialize "se
0790: 74 20 74 65 73 74 5f 79 65 61 72 20 32 30 31 35  t test_year 2015
07a0: 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  "..      #      
07b0: 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c     -file .\path\
07c0: 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20  to\all.eagle..  
07d0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20      #..      #  
07e0: 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e       EagleShell.
07f0: 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69  exe -anyInitiali
0800: 7a 65 20 22 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d  ze "unset -nocom
0810: 70 6c 61 69 6e 20 74 65 73 74 5f 79 65 61 72 22  plain test_year"
0820: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
0830: 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74    -file .\path\t
0840: 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20  o\all.eagle..   
0850: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
0860: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
0870: 65 73 74 5f 79 65 61 72 5d 20 26 26 20 5b 73 74  est_year] && [st
0880: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74  ring length $::t
0890: 65 73 74 5f 79 65 61 72 5d 20 3e 20 30 7d 20 74  est_year] > 0} t
08a0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
08b0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
08c0: 3a 20 55 73 65 20 74 68 65 20 73 70 65 63 69 66  : Use the specif
08d0: 69 65 64 20 74 65 73 74 20 79 65 61 72 2e 20 20  ied test year.  
08e0: 49 66 20 74 68 69 73 20 76 61 72 69 61 62 6c 65  If this variable
08f0: 20 69 73 20 6e 6f 74 20 73 65 74 2c 20 74 68 65   is not set, the
0900: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
0910: 20 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20    default value 
0920: 77 69 6c 6c 20 62 65 20 62 61 73 65 64 20 6f 6e  will be based on
0930: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
0940: 45 61 67 6c 65 20 68 61 73 20 62 65 65 6e 0d 0a  Eagle has been..
0950: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
0960: 63 6f 6d 70 69 6c 65 64 20 61 67 61 69 6e 73 74  compiled against
0970: 20 74 68 65 20 43 4c 52 20 76 32 2e 30 20 6f 72   the CLR v2.0 or
0980: 20 43 4c 52 20 76 34 2e 30 2e 0d 0a 20 20 20 20   CLR v4.0...    
0990: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
09a0: 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 79 65  eturn $::test_ye
09b0: 61 72 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ar..      } else
09c0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
09d0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49         # NOTE: I
09e0: 66 20 45 61 67 6c 65 20 68 61 73 20 62 65 65 6e  f Eagle has been
09f0: 20 63 6f 6d 70 69 6c 65 64 20 61 67 61 69 6e 73   compiled agains
0a00: 74 20 74 68 65 20 43 4c 52 20 76 34 2e 30 2c 20  t the CLR v4.0, 
0a10: 75 73 65 20 22 32 30 31 30 22 20 62 79 0d 0a 20  use "2010" by.. 
0a20: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64         #       d
0a30: 65 66 61 75 6c 74 20 28 77 65 20 63 6f 75 6c 64  efault (we could
0a40: 20 75 73 65 20 22 32 30 31 32 22 2c 20 22 32 30   use "2012", "20
0a50: 31 33 22 2c 20 6f 72 20 22 32 30 31 35 22 20 69  13", or "2015" i
0a60: 6e 20 74 68 61 74 20 63 61 73 65 20 61 73 0d 0a  n that case as..
0a70: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
0a80: 77 65 6c 6c 29 20 61 73 20 74 68 65 20 74 65 73  well) as the tes
0a90: 74 20 79 65 61 72 3b 20 6f 74 68 65 72 77 69 73  t year; otherwis
0aa0: 65 2c 20 75 73 65 20 22 32 30 30 38 22 20 62 79  e, use "2008" by
0ab0: 20 64 65 66 61 75 6c 74 20 28 77 65 0d 0a 20 20   default (we..  
0ac0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
0ad0: 75 6c 64 20 75 73 65 20 22 32 30 30 35 22 20 69  uld use "2005" i
0ae0: 6e 20 74 68 61 74 20 63 61 73 65 20 61 73 20 77  n that case as w
0af0: 65 6c 6c 29 2e 20 20 49 66 20 61 6e 6f 74 68 65  ell).  If anothe
0b00: 72 20 6d 61 6a 6f 72 0d 0a 20 20 20 20 20 20 20  r major..       
0b10: 20 23 20 20 20 20 20 20 20 5b 69 6e 63 6f 6d 70   #       [incomp
0b20: 61 74 69 62 6c 65 5d 20 76 65 72 73 69 6f 6e 20  atible] version 
0b30: 6f 66 20 74 68 65 20 43 4c 52 20 69 73 20 72 65  of the CLR is re
0b40: 6c 65 61 73 65 64 2c 20 74 68 69 73 20 63 68 65  leased, this che
0b50: 63 6b 20 77 69 6c 6c 0d 0a 20 20 20 20 20 20 20  ck will..       
0b60: 20 23 20 20 20 20 20 20 20 68 61 76 65 20 74 6f   #       have to
0b70: 20 62 65 20 63 68 61 6e 67 65 64 2e 20 20 54 68   be changed.  Th
0b80: 65 20 64 65 66 61 75 6c 74 20 74 65 73 74 20 79  e default test y
0b90: 65 61 72 20 74 6f 20 75 73 65 20 66 6f 72 20 61  ear to use for a
0ba0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
0bb0: 20 20 70 61 72 74 69 63 75 6c 61 72 20 43 4c 52    particular CLR
0bc0: 20 76 65 72 73 69 6f 6e 20 6d 61 79 20 62 65 20   version may be 
0bd0: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 73 65  overridden by se
0be0: 74 74 69 6e 67 20 74 68 65 20 67 6c 6f 62 61 6c  tting the global
0bf0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
0c00: 20 20 76 61 72 69 61 62 6c 65 20 22 74 65 73 74    variable "test
0c10: 5f 79 65 61 72 5f 63 6c 72 5f 76 24 58 22 2c 20  _year_clr_v$X", 
0c20: 77 68 65 72 65 20 22 24 58 22 20 6d 61 79 20 5b  where "$X" may [
0c30: 63 75 72 72 65 6e 74 6c 79 5d 20 62 65 0d 0a 20  currently] be.. 
0c40: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65         #       e
0c50: 69 74 68 65 72 20 22 32 22 20 6f 72 20 22 34 22  ither "2" or "4"
0c60: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
0c70: 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 43        if {[haveC
0c80: 6f 6e 73 74 72 61 69 6e 74 20 69 6d 61 67 65 52  onstraint imageR
0c90: 75 6e 74 69 6d 65 34 30 5d 7d 20 74 68 65 6e 20  untime40]} then 
0ca0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
0cb0: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
0cc0: 74 65 73 74 5f 79 65 61 72 5f 63 6c 72 5f 76 34  test_year_clr_v4
0cd0: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
0ce0: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
0cf0: 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 79 65 61  ngth $::test_yea
0d00: 72 5f 63 6c 72 5f 76 34 5d 20 3e 20 30 7d 20 74  r_clr_v4] > 0} t
0d10: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
0d20: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
0d30: 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68    # NOTE: Use th
0d40: 65 20 73 70 65 63 69 66 69 65 64 20 74 65 73 74  e specified test
0d50: 20 79 65 61 72 20 66 6f 72 20 74 68 65 20 43 4c   year for the CL
0d60: 52 20 76 34 2e 30 2e 0d 0a 20 20 20 20 20 20 20  R v4.0...       
0d70: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
0d80: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65      return $::te
0d90: 73 74 5f 79 65 61 72 5f 63 6c 72 5f 76 34 0d 0a  st_year_clr_v4..
0da0: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
0db0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
0dc0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  #..            #
0dd0: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 64   NOTE: Use the d
0de0: 65 66 61 75 6c 74 20 74 65 73 74 20 79 65 61 72  efault test year
0df0: 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76 34 2e   for the CLR v4.
0e00: 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  0...            
0e10: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  #..            r
0e20: 65 74 75 72 6e 20 32 30 31 30 3b 20 23 20 54 4f  eturn 2010; # TO
0e30: 44 4f 3a 20 47 6f 6f 64 20 22 66 61 6c 6c 62 61  DO: Good "fallba
0e40: 63 6b 22 20 64 65 66 61 75 6c 74 3f 0d 0a 20 20  ck" default?..  
0e50: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
0e60: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
0e70: 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f         if {[info
0e80: 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 79   exists ::test_y
0e90: 65 61 72 5f 63 6c 72 5f 76 32 5d 20 26 26 20 5c  ear_clr_v2] && \
0ea0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
0eb0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
0ec0: 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c 72 5f  ::test_year_clr_
0ed0: 76 32 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  v2] > 0} then {.
0ee0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
0ef0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
0f00: 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63  TE: Use the spec
0f10: 69 66 69 65 64 20 74 65 73 74 20 79 65 61 72 20  ified test year 
0f20: 66 6f 72 20 74 68 65 20 43 4c 52 20 76 32 2e 30  for the CLR v2.0
0f30: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
0f40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
0f50: 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 79 65 61  turn $::test_yea
0f60: 72 5f 63 6c 72 5f 76 32 0d 0a 20 20 20 20 20 20  r_clr_v2..      
0f70: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
0f80: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
0f90: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
0fa0: 20 55 73 65 20 74 68 65 20 64 65 66 61 75 6c 74   Use the default
0fb0: 20 74 65 73 74 20 79 65 61 72 20 66 6f 72 20 74   test year for t
0fc0: 68 65 20 43 4c 52 20 76 32 2e 30 2e 0d 0a 20 20  he CLR v2.0...  
0fd0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
0fe0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
0ff0: 32 30 30 38 3b 20 23 20 54 4f 44 4f 3a 20 47 6f  2008; # TODO: Go
1000: 6f 64 20 22 66 61 6c 6c 62 61 63 6b 22 20 64 65  od "fallback" de
1010: 66 61 75 6c 74 3f 0d 0a 20 20 20 20 20 20 20 20  fault?..        
1020: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
1030: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
1040: 0c 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20  ...    #..    # 
1050: 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65  NOTE: This proce
1060: 64 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  dure is only use
1070: 64 20 77 68 65 6e 20 61 64 64 69 6e 67 20 73 68  d when adding sh
1080: 69 6d 6d 65 64 20 74 65 73 74 20 63 6f 6e 73 74  immed test const
1090: 72 61 69 6e 74 73 2e 0d 0a 20 20 20 20 23 0d 0a  raints...    #..
10a0: 20 20 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c      proc getBuil
10b0: 64 43 6c 72 56 65 72 73 69 6f 6e 20 7b 7d 20 7b  dClrVersion {} {
10c0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
10d0: 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f  o exists ::test_
10e0: 63 6c 72 5d 20 26 26 20 5b 73 74 72 69 6e 67 20  clr] && [string 
10f0: 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 63  length $::test_c
1100: 6c 72 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  lr] > 0} then {.
1110: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1120: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
1130: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65  the specified te
1140: 73 74 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 74  st version for t
1150: 68 65 20 43 4c 52 2e 20 20 49 66 20 74 68 69 73  he CLR.  If this
1160: 20 76 61 72 69 61 62 6c 65 0d 0a 20 20 20 20 20   variable..     
1170: 20 20 20 23 20 20 20 20 20 20 20 69 73 20 6e 6f     #       is no
1180: 74 20 73 65 74 2c 20 74 68 65 20 64 65 66 61 75  t set, the defau
1190: 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65  lt value will be
11a0: 20 62 61 73 65 64 20 6f 6e 20 77 68 65 74 68 65   based on whethe
11b0: 72 20 6f 72 20 6e 6f 74 0d 0a 20 20 20 20 20 20  r or not..      
11c0: 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 20    #       Eagle 
11d0: 68 61 73 20 62 65 65 6e 20 63 6f 6d 70 69 6c 65  has been compile
11e0: 64 20 61 67 61 69 6e 73 74 20 74 68 65 20 43 4c  d against the CL
11f0: 52 20 76 32 2e 30 20 6f 72 20 43 4c 52 20 76 34  R v2.0 or CLR v4
1200: 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  .0...        #..
1210: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
1220: 3a 3a 74 65 73 74 5f 63 6c 72 0d 0a 20 20 20 20  ::test_clr..    
1230: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1240: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1250: 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20   NOTE: Check if 
1260: 45 61 67 6c 65 20 68 61 73 20 62 65 65 6e 20 63  Eagle has been c
1270: 6f 6d 70 69 6c 65 64 20 61 67 61 69 6e 73 74 20  ompiled against 
1280: 74 68 65 20 43 4c 52 20 76 34 2e 30 2e 20 20 49  the CLR v4.0.  I
1290: 66 20 73 6f 2c 0d 0a 20 20 20 20 20 20 20 20 23  f so,..        #
12a0: 20 20 20 20 20 20 20 6a 75 73 74 20 75 73 65 20         just use 
12b0: 74 68 61 74 20 43 4c 52 20 76 65 72 73 69 6f 6e  that CLR version
12c0: 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73  .  Otherwise, us
12d0: 65 20 74 68 65 20 76 65 72 73 69 6f 6e 20 66 6f  e the version fo
12e0: 72 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23  r the..        #
12f0: 20 20 20 20 20 20 20 43 4c 52 20 76 32 2e 30 2e         CLR v2.0.
1300: 20 20 49 66 20 61 6e 6f 74 68 65 72 20 6d 61 6a    If another maj
1310: 6f 72 20 5b 69 6e 63 6f 6d 70 61 74 69 62 6c 65  or [incompatible
1320: 5d 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  ] version of the
1330: 20 43 4c 52 0d 0a 20 20 20 20 20 20 20 20 23 20   CLR..        # 
1340: 20 20 20 20 20 20 69 73 20 72 65 6c 65 61 73 65        is release
1350: 64 2c 20 74 68 69 73 20 63 68 65 63 6b 20 77 69  d, this check wi
1360: 6c 6c 20 68 61 76 65 20 74 6f 20 62 65 20 63 68  ll have to be ch
1370: 61 6e 67 65 64 2e 20 20 54 68 65 20 64 65 66 61  anged.  The defa
1380: 75 6c 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ult..        #  
1390: 20 20 20 20 20 76 65 72 73 69 6f 6e 20 76 61 6c       version val
13a0: 75 65 20 66 6f 72 20 61 20 70 61 72 74 69 63 75  ue for a particu
13b0: 6c 61 72 20 43 4c 52 20 76 65 72 73 69 6f 6e 20  lar CLR version 
13c0: 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64 64 65  may be overridde
13d0: 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  n..        #    
13e0: 20 20 20 62 79 20 73 65 74 74 69 6e 67 20 74 68     by setting th
13f0: 65 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  e global variabl
1400: 65 20 22 74 65 73 74 5f 63 6c 72 5f 76 24 58 22  e "test_clr_v$X"
1410: 2c 20 77 68 65 72 65 20 22 24 58 22 20 6d 61 79  , where "$X" may
1420: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1430: 20 20 5b 63 75 72 72 65 6e 74 6c 79 5d 20 62 65    [currently] be
1440: 20 65 69 74 68 65 72 20 22 32 22 20 6f 72 20 22   either "2" or "
1450: 34 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  4"...        #..
1460: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76          if {[hav
1470: 65 43 6f 6e 73 74 72 61 69 6e 74 20 69 6d 61 67  eConstraint imag
1480: 65 52 75 6e 74 69 6d 65 34 30 5d 7d 20 74 68 65  eRuntime40]} the
1490: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
14a0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
14b0: 3a 3a 74 65 73 74 5f 63 6c 72 5f 76 34 5d 20 26  ::test_clr_v4] &
14c0: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
14d0: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
14e0: 68 20 24 3a 3a 74 65 73 74 5f 63 6c 72 5f 76 34  h $::test_clr_v4
14f0: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
1500: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
1510: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
1520: 3a 20 55 73 65 20 74 68 65 20 73 70 65 63 69 66  : Use the specif
1530: 69 65 64 20 74 65 73 74 20 76 65 72 73 69 6f 6e  ied test version
1540: 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76 34 2e   for the CLR v4.
1550: 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  0...            
1560: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  #..            r
1570: 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 63 6c  eturn $::test_cl
1580: 72 5f 76 34 0d 0a 20 20 20 20 20 20 20 20 20 20  r_v4..          
1590: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
15a0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
15b0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65       # NOTE: Use
15c0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 74 65 73   the default tes
15d0: 74 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 74 68  t version for th
15e0: 65 20 43 4c 52 20 76 34 2e 30 2e 0d 0a 20 20 20  e CLR v4.0...   
15f0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1600: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 34          return 4
1610: 2e 30 2e 33 30 33 31 39 3b 20 23 20 54 4f 44 4f  .0.30319; # TODO
1620: 3a 20 47 6f 6f 64 20 22 66 61 6c 6c 62 61 63 6b  : Good "fallback
1630: 22 20 64 65 66 61 75 6c 74 3f 0d 0a 20 20 20 20  " default?..    
1640: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1650: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1660: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
1670: 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 63 6c 72  xists ::test_clr
1680: 5f 76 32 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  _v2] && \..     
1690: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
16a0: 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f   length $::test_
16b0: 63 6c 72 5f 76 32 5d 20 3e 20 30 7d 20 74 68 65  clr_v2] > 0} the
16c0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
16d0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
16e0: 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20  # NOTE: Use the 
16f0: 73 70 65 63 69 66 69 65 64 20 74 65 73 74 20 76  specified test v
1700: 65 72 73 69 6f 6e 20 66 6f 72 20 74 68 65 20 43  ersion for the C
1710: 4c 52 20 76 32 2e 30 2e 0d 0a 20 20 20 20 20 20  LR v2.0...      
1720: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1730: 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74       return $::t
1740: 65 73 74 5f 63 6c 72 5f 76 32 0d 0a 20 20 20 20  est_clr_v2..    
1750: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1760: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
1770: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
1780: 45 3a 20 55 73 65 20 74 68 65 20 64 65 66 61 75  E: Use the defau
1790: 6c 74 20 74 65 73 74 20 76 65 72 73 69 6f 6e 20  lt test version 
17a0: 66 6f 72 20 74 68 65 20 43 4c 52 20 76 32 2e 30  for the CLR v2.0
17b0: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
17c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
17d0: 74 75 72 6e 20 32 2e 30 2e 35 30 37 32 37 3b 20  turn 2.0.50727; 
17e0: 23 20 54 4f 44 4f 3a 20 47 6f 6f 64 20 22 66 61  # TODO: Good "fa
17f0: 6c 6c 62 61 63 6b 22 20 64 65 66 61 75 6c 74 3f  llback" default?
1800: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1810: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1820: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
1830: 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 59 65   proc getBuildYe
1840: 61 72 73 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  ars {} {..      
1850: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
1860: 20 53 65 65 20 69 66 20 74 68 65 20 6c 69 73 74   See if the list
1870: 20 6f 66 20 74 65 73 74 20 79 65 61 72 73 20 68   of test years h
1880: 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64  as been overridd
1890: 65 6e 20 62 79 20 74 68 65 20 75 73 65 72 0d 0a  en by the user..
18a0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 28 65        #       (e
18b0: 2e 67 2e 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61  .g. on the comma
18c0: 6e 64 20 6c 69 6e 65 29 2e 0d 0a 20 20 20 20 20  nd line)...     
18d0: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
18e0: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73  nfo exists ::tes
18f0: 74 5f 79 65 61 72 73 5d 20 26 26 20 5b 6c 6c 65  t_years] && [lle
1900: 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 79 65 61  ngth $::test_yea
1910: 72 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  rs] > 0} then {.
1920: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1930: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
1940: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 69  the specified li
1950: 73 74 20 6f 66 20 74 65 73 74 20 79 65 61 72 73  st of test years
1960: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1970: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
1980: 74 65 73 74 5f 79 65 61 72 73 0d 0a 20 20 20 20  test_years..    
1990: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
19a0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
19b0: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 64   NOTE: Use the d
19c0: 65 66 61 75 6c 74 20 6c 69 73 74 20 6f 66 20 74  efault list of t
19d0: 65 73 74 20 79 65 61 72 73 20 28 69 2e 65 2e 20  est years (i.e. 
19e0: 61 6c 6c 29 2e 0d 0a 20 20 20 20 20 20 20 20 23  all)...        #
19f0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
1a00: 20 5b 6c 69 73 74 20 32 30 30 35 20 32 30 30 38   [list 2005 2008
1a10: 20 32 30 31 30 20 32 30 31 32 20 32 30 31 33 20   2010 2012 2013 
1a20: 32 30 31 35 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  2015]..      }..
1a30: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
1a40: 6f 63 20 67 65 74 42 75 69 6c 64 4e 65 74 46 78  oc getBuildNetFx
1a50: 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
1a60: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 65        # NOTE: Se
1a70: 65 20 69 66 20 74 68 65 20 74 65 73 74 20 2e 4e  e if the test .N
1a80: 45 54 20 46 72 61 6d 65 77 6f 72 6b 20 73 65 74  ET Framework set
1a90: 74 69 6e 67 20 68 61 73 20 62 65 65 6e 20 6f 76  ting has been ov
1aa0: 65 72 72 69 64 64 65 6e 20 62 79 0d 0a 20 20 20  erridden by..   
1ab0: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 75     #       the u
1ac0: 73 65 72 20 28 65 2e 67 2e 20 6f 6e 20 74 68 65  ser (e.g. on the
1ad0: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 0d   command line)..
1ae0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1af0: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
1b00: 20 3a 3a 74 65 73 74 5f 6e 65 74 5f 66 78 5d 20   ::test_net_fx] 
1b10: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
1b20: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
1b30: 3a 3a 74 65 73 74 5f 6e 65 74 5f 66 78 5d 20 3e  ::test_net_fx] >
1b40: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1b50: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1b60: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73   NOTE: Use the s
1b70: 70 65 63 69 66 69 65 64 20 74 65 73 74 20 2e 4e  pecified test .N
1b80: 45 54 20 46 72 61 6d 65 77 6f 72 6b 2e 0d 0a 20  ET Framework... 
1b90: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1ba0: 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74    return $::test
1bb0: 5f 6e 65 74 5f 66 78 0d 0a 20 20 20 20 20 20 7d  _net_fx..      }
1bc0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1bd0: 20 73 65 74 20 79 65 61 72 20 5b 67 65 74 42 75   set year [getBu
1be0: 69 6c 64 59 65 61 72 5d 0d 0a 20 20 20 20 20 20  ildYear]..      
1bf0: 20 20 73 65 74 20 79 65 61 72 56 61 72 4e 61 6d    set yearVarNam
1c00: 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20 3a 3a  e [appendArgs ::
1c10: 74 65 73 74 5f 6e 65 74 5f 66 78 5f 20 24 79 65  test_net_fx_ $ye
1c20: 61 72 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69  ar]....        i
1c30: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
1c40: 24 79 65 61 72 56 61 72 4e 61 6d 65 5d 20 26 26  $yearVarName] &&
1c50: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1c60: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 5b  [string length [
1c70: 73 65 74 20 24 79 65 61 72 56 61 72 4e 61 6d 65  set $yearVarName
1c80: 5d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ]] > 0} then {..
1c90: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1ca0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55         # NOTE: U
1cb0: 73 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64  se the specified
1cc0: 20 74 65 73 74 20 2e 4e 45 54 20 46 72 61 6d 65   test .NET Frame
1cd0: 77 6f 72 6b 2c 20 62 61 73 65 64 20 6f 6e 20 74  work, based on t
1ce0: 68 65 20 62 75 69 6c 64 0d 0a 20 20 20 20 20 20  he build..      
1cf0: 20 20 20 20 23 20 20 20 20 20 20 20 79 65 61 72      #       year
1d00: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
1d10: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1d20: 20 5b 73 65 74 20 24 79 65 61 72 56 61 72 4e 61   [set $yearVarNa
1d30: 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65  me]..        } e
1d40: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
1d50: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
1d60: 4e 4f 54 45 3a 20 46 61 6c 6c 62 61 63 6b 20 74  NOTE: Fallback t
1d70: 6f 20 74 68 65 20 22 77 65 6c 6c 20 6b 6e 6f 77  o the "well know
1d80: 6e 22 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72  n" .NET Framewor
1d90: 6b 20 76 65 72 73 69 6f 6e 20 74 68 61 74 0d 0a  k version that..
1da0: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
1db0: 20 20 69 73 20 6d 6f 73 74 20 63 6c 6f 73 65 6c    is most closel
1dc0: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
1dd0: 68 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 76  h a particular v
1de0: 65 72 73 69 6f 6e 20 6f 66 0d 0a 20 20 20 20 20  ersion of..     
1df0: 20 20 20 20 20 23 20 20 20 20 20 20 20 56 69 73       #       Vis
1e00: 75 61 6c 20 53 74 75 64 69 6f 2e 0d 0a 20 20 20  ual Studio...   
1e10: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1e20: 20 20 20 20 73 77 69 74 63 68 20 2d 65 78 61 63      switch -exac
1e30: 74 20 2d 2d 20 24 79 65 61 72 20 7b 0d 0a 20 20  t -- $year {..  
1e40: 20 20 20 20 20 20 20 20 20 20 32 30 30 35 20 7b            2005 {
1e50: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1e60: 72 65 74 75 72 6e 20 6e 65 74 46 78 32 30 0d 0a  return netFx20..
1e70: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1e80: 20 20 20 20 20 20 20 20 20 20 20 32 30 30 38 20             2008 
1e90: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1ea0: 20 72 65 74 75 72 6e 20 6e 65 74 46 78 33 35 0d   return netFx35.
1eb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
1ec0: 20 20 20 20 20 20 20 20 20 20 20 20 32 30 31 30              2010
1ed0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1ee0: 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78 34 30    return netFx40
1ef0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
1f00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 32 30 31  .            201
1f10: 32 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  2 {..           
1f20: 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78 34     return netFx4
1f30: 35 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  5..            }
1f40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 32 30  ..            20
1f50: 31 33 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  13 {..          
1f60: 20 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78      return netFx
1f70: 34 35 31 3b 20 23 20 54 4f 44 4f 3a 20 4f 72 20  451; # TODO: Or 
1f80: 22 6e 65 74 46 78 34 35 32 22 3f 0d 0a 20 20 20  "netFx452"?..   
1f90: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1fa0: 20 20 20 20 20 20 20 20 32 30 31 35 20 7b 0d 0a          2015 {..
1fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1fc0: 74 75 72 6e 20 6e 65 74 46 78 34 36 3b 20 23 20  turn netFx46; # 
1fd0: 54 4f 44 4f 3a 20 4f 72 20 22 6e 65 74 46 78 34  TODO: Or "netFx4
1fe0: 36 31 22 3f 0d 0a 20 20 20 20 20 20 20 20 20 20  61"?..          
1ff0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
2000: 20 64 65 66 61 75 6c 74 20 7b 0d 0a 20 20 20 20   default {..    
2010: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2020: 20 6e 65 74 46 78 33 35 3b 20 23 20 54 4f 44 4f   netFx35; # TODO
2030: 3a 20 47 6f 6f 64 20 22 66 61 6c 6c 62 61 63 6b  : Good "fallback
2040: 22 20 64 65 66 61 75 6c 74 3f 0d 0a 20 20 20 20  " default?..    
2050: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
2060: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
2070: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
2080: 7d 0d 0a 0c 0d 0a 20 20 20 20 23 0d 0a 20 20 20  }.....    #..   
2090: 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72   # NOTE: This pr
20a0: 6f 63 65 64 75 72 65 20 73 68 6f 75 6c 64 20 72  ocedure should r
20b0: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
20c0: 66 20 74 68 65 20 63 6f 6e 66 69 67 75 72 65 64  f the configured
20d0: 20 74 65 73 74 0d 0a 20 20 20 20 23 20 20 20 20   test..    #    
20e0: 20 20 20 70 6c 61 74 66 6f 72 6d 20 69 73 20 6d     platform is m
20f0: 6f 73 74 20 6c 69 6b 65 6c 79 20 74 68 65 20 64  ost likely the d
2100: 65 66 61 75 6c 74 20 66 6f 72 20 74 68 69 73 20  efault for this 
2110: 6d 61 63 68 69 6e 65 2e 0d 0a 20 20 20 20 23 0d  machine...    #.
2120: 0a 20 20 20 20 70 72 6f 63 20 69 73 44 65 66 61  .    proc isDefa
2130: 75 6c 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d  ultBuildPlatform
2140: 20 7b 20 7b 76 65 72 62 6f 73 65 20 66 61 6c 73   { {verbose fals
2150: 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e} } {..      #.
2160: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
2170: 75 6e 6e 69 6e 67 20 6f 6e 20 57 6f 57 36 34 20  unning on WoW64 
2180: 69 73 20 6e 65 76 65 72 20 74 68 65 20 64 65 66  is never the def
2190: 61 75 6c 74 20 70 6c 61 74 66 6f 72 6d 2e 0d 0a  ault platform...
21a0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
21b0: 66 20 7b 5b 69 73 52 75 6e 6e 69 6e 67 57 6f 57  f {[isRunningWoW
21c0: 36 34 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  64]} then {..   
21d0: 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73       if {$verbos
21e0: 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
21f0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
2200: 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20  st_channel \..  
2210: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
2220: 2d 20 64 65 74 65 63 74 65 64 20 6e 6f 6e 2d 64  - detected non-d
2230: 65 66 61 75 6c 74 20 70 6c 61 74 66 6f 72 6d 20  efault platform 
2240: 28 57 6f 57 36 34 29 5c 6e 22 0d 0a 20 20 20 20  (WoW64)\n"..    
2250: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 72      }..        r
2260: 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20  eturn false..   
2270: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
2280: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
2290: 68 69 73 20 68 61 73 20 61 20 67 6f 6f 64 20 63  his has a good c
22a0: 68 61 6e 63 65 20 6f 66 20 62 65 69 6e 67 20 74  hance of being t
22b0: 68 65 20 64 65 66 61 75 6c 74 20 70 6c 61 74 66  he default platf
22c0: 6f 72 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  orm...      #.. 
22d0: 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73       if {$verbos
22e0: 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
22f0: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
2300: 5f 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 64  _channel "---- d
2310: 65 74 65 63 74 65 64 20 64 65 66 61 75 6c 74 20  etected default 
2320: 70 6c 61 74 66 6f 72 6d 5c 6e 22 0d 0a 20 20 20  platform\n"..   
2330: 20 20 20 7d 0d 0a 20 20 20 20 20 20 72 65 74 75     }..      retu
2340: 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 7d 0d 0a  rn true..    }..
2350: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42  ...    proc getB
2360: 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20 7b 20 6e  uildPlatform { n
2370: 61 74 69 76 65 20 7d 20 7b 0d 0a 20 20 20 20 20  ative } {..     
2380: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
2390: 73 20 3a 3a 74 65 73 74 5f 70 6c 61 74 66 6f 72  s ::test_platfor
23a0: 6d 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  m] && \..       
23b0: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
23c0: 68 20 24 3a 3a 74 65 73 74 5f 70 6c 61 74 66 6f  h $::test_platfo
23d0: 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  rm] > 0} then {.
23e0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
23f0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
2400: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65  the specified te
2410: 73 74 20 70 6c 61 74 66 6f 72 6d 2e 20 20 49 66  st platform.  If
2420: 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 69   this variable i
2430: 73 20 6e 6f 74 20 73 65 74 2c 0d 0a 20 20 20 20  s not set,..    
2440: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
2450: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 77 69  default value wi
2460: 6c 6c 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74  ll be based on t
2470: 68 65 20 6d 61 63 68 69 6e 65 20 61 72 63 68 69  he machine archi
2480: 74 65 63 74 75 72 65 2e 0d 0a 20 20 20 20 20 20  tecture...      
2490: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
24a0: 75 72 6e 20 5b 65 78 70 72 20 7b 24 6e 61 74 69  urn [expr {$nati
24b0: 76 65 20 3f 20 24 3a 3a 74 65 73 74 5f 70 6c 61  ve ? $::test_pla
24c0: 74 66 6f 72 6d 20 3a 20 22 22 7d 5d 0d 0a 20 20  tform : ""}]..  
24d0: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69      } elseif {[i
24e0: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73  nfo exists ::tes
24f0: 74 5f 6d 61 63 68 69 6e 65 5d 20 26 26 20 5c 0d  t_machine] && \.
2500: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
2510: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73  ng length $::tes
2520: 74 5f 6d 61 63 68 69 6e 65 5d 20 3e 20 30 7d 20  t_machine] > 0} 
2530: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
2540: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
2550: 45 3a 20 46 6f 72 20 6e 61 74 69 76 65 20 62 75  E: For native bu
2560: 69 6c 64 73 2c 20 72 65 74 75 72 6e 20 74 68 65  ilds, return the
2570: 20 70 6c 61 74 66 6f 72 6d 20 6e 61 6d 65 20 63   platform name c
2580: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 0d  orresponding to.
2590: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
25a0: 20 74 68 65 20 74 65 73 74 20 6d 61 63 68 69 6e   the test machin
25b0: 65 20 61 72 63 68 69 74 65 63 74 75 72 65 3b 20  e architecture; 
25c0: 6f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  otherwise, retur
25d0: 6e 20 61 6e 20 65 6d 70 74 79 0d 0a 20 20 20 20  n an empty..    
25e0: 20 20 20 20 23 20 20 20 20 20 20 20 73 74 72 69      #       stri
25f0: 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ng...        #..
2600: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
2610: 65 78 70 72 20 7b 0d 0a 20 20 20 20 20 20 20 20  expr {..        
2620: 20 20 24 6e 61 74 69 76 65 20 3f 20 5b 6d 61 63    $native ? [mac
2630: 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72 6d 20 24  hineToPlatform $
2640: 3a 3a 74 65 73 74 5f 6d 61 63 68 69 6e 65 5d 20  ::test_machine] 
2650: 3a 20 22 22 0d 0a 20 20 20 20 20 20 20 20 7d 5d  : ""..        }]
2660: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66  ..      } elseif
2670: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
2680: 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61  :tcl_platform(ma
2690: 63 68 69 6e 65 29 5d 7d 20 74 68 65 6e 20 7b 0d  chine)]} then {.
26a0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
26b0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20      # NOTE: For 
26c0: 6e 61 74 69 76 65 20 62 75 69 6c 64 73 2c 20 72  native builds, r
26d0: 65 74 75 72 6e 20 74 68 65 20 70 6c 61 74 66 6f  eturn the platfo
26e0: 72 6d 20 6e 61 6d 65 20 63 6f 72 72 65 73 70 6f  rm name correspo
26f0: 6e 64 69 6e 67 20 74 6f 0d 0a 20 20 20 20 20 20  nding to..      
2700: 20 20 23 20 20 20 20 20 20 20 74 68 65 20 6d 61    #       the ma
2710: 63 68 69 6e 65 20 61 72 63 68 69 74 65 63 74 75  chine architectu
2720: 72 65 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 72  re; otherwise, r
2730: 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73  eturn an empty s
2740: 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20  tring...        
2750: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
2760: 6e 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20 20  n [expr {..     
2770: 20 20 20 20 20 24 6e 61 74 69 76 65 20 3f 20 5b       $native ? [
2780: 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72  machineToPlatfor
2790: 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72  m $::tcl_platfor
27a0: 6d 28 6d 61 63 68 69 6e 65 29 5d 20 3a 20 22 22  m(machine)] : ""
27b0: 0d 0a 20 20 20 20 20 20 20 20 7d 5d 0d 0a 20 20  ..        }]..  
27c0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
27d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
27e0: 20 23 20 4e 4f 54 45 3a 20 4e 6f 20 6d 61 63 68   # NOTE: No mach
27f0: 69 6e 65 20 61 72 63 68 69 74 65 63 74 75 72 65  ine architecture
2800: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72   is available, r
2810: 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73  eturn an empty s
2820: 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20  tring...        
2830: 23 20 20 20 20 20 20 20 49 74 20 69 73 20 69 6d  #       It is im
2840: 70 6f 72 74 61 6e 74 20 74 6f 20 72 65 74 75 72  portant to retur
2850: 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  n an empty strin
2860: 67 20 68 65 72 65 20 62 65 63 61 75 73 65 20 74  g here because t
2870: 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  he..        #   
2880: 20 20 20 20 72 65 73 75 6c 74 20 6f 66 20 74 68      result of th
2890: 69 73 20 70 72 6f 63 65 64 75 72 65 20 6d 61 79  is procedure may
28a0: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 5b 66   be used with [f
28b0: 69 6c 65 20 6a 6f 69 6e 5d 2e 0d 0a 20 20 20 20  ile join]...    
28c0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
28d0: 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 20 20  eturn ""..      
28e0: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
28f0: 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 43 6f   proc getBuildCo
2900: 6e 66 69 67 75 72 61 74 69 6f 6e 20 7b 7d 20 7b  nfiguration {} {
2910: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
2920: 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66 20   # NOTE: See if 
2930: 74 68 65 20 22 63 6f 6e 66 69 67 75 72 61 74 69  the "configurati
2940: 6f 6e 22 20 73 65 74 74 69 6e 67 20 68 61 73 20  on" setting has 
2950: 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 20  been overridden 
2960: 62 79 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  by the..      # 
2970: 20 20 20 20 20 20 75 73 65 72 20 28 65 2e 67 2e        user (e.g.
2980: 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20   on the command 
2990: 6c 69 6e 65 29 2e 20 20 54 68 69 73 20 68 65 6c  line).  This hel
29a0: 70 73 20 63 6f 6e 74 72 6f 6c 20 65 78 61 63 74  ps control exact
29b0: 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ly..      #     
29c0: 20 20 77 68 69 63 68 20 73 65 74 20 6f 66 20 62    which set of b
29d0: 69 6e 61 72 69 65 73 20 77 65 20 61 72 65 20 74  inaries we are t
29e0: 65 73 74 69 6e 67 20 28 69 2e 65 2e 20 74 68 6f  esting (i.e. tho
29f0: 73 65 20 62 75 69 6c 74 20 69 6e 20 74 68 65 0d  se built in the.
2a00: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22  .      #       "
2a10: 44 65 62 75 67 22 20 6f 72 20 22 52 65 6c 65 61  Debug" or "Relea
2a20: 73 65 22 20 62 75 69 6c 64 20 63 6f 6e 66 69 67  se" build config
2a30: 75 72 61 74 69 6f 6e 73 29 2e 20 20 54 6f 20 6f  urations).  To o
2a40: 76 65 72 72 69 64 65 20 74 68 69 73 0d 0a 20 20  verride this..  
2a50: 20 20 20 20 23 20 20 20 20 20 20 20 76 61 6c 75      #       valu
2a60: 65 20 76 69 61 20 74 68 65 20 63 6f 6d 6d 61 6e  e via the comman
2a70: 64 20 6c 69 6e 65 2c 20 65 6e 74 65 72 20 61 20  d line, enter a 
2a80: 63 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c 61 72 20  command similar 
2a90: 74 6f 20 6f 6e 65 20 6f 66 0d 0a 20 20 20 20 20  to one of..     
2aa0: 20 23 20 20 20 20 20 20 20 74 68 65 20 66 6f 6c   #       the fol
2ab0: 6c 6f 77 69 6e 67 20 28 61 6c 6c 20 6f 6e 20 6f  lowing (all on o
2ac0: 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20 20 20  ne line):..     
2ad0: 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20   #..      #     
2ae0: 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65    EagleShell.exe
2af0: 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20   -anyInitialize 
2b00: 22 73 65 74 20 74 65 73 74 5f 63 6f 6e 66 69 67  "set test_config
2b10: 75 72 61 74 69 6f 6e 20 44 65 62 75 67 22 0d 0a  uration Debug"..
2b20: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
2b30: 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c  -file .\path\to\
2b40: 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20  all.eagle..     
2b50: 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20   #..      #     
2b60: 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65    EagleShell.exe
2b70: 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20   -anyInitialize 
2b80: 22 73 65 74 20 74 65 73 74 5f 63 6f 6e 66 69 67  "set test_config
2b90: 75 72 61 74 69 6f 6e 20 52 65 6c 65 61 73 65 22  uration Release"
2ba0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
2bb0: 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74    -file .\path\t
2bc0: 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20  o\all.eagle..   
2bd0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20     #..      #   
2be0: 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65      EagleShell.e
2bf0: 78 65 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c  xe -file .\path\
2c00: 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 20 2d 70 72  to\all.eagle -pr
2c10: 65 54 65 73 74 0d 0a 20 20 20 20 20 20 23 20 20  eTest..      #  
2c20: 20 20 20 20 20 20 20 22 75 6e 73 65 74 20 2d 6e         "unset -n
2c30: 6f 63 6f 6d 70 6c 61 69 6e 20 74 65 73 74 5f 63  ocomplain test_c
2c40: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 0d 0a 20  onfiguration".. 
2c50: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
2c60: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
2c70: 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74  :test_configurat
2c80: 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ion] && \..     
2c90: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
2ca0: 67 74 68 20 24 3a 3a 74 65 73 74 5f 63 6f 6e 66  gth $::test_conf
2cb0: 69 67 75 72 61 74 69 6f 6e 5d 20 3e 20 30 7d 20  iguration] > 0} 
2cc0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
2cd0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
2ce0: 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63 69  E: Use the speci
2cf0: 66 69 65 64 20 74 65 73 74 20 63 6f 6e 66 69 67  fied test config
2d00: 75 72 61 74 69 6f 6e 2e 20 20 54 68 65 20 64 65  uration.  The de
2d10: 66 61 75 6c 74 20 76 61 6c 75 65 20 75 73 65 64  fault value used
2d20: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
2d30: 20 20 66 6f 72 20 74 68 69 73 20 76 61 72 69 61    for this varia
2d40: 62 6c 65 20 69 73 20 74 79 70 69 63 61 6c 6c 79  ble is typically
2d50: 20 22 52 65 6c 65 61 73 65 22 2c 20 61 73 20 73   "Release", as s
2d60: 65 74 20 62 79 20 74 68 65 20 74 65 73 74 0d 0a  et by the test..
2d70: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2d80: 73 75 69 74 65 20 69 74 73 65 6c 66 2e 0d 0a 20  suite itself... 
2d90: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2da0: 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74    return $::test
2db0: 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0d 0a  _configuration..
2dc0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
2dd0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2de0: 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 72 6d 61     # NOTE: Norma
2df0: 6c 6c 79 2c 20 77 65 20 77 69 6c 6c 20 6e 65 76  lly, we will nev
2e00: 65 72 20 68 69 74 20 74 68 69 73 20 63 61 73 65  er hit this case
2e10: 20 62 65 63 61 75 73 65 20 74 68 65 20 76 61 6c   because the val
2e20: 75 65 20 6f 66 20 74 68 65 0d 0a 20 20 20 20 20  ue of the..     
2e30: 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74 20     #       test 
2e40: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 76 61  configuration va
2e50: 72 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73  riable is always
2e60: 20 73 65 74 20 62 79 20 74 68 65 20 74 65 73 74   set by the test
2e70: 20 73 75 69 74 65 0d 0a 20 20 20 20 20 20 20 20   suite..        
2e80: 23 20 20 20 20 20 20 20 69 74 73 65 6c 66 3b 20  #       itself; 
2e90: 68 6f 77 65 76 65 72 2c 20 69 74 20 63 61 6e 20  however, it can 
2ea0: 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 75 73  be overridden us
2eb0: 69 6e 67 20 74 68 65 20 75 6e 73 65 74 20 63 6f  ing the unset co
2ec0: 6d 6d 61 6e 64 0d 0a 20 20 20 20 20 20 20 20 23  mmand..        #
2ed0: 20 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20         from the 
2ee0: 2d 70 72 65 54 65 73 74 20 6f 70 74 69 6f 6e 20  -preTest option 
2ef0: 74 6f 20 74 68 65 20 74 65 73 74 20 73 75 69 74  to the test suit
2f00: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
2f10: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
2f20: 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d 28  :eagle_platform(
2f30: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 29 0d 0a  configuration)..
2f40: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
2f50: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42  ...    proc getB
2f60: 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f  uildConfiguratio
2f70: 6e 73 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ns {} {..      #
2f80: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
2f90: 53 65 65 20 69 66 20 74 68 65 20 6c 69 73 74 20  See if the list 
2fa0: 6f 66 20 74 65 73 74 20 63 6f 6e 66 69 67 75 72  of test configur
2fb0: 61 74 69 6f 6e 73 20 68 61 73 20 62 65 65 6e 20  ations has been 
2fc0: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 0d 0a 20  overridden by.. 
2fd0: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
2fe0: 20 75 73 65 72 20 28 65 2e 67 2e 20 6f 6e 20 74   user (e.g. on t
2ff0: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29  he command line)
3000: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
3010: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
3020: 74 73 20 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67  ts ::test_config
3030: 75 72 61 74 69 6f 6e 73 5d 20 26 26 20 5c 0d 0a  urations] && \..
3040: 20 20 20 20 20 20 20 20 20 20 5b 6c 6c 65 6e 67            [lleng
3050: 74 68 20 24 3a 3a 74 65 73 74 5f 63 6f 6e 66 69  th $::test_confi
3060: 67 75 72 61 74 69 6f 6e 73 5d 20 3e 20 30 7d 20  gurations] > 0} 
3070: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
3080: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
3090: 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63 69  E: Use the speci
30a0: 66 69 65 64 20 6c 69 73 74 20 6f 66 20 74 65 73  fied list of tes
30b0: 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  t configurations
30c0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
30d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
30e0: 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69  test_configurati
30f0: 6f 6e 73 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  ons..      } els
3100: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e {..        #..
3110: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
3120: 55 73 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  Use the default 
3130: 6c 69 73 74 20 6f 66 20 74 65 73 74 20 63 6f 6e  list of test con
3140: 66 69 67 75 72 61 74 69 6f 6e 73 2e 0d 0a 20 20  figurations...  
3150: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
3160: 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 44 65   return [list De
3170: 62 75 67 20 52 65 6c 65 61 73 65 5d 0d 0a 20 20  bug Release]..  
3180: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
3190: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 75 69  .    proc getBui
31a0: 6c 64 42 61 73 65 44 69 72 65 63 74 6f 72 79 20  ldBaseDirectory 
31b0: 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
31c0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 67       # NOTE: Fig
31d0: 75 72 65 20 6f 75 74 20 74 68 65 20 62 61 73 65  ure out the base
31e0: 20 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65   directory where
31f0: 20 61 6c 6c 20 74 68 65 20 62 75 69 6c 64 73 20   all the builds 
3200: 73 68 6f 75 6c 64 20 62 65 0d 0a 20 20 20 20 20  should be..     
3210: 20 23 20 20 20 20 20 20 20 6c 6f 63 61 74 65 64   #       located
3220: 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20  .  This will be 
3230: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68  the directory th
3240: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
3250: 61 63 74 75 61 6c 0d 0a 20 20 20 20 20 20 23 20  actual..      # 
3260: 20 20 20 20 20 20 62 75 69 6c 64 20 6f 75 74 70        build outp
3270: 75 74 20 64 69 72 65 63 74 6f 72 79 20 28 65 2e  ut directory (e.
3280: 67 2e 20 70 61 72 65 6e 74 20 6f 66 20 22 62 69  g. parent of "bi
3290: 6e 22 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  n")...      #.. 
32a0: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
32b0: 78 69 73 74 73 20 3a 3a 62 75 69 6c 64 5f 62 61  xists ::build_ba
32c0: 73 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26  se_directory] &&
32d0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
32e0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
32f0: 62 75 69 6c 64 5f 62 61 73 65 5f 64 69 72 65 63  build_base_direc
3300: 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20  tory] > 0} then 
3310: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
3320: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
3330: 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  e location of th
3340: 65 20 62 75 69 6c 64 20 62 61 73 65 20 64 69 72  e build base dir
3350: 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
3360: 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20  overridden;..   
3370: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
3380: 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 76  refore, use it v
3390: 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20  erbatim...      
33a0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
33b0: 75 72 6e 20 24 3a 3a 62 75 69 6c 64 5f 62 61 73  urn $::build_bas
33c0: 65 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  e_directory..   
33d0: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e     } elseif {[in
33e0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f 6d 6d  fo exists ::comm
33f0: 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26  on_directory] &&
3400: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
3410: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
3420: 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79  common_directory
3430: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
3440: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
3450: 20 20 23 20 4e 4f 54 45 3a 20 4e 65 78 74 2c 20    # NOTE: Next, 
3460: 66 61 6c 6c 62 61 63 6b 20 74 6f 20 74 68 65 20  fallback to the 
3470: 67 72 61 6e 64 70 61 72 65 6e 74 20 64 69 72 65  grandparent dire
3480: 63 74 6f 72 79 20 6f 66 20 74 68 65 20 6f 6e 65  ctory of the one
3490: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
34a0: 20 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69    containing thi
34b0: 73 20 66 69 6c 65 20 28 69 2e 65 2e 20 22 63 6f  s file (i.e. "co
34c0: 6d 6d 6f 6e 2e 65 61 67 6c 65 22 29 2c 20 69 66  mmon.eagle"), if
34d0: 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20   available...   
34e0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
34f0: 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 64 69 72  return [file dir
3500: 6e 61 6d 65 20 5b 66 69 6c 65 20 64 69 72 6e 61  name [file dirna
3510: 6d 65 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72  me $::common_dir
3520: 65 63 74 6f 72 79 5d 5d 0d 0a 20 20 20 20 20 20  ectory]]..      
3530: 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20  } elseif {[info 
3540: 65 78 69 73 74 73 20 3a 3a 70 61 74 68 5d 20 26  exists ::path] &
3550: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
3560: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
3570: 3a 70 61 74 68 5d 20 3e 20 30 7d 20 74 68 65 6e  :path] > 0} then
3580: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
3590: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46         # NOTE: F
35a0: 69 6e 61 6c 6c 79 2c 20 66 61 6c 6c 62 61 63 6b  inally, fallback
35b0: 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 64   to the parent d
35c0: 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20  irectory of the 
35d0: 45 61 67 6c 65 54 65 73 74 0d 0a 20 20 20 20 20  EagleTest..     
35e0: 20 20 20 23 20 20 20 20 20 20 20 70 61 74 68 2e     #       path.
35f0: 20 20 54 68 65 20 45 61 67 6c 65 54 65 73 74 20    The EagleTest 
3600: 70 61 63 6b 61 67 65 20 67 75 61 72 61 6e 74 65  package guarante
3610: 65 73 20 74 68 61 74 20 74 68 69 73 20 76 61 72  es that this var
3620: 69 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 23  iable..        #
3630: 20 20 20 20 20 20 20 77 69 6c 6c 20 62 65 20 73         will be s
3640: 65 74 20 74 6f 20 74 68 65 20 64 69 72 65 63 74  et to the direct
3650: 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ory containing t
3660: 68 65 20 66 69 72 73 74 20 66 69 6c 65 20 74 6f  he first file to
3670: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
3680: 20 20 65 78 65 63 75 74 65 20 74 68 65 20 5b 72    execute the [r
3690: 75 6e 54 65 73 74 50 72 6f 6c 6f 67 75 65 5d 20  unTestPrologue] 
36a0: 73 63 72 69 70 74 20 6c 69 62 72 61 72 79 20 70  script library p
36b0: 72 6f 63 65 64 75 72 65 2e 0d 0a 20 20 20 20 20  rocedure...     
36c0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
36d0: 74 75 72 6e 20 5b 66 69 6c 65 20 64 69 72 6e 61  turn [file dirna
36e0: 6d 65 20 24 3a 3a 70 61 74 68 5d 0d 0a 20 20 20  me $::path]..   
36f0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
3700: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
3710: 23 20 4e 4f 54 45 3a 20 4e 6f 20 70 61 74 68 20  # NOTE: No path 
3720: 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65  is available, re
3730: 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74  turn an empty st
3740: 72 69 6e 67 2e 20 20 54 68 69 73 20 70 6f 69 6e  ring.  This poin
3750: 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
3760: 20 20 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65     should not be
3770: 20 72 65 61 63 68 65 64 2e 0d 0a 20 20 20 20 20   reached...     
3780: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
3790: 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 20 20 7d  turn ""..      }
37a0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
37b0: 70 72 6f 63 20 67 65 74 53 51 4c 69 74 65 54 65  proc getSQLiteTe
37c0: 73 74 44 61 74 61 50 61 74 68 20 7b 7d 20 7b 0d  stDataPath {} {.
37d0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
37e0: 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f  # NOTE: Figure o
37f0: 75 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ut the directory
3800: 20 77 68 65 72 65 20 61 6c 6c 20 74 68 65 20 74   where all the t
3810: 65 73 74 20 64 61 74 61 20 66 69 6c 65 73 20 73  est data files s
3820: 68 6f 75 6c 64 0d 0a 20 20 20 20 20 20 23 20 20  hould..      #  
3830: 20 20 20 20 20 62 65 20 6c 6f 63 61 74 65 64 2e       be located.
3840: 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65    This should be
3850: 20 74 68 65 20 22 64 61 74 61 22 20 64 69 72 65   the "data" dire
3860: 63 74 6f 72 79 20 62 65 6e 65 61 74 68 20 74 68  ctory beneath th
3870: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
3880: 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61   directory conta
3890: 69 6e 69 6e 67 20 74 68 65 20 61 63 74 75 61 6c  ining the actual
38a0: 20 74 65 73 74 20 73 63 72 69 70 74 73 2e 0d 0a   test scripts...
38b0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72        #..      r
38c0: 65 74 75 72 6e 20 5b 66 69 6c 65 20 6a 6f 69 6e  eturn [file join
38d0: 20 24 3a 3a 70 61 74 68 20 64 61 74 61 5d 0d 0a   $::path data]..
38e0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
38f0: 6f 63 20 69 73 52 75 6e 6e 69 6e 67 57 6f 57 36  oc isRunningWoW6
3900: 34 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  4 {} {..      #.
3910: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46  .      # NOTE: F
3920: 6f 72 20 6e 6f 77 2c 20 6a 75 73 74 20 75 73 65  or now, just use
3930: 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 74 65   the existing te
3940: 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 6f  st constraint fo
3950: 72 20 64 65 74 65 63 74 69 6e 67 0d 0a 20 20 20  r detecting..   
3960: 20 20 20 23 20 20 20 20 20 20 20 61 20 57 6f 57     #       a WoW
3970: 36 34 20 70 72 6f 63 65 73 73 2e 0d 0a 20 20 20  64 process...   
3980: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
3990: 72 6e 20 5b 68 61 76 65 43 6f 6e 73 74 72 61 69  rn [haveConstrai
39a0: 6e 74 20 77 6f 77 36 34 5d 0d 0a 20 20 20 20 7d  nt wow64]..    }
39b0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73  .....    proc is
39c0: 4d 69 78 65 64 4d 6f 64 65 41 73 73 65 6d 62 6c  MixedModeAssembl
39d0: 79 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 76 61  y { fileName {va
39e0: 72 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20  rName ""} } {.. 
39f0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
3a00: 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20 6d 61 6b  NOTE: First, mak
3a10: 65 20 73 75 72 65 20 74 68 65 20 74 65 73 74 20  e sure the test 
3a20: 73 75 69 74 65 20 69 6e 66 72 61 73 74 72 75 63  suite infrastruc
3a30: 74 75 72 65 20 69 73 20 61 6c 6c 6f 77 65 64 20  ture is allowed 
3a40: 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  to..      #     
3a50: 20 20 75 73 65 20 74 68 65 20 5b 65 78 65 63 5d    use the [exec]
3a60: 20 63 6f 6d 6d 61 6e 64 2e 0d 0a 20 20 20 20 20   command...     
3a70: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b   #..      if {![
3a80: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
3a90: 28 65 78 65 63 29 5d 20 26 26 20 21 5b 69 6e 66  (exec)] && ![inf
3aa0: 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f  o exists ::no(co
3ab0: 72 46 6c 61 67 73 29 5d 7d 20 74 68 65 6e 20 7b  rFlags)]} then {
3ac0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
3ad0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
3ae0: 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  the location of 
3af0: 43 6f 72 46 6c 61 67 73 20 69 73 20 70 72 65 73  CorFlags is pres
3b00: 65 6e 74 20 69 6e 20 74 68 65 20 65 6e 76 69 72  ent in the envir
3b10: 6f 6e 6d 65 6e 74 2c 0d 0a 20 20 20 20 20 20 20  onment,..       
3b20: 20 23 20 20 20 20 20 20 20 75 73 65 20 69 74 3b   #       use it;
3b30: 20 6f 74 68 65 72 77 69 73 65 20 61 73 73 75 6d   otherwise assum
3b40: 65 20 69 74 20 69 73 20 69 6e 20 74 68 65 20 50  e it is in the P
3b50: 41 54 48 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ATH...        #.
3b60: 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 72  .        set cor
3b70: 46 6c 61 67 73 20 5b 65 78 70 72 20 7b 0d 0a 20  Flags [expr {.. 
3b80: 20 20 20 20 20 20 20 20 20 5b 69 6e 66 6f 20 65           [info e
3b90: 78 69 73 74 73 20 3a 3a 65 6e 76 28 43 6f 72 46  xists ::env(CorF
3ba0: 6c 61 67 73 29 5d 20 3f 20 24 3a 3a 65 6e 76 28  lags)] ? $::env(
3bb0: 43 6f 72 46 6c 61 67 73 29 20 3a 20 22 43 6f 72  CorFlags) : "Cor
3bc0: 46 6c 61 67 73 22 0d 0a 20 20 20 20 20 20 20 20  Flags"..        
3bd0: 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  }]....        #.
3be0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
3bf0: 20 41 74 74 65 6d 70 74 20 74 6f 20 65 78 65 63   Attempt to exec
3c00: 75 74 65 20 43 6f 72 46 6c 61 67 73 20 6f 6e 20  ute CorFlags on 
3c10: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
3c20: 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  le...        #..
3c30: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
3c40: 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
3c50: 65 78 65 63 20 2d 2d 20 24 63 6f 72 46 6c 61 67  exec -- $corFlag
3c60: 73 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  s [file nativena
3c70: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20  me $fileName].. 
3c80: 20 20 20 20 20 20 20 7d 20 65 78 65 63 5d 20 3d         } exec] =
3c90: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
3ca0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
3cb0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 72      # NOTE: If r
3cc0: 65 71 75 65 73 74 65 64 20 62 79 20 6f 75 72 20  equested by our 
3cd0: 63 61 6c 6c 65 72 2c 20 61 74 74 65 6d 70 74 20  caller, attempt 
3ce0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
3cf0: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
3d00: 20 20 20 20 70 6c 61 74 66 6f 72 6d 20 66 6f 72      platform for
3d10: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
3d20: 69 6c 65 20 61 73 20 77 65 6c 6c 2e 0d 0a 20 20  ile as well...  
3d30: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
3d40: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
3d50: 20 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d 65   length $varName
3d60: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
3d70: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
3d80: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
3d90: 3a 20 53 74 6f 72 65 20 74 68 65 20 70 6c 61 74  : Store the plat
3da0: 66 6f 72 6d 20 69 6e 20 74 68 65 20 6e 61 6d 65  form in the name
3db0: 64 20 76 61 72 69 61 62 6c 65 20 69 6e 20 74 68  d variable in th
3dc0: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  e..            #
3dd0: 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 20 6f         context o
3de0: 66 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20  f our caller... 
3df0: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
3e00: 20 20 20 20 20 20 20 20 20 20 75 70 76 61 72 20            upvar 
3e10: 31 20 24 76 61 72 4e 61 6d 65 20 70 6c 61 74 66  1 $varName platf
3e20: 6f 72 6d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  orm....         
3e30: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
3e40: 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
3e50: 74 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65  t to extract the
3e60: 20 50 45 20 6c 69 6e 65 20 66 72 6f 6d 20 74 68   PE line from th
3e70: 65 20 63 61 70 74 75 72 65 64 0d 0a 20 20 20 20  e captured..    
3e80: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
3e90: 6f 75 74 70 75 74 2e 20 20 49 66 20 74 68 69 73  output.  If this
3ea0: 20 76 61 6c 75 65 20 69 73 20 22 50 45 33 32 22   value is "PE32"
3eb0: 20 6f 72 20 22 50 45 33 32 2b 22 2c 20 74 68 65   or "PE32+", the
3ec0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
3ed0: 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 20 66        assembly f
3ee0: 69 6c 65 20 69 73 20 33 32 2d 62 69 74 20 6f 72  ile is 32-bit or
3ef0: 20 36 34 2d 62 69 74 2c 20 72 65 73 70 65 63 74   64-bit, respect
3f00: 69 76 65 6c 79 3b 0d 0a 20 20 20 20 20 20 20 20  ively;..        
3f10: 20 20 20 20 23 20 20 20 20 20 20 20 6f 74 68 65      #       othe
3f20: 72 77 69 73 65 2c 20 69 74 73 20 74 79 70 65 20  rwise, its type 
3f30: 69 73 20 75 6e 6b 6e 6f 77 6e 2e 0d 0a 20 20 20  is unknown...   
3f40: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
3f50: 20 20 20 20 20 20 20 20 73 65 74 20 70 61 74 74          set patt
3f60: 65 72 6e 20 7b 5e 50 45 20 20 20 20 20 20 20 20  ern {^PE        
3f70: 3a 20 28 50 45 33 32 7c 50 45 33 32 5c 2b 29 5c  : (PE32|PE32\+)\
3f80: 73 2b 24 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  s+$}....        
3f90: 20 20 20 20 69 66 20 7b 5b 72 65 67 65 78 70 20      if {[regexp 
3fa0: 2d 6c 69 6e 65 20 2d 2d 20 24 70 61 74 74 65 72  -line -- $patter
3fb0: 6e 20 24 65 78 65 63 20 64 75 6d 6d 79 20 70 65  n $exec dummy pe
3fc0: 33 32 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  32]} then {..   
3fd0: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
3fe0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 48 41              # HA
3ff0: 43 4b 3a 20 54 68 69 73 20 5b 73 77 69 74 63 68  CK: This [switch
4000: 5d 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 33  ] assumes that 3
4010: 32 2d 62 69 74 20 65 78 65 63 75 74 61 62 6c 65  2-bit executable
4020: 73 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20 20  s are..         
4030: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6c 77       #       alw
4040: 61 79 73 20 78 38 36 20 61 6e 64 20 74 68 61 74  ays x86 and that
4050: 20 36 34 2d 62 69 74 20 65 78 65 63 75 74 61 62   64-bit executab
4060: 6c 65 73 20 61 72 65 20 61 6c 77 61 79 73 0d 0a  les are always..
4070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
4080: 20 20 20 20 20 20 78 36 34 2e 0d 0a 20 20 20 20        x64...    
4090: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
40a0: 20 20 20 20 20 20 20 20 20 20 20 73 77 69 74 63             switc
40b0: 68 20 2d 65 78 61 63 74 20 2d 2d 20 24 70 65 33  h -exact -- $pe3
40c0: 32 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  2 {..           
40d0: 20 20 20 20 20 50 45 33 32 20 7b 0d 0a 20 20 20       PE32 {..   
40e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
40f0: 65 74 20 70 6c 61 74 66 6f 72 6d 20 57 69 6e 33  et platform Win3
4100: 32 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2..             
4110: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
4120: 20 20 20 20 20 20 50 45 33 32 2b 20 7b 0d 0a 20        PE32+ {.. 
4130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4140: 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 78 36   set platform x6
4150: 34 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  4..             
4160: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
4170: 20 20 20 20 20 20 64 65 66 61 75 6c 74 20 7b 0d        default {.
4180: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4190: 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20     set platform 
41a0: 22 22 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ""..            
41b0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
41c0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
41d0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
41e0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
41f0: 70 6c 61 74 66 6f 72 6d 20 22 22 0d 0a 20 20 20  platform ""..   
4200: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
4210: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
4220: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4230: 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
4240: 74 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65  t to extract the
4250: 20 49 4c 4f 4e 4c 59 20 6c 69 6e 65 20 66 72 6f   ILONLY line fro
4260: 6d 20 74 68 65 20 63 61 70 74 75 72 65 64 0d 0a  m the captured..
4270: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
4280: 20 20 6f 75 74 70 75 74 2e 20 20 49 66 20 74 68    output.  If th
4290: 69 73 20 76 61 6c 75 65 20 69 73 20 7a 65 72 6f  is value is zero
42a0: 2c 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  , the specified 
42b0: 66 69 6c 65 20 6d 75 73 74 0d 0a 20 20 20 20 20  file must..     
42c0: 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65 20       #       be 
42d0: 61 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73  a mixed-mode ass
42e0: 65 6d 62 6c 79 3b 20 6f 74 68 65 72 77 69 73 65  embly; otherwise
42f0: 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  , it contains on
4300: 6c 79 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  ly..          # 
4310: 20 20 20 20 20 20 6d 61 6e 61 67 65 64 20 63 6f        managed co
4320: 6d 70 6f 6e 65 6e 74 73 2e 0d 0a 20 20 20 20 20  mponents...     
4330: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4340: 20 20 73 65 74 20 70 61 74 74 65 72 6e 20 7b 5e    set pattern {^
4350: 49 4c 4f 4e 4c 59 20 20 20 20 3a 20 28 30 7c 31  ILONLY    : (0|1
4360: 29 5c 73 2b 24 7d 0d 0a 0d 0a 20 20 20 20 20 20  )\s+$}....      
4370: 20 20 20 20 69 66 20 7b 21 5b 72 65 67 65 78 70      if {![regexp
4380: 20 2d 6c 69 6e 65 20 2d 2d 20 24 70 61 74 74 65   -line -- $patte
4390: 72 6e 20 24 65 78 65 63 20 64 75 6d 6d 79 20 69  rn $exec dummy i
43a0: 6c 4f 6e 6c 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  lOnly]} then {..
43b0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
43c0: 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20  rn false..      
43d0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
43e0: 20 20 20 69 66 20 7b 21 24 69 6c 4f 6e 6c 79 7d     if {!$ilOnly}
43f0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
4400: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
4410: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
4420: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
4430: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
4440: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74      # NOTE: If t
4450: 68 65 20 74 65 73 74 20 73 75 69 74 65 20 63 61  he test suite ca
4460: 6e 6e 6f 74 20 75 73 65 20 5b 65 78 65 63 5d 20  nnot use [exec] 
4470: 6f 72 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  or execution of 
4480: 43 6f 72 46 6c 61 67 73 0d 0a 20 20 20 20 20 20  CorFlags..      
4490: 23 20 20 20 20 20 20 20 66 61 69 6c 65 64 2c 20  #       failed, 
44a0: 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 0d 0a 20  return false... 
44b0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
44c0: 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20  turn false..    
44d0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69  }.....    proc i
44e0: 73 42 75 69 6c 64 41 76 61 69 6c 61 62 6c 65 20  sBuildAvailable 
44f0: 7b 20 6e 61 74 69 76 65 20 64 69 72 65 63 74 6f  { native directo
4500: 72 79 20 7b 76 61 72 4e 61 6d 65 20 22 22 7d 20  ry {varName ""} 
4510: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
4520: 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c      # NOTE: Buil
4530: 64 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c  d the fully qual
4540: 69 66 69 65 64 20 66 69 6c 65 20 6e 61 6d 65 20  ified file name 
4550: 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79 20  for the primary 
4560: 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20  assembly..      
4570: 23 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 69  #       containi
4580: 6e 67 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61  ng the System.Da
4590: 74 61 2e 53 51 4c 69 74 65 20 6d 61 6e 61 67 65  ta.SQLite manage
45a0: 64 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e 20 20 49  d components.  I
45b0: 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  t..      #      
45c0: 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 74 65 64   should be noted
45d0: 20 74 68 61 74 20 74 68 69 73 20 61 73 73 65 6d   that this assem
45e0: 62 6c 79 20 66 69 6c 65 20 6d 61 79 20 61 6c 73  bly file may als
45f0: 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 0d 0a 20  o contain the.. 
4600: 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 74       #       nat
4610: 69 76 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 2c 20  ive components, 
4620: 69 66 20 61 20 6e 61 74 69 76 65 20 62 75 69 6c  if a native buil
4630: 64 20 69 73 20 69 6e 20 75 73 65 2e 0d 0a 20 20  d is in use...  
4640: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
4650: 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20   fileName [file 
4660: 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
4670: 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79   join $directory
4680: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 53 79   \..          Sy
4690: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
46a0: 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  .dll]]....      
46b0: 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74  if {![file exist
46c0: 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  s $fileName]} th
46d0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
46e0: 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20  turn false..    
46f0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
4700: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74        # NOTE: At
4710: 74 65 6d 70 74 20 74 6f 20 61 75 74 6f 6d 61 74  tempt to automat
4720: 69 63 61 6c 6c 79 20 64 65 74 65 63 74 20 69 66  ically detect if
4730: 20 74 68 65 20 70 72 69 6d 61 72 79 20 61 73 73   the primary ass
4740: 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 23 20 20  embly..      #  
4750: 20 20 20 20 20 63 6f 6e 74 61 69 6e 73 20 61 6e       contains an
4760: 79 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e 65  y native compone
4770: 6e 74 73 2c 20 69 66 20 6e 65 63 65 73 73 61 72  nts, if necessar
4780: 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  y...      #..   
4790: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
47a0: 65 6e 67 74 68 20 24 6e 61 74 69 76 65 5d 20 3d  ength $native] =
47b0: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
47c0: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
47d0: 20 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d 65   length $varName
47e0: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
47f0: 20 20 20 20 20 20 20 20 20 75 70 76 61 72 20 31           upvar 1
4800: 20 24 76 61 72 4e 61 6d 65 20 24 76 61 72 4e 61   $varName $varNa
4810: 6d 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  me..        }...
4820: 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 61 74  .        set nat
4830: 69 76 65 20 5b 69 73 4d 69 78 65 64 4d 6f 64 65  ive [isMixedMode
4840: 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61  Assembly $fileNa
4850: 6d 65 20 24 76 61 72 4e 61 6d 65 5d 0d 0a 20 20  me $varName]..  
4860: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
4870: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
4880: 49 66 20 74 68 65 20 70 72 69 6d 61 72 79 20 61  If the primary a
4890: 73 73 65 6d 62 6c 79 20 61 6c 73 6f 20 63 6f 6e  ssembly also con
48a0: 74 61 69 6e 73 20 74 68 65 20 6e 61 74 69 76 65  tains the native
48b0: 20 63 6f 6d 70 6f 6e 65 6e 74 73 2c 0d 0a 20 20   components,..  
48c0: 20 20 20 20 23 20 20 20 20 20 20 20 77 65 20 68      #       we h
48d0: 61 76 65 20 65 76 65 72 79 74 68 69 6e 67 20 77  ave everything w
48e0: 65 20 6e 65 65 64 2e 0d 0a 20 20 20 20 20 20 23  e need...      #
48f0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 6e 61 74  ..      if {$nat
4900: 69 76 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ive} then {..   
4910: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
4920: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
4930: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
4940: 54 45 3a 20 57 68 61 74 20 69 73 20 74 68 65 20  TE: What is the 
4950: 61 72 63 68 69 74 65 63 74 75 72 65 20 66 6f 72  architecture for
4960: 20 74 68 69 73 20 6d 61 63 68 69 6e 65 3f 0d 0a   this machine?..
4970: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73        #..      s
4980: 65 74 20 61 72 63 68 69 74 65 63 74 75 72 65 20  et architecture 
4990: 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74 66 6f  [machineToPlatfo
49a0: 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f  rm $::tcl_platfo
49b0: 72 6d 28 6d 61 63 68 69 6e 65 29 20 74 72 75 65  rm(machine) true
49c0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ]....      #..  
49d0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 68 61 74      # NOTE: What
49e0: 20 69 73 20 74 68 65 20 70 6c 61 74 66 6f 72 6d   is the platform
49f0: 20 66 6f 72 20 74 68 69 73 20 6d 61 63 68 69 6e   for this machin
4a00: 65 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e?..      #..   
4a10: 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20     set platform 
4a20: 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74 66 6f  [machineToPlatfo
4a30: 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f  rm $::tcl_platfo
4a40: 72 6d 28 6d 61 63 68 69 6e 65 29 5d 0d 0a 0d 0a  rm(machine)]....
4a50: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
4a60: 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65   NOTE: Build the
4a70: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
4a80: 20 66 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 74   file name for t
4a90: 68 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d  he interop assem
4aa0: 62 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  bly..      #    
4ab0: 20 20 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68     containing th
4ac0: 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  e System.Data.SQ
4ad0: 4c 69 74 65 20 6e 61 74 69 76 65 20 63 6f 6d 70  Lite native comp
4ae0: 6f 6e 65 6e 74 73 2e 20 20 49 66 20 74 68 69 73  onents.  If this
4af0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
4b00: 66 69 6c 65 20 65 78 69 73 74 73 2c 20 77 65 20  file exists, we 
4b10: 73 68 6f 75 6c 64 20 68 61 76 65 20 65 76 65 72  should have ever
4b20: 79 74 68 69 6e 67 20 77 65 20 6e 65 65 64 2e 0d  ything we need..
4b30: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
4b40: 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69  set fileName [fi
4b50: 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
4b60: 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74  ile join $direct
4b70: 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ory \..         
4b80: 20 24 61 72 63 68 69 74 65 63 74 75 72 65 20 53   $architecture S
4b90: 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c  QLite.Interop.dl
4ba0: 6c 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  l]]....      if 
4bb0: 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66  {[file exists $f
4bc0: 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
4bd0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
4be0: 20 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a   true..      }..
4bf0: 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65  ..      set file
4c00: 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  Name [file nativ
4c10: 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
4c20: 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20   $directory \.. 
4c30: 20 20 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f           $platfo
4c40: 72 6d 20 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f  rm SQLite.Intero
4c50: 70 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20 20 20  p.dll]]....     
4c60: 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74   if {[file exist
4c70: 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  s $fileName]} th
4c80: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
4c90: 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20  turn true..     
4ca0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20   }....      set 
4cb0: 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e  fileName [file n
4cc0: 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
4cd0: 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20  join $directory 
4ce0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c  \..          SQL
4cf0: 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 5d  ite.Interop.dll]
4d00: 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  ]....      if {[
4d10: 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c  file exists $fil
4d20: 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
4d30: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
4d40: 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  rue..      }....
4d50: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
4d60: 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65   NOTE: Build the
4d70: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
4d80: 20 66 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 74   file name for t
4d90: 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 0d 0a  he SQLite core..
4da0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6c 69        #       li
4db0: 62 72 61 72 79 2e 20 20 49 66 20 74 68 69 73 20  brary.  If this 
4dc0: 66 69 6c 65 20 65 78 69 73 74 73 2c 20 77 65 20  file exists, we 
4dd0: 73 68 6f 75 6c 64 20 68 61 76 65 20 65 76 65 72  should have ever
4de0: 79 74 68 69 6e 67 20 77 65 0d 0a 20 20 20 20 20  ything we..     
4df0: 20 23 20 20 20 20 20 20 20 6e 65 65 64 2e 0d 0a   #       need...
4e00: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73        #..      s
4e10: 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c  et fileName [fil
4e20: 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69  e nativename [fi
4e30: 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f  le join $directo
4e40: 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ry \..          
4e50: 24 61 72 63 68 69 74 65 63 74 75 72 65 20 73 71  $architecture sq
4e60: 6c 69 74 65 33 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20  lite3.dll]].... 
4e70: 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65       if {[file e
4e80: 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d  xists $fileName]
4e90: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
4ea0: 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20    return true.. 
4eb0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
4ec0: 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69  set fileName [fi
4ed0: 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
4ee0: 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74  ile join $direct
4ef0: 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ory \..         
4f00: 20 24 70 6c 61 74 66 6f 72 6d 20 73 71 6c 69 74   $platform sqlit
4f10: 65 33 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20 20  e3.dll]]....    
4f20: 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73    if {[file exis
4f30: 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74  ts $fileName]} t
4f40: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
4f50: 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20  eturn true..    
4f60: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74    }....      set
4f70: 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20   fileName [file 
4f80: 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
4f90: 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79   join $directory
4fa0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 73 71   \..          sq
4fb0: 6c 69 74 65 33 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20  lite3.dll]].... 
4fc0: 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65       if {[file e
4fd0: 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d  xists $fileName]
4fe0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
4ff0: 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20    return true.. 
5000: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
5010: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
5020: 20 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 6e 61 74   One or more nat
5030: 69 76 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 6e  ive components n
5040: 65 65 64 65 64 20 62 79 20 53 79 73 74 65 6d 2e  eeded by System.
5050: 44 61 74 61 2e 53 51 4c 69 74 65 0d 0a 20 20 20  Data.SQLite..   
5060: 20 20 20 23 20 20 20 20 20 20 20 61 72 65 20 6d     #       are m
5070: 69 73 73 69 6e 67 2e 0d 0a 20 20 20 20 20 20 23  issing...      #
5080: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 66  ..      return f
5090: 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  alse..    }.....
50a0: 20 20 20 20 70 72 6f 63 20 69 73 52 65 6c 65 61      proc isRelea
50b0: 73 65 41 76 61 69 6c 61 62 6c 65 20 7b 20 64 69  seAvailable { di
50c0: 72 65 63 74 6f 72 79 20 7b 76 61 72 4e 61 6d 65  rectory {varName
50d0: 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20   ""} } {..      
50e0: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
50f0: 74 68 20 24 76 61 72 4e 61 6d 65 5d 20 3e 20 30  th $varName] > 0
5100: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
5110: 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
5120: 6d 65 20 24 76 61 72 4e 61 6d 65 0d 0a 20 20 20  me $varName..   
5130: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
5140: 74 75 72 6e 20 5b 69 73 42 75 69 6c 64 41 76 61  turn [isBuildAva
5150: 69 6c 61 62 6c 65 20 22 22 20 24 64 69 72 65 63  ilable "" $direc
5160: 74 6f 72 79 20 24 76 61 72 4e 61 6d 65 5d 0d 0a  tory $varName]..
5170: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
5180: 6f 63 20 6a 6f 69 6e 42 75 69 6c 64 44 69 72 65  oc joinBuildDire
5190: 63 74 6f 72 79 20 7b 20 6e 61 74 69 76 65 20 70  ctory { native p
51a0: 61 74 68 20 79 65 61 72 20 70 6c 61 74 66 6f 72  ath year platfor
51b0: 6d 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  m configuration 
51c0: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
51d0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75      # NOTE: Figu
51e0: 72 65 20 6f 75 74 20 61 6e 64 20 74 68 65 6e 20  re out and then 
51f0: 72 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 79  return the fully
5200: 20 71 75 61 6c 69 66 69 65 64 20 70 61 74 68 20   qualified path 
5210: 74 6f 20 74 68 65 20 62 75 69 6c 64 0d 0a 20 20  to the build..  
5220: 20 20 20 20 23 20 20 20 20 20 20 20 64 69 72 65      #       dire
5230: 63 74 6f 72 79 20 62 61 73 65 64 20 6f 6e 20 61  ctory based on a
5240: 6c 6c 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73  ll the arguments
5250: 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72   provided by our
5260: 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20   caller...      
5270: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 6e 61  #..      if {$na
5280: 74 69 76 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  tive} then {..  
5290: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69        return [fi
52a0: 6c 65 20 6a 6f 69 6e 20 24 70 61 74 68 20 62 69  le join $path bi
52b0: 6e 20 24 79 65 61 72 20 24 70 6c 61 74 66 6f 72  n $year $platfor
52c0: 6d 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  m $configuration
52d0: 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
52e0: 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
52f0: 6e 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 70 61  n [file join $pa
5300: 74 68 20 62 69 6e 20 24 79 65 61 72 20 24 63 6f  th bin $year $co
5310: 6e 66 69 67 75 72 61 74 69 6f 6e 20 62 69 6e 5d  nfiguration bin]
5320: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
5330: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
5340: 74 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79 20  tBuildDirectory 
5350: 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
5360: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 65       # NOTE: See
5370: 20 69 66 20 74 68 65 20 22 6e 61 74 69 76 65 22   if the "native"
5380: 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 20   runtime option 
5390: 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20 49  has been set.  I
53a0: 66 20 73 6f 2c 20 75 73 65 20 74 68 65 0d 0a 20  f so, use the.. 
53b0: 20 20 20 20 20 23 20 20 20 20 20 20 20 64 69 72       #       dir
53c0: 65 63 74 6f 72 79 20 66 6f 72 20 74 68 65 20 6d  ectory for the m
53d0: 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62  ixed-mode assemb
53e0: 6c 79 20 28 61 2e 6b 2e 61 2e 20 74 68 65 20 6e  ly (a.k.a. the n
53f0: 61 74 69 76 65 20 69 6e 74 65 72 6f 70 0d 0a 20  ative interop.. 
5400: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 73 73       #       ass
5410: 65 6d 62 6c 79 29 2e 20 20 54 6f 20 65 6e 61 62  embly).  To enab
5420: 6c 65 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 76  le this option v
5430: 69 61 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c  ia the command l
5440: 69 6e 65 2c 20 65 6e 74 65 72 20 61 0d 0a 20 20  ine, enter a..  
5450: 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6d 6d      #       comm
5460: 61 6e 64 20 73 69 6d 69 6c 61 72 20 74 6f 20 6f  and similar to o
5470: 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
5480: 69 6e 67 20 28 61 6c 6c 20 6f 6e 20 6f 6e 65 20  ing (all on one 
5490: 6c 69 6e 65 29 3a 0d 0a 20 20 20 20 20 20 23 0d  line):..      #.
54a0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45  .      #       E
54b0: 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 69  agleShell.exe -i
54c0: 6e 69 74 69 61 6c 69 7a 65 20 2d 72 75 6e 74 69  nitialize -runti
54d0: 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65 0d  meOption native.
54e0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20  .      #        
54f0: 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f   -file .\path\to
5500: 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20  \all.eagle..    
5510: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20    #..      #    
5520: 20 20 20 54 6f 20 65 6e 61 62 6c 65 20 74 68 69     To enable thi
5530: 73 20 6f 70 74 69 6f 6e 20 76 69 61 20 74 68 65  s option via the
5540: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 70 72   command line pr
5550: 69 6f 72 20 74 6f 20 74 68 65 20 22 62 65 74 61  ior to the "beta
5560: 20 31 36 22 0d 0a 20 20 20 20 20 20 23 20 20 20   16"..      #   
5570: 20 20 20 20 72 65 6c 65 61 73 65 20 6f 66 20 45      release of E
5580: 61 67 6c 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  agle, the follow
5590: 69 6e 67 20 63 6f 6d 6d 61 6e 64 20 6d 75 73 74  ing command must
55a0: 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64   be used instead
55b0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
55c0: 28 61 6c 73 6f 20 61 6c 6c 20 6f 6e 20 6f 6e 65  (also all on one
55d0: 20 6c 69 6e 65 29 3a 0d 0a 20 20 20 20 20 20 23   line):..      #
55e0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
55f0: 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d  EagleShell.exe -
5600: 69 6e 69 74 69 61 6c 69 7a 65 20 2d 70 6f 73 74  initialize -post
5610: 49 6e 69 74 69 61 6c 69 7a 65 0d 0a 20 20 20 20  Initialize..    
5620: 20 20 23 20 20 20 20 20 20 20 20 20 22 6f 62 6a    #         "obj
5630: 65 63 74 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72  ect invoke Inter
5640: 70 72 65 74 65 72 2e 47 65 74 41 63 74 69 76 65  preter.GetActive
5650: 20 41 64 64 52 75 6e 74 69 6d 65 4f 70 74 69 6f   AddRuntimeOptio
5660: 6e 20 6e 61 74 69 76 65 22 0d 0a 20 20 20 20 20  n native"..     
5670: 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65   #         -file
5680: 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65   .\path\to\all.e
5690: 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20  agle..      #.. 
56a0: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
56b0: 78 69 73 74 73 20 3a 3a 62 75 69 6c 64 5f 64 69  xists ::build_di
56c0: 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20  rectory] && \.. 
56d0: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
56e0: 20 6c 65 6e 67 74 68 20 24 3a 3a 62 75 69 6c 64   length $::build
56f0: 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d  _directory] > 0}
5700: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
5710: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
5720: 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e  TE: The location
5730: 20 6f 66 20 74 68 65 20 62 75 69 6c 64 20 64 69   of the build di
5740: 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e  rectory has been
5750: 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20   overridden;..  
5760: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
5770: 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20  erefore, use it 
5780: 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20  verbatim...     
5790: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
57a0: 74 75 72 6e 20 24 3a 3a 62 75 69 6c 64 5f 64 69  turn $::build_di
57b0: 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d  rectory..      }
57c0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
57d0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
57e0: 54 45 3a 20 49 66 20 74 68 65 20 22 6e 61 74 69  TE: If the "nati
57f0: 76 65 22 20 72 75 6e 74 69 6d 65 20 6f 70 74 69  ve" runtime opti
5800: 6f 6e 20 69 73 20 73 65 74 2c 20 74 68 65 20 6d  on is set, the m
5810: 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62  ixed-mode assemb
5820: 6c 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ly..        #   
5830: 20 20 20 20 69 73 20 62 65 69 6e 67 20 74 65 73      is being tes
5840: 74 65 64 2e 20 20 49 6e 20 74 68 61 74 20 63 61  ted.  In that ca
5850: 73 65 2c 20 74 68 65 20 70 61 74 68 20 74 6f 20  se, the path to 
5860: 74 68 65 20 62 75 69 6c 64 20 64 69 72 65 63 74  the build direct
5870: 6f 72 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ory..        #  
5880: 20 20 20 20 20 77 69 6c 6c 20 63 6f 6e 74 61 69       will contai
5890: 6e 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 20 6e  n the platform n
58a0: 61 6d 65 20 61 6e 64 20 61 6c 6c 20 74 68 65 20  ame and all the 
58b0: 62 69 6e 61 72 69 65 73 20 75 6e 64 65 72 20 74  binaries under t
58c0: 65 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20  est..        #  
58d0: 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 70       should be p
58e0: 72 65 73 65 6e 74 20 69 6e 20 74 68 61 74 20 64  resent in that d
58f0: 69 72 65 63 74 6f 72 79 2e 20 20 49 66 20 74 68  irectory.  If th
5900: 65 20 22 6e 61 74 69 76 65 22 20 72 75 6e 74 69  e "native" runti
5910: 6d 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  me..        #   
5920: 20 20 20 20 6f 70 74 69 6f 6e 20 69 73 20 6e 6f      option is no
5930: 74 20 73 65 74 2c 20 74 68 65 20 62 75 69 6c 64  t set, the build
5940: 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c 6c 20   directory will 
5950: 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f  be considered to
5960: 20 62 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20   be..        #  
5970: 20 20 20 20 20 22 70 6c 61 74 66 6f 72 6d 2d 6e       "platform-n
5980: 65 75 74 72 61 6c 22 2c 20 77 69 74 68 20 74 68  eutral", with th
5990: 65 20 6e 6f 74 61 62 6c 65 20 65 78 63 65 70 74  e notable except
59a0: 69 6f 6e 20 6f 66 20 61 6e 79 20 6e 61 74 69 76  ion of any nativ
59b0: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
59c0: 20 20 20 61 73 73 65 6d 62 6c 79 20 28 65 2e 67     assembly (e.g
59d0: 2e 20 22 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f  . "SQLite.Intero
59e0: 70 2e 64 6c 6c 22 29 20 63 6f 70 69 65 64 20 74  p.dll") copied t
59f0: 68 65 72 65 20 64 75 72 69 6e 67 20 74 68 65 0d  here during the.
5a00: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
5a10: 20 62 75 69 6c 64 20 70 72 6f 63 65 73 73 20 69   build process i
5a20: 74 73 65 6c 66 2e 20 20 49 66 20 74 68 65 20 62  tself.  If the b
5a30: 75 69 6c 64 20 70 72 6f 63 65 73 73 20 73 6f 6d  uild process som
5a40: 65 68 6f 77 20 64 6f 65 73 20 6e 6f 74 0d 0a 20  ehow does not.. 
5a50: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
5a60: 6f 70 79 20 74 68 65 20 6e 61 74 69 76 65 20 61  opy the native a
5a70: 73 73 65 6d 62 6c 79 20 66 6f 72 20 74 68 69 73  ssembly for this
5a80: 20 70 6c 61 74 66 6f 72 6d 2c 20 6d 6f 73 74 20   platform, most 
5a90: 6f 66 20 74 68 65 20 74 65 73 74 73 0d 0a 20 20  of the tests..  
5aa0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e        #       in
5ab0: 20 74 68 65 20 73 75 69 74 65 20 77 69 6c 6c 20   the suite will 
5ac0: 73 69 6d 70 6c 79 20 62 65 20 73 6b 69 70 70 65  simply be skippe
5ad0: 64 2e 20 20 47 65 6e 65 72 61 6c 6c 79 20 73 70  d.  Generally sp
5ae0: 65 61 6b 69 6e 67 2c 20 74 68 65 72 65 0d 0a 20  eaking, there.. 
5af0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
5b00: 72 65 20 74 77 6f 20 77 61 79 73 20 74 6f 20 62  re two ways to b
5b10: 75 69 6c 64 20 74 68 65 20 62 69 6e 61 72 69 65  uild the binarie
5b20: 73 20 77 68 65 6e 20 70 72 65 70 61 72 69 6e 67  s when preparing
5b30: 20 74 6f 20 72 75 6e 20 74 68 65 0d 0a 20 20 20   to run the..   
5b40: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73       #       tes
5b50: 74 20 73 75 69 74 65 3a 0d 0a 20 20 20 20 20 20  t suite:..      
5b60: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20    #..        #  
5b70: 20 20 20 20 20 31 2e 20 42 75 69 6c 64 20 74 68       1. Build th
5b80: 65 20 73 65 70 61 72 61 74 65 20 6d 61 6e 61 67  e separate manag
5b90: 65 64 20 61 6e 64 20 6e 61 74 69 76 65 20 61 73  ed and native as
5ba0: 73 65 6d 62 6c 69 65 73 20 75 73 69 6e 67 20 73  semblies using s
5bb0: 6f 6d 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ome..        #  
5bc0: 20 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64 73          commands
5bd0: 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0d 0a 20 20   similar to:..  
5be0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
5bf0: 20 23 20 20 20 20 20 20 20 20 20 20 62 75 69 6c   #          buil
5c00: 64 2e 62 61 74 20 24 7b 43 6f 6e 66 69 67 75 72  d.bat ${Configur
5c10: 61 74 69 6f 6e 7d 4d 61 6e 61 67 65 64 4f 6e 6c  ation}ManagedOnl
5c20: 79 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 0d 0a 20  y ${Platform}.. 
5c30: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
5c40: 20 20 62 75 69 6c 64 2e 62 61 74 20 24 7b 43 6f    build.bat ${Co
5c50: 6e 66 69 67 75 72 61 74 69 6f 6e 7d 4e 61 74 69  nfiguration}Nati
5c60: 76 65 4f 6e 6c 79 20 24 7b 50 6c 61 74 66 6f 72  veOnly ${Platfor
5c70: 6d 7d 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  m}..        #.. 
5c80: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
5c90: 20 20 57 68 65 72 65 20 24 7b 43 6f 6e 66 69 67    Where ${Config
5ca0: 75 72 61 74 69 6f 6e 7d 20 69 73 20 65 69 74 68  uration} is eith
5cb0: 65 72 20 22 44 65 62 75 67 22 20 6f 72 20 22 52  er "Debug" or "R
5cc0: 65 6c 65 61 73 65 22 20 61 6e 64 0d 0a 20 20 20  elease" and..   
5cd0: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20       #          
5ce0: 24 7b 50 6c 61 74 66 6f 72 6d 7d 20 69 73 20 65  ${Platform} is e
5cf0: 69 74 68 65 72 20 22 57 69 6e 33 32 22 20 6f 72  ither "Win32" or
5d00: 20 22 78 36 34 22 2e 0d 0a 20 20 20 20 20 20 20   "x64"...       
5d10: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20   #..        #   
5d20: 20 20 20 20 32 2e 20 42 75 69 6c 64 20 74 68 65      2. Build the
5d30: 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65   mixed-mode asse
5d40: 6d 62 6c 79 20 75 73 69 6e 67 20 61 20 63 6f 6d  mbly using a com
5d50: 6d 61 6e 64 20 73 69 6d 69 6c 61 72 20 74 6f 3a  mand similar to:
5d60: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
5d70: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20       #          
5d80: 62 75 69 6c 64 2e 62 61 74 20 24 7b 43 6f 6e 66  build.bat ${Conf
5d90: 69 67 75 72 61 74 69 6f 6e 7d 20 24 7b 50 6c 61  iguration} ${Pla
5da0: 74 66 6f 72 6d 7d 0d 0a 20 20 20 20 20 20 20 20  tform}..        
5db0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  #..        #    
5dc0: 20 20 20 20 20 20 57 68 65 72 65 20 24 7b 43 6f        Where ${Co
5dd0: 6e 66 69 67 75 72 61 74 69 6f 6e 7d 20 69 73 20  nfiguration} is 
5de0: 65 69 74 68 65 72 20 22 44 65 62 75 67 22 20 6f  either "Debug" o
5df0: 72 20 22 52 65 6c 65 61 73 65 22 20 61 6e 64 0d  r "Release" and.
5e00: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
5e10: 20 20 20 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 20      ${Platform} 
5e20: 69 73 20 65 69 74 68 65 72 20 22 57 69 6e 33 32  is either "Win32
5e30: 22 20 6f 72 20 22 78 36 34 22 2e 20 20 49 66 20  " or "x64".  If 
5e40: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 0d  this command is.
5e50: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
5e60: 20 20 20 20 75 73 65 64 2c 20 76 61 72 69 6f 75      used, variou
5e70: 73 20 74 65 73 74 73 20 74 68 61 74 20 72 65 71  s tests that req
5e80: 75 69 72 65 20 73 75 70 70 6c 65 6d 65 6e 74 61  uire supplementa
5e90: 72 79 20 6d 61 6e 61 67 65 64 0d 0a 20 20 20 20  ry managed..    
5ea0: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 61      #          a
5eb0: 73 73 65 6d 62 6c 69 65 73 20 28 65 2e 67 2e 20  ssemblies (e.g. 
5ec0: 4c 49 4e 51 29 20 6d 61 79 20 62 65 20 73 6b 69  LINQ) may be ski
5ed0: 70 70 65 64 20 75 6e 6c 65 73 73 20 74 68 6f 73  pped unless thos
5ee0: 65 20 62 69 6e 61 72 69 65 73 0d 0a 20 20 20 20  e binaries..    
5ef0: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 61      #          a
5f00: 72 65 20 73 75 62 73 65 71 75 65 6e 74 6c 79 20  re subsequently 
5f10: 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20  copied into the 
5f20: 63 6f 72 72 65 63 74 20 64 69 72 65 63 74 6f 72  correct director
5f30: 79 20 28 69 2e 65 2e 20 62 79 0d 0a 20 20 20 20  y (i.e. by..    
5f40: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 22      #          "
5f50: 74 65 73 74 5f 61 6c 6c 2e 62 61 74 22 29 2e 0d  test_all.bat")..
5f60: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
5f70: 20 20 20 20 23 20 20 20 20 20 20 20 4e 6f 74 65      #       Note
5f80: 20 74 68 61 74 20 61 6c 6c 20 6f 66 20 74 68 65   that all of the
5f90: 20 62 75 69 6c 64 20 63 6f 6d 6d 61 6e 64 73 20   build commands 
5fa0: 61 62 6f 76 65 20 77 69 6c 6c 20 64 65 66 61 75  above will defau
5fb0: 6c 74 20 74 6f 20 75 73 69 6e 67 0d 0a 20 20 20  lt to using..   
5fc0: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
5fd0: 20 6c 61 74 65 73 74 20 76 65 72 73 69 6f 6e 20   latest version 
5fe0: 6f 66 20 4d 53 42 75 69 6c 64 20 61 76 61 69 6c  of MSBuild avail
5ff0: 61 62 6c 65 20 61 6e 64 20 74 68 65 20 22 74 65  able and the "te
6000: 73 74 5f 79 65 61 72 22 20 6d 61 79 0d 0a 20 20  st_year" may..  
6010: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 65        #       ne
6020: 65 64 20 74 6f 20 62 65 20 61 64 6a 75 73 74 65  ed to be adjuste
6030: 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 20 74 6f  d accordingly to
6040: 20 61 63 74 75 61 6c 6c 79 20 72 75 6e 20 74 68   actually run th
6050: 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20  e test suite... 
6060: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 52         #       R
6070: 65 66 65 72 20 74 6f 20 74 68 65 20 63 6f 6d 6d  efer to the comm
6080: 65 6e 74 73 20 69 6e 20 5b 67 65 74 42 75 69 6c  ents in [getBuil
6090: 64 59 65 61 72 5d 20 66 6f 72 20 6d 6f 72 65 20  dYear] for more 
60a0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 0d 0a  information on..
60b0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
60c0: 68 6f 77 20 74 6f 20 73 65 74 20 74 68 69 73 20  how to set this 
60d0: 76 61 72 69 61 62 6c 65 2e 0d 0a 20 20 20 20 20  variable...     
60e0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65     #..        se
60f0: 74 20 6e 61 74 69 76 65 20 5b 68 61 73 52 75 6e  t native [hasRun
6100: 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76  timeOption nativ
6110: 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72 65  e]....        re
6120: 74 75 72 6e 20 5b 6a 6f 69 6e 42 75 69 6c 64 44  turn [joinBuildD
6130: 69 72 65 63 74 6f 72 79 20 24 6e 61 74 69 76 65  irectory $native
6140: 20 5b 67 65 74 42 75 69 6c 64 42 61 73 65 44 69   [getBuildBaseDi
6150: 72 65 63 74 6f 72 79 5d 20 5c 0d 0a 20 20 20 20  rectory] \..    
6160: 20 20 20 20 20 20 20 20 5b 67 65 74 42 75 69 6c          [getBuil
6170: 64 59 65 61 72 5d 20 5b 67 65 74 42 75 69 6c 64  dYear] [getBuild
6180: 50 6c 61 74 66 6f 72 6d 20 24 6e 61 74 69 76 65  Platform $native
6190: 5d 20 5b 67 65 74 42 75 69 6c 64 43 6f 6e 66 69  ] [getBuildConfi
61a0: 67 75 72 61 74 69 6f 6e 5d 5d 0d 0a 20 20 20 20  guration]]..    
61b0: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
61c0: 20 20 20 70 72 6f 63 20 67 65 74 52 65 6c 65 61     proc getRelea
61d0: 73 65 56 65 72 73 69 6f 6e 20 7b 7d 20 7b 0d 0a  seVersion {} {..
61e0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
61f0: 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f 75   NOTE: Figure ou
6200: 74 20 74 68 65 20 72 65 6c 65 61 73 65 20 76 65  t the release ve
6210: 72 73 69 6f 6e 20 66 6f 72 20 75 73 65 20 77 69  rsion for use wi
6220: 74 68 20 74 68 65 20 62 75 69 6c 64 20 64 69 72  th the build dir
6230: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 23 20  ectory..      # 
6240: 20 20 20 20 20 20 77 68 65 6e 20 63 68 65 63 6b        when check
6250: 69 6e 67 20 66 6f 72 20 61 76 61 69 6c 61 62 6c  ing for availabl
6260: 65 20 72 65 6c 65 61 73 65 73 2e 0d 0a 20 20 20  e releases...   
6270: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
6280: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 72  [info exists ::r
6290: 65 6c 65 61 73 65 5f 76 65 72 73 69 6f 6e 5d 20  elease_version] 
62a0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
62b0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
62c0: 3a 3a 72 65 6c 65 61 73 65 5f 76 65 72 73 69 6f  ::release_versio
62d0: 6e 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  n] > 0} then {..
62e0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
62f0: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 72     # NOTE: The r
6300: 65 6c 65 61 73 65 20 76 65 72 73 69 6f 6e 20 68  elease version h
6310: 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64  as been overridd
6320: 65 6e 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 75  en; therefore, u
6330: 73 65 20 69 74 0d 0a 20 20 20 20 20 20 20 20 23  se it..        #
6340: 20 20 20 20 20 20 20 76 65 72 62 61 74 69 6d 2e         verbatim.
6350: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
6360: 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 72       return $::r
6370: 65 6c 65 61 73 65 5f 76 65 72 73 69 6f 6e 0d 0a  elease_version..
6380: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
6390: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
63a0: 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 20 72 65     # NOTE: No re
63b0: 6c 65 61 73 65 20 76 65 72 73 69 6f 6e 20 69 73  lease version is
63c0: 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 74 75   available, retu
63d0: 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  rn an empty stri
63e0: 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ng...        #  
63f0: 20 20 20 20 20 49 74 20 69 73 20 69 6d 70 6f 72       It is impor
6400: 74 61 6e 74 20 74 6f 20 72 65 74 75 72 6e 20 61  tant to return a
6410: 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20 68  n empty string h
6420: 65 72 65 20 62 65 63 61 75 73 65 20 74 68 65 0d  ere because the.
6430: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
6440: 20 72 65 73 75 6c 74 20 6f 66 20 74 68 69 73 20   result of this 
6450: 70 72 6f 63 65 64 75 72 65 20 6d 61 79 20 62 65  procedure may be
6460: 20 75 73 65 64 20 77 69 74 68 20 5b 66 69 6c 65   used with [file
6470: 20 6a 6f 69 6e 5d 2e 0d 0a 20 20 20 20 20 20 20   join]...       
6480: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
6490: 72 6e 20 22 22 0d 0a 20 20 20 20 20 20 7d 0d 0a  rn ""..      }..
64a0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
64b0: 6f 63 20 67 65 74 42 75 69 6c 64 46 69 6c 65 4e  oc getBuildFileN
64c0: 61 6d 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b  ame { fileName {
64d0: 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7d 20 7b  platform ""} } {
64e0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
64f0: 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 73   # NOTE: Returns
6500: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
6510: 69 6c 65 20 6e 61 6d 65 20 61 73 20 69 66 20 69  ile name as if i
6520: 74 20 77 65 72 65 20 6c 6f 63 61 74 65 64 20 69  t were located i
6530: 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  n the..      #  
6540: 20 20 20 20 20 62 75 69 6c 64 20 64 69 72 65 63       build direc
6550: 74 6f 72 79 2c 20 64 69 73 63 61 72 64 69 6e 67  tory, discarding
6560: 20 61 6e 79 20 64 69 72 65 63 74 6f 72 79 20 69   any directory i
6570: 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 72 65 73 65  nformation prese
6580: 6e 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  nt..      #     
6590: 20 20 69 6e 20 74 68 65 20 66 69 6c 65 20 6e 61    in the file na
65a0: 6d 65 20 61 73 20 70 72 6f 76 69 64 65 64 20 62  me as provided b
65b0: 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20  y our caller... 
65c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65       #..      se
65d0: 74 20 72 65 73 75 6c 74 20 5b 66 69 6c 65 20 6e  t result [file n
65e0: 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20  ativename \..   
65f0: 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69         [file joi
6600: 6e 20 5b 67 65 74 42 75 69 6c 64 44 69 72 65 63  n [getBuildDirec
6610: 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d 20  tory] $platform 
6620: 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65  [file tail $file
6630: 4e 61 6d 65 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20  Name]]]....     
6640: 20 23 0d 0a 20 20 20 20 20 20 23 20 48 41 43 4b   #..      # HACK
6650: 3a 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20 6f  : When running o
6660: 6e 20 57 6f 57 36 34 2c 20 61 73 73 75 6d 65 20  n WoW64, assume 
6670: 74 68 65 20 74 65 73 74 20 65 78 65 63 75 74 61  the test executa
6680: 62 6c 65 73 20 61 72 65 20 70 72 65 73 65 6e 74  bles are present
6690: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
66a0: 77 69 74 68 20 74 68 65 20 22 33 32 22 20 73 75  with the "32" su
66b0: 66 66 69 78 20 6f 6e 20 74 68 65 6d 2e 0d 0a 20  ffix on them... 
66c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
66d0: 20 7b 5b 69 73 52 75 6e 6e 69 6e 67 57 6f 57 36   {[isRunningWoW6
66e0: 34 5d 20 26 26 20 5b 66 69 6c 65 20 65 78 74 65  4] && [file exte
66f0: 6e 73 69 6f 6e 20 24 72 65 73 75 6c 74 5d 20 65  nsion $result] e
6700: 71 20 22 2e 65 78 65 22 7d 20 74 68 65 6e 20 7b  q ".exe"} then {
6710: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 72 65  ..        set re
6720: 73 75 6c 74 20 5b 61 70 70 65 6e 64 41 72 67 73  sult [appendArgs
6730: 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20   [file rootname 
6740: 24 72 65 73 75 6c 74 5d 20 33 32 2e 65 78 65 5d  $result] 32.exe]
6750: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
6760: 20 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c     return $resul
6770: 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  t..    }.....   
6780: 20 70 72 6f 63 20 67 65 74 45 78 74 65 72 6e 61   proc getExterna
6790: 6c 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d  lDirectory {} {.
67a0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
67b0: 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f  # NOTE: This pro
67c0: 63 65 64 75 72 65 20 72 65 74 75 72 6e 73 20 74  cedure returns t
67d0: 68 65 20 64 69 72 65 63 74 6f 72 79 20 77 68 65  he directory whe
67e0: 72 65 20 74 68 65 20 65 78 74 65 72 6e 61 6c 20  re the external 
67f0: 62 69 6e 61 72 79 0d 0a 20 20 20 20 20 20 23 20  binary..      # 
6800: 20 20 20 20 20 20 66 69 6c 65 73 20 61 72 65 20        files are 
6810: 6c 6f 63 61 74 65 64 2e 0d 0a 20 20 20 20 20 20  located...      
6820: 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  #..      return 
6830: 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
6840: 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b   [file dirname [
6850: 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b 69 6e  file dirname [in
6860: 66 6f 20 62 69 6e 61 72 79 5d 5d 5d 5d 0d 0a 20  fo binary]]]].. 
6870: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
6880: 63 20 67 65 74 42 69 6e 61 72 79 44 69 72 65 63  c getBinaryDirec
6890: 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  tory {} {..     
68a0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
68b0: 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  : This procedure
68c0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 64 69 72   returns the dir
68d0: 65 63 74 6f 72 79 20 77 68 65 72 65 20 74 68 65  ectory where the
68e0: 20 74 65 73 74 20 61 70 70 6c 69 63 61 74 69 6f   test applicatio
68f0: 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  n..      #      
6900: 20 69 74 73 65 6c 66 20 28 69 2e 65 2e 20 74 68   itself (i.e. th
6910: 65 20 45 61 67 6c 65 20 73 68 65 6c 6c 29 20 69  e Eagle shell) i
6920: 73 20 6c 6f 63 61 74 65 64 2e 20 20 54 68 69 73  s located.  This
6930: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 61 73   will be used as
6940: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
6950: 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
6960: 66 6f 72 20 74 68 65 20 63 6f 70 69 65 64 20 53  for the copied S
6970: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
6980: 65 20 6e 61 74 69 76 65 20 61 6e 64 0d 0a 20 20  e native and..  
6990: 20 20 20 20 23 20 20 20 20 20 20 20 6d 61 6e 61      #       mana
69a0: 67 65 64 20 61 73 73 65 6d 62 6c 69 65 73 20 28  ged assemblies (
69b0: 69 2e 65 2e 20 62 65 63 61 75 73 65 20 74 68 69  i.e. because thi
69c0: 73 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20  s is one of the 
69d0: 66 65 77 20 70 6c 61 63 65 73 0d 0a 20 20 20 20  few places..    
69e0: 20 20 23 20 20 20 20 20 20 20 77 68 65 72 65 20    #       where 
69f0: 74 68 65 20 43 4c 52 20 77 69 6c 6c 20 61 63 74  the CLR will act
6a00: 75 61 6c 6c 79 20 66 69 6e 64 20 61 6e 64 20 6c  ually find and l
6a10: 6f 61 64 20 74 68 65 6d 20 70 72 6f 70 65 72 6c  oad them properl
6a20: 79 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  y)...      #..  
6a30: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
6a40: 69 73 74 73 20 3a 3a 62 69 6e 61 72 79 5f 64 69  ists ::binary_di
6a50: 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20  rectory] && \.. 
6a60: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
6a70: 20 6c 65 6e 67 74 68 20 24 3a 3a 62 69 6e 61 72   length $::binar
6a80: 79 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30  y_directory] > 0
6a90: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
6aa0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
6ab0: 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f  OTE: The locatio
6ac0: 6e 20 6f 66 20 74 68 65 20 62 69 6e 61 72 79 20  n of the binary 
6ad0: 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
6ae0: 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a  en overridden;..
6af0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6b00: 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  therefore, use i
6b10: 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20  t verbatim...   
6b20: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
6b30: 72 65 74 75 72 6e 20 24 3a 3a 62 69 6e 61 72 79  return $::binary
6b40: 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20  _directory..    
6b50: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
6b60: 20 20 20 20 72 65 74 75 72 6e 20 5b 69 6e 66 6f      return [info
6b70: 20 62 69 6e 61 72 79 5d 0d 0a 20 20 20 20 20 20   binary]..      
6b80: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
6b90: 20 70 72 6f 63 20 67 65 74 45 78 74 65 72 6e 61   proc getExterna
6ba0: 6c 46 69 6c 65 4e 61 6d 65 20 7b 20 66 69 6c 65  lFileName { file
6bb0: 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20  Name } {..      
6bc0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
6bd0: 20 52 65 74 75 72 6e 73 20 74 68 65 20 73 70 65   Returns the spe
6be0: 63 69 66 69 65 64 20 66 69 6c 65 20 6e 61 6d 65  cified file name
6bf0: 20 61 73 20 69 66 20 69 74 20 77 65 72 65 20 6c   as if it were l
6c00: 6f 63 61 74 65 64 20 69 6e 20 74 68 65 0d 0a 20  ocated in the.. 
6c10: 20 20 20 20 20 23 20 20 20 20 20 20 20 64 69 72       #       dir
6c20: 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e  ectory containin
6c30: 67 20 74 68 65 20 65 78 74 65 72 6e 61 6c 20 62  g the external b
6c40: 69 6e 61 72 69 65 73 2e 0d 0a 20 20 20 20 20 20  inaries...      
6c50: 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  #..      return 
6c60: 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
6c70: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74   [file join [get
6c80: 45 78 74 65 72 6e 61 6c 44 69 72 65 63 74 6f 72  ExternalDirector
6c90: 79 5d 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a  y] $fileName]]..
6ca0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
6cb0: 6f 63 20 67 65 74 42 69 6e 61 72 79 46 69 6c 65  oc getBinaryFile
6cc0: 4e 61 6d 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20  Name { fileName 
6cd0: 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7d 20  {platform ""} } 
6ce0: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
6cf0: 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e    # NOTE: Return
6d00: 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  s the specified 
6d10: 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 69 66 20  file name as if 
6d20: 69 74 20 77 65 72 65 20 6c 6f 63 61 74 65 64 20  it were located 
6d30: 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  in the..      # 
6d40: 20 20 20 20 20 20 62 69 6e 61 72 79 20 64 69 72        binary dir
6d50: 65 63 74 6f 72 79 2c 20 64 69 73 63 61 72 64 69  ectory, discardi
6d60: 6e 67 20 61 6e 79 20 64 69 72 65 63 74 6f 72 79  ng any directory
6d70: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 72 65   information pre
6d80: 73 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20 20  sent..      #   
6d90: 20 20 20 20 69 6e 20 74 68 65 20 66 69 6c 65 20      in the file 
6da0: 6e 61 6d 65 20 61 73 20 70 72 6f 76 69 64 65 64  name as provided
6db0: 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d   by our caller..
6dc0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
6dd0: 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74  return [file nat
6de0: 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20  ivename \..     
6df0: 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20       [file join 
6e00: 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65 63 74  [getBinaryDirect
6e10: 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d 20 5b  ory] $platform [
6e20: 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e  file tail $fileN
6e30: 61 6d 65 5d 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c  ame]]]..    }...
6e40: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 43 6f  ..    proc getCo
6e50: 72 65 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  reBinaryFileName
6e60: 20 7b 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d   { {platform ""}
6e70: 20 7b 73 74 61 6e 64 61 72 64 20 66 61 6c 73 65   {standard false
6e80: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
6e90: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
6ea0: 74 75 72 6e 73 20 74 68 65 20 66 75 6c 6c 20 70  turns the full p
6eb0: 61 74 68 20 66 6f 72 20 74 68 65 20 66 69 6c 65  ath for the file
6ec0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
6ed0: 53 51 4c 69 74 65 20 63 6f 72 65 0d 0a 20 20 20  SQLite core..   
6ee0: 20 20 20 23 20 20 20 20 20 20 20 6e 61 74 69 76     #       nativ
6ef0: 65 20 6c 69 62 72 61 72 79 20 63 6f 64 65 20 66  e library code f
6f00: 6f 72 20 74 68 69 73 20 70 6c 61 74 66 6f 72 6d  or this platform
6f10: 2e 20 20 46 69 72 73 74 2c 20 63 68 65 63 6b 20  .  First, check 
6f20: 61 6e 64 20 73 65 65 20 69 66 0d 0a 20 20 20 20  and see if..    
6f30: 20 20 23 20 20 20 20 20 20 20 74 68 65 20 53 51    #       the SQ
6f40: 4c 69 74 65 20 63 6f 72 65 20 6e 61 74 69 76 65  Lite core native
6f50: 20 6c 69 62 72 61 72 79 20 68 61 73 20 61 6c 72   library has alr
6f60: 65 61 64 79 20 62 65 65 6e 20 6c 6f 61 64 65 64  eady been loaded
6f70: 2e 20 20 4e 65 78 74 2c 0d 0a 20 20 20 20 20 20  .  Next,..      
6f80: 23 20 20 20 20 20 20 20 66 61 6c 6c 62 61 63 6b  #       fallback
6f90: 20 74 6f 20 77 68 61 74 20 74 68 65 20 66 75 6c   to what the ful
6fa0: 6c 20 70 61 74 68 20 73 68 6f 75 6c 64 20 62 65  l path should be
6fb0: 2c 20 62 61 73 65 64 20 6f 6e 20 77 68 65 74 68  , based on wheth
6fc0: 65 72 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  er the..      # 
6fd0: 20 20 20 20 20 20 6d 69 78 65 64 2d 6d 6f 64 65        mixed-mode
6fe0: 20 61 73 73 65 6d 62 6c 79 20 69 73 20 62 65 69   assembly is bei
6ff0: 6e 67 20 75 73 65 64 20 61 6e 64 20 74 68 65 20  ng used and the 
7000: 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 75 72 72  name of the curr
7010: 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ent..      #    
7020: 20 20 20 70 6c 61 74 66 6f 72 6d 2e 0d 0a 20 20     platform...  
7030: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
7040: 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
7050: 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
7060: 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
7070: 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
7080: 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
7090: 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76  Lite.UnsafeNativ
70a0: 65 4d 65 74 68 6f 64 73 20 5f 53 51 4c 69 74 65  eMethods _SQLite
70b0: 4e 61 74 69 76 65 4d 6f 64 75 6c 65 46 69 6c 65  NativeModuleFile
70c0: 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 20 66 69  Name..      } fi
70d0: 6c 65 4e 61 6d 65 5d 20 3d 3d 20 30 20 26 26 20  leName] == 0 && 
70e0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
70f0: 66 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74  fileName] > 0} t
7100: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
7110: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
7120: 3a 20 54 68 65 20 53 51 4c 69 74 65 20 63 6f 72  : The SQLite cor
7130: 65 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79  e native library
7140: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
7150: 6e 20 6c 6f 61 64 65 64 20 76 69 61 0d 0a 20 20  n loaded via..  
7160: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
7170: 65 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79  e native library
7180: 20 70 72 65 2d 6c 6f 61 64 65 72 2e 20 20 52 65   pre-loader.  Re
7190: 74 75 72 6e 20 74 68 61 74 20 66 69 6c 65 20 6e  turn that file n
71a0: 61 6d 65 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  ame now...      
71b0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
71c0: 75 72 6e 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20  urn $fileName.. 
71d0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
71e0: 69 66 20 7b 5b 68 61 73 52 75 6e 74 69 6d 65 4f  if {[hasRuntimeO
71f0: 70 74 69 6f 6e 20 6e 61 74 69 76 65 5d 7d 20 74  ption native]} t
7200: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
7210: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
7220: 3a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 69 78  : Return the mix
7230: 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79  ed-mode assembly
7240: 20 66 69 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20 20   file name...   
7250: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
7260: 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74  return [file nat
7270: 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20  ivename \..     
7280: 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69         [file joi
7290: 6e 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65  n [getBinaryDire
72a0: 63 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d  ctory] $platform
72b0: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
72c0: 69 74 65 2e 64 6c 6c 5d 5d 0d 0a 20 20 20 20 20  ite.dll]]..     
72d0: 20 7d 20 65 6c 73 65 69 66 20 7b 24 73 74 61 6e   } elseif {$stan
72e0: 64 61 72 64 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  dard} then {..  
72f0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
7300: 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20   # NOTE: Return 
7310: 74 68 65 20 6e 61 74 69 76 65 2d 6f 6e 6c 79 20  the native-only 
7320: 73 74 61 6e 64 61 72 64 20 53 51 4c 69 74 65 20  standard SQLite 
7330: 6c 69 62 72 61 72 79 20 66 69 6c 65 20 6e 61 6d  library file nam
7340: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
7350: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66         return [f
7360: 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c  ile nativename \
7370: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
7380: 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e  ile join [getBin
7390: 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20 24 70  aryDirectory] $p
73a0: 6c 61 74 66 6f 72 6d 20 73 71 6c 69 74 65 33 2e  latform sqlite3.
73b0: 64 6c 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d 20 65  dll]]..      } e
73c0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
73d0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
73e0: 3a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 74  : Return the nat
73f0: 69 76 65 2d 6f 6e 6c 79 20 69 6e 74 65 72 6f 70  ive-only interop
7400: 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 20 6e   assembly file n
7410: 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ame...        #.
7420: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
7430: 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
7440: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
7450: 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42  [file join [getB
7460: 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20  inaryDirectory] 
7470: 24 70 6c 61 74 66 6f 72 6d 20 53 51 4c 69 74 65  $platform SQLite
7480: 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 5d 5d 0d 0a  .Interop.dll]]..
7490: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
74a0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 43  ...    proc getC
74b0: 6f 6d 6d 6f 6e 44 69 72 65 63 74 6f 72 79 20 7b  ommonDirectory {
74c0: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
74d0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73      # NOTE: This
74e0: 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72   procedure retur
74f0: 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ns the directory
7500: 20 77 68 65 72 65 20 74 68 65 20 74 65 73 74 20   where the test 
7510: 73 63 72 69 70 74 73 0d 0a 20 20 20 20 20 20 23  scripts..      #
7520: 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65         should be
7530: 20 6c 6f 63 61 74 65 64 2e 20 20 42 79 20 64 65   located.  By de
7540: 66 61 75 6c 74 2c 20 74 68 69 73 20 6a 75 73 74  fault, this just
7550: 20 72 65 74 75 72 6e 73 20 74 68 65 20 45 61 67   returns the Eag
7560: 6c 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  le..      #     
7570: 20 20 62 69 6e 61 72 79 20 64 69 72 65 63 74 6f    binary directo
7580: 72 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ry...      #..  
7590: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
75a0: 69 73 74 73 20 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69  ists ::common_di
75b0: 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20  rectory] && \.. 
75c0: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
75d0: 20 6c 65 6e 67 74 68 20 24 3a 3a 63 6f 6d 6d 6f   length $::commo
75e0: 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30  n_directory] > 0
75f0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
7600: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
7610: 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f  OTE: The locatio
7620: 6e 20 6f 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  n of the common 
7630: 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
7640: 65 6e 20 73 65 74 3b 0d 0a 20 20 20 20 20 20 20  en set;..       
7650: 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f   #       therefo
7660: 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20  re, use it...   
7670: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
7680: 72 65 74 75 72 6e 20 24 3a 3a 63 6f 6d 6d 6f 6e  return $::common
7690: 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20  _directory..    
76a0: 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66    } elseif {[inf
76b0: 6f 20 65 78 69 73 74 73 20 3a 3a 76 65 6e 64 6f  o exists ::vendo
76c0: 72 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20  r_directory] && 
76d0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
76e0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 76  ring length $::v
76f0: 65 6e 64 6f 72 5f 64 69 72 65 63 74 6f 72 79 5d  endor_directory]
7700: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
7710: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
7720: 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63   # NOTE: The loc
7730: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 65 6e  ation of the ven
7740: 64 6f 72 20 64 69 72 65 63 74 6f 72 79 20 68 61  dor directory ha
7750: 73 20 62 65 65 6e 20 73 65 74 3b 0d 0a 20 20 20  s been set;..   
7760: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
7770: 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d  refore, use it..
7780: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
7790: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 76 65      return $::ve
77a0: 6e 64 6f 72 5f 64 69 72 65 63 74 6f 72 79 0d 0a  ndor_directory..
77b0: 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
77c0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
77d0: 63 6c 5f 6c 69 62 72 61 72 79 5d 20 26 26 20 5c  cl_library] && \
77e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
77f0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 63  ing length $::tc
7800: 6c 5f 6c 69 62 72 61 72 79 5d 20 3e 20 30 20 26  l_library] > 0 &
7810: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
7820: 66 69 6c 65 20 69 73 64 69 72 65 63 74 6f 72 79  file isdirectory
7830: 20 24 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79 5d   $::tcl_library]
7840: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
7850: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
7860: 4f 54 45 3a 20 54 68 65 20 76 61 72 69 61 62 6c  OTE: The variabl
7870: 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 61 74  e with the locat
7880: 69 6f 6e 20 6f 66 20 74 68 65 20 73 63 72 69 70  ion of the scrip
7890: 74 20 6c 69 62 72 61 72 79 20 69 73 0d 0a 20 20  t library is..  
78a0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 65        #       se
78b0: 74 20 61 6e 64 20 61 70 70 65 61 72 73 20 74 6f  t and appears to
78c0: 20 62 65 20 61 20 72 65 61 6c 20 64 69 72 65 63   be a real direc
78d0: 74 6f 72 79 20 28 69 2e 65 2e 20 6e 6f 74 20 65  tory (i.e. not e
78e0: 6d 62 65 64 64 65 64 0d 0a 20 20 20 20 20 20 20  mbedded..       
78f0: 20 23 20 20 20 20 20 20 20 77 69 74 68 69 6e 20   #       within 
7900: 61 20 66 69 6c 65 29 3b 20 74 68 65 72 65 66 6f  a file); therefo
7910: 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20  re, use it...   
7920: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
7930: 72 65 74 75 72 6e 20 24 3a 3a 74 63 6c 5f 6c 69  return $::tcl_li
7940: 62 72 61 72 79 0d 0a 20 20 20 20 20 20 7d 20 65  brary..      } e
7950: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
7960: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
7970: 3a 20 46 61 6c 6c 62 61 63 6b 20 74 6f 20 74 68  : Fallback to th
7980: 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74  e directory cont
7990: 61 69 6e 69 6e 67 20 74 68 65 20 65 78 65 63 75  aining the execu
79a0: 74 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  table...        
79b0: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
79c0: 6e 20 5b 69 6e 66 6f 20 62 69 6e 61 72 79 5d 0d  n [info binary].
79d0: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
79e0: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
79f0: 44 61 74 61 62 61 73 65 44 69 72 65 63 74 6f 72  DatabaseDirector
7a00: 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  y {} {..      #.
7a10: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
7a20: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65  his procedure re
7a30: 74 75 72 6e 73 20 74 68 65 20 64 69 72 65 63 74  turns the direct
7a40: 6f 72 79 20 77 68 65 72 65 20 74 68 65 20 74 65  ory where the te
7a50: 73 74 20 64 61 74 61 62 61 73 65 73 0d 0a 20 20  st databases..  
7a60: 20 20 20 20 23 20 20 20 20 20 20 20 73 68 6f 75      #       shou
7a70: 6c 64 20 62 65 20 6c 6f 63 61 74 65 64 2e 20 20  ld be located.  
7a80: 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69 73  By default, this
7a90: 20 6a 75 73 74 20 75 73 65 73 20 74 68 65 20 74   just uses the t
7aa0: 65 6d 70 6f 72 61 72 79 0d 0a 20 20 20 20 20 20  emporary..      
7ab0: 23 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72  #       director
7ac0: 79 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72  y configured for
7ad0: 20 74 68 69 73 20 73 79 73 74 65 6d 2e 0d 0a 20   this system... 
7ae0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
7af0: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
7b00: 3a 64 61 74 61 62 61 73 65 5f 64 69 72 65 63 74  :database_direct
7b10: 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ory] && \..     
7b20: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
7b30: 67 74 68 20 24 3a 3a 64 61 74 61 62 61 73 65 5f  gth $::database_
7b40: 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20  directory] > 0} 
7b50: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
7b60: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
7b70: 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  E: The location 
7b80: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
7b90: 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
7ba0: 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a  en overridden;..
7bb0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
7bc0: 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  therefore, use i
7bd0: 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
7be0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
7bf0: 3a 64 61 74 61 62 61 73 65 5f 64 69 72 65 63 74  :database_direct
7c00: 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  ory..      } els
7c10: 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74  eif {[info exist
7c20: 73 20 3a 3a 73 63 72 61 74 63 68 5f 64 69 72 65  s ::scratch_dire
7c30: 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20  ctory] && \..   
7c40: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
7c50: 65 6e 67 74 68 20 24 3a 3a 73 63 72 61 74 63 68  ength $::scratch
7c60: 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d  _directory] > 0}
7c70: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
7c80: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
7c90: 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e  TE: The location
7ca0: 20 6f 66 20 74 68 65 20 73 63 72 61 74 63 68 20   of the scratch 
7cb0: 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
7cc0: 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a  en overridden;..
7cd0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
7ce0: 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  therefore, use i
7cf0: 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
7d00: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
7d10: 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63 74 6f  :scratch_directo
7d20: 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ry..      } else
7d30: 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
7d40: 72 6e 20 5b 67 65 74 54 65 6d 70 6f 72 61 72 79  rn [getTemporary
7d50: 50 61 74 68 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  Path]..      }..
7d60: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
7d70: 6f 63 20 67 65 74 54 65 6d 70 6f 72 61 72 79 44  oc getTemporaryD
7d80: 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20  irectory {} {.. 
7d90: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
7da0: 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65  NOTE: This proce
7db0: 64 75 72 65 20 72 65 74 75 72 6e 73 20 74 68 65  dure returns the
7dc0: 20 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65   directory where
7dd0: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
7de0: 69 6c 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20  iles..      #   
7df0: 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 6c 6f      should be lo
7e00: 63 61 74 65 64 2e 20 20 42 79 20 64 65 66 61 75  cated.  By defau
7e10: 6c 74 2c 20 74 68 69 73 20 6a 75 73 74 20 75 73  lt, this just us
7e20: 65 73 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  es the temporary
7e30: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
7e40: 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 66 69 67  directory config
7e50: 75 72 65 64 20 66 6f 72 20 74 68 69 73 20 73 79  ured for this sy
7e60: 73 74 65 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  stem...      #..
7e70: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
7e80: 65 78 69 73 74 73 20 3a 3a 74 65 6d 70 6f 72 61  exists ::tempora
7e90: 72 79 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26  ry_directory] &&
7ea0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
7eb0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
7ec0: 74 65 6d 70 6f 72 61 72 79 5f 64 69 72 65 63 74  temporary_direct
7ed0: 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ory] > 0} then {
7ee0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
7ef0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
7f00: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
7f10: 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63   temporary direc
7f20: 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76  tory has been ov
7f30: 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20  erridden;..     
7f40: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 72 65     #       there
7f50: 66 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20  fore, use it... 
7f60: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
7f70: 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 6d 70    return $::temp
7f80: 6f 72 61 72 79 5f 64 69 72 65 63 74 6f 72 79 0d  orary_directory.
7f90: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20  .      } elseif 
7fa0: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
7fb0: 73 63 72 61 74 63 68 5f 64 69 72 65 63 74 6f 72  scratch_director
7fc0: 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  y] && \..       
7fd0: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
7fe0: 68 20 24 3a 3a 73 63 72 61 74 63 68 5f 64 69 72  h $::scratch_dir
7ff0: 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65  ectory] > 0} the
8000: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
8010: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
8020: 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  The location of 
8030: 74 68 65 20 73 63 72 61 74 63 68 20 64 69 72 65  the scratch dire
8040: 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 6f  ctory has been o
8050: 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20  verridden;..    
8060: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 72      #       ther
8070: 65 66 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a  efore, use it...
8080: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
8090: 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 73 63 72     return $::scr
80a0: 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79 0d 0a  atch_directory..
80b0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
80c0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
80d0: 67 65 74 54 65 6d 70 6f 72 61 72 79 50 61 74 68  getTemporaryPath
80e0: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
80f0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
8100: 65 74 45 78 65 63 75 74 65 4f 6e 53 65 74 75 70  etExecuteOnSetup
8110: 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20   {} {..      if 
8120: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
8130: 65 78 65 63 75 74 65 5f 6f 6e 5f 73 65 74 75 70  execute_on_setup
8140: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
8150: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
8160: 20 24 3a 3a 65 78 65 63 75 74 65 5f 6f 6e 5f 73   $::execute_on_s
8170: 65 74 75 70 5d 20 3e 20 30 7d 20 74 68 65 6e 20  etup] > 0} then 
8180: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
8190: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
81a0: 74 75 72 6e 20 74 68 65 20 63 6f 6e 66 69 67 75  turn the configu
81b0: 72 65 64 20 53 51 4c 20 74 6f 20 65 78 65 63 75  red SQL to execu
81c0: 74 65 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f  te during the co
81d0: 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20  nnection..      
81e0: 20 20 23 20 20 20 20 20 20 20 73 65 74 75 70 20    #       setup 
81f0: 70 72 6f 63 65 64 75 72 65 20 28 69 2e 65 2e 20  procedure (i.e. 
8200: 66 6f 72 20 65 76 65 72 79 20 74 65 73 74 20 64  for every test d
8210: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
8220: 6f 6e 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  on)...        #.
8230: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
8240: 24 3a 3a 65 78 65 63 75 74 65 5f 6f 6e 5f 73 65  $::execute_on_se
8250: 74 75 70 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  tup..      } els
8260: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e {..        #..
8270: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
8280: 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68 65 72  By default, ther
8290: 65 20 69 73 20 6e 6f 20 53 51 4c 20 74 6f 20 65  e is no SQL to e
82a0: 78 65 63 75 74 65 20 64 75 72 69 6e 67 20 74 68  xecute during th
82b0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20  e connection..  
82c0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 65        #       se
82d0: 74 75 70 20 70 72 6f 63 65 64 75 72 65 20 28 69  tup procedure (i
82e0: 2e 65 2e 20 66 6f 72 20 65 76 65 72 79 20 74 65  .e. for every te
82f0: 73 74 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  st database conn
8300: 65 63 74 69 6f 6e 29 2e 0d 0a 20 20 20 20 20 20  ection)...      
8310: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
8320: 75 72 6e 20 22 22 0d 0a 20 20 20 20 20 20 7d 0d  urn ""..      }.
8330: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
8340: 72 6f 63 20 67 65 74 54 65 73 74 4f 76 65 72 72  roc getTestOverr
8350: 69 64 65 73 50 72 65 61 6d 62 6c 65 20 7b 20 7b  idesPreamble { {
8360: 65 78 74 72 61 56 61 72 4e 61 6d 65 73 20 22 22  extraVarNames ""
8370: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  } } {..      set
8380: 20 76 61 72 4e 61 6d 65 73 20 5b 6c 69 73 74 5d   varNames [list]
8390: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
83a0: 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 61 76     # NOTE: If av
83b0: 61 69 6c 61 62 6c 65 2c 20 73 74 61 72 74 20 77  ailable, start w
83c0: 69 74 68 20 74 68 65 20 6d 61 73 74 65 72 20 6c  ith the master l
83d0: 69 73 74 20 6f 66 20 74 65 73 74 20 6f 76 65 72  ist of test over
83e0: 72 69 64 65 0d 0a 20 20 20 20 20 20 23 20 20 20  ride..      #   
83f0: 20 20 20 20 76 61 72 69 61 62 6c 65 73 2e 0d 0a      variables...
8400: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
8410: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
8420: 3a 3a 74 65 73 74 5f 6f 76 65 72 72 69 64 65 73  ::test_overrides
8430: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
8440: 20 20 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a 74 65    [llength $::te
8450: 73 74 5f 6f 76 65 72 72 69 64 65 73 5d 20 3e 20  st_overrides] > 
8460: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
8470: 20 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20     eval lappend 
8480: 76 61 72 4e 61 6d 65 73 20 24 3a 3a 74 65 73 74  varNames $::test
8490: 5f 6f 76 65 72 72 69 64 65 73 0d 0a 20 20 20 20  _overrides..    
84a0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
84b0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
84c0: 20 72 65 71 75 65 73 74 65 64 20 62 79 20 6f 75   requested by ou
84d0: 72 20 63 61 6c 6c 65 72 2c 20 61 64 64 20 61 6e  r caller, add an
84e0: 79 20 61 64 64 69 74 69 6f 6e 61 6c 20 76 61 72  y additional var
84f0: 69 61 62 6c 65 0d 0a 20 20 20 20 20 20 23 20 20  iable..      #  
8500: 20 20 20 20 20 6e 61 6d 65 73 20 74 6f 20 63 6f       names to co
8510: 70 79 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23  py now...      #
8520: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65  ..      if {[lle
8530: 6e 67 74 68 20 24 65 78 74 72 61 56 61 72 4e 61  ngth $extraVarNa
8540: 6d 65 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  mes] > 0} then {
8550: 0d 0a 20 20 20 20 20 20 20 20 65 76 61 6c 20 6c  ..        eval l
8560: 61 70 70 65 6e 64 20 76 61 72 4e 61 6d 65 73 20  append varNames 
8570: 24 65 78 74 72 61 56 61 72 4e 61 6d 65 73 0d 0a  $extraVarNames..
8580: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
8590: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
85a0: 3a 20 42 75 69 6c 64 20 74 68 65 20 73 63 72 69  : Build the scri
85b0: 70 74 20 66 72 61 67 6d 65 6e 74 20 74 6f 20 62  pt fragment to b
85c0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 70 72  e returned by pr
85d0: 6f 63 65 73 73 69 6e 67 20 65 61 63 68 0d 0a 20  ocessing each.. 
85e0: 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61 72       #       var
85f0: 69 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 61  iable name and a
8600: 64 64 69 6e 67 20 74 68 65 20 6e 65 63 65 63 65  dding the necece
8610: 73 73 61 72 79 20 73 63 72 69 70 74 20 66 72 61  ssary script fra
8620: 67 6d 65 6e 74 73 20 66 6f 72 0d 0a 20 20 20 20  gments for..    
8630: 20 20 23 20 20 20 20 20 20 20 65 61 63 68 20 6f    #       each o
8640: 6e 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ne...      #..  
8650: 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 22      set result "
8660: 22 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65 61  "....      forea
8670: 63 68 20 76 61 72 4e 61 6d 65 20 24 76 61 72 4e  ch varName $varN
8680: 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
8690: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
86a0: 45 3a 20 42 75 69 6c 64 20 74 68 65 20 71 75 61  E: Build the qua
86b0: 6c 69 66 69 65 64 20 67 6c 6f 62 61 6c 20 76 61  lified global va
86c0: 72 69 61 62 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20  riable name...  
86d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
86e0: 20 73 65 74 20 66 75 6c 6c 56 61 72 4e 61 6d 65   set fullVarName
86f0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 3a 3a 20   [appendArgs :: 
8700: 24 76 61 72 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20  $varName]....   
8710: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
8720: 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20 74 68 65  # NOTE: Does the
8730: 20 76 61 72 69 61 62 6c 65 20 65 78 69 73 74 20   variable exist 
8740: 69 6e 20 74 68 69 73 20 69 6e 74 65 72 70 72 65  in this interpre
8750: 74 65 72 20 63 6f 6e 74 65 78 74 3f 0d 0a 20 20  ter context?..  
8760: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
8770: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
8780: 73 20 24 66 75 6c 6c 56 61 72 4e 61 6d 65 5d 7d  s $fullVarName]}
8790: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
87a0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
87b0: 23 20 4e 4f 54 45 3a 20 41 70 70 65 6e 64 20 61  # NOTE: Append a
87c0: 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74   script fragment
87d0: 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20 74   to the result t
87e0: 68 61 74 20 77 69 6c 6c 20 63 6f 72 72 65 63 74  hat will correct
87f0: 6c 79 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  ly..          # 
8800: 20 20 20 20 20 20 63 6f 70 79 20 61 6e 79 20 63        copy any c
8810: 6f 6e 74 61 69 6e 65 64 20 76 61 6c 75 65 20 74  ontained value t
8820: 6f 20 61 6e 6f 74 68 65 72 20 69 6e 74 65 72 70  o another interp
8830: 72 65 74 65 72 20 63 6f 6e 74 65 78 74 2e 0d 0a  reter context...
8840: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
8850: 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 72 65         append re
8860: 73 75 6c 74 20 5c 6e 20 22 73 65 74 20 22 20 24  sult \n "set " $
8870: 66 75 6c 6c 56 61 72 4e 61 6d 65 20 22 20 5c 7b  fullVarName " \{
8880: 22 20 5b 73 65 74 20 24 66 75 6c 6c 56 61 72 4e  " [set $fullVarN
8890: 61 6d 65 5d 20 5c 7d 0d 0a 20 20 20 20 20 20 20  ame] \}..       
88a0: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
88b0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
88c0: 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 72 65 73  NOTE: If the res
88d0: 75 6c 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  ult contains one
88e0: 20 6f 72 20 6d 6f 72 65 20 73 63 72 69 70 74 20   or more script 
88f0: 66 72 61 67 6d 65 6e 74 73 2c 20 61 70 70 65 6e  fragments, appen
8900: 64 20 61 0d 0a 20 20 20 20 20 20 23 20 20 20 20  d a..      #    
8910: 20 20 20 6e 65 77 6c 69 6e 65 2e 0d 0a 20 20 20     newline...   
8920: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
8930: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
8940: 72 65 73 75 6c 74 5d 20 3e 20 30 7d 20 74 68 65  result] > 0} the
8950: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70  n {..        app
8960: 65 6e 64 20 72 65 73 75 6c 74 20 5c 6e 0d 0a 20  end result \n.. 
8970: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
8980: 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a  return $result..
8990: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
89a0: 6f 63 20 6d 6f 76 65 53 79 73 74 65 6d 44 61 74  oc moveSystemDat
89b0: 61 53 51 4c 69 74 65 44 6c 6c 43 6f 6e 66 69 67  aSQLiteDllConfig
89c0: 20 7b 20 7b 72 65 73 74 6f 72 65 20 66 61 6c 73   { {restore fals
89d0: 65 7d 20 7b 76 65 72 62 6f 73 65 20 66 61 6c 73  e} {verbose fals
89e0: 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  e} } {..      se
89f0: 74 20 64 69 72 65 63 74 6f 72 79 20 5b 6f 62 6a  t directory [obj
8a00: 65 63 74 20 69 6e 76 6f 6b 65 20 41 70 70 44 6f  ect invoke AppDo
8a10: 6d 61 69 6e 20 43 75 72 72 65 6e 74 44 6f 6d 61  main CurrentDoma
8a20: 69 6e 2e 42 61 73 65 44 69 72 65 63 74 6f 72 79  in.BaseDirectory
8a30: 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  ]....      if {[
8a40: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 64  string length $d
8a50: 69 72 65 63 74 6f 72 79 5d 20 3d 3d 20 30 7d 20  irectory] == 0} 
8a60: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
8a70: 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68  if {$verbose} th
8a80: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
8a90: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
8aa0: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
8ab0: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
8ac0: 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64     "---- skipped
8ad0: 20 6d 6f 76 69 6e 67 20 5c 22 53 79 73 74 65 6d   moving \"System
8ae0: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
8af0: 2e 63 6f 6e 66 69 67 5c 22 2c 20 22 20 5c 0d 0a  .config\", " \..
8b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 6e                "n
8b10: 6f 20 62 61 73 65 20 64 69 72 65 63 74 6f 72 79  o base directory
8b20: 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d  \n"]..        }.
8b30: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d  .        return.
8b40: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
8b50: 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 28 31    set fileName(1
8b60: 29 20 5b 66 69 6c 65 20 6e 6f 72 6d 61 6c 69 7a  ) [file normaliz
8b70: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  e \..          [
8b80: 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63  file join $direc
8b90: 74 6f 72 79 20 53 79 73 74 65 6d 2e 44 61 74 61  tory System.Data
8ba0: 2e 53 51 4c 69 74 65 2e 64 6c 6c 2e 63 6f 6e 66  .SQLite.dll.conf
8bb0: 69 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 73 65  ig]]....      se
8bc0: 74 20 66 69 6c 65 4e 61 6d 65 28 32 29 20 5b 61  t fileName(2) [a
8bd0: 70 70 65 6e 64 41 72 67 73 20 24 66 69 6c 65 4e  ppendArgs $fileN
8be0: 61 6d 65 28 31 29 20 2e 6d 6f 76 65 64 5d 0d 0a  ame(1) .moved]..
8bf0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 72 65 73  ..      if {$res
8c00: 74 6f 72 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  tore} then {..  
8c10: 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20        if {[file 
8c20: 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65  exists $fileName
8c30: 28 32 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  (2)]} then {..  
8c40: 20 20 20 20 20 20 20 20 66 69 6c 65 20 72 65 6e          file ren
8c50: 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 28 32 29  ame $fileName(2)
8c60: 20 24 66 69 6c 65 4e 61 6d 65 28 31 29 0d 0a 0d   $fileName(1)...
8c70: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24  .          if {$
8c80: 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d  verbose} then {.
8c90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
8ca0: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
8cb0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
8cc0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
8cd0: 20 20 22 2d 2d 2d 2d 20 6d 6f 76 65 64 20 5c 22    "---- moved \"
8ce0: 22 20 24 66 69 6c 65 4e 61 6d 65 28 32 29 20 22  " $fileName(2) "
8cf0: 5c 22 20 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20  \" to \"" \..   
8d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 24 66 69               $fi
8d10: 6c 65 4e 61 6d 65 28 31 29 20 5c 22 5c 6e 5d 0d  leName(1) \"\n].
8d20: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
8d30: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
8d40: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 76            if {$v
8d50: 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a  erbose} then {..
8d60: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
8d70: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
8d80: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
8d90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8da0: 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6d   "---- skipped m
8db0: 6f 76 69 6e 67 20 5c 22 22 20 24 66 69 6c 65 4e  oving \"" $fileN
8dc0: 61 6d 65 28 32 29 20 5c 0d 0a 20 20 20 20 20 20  ame(2) \..      
8dd0: 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69            "\", i
8de0: 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
8df0: 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
8e00: 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
8e10: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
8e20: 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20        if {[file 
8e30: 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65  exists $fileName
8e40: 28 31 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  (1)]} then {..  
8e50: 20 20 20 20 20 20 20 20 66 69 6c 65 20 72 65 6e          file ren
8e60: 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 28 31 29  ame $fileName(1)
8e70: 20 24 66 69 6c 65 4e 61 6d 65 28 32 29 0d 0a 0d   $fileName(2)...
8e80: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24  .          if {$
8e90: 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d  verbose} then {.
8ea0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
8eb0: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
8ec0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
8ed0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
8ee0: 20 20 22 2d 2d 2d 2d 20 6d 6f 76 65 64 20 5c 22    "---- moved \"
8ef0: 22 20 24 66 69 6c 65 4e 61 6d 65 28 31 29 20 22  " $fileName(1) "
8f00: 5c 22 20 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20  \" to \"" \..   
8f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 24 66 69               $fi
8f20: 6c 65 4e 61 6d 65 28 32 29 20 5c 22 5c 6e 5d 0d  leName(2) \"\n].
8f30: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
8f40: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
8f50: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 76            if {$v
8f60: 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a  erbose} then {..
8f70: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
8f80: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
8f90: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
8fa0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8fb0: 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6d   "---- skipped m
8fc0: 6f 76 69 6e 67 20 5c 22 22 20 24 66 69 6c 65 4e  oving \"" $fileN
8fd0: 61 6d 65 28 31 29 20 5c 0d 0a 20 20 20 20 20 20  ame(1) \..      
8fe0: 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69            "\", i
8ff0: 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
9000: 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
9010: 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
9020: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
9030: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 41 70 70  .    proc getApp
9040: 44 6f 6d 61 69 6e 50 72 65 61 6d 62 6c 65 20 7b  DomainPreamble {
9050: 20 7b 70 72 65 66 69 78 20 22 22 7d 20 7b 73 75   {prefix ""} {su
9060: 66 66 69 78 20 22 22 7d 20 7d 20 7b 0d 0a 20 20  ffix ""} } {..  
9070: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
9080: 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64  OTE: This proced
9090: 75 72 65 20 72 65 74 75 72 6e 73 20 61 20 74 65  ure returns a te
90a0: 73 74 20 73 65 74 75 70 20 73 63 72 69 70 74 20  st setup script 
90b0: 66 72 61 67 6d 65 6e 74 20 73 75 69 74 61 62 6c  fragment suitabl
90c0: 65 20 66 6f 72 0d 0a 20 20 20 20 20 20 23 20 20  e for..      #  
90d0: 20 20 20 20 20 65 76 61 6c 75 61 74 69 6f 6e 20       evaluation 
90e0: 62 79 20 61 6e 20 69 6e 74 65 72 70 72 65 74 65  by an interprete
90f0: 72 20 63 72 65 61 74 65 64 20 69 6e 20 61 6e 20  r created in an 
9100: 69 73 6f 6c 61 74 65 64 20 61 70 70 6c 69 63 61  isolated applica
9110: 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  tion..      #   
9120: 20 20 20 20 64 6f 6d 61 69 6e 2e 20 20 54 68 65      domain.  The
9130: 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74   script fragment
9140: 20 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64 20   being returned 
9150: 77 69 6c 6c 20 62 65 20 73 75 72 72 6f 75 6e 64  will be surround
9160: 65 64 20 62 79 0d 0a 20 20 20 20 20 20 23 20 20  ed by..      #  
9170: 20 20 20 20 20 74 68 65 20 70 72 65 66 69 78 20       the prefix 
9180: 61 6e 64 20 73 75 66 66 69 78 20 22 73 63 72 69  and suffix "scri
9190: 70 74 20 66 72 61 67 6d 65 6e 74 73 22 20 73 70  pt fragments" sp
91a0: 65 63 69 66 69 65 64 20 62 79 20 6f 75 72 20 63  ecified by our c
91b0: 61 6c 6c 65 72 2c 0d 0a 20 20 20 20 20 20 23 20  aller,..      # 
91c0: 20 20 20 20 20 20 69 66 20 61 6e 79 2e 20 20 54        if any.  T
91d0: 68 65 20 65 6e 74 69 72 65 20 73 63 72 69 70 74  he entire script
91e0: 20 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64 20   being returned 
91f0: 77 69 6c 6c 20 62 65 20 73 75 62 73 74 69 74 75  will be substitu
9200: 74 65 64 20 76 69 61 0d 0a 20 20 20 20 20 20 23  ted via..      #
9210: 20 20 20 20 20 20 20 5b 73 75 62 73 74 5d 2c 20         [subst], 
9220: 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f  in the context o
9230: 66 20 6f 75 72 20 63 61 6c 6c 65 72 2c 20 62 65  f our caller, be
9240: 66 6f 72 65 20 62 65 69 6e 67 20 72 65 74 75 72  fore being retur
9250: 6e 65 64 2e 0d 0a 20 20 20 20 20 20 23 20 20 20  ned...      #   
9260: 20 20 20 20 54 68 69 73 20 73 74 65 70 20 69 73      This step is
9270: 20 6e 65 63 65 73 73 61 72 79 20 73 6f 20 74 68   necessary so th
9280: 61 74 20 73 6f 6d 65 20 6c 69 6d 69 74 65 64 20  at some limited 
9290: 63 6f 6e 74 65 78 74 20 69 6e 66 6f 72 6d 61 74  context informat
92a0: 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 23 20 20 20  ion,..      #   
92b0: 20 20 20 20 70 72 69 6d 61 72 69 6c 79 20 72 65      primarily re
92c0: 6c 61 74 65 64 20 74 6f 20 74 68 65 20 74 65 73  lated to the tes
92d0: 74 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65 73  ting directories
92e0: 2c 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66 65  , can be transfe
92f0: 72 72 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20  rred..      #   
9300: 20 20 20 20 74 6f 20 74 68 65 20 69 6e 74 65 72      to the inter
9310: 70 72 65 74 65 72 20 69 6e 20 74 68 65 20 69 73  preter in the is
9320: 6f 6c 61 74 65 64 20 61 70 70 6c 69 63 61 74 69  olated applicati
9330: 6f 6e 20 64 6f 6d 61 69 6e 2c 20 6d 61 6b 69 6e  on domain, makin
9340: 67 20 69 74 0d 0a 20 20 20 20 20 20 23 20 20 20  g it..      #   
9350: 20 20 20 20 61 62 6c 65 20 74 6f 20 73 75 63 63      able to succ
9360: 65 73 73 66 75 6c 6c 79 20 72 75 6e 20 74 65 73  essfully run tes
9370: 74 73 20 74 68 61 74 20 72 65 71 75 69 72 65 20  ts that require 
9380: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74  one or more of t
9390: 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
93a0: 20 20 66 69 6c 65 73 20 69 6e 20 6f 6e 65 20 6f    files in one o
93b0: 66 20 74 68 65 20 74 65 73 74 69 6e 67 20 64 69  f the testing di
93c0: 72 65 63 74 6f 72 69 65 73 2e 20 20 43 61 6c 6c  rectories.  Call
93d0: 65 72 73 20 73 68 6f 75 6c 64 20 6b 65 65 70 20  ers should keep 
93e0: 69 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  in..      #     
93f0: 20 20 6d 69 6e 64 20 74 68 61 74 20 74 68 65 20    mind that the 
9400: 74 65 73 74 20 73 63 72 69 70 74 20 66 72 61 67  test script frag
9410: 6d 65 6e 74 20 62 65 69 6e 67 20 72 65 74 75 72  ment being retur
9420: 6e 65 64 20 63 61 6e 6e 6f 74 20 72 65 6c 79 20  ned cannot rely 
9430: 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  on..      #     
9440: 20 20 61 6e 79 20 73 63 72 69 70 74 20 6c 69 62    any script lib
9450: 72 61 72 79 20 70 72 6f 63 65 64 75 72 65 73 20  rary procedures 
9460: 74 68 61 74 20 61 72 65 20 6e 6f 74 20 70 72 6f  that are not pro
9470: 76 69 64 65 64 20 62 79 20 74 68 65 20 45 61 67  vided by the Eag
9480: 6c 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  le..      #     
9490: 20 20 6c 69 62 72 61 72 79 20 70 61 63 6b 61 67    library packag
94a0: 65 20 28 69 2e 65 2e 20 22 69 6e 69 74 2e 65 61  e (i.e. "init.ea
94b0: 67 6c 65 22 29 2c 20 69 6e 63 6c 75 64 69 6e 67  gle"), including
94c0: 20 74 68 6f 73 65 20 70 72 6f 76 69 64 65 64 20   those provided 
94d0: 62 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  by..      #     
94e0: 20 20 74 68 65 20 45 61 67 6c 65 20 74 65 73 74    the Eagle test
94f0: 20 70 61 63 6b 61 67 65 2c 20 75 6e 6c 65 73 73   package, unless
9500: 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69   the file contai
9510: 6e 69 6e 67 20 74 68 65 6d 20 69 73 20 6c 6f 61  ning them is loa
9520: 64 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ded..      #    
9530: 20 20 20 6d 61 6e 75 61 6c 6c 79 20 76 69 61 20     manually via 
9540: 73 6f 6d 65 20 6f 74 68 65 72 20 6d 65 63 68 61  some other mecha
9550: 6e 69 73 6d 20 28 65 2e 67 2e 20 62 79 20 69 6e  nism (e.g. by in
9560: 63 6c 75 64 69 6e 67 20 61 70 70 72 6f 70 72 69  cluding appropri
9570: 61 74 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ate..      #    
9580: 20 20 20 5b 70 61 63 6b 61 67 65 20 72 65 71 75     [package requ
9590: 69 72 65 5d 20 6f 72 20 5b 73 6f 75 72 63 65 5d  ire] or [source]
95a0: 20 63 6f 6d 6d 61 6e 64 73 20 69 6e 20 74 68 65   commands in the
95b0: 20 70 72 65 66 69 78 20 6f 72 20 73 75 66 66 69   prefix or suffi
95c0: 78 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  x..      #      
95d0: 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74   script fragment
95e0: 73 29 2e 20 20 41 6c 73 6f 2c 20 61 6c 6c 20 76  s).  Also, all v
95f0: 61 72 69 61 62 6c 65 20 72 65 66 65 72 65 6e 63  ariable referenc
9600: 65 73 20 61 6e 64 20 61 6c 6c 20 6e 65 73 74 65  es and all neste
9610: 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
9620: 20 63 6f 6d 6d 61 6e 64 73 20 28 69 2e 65 2e 20   commands (i.e. 
9630: 74 68 6f 73 65 20 69 6e 20 73 71 75 61 72 65 20  those in square 
9640: 62 72 61 63 6b 65 74 73 29 20 63 6f 6e 74 61 69  brackets) contai
9650: 6e 65 64 20 69 6e 20 74 68 65 20 66 69 6e 61 6c  ned in the final
9660: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
9670: 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20  script fragment 
9680: 77 69 6c 6c 20 65 6e 64 20 75 70 20 62 65 69 6e  will end up bein
9690: 67 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20 74  g evaluated in t
96a0: 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 74 68  he context of th
96b0: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
96c0: 20 63 61 6c 6c 69 6e 67 20 69 6e 74 65 72 70 72   calling interpr
96d0: 65 74 65 72 20 61 6e 64 20 6e 6f 74 20 74 68 65  eter and not the
96e0: 20 74 61 72 67 65 74 20 69 6e 74 65 72 70 72 65   target interpre
96f0: 74 65 72 20 63 72 65 61 74 65 64 20 69 6e 20 74  ter created in t
9700: 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
9710: 20 20 69 73 6f 6c 61 74 65 64 20 61 70 70 6c 69    isolated appli
9720: 63 61 74 69 6f 6e 20 64 6f 6d 61 69 6e 20 75 6e  cation domain un
9730: 6c 65 73 73 20 74 68 65 20 64 6f 6c 6c 61 72 20  less the dollar 
9740: 73 69 67 6e 73 20 61 6e 64 2f 6f 72 20 73 71 75  signs and/or squ
9750: 61 72 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  are..      #    
9760: 20 20 20 62 72 61 63 6b 65 74 73 20 61 72 65 20     brackets are 
9770: 73 70 65 63 69 61 6c 6c 79 20 71 75 6f 74 65 64  specially quoted
9780: 20 77 69 74 68 20 62 61 63 6b 73 6c 61 73 68 65   with backslashe
9790: 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s...      #..   
97a0: 20 20 20 72 65 74 75 72 6e 20 5b 75 70 6c 65 76     return [uplev
97b0: 65 6c 20 31 20 5b 6c 69 73 74 20 73 75 62 73 74  el 1 [list subst
97c0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 70 72   [appendArgs $pr
97d0: 65 66 69 78 20 7b 0d 0a 20 20 20 20 20 20 20 20  efix {..        
97e0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
97f0: 45 3a 20 54 68 65 20 5c 5b 6f 62 6a 65 63 74 5c  E: The \[object\
9800: 5d 20 63 6f 6d 6d 61 6e 64 20 6d 61 79 20 62 65  ] command may be
9810: 20 6d 69 73 73 69 6e 67 20 69 6e 20 73 6f 6d 65   missing in some
9820: 20 45 61 67 6c 65 20 63 6f 72 65 0d 0a 20 20 20   Eagle core..   
9830: 20 20 20 20 20 23 20 20 20 20 20 20 20 6c 69 62       #       lib
9840: 72 61 72 79 20 63 6f 6e 66 69 67 75 72 61 74 69  rary configurati
9850: 6f 6e 73 2e 20 20 43 6c 6f 6e 69 6e 67 20 61 6e  ons.  Cloning an
9860: 64 20 75 73 69 6e 67 20 74 68 65 20 70 72 6f 63  d using the proc
9870: 65 64 75 72 65 0d 0a 20 20 20 20 20 20 20 20 23  edure..        #
9880: 20 20 20 20 20 20 20 5c 5b 63 68 61 6e 67 65 4e         \[changeN
9890: 61 74 69 76 65 52 75 6e 74 69 6d 65 4f 70 74 69  ativeRuntimeOpti
98a0: 6f 6e 5c 5d 20 6d 61 79 20 68 65 6c 70 20 74 6f  on\] may help to
98b0: 20 6d 69 74 69 67 61 74 65 20 74 68 69 73 2e 0d   mitigate this..
98c0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
98d0: 20 20 20 20 70 72 6f 63 20 63 68 61 6e 67 65 4e      proc changeN
98e0: 61 74 69 76 65 52 75 6e 74 69 6d 65 4f 70 74 69  ativeRuntimeOpti
98f0: 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  on \..          
9900: 20 20 7b 5b 69 6e 66 6f 20 61 72 67 73 20 63 68    {[info args ch
9910: 61 6e 67 65 4e 61 74 69 76 65 52 75 6e 74 69 6d  angeNativeRuntim
9920: 65 4f 70 74 69 6f 6e 5d 7d 20 5c 0d 0a 20 20 20  eOption]} \..   
9930: 20 20 20 20 20 20 20 20 20 7b 5b 69 6e 66 6f 20           {[info 
9940: 62 6f 64 79 20 63 68 61 6e 67 65 4e 61 74 69 76  body changeNativ
9950: 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 5d 7d  eRuntimeOption]}
9960: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63  ....        catc
9970: 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  h {..          c
9980: 68 61 6e 67 65 4e 61 74 69 76 65 52 75 6e 74 69  hangeNativeRunti
9990: 6d 65 4f 70 74 69 6f 6e 20 5b 68 61 73 52 75 6e  meOption [hasRun
99a0: 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76  timeOption nativ
99b0: 65 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  e]..        }.. 
99c0: 20 20 20 20 20 7d 20 5b 67 65 74 54 65 73 74 4f       } [getTestO
99d0: 76 65 72 72 69 64 65 73 50 72 65 61 6d 62 6c 65  verridesPreamble
99e0: 20 5b 6c 69 73 74 20 70 61 74 68 20 74 65 73 74   [list path test
99f0: 5f 63 68 61 6e 6e 65 6c 5d 5d 20 24 73 75 66 66  _channel]] $suff
9a00: 69 78 5d 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  ix]]]..    }....
9a10: 0a 20 20 20 20 70 72 6f 63 20 74 72 79 43 6f 70  .    proc tryCop
9a20: 79 45 78 74 65 72 6e 61 6c 46 69 6c 65 20 7b 0d  yExternalFile {.
9a30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c  .            fil
9a40: 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20  eName {platform 
9a50: 22 22 7d 20 7b 6e 65 77 46 69 6c 65 4e 61 6d 65  ""} {newFileName
9a60: 20 22 22 7d 20 7b 76 65 72 62 6f 73 65 20 66 61   ""} {verbose fa
9a70: 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  lse} } {..      
9a80: 73 65 74 20 73 6f 75 72 63 65 46 69 6c 65 4e 61  set sourceFileNa
9a90: 6d 65 20 5b 67 65 74 45 78 74 65 72 6e 61 6c 46  me [getExternalF
9aa0: 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d  ileName $fileNam
9ab0: 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  e]....      if {
9ac0: 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 73  ![file exists $s
9ad0: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 5d 7d 20  ourceFileName]} 
9ae0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
9af0: 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68  if {$verbose} th
9b00: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
9b10: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
9b20: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
9b30: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
9b40: 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64     "---- skipped
9b50: 20 63 6f 70 79 69 6e 67 20 65 78 74 65 72 6e 61   copying externa
9b60: 6c 20 66 69 6c 65 20 5c 22 22 20 24 73 6f 75 72  l file \"" $sour
9b70: 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20  ceFileName \..  
9b80: 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c              "\",
9b90: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
9ba0: 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  st\n"]..        
9bb0: 7d 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  }..        retur
9bc0: 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  n..      }....  
9bd0: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
9be0: 6c 65 6e 67 74 68 20 24 6e 65 77 46 69 6c 65 4e  length $newFileN
9bf0: 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ame] > 0} then {
9c00: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 61  ..        set ta
9c10: 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65  rgetFileName [ge
9c20: 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
9c30: 24 6e 65 77 46 69 6c 65 4e 61 6d 65 20 24 70 6c  $newFileName $pl
9c40: 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 7d  atform]..      }
9c50: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
9c60: 20 73 65 74 20 74 61 72 67 65 74 46 69 6c 65 4e   set targetFileN
9c70: 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69  ame [getBinaryFi
9c80: 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  leName $fileName
9c90: 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20   $platform]..   
9ca0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65     }....      se
9cb0: 74 20 74 61 72 67 65 74 44 69 72 65 63 74 6f 72  t targetDirector
9cc0: 79 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20  y [file dirname 
9cd0: 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 5d  $targetFileName]
9ce0: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63  ....      if {[c
9cf0: 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
9d00: 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74  if {![file exist
9d10: 73 20 24 74 61 72 67 65 74 44 69 72 65 63 74 6f  s $targetDirecto
9d20: 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ry]} then {..   
9d30: 20 20 20 20 20 20 20 66 69 6c 65 20 6d 6b 64 69         file mkdi
9d40: 72 20 24 74 61 72 67 65 74 44 69 72 65 63 74 6f  r $targetDirecto
9d50: 72 79 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  ry..        }.. 
9d60: 20 20 20 20 20 20 20 66 69 6c 65 20 63 6f 70 79         file copy
9d70: 20 2d 66 6f 72 63 65 20 24 73 6f 75 72 63 65 46   -force $sourceF
9d80: 69 6c 65 4e 61 6d 65 20 24 74 61 72 67 65 74 46  ileName $targetF
9d90: 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d  ileName..      }
9da0: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
9db0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
9dc0: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
9dd0: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
9de0: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
9df0: 6f 70 69 65 64 20 65 78 74 65 72 6e 61 6c 20 66  opied external f
9e00: 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f  ile from \"" $so
9e10: 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 22 5c 22  urceFileName "\"
9e20: 20 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20   to \"" \..     
9e30: 20 20 20 20 20 20 20 24 74 61 72 67 65 74 46 69         $targetFi
9e40: 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20  leName \"\n]..  
9e50: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
9e60: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
9e70: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
9e80: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
9e90: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69         "---- fai
9ea0: 6c 65 64 20 74 6f 20 63 6f 70 79 20 65 78 74 65  led to copy exte
9eb0: 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 5c  rnal file from \
9ec0: 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61  "" $sourceFileNa
9ed0: 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
9ee0: 20 20 22 5c 22 20 74 6f 20 5c 22 22 20 24 74 61    "\" to \"" $ta
9ef0: 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c  rgetFileName \"\
9f00: 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  n]..      }..   
9f10: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
9f20: 74 72 79 43 6f 70 79 42 69 6e 61 72 79 46 69 6c  tryCopyBinaryFil
9f30: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
9f40: 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66   fileName {platf
9f50: 6f 72 6d 20 22 22 7d 20 7b 6e 65 77 46 69 6c 65  orm ""} {newFile
9f60: 4e 61 6d 65 20 22 22 7d 20 7b 76 65 72 62 6f 73  Name ""} {verbos
9f70: 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20  e false} } {..  
9f80: 20 20 20 20 73 65 74 20 73 6f 75 72 63 65 46 69      set sourceFi
9f90: 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72  leName [getBinar
9fa0: 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e  yFileName $fileN
9fb0: 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a  ame $platform]..
9fc0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69  ..      if {![fi
9fd0: 6c 65 20 65 78 69 73 74 73 20 24 73 6f 75 72 63  le exists $sourc
9fe0: 65 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  eFileName]} then
9ff0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
a000: 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b  $verbose} then {
a010: 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
a020: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
a030: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
a040: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
a050: 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 63 6f 70  ---- skipped cop
a060: 79 69 6e 67 20 62 69 6e 61 72 79 20 66 69 6c 65  ying binary file
a070: 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65   \"" $sourceFile
a080: 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  Name \..        
a090: 20 20 20 20 20 20 22 5c 22 2c 20 69 74 20 64 6f        "\", it do
a0a0: 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d  es not exist\n"]
a0b0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
a0c0: 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20       return..   
a0d0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
a0e0: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
a0f0: 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65 5d 20 3e   $newFileName] >
a100: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
a110: 20 20 20 20 73 65 74 20 74 61 72 67 65 74 46 69      set targetFi
a120: 6c 65 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c 64  leName [getBuild
a130: 46 69 6c 65 4e 61 6d 65 20 24 6e 65 77 46 69 6c  FileName $newFil
a140: 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d  eName $platform]
a150: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
a160: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 61  ..        set ta
a170: 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65  rgetFileName [ge
a180: 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 24  tBuildFileName $
a190: 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f  fileName $platfo
a1a0: 72 6d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  rm]..      }....
a1b0: 20 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74        set target
a1c0: 44 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65 20  Directory [file 
a1d0: 64 69 72 6e 61 6d 65 20 24 74 61 72 67 65 74 46  dirname $targetF
a1e0: 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20  ileName]....    
a1f0: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
a200: 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69          if {![fi
a210: 6c 65 20 65 78 69 73 74 73 20 24 74 61 72 67 65  le exists $targe
a220: 74 44 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65  tDirectory]} the
a230: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66  n {..          f
a240: 69 6c 65 20 6d 6b 64 69 72 20 24 74 61 72 67 65  ile mkdir $targe
a250: 74 44 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20  tDirectory..    
a260: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 66      }..        f
a270: 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63 65 20  ile copy -force 
a280: 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20  $sourceFileName 
a290: 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 0d  $targetFileName.
a2a0: 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20  .      }] == 0} 
a2b0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
a2c0: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
a2d0: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
a2e0: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
a2f0: 20 22 2d 2d 2d 2d 20 63 6f 70 69 65 64 20 62 69   "---- copied bi
a300: 6e 61 72 79 20 66 69 6c 65 20 66 72 6f 6d 20 5c  nary file from \
a310: 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61  "" $sourceFileNa
a320: 6d 65 20 22 5c 22 20 74 6f 20 5c 22 22 20 5c 0d  me "\" to \"" \.
a330: 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 74 61  .            $ta
a340: 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c  rgetFileName \"\
a350: 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  n]..      } else
a360: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
a370: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
a380: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
a390: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
a3a0: 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20 63 6f 70  -- failed to cop
a3b0: 79 20 62 69 6e 61 72 79 20 66 69 6c 65 20 66 72  y binary file fr
a3c0: 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69  om \"" $sourceFi
a3d0: 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  leName \..      
a3e0: 20 20 20 20 20 20 22 5c 22 20 74 6f 20 5c 22 22        "\" to \""
a3f0: 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65   $targetFileName
a400: 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d   \"\n]..      }.
a410: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
a420: 72 6f 63 20 74 72 79 43 6f 70 79 42 75 69 6c 64  roc tryCopyBuild
a430: 46 69 6c 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  File {..        
a440: 20 20 20 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c      fileName {pl
a450: 61 74 66 6f 72 6d 20 22 22 7d 20 7b 6e 65 77 46  atform ""} {newF
a460: 69 6c 65 4e 61 6d 65 20 22 22 7d 20 7b 76 65 72  ileName ""} {ver
a470: 62 6f 73 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  bose false} } {.
a480: 0a 20 20 20 20 20 20 73 65 74 20 73 6f 75 72 63  .      set sourc
a490: 65 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 75  eFileName [getBu
a4a0: 69 6c 64 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c  ildFileName $fil
a4b0: 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d  eName $platform]
a4c0: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b  ....      if {![
a4d0: 66 69 6c 65 20 65 78 69 73 74 73 20 24 73 6f 75  file exists $sou
a4e0: 72 63 65 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  rceFileName]} th
a4f0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
a500: 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e   {$verbose} then
a510: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
a520: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
a530: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
a540: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
a550: 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 63   "---- skipped c
a560: 6f 70 79 69 6e 67 20 62 75 69 6c 64 20 66 69 6c  opying build fil
a570: 65 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c  e \"" $sourceFil
a580: 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  eName \..       
a590: 20 20 20 20 20 20 20 22 5c 22 2c 20 69 74 20 64         "\", it d
a5a0: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22  oes not exist\n"
a5b0: 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
a5c0: 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20        return..  
a5d0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69      }....      i
a5e0: 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
a5f0: 68 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65 5d 20  h $newFileName] 
a600: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
a610: 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74 46       set targetF
a620: 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61  ileName [getBina
a630: 72 79 46 69 6c 65 4e 61 6d 65 20 24 6e 65 77 46  ryFileName $newF
a640: 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72  ileName $platfor
a650: 6d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  m]..      } else
a660: 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
a670: 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b  targetFileName [
a680: 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
a690: 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61  e $fileName $pla
a6a0: 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 7d 0d  tform]..      }.
a6b0: 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 74 61 72  ...      set tar
a6c0: 67 65 74 44 69 72 65 63 74 6f 72 79 20 5b 66 69  getDirectory [fi
a6d0: 6c 65 20 64 69 72 6e 61 6d 65 20 24 74 61 72 67  le dirname $targ
a6e0: 65 74 46 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20  etFileName].... 
a6f0: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
a700: 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  {..        if {!
a710: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 74 61  [file exists $ta
a720: 72 67 65 74 44 69 72 65 63 74 6f 72 79 5d 7d 20  rgetDirectory]} 
a730: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
a740: 20 20 66 69 6c 65 20 6d 6b 64 69 72 20 24 74 61    file mkdir $ta
a750: 72 67 65 74 44 69 72 65 63 74 6f 72 79 0d 0a 20  rgetDirectory.. 
a760: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
a770: 20 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72    file copy -for
a780: 63 65 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61  ce $sourceFileNa
a790: 6d 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61  me $targetFileNa
a7a0: 6d 65 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20  me..      }] == 
a7b0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
a7c0: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
a7d0: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
a7e0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
a7f0: 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 69 65 64      "---- copied
a800: 20 62 75 69 6c 64 20 66 69 6c 65 20 66 72 6f 6d   build file from
a810: 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65   \"" $sourceFile
a820: 4e 61 6d 65 20 22 5c 22 20 74 6f 20 5c 22 22 20  Name "\" to \"" 
a830: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24  \..            $
a840: 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5c  targetFileName \
a850: 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  "\n]..      } el
a860: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  se {..        tp
a870: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
a880: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
a890: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
a8a0: 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20 63  ---- failed to c
a8b0: 6f 70 79 20 62 75 69 6c 64 20 66 69 6c 65 20 66  opy build file f
a8c0: 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63 65 46  rom \"" $sourceF
a8d0: 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20  ileName \..     
a8e0: 20 20 20 20 20 20 20 22 5c 22 20 74 6f 20 5c 22         "\" to \"
a8f0: 22 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d  " $targetFileNam
a900: 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d  e \"\n]..      }
a910: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
a920: 70 72 6f 63 20 74 72 79 44 65 6c 65 74 65 42 69  proc tryDeleteBi
a930: 6e 61 72 79 46 69 6c 65 20 7b 20 66 69 6c 65 4e  naryFile { fileN
a940: 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22  ame {platform ""
a950: 7d 20 7b 76 65 72 62 6f 73 65 20 66 61 6c 73 65  } {verbose false
a960: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  } } {..      set
a970: 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69   fileName [getBi
a980: 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69  naryFileName $fi
a990: 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d  leName $platform
a9a0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21  ]....      if {!
a9b0: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69  [file exists $fi
a9c0: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
a9d0: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65  .        if {$ve
a9e0: 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20  rbose} then {.. 
a9f0: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
aa00: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
aa10: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
aa20: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
aa30: 2d 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69  - skipped deleti
aa40: 6e 67 20 62 69 6e 61 72 79 20 66 69 6c 65 20 5c  ng binary file \
aa50: 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a  "" $fileName \..
aa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c                "\
aa70: 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65  ", it does not e
aa80: 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  xist\n"]..      
aa90: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 72 65 74    }..        ret
aaa0: 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  urn..      }....
aab0: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
aac0: 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66   {file delete $f
aad0: 69 6c 65 4e 61 6d 65 7d 5d 20 3d 3d 20 30 7d 20  ileName}] == 0} 
aae0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
aaf0: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
ab00: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
ab10: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
ab20: 20 22 2d 2d 2d 2d 20 64 65 6c 65 74 65 64 20 62   "---- deleted b
ab30: 69 6e 61 72 79 20 66 69 6c 65 20 5c 22 22 20 24  inary file \"" $
ab40: 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a  fileName \"\n]..
ab50: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
ab60: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
ab70: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
ab80: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
ab90: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66           "---- f
aba0: 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20  ailed to delete 
abb0: 62 69 6e 61 72 79 20 66 69 6c 65 20 5c 22 22 20  binary file \"" 
abc0: 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d  $fileName \"\n].
abd0: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
abe0: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79  ....    proc try
abf0: 44 65 6c 65 74 65 42 75 69 6c 64 46 69 6c 65 20  DeleteBuildFile 
ac00: 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74  { fileName {plat
ac10: 66 6f 72 6d 20 22 22 7d 20 7b 76 65 72 62 6f 73  form ""} {verbos
ac20: 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20  e false} } {..  
ac30: 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65      set fileName
ac40: 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61   [getBuildFileNa
ac50: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c  me $fileName $pl
ac60: 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20  atform]....     
ac70: 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73   if {![file exis
ac80: 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74  ts $fileName]} t
ac90: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
aca0: 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65  f {$verbose} the
acb0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
acc0: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
acd0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
ace0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
acf0: 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20    "---- skipped 
ad00: 64 65 6c 65 74 69 6e 67 20 62 75 69 6c 64 20 66  deleting build f
ad10: 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d  ile \"" $fileNam
ad20: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
ad30: 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20     "\", it does 
ad40: 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20  not exist\n"].. 
ad50: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
ad60: 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20    return..      
ad70: 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  }....      if {[
ad80: 63 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65  catch {file dele
ad90: 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d 5d 20 3d  te $fileName}] =
ada0: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
adb0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
adc0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
add0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
ade0: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 64 65 6c 65        "---- dele
adf0: 74 65 64 20 62 75 69 6c 64 20 66 69 6c 65 20 5c  ted build file \
ae00: 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c  "" $fileName \"\
ae10: 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  n]..      } else
ae20: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
ae30: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
ae40: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
ae50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
ae60: 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c  -- failed to del
ae70: 65 74 65 20 62 75 69 6c 64 20 66 69 6c 65 20 5c  ete build file \
ae80: 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c  "" $fileName \"\
ae90: 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  n]..      }..   
aea0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
aeb0: 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20  tryCopyAssembly 
aec0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  {..            f
aed0: 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72  ileName {platfor
aee0: 6d 20 22 22 7d 20 7b 70 64 62 20 74 72 75 65 7d  m ""} {pdb true}
aef0: 20 7b 76 65 72 62 6f 73 65 20 66 61 6c 73 65 7d   {verbose false}
af00: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 72 79 43   } {..      tryC
af10: 6f 70 79 42 75 69 6c 64 46 69 6c 65 20 24 66 69  opyBuildFile $fi
af20: 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d  leName $platform
af30: 20 22 22 20 24 76 65 72 62 6f 73 65 0d 0a 0d 0a   "" $verbose....
af40: 20 20 20 20 20 20 69 66 20 7b 24 70 64 62 7d 20        if {$pdb} 
af50: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
af60: 74 72 79 43 6f 70 79 42 75 69 6c 64 46 69 6c 65  tryCopyBuildFile
af70: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
af80: 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
af90: 65 20 72 6f 6f 74 6e 61 6d 65 20 24 66 69 6c 65  e rootname $file
afa0: 4e 61 6d 65 5d 20 2e 70 64 62 5d 20 24 70 6c 61  Name] .pdb] $pla
afb0: 74 66 6f 72 6d 20 22 22 20 24 76 65 72 62 6f 73  tform "" $verbos
afc0: 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  e..      }..    
afd0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74  }.....    proc t
afe0: 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79  ryDeleteAssembly
aff0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
b000: 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f  fileName {platfo
b010: 72 6d 20 22 22 7d 20 7b 70 64 62 20 74 72 75 65  rm ""} {pdb true
b020: 7d 20 7b 76 65 72 62 6f 73 65 20 66 61 6c 73 65  } {verbose false
b030: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 72 79  } } {..      try
b040: 44 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65  DeleteBinaryFile
b050: 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74   $fileName $plat
b060: 66 6f 72 6d 20 24 76 65 72 62 6f 73 65 0d 0a 0d  form $verbose...
b070: 0a 20 20 20 20 20 20 69 66 20 7b 24 70 64 62 7d  .      if {$pdb}
b080: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
b090: 20 74 72 79 44 65 6c 65 74 65 42 69 6e 61 72 79   tryDeleteBinary
b0a0: 46 69 6c 65 20 5b 61 70 70 65 6e 64 41 72 67 73  File [appendArgs
b0b0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
b0c0: 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 24  [file rootname $
b0d0: 66 69 6c 65 4e 61 6d 65 5d 20 2e 70 64 62 5d 20  fileName] .pdb] 
b0e0: 24 70 6c 61 74 66 6f 72 6d 20 24 76 65 72 62 6f  $platform $verbo
b0f0: 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  se..      }..   
b100: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
b110: 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20  tryLoadAssembly 
b120: 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74  { fileName {plat
b130: 66 6f 72 6d 20 22 22 7d 20 7d 20 7b 0d 0a 20 20  form ""} } {..  
b140: 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65      set fileName
b150: 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
b160: 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70  ame $fileName $p
b170: 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20  latform]....    
b180: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
b190: 20 20 20 20 20 20 20 20 73 65 74 20 61 73 73 65          set asse
b1a0: 6d 62 6c 79 20 5b 6f 62 6a 65 63 74 20 6c 6f 61  mbly [object loa
b1b0: 64 20 2d 6c 6f 61 64 74 79 70 65 20 46 69 6c 65  d -loadtype File
b1c0: 20 2d 61 6c 69 61 73 20 24 66 69 6c 65 4e 61 6d   -alias $fileNam
b1d0: 65 5d 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20  e]..      }] == 
b1e0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
b1f0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
b200: 4e 4f 54 45 3a 20 4e 6f 77 2c 20 61 64 64 20 74  NOTE: Now, add t
b210: 68 65 20 6e 65 63 65 73 73 61 72 79 20 74 65 73  he necessary tes
b220: 74 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0d 0a 20  t constraint... 
b230: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
b240: 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
b250: 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 5b  [file rootname [
b260: 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e  file tail $fileN
b270: 61 6d 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  ame]]....       
b280: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
b290: 54 45 3a 20 47 72 61 62 20 74 68 65 20 69 6d 61  TE: Grab the ima
b2a0: 67 65 20 72 75 6e 74 69 6d 65 20 76 65 72 73 69  ge runtime versi
b2b0: 6f 6e 20 66 72 6f 6d 20 74 68 65 20 61 73 73 65  on from the asse
b2c0: 6d 62 6c 79 20 62 65 63 61 75 73 65 0d 0a 20 20  mbly because..  
b2d0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 65        #       se
b2e0: 76 65 72 61 6c 20 74 65 73 74 73 20 72 65 6c 79  veral tests rely
b2f0: 20 6f 6e 20 69 74 20 68 61 76 69 6e 67 20 61 20   on it having a 
b300: 63 65 72 74 61 69 6e 20 76 61 6c 75 65 2e 0d 0a  certain value...
b310: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
b320: 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
b330: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 66 69   [appendArgs [fi
b340: 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d  le tail $fileNam
b350: 65 5d 20 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  e] _ \..        
b360: 20 20 20 20 5b 24 61 73 73 65 6d 62 6c 79 20 49      [$assembly I
b370: 6d 61 67 65 52 75 6e 74 69 6d 65 56 65 72 73 69  mageRuntimeVersi
b380: 6f 6e 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  on]]....        
b390: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
b3a0: 45 3a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75  E: Return the fu
b3b0: 6c 6c 20 70 61 74 68 20 6f 66 20 74 68 65 20 6c  ll path of the l
b3c0: 6f 61 64 65 64 20 66 69 6c 65 2e 0d 0a 20 20 20  oaded file...   
b3d0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
b3e0: 72 65 74 75 72 6e 20 24 66 69 6c 65 4e 61 6d 65  return $fileName
b3f0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
b400: 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20     return ""..  
b410: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
b420: 20 69 73 53 51 4c 69 74 65 52 65 61 64 79 20 7b   isSQLiteReady {
b430: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
b440: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73      # NOTE: This
b450: 20 70 72 6f 63 65 64 75 72 65 20 6d 75 73 74 20   procedure must 
b460: 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  return non-zero 
b470: 6f 6e 6c 79 20 69 66 20 74 68 65 20 53 51 4c 69  only if the SQLi
b480: 74 65 20 6e 61 74 69 76 65 0d 0a 20 20 20 20 20  te native..     
b490: 20 23 20 20 20 20 20 20 20 6c 69 62 72 61 72 79   #       library
b4a0: 20 61 6e 64 20 74 68 65 20 53 79 73 74 65 6d 2e   and the System.
b4b0: 44 61 74 61 2e 53 51 4c 69 74 65 20 6d 61 6e 61  Data.SQLite mana
b4c0: 67 65 64 20 61 73 73 65 6d 62 6c 79 20 61 72 65  ged assembly are
b4d0: 20 6c 6f 61 64 65 64 0d 0a 20 20 20 20 20 20 23   loaded..      #
b4e0: 20 20 20 20 20 20 20 61 6e 64 20 72 65 61 64 79         and ready
b4f0: 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20   for use by the 
b500: 74 65 73 74 20 73 75 69 74 65 2e 20 20 43 75 72  test suite.  Cur
b510: 72 65 6e 74 6c 79 2c 20 74 68 69 73 20 70 72 6f  rently, this pro
b520: 63 65 64 75 72 65 0d 0a 20 20 20 20 20 20 23 20  cedure..      # 
b530: 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20        should be 
b540: 63 61 6c 6c 65 64 20 6f 6e 6c 79 20 61 66 74 65  called only afte
b550: 72 20 74 68 65 20 5b 74 72 79 4c 6f 61 64 41 73  r the [tryLoadAs
b560: 73 65 6d 62 6c 79 5d 20 70 72 6f 63 65 64 75 72  sembly] procedur
b570: 65 20 68 61 73 0d 0a 20 20 20 20 20 20 23 20 20  e has..      #  
b580: 20 20 20 20 20 62 65 65 6e 20 63 61 6c 6c 65 64       been called
b590: 20 74 6f 20 70 72 6f 62 65 20 66 6f 72 20 74 68   to probe for th
b5a0: 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  e System.Data.SQ
b5b0: 4c 69 74 65 20 6d 61 6e 61 67 65 64 20 61 73 73  Lite managed ass
b5c0: 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 23 20 20  embly..      #  
b5d0: 20 20 20 20 20 61 6e 64 20 74 68 65 20 5b 63 68       and the [ch
b5e0: 65 63 6b 46 6f 72 53 51 4c 69 74 65 5d 20 70 72  eckForSQLite] pr
b5f0: 6f 63 65 64 75 72 65 20 68 61 73 20 62 65 65 6e  ocedure has been
b600: 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 62 65   called to probe
b610: 20 66 6f 72 0d 0a 20 20 20 20 20 20 23 20 20 20   for..      #   
b620: 20 20 20 20 74 68 65 20 53 51 4c 69 74 65 20 6e      the SQLite n
b630: 61 74 69 76 65 20 6c 69 62 72 61 72 79 3b 20 6f  ative library; o
b640: 74 68 65 72 77 69 73 65 2c 20 74 68 69 73 20 70  therwise, this p
b650: 72 6f 63 65 64 75 72 65 20 77 69 6c 6c 20 73 69  rocedure will si
b660: 6d 70 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20  mply..      #   
b670: 20 20 20 20 61 6c 77 61 79 73 20 72 65 74 75 72      always retur
b680: 6e 20 7a 65 72 6f 2e 0d 0a 20 20 20 20 20 20 23  n zero...      #
b690: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b  ..      return [
b6a0: 65 78 70 72 20 7b 0d 0a 20 20 20 20 20 20 20 20  expr {..        
b6b0: 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
b6c0: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
b6d0: 74 65 5d 20 26 26 20 5b 68 61 76 65 43 6f 6e 73  te] && [haveCons
b6e0: 74 72 61 69 6e 74 20 53 51 4c 69 74 65 5d 0d 0a  traint SQLite]..
b6f0: 20 20 20 20 20 20 7d 5d 0d 0a 20 20 20 20 7d 0d        }]..    }.
b700: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 6d 61 74  ....    proc mat
b710: 63 68 50 6c 61 74 66 6f 72 6d 20 7b 20 70 6c 61  chPlatform { pla
b720: 74 66 6f 72 6d 20 7d 20 7b 0d 0a 20 20 20 20 20  tform } {..     
b730: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
b740: 3a 20 41 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  : An empty strin
b750: 67 20 66 6f 72 20 74 68 65 20 70 6c 61 74 66 6f  g for the platfo
b760: 72 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  rm means that th
b770: 65 20 62 75 69 6c 64 20 69 73 20 6e 6f 74 0d 0a  e build is not..
b780: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 5b 70        #       [p
b790: 72 69 6d 61 72 69 6c 79 5d 20 61 20 6e 61 74 69  rimarily] a nati
b7a0: 76 65 20 62 75 69 6c 64 3b 20 74 68 65 72 65 66  ve build; theref
b7b0: 6f 72 65 2c 20 69 74 20 61 6c 77 61 79 73 20 6d  ore, it always m
b7c0: 61 74 63 68 65 73 2e 0d 0a 20 20 20 20 20 20 23  atches...      #
b7d0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
b7e0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74  ing length $plat
b7f0: 66 6f 72 6d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  form] == 0} then
b800: 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
b810: 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 7d  rn true..      }
b820: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
b830: 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20     # NOTE: Does 
b840: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 6c  the specified pl
b850: 61 74 66 6f 72 6d 20 6d 61 74 63 68 20 75 70 20  atform match up 
b860: 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  to the current p
b870: 72 6f 63 65 73 73 3f 0d 0a 20 20 20 20 20 20 23  rocess?..      #
b880: 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 70 6c 61  ..      if {$pla
b890: 74 66 6f 72 6d 20 65 71 20 5b 6d 61 63 68 69 6e  tform eq [machin
b8a0: 65 54 6f 50 6c 61 74 66 6f 72 6d 20 24 3a 3a 74  eToPlatform $::t
b8b0: 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61 63 68  cl_platform(mach
b8c0: 69 6e 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ine)]} then {.. 
b8d0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
b8e0: 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ue..      }.... 
b8f0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
b900: 4e 4f 54 45 3a 20 54 68 65 20 73 70 65 63 69 66  NOTE: The specif
b910: 69 65 64 20 70 6c 61 74 66 6f 72 6d 20 64 6f 65  ied platform doe
b920: 73 20 6e 6f 74 20 6d 61 74 63 68 20 75 70 20 77  s not match up w
b930: 69 74 68 20 74 68 65 20 70 6c 61 74 66 6f 72 6d  ith the platform
b940: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
b950: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
b960: 70 72 6f 63 65 73 73 2e 0d 0a 20 20 20 20 20 20  process...      
b970: 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  #..      return 
b980: 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  false..    }....
b990: 0a 20 20 20 20 70 72 6f 63 20 68 61 76 65 53 51  .    proc haveSQ
b9a0: 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e  LiteObjectComman
b9b0: 64 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  d {} {..      #.
b9c0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
b9d0: 73 20 74 68 65 20 5b 6f 62 6a 65 63 74 5d 20 63  s the [object] c
b9e0: 6f 6d 6d 61 6e 64 20 63 75 72 72 65 6e 74 6c 79  ommand currently
b9f0: 20 61 76 61 69 6c 61 62 6c 65 3f 0d 0a 20 20 20   available?..   
ba00: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
ba10: 72 6e 20 5b 65 78 70 72 20 7b 5b 6c 6c 65 6e 67  rn [expr {[lleng
ba20: 74 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64  th [info command
ba30: 73 20 6f 62 6a 65 63 74 5d 5d 20 3e 20 30 7d 5d  s object]] > 0}]
ba40: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
ba50: 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51 4c  proc checkForSQL
ba60: 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64  iteObjectCommand
ba70: 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a   { channel } {..
ba80: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
ba90: 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b  nnel "---- check
baa0: 69 6e 67 20 66 6f 72 20 5c 22 6f 62 6a 65 63 74  ing for \"object
bab0: 5c 22 20 63 6f 6d 6d 61 6e 64 20 75 73 61 67 65  \" command usage
bac0: 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69  ... "....      i
bad0: 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
bae0: 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 4f 62 6a 65   ::no(sqliteObje
baf0: 63 74 43 6f 6d 6d 61 6e 64 29 5d 20 26 26 20 5c  ctCommand)] && \
bb00: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 68 61 76  ..          [hav
bb10: 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d  eSQLiteObjectCom
bb20: 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  mand]} then {.. 
bb30: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
bb40: 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20  annel yes\n..   
bb50: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
bb60: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
bb70: 23 20 4e 4f 54 45 3a 20 55 6e 6c 65 73 73 20 77  # NOTE: Unless w
bb80: 65 20 61 72 65 20 66 6f 72 62 69 64 64 65 6e 20  e are forbidden 
bb90: 66 72 6f 6d 20 64 6f 69 6e 67 20 73 6f 2c 20 61  from doing so, a
bba0: 64 64 20 73 6f 6d 65 20 63 6f 6e 73 74 72 61 69  dd some constrai
bbb0: 6e 74 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20  nts..        #  
bbc0: 20 20 20 20 20 74 68 61 74 20 77 69 6c 6c 20 61       that will a
bbd0: 6c 6c 6f 77 20 6d 6f 73 74 20 6f 66 20 74 68 65  llow most of the
bbe0: 20 74 65 73 74 20 73 75 69 74 65 20 74 6f 20 72   test suite to r
bbf0: 75 6e 20 28 69 2e 65 2e 20 74 68 6f 73 65 0d 0a  un (i.e. those..
bc00: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
bc10: 74 65 73 74 73 20 74 68 61 74 20 64 6f 20 6e 6f  tests that do no
bc20: 74 20 64 69 72 65 63 74 6c 79 20 72 65 6c 79 20  t directly rely 
bc30: 75 70 6f 6e 20 74 68 65 20 5b 6f 62 6a 65 63 74  upon the [object
bc40: 5d 20 63 6f 6d 6d 61 6e 64 29 2e 0d 0a 20 20 20  ] command)...   
bc50: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
bc60: 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
bc70: 73 20 3a 3a 6e 6f 28 73 68 69 6d 53 51 4c 69 74  s ::no(shimSQLit
bc80: 65 41 73 73 65 6d 62 6c 79 43 6f 6e 73 74 72 61  eAssemblyConstra
bc90: 69 6e 74 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ints)]} then {..
bca0: 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
bcb0: 73 74 72 61 69 6e 74 20 53 51 4c 69 74 65 0d 0a  straint SQLite..
bcc0: 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
bcd0: 73 74 72 61 69 6e 74 20 53 51 4c 69 74 65 49 6e  straint SQLiteIn
bce0: 74 65 72 6f 70 0d 0a 20 20 20 20 20 20 20 20 20  terop..         
bcf0: 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 53   addConstraint S
bd00: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
bd10: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  e..          add
bd20: 43 6f 6e 73 74 72 61 69 6e 74 20 53 79 73 74 65  Constraint Syste
bd30: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 45 6e  m.Data.SQLite.En
bd40: 63 72 79 70 74 69 6f 6e 0d 0a 20 20 20 20 20 20  cryption..      
bd50: 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
bd60: 74 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  t System.Data.SQ
bd70: 4c 69 74 65 2e 4c 69 6e 71 0d 0a 0d 0a 20 20 20  Lite.Linq....   
bd80: 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
bd90: 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
bda0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
bdb0: 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
bdc0: 4c 69 74 65 2e 64 6c 6c 5f 76 20 5b 67 65 74 42  Lite.dll_v [getB
bdd0: 75 69 6c 64 43 6c 72 56 65 72 73 69 6f 6e 5d 5d  uildClrVersion]]
bde0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
bdf0: 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
be00: 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 68  o exists ::no(sh
be10: 69 6d 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f  imSQLiteDefineCo
be20: 6e 73 74 61 6e 74 43 6f 6e 73 74 72 61 69 6e 74  nstantConstraint
be30: 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
be40: 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 64         foreach d
be50: 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 5b 6c  efineConstant [l
be60: 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ist \..         
be70: 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 45 58 54       INTEROP_EXT
be80: 45 4e 53 49 4f 4e 5f 46 55 4e 43 54 49 4f 4e 53  ENSION_FUNCTIONS
be90: 20 49 4e 54 45 52 4f 50 5f 46 54 53 35 5f 45 58   INTEROP_FTS5_EX
bea0: 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20  TENSION \..     
beb0: 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50           INTEROP
bec0: 5f 4a 53 4f 4e 31 5f 45 58 54 45 4e 53 49 4f 4e  _JSON1_EXTENSION
bed0: 20 49 4e 54 45 52 4f 50 5f 50 45 52 43 45 4e 54   INTEROP_PERCENT
bee0: 49 4c 45 5f 45 58 54 45 4e 53 49 4f 4e 20 5c 0d  ILE_EXTENSION \.
bef0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49  .              I
bf00: 4e 54 45 52 4f 50 5f 52 45 47 45 58 50 5f 45 58  NTEROP_REGEXP_EX
bf10: 54 45 4e 53 49 4f 4e 20 49 4e 54 45 52 4f 50 5f  TENSION INTEROP_
bf20: 54 45 53 54 5f 45 58 54 45 4e 53 49 4f 4e 20 5c  TEST_EXTENSION \
bf30: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
bf40: 49 4e 54 45 52 4f 50 5f 54 4f 54 59 50 45 5f 45  INTEROP_TOTYPE_E
bf50: 58 54 45 4e 53 49 4f 4e 20 49 4e 54 45 52 4f 50  XTENSION INTEROP
bf60: 5f 56 49 52 54 55 41 4c 5f 54 41 42 4c 45 20 5c  _VIRTUAL_TABLE \
bf70: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
bf80: 55 53 45 5f 49 4e 54 45 52 4f 50 5f 44 4c 4c 5d  USE_INTEROP_DLL]
bf90: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
bfa0: 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  addConstraint [a
bfb0: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
bfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65 66               def
bfd0: 69 6e 65 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74  ineConstant.Syst
bfe0: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 20  em.Data.SQLite. 
bff0: 24 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 5d  $defineConstant]
c000: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
c010: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
c020: 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
c030: 78 69 73 74 73 20 3a 3a 6e 6f 28 73 68 69 6d 53  xists ::no(shimS
c040: 51 4c 69 74 65 56 69 73 75 61 6c 53 74 75 64 69  QLiteVisualStudi
c050: 6f 43 6f 6e 73 74 72 61 69 6e 74 73 29 5d 7d 20  oConstraints)]} 
c060: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
c070: 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
c080: 5b 61 70 70 65 6e 64 41 72 67 73 20 76 69 73 75  [appendArgs visu
c090: 61 6c 53 74 75 64 69 6f 20 5b 67 65 74 42 75 69  alStudio [getBui
c0a0: 6c 64 59 65 61 72 5d 5d 0d 0a 20 20 20 20 20 20  ldYear]]..      
c0b0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74    }....        t
c0c0: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
c0d0: 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  \n..      }..   
c0e0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
c0f0: 63 68 61 6e 67 65 4e 61 74 69 76 65 52 75 6e 74  changeNativeRunt
c100: 69 6d 65 4f 70 74 69 6f 6e 20 7b 20 6e 61 74 69  imeOption { nati
c110: 76 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66  ve } {..      if
c120: 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66 6f   {[llength [info
c130: 20 63 6f 6d 6d 61 6e 64 73 20 64 65 62 75 67 5d   commands debug]
c140: 5d 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20 20 20  ] > 0 && \..    
c150: 20 20 20 20 20 20 5b 6c 6c 65 6e 67 74 68 20 5b        [llength [
c160: 69 6e 66 6f 20 73 75 62 63 6f 6d 6d 61 6e 64 73  info subcommands
c170: 20 64 65 62 75 67 20 72 75 6e 74 69 6d 65 6f 70   debug runtimeop
c180: 74 69 6f 6e 5d 5d 20 3e 20 30 20 26 26 20 5b 63  tion]] > 0 && [c
c190: 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
c1a0: 64 65 62 75 67 20 72 75 6e 74 69 6d 65 6f 70 74  debug runtimeopt
c1b0: 69 6f 6e 20 5b 65 78 70 72 20 7b 24 6e 61 74 69  ion [expr {$nati
c1c0: 76 65 20 3f 20 22 61 64 64 22 20 3a 20 22 72 65  ve ? "add" : "re
c1d0: 6d 6f 76 65 22 7d 5d 20 6e 61 74 69 76 65 0d 0a  move"}] native..
c1e0: 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74        }] == 0} t
c1f0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
c200: 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20  eturn true..    
c210: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
c220: 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65  {[haveSQLiteObje
c230: 63 74 43 6f 6d 6d 61 6e 64 5d 20 26 26 20 5b 63  ctCommand] && [c
c240: 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
c250: 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49 6e  object invoke In
c260: 74 65 72 70 72 65 74 65 72 2e 47 65 74 41 63 74  terpreter.GetAct
c270: 69 76 65 20 5b 65 78 70 72 20 7b 24 6e 61 74 69  ive [expr {$nati
c280: 76 65 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ve ? \..        
c290: 20 20 20 20 22 41 64 64 52 75 6e 74 69 6d 65 4f      "AddRuntimeO
c2a0: 70 74 69 6f 6e 22 20 3a 20 22 52 65 6d 6f 76 65  ption" : "Remove
c2b0: 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 22 7d 5d  RuntimeOption"}]
c2c0: 20 6e 61 74 69 76 65 0d 0a 20 20 20 20 20 20 7d   native..      }
c2d0: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
c2e0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
c2f0: 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  rue..      }....
c300: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
c310: 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  se..    }.....  
c320: 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53    proc checkForS
c330: 51 4c 69 74 65 42 75 69 6c 64 73 20 7b 20 63 68  QLiteBuilds { ch
c340: 61 6e 6e 65 6c 20 7b 73 65 6c 65 63 74 20 66 61  annel {select fa
c350: 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  lse} } {..      
c360: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
c370: 20 43 68 65 63 6b 20 66 6f 72 20 65 76 65 72 79   Check for every
c380: 20 70 6f 73 73 69 62 6c 65 20 76 61 6c 69 64 20   possible valid 
c390: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 76  combination of v
c3a0: 61 6c 75 65 73 20 75 73 65 64 20 77 68 65 6e 0d  alues used when.
c3b0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6c  .      #       l
c3c0: 6f 63 61 74 69 6e 67 20 6f 75 74 20 74 68 65 20  ocating out the 
c3d0: 62 75 69 6c 64 20 6f 75 74 70 75 74 20 64 69 72  build output dir
c3e0: 65 63 74 6f 72 79 2c 20 73 68 6f 77 69 6e 67 20  ectory, showing 
c3f0: 65 61 63 68 20 61 76 61 69 6c 61 62 6c 65 0d 0a  each available..
c400: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 75        #       bu
c410: 69 6c 64 20 76 61 72 69 61 74 69 6f 6e 20 61 6c  ild variation al
c420: 6f 6e 67 20 74 68 65 20 77 61 79 2e 0d 0a 20 20  ong the way...  
c430: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 66 6f 72      #..      for
c440: 65 61 63 68 20 6e 61 74 69 76 65 20 5b 6c 69 73  each native [lis
c450: 74 20 66 61 6c 73 65 20 74 72 75 65 5d 20 7b 0d  t false true] {.
c460: 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  .        foreach
c470: 20 79 65 61 72 20 5b 67 65 74 42 75 69 6c 64 59   year [getBuildY
c480: 65 61 72 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20  ears] {..       
c490: 20 20 20 66 6f 72 65 61 63 68 20 63 6f 6e 66 69     foreach confi
c4a0: 67 75 72 61 74 69 6f 6e 20 5b 67 65 74 42 75 69  guration [getBui
c4b0: 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  ldConfigurations
c4c0: 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ] {..           
c4d0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
c4e0: 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f  # NOTE: Figure o
c4f0: 75 74 20 74 68 65 20 65 66 66 65 63 74 69 76 65  ut the effective
c500: 20 62 75 69 6c 64 20 70 6c 61 74 66 6f 72 6d 2e   build platform.
c510: 20 20 54 68 69 73 20 69 73 0d 0a 20 20 20 20 20    This is..     
c520: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62         #       b
c530: 61 73 65 64 20 6f 6e 20 77 68 65 74 68 65 72 20  ased on whether 
c540: 6f 72 20 6e 6f 74 20 61 20 5b 70 72 69 6d 61 72  or not a [primar
c550: 69 6c 79 5d 20 6e 61 74 69 76 65 20 62 75 69 6c  ily] native buil
c560: 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  d..            #
c570: 20 20 20 20 20 20 20 69 73 20 62 65 69 6e 67 20         is being 
c580: 75 73 65 64 2e 20 20 46 6f 72 20 5b 70 72 69 6d  used.  For [prim
c590: 61 72 69 6c 79 5d 20 6e 6f 6e 2d 6e 61 74 69 76  arily] non-nativ
c5a0: 65 20 62 75 69 6c 64 73 2c 0d 0a 20 20 20 20 20  e builds,..     
c5b0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
c5c0: 68 69 73 20 77 69 6c 6c 20 62 65 20 61 6e 20 65  his will be an e
c5d0: 6d 70 74 79 20 73 74 72 69 6e 67 2e 0d 0a 20 20  mpty string...  
c5e0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
c5f0: 20 20 20 20 20 20 20 20 20 73 65 74 20 70 6c 61           set pla
c600: 74 66 6f 72 6d 20 5b 67 65 74 42 75 69 6c 64 50  tform [getBuildP
c610: 6c 61 74 66 6f 72 6d 20 24 6e 61 74 69 76 65 5d  latform $native]
c620: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
c630: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
c640: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
c650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
c660: 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
c670: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
c680: 69 74 65 20 62 75 69 6c 64 20 5c 22 22 20 5b 65  ite build \"" [e
c690: 78 70 72 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  xpr \..         
c6a0: 20 20 20 20 20 20 20 7b 24 6e 61 74 69 76 65 20         {$native 
c6b0: 3f 20 22 6e 61 74 69 76 65 2f 22 20 3a 20 22 22  ? "native/" : ""
c6c0: 7d 5d 20 5b 65 78 70 72 20 7b 5b 73 74 72 69 6e  }] [expr {[strin
c6d0: 67 20 6c 65 6e 67 74 68 20 5c 0d 0a 20 20 20 20  g length \..    
c6e0: 20 20 20 20 20 20 20 20 20 20 20 20 24 70 6c 61              $pla
c6f0: 74 66 6f 72 6d 5d 20 3e 20 30 20 3f 20 5b 61 70  tform] > 0 ? [ap
c700: 70 65 6e 64 41 72 67 73 20 24 70 6c 61 74 66 6f  pendArgs $platfo
c710: 72 6d 20 2f 5d 20 3a 20 22 22 7d 5d 20 24 79 65  rm /] : ""}] $ye
c720: 61 72 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ar \..          
c730: 20 20 20 20 20 20 2f 20 24 63 6f 6e 66 69 67 75        / $configu
c740: 72 61 74 69 6f 6e 20 22 5c 22 2e 2e 2e 20 22 5d  ration "\"... "]
c750: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
c760: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  #..            #
c770: 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65   NOTE: Build the
c780: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
c790: 20 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65   directory where
c7a0: 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 0d 0a   the necessary..
c7b0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
c7c0: 20 20 20 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 66      components f
c7d0: 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  or System.Data.S
c7e0: 51 4c 69 74 65 20 73 68 6f 75 6c 64 20 62 65 20  QLite should be 
c7f0: 66 6f 75 6e 64 2e 0d 0a 20 20 20 20 20 20 20 20  found...        
c800: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
c810: 20 20 20 73 65 74 20 64 69 72 65 63 74 6f 72 79     set directory
c820: 20 5b 6a 6f 69 6e 42 75 69 6c 64 44 69 72 65 63   [joinBuildDirec
c830: 74 6f 72 79 20 24 6e 61 74 69 76 65 20 5c 0d 0a  tory $native \..
c840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c850: 5b 67 65 74 42 75 69 6c 64 42 61 73 65 44 69 72  [getBuildBaseDir
c860: 65 63 74 6f 72 79 5d 20 24 79 65 61 72 20 24 70  ectory] $year $p
c870: 6c 61 74 66 6f 72 6d 20 24 63 6f 6e 66 69 67 75  latform $configu
c880: 72 61 74 69 6f 6e 5d 0d 0a 0d 0a 20 20 20 20 20  ration]....     
c890: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
c8a0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f        # NOTE: Do
c8b0: 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 66   the necessary f
c8c0: 69 6c 65 73 20 65 78 69 73 74 3f 20 20 43 75 72  iles exist?  Cur
c8d0: 72 65 6e 74 6c 79 2c 20 6e 6f 20 6f 74 68 65 72  rently, no other
c8e0: 20 73 74 65 70 73 0d 0a 20 20 20 20 20 20 20 20   steps..        
c8f0: 20 20 20 20 23 20 20 20 20 20 20 20 61 72 65 20      #       are 
c900: 74 61 6b 65 6e 20 74 6f 20 76 65 72 69 66 79 20  taken to verify 
c910: 74 68 69 73 20 62 75 69 6c 64 20 69 73 20 61 63  this build is ac
c920: 74 75 61 6c 6c 79 20 76 69 61 62 6c 65 2e 0d 0a  tually viable...
c930: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
c940: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
c950: 69 73 42 75 69 6c 64 41 76 61 69 6c 61 62 6c 65  isBuildAvailable
c960: 20 24 6e 61 74 69 76 65 20 24 64 69 72 65 63 74   $native $direct
c970: 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ory]} then {..  
c980: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
c990: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
c9a0: 4f 54 45 3a 20 57 68 65 6e 20 69 6e 20 22 73 65  OTE: When in "se
c9b0: 6c 65 63 74 22 20 6d 6f 64 65 2c 20 61 75 74 6f  lect" mode, auto
c9c0: 6d 61 74 69 63 61 6c 6c 79 20 73 65 6c 65 63 74  matically select
c9d0: 20 74 68 65 20 66 69 72 73 74 0d 0a 20 20 20 20   the first..    
c9e0: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
c9f0: 20 20 61 76 61 69 6c 61 62 6c 65 20 62 75 69 6c    available buil
ca00: 64 20 6f 66 20 53 79 73 74 65 6d 2e 44 61 74 61  d of System.Data
ca10: 2e 53 51 4c 69 74 65 20 61 6e 64 20 74 68 65 6e  .SQLite and then
ca20: 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 20   return..       
ca30: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69         #       i
ca40: 6d 6d 65 64 69 61 74 65 6c 79 2e 0d 0a 20 20 20  mmediately...   
ca50: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
ca60: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
ca70: 24 73 65 6c 65 63 74 20 26 26 20 5b 6d 61 74 63  $select && [matc
ca80: 68 50 6c 61 74 66 6f 72 6d 20 24 70 6c 61 74 66  hPlatform $platf
ca90: 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  orm]} then {..  
caa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
cab0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
cac0: 20 23 20 4e 4f 54 45 3a 20 4d 61 6e 75 61 6c 6c   # NOTE: Manuall
cad0: 79 20 6f 76 65 72 72 69 64 65 20 61 6c 6c 20 74  y override all t
cae0: 68 65 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f  he build directo
caf0: 72 79 20 73 65 6c 65 63 74 69 6f 6e 0d 0a 20 20  ry selection..  
cb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
cb10: 20 20 20 20 20 20 72 65 6c 61 74 65 64 20 74 65        related te
cb20: 73 74 20 73 65 74 74 69 6e 67 73 20 69 6e 20 6f  st settings in o
cb30: 72 64 65 72 20 74 6f 20 66 6f 72 63 65 20 74 68  rder to force th
cb40: 69 73 20 62 75 69 6c 64 0d 0a 20 20 20 20 20 20  is build..      
cb50: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
cb60: 20 20 6f 66 20 53 79 73 74 65 6d 2e 44 61 74 61    of System.Data
cb70: 2e 53 51 4c 69 74 65 20 74 6f 20 62 65 20 75 73  .SQLite to be us
cb80: 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ed...           
cb90: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
cba0: 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 63 68          if {![ch
cbb0: 61 6e 67 65 4e 61 74 69 76 65 52 75 6e 74 69 6d  angeNativeRuntim
cbc0: 65 4f 70 74 69 6f 6e 20 24 6e 61 74 69 76 65 5d  eOption $native]
cbd0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
cbe0: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
cbf0: 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
cc00: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
cc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc20: 22 6e 6f 2c 20 66 61 69 6c 65 64 20 74 6f 20 22  "no, failed to "
cc30: 20 5b 65 78 70 72 20 7b 24 6e 61 74 69 76 65 20   [expr {$native 
cc40: 3f 20 22 61 64 64 22 20 3a 20 22 72 65 6d 6f 76  ? "add" : "remov
cc50: 65 22 7d 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20  e"}] \..        
cc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
cc70: 74 68 65 20 5c 22 6e 61 74 69 76 65 5c 22 20 72  the \"native\" r
cc80: 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 5c 6e 22  untime option\n"
cc90: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
cca0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61         return fa
ccb0: 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  lse..           
ccc0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
ccd0: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a            set ::
cce0: 74 65 73 74 5f 79 65 61 72 20 24 79 65 61 72 0d  test_year $year.
ccf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
cd00: 20 73 65 74 20 3a 3a 74 65 73 74 5f 70 6c 61 74   set ::test_plat
cd10: 66 6f 72 6d 20 24 70 6c 61 74 66 6f 72 6d 0d 0a  form $platform..
cd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd30: 73 65 74 20 3a 3a 74 65 73 74 5f 63 6f 6e 66 69  set ::test_confi
cd40: 67 75 72 61 74 69 6f 6e 20 24 63 6f 6e 66 69 67  guration $config
cd50: 75 72 61 74 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20  uration....     
cd60: 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
cd70: 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
cd80: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
cd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 79 65               "ye
cda0: 73 2c 20 73 65 6c 65 63 74 65 64 20 28 22 20 5b  s, selected (" [
cdb0: 65 78 70 72 20 7b 24 6e 61 74 69 76 65 20 3f 20  expr {$native ? 
cdc0: 22 6e 61 74 69 76 65 2f 22 20 3a 20 22 22 7d 5d  "native/" : ""}]
cdd0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
cde0: 20 20 20 20 20 20 20 20 5b 65 78 70 72 20 7b 5b          [expr {[
cdf0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70  string length $p
ce00: 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 20 3f 20 5b  latform] > 0 ? [
ce10: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
ce20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce30: 20 20 24 70 6c 61 74 66 6f 72 6d 20 2f 5d 20 3a    $platform /] :
ce40: 20 22 22 7d 5d 20 24 79 65 61 72 20 2f 20 24 63   ""}] $year / $c
ce50: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 22 29 5c  onfiguration ")\
ce60: 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  n"]....         
ce70: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
ce80: 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue..            
ce90: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
cea0: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
ceb0: 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e  s $channel yes\n
cec0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
ced0: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
cee0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
cef0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
cf00: 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20  annel no\n..    
cf10: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
cf20: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
cf30: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
cf40: 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
cf50: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
cf60: 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51 4c  proc checkForSQL
cf70: 69 74 65 52 65 6c 65 61 73 65 73 20 7b 20 63 68  iteReleases { ch
cf80: 61 6e 6e 65 6c 20 7b 73 65 6c 65 63 74 20 66 61  annel {select fa
cf90: 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  lse} } {..      
cfa0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
cfb0: 20 43 68 65 63 6b 20 66 6f 72 20 70 61 73 74 20   Check for past 
cfc0: 72 65 6c 65 61 73 65 73 20 6f 66 20 53 79 73 74  releases of Syst
cfd0: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 69  em.Data.SQLite i
cfe0: 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 0d  n the directory.
cff0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
d000: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
d010: 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  "System.Data.SQL
d020: 69 74 65 22 20 65 6e 76 69 72 6f 6e 6d 65 6e 74  ite" environment
d030: 20 76 61 72 69 61 62 6c 65 2c 20 69 66 0d 0a 20   variable, if.. 
d040: 20 20 20 20 20 23 20 20 20 20 20 20 20 70 72 65       #       pre
d050: 73 65 6e 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  sent...      #..
d060: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
d070: 65 78 69 73 74 73 20 3a 3a 65 6e 76 28 53 79 73  exists ::env(Sys
d080: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 29  tem.Data.SQLite)
d090: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
d0a0: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
d0b0: 20 24 3a 3a 65 6e 76 28 53 79 73 74 65 6d 2e 44   $::env(System.D
d0c0: 61 74 61 2e 53 51 4c 69 74 65 29 5d 20 3e 20 30  ata.SQLite)] > 0
d0d0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
d0e0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
d0f0: 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 66  OTE: Build the f
d100: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 64  ully qualified d
d110: 69 72 65 63 74 6f 72 79 20 77 68 65 72 65 20 74  irectory where t
d120: 68 65 20 6e 65 63 65 73 73 61 72 79 0d 0a 20 20  he necessary..  
d130: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
d140: 6d 70 6f 6e 65 6e 74 73 20 66 6f 72 20 53 79 73  mponents for Sys
d150: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
d160: 73 68 6f 75 6c 64 20 62 65 20 66 6f 75 6e 64 2e  should be found.
d170: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
d180: 20 20 20 20 20 73 65 74 20 64 69 72 65 63 74 6f       set directo
d190: 72 79 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  ry [file nativen
d1a0: 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c  ame [file join \
d1b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 3a  ..            $:
d1c0: 3a 65 6e 76 28 53 79 73 74 65 6d 2e 44 61 74 61  :env(System.Data
d1d0: 2e 53 51 4c 69 74 65 29 20 5b 67 65 74 52 65 6c  .SQLite) [getRel
d1e0: 65 61 73 65 56 65 72 73 69 6f 6e 5d 5d 5d 0d 0a  easeVersion]]]..
d1f0: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
d200: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
d210: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
d220: 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69      "---- checki
d230: 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61  ng for System.Da
d240: 74 61 2e 53 51 4c 69 74 65 20 72 65 6c 65 61 73  ta.SQLite releas
d250: 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  e \"" \..       
d260: 20 20 20 20 20 24 64 69 72 65 63 74 6f 72 79 20       $directory 
d270: 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20  "\"... "]....   
d280: 20 20 20 20 20 69 66 20 7b 5b 69 73 52 65 6c 65       if {[isRele
d290: 61 73 65 41 76 61 69 6c 61 62 6c 65 20 24 64 69  aseAvailable $di
d2a0: 72 65 63 74 6f 72 79 20 70 6c 61 74 66 6f 72 6d  rectory platform
d2b0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
d2c0: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
d2d0: 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72   length $platfor
d2e0: 6d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  m] == 0} then {.
d2f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
d300: 20 70 6c 61 74 66 6f 72 6d 20 75 6e 6b 6e 6f 77   platform unknow
d310: 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  n..          }..
d320: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
d330: 24 73 65 6c 65 63 74 20 26 26 20 5b 6d 61 74 63  $select && [matc
d340: 68 50 6c 61 74 66 6f 72 6d 20 24 70 6c 61 74 66  hPlatform $platf
d350: 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  orm]} then {..  
d360: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a            set ::
d370: 62 75 69 6c 64 5f 64 69 72 65 63 74 6f 72 79 20  build_directory 
d380: 24 64 69 72 65 63 74 6f 72 79 0d 0a 0d 0a 20 20  $directory....  
d390: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
d3a0: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
d3b0: 41 72 67 73 20 22 79 65 73 2c 20 73 65 6c 65 63  Args "yes, selec
d3c0: 74 65 64 20 28 22 20 24 70 6c 61 74 66 6f 72 6d  ted (" $platform
d3d0: 20 22 29 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20   ")\n"]....     
d3e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
d3f0: 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  ue..          } 
d400: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
d410: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
d420: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  el [appendArgs "
d430: 79 65 73 20 28 22 20 24 70 6c 61 74 66 6f 72 6d  yes (" $platform
d440: 20 22 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20   ")\n"]..       
d450: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
d460: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
d470: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
d480: 20 6e 6f 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20 20   no\n....       
d490: 20 20 20 66 6f 72 65 61 63 68 20 70 61 74 68 20     foreach path 
d4a0: 5b 6c 73 6f 72 74 20 2d 64 65 63 72 65 61 73 69  [lsort -decreasi
d4b0: 6e 67 20 5b 66 69 6c 65 20 6c 69 73 74 20 24 64  ng [file list $d
d4c0: 69 72 65 63 74 6f 72 79 20 2a 5d 5d 20 7b 0d 0a  irectory *]] {..
d4d0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
d4e0: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 70 61  [file exists $pa
d4f0: 74 68 5d 20 26 26 20 5b 66 69 6c 65 20 69 73 64  th] && [file isd
d500: 69 72 65 63 74 6f 72 79 20 24 70 61 74 68 5d 7d  irectory $path]}
d510: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
d520: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
d530: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
d540: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
d550: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65         "---- che
d560: 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d  cking for System
d570: 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 72 65 6c  .Data.SQLite rel
d580: 65 61 73 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20  ease \"" \..    
d590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 70                $p
d5a0: 61 74 68 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d  ath "\"... "]...
d5b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
d5c0: 66 20 7b 5b 69 73 52 65 6c 65 61 73 65 41 76 61  f {[isReleaseAva
d5d0: 69 6c 61 62 6c 65 20 24 70 61 74 68 20 70 6c 61  ilable $path pla
d5e0: 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  tform]} then {..
d5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d600: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
d610: 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3d 3d  th $platform] ==
d620: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
d630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
d640: 74 20 70 6c 61 74 66 6f 72 6d 20 75 6e 6b 6e 6f  t platform unkno
d650: 77 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  wn..            
d660: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
d670: 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 73 65           if {$se
d680: 6c 65 63 74 20 26 26 20 5b 6d 61 74 63 68 50 6c  lect && [matchPl
d690: 61 74 66 6f 72 6d 20 24 70 6c 61 74 66 6f 72 6d  atform $platform
d6a0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
d6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
d6c0: 20 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63 74 6f   ::build_directo
d6d0: 72 79 20 24 70 61 74 68 0d 0a 0d 0a 20 20 20 20  ry $path....    
d6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
d6f0: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
d700: 70 65 6e 64 41 72 67 73 20 22 79 65 73 2c 20 73  pendArgs "yes, s
d710: 65 6c 65 63 74 65 64 20 28 22 20 24 70 6c 61 74  elected (" $plat
d720: 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a 0d 0a 20  form ")\n"].... 
d730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d740: 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20   return true..  
d750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20                } 
d760: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
d770: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
d780: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
d790: 41 72 67 73 20 22 79 65 73 20 28 22 20 24 70 6c  Args "yes (" $pl
d7a0: 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a 20  atform ")\n"].. 
d7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
d7c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
d7d0: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
d7e0: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
d7f0: 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20  $channel no\n.. 
d800: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
d810: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
d820: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
d830: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65      }..      } e
d840: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
d850: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
d860: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
d870: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 65           "---- e
d880: 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61  nvironment varia
d890: 62 6c 65 20 5c 22 53 79 73 74 65 6d 2e 44 61 74  ble \"System.Dat
d8a0: 61 2e 53 51 4c 69 74 65 5c 22 20 69 73 20 6e 6f  a.SQLite\" is no
d8b0: 74 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  t " \..         
d8c0: 20 20 20 22 73 65 74 2c 20 73 6b 69 70 70 69 6e     "set, skippin
d8d0: 67 20 63 68 65 63 6b 20 66 6f 72 20 72 65 6c 65  g check for rele
d8e0: 61 73 65 73 2e 2e 2e 5c 6e 22 5d 0d 0a 20 20 20  ases...\n"]..   
d8f0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
d900: 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20  turn false..    
d910: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
d920: 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 4c 69 62  heckForSQLiteLib
d930: 72 61 72 79 20 7b 20 63 68 61 6e 6e 65 6c 20 7d  rary { channel }
d940: 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   {..      tputs 
d950: 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63  $channel "---- c
d960: 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 51 4c 69  hecking for SQLi
d970: 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 2e  te core library.
d980: 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66  .. "....      if
d990: 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
d9a0: 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
d9b0: 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
d9c0: 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
d9d0: 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
d9e0: 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 53 51  QLite.SQLite3 SQ
d9f0: 4c 69 74 65 56 65 72 73 69 6f 6e 0d 0a 20 20 20  LiteVersion..   
da00: 20 20 20 7d 20 76 65 72 73 69 6f 6e 5d 20 3d 3d     } version] ==
da10: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
da20: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
da30: 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20   NOTE: Check if 
da40: 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 65 72  the returned ver
da50: 73 69 6f 6e 20 77 61 73 20 6e 75 6c 6c 2e 20 20  sion was null.  
da60: 49 66 20 73 6f 2c 20 6d 61 6b 65 20 69 74 20 65  If so, make it e
da70: 61 73 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20  asy..        #  
da80: 20 20 20 20 20 74 6f 20 73 70 6f 74 2e 0d 0a 20       to spot... 
da90: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
daa0: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
dab0: 6e 67 74 68 20 24 76 65 72 73 69 6f 6e 5d 20 3d  ngth $version] =
dac0: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
dad0: 20 20 20 20 20 20 20 73 65 74 20 76 65 72 73 69         set versi
dae0: 6f 6e 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20  on null..       
daf0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
db00: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
db10: 20 41 74 74 65 6d 70 74 20 74 6f 20 71 75 65 72   Attempt to quer
db20: 79 20 74 68 65 20 46 6f 73 73 69 6c 20 73 6f 75  y the Fossil sou
db30: 72 63 65 20 69 64 65 6e 74 69 66 69 65 72 20 66  rce identifier f
db40: 6f 72 20 74 68 65 20 53 51 4c 69 74 65 0d 0a 20  or the SQLite.. 
db50: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
db60: 6f 72 65 20 6c 69 62 72 61 72 79 2e 0d 0a 20 20  ore library...  
db70: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
db80: 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
db90: 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
dba0: 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
dbb0: 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
dbc0: 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
dbd0: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
dbe0: 69 74 65 33 20 53 51 4c 69 74 65 53 6f 75 72 63  ite3 SQLiteSourc
dbf0: 65 49 64 0d 0a 20 20 20 20 20 20 20 20 7d 20 73  eId..        } s
dc00: 6f 75 72 63 65 49 64 5d 7d 20 74 68 65 6e 20 7b  ourceId]} then {
dc10: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
dc20: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
dc30: 20 57 65 20 66 61 69 6c 65 64 20 74 6f 20 71 75   We failed to qu
dc40: 65 72 79 20 74 68 65 20 46 6f 73 73 69 6c 20 73  ery the Fossil s
dc50: 6f 75 72 63 65 20 69 64 65 6e 74 69 66 69 65 72  ource identifier
dc60: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
dc70: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73 6f            set so
dc80: 75 72 63 65 49 64 20 75 6e 6b 6e 6f 77 6e 0d 0a  urceId unknown..
dc90: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
dca0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
dcb0: 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66  # NOTE: Check if
dcc0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 46 6f   the returned Fo
dcd0: 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e  ssil source iden
dce0: 74 69 66 69 65 72 20 77 61 73 20 6e 75 6c 6c 2e  tifier was null.
dcf0: 20 20 49 66 0d 0a 20 20 20 20 20 20 20 20 23 20    If..        # 
dd00: 20 20 20 20 20 20 73 6f 2c 20 6d 61 6b 65 20 69        so, make i
dd10: 74 20 65 61 73 79 20 74 6f 20 73 70 6f 74 2e 0d  t easy to spot..
dd20: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
dd30: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
dd40: 6c 65 6e 67 74 68 20 24 73 6f 75 72 63 65 49 64  length $sourceId
dd50: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
dd60: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73 6f            set so
dd70: 75 72 63 65 49 64 20 6e 75 6c 6c 0d 0a 20 20 20  urceId null..   
dd80: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
dd90: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
dda0: 4f 54 45 3a 20 59 65 73 2c 20 74 68 65 20 53 51  OTE: Yes, the SQ
ddb0: 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72  Lite core librar
ddc0: 79 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20  y appears to be 
ddd0: 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20  available...    
dde0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61      #..        a
ddf0: 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 53 51 4c  ddConstraint SQL
de00: 69 74 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74  ite....        t
de10: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
de20: 70 70 65 6e 64 41 72 67 73 20 22 79 65 73 20 28  ppendArgs "yes (
de30: 22 20 24 76 65 72 73 69 6f 6e 20 22 20 22 20 24  " $version " " $
de40: 73 6f 75 72 63 65 49 64 20 22 29 5c 6e 22 5d 0d  sourceId ")\n"].
de50: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
de60: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
de70: 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20  channel no\n..  
de80: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
de90: 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46  .    proc checkF
dea0: 6f 72 53 51 4c 69 74 65 49 6e 74 65 72 6f 70 20  orSQLiteInterop 
deb0: 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20  { channel } {.. 
dec0: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
ded0: 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69  nel "---- checki
dee0: 6e 67 20 66 6f 72 20 53 51 4c 69 74 65 20 69 6e  ng for SQLite in
def0: 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 2e 2e  terop assembly..
df00: 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  . "....      if 
df10: 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
df20: 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
df30: 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
df40: 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
df50: 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
df60: 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 49 6e 74  Lite.SQLite3 Int
df70: 65 72 6f 70 56 65 72 73 69 6f 6e 0d 0a 20 20 20  eropVersion..   
df80: 20 20 20 7d 20 76 65 72 73 69 6f 6e 5d 20 3d 3d     } version] ==
df90: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
dfa0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
dfb0: 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20   NOTE: Check if 
dfc0: 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 65 72  the returned ver
dfd0: 73 69 6f 6e 20 77 61 73 20 6e 75 6c 6c 2e 20 20  sion was null.  
dfe0: 49 66 20 73 6f 2c 20 6d 61 6b 65 20 69 74 20 65  If so, make it e
dff0: 61 73 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20  asy..        #  
e000: 20 20 20 20 20 74 6f 20 73 70 6f 74 2e 0d 0a 20       to spot... 
e010: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
e020: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
e030: 6e 67 74 68 20 24 76 65 72 73 69 6f 6e 5d 20 3d  ngth $version] =
e040: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
e050: 20 20 20 20 20 20 20 73 65 74 20 76 65 72 73 69         set versi
e060: 6f 6e 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20  on null..       
e070: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
e080: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
e090: 20 41 74 74 65 6d 70 74 20 74 6f 20 71 75 65 72   Attempt to quer
e0a0: 79 20 74 68 65 20 46 6f 73 73 69 6c 20 73 6f 75  y the Fossil sou
e0b0: 72 63 65 20 69 64 65 6e 74 69 66 69 65 72 20 66  rce identifier f
e0c0: 6f 72 20 74 68 65 20 53 51 4c 69 74 65 0d 0a 20  or the SQLite.. 
e0d0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
e0e0: 6f 72 65 20 6c 69 62 72 61 72 79 2e 0d 0a 20 20  ore library...  
e0f0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
e100: 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
e110: 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
e120: 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
e130: 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
e140: 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
e150: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
e160: 69 74 65 33 20 49 6e 74 65 72 6f 70 53 6f 75 72  ite3 InteropSour
e170: 63 65 49 64 0d 0a 20 20 20 20 20 20 20 20 7d 20  ceId..        } 
e180: 73 6f 75 72 63 65 49 64 5d 7d 20 74 68 65 6e 20  sourceId]} then 
e190: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
e1a0: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
e1b0: 3a 20 57 65 20 66 61 69 6c 65 64 20 74 6f 20 71  : We failed to q
e1c0: 75 65 72 79 20 74 68 65 20 46 6f 73 73 69 6c 20  uery the Fossil 
e1d0: 73 6f 75 72 63 65 20 69 64 65 6e 74 69 66 69 65  source identifie
e1e0: 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  r...          #.
e1f0: 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73  .          set s
e200: 6f 75 72 63 65 49 64 20 75 6e 6b 6e 6f 77 6e 0d  ourceId unknown.
e210: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
e220: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
e230: 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
e240: 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 46  f the returned F
e250: 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65  ossil source ide
e260: 6e 74 69 66 69 65 72 20 77 61 73 20 6e 75 6c 6c  ntifier was null
e270: 2e 20 20 49 66 0d 0a 20 20 20 20 20 20 20 20 23  .  If..        #
e280: 20 20 20 20 20 20 20 73 6f 2c 20 6d 61 6b 65 20         so, make 
e290: 69 74 20 65 61 73 79 20 74 6f 20 73 70 6f 74 2e  it easy to spot.
e2a0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
e2b0: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
e2c0: 20 6c 65 6e 67 74 68 20 24 73 6f 75 72 63 65 49   length $sourceI
e2d0: 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  d] == 0} then {.
e2e0: 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73  .          set s
e2f0: 6f 75 72 63 65 49 64 20 6e 75 6c 6c 0d 0a 20 20  ourceId null..  
e300: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
e310: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
e320: 4e 4f 54 45 3a 20 42 65 66 6f 72 65 20 61 63 74  NOTE: Before act
e330: 75 61 6c 6c 79 20 61 64 64 69 6e 67 20 74 68 65  ually adding the
e340: 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74   test constraint
e350: 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 0d  , make sure the.
e360: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
e370: 20 76 65 72 73 69 6f 6e 20 69 73 20 76 61 6c 69   version is vali
e380: 64 20 28 69 2e 65 2e 20 6e 6f 74 20 6a 75 73 74  d (i.e. not just
e390: 20 74 68 61 74 20 77 65 20 63 6f 75 6c 64 20 71   that we could q
e3a0: 75 65 72 79 20 69 74 29 2e 0d 0a 20 20 20 20 20  uery it)...     
e3b0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
e3c0: 20 7b 24 76 65 72 73 69 6f 6e 20 6e 65 20 22 6e   {$version ne "n
e3d0: 75 6c 6c 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ull"} then {..  
e3e0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
e3f0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73       # NOTE: Yes
e400: 2c 20 74 68 65 20 53 51 4c 69 74 65 20 69 6e 74  , the SQLite int
e410: 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 61 70  erop assembly ap
e420: 70 65 61 72 73 20 74 6f 20 62 65 20 61 76 61 69  pears to be avai
e430: 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  lable...        
e440: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 61    #..          a
e450: 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 53 51 4c  ddConstraint SQL
e460: 69 74 65 49 6e 74 65 72 6f 70 0d 0a 0d 0a 20 20  iteInterop....  
e470: 20 20 20 20 20 20 20 20 73 65 74 20 61 6e 73 77          set answ
e480: 65 72 20 79 65 73 0d 0a 20 20 20 20 20 20 20 20  er yes..        
e490: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
e4a0: 20 20 20 20 73 65 74 20 61 6e 73 77 65 72 20 6e      set answer n
e4b0: 6f 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  o..        }....
e4c0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
e4d0: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
e4e0: 67 73 20 24 61 6e 73 77 65 72 20 22 20 28 22 20  gs $answer " (" 
e4f0: 24 76 65 72 73 69 6f 6e 20 22 20 22 20 24 73 6f  $version " " $so
e500: 75 72 63 65 49 64 20 22 29 5c 6e 22 5d 0d 0a 20  urceId ")\n"].. 
e510: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
e520: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
e530: 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20  annel no\n..    
e540: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
e550: 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72     proc checkFor
e560: 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73  SQLiteDefineCons
e570: 74 61 6e 74 20 7b 20 63 68 61 6e 6e 65 6c 20 6e  tant { channel n
e580: 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74  ame } {..      t
e590: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
e5a0: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
e5b0: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65         "---- che
e5c0: 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d  cking for System
e5d0: 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 64 65 66  .Data.SQLite def
e5e0: 69 6e 65 20 63 6f 6e 73 74 61 6e 74 20 5c 22 22  ine constant \""
e5f0: 20 24 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20   $name \..      
e600: 20 20 20 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d      "\"... "]...
e610: 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63  .      if {[catc
e620: 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a  h {..        obj
e630: 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
e640: 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
e650: 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
e660: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53  em.Data.SQLite.S
e670: 51 4c 69 74 65 33 20 44 65 66 69 6e 65 43 6f 6e  QLite3 DefineCon
e680: 73 74 61 6e 74 73 0d 0a 20 20 20 20 20 20 7d 20  stants..      } 
e690: 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73 5d  defineConstants]
e6a0: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
e6b0: 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 73 65 61         if {[lsea
e6c0: 72 63 68 20 2d 65 78 61 63 74 20 2d 6e 6f 63 61  rch -exact -noca
e6d0: 73 65 20 24 64 65 66 69 6e 65 43 6f 6e 73 74 61  se $defineConsta
e6e0: 6e 74 73 20 24 6e 61 6d 65 5d 20 21 3d 20 2d 31  nts $name] != -1
e6f0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
e700: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
e710: 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 74 68   # NOTE: Yes, th
e720: 69 73 20 64 65 66 69 6e 65 20 63 6f 6e 73 74 61  is define consta
e730: 6e 74 20 77 61 73 20 65 6e 61 62 6c 65 64 20 77  nt was enabled w
e740: 68 65 6e 20 74 68 65 20 6d 61 6e 61 67 65 64 0d  hen the managed.
e750: 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
e760: 20 20 20 61 73 73 65 6d 62 6c 79 20 77 61 73 20     assembly was 
e770: 63 6f 6d 70 69 6c 65 64 2e 0d 0a 20 20 20 20 20  compiled...     
e780: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
e790: 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
e7a0: 5b 61 70 70 65 6e 64 41 72 67 73 20 64 65 66 69  [appendArgs defi
e7b0: 6e 65 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74 65  neConstant.Syste
e7c0: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 20 24  m.Data.SQLite. $
e7d0: 6e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  name]....       
e7e0: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
e7f0: 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 20  l yes\n..       
e800: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
e810: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
e820: 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20  nel no\n..      
e830: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73    }..      } els
e840: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e {..        tpu
e850: 74 73 20 24 63 68 61 6e 6e 65 6c 20 65 72 72 6f  ts $channel erro
e860: 72 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  r\n..      }..  
e870: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
e880: 20 67 65 74 44 61 74 65 54 69 6d 65 46 6f 72 6d   getDateTimeForm
e890: 61 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  at {} {..      #
e8a0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
e8b0: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 73  This procedure s
e8c0: 69 6d 70 6c 79 20 72 65 74 75 72 6e 73 20 74 68  imply returns th
e8d0: 65 20 22 64 65 66 61 75 6c 74 22 20 44 61 74 65  e "default" Date
e8e0: 54 69 6d 65 20 66 6f 72 6d 61 74 20 75 73 65 64  Time format used
e8f0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
e900: 62 79 20 74 68 65 20 74 65 73 74 20 73 75 69 74  by the test suit
e910: 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
e920: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
e930: 73 74 73 20 3a 3a 64 61 74 65 74 69 6d 65 5f 66  sts ::datetime_f
e940: 6f 72 6d 61 74 5d 20 26 26 20 5c 0d 0a 20 20 20  ormat] && \..   
e950: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
e960: 65 6e 67 74 68 20 24 3a 3a 64 61 74 65 74 69 6d  ength $::datetim
e970: 65 5f 66 6f 72 6d 61 74 5d 20 3e 20 30 7d 20 74  e_format] > 0} t
e980: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
e990: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
e9a0: 3a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 61 6e  : Return the man
e9b0: 75 61 6c 6c 79 20 6f 76 65 72 72 69 64 64 65 6e  ually overridden
e9c0: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 44   value for the D
e9d0: 61 74 65 54 69 6d 65 20 66 6f 72 6d 61 74 2e 0d  ateTime format..
e9e0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
e9f0: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 64 61      return $::da
ea00: 74 65 74 69 6d 65 5f 66 6f 72 6d 61 74 0d 0a 20  tetime_format.. 
ea10: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
ea20: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
ea30: 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e    # NOTE: Return
ea40: 20 61 6e 20 49 53 4f 38 36 30 31 20 44 61 74 65   an ISO8601 Date
ea50: 54 69 6d 65 20 66 6f 72 6d 61 74 20 63 6f 6d 70  Time format comp
ea60: 61 74 69 62 6c 65 20 77 69 74 68 20 53 51 4c 69  atible with SQLi
ea70: 74 65 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20  te,..        #  
ea80: 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
ea90: 2e 53 51 4c 69 74 65 2c 20 61 6e 64 20 73 75 69  .SQLite, and sui
eaa0: 74 61 62 6c 65 20 66 6f 72 20 72 6f 75 6e 64 2d  table for round-
eab0: 74 72 69 70 70 69 6e 67 20 77 69 74 68 20 74 68  tripping with th
eac0: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
ead0: 20 20 20 44 61 74 65 54 69 6d 65 20 63 6c 61 73     DateTime clas
eae0: 73 20 6f 66 20 74 68 65 20 66 72 61 6d 65 77 6f  s of the framewo
eaf0: 72 6b 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c  rk.  If this val
eb00: 75 65 20 69 73 20 63 68 61 6e 67 65 64 2c 0d 0a  ue is changed,..
eb10: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
eb20: 76 61 72 69 6f 75 73 20 74 65 73 74 73 20 6d 61  various tests ma
eb30: 79 20 66 61 69 6c 2e 0d 0a 20 20 20 20 20 20 20  y fail...       
eb40: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
eb50: 72 6e 20 22 79 79 79 79 2d 4d 4d 2d 64 64 20 48  rn "yyyy-MM-dd H
eb60: 48 3a 6d 6d 3a 73 73 2e 46 46 46 46 46 46 46 4b  H:mm:ss.FFFFFFFK
eb70: 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  "..      }..    
eb80: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 65  }.....    proc e
eb90: 6e 75 6d 65 72 61 62 6c 65 54 6f 4c 69 73 74 20  numerableToList 
eba0: 7b 20 65 6e 75 6d 65 72 61 62 6c 65 20 7d 20 7b  { enumerable } {
ebb0: 0d 0a 20 20 20 20 20 20 73 65 74 20 72 65 73 75  ..      set resu
ebc0: 6c 74 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20  lt [list]....   
ebd0: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
ebe0: 65 6e 67 74 68 20 24 65 6e 75 6d 65 72 61 62 6c  ength $enumerabl
ebf0: 65 5d 20 3d 3d 20 30 20 7c 7c 20 24 65 6e 75 6d  e] == 0 || $enum
ec00: 65 72 61 62 6c 65 20 65 71 20 22 6e 75 6c 6c 22  erable eq "null"
ec10: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
ec20: 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74    return $result
ec30: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
ec40: 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63     object foreac
ec50: 68 20 2d 61 6c 69 61 73 20 69 74 65 6d 20 24 65  h -alias item $e
ec60: 6e 75 6d 65 72 61 62 6c 65 20 7b 0d 0a 20 20 20  numerable {..   
ec70: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
ec80: 20 6c 65 6e 67 74 68 20 24 69 74 65 6d 5d 20 3e   length $item] >
ec90: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
eca0: 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65        lappend re
ecb0: 73 75 6c 74 20 5b 24 69 74 65 6d 20 54 6f 53 74  sult [$item ToSt
ecc0: 72 69 6e 67 5d 0d 0a 20 20 20 20 20 20 20 20 7d  ring]..        }
ecd0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
ece0: 20 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c     return $resul
ecf0: 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  t..    }.....   
ed00: 20 70 72 6f 63 20 63 61 74 63 68 41 6e 64 52 65   proc catchAndRe
ed10: 74 75 72 6e 20 7b 20 73 63 72 69 70 74 20 7b 73  turn { script {s
ed20: 74 61 63 6b 54 72 61 63 65 20 66 61 6c 73 65 7d  tackTrace false}
ed30: 20 7b 73 74 72 69 63 74 20 74 72 75 65 7d 20 7d   {strict true} }
ed40: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
ed50: 20 20 20 23 20 4e 4f 54 45 3a 20 45 76 61 6c 75     # NOTE: Evalu
ed60: 61 74 65 20 74 68 65 20 73 63 72 69 70 74 20 70  ate the script p
ed70: 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20 63  rovided by our c
ed80: 61 6c 6c 65 72 20 69 6e 20 74 68 65 69 72 20 63  aller in their c
ed90: 6f 6e 74 65 78 74 2c 0d 0a 20 20 20 20 20 20 23  ontext,..      #
eda0: 20 20 20 20 20 20 20 63 61 70 74 75 72 69 6e 67         capturing
edb0: 20 62 6f 74 68 20 74 68 65 20 72 65 73 75 6c 74   both the result
edc0: 20 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e 20   and the return 
edd0: 63 6f 64 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  code...      #..
ede0: 20 20 20 20 20 20 73 65 74 20 63 6f 64 65 20 5b        set code [
edf0: 63 61 74 63 68 20 7b 75 70 6c 65 76 65 6c 20 31  catch {uplevel 1
ee00: 20 24 73 63 72 69 70 74 7d 20 72 65 73 75 6c 74   $script} result
ee10: 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ]....      #..  
ee20: 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 69 64 20      # NOTE: Did 
ee30: 74 68 65 20 73 63 72 69 70 74 20 70 72 6f 76 69  the script provi
ee40: 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65  ded by our calle
ee50: 72 20 4e 4f 54 20 72 61 69 73 65 20 61 6e 20 65  r NOT raise an e
ee60: 72 72 6f 72 3f 0d 0a 20 20 20 20 20 20 23 0d 0a  rror?..      #..
ee70: 20 20 20 20 20 20 69 66 20 7b 24 73 74 72 69 63        if {$stric
ee80: 74 20 26 26 20 24 63 6f 64 65 20 3d 3d 20 30 20  t && $code == 0 
ee90: 7c 7c 20 21 24 73 74 72 69 63 74 20 26 26 20 24  || !$strict && $
eea0: 63 6f 64 65 20 21 3d 20 31 7d 20 74 68 65 6e 20  code != 1} then 
eeb0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
eec0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 75        # NOTE: Su
eed0: 63 63 65 73 73 2e 20 20 52 65 74 75 72 6e 20 61  ccess.  Return a
eee0: 20 6c 69 73 74 20 77 69 74 68 20 74 68 65 20 72   list with the r
eef0: 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 74  eturn code and t
ef00: 68 65 20 72 65 73 75 6c 74 2e 0d 0a 20 20 20 20  he result...    
ef10: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
ef20: 65 74 75 72 6e 20 5b 6c 69 73 74 20 24 63 6f 64  eturn [list $cod
ef30: 65 20 24 72 65 73 75 6c 74 5d 0d 0a 20 20 20 20  e $result]..    
ef40: 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 73 74 61    } elseif {$sta
ef50: 63 6b 54 72 61 63 65 7d 20 74 68 65 6e 20 7b 0d  ckTrace} then {.
ef60: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
ef70: 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 69 6c      # NOTE: Fail
ef80: 75 72 65 2e 20 20 4f 75 72 20 63 61 6c 6c 65 72  ure.  Our caller
ef90: 20 77 61 6e 74 73 20 61 20 66 75 6c 6c 20 73 74   wants a full st
efa0: 61 63 6b 20 74 72 61 63 65 20 28 69 66 20 61 70  ack trace (if ap
efb0: 70 6c 69 63 61 62 6c 65 29 2c 0d 0a 20 20 20 20  plicable),..    
efc0: 20 20 20 20 23 20 20 20 20 20 20 20 72 65 74 75      #       retu
efd0: 72 6e 20 61 20 6c 69 73 74 20 77 69 74 68 20 74  rn a list with t
efe0: 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61  he return code a
eff0: 6e 64 20 74 68 65 20 72 65 73 75 6c 74 20 76 65  nd the result ve
f000: 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20  rbatim...       
f010: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
f020: 72 6e 20 5b 6c 69 73 74 20 24 63 6f 64 65 20 24  rn [list $code $
f030: 72 65 73 75 6c 74 5d 0d 0a 20 20 20 20 20 20 7d  result]..      }
f040: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
f050: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
f060: 54 45 3a 20 46 61 69 6c 75 72 65 2e 20 20 4f 75  TE: Failure.  Ou
f070: 72 20 63 61 6c 6c 65 72 20 64 6f 65 73 20 6e 6f  r caller does no
f080: 74 20 77 61 6e 74 20 61 20 66 75 6c 6c 20 73 74  t want a full st
f090: 61 63 6b 20 74 72 61 63 65 20 28 69 66 0d 0a 20  ack trace (if.. 
f0a0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
f0b0: 70 70 6c 69 63 61 62 6c 65 29 2c 20 72 65 74 75  pplicable), retu
f0c0: 72 6e 20 61 20 6c 69 73 74 20 77 69 74 68 20 74  rn a list with t
f0d0: 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 2c 20  he return code, 
f0e0: 74 68 65 20 65 72 72 6f 72 0d 0a 20 20 20 20 20  the error..     
f0f0: 20 20 20 23 20 20 20 20 20 20 20 63 6f 64 65 20     #       code 
f100: 66 6f 72 20 74 68 65 20 69 6e 74 65 72 70 72 65  for the interpre
f110: 74 65 72 2c 20 61 6e 64 20 74 68 65 20 65 72 72  ter, and the err
f120: 6f 72 20 6d 65 73 73 61 67 65 20 75 70 20 74 6f  or message up to
f130: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
f140: 20 20 20 20 20 20 70 6f 69 6e 74 20 77 68 65 72        point wher
f150: 65 20 74 68 65 20 73 74 61 63 6b 20 74 72 61 63  e the stack trac
f160: 65 20 73 68 6f 75 6c 64 20 73 74 61 72 74 2e 0d  e should start..
f170: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
f180: 20 20 20 20 73 65 74 20 69 6e 64 65 78 20 5b 73      set index [s
f190: 74 72 69 6e 67 20 66 69 72 73 74 20 22 20 20 20  tring first "   
f1a0: 61 74 20 22 20 24 72 65 73 75 6c 74 5d 3b 20 23  at " $result]; #
f1b0: 20 48 41 43 4b 3a 20 52 65 6c 69 61 62 6c 65 3f   HACK: Reliable?
f1c0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75  ....        retu
f1d0: 72 6e 20 5b 6c 69 73 74 20 24 63 6f 64 65 20 24  rn [list $code $
f1e0: 3a 3a 65 72 72 6f 72 43 6f 64 65 20 5b 65 78 70  ::errorCode [exp
f1f0: 72 20 7b 24 69 6e 64 65 78 20 21 3d 20 2d 31 20  r {$index != -1 
f200: 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ? \..           
f210: 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 5b 73   [string trim [s
f220: 74 72 69 6e 67 20 72 61 6e 67 65 20 24 72 65 73  tring range $res
f230: 75 6c 74 20 30 20 24 69 6e 64 65 78 5d 5d 20 3a  ult 0 $index]] :
f240: 20 24 72 65 73 75 6c 74 7d 5d 5d 0d 0a 20 20 20   $result}]]..   
f250: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
f260: 20 20 20 20 70 72 6f 63 20 63 6f 6d 70 69 6c 65      proc compile
f270: 43 53 68 61 72 70 57 69 74 68 20 7b 0d 0a 20 20  CSharpWith {..  
f280: 20 20 20 20 20 20 20 20 20 20 74 65 78 74 20 6d            text m
f290: 65 6d 6f 72 79 20 73 79 6d 62 6f 6c 73 20 73 74  emory symbols st
f2a0: 72 69 63 74 20 72 65 73 75 6c 74 73 56 61 72 4e  rict resultsVarN
f2b0: 61 6d 65 20 65 72 72 6f 72 73 56 61 72 4e 61 6d  ame errorsVarNam
f2c0: 65 20 66 69 6c 65 4e 61 6d 65 73 0d 0a 20 20 20  e fileNames..   
f2d0: 20 20 20 20 20 20 20 20 20 61 72 67 73 20 7d 20           args } 
f2e0: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
f2f0: 20 20 23 20 4e 4f 54 45 3a 20 53 69 6e 63 65 20    # NOTE: Since 
f300: 77 65 20 61 72 65 20 67 6f 69 6e 67 20 74 6f 20  we are going to 
f310: 75 73 65 20 74 68 69 73 20 6d 65 74 68 6f 64 20  use this method 
f320: 6e 61 6d 65 20 61 20 6c 6f 74 2c 20 61 73 73 69  name a lot, assi
f330: 67 6e 20 69 74 20 74 6f 20 61 0d 0a 20 20 20 20  gn it to a..    
f340: 20 20 23 20 20 20 20 20 20 20 76 61 72 69 61 62    #       variab
f350: 6c 65 20 66 69 72 73 74 2e 0d 0a 20 20 20 20 20  le first...     
f360: 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 61 64   #..      set ad
f370: 64 20 52 65 66 65 72 65 6e 63 65 64 41 73 73 65  d ReferencedAsse
f380: 6d 62 6c 69 65 73 2e 41 64 64 0d 0a 0d 0a 20 20  mblies.Add....  
f390: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
f3a0: 4f 54 45 3a 20 43 72 65 61 74 65 20 74 68 65 20  OTE: Create the 
f3b0: 62 61 73 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  base command to 
f3c0: 65 76 61 6c 75 61 74 65 20 61 6e 64 20 61 64 64  evaluate and add
f3d0: 20 74 68 65 20 70 72 6f 70 65 72 74 79 20 73 65   the property se
f3e0: 74 74 69 6e 67 73 0d 0a 20 20 20 20 20 20 23 20  ttings..      # 
f3f0: 20 20 20 20 20 20 74 68 61 74 20 61 72 65 20 61        that are a
f400: 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 6e 65 65  lmost always nee
f410: 64 65 64 20 62 79 20 6f 75 72 20 75 6e 69 74 20  ded by our unit 
f420: 74 65 73 74 73 20 28 69 2e 65 2e 20 74 68 65 20  tests (i.e. the 
f430: 53 79 73 74 65 6d 0d 0a 20 20 20 20 20 20 23 20  System..      # 
f440: 20 20 20 20 20 20 61 6e 64 20 53 79 73 74 65 6d        and System
f450: 2e 44 61 74 61 20 61 73 73 65 6d 62 6c 79 20 72  .Data assembly r
f460: 65 66 65 72 65 6e 63 65 73 29 2e 0d 0a 20 20 20  eferences)...   
f470: 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
f480: 63 6f 6d 6d 61 6e 64 20 5b 6c 69 73 74 20 5c 0d  command [list \.
f490: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6d 70 69  .          compi
f4a0: 6c 65 43 53 68 61 72 70 20 24 74 65 78 74 20 24  leCSharp $text $
f4b0: 6d 65 6d 6f 72 79 20 24 73 79 6d 62 6f 6c 73 20  memory $symbols 
f4c0: 24 73 74 72 69 63 74 20 72 65 73 75 6c 74 73 20  $strict results 
f4d0: 65 72 72 6f 72 73 20 5c 0d 0a 20 20 20 20 20 20  errors \..      
f4e0: 20 20 20 20 24 61 64 64 20 53 79 73 74 65 6d 2e      $add System.
f4f0: 64 6c 6c 20 24 61 64 64 20 53 79 73 74 65 6d 2e  dll $add System.
f500: 44 61 74 61 2e 64 6c 6c 20 24 61 64 64 20 53 79  Data.dll $add Sy
f510: 73 74 65 6d 2e 54 72 61 6e 73 61 63 74 69 6f 6e  stem.Transaction
f520: 73 2e 64 6c 6c 20 5c 0d 0a 20 20 20 20 20 20 20  s.dll \..       
f530: 20 20 20 24 61 64 64 20 53 79 73 74 65 6d 2e 58     $add System.X
f540: 6d 6c 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20  ml.dll]....     
f550: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
f560: 3a 20 41 64 64 20 61 6c 6c 20 74 68 65 20 70 72  : Add all the pr
f570: 6f 76 69 64 65 64 20 66 69 6c 65 20 6e 61 6d 65  ovided file name
f580: 73 20 61 73 20 61 73 73 65 6d 62 6c 79 20 72 65  s as assembly re
f590: 66 65 72 65 6e 63 65 73 2e 0d 0a 20 20 20 20 20  ferences...     
f5a0: 20 23 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63   #..      foreac
f5b0: 68 20 66 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  h fileName $file
f5c0: 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
f5d0: 20 6c 61 70 70 65 6e 64 20 63 6f 6d 6d 61 6e 64   lappend command
f5e0: 20 24 61 64 64 20 5b 67 65 74 42 69 6e 61 72 79   $add [getBinary
f5f0: 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61  FileName $fileNa
f600: 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  me]..      }....
f610: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
f620: 20 4e 4f 54 45 3a 20 41 64 64 20 74 68 65 20 65   NOTE: Add the e
f630: 78 74 72 61 20 61 72 67 75 6d 65 6e 74 73 2c 20  xtra arguments, 
f640: 69 66 20 61 6e 79 2c 20 74 6f 20 74 68 65 20 63  if any, to the c
f650: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 75 61  ommand to evalua
f660: 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  te...      #..  
f670: 20 20 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64      eval lappend
f680: 20 63 6f 6d 6d 61 6e 64 20 24 61 72 67 73 0d 0a   command $args..
f690: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
f6a0: 20 23 20 4e 4f 54 45 3a 20 41 6c 69 61 73 20 74   # NOTE: Alias t
f6b0: 68 65 20 63 6f 6d 70 69 6c 65 72 20 6c 6f 63 61  he compiler loca
f6c0: 6c 20 72 65 73 75 6c 74 73 20 61 6e 64 20 65 72  l results and er
f6d0: 72 6f 72 73 20 76 61 72 69 61 62 6c 65 73 20 74  rors variables t
f6e0: 6f 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  o the..      #  
f6f0: 20 20 20 20 20 76 61 72 69 61 62 6c 65 20 6e 61       variable na
f700: 6d 65 73 20 70 72 6f 76 69 64 65 64 20 62 79 20  mes provided by 
f710: 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20  our caller...   
f720: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
f730: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
f740: 72 65 73 75 6c 74 73 56 61 72 4e 61 6d 65 5d 20  resultsVarName] 
f750: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
f760: 20 20 20 20 20 75 70 76 61 72 20 31 20 24 72 65       upvar 1 $re
f770: 73 75 6c 74 73 56 61 72 4e 61 6d 65 20 72 65 73  sultsVarName res
f780: 75 6c 74 73 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  ults..      }...
f790: 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
f7a0: 6e 67 20 6c 65 6e 67 74 68 20 24 65 72 72 6f 72  ng length $error
f7b0: 73 56 61 72 4e 61 6d 65 5d 20 3e 20 30 7d 20 74  sVarName] > 0} t
f7c0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 75  hen {..        u
f7d0: 70 76 61 72 20 31 20 24 65 72 72 6f 72 73 56 61  pvar 1 $errorsVa
f7e0: 72 4e 61 6d 65 20 65 72 72 6f 72 73 0d 0a 20 20  rName errors..  
f7f0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
f800: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
f810: 45 76 61 6c 75 61 74 65 20 74 68 65 20 63 6f 6e  Evaluate the con
f820: 73 74 72 75 63 74 65 64 20 5b 63 6f 6d 70 69 6c  structed [compil
f830: 65 43 53 68 61 72 70 5d 20 63 6f 6d 6d 61 6e 64  eCSharp] command
f840: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0d   and return the.
f850: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72  .      #       r
f860: 65 73 75 6c 74 2e 0d 0a 20 20 20 20 20 20 23 0d  esult...      #.
f870: 0a 20 20 20 20 20 20 65 76 61 6c 20 24 63 6f 6d  .      eval $com
f880: 6d 61 6e 64 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  mand..    }.....
f890: 20 20 20 20 70 72 6f 63 20 69 73 4d 65 6d 6f 72      proc isMemor
f8a0: 79 44 62 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d  yDb { fileName }
f8b0: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
f8c0: 20 20 20 23 20 4e 4f 54 45 3a 20 49 73 20 74 68     # NOTE: Is th
f8d0: 65 20 73 70 65 63 69 66 69 65 64 20 64 61 74 61  e specified data
f8e0: 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 72  base file name r
f8f0: 65 61 6c 6c 79 20 61 6e 20 69 6e 2d 6d 65 6d 6f  eally an in-memo
f900: 72 79 20 64 61 74 61 62 61 73 65 3f 0d 0a 20 20  ry database?..  
f910: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74      #..      ret
f920: 75 72 6e 20 5b 65 78 70 72 20 7b 24 66 69 6c 65  urn [expr {$file
f930: 4e 61 6d 65 20 65 71 20 22 3a 6d 65 6d 6f 72 79  Name eq ":memory
f940: 3a 22 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20  :" || \..       
f950: 20 20 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65     [string range
f960: 20 24 66 69 6c 65 4e 61 6d 65 20 30 20 31 32 5d   $fileName 0 12]
f970: 20 65 71 20 22 66 69 6c 65 3a 3a 6d 65 6d 6f 72   eq "file::memor
f980: 79 3a 22 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  y:"}]..    }....
f990: 0a 20 20 20 20 70 72 6f 63 20 69 73 54 61 62 6c  .    proc isTabl
f9a0: 65 49 6e 44 62 20 7b 20 6e 61 6d 65 20 7b 76 61  eInDb { name {va
f9b0: 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a 20  rName db} } {.. 
f9c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
f9d0: 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74  NOTE: Refer to t
f9e0: 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72  he specified var
f9f0: 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22  iable (e.g. "db"
fa00: 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74  ) in the context
fa10: 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23   of our..      #
fa20: 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20 20         caller.  
fa30: 49 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  It contains the 
fa40: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
fa50: 69 6f 6e 20 68 61 6e 64 6c 65 20 74 68 61 74 20  ion handle that 
fa60: 77 69 6c 6c 20 62 65 0d 0a 20 20 20 20 20 20 23  will be..      #
fa70: 20 20 20 20 20 20 20 75 73 65 64 20 74 6f 20 65         used to e
fa80: 78 65 63 75 74 65 20 74 68 65 20 71 75 65 72 79  xecute the query
fa90: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
faa0: 6e 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  ne if the named 
fab0: 74 61 62 6c 65 20 69 73 0d 0a 20 20 20 20 20 20  table is..      
fac0: 23 20 20 20 20 20 20 20 70 72 65 73 65 6e 74 20  #       present 
fad0: 69 6e 20 74 68 61 74 20 64 61 74 61 62 61 73 65  in that database
fae0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
faf0: 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
fb00: 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23  me db....      #
fb10: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
fb20: 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  Use the sqlite_m
fb30: 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f 20 64  aster table to d
fb40: 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
fb50: 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73 0d 0a  named table is..
fb60: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 72        #       pr
fb70: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74  esent in the dat
fb80: 61 62 61 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d  abase...      #.
fb90: 0a 20 20 20 20 20 20 73 65 74 20 73 71 6c 20 7b  .      set sql {
fba0: 0d 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  ..        SELECT
fbb0: 20 43 4f 55 4e 54 28 2a 29 20 46 52 4f 4d 20 73   COUNT(*) FROM s
fbc0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45  qlite_master WHE
fbd0: 52 45 20 74 79 70 65 20 3d 20 27 74 61 62 6c 65  RE type = 'table
fbe0: 27 20 41 4e 44 20 6e 61 6d 65 20 3d 20 3f 3b 0d  ' AND name = ?;.
fbf0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
fc00: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
fc10: 45 3a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  E: Return non-ze
fc20: 72 6f 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  ro if the named 
fc30: 74 61 62 6c 65 20 69 73 20 70 72 65 73 65 6e 74  table is present
fc40: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
fc50: 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b    return [expr {
fc60: 0d 0a 20 20 20 20 20 20 20 20 5b 73 71 6c 20 65  ..        [sql e
fc70: 78 65 63 75 74 65 20 2d 65 78 65 63 75 74 65 20  xecute -execute 
fc80: 73 63 61 6c 61 72 20 24 64 62 20 24 73 71 6c 20  scalar $db $sql 
fc90: 5b 6c 69 73 74 20 70 61 72 61 6d 31 20 53 74 72  [list param1 Str
fca0: 69 6e 67 20 24 6e 61 6d 65 5d 5d 20 3e 20 30 0d  ing $name]] > 0.
fcb0: 0a 20 20 20 20 20 20 7d 5d 0d 0a 20 20 20 20 7d  .      }]..    }
fcc0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72  .....    proc tr
fcd0: 69 6d 53 71 6c 20 7b 20 73 71 6c 20 7d 20 7b 0d  imSql { sql } {.
fce0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 72  .      return [r
fcf0: 65 67 73 75 62 20 2d 61 6c 6c 20 2d 2d 20 7b 5c  egsub -all -- {\
fd00: 73 2b 7d 20 5b 73 74 72 69 6e 67 20 74 72 69 6d  s+} [string trim
fd10: 20 24 73 71 6c 5d 20 22 20 22 5d 0d 0a 20 20 20   $sql] " "]..   
fd20: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
fd30: 65 78 65 63 75 74 65 53 71 6c 20 7b 20 73 71 6c  executeSql { sql
fd40: 20 7b 65 78 65 63 75 74 65 20 6e 6f 6e 65 7d 20   {execute none} 
fd50: 7b 66 6f 72 6d 61 74 20 6e 6f 6e 65 7d 20 7b 66  {format none} {f
fd60: 69 6c 65 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d  ileName ""} } {.
fd70: 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
fd80: 6e 67 20 6c 65 6e 67 74 68 20 24 66 69 6c 65 4e  ng length $fileN
fd90: 61 6d 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ame] == 0} then 
fda0: 7b 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 3a 6d  {set fileName :m
fdb0: 65 6d 6f 72 79 3a 7d 0d 0a 20 20 20 20 20 20 73  emory:}..      s
fdc0: 65 74 75 70 44 62 20 24 66 69 6c 65 4e 61 6d 65  etupDb $fileName
fdd0: 20 22 22 20 22 22 20 22 22 20 22 22 20 22 22 20   "" "" "" "" "" 
fde0: 66 61 6c 73 65 20 66 61 6c 73 65 20 66 61 6c 73  false false fals
fdf0: 65 20 66 61 6c 73 65 20 64 62 20 74 72 75 65 0d  e false db true.
fe00: 0a 0d 0a 20 20 20 20 20 20 74 72 79 20 7b 0d 0a  ...      try {..
fe10: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
fe20: 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20  uplevel 1 [list 
fe30: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  \..            s
fe40: 71 6c 20 65 78 65 63 75 74 65 20 2d 65 78 65 63  ql execute -exec
fe50: 75 74 65 20 24 65 78 65 63 75 74 65 20 2d 66 6f  ute $execute -fo
fe60: 72 6d 61 74 20 24 66 6f 72 6d 61 74 20 24 64 62  rmat $format $db
fe70: 20 24 73 71 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d   $sql]]..      }
fe80: 20 66 69 6e 61 6c 6c 79 20 7b 0d 0a 20 20 20 20   finally {..    
fe90: 20 20 20 20 63 6c 65 61 6e 75 70 44 62 20 24 66      cleanupDb $f
fea0: 69 6c 65 4e 61 6d 65 20 64 62 20 66 61 6c 73 65  ileName db false
feb0: 20 66 61 6c 73 65 20 66 61 6c 73 65 0d 0a 20 20   false false..  
fec0: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
fed0: 0a 20 20 20 20 70 72 6f 63 20 68 61 73 4e 6f 46  .    proc hasNoF
fee0: 6c 61 67 73 20 7b 20 76 61 72 4e 61 6d 65 20 6e  lags { varName n
fef0: 6f 6e 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 75  one } {..      u
ff00: 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20  pvar 1 $varName 
ff10: 66 6c 61 67 73 0d 0a 0d 0a 20 20 20 20 20 20 69  flags....      i
ff20: 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
ff30: 20 66 6c 61 67 73 5d 7d 20 74 68 65 6e 20 7b 0d   flags]} then {.
ff40: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
ff50: 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  true..      }...
ff60: 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
ff70: 6e 67 20 6c 65 6e 67 74 68 20 24 66 6c 61 67 73  ng length $flags
ff80: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
ff90: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
ffa0: 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  rue..      }....
ffb0: 20 20 20 20 20 20 69 66 20 7b 24 6e 6f 6e 65 20        if {$none 
ffc0: 26 26 20 24 66 6c 61 67 73 20 65 71 20 22 4e 6f  && $flags eq "No
ffd0: 6e 65 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ne"} then {..   
ffe0: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
fff0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
10000 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d     return false.
10010 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
10020 72 6f 63 20 67 65 74 43 6f 6e 6e 65 63 74 69 6f  roc getConnectio
10030 6e 46 6c 61 67 73 20 7b 20 66 69 6c 65 4e 61 6d  nFlags { fileNam
10040 65 20 66 6c 61 67 73 20 7b 71 75 69 65 74 20 66  e flags {quiet f
10050 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  alse} } {..     
10060 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
10070 3a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 69  : Figure out whi
10080 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ch database file
10090 20 6e 61 6d 65 20 6f 72 20 63 6f 6e 6e 65 63 74   name or connect
100a0 69 6f 6e 20 73 74 72 69 6e 67 20 74 68 65 73 65  ion string these
100b0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
100c0 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
100d0 20 77 69 6c 6c 20 61 63 74 75 61 6c 6c 79 20 61   will actually a
100e0 70 70 6c 79 20 74 6f 2e 20 20 54 68 69 73 20 69  pply to.  This i
100f0 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 0d  s not necessary.
10100 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69  .      #       i
10110 6e 20 71 75 69 65 74 20 6d 6f 64 65 20 62 65 63  n quiet mode bec
10120 61 75 73 65 20 74 68 69 73 20 69 6e 66 6f 72 6d  ause this inform
10130 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73  ation is only us
10140 65 64 20 66 6f 72 20 6c 6f 67 67 69 6e 67 0d 0a  ed for logging..
10150 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6e        #       an
10160 64 20 72 65 70 6f 72 74 69 6e 67 20 70 75 72 70  d reporting purp
10170 6f 73 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  oses...      #..
10180 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
10190 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
101a0 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
101b0 65 6e 67 74 68 20 24 66 69 6c 65 4e 61 6d 65 5d  ength $fileName]
101c0 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
101d0 20 20 20 20 20 20 20 20 73 65 74 20 64 61 74 61          set data
101e0 62 61 73 65 20 5b 61 70 70 65 6e 64 41 72 67 73  base [appendArgs
101f0 20 22 66 69 6c 65 20 6e 61 6d 65 20 5c 22 22 20   "file name \"" 
10200 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5d 0d 0a 20  $fileName \"].. 
10210 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20         } elseif 
10220 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
10230 64 61 74 61 53 6f 75 72 63 65 5d 20 26 26 20 5c  dataSource] && \
10240 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 21 5b  ..            ![
10250 61 72 72 61 79 20 65 78 69 73 74 73 20 3a 3a 64  array exists ::d
10260 61 74 61 53 6f 75 72 63 65 5d 7d 20 74 68 65 6e  ataSource]} then
10270 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
10280 74 20 64 61 74 61 62 61 73 65 20 5b 61 70 70 65  t database [appe
10290 6e 64 41 72 67 73 20 22 64 61 74 61 20 73 6f 75  ndArgs "data sou
102a0 72 63 65 20 5c 22 22 20 24 3a 3a 64 61 74 61 53  rce \"" $::dataS
102b0 6f 75 72 63 65 20 5c 22 5d 0d 0a 20 20 20 20 20  ource \"]..     
102c0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
102d0 20 20 20 20 20 20 20 73 65 74 20 64 61 74 61 62         set datab
102e0 61 73 65 20 3c 75 6e 6b 6e 6f 77 6e 3e 0d 0a 20  ase <unknown>.. 
102f0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
10300 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
10310 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77      # NOTE: Show
10320 20 28 61 6e 64 20 6c 6f 67 29 20 74 68 65 20 6c   (and log) the l
10330 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ocal connection 
10340 66 6c 61 67 73 20 61 6e 64 20 74 68 65 20 61 73  flags and the as
10350 73 6f 63 69 61 74 65 64 0d 0a 20 20 20 20 20 20  sociated..      
10360 23 20 20 20 20 20 20 20 64 61 74 61 20 73 6f 75  #       data sou
10370 72 63 65 20 6f 72 20 66 69 6c 65 20 6e 61 6d 65  rce or file name
10380 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
10390 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
103a0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
103b0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
103c0 20 3a 3a 6e 6f 28 65 6d 69 74 4c 6f 63 61 6c 46   ::no(emitLocalF
103d0 6c 61 67 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20  lags)] && \..   
103e0 20 20 20 20 20 20 20 20 20 28 21 5b 69 6e 66 6f           (![info
103f0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69   exists ::no(emi
10400 74 4c 6f 63 61 6c 46 6c 61 67 73 49 66 4e 6f 6e  tLocalFlagsIfNon
10410 65 29 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20  e)] || \..      
10420 20 20 20 20 20 20 20 21 5b 68 61 73 4e 6f 46 6c         ![hasNoFl
10430 61 67 73 20 66 6c 61 67 73 20 66 61 6c 73 65 5d  ags flags false]
10440 29 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  )} then {..     
10450 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
10460 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
10470 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
10480 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 6f          "---- lo
10490 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  cal connection f
104a0 6c 61 67 73 20 66 6f 72 20 22 20 24 64 61 74 61  lags for " $data
104b0 62 61 73 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  base \..        
104c0 20 20 20 20 20 20 22 20 61 72 65 3a 20 22 20 5b        " are: " [
104d0 65 78 70 72 20 7b 21 5b 68 61 73 4e 6f 46 6c 61  expr {![hasNoFla
104e0 67 73 20 66 6c 61 67 73 20 66 61 6c 73 65 5d 20  gs flags false] 
104f0 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ? \..           
10500 20 20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c     [appendArgs \
10510 22 20 24 66 6c 61 67 73 20 5c 22 5d 20 3a 20 22  " $flags \"] : "
10520 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20  <none>"}] \n].. 
10530 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
10540 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
10550 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77      # NOTE: Show
10560 20 28 61 6e 64 20 6c 6f 67 29 20 74 68 65 20 73   (and log) the s
10570 68 61 72 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e  hared connection
10580 20 66 6c 61 67 73 2e 0d 0a 20 20 20 20 20 20 23   flags...      #
10590 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71 75  ..      if {!$qu
105a0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
105b0 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
105c0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a  {..          obj
105d0 65 63 74 20 69 6e 76 6f 6b 65 20 53 79 73 74 65  ect invoke Syste
105e0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51  m.Data.SQLite.SQ
105f0 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 53  LiteConnection S
10600 68 61 72 65 64 46 6c 61 67 73 0d 0a 20 20 20 20  haredFlags..    
10610 20 20 20 20 7d 20 73 68 61 72 65 64 46 6c 61 67      } sharedFlag
10620 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  s] == 0} then {.
10630 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
10640 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
10650 6f 28 65 6d 69 74 53 68 61 72 65 64 46 6c 61 67  o(emitSharedFlag
10660 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  s)] && \..      
10670 20 20 20 20 20 20 20 20 28 21 5b 69 6e 66 6f 20          (![info 
10680 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74  exists ::no(emit
10690 53 68 61 72 65 64 46 6c 61 67 73 49 66 4e 6f 6e  SharedFlagsIfNon
106a0 65 29 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20  e)] || \..      
106b0 20 20 20 20 20 20 20 20 20 21 5b 68 61 73 4e 6f           ![hasNo
106c0 46 6c 61 67 73 20 73 68 61 72 65 64 46 6c 61 67  Flags sharedFlag
106d0 73 20 74 72 75 65 5d 29 7d 20 74 68 65 6e 20 7b  s true])} then {
106e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
106f0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
10700 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
10710 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
10720 20 20 20 22 2d 2d 2d 2d 20 73 68 61 72 65 64 20     "---- shared 
10730 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
10740 20 66 6f 72 20 22 20 24 64 61 74 61 62 61 73 65   for " $database
10750 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
10760 20 20 20 20 22 20 61 72 65 3a 20 22 20 5b 65 78      " are: " [ex
10770 70 72 20 7b 21 5b 68 61 73 4e 6f 46 6c 61 67 73  pr {![hasNoFlags
10780 20 73 68 61 72 65 64 46 6c 61 67 73 20 74 72 75   sharedFlags tru
10790 65 5d 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20  e] ? \..        
107a0 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41          [appendA
107b0 72 67 73 20 5c 22 20 24 73 68 61 72 65 64 46 6c  rgs \" $sharedFl
107c0 61 67 73 20 5c 22 5d 20 3a 20 22 3c 6e 6f 6e 65  ags \"] : "<none
107d0 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  >"}] \n]..      
107e0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
107f0 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
10800 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
10810 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 53 68  ists ::no(emitSh
10820 61 72 65 64 46 6c 61 67 73 29 5d 20 26 26 20 5c  aredFlags)] && \
10830 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
10840 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
10850 6e 6f 28 65 6d 69 74 53 68 61 72 65 64 46 6c 61  no(emitSharedFla
10860 67 73 49 66 55 6e 61 76 61 69 6c 61 62 6c 65 29  gsIfUnavailable)
10870 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
10880 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
10890 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
108a0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
108b0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
108c0 2d 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63 74  - shared connect
108d0 69 6f 6e 20 66 6c 61 67 73 20 66 6f 72 20 22 20  ion flags for " 
108e0 24 64 61 74 61 62 61 73 65 20 5c 0d 0a 20 20 20  $database \..   
108f0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 61               " a
10900 72 65 3a 20 3c 75 6e 61 76 61 69 6c 61 62 6c 65  re: <unavailable
10910 3e 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  >\n"]..         
10920 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
10930 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
10940 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
10950 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f 67 29 20   Show (and log) 
10960 74 68 65 20 64 65 74 65 63 74 65 64 20 67 6c 6f  the detected glo
10970 62 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  bal connection f
10980 6c 61 67 73 2c 20 69 66 20 61 6e 79 2e 0d 0a 20  lags, if any... 
10990 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
109a0 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
109b0 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  {..        if {!
109c0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
109d0 6f 28 65 6d 69 74 47 6c 6f 62 61 6c 46 6c 61 67  o(emitGlobalFlag
109e0 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  s)] && \..      
109f0 20 20 20 20 20 20 28 21 5b 69 6e 66 6f 20 65 78        (![info ex
10a00 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 47 6c  ists ::no(emitGl
10a10 6f 62 61 6c 46 6c 61 67 73 49 66 4e 6f 6e 65 29  obalFlagsIfNone)
10a20 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] || \..        
10a30 20 20 20 20 20 21 5b 68 61 73 4e 6f 46 6c 61 67       ![hasNoFlag
10a40 73 20 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66  s ::connection_f
10a50 6c 61 67 73 20 66 61 6c 73 65 5d 29 7d 20 74 68  lags false])} th
10a60 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
10a70 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
10a80 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
10a90 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
10aa0 20 20 20 22 2d 2d 2d 2d 20 67 6c 6f 62 61 6c 20     "---- global 
10ab0 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
10ac0 20 61 72 65 3a 20 22 20 5c 0d 0a 20 20 20 20 20   are: " \..     
10ad0 20 20 20 20 20 20 20 20 20 5b 65 78 70 72 20 7b           [expr {
10ae0 21 5b 68 61 73 4e 6f 46 6c 61 67 73 20 3a 3a 63  ![hasNoFlags ::c
10af0 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73 20  onnection_flags 
10b00 66 61 6c 73 65 5d 20 3f 20 5c 0d 0a 20 20 20 20  false] ? \..    
10b10 20 20 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e            [appen
10b20 64 41 72 67 73 20 5c 22 20 24 3a 3a 63 6f 6e 6e  dArgs \" $::conn
10b30 65 63 74 69 6f 6e 5f 66 6c 61 67 73 20 5c 22 5d  ection_flags \"]
10b40 20 3a 20 22 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e   : "<none>"}] \n
10b50 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
10b60 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
10b70 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
10b80 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  If there are any
10b90 20 67 6c 6f 62 61 6c 20 28 70 65 72 20 74 65 73   global (per tes
10ba0 74 20 72 75 6e 29 20 63 6f 6e 6e 65 63 74 69 6f  t run) connectio
10bb0 6e 20 66 6c 61 67 73 20 63 75 72 72 65 6e 74 6c  n flags currentl
10bc0 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
10bd0 20 73 65 74 2c 20 75 73 65 20 74 68 65 6d 20 6e   set, use them n
10be0 6f 77 20 28 69 2e 65 2e 20 62 79 20 63 6f 6d 62  ow (i.e. by comb
10bf0 69 6e 69 6e 67 20 74 68 65 6d 20 77 69 74 68 20  ining them with 
10c00 74 68 65 20 6f 6e 65 73 20 66 6f 72 20 74 68 69  the ones for thi
10c10 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
10c20 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0d 0a 20   connection)... 
10c30 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
10c40 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
10c50 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67  :connection_flag
10c60 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  s]} then {..    
10c70 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
10c80 20 4e 4f 54 45 3a 20 43 6f 6d 62 69 6e 65 20 61   NOTE: Combine a
10c90 6e 64 2f 6f 72 20 72 65 70 6c 61 63 65 20 74 68  nd/or replace th
10ca0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61  e connection fla
10cb0 67 73 20 61 6e 64 20 74 68 65 6e 20 73 68 6f 77  gs and then show
10cc0 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
10cd0 20 20 20 20 20 20 6e 65 77 20 76 61 6c 75 65 2e        new value.
10ce0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
10cf0 20 20 20 20 20 73 65 74 20 66 6c 61 67 73 20 5b       set flags [
10d00 63 6f 6d 62 69 6e 65 46 6c 61 67 73 20 24 66 6c  combineFlags $fl
10d10 61 67 73 20 24 3a 3a 63 6f 6e 6e 65 63 74 69 6f  ags $::connectio
10d20 6e 5f 66 6c 61 67 73 5d 0d 0a 0d 0a 20 20 20 20  n_flags]....    
10d30 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
10d40 20 4e 4f 54 45 3a 20 53 68 6f 77 20 28 61 6e 64   NOTE: Show (and
10d50 20 6c 6f 67 29 20 74 68 65 20 6e 65 77 20 65 66   log) the new ef
10d60 66 65 63 74 69 76 65 20 63 6f 6e 6e 65 63 74 69  fective connecti
10d70 6f 6e 20 66 6c 61 67 73 2e 0d 0a 20 20 20 20 20  on flags...     
10d80 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
10d90 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
10da0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
10db0 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
10dc0 3a 6e 6f 28 65 6d 69 74 43 6f 6d 62 69 6e 65 64  :no(emitCombined
10dd0 46 6c 61 67 73 29 5d 20 26 26 20 5c 0d 0a 20 20  Flags)] && \..  
10de0 20 20 20 20 20 20 20 20 20 20 20 20 28 21 5b 69              (![i
10df0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
10e00 65 6d 69 74 43 6f 6d 62 69 6e 65 64 46 6c 61 67  emitCombinedFlag
10e10 73 49 66 4e 6f 6e 65 29 5d 20 7c 7c 20 5c 0d 0a  sIfNone)] || \..
10e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21                 !
10e30 5b 68 61 73 4e 6f 46 6c 61 67 73 20 66 6c 61 67  [hasNoFlags flag
10e40 73 20 66 61 6c 73 65 5d 29 7d 20 74 68 65 6e 20  s false])} then 
10e50 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
10e60 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
10e70 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
10e80 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
10e90 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 6d 62 69 6e      "---- combin
10ea0 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c  ed connection fl
10eb0 61 67 73 20 66 6f 72 20 22 20 24 64 61 74 61 62  ags for " $datab
10ec0 61 73 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ase \..         
10ed0 20 20 20 20 20 20 20 22 20 61 72 65 3a 20 22 20         " are: " 
10ee0 5b 65 78 70 72 20 7b 21 5b 68 61 73 4e 6f 46 6c  [expr {![hasNoFl
10ef0 61 67 73 20 66 6c 61 67 73 20 66 61 6c 73 65 5d  ags flags false]
10f00 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   ? \..          
10f10 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72 67        [appendArg
10f20 73 20 5c 22 20 24 66 6c 61 67 73 20 5c 22 5d 20  s \" $flags \"] 
10f30 3a 20 22 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d  : "<none>"}] \n]
10f40 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
10f50 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
10f60 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
10f70 6e 20 24 66 6c 61 67 73 0d 0a 20 20 20 20 7d 0d  n $flags..    }.
10f80 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
10f90 46 6c 61 67 73 50 72 6f 70 65 72 74 79 20 7b 20  FlagsProperty { 
10fa0 7b 66 6c 61 67 73 20 22 22 7d 20 7b 71 75 69 65  {flags ""} {quie
10fb0 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20  t false} } {..  
10fc0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
10fd0 4f 54 45 3a 20 44 65 74 65 72 6d 69 6e 65 20 77  OTE: Determine w
10fe0 68 61 74 20 74 68 65 20 63 6f 6d 62 69 6e 65 64  hat the combined
10ff0 20 28 67 6c 6f 62 61 6c 20 61 6e 64 20 6c 6f 63   (global and loc
11000 61 6c 29 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a  al) connection..
11010 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66 6c        #       fl
11020 61 67 73 20 73 68 6f 75 6c 64 20 62 65 2c 20 70  ags should be, p
11030 6f 73 73 69 62 6c 79 20 71 75 69 65 74 6c 79 2e  ossibly quietly.
11040 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
11050 20 73 65 74 20 66 6c 61 67 73 20 5b 67 65 74 43   set flags [getC
11060 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 20 22  onnectionFlags "
11070 22 20 24 66 6c 61 67 73 20 24 71 75 69 65 74 5d  " $flags $quiet]
11080 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
11090 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6e 6f     # NOTE: If no
110a0 20 67 6c 6f 62 61 6c 20 6f 72 20 6c 6f 63 61 6c   global or local
110b0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67   connection flag
110c0 73 20 77 65 72 65 20 73 70 65 63 69 66 69 65 64  s were specified
110d0 2c 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  , the..      #  
110e0 20 20 20 20 20 64 65 66 61 75 6c 74 20 63 6f 6e       default con
110f0 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 73 68  nection flags sh
11100 6f 75 6c 64 20 62 65 20 75 73 65 64 3b 20 74 68  ould be used; th
11110 65 72 65 66 6f 72 65 2c 20 72 65 74 75 72 6e 0d  erefore, return.
11120 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
11130 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20 69  n empty string i
11140 6e 20 74 68 61 74 20 63 61 73 65 2e 0d 0a 20 20  n that case...  
11150 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
11160 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
11170 24 66 6c 61 67 73 5d 20 3d 3d 20 30 7d 20 74 68  $flags] == 0} th
11180 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
11190 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 20 20 7d  turn ""..      }
111a0 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
111b0 20 20 20 23 20 4e 4f 54 45 3a 20 49 6e 20 6f 72     # NOTE: In or
111c0 64 65 72 20 74 6f 20 63 68 65 63 6b 20 69 66 20  der to check if 
111d0 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6e 6e  the default conn
111e0 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 61 72 65  ection flags are
111f0 20 62 65 69 6e 67 20 75 73 65 64 0d 0a 20 20 20   being used..   
11200 20 20 20 23 20 20 20 20 20 20 20 69 74 20 69 73     #       it is
11210 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 74   necessary to at
11220 74 65 6d 70 74 20 61 20 63 6f 6e 76 65 72 73 69  tempt a conversi
11230 6f 6e 20 74 6f 20 74 68 65 20 61 63 74 75 61 6c  on to the actual
11240 20 65 6e 75 6d 65 72 61 74 65 64 0d 0a 20 20 20   enumerated..   
11250 20 20 20 23 20 20 20 20 20 20 20 74 79 70 65 2e     #       type.
11260 20 20 46 61 69 6c 69 6e 67 20 74 68 61 74 2c 20    Failing that, 
11270 74 68 65 20 63 68 65 63 6b 20 61 67 61 69 6e 73  the check agains
11280 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61  t the default va
11290 6c 75 65 20 77 69 6c 6c 20 62 65 0d 0a 20 20 20  lue will be..   
112a0 20 20 20 23 20 20 20 20 20 20 20 73 6b 69 70 70     #       skipp
112b0 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ed...      #..  
112c0 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
112d0 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 65 72  ..        set er
112e0 72 6f 72 20 6e 75 6c 6c 3b 20 23 20 49 47 4e 4f  ror null; # IGNO
112f0 52 45 44 0d 0a 0d 0a 20 20 20 20 20 20 20 20 6f  RED....        o
11300 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 55 74 69  bject invoke Uti
11310 6c 69 74 79 20 54 72 79 50 61 72 73 65 46 6c 61  lity TryParseFla
11320 67 73 45 6e 75 6d 20 22 22 20 5c 0d 0a 20 20 20  gsEnum "" \..   
11330 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
11340 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69  Data.SQLite.SQLi
11350 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67  teConnectionFlag
11360 73 20 22 22 20 24 66 6c 61 67 73 20 6e 75 6c 6c  s "" $flags null
11370 20 74 72 75 65 20 5c 0d 0a 20 20 20 20 20 20 20   true \..       
11380 20 20 20 20 20 74 72 75 65 20 65 72 72 6f 72 0d       true error.
11390 0a 20 20 20 20 20 20 7d 20 76 61 6c 75 65 5d 7d  .      } value]}
113a0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
113b0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
113c0 54 45 3a 20 41 74 74 65 6d 70 74 69 6e 67 20 74  TE: Attempting t
113d0 6f 20 70 61 72 73 65 20 74 68 65 20 63 6f 6e 6e  o parse the conn
113e0 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 63 61 75  ection flags cau
113f0 73 65 64 20 61 20 73 63 72 69 70 74 0d 0a 20 20  sed a script..  
11400 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65 72        #       er
11410 72 6f 72 2e 20 20 45 6d 69 74 20 61 20 77 61 72  ror.  Emit a war
11420 6e 69 6e 67 20 74 6f 20 74 68 65 20 74 65 73 74  ning to the test
11430 20 6c 6f 67 20 66 69 6c 65 20 61 6e 64 20 63 6f   log file and co
11440 6e 74 69 6e 75 65 0d 0a 20 20 20 20 20 20 20 20  ntinue..        
11450 23 20 20 20 20 20 20 20 75 73 69 6e 67 20 61 6e  #       using an
11460 20 65 6d 74 70 79 20 73 74 72 69 6e 67 20 69 6e   emtpy string in
11470 73 74 65 61 64 2e 0d 0a 20 20 20 20 20 20 20 20  stead...        
11480 23 0d 0a 20 20 20 20 20 20 20 20 74 6c 6f 67 20  #..        tlog 
11490 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
114a0 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
114b0 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
114c0 20 74 6f 20 70 61 72 73 65 20 63 6f 6e 6e 65 63   to parse connec
114d0 74 69 6f 6e 20 66 6c 61 67 73 2c 20 65 72 72 6f  tion flags, erro
114e0 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  r: " \..        
114f0 20 20 20 20 5c 6e 5c 74 20 24 76 61 6c 75 65 20      \n\t $value 
11500 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73  \n]....        s
11510 65 74 20 76 61 6c 75 65 20 22 22 0d 0a 20 20 20  et value ""..   
11520 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
11530 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
11540 66 20 74 68 65 20 63 6f 6d 62 69 6e 65 64 20 66  f the combined f
11550 6c 61 67 73 20 73 74 72 69 6e 67 20 63 6f 75 6c  lags string coul
11560 64 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62  d not actually b
11570 65 20 63 6f 6e 76 65 72 74 65 64 0d 0a 20 20 20  e converted..   
11580 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 74 68     #       to th
11590 65 20 65 6e 75 6d 65 72 61 74 65 64 20 74 79 70  e enumerated typ
115a0 65 20 69 74 20 69 73 20 74 68 65 20 64 65 66 61  e it is the defa
115b0 75 6c 74 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  ult value, then 
115c0 6a 75 73 74 20 75 73 65 0d 0a 20 20 20 20 20 20  just use..      
115d0 23 20 20 20 20 20 20 20 69 74 20 76 65 72 62 61  #       it verba
115e0 74 69 6d 3b 20 6f 74 68 65 72 77 69 73 65 2c 20  tim; otherwise, 
115f0 6a 75 73 74 20 72 65 74 75 72 6e 20 61 6e 20 65  just return an e
11600 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 20 49 6e  mpty string.  In
11610 20 74 68 61 74 0d 0a 20 20 20 20 20 20 23 20 20   that..      #  
11620 20 20 20 20 20 63 61 73 65 2c 20 74 68 65 20 64       case, the d
11630 65 66 61 75 6c 74 20 63 6f 6e 6e 65 63 74 69 6f  efault connectio
11640 6e 20 66 6c 61 67 73 20 77 69 6c 6c 20 62 65 20  n flags will be 
11650 75 73 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  used...      #..
11660 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
11670 67 20 6c 65 6e 67 74 68 20 24 76 61 6c 75 65 5d  g length $value]
11680 20 3d 3d 20 30 20 7c 7c 20 24 76 61 6c 75 65 20   == 0 || $value 
11690 6e 65 20 22 44 65 66 61 75 6c 74 22 7d 20 74 68  ne "Default"} th
116a0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
116b0 0a 20 20 20 20 20 20 20 20 23 20 57 41 52 4e 49  .        # WARNI
116c0 4e 47 3a 20 54 68 69 73 20 72 65 74 75 72 6e 73  NG: This returns
116d0 20 74 68 65 20 73 74 72 69 6e 67 20 76 61 6c 75   the string valu
116e0 65 20 6f 66 20 74 68 65 20 63 6f 6d 62 69 6e 65  e of the combine
116f0 64 20 66 6c 61 67 73 2c 20 6e 6f 74 0d 0a 20 20  d flags, not..  
11700 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
11710 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64 20   the enumerated 
11720 76 61 6c 75 65 2e 20 20 54 68 69 73 20 69 73 20  value.  This is 
11730 62 79 20 64 65 73 69 67 6e 20 61 6e 64 20 73 68  by design and sh
11740 6f 75 6c 64 20 6e 6f 74 0d 0a 20 20 20 20 20 20  ould not..      
11750 20 20 23 20 20 20 20 20 20 20 20 20 20 62 65 20    #          be 
11760 63 68 61 6e 67 65 64 20 77 69 74 68 6f 75 74 20  changed without 
11770 63 61 72 65 66 75 6c 20 63 6f 6e 73 69 64 65 72  careful consider
11780 61 74 69 6f 6e 20 28 65 2e 67 2e 20 69 74 20 77  ation (e.g. it w
11790 6f 75 6c 64 0d 0a 20 20 20 20 20 20 20 20 23 20  ould..        # 
117a0 20 20 20 20 20 20 20 20 20 70 72 65 76 65 6e 74           prevent
117b0 20 74 68 65 20 53 51 4c 69 74 65 43 6f 6e 6e 65   the SQLiteConne
117c0 63 74 69 6f 6e 20 63 6c 61 73 73 20 66 72 6f 6d  ction class from
117d0 20 61 6c 6c 6f 77 69 6e 67 20 69 6e 76 61 6c 69   allowing invali
117e0 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  d..        #    
117f0 20 20 20 20 20 20 5b 22 6d 61 67 69 63 61 6c 22        ["magical"
11800 5d 20 6d 65 74 61 2d 66 6c 61 67 73 29 2e 0d 0a  ] meta-flags)...
11810 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
11820 20 20 20 72 65 74 75 72 6e 20 5b 61 70 70 65 6e     return [appen
11830 64 41 72 67 73 20 22 46 6c 61 67 73 3d 22 20 24  dArgs "Flags=" $
11840 66 6c 61 67 73 20 5c 3b 5d 0d 0a 20 20 20 20 20  flags \;]..     
11850 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
11860 72 6e 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  rn ""..    }....
11870 0a 20 20 20 20 70 72 6f 63 20 65 6e 61 62 6c 65  .    proc enable
11880 53 68 61 72 65 64 43 61 63 68 65 20 7b 20 63 68  SharedCache { ch
11890 61 6e 6e 65 6c 20 65 6e 61 62 6c 65 20 7b 71 75  annel enable {qu
118a0 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  iet false} } {..
118b0 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
118c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65   {..        obje
118d0 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
118e0 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
118f0 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
11900 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e  m.Data.SQLite.Un
11910 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
11920 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
11930 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
11940 73 68 61 72 65 64 5f 63 61 63 68 65 20 5b 65 78  shared_cache [ex
11950 70 72 20 69 6e 74 28 24 65 6e 61 62 6c 65 29 5d  pr int($enable)]
11960 0d 0a 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74  ..      } result
11970 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
11980 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
11990 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
119a0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
119b0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
119c0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
119d0 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71     "---- call sq
119e0 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61  lite3_enable_sha
119f0 72 65 64 5f 63 61 63 68 65 28 22 20 24 65 6e 61  red_cache(" $ena
11a00 62 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ble \..         
11a10 20 20 20 20 20 22 29 2e 2e 2e 20 6f 6b 3a 20 22       ")... ok: "
11a20 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20   $result \n]..  
11a30 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
11a40 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
11a50 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
11a60 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
11a70 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
11a80 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
11a90 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
11aa0 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 65  - call sqlite3_e
11ab0 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63  nable_shared_cac
11ac0 68 65 28 22 20 24 65 6e 61 62 6c 65 20 5c 0d 0a  he(" $enable \..
11ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 29                ")
11ae0 2e 2e 2e 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  ... error: " \n\
11af0 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20  t $result \n].. 
11b00 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
11b10 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
11b20 20 70 72 6f 63 20 73 65 74 75 70 44 62 20 7b 0d   proc setupDb {.
11b30 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c  .            fil
11b40 65 4e 61 6d 65 20 7b 6d 6f 64 65 20 22 22 7d 20  eName {mode ""} 
11b50 7b 64 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 20  {dateTimeFormat 
11b60 22 22 7d 20 7b 64 61 74 65 54 69 6d 65 4b 69 6e  ""} {dateTimeKin
11b70 64 20 22 22 7d 20 7b 66 6c 61 67 73 20 22 22 7d  d ""} {flags ""}
11b80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 65  ..            {e
11b90 78 74 72 61 20 22 22 7d 20 7b 71 75 61 6c 69 66  xtra ""} {qualif
11ba0 79 20 74 72 75 65 7d 20 7b 64 65 6c 65 74 65 20  y true} {delete 
11bb0 74 72 75 65 7d 20 7b 75 72 69 20 66 61 6c 73 65  true} {uri false
11bc0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  }..            {
11bd0 74 65 6d 70 6f 72 61 72 79 20 74 72 75 65 7d 20  temporary true} 
11be0 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20 7b 71 75  {varName db} {qu
11bf0 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  iet false} } {..
11c00 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
11c10 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20 73 65   NOTE: First, se
11c20 65 20 69 66 20 6f 75 72 20 63 61 6c 6c 65 72 20  e if our caller 
11c30 68 61 73 20 72 65 71 75 65 73 74 65 64 20 61 6e  has requested an
11c40 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
11c50 61 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ase...      #.. 
11c60 20 20 20 20 20 73 65 74 20 69 73 4d 65 6d 6f 72       set isMemor
11c70 79 20 5b 69 73 4d 65 6d 6f 72 79 44 62 20 24 66  y [isMemoryDb $f
11c80 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20  ileName]....    
11c90 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
11ca0 45 3a 20 46 6f 72 20 6e 6f 77 2c 20 61 6c 6c 20  E: For now, all 
11cb0 74 65 73 74 20 64 61 74 61 62 61 73 65 73 20 75  test databases u
11cc0 73 65 64 20 62 79 20 74 68 65 20 74 65 73 74 20  sed by the test 
11cd0 73 75 69 74 65 20 61 72 65 20 70 6c 61 63 65 64  suite are placed
11ce0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
11cf0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
11d00 65 20 64 69 72 65 63 74 6f 72 79 2e 20 20 45 61  e directory.  Ea
11d10 63 68 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ch database and 
11d20 72 65 6c 61 74 65 64 20 66 69 6c 65 73 0d 0a 20  related files.. 
11d30 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73 65       #       use
11d40 64 20 62 79 20 61 20 74 65 73 74 20 73 68 6f 75  d by a test shou
11d50 6c 64 20 62 65 20 63 6c 65 61 6e 65 64 20 75 70  ld be cleaned up
11d60 20 62 79 20 74 68 61 74 20 74 65 73 74 20 75 73   by that test us
11d70 69 6e 67 20 74 68 65 0d 0a 20 20 20 20 20 20 23  ing the..      #
11d80 20 20 20 20 20 20 20 22 63 6c 65 61 6e 75 70 44         "cleanupD
11d90 62 22 20 70 72 6f 63 65 64 75 72 65 2c 20 62 65  b" procedure, be
11da0 6c 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  low...      #.. 
11db0 20 20 20 20 20 69 66 20 7b 21 24 69 73 4d 65 6d       if {!$isMem
11dc0 6f 72 79 20 26 26 20 24 71 75 61 6c 69 66 79 7d  ory && $qualify}
11dd0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
11de0 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66   set fileName [f
11df0 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 44 61 74  ile join [getDat
11e00 61 62 61 73 65 44 69 72 65 63 74 6f 72 79 5d 20  abaseDirectory] 
11e10 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65  [file tail $file
11e20 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d  Name]]..      }.
11e30 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
11e40 20 20 23 20 4e 4f 54 45 3a 20 42 79 20 64 65 66    # NOTE: By def
11e50 61 75 6c 74 2c 20 64 65 6c 65 74 65 20 61 6e 79  ault, delete any
11e60 20 70 72 65 2d 65 78 69 73 74 69 6e 67 20 64 61   pre-existing da
11e70 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20  tabase with the 
11e80 73 61 6d 65 20 66 69 6c 65 0d 0a 20 20 20 20 20  same file..     
11e90 20 23 20 20 20 20 20 20 20 6e 61 6d 65 20 69 66   #       name if
11ea0 20 69 74 20 63 75 72 72 65 6e 74 6c 79 20 65 78   it currently ex
11eb0 69 73 74 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ists...      #..
11ec0 20 20 20 20 20 20 69 66 20 7b 21 24 69 73 4d 65        if {!$isMe
11ed0 6d 6f 72 79 20 26 26 20 24 64 65 6c 65 74 65 20  mory && $delete 
11ee0 26 26 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20  && [file exists 
11ef0 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  $fileName]} then
11f00 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
11f10 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41         # NOTE: A
11f20 74 74 65 6d 70 74 20 74 6f 20 64 65 6c 65 74 65  ttempt to delete
11f30 20 61 6e 79 20 70 72 65 2d 65 78 69 73 74 69 6e   any pre-existin
11f40 67 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20  g database with 
11f50 74 68 65 20 73 61 6d 65 20 66 69 6c 65 0d 0a 20  the same file.. 
11f60 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e         #       n
11f70 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ame...        #.
11f80 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
11f90 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65  tch {file delete
11fa0 20 24 66 69 6c 65 4e 61 6d 65 7d 20 65 72 72 6f   $fileName} erro
11fb0 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  r]} then {..    
11fc0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
11fd0 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f     # NOTE: We so
11fe0 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f 20  mehow failed to 
11ff0 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 2c  delete the file,
12000 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20   report why...  
12010 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
12020 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
12030 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
12040 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
12050 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
12060 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
12070 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
12080 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
12090 20 74 6f 20 64 65 6c 65 74 65 20 64 61 74 61 62   to delete datab
120a0 61 73 65 20 66 69 6c 65 20 5c 22 22 20 24 66 69  ase file \"" $fi
120b0 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  leName \..      
120c0 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 64 75            "\" du
120d0 72 69 6e 67 20 73 65 74 75 70 2c 20 65 72 72 6f  ring setup, erro
120e0 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72  r: " \n\t $error
120f0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
12100 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
12110 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
12120 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
12130 52 65 66 65 72 20 74 6f 20 74 68 65 20 73 70 65  Refer to the spe
12140 63 69 66 69 65 64 20 76 61 72 69 61 62 6c 65 20  cified variable 
12150 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74  (e.g. "db") in t
12160 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75  he context of ou
12170 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  r..      #      
12180 20 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 68 61   caller.  The ha
12190 6e 64 6c 65 20 74 6f 20 74 68 65 20 6f 70 65 6e  ndle to the open
121a0 65 64 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c  ed database will
121b0 20 62 65 20 73 74 6f 72 65 64 20 74 68 65 72 65   be stored there
121c0 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
121d0 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
121e0 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23  me db....      #
121f0 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
12200 53 74 61 72 74 20 62 75 69 6c 64 69 6e 67 20 74  Start building t
12210 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74  he connection st
12220 72 69 6e 67 2e 20 20 54 68 65 20 6f 6e 6c 79 20  ring.  The only 
12230 72 65 71 75 69 72 65 64 20 70 6f 72 74 69 6f 6e  required portion
12240 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
12250 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  of the connectio
12260 6e 20 73 74 72 69 6e 67 20 69 73 20 74 68 65 20  n string is the 
12270 64 61 74 61 20 73 6f 75 72 63 65 2c 20 77 68 69  data source, whi
12280 63 68 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0d  ch contains the.
12290 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64  .      #       d
122a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
122b0 65 20 69 74 73 65 6c 66 2e 20 20 49 66 20 6f 75  e itself.  If ou
122c0 72 20 63 61 6c 6c 65 72 20 77 61 6e 74 73 20 74  r caller wants t
122d0 6f 20 75 73 65 20 61 20 55 52 49 20 61 73 0d 0a  o use a URI as..
122e0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
122f0 65 20 64 61 74 61 20 73 6f 75 72 63 65 2c 20 75  e data source, u
12300 73 65 20 74 68 65 20 46 75 6c 6c 55 72 69 20 63  se the FullUri c
12310 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67  onnection string
12320 20 70 72 6f 70 65 72 74 79 20 74 6f 0d 0a 20 20   property to..  
12330 20 20 20 20 23 20 20 20 20 20 20 20 70 72 65 76      #       prev
12340 65 6e 74 20 74 68 65 20 64 61 74 61 20 73 6f 75  ent the data sou
12350 72 63 65 20 73 74 72 69 6e 67 20 66 72 6f 6d 20  rce string from 
12360 62 65 69 6e 67 20 6d 61 6e 67 6c 65 64 2e 0d 0a  being mangled...
12370 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
12380 66 20 7b 24 75 72 69 7d 20 74 68 65 6e 20 7b 0d  f {$uri} then {.
12390 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 6e  .        set con
123a0 6e 65 63 74 69 6f 6e 20 7b 46 75 6c 6c 55 72 69  nection {FullUri
123b0 3d 24 7b 66 69 6c 65 4e 61 6d 65 7d 7d 0d 0a 20  =${fileName}}.. 
123c0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
123d0 20 20 20 20 20 20 20 73 65 74 20 63 6f 6e 6e 65         set conne
123e0 63 74 69 6f 6e 20 7b 44 61 74 61 20 53 6f 75 72  ction {Data Sour
123f0 63 65 3d 24 7b 66 69 6c 65 4e 61 6d 65 7d 7d 0d  ce=${fileName}}.
12400 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
12410 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
12420 45 3a 20 53 69 6e 63 65 20 74 68 69 73 20 70 72  E: Since this pr
12430 6f 63 65 64 75 72 65 20 68 61 73 20 6e 6f 20 73  ocedure has no s
12440 70 65 63 69 61 6c 20 6b 6e 6f 77 6c 65 64 67 65  pecial knowledge
12450 20 6f 66 20 77 68 61 74 20 74 68 65 20 64 65 66   of what the def
12460 61 75 6c 74 0d 0a 20 20 20 20 20 20 23 20 20 20  ault..      #   
12470 20 20 20 20 73 65 74 74 69 6e 67 20 69 73 20 66      setting is f
12480 6f 72 20 74 68 65 20 54 6f 46 75 6c 6c 50 61 74  or the ToFullPat
12490 68 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72  h connection str
124a0 69 6e 67 20 70 72 6f 70 65 72 79 2c 20 61 6c 77  ing propery, alw
124b0 61 79 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ays..      #    
124c0 20 20 20 61 64 64 20 74 68 65 20 76 61 6c 75 65     add the value
124d0 20 77 65 20 6b 6e 6f 77 20 61 62 6f 75 74 20 74   we know about t
124e0 6f 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  o the connection
124f0 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20   string...      
12500 23 0d 0a 20 20 20 20 20 20 61 70 70 65 6e 64 20  #..      append 
12510 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 54 6f 46  connection {;ToF
12520 75 6c 6c 50 61 74 68 3d 24 7b 71 75 61 6c 69 66  ullPath=${qualif
12530 79 7d 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  y}}....      #..
12540 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
12550 20 6f 75 72 20 63 61 6c 6c 65 72 20 73 70 65 63   our caller spec
12560 69 66 69 65 64 20 61 20 6a 6f 75 72 6e 61 6c 20  ified a journal 
12570 6d 6f 64 65 2c 20 61 64 64 20 74 68 65 20 6e 65  mode, add the ne
12580 63 65 73 73 61 72 79 20 70 6f 72 74 69 6f 6e 0d  cessary portion.
12590 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f  .      #       o
125a0 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
125b0 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20   string now...  
125c0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
125d0 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
125e0 24 6d 6f 64 65 5d 20 3e 20 30 7d 20 74 68 65 6e  $mode] > 0} then
125f0 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65   {..        appe
12600 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b  nd connection {;
12610 4a 6f 75 72 6e 61 6c 20 4d 6f 64 65 3d 24 7b 6d  Journal Mode=${m
12620 6f 64 65 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a  ode}}..      }..
12630 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
12640 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20   # NOTE: If our 
12650 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64  caller specified
12660 20 61 20 44 61 74 65 54 69 6d 65 20 66 6f 72 6d   a DateTime form
12670 61 74 2c 20 61 64 64 20 74 68 65 20 6e 65 63 65  at, add the nece
12680 73 73 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20  ssary..      #  
12690 20 20 20 20 20 70 6f 72 74 69 6f 6e 20 6f 66 20       portion of 
126a0 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  the connection s
126b0 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20  tring now...    
126c0 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
126d0 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 64  string length $d
126e0 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 5d 20 3e  ateTimeFormat] >
126f0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
12700 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65      append conne
12710 63 74 69 6f 6e 20 7b 3b 44 61 74 65 54 69 6d 65  ction {;DateTime
12720 46 6f 72 6d 61 74 3d 24 7b 64 61 74 65 54 69 6d  Format=${dateTim
12730 65 46 6f 72 6d 61 74 7d 7d 0d 0a 20 20 20 20 20  eFormat}}..     
12740 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
12750 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
12760 6f 75 72 20 63 61 6c 6c 65 72 20 73 70 65 63 69  our caller speci
12770 66 69 65 64 20 61 20 44 61 74 65 54 69 6d 65 4b  fied a DateTimeK
12780 69 6e 64 2c 20 61 64 64 20 74 68 65 20 6e 65 63  ind, add the nec
12790 65 73 73 61 72 79 20 70 6f 72 74 69 6f 6e 0d 0a  essary portion..
127a0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 66        #       of
127b0 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
127c0 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20  string now...   
127d0 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
127e0 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
127f0 64 61 74 65 54 69 6d 65 4b 69 6e 64 5d 20 3e 20  dateTimeKind] > 
12800 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
12810 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63     append connec
12820 74 69 6f 6e 20 7b 3b 44 61 74 65 54 69 6d 65 4b  tion {;DateTimeK
12830 69 6e 64 3d 24 7b 64 61 74 65 54 69 6d 65 4b 69  ind=${dateTimeKi
12840 6e 64 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  nd}}..      }...
12850 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
12860 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f  # NOTE: Figure o
12870 75 74 20 77 68 61 74 20 74 68 65 20 66 69 6e 61  ut what the fina
12880 6c 20 66 6c 61 67 73 20 66 6f 72 20 74 68 69 73  l flags for this
12890 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 65 65 64   connection need
128a0 20 74 6f 20 62 65 2e 0d 0a 20 20 20 20 20 20 23   to be...      #
128b0 0d 0a 20 20 20 20 20 20 73 65 74 20 66 6c 61 67  ..      set flag
128c0 73 20 5b 67 65 74 43 6f 6e 6e 65 63 74 69 6f 6e  s [getConnection
128d0 46 6c 61 67 73 20 24 66 69 6c 65 4e 61 6d 65 20  Flags $fileName 
128e0 24 66 6c 61 67 73 20 24 71 75 69 65 74 5d 0d 0a  $flags $quiet]..
128f0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
12900 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20   # NOTE: If our 
12910 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64  caller specified
12920 20 73 6f 6d 65 20 53 51 4c 69 74 65 43 6f 6e 6e   some SQLiteConn
12930 65 63 74 69 6f 6e 46 6c 61 67 73 2c 20 61 64 64  ectionFlags, add
12940 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
12950 20 20 20 20 6e 65 63 65 73 73 61 72 79 20 70 6f      necessary po
12960 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6e  rtion of the con
12970 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e  nection string n
12980 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ow...      #..  
12990 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
129a0 6c 65 6e 67 74 68 20 24 66 6c 61 67 73 5d 20 3e  length $flags] >
129b0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
129c0 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65      append conne
129d0 63 74 69 6f 6e 20 7b 3b 46 6c 61 67 73 3d 24 7b  ction {;Flags=${
129e0 66 6c 61 67 73 7d 7d 0d 0a 20 20 20 20 20 20 7d  flags}}..      }
129f0 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
12a00 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75     # NOTE: If ou
12a10 72 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69  r caller specifi
12a20 65 64 20 61 6e 20 65 78 74 72 61 20 70 61 79 6c  ed an extra payl
12a30 6f 61 64 20 74 6f 20 74 68 65 20 63 6f 6e 6e 65  oad to the conne
12a40 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20  ction..      #  
12a50 20 20 20 20 20 73 74 72 69 6e 67 2c 20 61 70 70       string, app
12a60 65 6e 64 20 69 74 20 6e 6f 77 2e 0d 0a 20 20 20  end it now...   
12a70 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
12a80 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
12a90 65 78 74 72 61 5d 20 3e 20 30 7d 20 74 68 65 6e  extra] > 0} then
12aa0 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65   {..        appe
12ab0 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 3b  nd connection \;
12ac0 20 24 65 78 74 72 61 0d 0a 20 20 20 20 20 20 7d   $extra..      }
12ad0 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
12ae0 20 20 20 23 20 4e 4f 54 45 3a 20 4f 70 65 6e 20     # NOTE: Open 
12af0 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
12b00 6e 65 63 74 69 6f 6e 20 6e 6f 77 2c 20 70 6c 61  nection now, pla
12b10 63 69 6e 67 20 74 68 65 20 6f 70 61 71 75 65 20  cing the opaque 
12b20 68 61 6e 64 6c 65 20 76 61 6c 75 65 0d 0a 20 20  handle value..  
12b30 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 74 6f      #       into
12b40 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 73 70   the variable sp
12b50 65 63 69 66 69 65 64 20 62 79 20 6f 75 72 20 63  ecified by our c
12b60 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d  aller...      #.
12b70 0a 20 20 20 20 20 20 73 65 74 20 64 62 20 5b 73  .      set db [s
12b80 71 6c 20 6f 70 65 6e 20 2d 74 79 70 65 20 53 51  ql open -type SQ
12b90 4c 69 74 65 20 5b 73 75 62 73 74 20 24 63 6f 6e  Lite [subst $con
12ba0 6e 65 63 74 69 6f 6e 5d 5d 0d 0a 0d 0a 20 20 20  nection]]....   
12bb0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
12bc0 54 45 3a 20 43 6f 6e 66 69 67 75 72 65 20 74 68  TE: Configure th
12bd0 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65  e temporary dire
12be0 63 74 6f 72 79 20 66 6f 72 20 74 68 65 20 6e 65  ctory for the ne
12bf0 77 6c 79 20 6f 70 65 6e 65 64 20 64 61 74 61 62  wly opened datab
12c00 61 73 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ase..      #    
12c10 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f     connection no
12c20 77 20 75 6e 6c 65 73 73 20 6f 75 72 20 63 61 6c  w unless our cal
12c30 6c 65 72 20 66 6f 72 62 69 64 73 20 69 74 2e 0d  ler forbids it..
12c40 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
12c50 69 66 20 7b 24 74 65 6d 70 6f 72 61 72 79 20 26  if {$temporary &
12c60 26 20 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  & ![info exists 
12c70 3a 3a 6e 6f 28 73 65 74 54 65 6d 70 6f 72 61 72  ::no(setTemporar
12c80 79 44 69 72 65 63 74 6f 72 79 29 5d 7d 20 74 68  yDirectory)]} th
12c90 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 71  en {..        sq
12ca0 6c 20 65 78 65 63 75 74 65 20 24 64 62 20 5b 61  l execute $db [a
12cb0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
12cc0 20 20 20 20 20 20 20 20 20 22 50 52 41 47 4d 41           "PRAGMA
12cd0 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65   temp_store_dire
12ce0 63 74 6f 72 79 20 3d 20 5c 22 22 20 5b 67 65 74  ctory = \"" [get
12cf0 54 65 6d 70 6f 72 61 72 79 44 69 72 65 63 74 6f  TemporaryDirecto
12d00 72 79 5d 20 5c 22 5c 3b 5d 0d 0a 20 20 20 20 20  ry] \"\;]..     
12d10 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
12d20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 50 65 72       # NOTE: Per
12d30 66 6f 72 6d 20 61 6e 79 20 65 78 74 72 61 20 70  form any extra p
12d40 65 72 2d 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 65  er-connection se
12d50 74 75 70 20 66 6f 72 20 74 68 65 20 6e 65 77 6c  tup for the newl
12d60 79 20 6f 70 65 6e 65 64 0d 0a 20 20 20 20 20 20  y opened..      
12d70 23 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65  #       database
12d80 20 6e 6f 77 20 75 6e 6c 65 73 73 20 6f 75 72 20   now unless our 
12d90 63 61 6c 6c 65 72 20 66 6f 72 62 69 64 73 20 69  caller forbids i
12da0 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  t...      #..   
12db0 20 20 20 73 65 74 20 65 78 65 63 75 74 65 4f 6e     set executeOn
12dc0 53 65 74 75 70 20 5b 67 65 74 45 78 65 63 75 74  Setup [getExecut
12dd0 65 4f 6e 53 65 74 75 70 5d 0d 0a 0d 0a 20 20 20  eOnSetup]....   
12de0 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
12df0 65 6e 67 74 68 20 24 65 78 65 63 75 74 65 4f 6e  ength $executeOn
12e00 53 65 74 75 70 5d 20 3e 20 30 20 26 26 20 5c 0d  Setup] > 0 && \.
12e10 0a 20 20 20 20 20 20 20 20 20 20 21 5b 69 6e 66  .          ![inf
12e20 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 78  o exists ::no(ex
12e30 65 63 75 74 65 4f 6e 53 65 74 75 70 29 5d 7d 20  ecuteOnSetup)]} 
12e40 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
12e50 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
12e60 45 3a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20  E: This command 
12e70 6d 61 79 20 72 61 69 73 65 20 61 6e 20 65 72 72  may raise an err
12e80 6f 72 3b 20 69 66 20 73 6f 2c 20 74 68 61 74 20  or; if so, that 
12e90 69 73 20 66 69 6e 65 2c 20 61 73 0d 0a 20 20 20  is fine, as..   
12ea0 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
12eb0 20 65 6e 63 6c 6f 73 69 6e 67 20 74 65 73 74 20   enclosing test 
12ec0 77 69 6c 6c 20 74 68 65 6e 20 66 61 69 6c 2e 20  will then fail. 
12ed0 20 54 68 65 20 5b 73 75 62 73 74 5d 20 63 6f 6d   The [subst] com
12ee0 6d 61 6e 64 20 69 73 0d 0a 20 20 20 20 20 20 20  mand is..       
12ef0 20 23 20 20 20 20 20 20 20 75 73 65 64 20 6f 6e   #       used on
12f00 20 74 68 65 20 53 51 4c 20 69 6e 20 63 61 73 65   the SQL in case
12f10 20 69 74 20 6e 65 65 64 73 20 74 6f 20 72 65 66   it needs to ref
12f20 65 72 20 74 6f 20 73 74 61 74 65 20 69 6e 20 6f  er to state in o
12f30 75 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ur..        #   
12f40 20 20 20 20 63 6f 6e 74 65 78 74 2e 0d 0a 20 20      context...  
12f50 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
12f60 20 73 71 6c 20 65 78 65 63 75 74 65 20 24 64 62   sql execute $db
12f70 20 5b 73 75 62 73 74 20 24 65 78 65 63 75 74 65   [subst $execute
12f80 4f 6e 53 65 74 75 70 5d 0d 0a 20 20 20 20 20 20  OnSetup]..      
12f90 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
12fa0 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 6c 77 61      # NOTE: Alwa
12fb0 79 73 20 72 65 74 75 72 6e 20 74 68 65 20 63 6f  ys return the co
12fc0 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20  nnection handle 
12fd0 75 70 6f 6e 20 73 75 63 63 65 73 73 2e 0d 0a 20  upon success... 
12fe0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
12ff0 74 75 72 6e 20 24 64 62 0d 0a 20 20 20 20 7d 0d  turn $db..    }.
13000 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
13010 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20 7b  DbConnection { {
13020 76 61 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b 0d  varName db} } {.
13030 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
13040 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f  # NOTE: Refer to
13050 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76   the specified v
13060 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64  ariable (e.g. "d
13070 62 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  b") in the conte
13080 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20  xt of our..     
13090 20 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e   #       caller.
130a0 20 20 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20    The handle to 
130b0 74 68 65 20 64 61 74 61 62 61 73 65 20 70 72 65  the database pre
130c0 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 76  viously opened v
130d0 69 61 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  ia the..      # 
130e0 20 20 20 20 20 20 5b 73 65 74 75 70 44 62 5d 20        [setupDb] 
130f0 70 72 6f 63 65 64 75 72 65 20 73 68 6f 75 6c 64  procedure should
13100 20 62 65 20 73 74 6f 72 65 64 20 74 68 65 72 65   be stored there
13110 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
13120 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
13130 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23  me db....      #
13140 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
13150 54 68 69 73 20 72 65 74 75 72 6e 73 20 74 68 65  This returns the
13160 20 41 44 4f 2e 4e 45 54 20 49 44 62 43 6f 6e 6e   ADO.NET IDbConn
13170 65 63 74 69 6f 6e 20 6f 62 6a 65 63 74 20 69 6e  ection object in
13180 73 74 61 6e 63 65 20 66 6f 72 20 74 68 65 0d 0a  stance for the..
13190 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 70        #       sp
131a0 65 63 69 66 69 65 64 20 64 61 74 61 62 73 65 20  ecified databse 
131b0 68 61 6e 64 6c 65 2e 20 20 53 69 6e 63 65 20 67  handle.  Since g
131c0 65 74 74 69 6e 67 20 74 68 69 73 20 6f 62 6a 65  etting this obje
131d0 63 74 20 72 65 6c 69 65 73 20 75 70 6f 6e 0d 0a  ct relies upon..
131e0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61        #       Ea
131f0 67 6c 65 20 69 6e 74 65 72 6e 61 6c 73 2c 20 67  gle internals, g
13200 72 65 61 74 20 63 61 72 65 20 73 68 6f 75 6c 64  reat care should
13210 20 62 65 20 74 61 6b 65 6e 20 74 6f 20 61 76 6f   be taken to avo
13220 69 64 20 64 69 73 70 6f 73 69 6e 67 20 6f 66 0d  id disposing of.
13230 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
13240 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 6f 74  his object or ot
13250 68 65 72 77 69 73 65 20 70 75 74 74 69 6e 67 20  herwise putting 
13260 69 74 20 69 6e 74 6f 20 61 6e 20 69 6e 76 61 6c  it into an inval
13270 69 64 20 73 74 61 74 65 2e 0d 0a 20 20 20 20 20  id state...     
13280 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
13290 6e 66 6f 20 65 78 69 73 74 73 20 64 62 5d 7d 20  nfo exists db]} 
132a0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
132b0 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
132c0 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
132d0 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
132e0 6e 50 75 62 6c 69 63 20 2d 6f 62 6a 65 63 74 66  nPublic -objectf
132f0 6c 61 67 73 20 2b 4e 6f 44 69 73 70 6f 73 65 20  lags +NoDispose 
13300 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20 20  -alias \..      
13310 20 20 20 20 20 20 20 20 49 6e 74 65 72 70 72 65          Interpre
13320 74 65 72 2e 47 65 74 41 63 74 69 76 65 2e 63 6f  ter.GetActive.co
13330 6e 6e 65 63 74 69 6f 6e 73 20 49 74 65 6d 20 24  nnections Item $
13340 64 62 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65  db..        } re
13350 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sult] == 0} then
13360 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
13370 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
13380 45 3a 20 53 75 63 63 65 73 73 2c 20 72 65 74 75  E: Success, retu
13390 72 6e 20 74 68 65 20 6f 70 61 71 75 65 20 6f 62  rn the opaque ob
133a0 6a 65 63 74 20 68 61 6e 64 6c 65 2e 0d 0a 20 20  ject handle...  
133b0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
133c0 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73       return $res
133d0 75 6c 74 0d 0a 20 20 20 20 20 20 20 20 7d 20 65  ult..        } e
133e0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
133f0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
13400 4e 4f 54 45 3a 20 46 61 69 6c 75 72 65 2c 20 72  NOTE: Failure, r
13410 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20  eport why...    
13420 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
13430 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
13440 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
13450 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
13460 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
13470 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 67  ING: failed to g
13480 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  et connection ha
13490 6e 64 6c 65 20 66 6f 72 20 64 61 74 61 62 61 73  ndle for databas
134a0 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  e \"" \..       
134b0 20 20 20 20 20 20 20 24 64 62 20 22 5c 22 2c 20         $db "\", 
134c0 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72  error: " \n\t $r
134d0 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20  esult \n]..     
134e0 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
134f0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
13500 23 20 4e 4f 54 45 3a 20 46 61 69 6c 75 72 65 2c  # NOTE: Failure,
13510 20 72 65 74 75 72 6e 20 61 6e 20 6f 62 76 69 6f   return an obvio
13520 75 73 6c 79 20 69 6e 76 61 6c 69 64 20 6f 70 61  usly invalid opa
13530 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c  que object handl
13540 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
13550 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20     return ""..  
13560 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
13570 20 66 72 65 65 44 62 43 6f 6e 6e 65 63 74 69 6f   freeDbConnectio
13580 6e 20 7b 20 7b 76 61 72 4e 61 6d 65 20 63 6f 6e  n { {varName con
13590 6e 65 63 74 69 6f 6e 7d 20 7d 20 7b 0d 0a 20 20  nection} } {..  
135a0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
135b0 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68  OTE: Refer to th
135c0 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72 69  e specified vari
135d0 61 62 6c 65 20 28 65 2e 67 2e 20 22 63 6f 6e 6e  able (e.g. "conn
135e0 65 63 74 69 6f 6e 22 29 20 69 6e 20 74 68 65 0d  ection") in the.
135f0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
13600 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 20 63 61  ontext of our ca
13610 6c 6c 65 72 2e 20 20 54 68 65 20 6f 70 61 71 75  ller.  The opaqu
13620 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20  e object handle 
13630 66 6f 72 20 61 6e 20 41 44 4f 2e 4e 45 54 0d 0a  for an ADO.NET..
13640 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
13650 6e 6e 65 63 74 69 6f 6e 20 70 72 65 76 69 6f 75  nnection previou
13660 73 6c 79 20 72 65 74 75 72 6e 65 64 20 62 79 20  sly returned by 
13670 5b 67 65 74 44 62 43 6f 6e 6e 65 63 74 69 6f 6e  [getDbConnection
13680 5d 20 73 68 6f 75 6c 64 20 62 65 0d 0a 20 20 20  ] should be..   
13690 20 20 20 23 20 20 20 20 20 20 20 73 74 6f 72 65     #       store
136a0 64 20 74 68 65 72 65 2e 0d 0a 20 20 20 20 20 20  d there...      
136b0 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31  #..      upvar 1
136c0 20 24 76 61 72 4e 61 6d 65 20 63 6f 6e 6e 65 63   $varName connec
136d0 74 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  tion....      #.
136e0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41  .      # NOTE: A
136f0 74 74 65 6d 70 74 20 74 6f 20 72 65 6d 6f 76 65  ttempt to remove
13700 20 74 68 65 20 6f 70 61 71 75 65 20 6f 62 6a 65   the opaque obje
13710 63 74 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 74  ct handle from t
13720 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 0d 0a  he interpreter..
13730 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 6f        #       no
13740 77 2e 20 20 54 68 69 73 20 5b 6f 62 6a 65 63 74  w.  This [object
13750 20 64 69 73 70 6f 73 65 5d 20 63 61 6c 6c 20 77   dispose] call w
13760 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  ill not actually
13770 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65 0d   dispose of the.
13780 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75  .      #       u
13790 6e 64 65 72 6c 79 69 6e 67 20 6f 62 6a 65 63 74  nderlying object
137a0 20 62 65 63 61 75 73 65 20 74 68 65 20 2b 4e 6f   because the +No
137b0 44 69 73 70 6f 73 65 20 66 6c 61 67 20 77 61 73  Dispose flag was
137c0 20 73 65 74 20 6f 6e 20 69 74 0d 0a 20 20 20 20   set on it..    
137d0 20 20 23 20 20 20 20 20 20 20 64 75 72 69 6e 67    #       during
137e0 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65   creation of the
137f0 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74 20 68   opaque object h
13800 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d  andle...      #.
13810 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
13820 20 65 78 69 73 74 73 20 63 6f 6e 6e 65 63 74 69   exists connecti
13830 6f 6e 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  on] && \..      
13840 20 20 20 20 5b 63 61 74 63 68 20 7b 6f 62 6a 65      [catch {obje
13850 63 74 20 64 69 73 70 6f 73 65 20 24 63 6f 6e 6e  ct dispose $conn
13860 65 63 74 69 6f 6e 7d 20 65 72 72 6f 72 5d 7d 20  ection} error]} 
13870 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
13880 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
13890 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20 66 61  E: We somehow fa
138a0 69 6c 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 74  iled to remove t
138b0 68 65 20 68 61 6e 64 6c 65 2c 20 72 65 70 6f 72  he handle, repor
138c0 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20  t why...        
138d0 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  #..        tputs
138e0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
138f0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
13900 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
13910 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
13920 64 20 74 6f 20 72 65 6d 6f 76 65 20 63 6f 6e 6e  d to remove conn
13930 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 5c 22  ection handle \"
13940 22 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 0d  " $connection \.
13950 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22  .            "\"
13960 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  , error: " \n\t 
13970 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20  $error \n]..    
13980 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
13990 20 20 20 70 72 6f 63 20 61 64 64 44 62 43 6f 6e     proc addDbCon
139a0 6e 65 63 74 69 6f 6e 20 7b 20 63 6f 6e 6e 65 63  nection { connec
139b0 74 69 6f 6e 20 7b 76 61 72 4e 61 6d 65 20 64 62  tion {varName db
139c0 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
139d0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
139e0 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63 69  fer to the speci
139f0 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28 65  fied variable (e
13a00 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65  .g. "db") in the
13a10 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d   context of our.
13a20 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
13a30 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d  aller...      #.
13a40 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24  .      upvar 1 $
13a50 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20  varName db....  
13a60 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
13a70 4f 54 45 3a 20 43 72 65 61 74 65 20 61 20 63 6f  OTE: Create a co
13a80 72 72 65 63 74 6c 79 20 66 6f 72 6d 61 74 74 65  rrectly formatte
13a90 64 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 64  d name for the d
13aa0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
13ab0 6f 6e 20 74 6f 0d 0a 20 20 20 20 20 20 23 20 20  on to..      #  
13ac0 20 20 20 20 20 62 65 20 61 64 64 65 64 20 74 6f       be added to
13ad0 20 74 68 65 20 6c 69 73 74 20 6d 61 6e 61 67 65   the list manage
13ae0 64 20 62 79 20 74 68 65 20 45 61 67 6c 65 20 69  d by the Eagle i
13af0 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20  nterpreter...   
13b00 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
13b10 64 62 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b  db [object invok
13b20 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
13b30 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
13b40 20 45 61 67 6c 65 2e 5f 43 6f 6d 70 6f 6e 65 6e   Eagle._Componen
13b50 74 73 2e 50 72 69 76 61 74 65 2e 46 6f 72 6d 61  ts.Private.Forma
13b60 74 4f 70 73 20 44 61 74 61 62 61 73 65 4f 62 6a  tOps DatabaseObj
13b70 65 63 74 4e 61 6d 65 20 24 63 6f 6e 6e 65 63 74  ectName $connect
13b80 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ion \..         
13b90 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f   SQLiteConnectio
13ba0 6e 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65  n [object invoke
13bb0 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74   Interpreter.Get
13bc0 41 63 74 69 76 65 20 4e 65 78 74 49 64 5d 5d 0d  Active NextId]].
13bd0 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
13be0 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 74 68    # NOTE: Add th
13bf0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
13c00 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 64 20 62  ction provided b
13c10 79 20 6f 75 72 20 63 61 6c 6c 65 72 20 74 6f 20  y our caller to 
13c20 74 68 65 20 6c 69 73 74 0d 0a 20 20 20 20 20 20  the list..      
13c30 23 20 20 20 20 20 20 20 6f 66 20 74 68 6f 73 65  #       of those
13c40 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 65 20 45 61   known to the Ea
13c50 67 6c 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e  gle interpreter.
13c60 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
13c70 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
13c80 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
13c90 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74   Interpreter.Get
13ca0 41 63 74 69 76 65 2e 63 6f 6e 6e 65 63 74 69 6f  Active.connectio
13cb0 6e 73 20 41 64 64 20 5c 0d 0a 20 20 20 20 20 20  ns Add \..      
13cc0 20 20 20 20 24 64 62 20 24 63 6f 6e 6e 65 63 74      $db $connect
13cd0 69 6f 6e 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  ion..    }..... 
13ce0 20 20 20 70 72 6f 63 20 67 65 74 52 6f 77 73 46     proc getRowsF
13cf0 72 6f 6d 44 61 74 61 54 61 62 6c 65 20 7b 20 64  romDataTable { d
13d00 61 74 61 54 61 62 6c 65 20 7d 20 7b 0d 0a 20 20  ataTable } {..  
13d10 20 20 20 20 73 65 74 20 72 6f 77 73 20 5b 6c 69      set rows [li
13d20 73 74 5d 0d 0a 20 20 20 20 20 20 73 65 74 20 63  st]..      set c
13d30 6f 75 6e 74 20 5b 24 64 61 74 61 54 61 62 6c 65  ount [$dataTable
13d40 20 43 6f 6c 75 6d 6e 73 2e 43 6f 75 6e 74 5d 0d   Columns.Count].
13d50 0a 0d 0a 20 20 20 20 20 20 66 6f 72 20 7b 73 65  ...      for {se
13d60 74 20 69 6e 64 65 78 20 30 7d 20 7b 24 69 6e 64  t index 0} {$ind
13d70 65 78 20 3c 20 24 63 6f 75 6e 74 7d 20 7b 69 6e  ex < $count} {in
13d80 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20  cr index} {..   
13d90 20 20 20 20 20 73 65 74 20 64 61 74 61 43 6f 6c       set dataCol
13da0 75 6d 6e 20 5b 24 64 61 74 61 54 61 62 6c 65 20  umn [$dataTable 
13db0 2d 61 6c 69 61 73 20 43 6f 6c 75 6d 6e 73 2e 67  -alias Columns.g
13dc0 65 74 5f 49 74 65 6d 20 24 69 6e 64 65 78 5d 0d  et_Item $index].
13dd0 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 61 6d  .        set nam
13de0 65 73 28 24 69 6e 64 65 78 29 20 5b 24 64 61 74  es($index) [$dat
13df0 61 43 6f 6c 75 6d 6e 20 43 6f 6c 75 6d 6e 4e 61  aColumn ColumnNa
13e00 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  me]..      }....
13e10 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72        object for
13e20 65 61 63 68 20 2d 61 6c 69 61 73 20 64 61 74 61  each -alias data
13e30 52 6f 77 20 5b 73 65 74 20 64 61 74 61 52 6f 77  Row [set dataRow
13e40 73 20 5b 24 64 61 74 61 54 61 62 6c 65 20 52 6f  s [$dataTable Ro
13e50 77 73 5d 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20  ws]] {..        
13e60 73 65 74 20 72 6f 77 20 5b 6c 69 73 74 5d 0d 0a  set row [list]..
13e70 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 20 7b 73  ..        for {s
13e80 65 74 20 69 6e 64 65 78 20 30 7d 20 7b 24 69 6e  et index 0} {$in
13e90 64 65 78 20 3c 20 24 63 6f 75 6e 74 7d 20 7b 69  dex < $count} {i
13ea0 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20  ncr index} {..  
13eb0 20 20 20 20 20 20 20 20 73 65 74 20 76 61 6c 75          set valu
13ec0 65 20 5b 24 64 61 74 61 52 6f 77 20 2d 63 72 65  e [$dataRow -cre
13ed0 61 74 65 20 2d 61 6c 69 61 73 20 67 65 74 5f 49  ate -alias get_I
13ee0 74 65 6d 20 24 69 6e 64 65 78 5d 0d 0a 0d 0a 20  tem $index].... 
13ef0 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74           if {[st
13f00 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 6c  ring length $val
13f10 75 65 5d 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20  ue] > 0 && \..  
13f20 20 20 20 20 20 20 20 20 20 20 20 20 21 5b 6f 62              ![ob
13f30 6a 65 63 74 20 69 6e 76 6f 6b 65 20 43 6f 6e 76  ject invoke Conv
13f40 65 72 74 20 49 73 44 42 4e 75 6c 6c 20 24 76 61  ert IsDBNull $va
13f50 6c 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  lue]} then {..  
13f60 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e            lappen
13f70 64 20 72 6f 77 20 5b 6c 69 73 74 20 24 6e 61 6d  d row [list $nam
13f80 65 73 28 24 69 6e 64 65 78 29 20 5b 24 76 61 6c  es($index) [$val
13f90 75 65 20 54 6f 53 74 72 69 6e 67 5d 5d 0d 0a 20  ue ToString]].. 
13fa0 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
13fb0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  {..            l
13fc0 61 70 70 65 6e 64 20 72 6f 77 20 5b 6c 69 73 74  append row [list
13fd0 20 24 6e 61 6d 65 73 28 24 69 6e 64 65 78 29 5d   $names($index)]
13fe0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
13ff0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
14000 20 20 20 20 6c 61 70 70 65 6e 64 20 72 6f 77 73      lappend rows
14010 20 24 72 6f 77 0d 0a 20 20 20 20 20 20 7d 0d 0a   $row..      }..
14020 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24  ..      return $
14030 72 6f 77 73 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  rows..    }.....
14040 20 20 20 20 70 72 6f 63 20 64 75 6d 70 52 6f 77      proc dumpRow
14050 73 46 72 6f 6d 44 61 74 61 54 61 62 6c 65 20 7b  sFromDataTable {
14060 20 63 68 61 6e 6e 65 6c 20 72 6f 77 73 20 7d 20   channel rows } 
14070 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 73 65 71  {..      set seq
14080 75 65 6e 63 65 20 31 0d 0a 0d 0a 20 20 20 20 20  uence 1....     
14090 20 66 6f 72 65 61 63 68 20 72 6f 77 20 24 72 6f   foreach row $ro
140a0 77 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  ws {..        tp
140b0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
140c0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
140d0 20 20 20 20 20 20 20 20 5b 65 78 70 72 20 7b 24          [expr {$
140e0 73 65 71 75 65 6e 63 65 20 3e 20 31 20 3f 20 22  sequence > 1 ? "
140f0 5c 6e 22 20 3a 20 22 22 7d 5d 20 22 2d 2d 2d 2d  \n" : ""}] "----
14100 20 52 4f 57 20 23 22 20 24 73 65 71 75 65 6e 63   ROW #" $sequenc
14110 65 20 3a 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20  e :\n]....      
14120 20 20 66 6f 72 65 61 63 68 20 70 61 69 72 20 24    foreach pair $
14130 72 6f 77 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  row {..         
14140 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 70   if {[llength $p
14150 61 69 72 5d 20 3e 3d 20 32 7d 20 74 68 65 6e 20  air] >= 2} then 
14160 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
14170 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
14180 70 70 65 6e 64 41 72 67 73 20 5c 74 20 5c 0d 0a  ppendArgs \t \..
14190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141a0 5b 6c 69 73 74 20 5b 6c 69 6e 64 65 78 20 24 70  [list [lindex $p
141b0 61 69 72 20 30 5d 5d 20 22 3a 20 22 20 5b 6c 69  air 0]] ": " [li
141c0 73 74 20 5b 6c 69 6e 64 65 78 20 24 70 61 69 72  st [lindex $pair
141d0 20 31 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20   1]] \n]..      
141e0 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 6c      } elseif {[l
141f0 6c 65 6e 67 74 68 20 24 70 61 69 72 5d 20 3d 3d  length $pair] ==
14200 20 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   1} then {..    
14210 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
14220 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
14230 67 73 20 5c 74 20 5c 0d 0a 20 20 20 20 20 20 20  gs \t \..       
14240 20 20 20 20 20 20 20 20 20 5b 6c 69 73 74 20 5b           [list [
14250 6c 69 6e 64 65 78 20 24 70 61 69 72 20 30 5d 5d  lindex $pair 0]]
14260 20 22 3a 20 3c 6e 75 6c 6c 3e 5c 6e 22 5d 0d 0a   ": <null>\n"]..
14270 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
14280 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
14290 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5c  tputs $channel \
142a0 74 3c 65 6d 70 74 79 3e 5c 6e 3b 20 23 20 4e 4f  t<empty>\n; # NO
142b0 54 45 3a 20 4e 6f 20 64 61 74 61 3f 0d 0a 20 20  TE: No data?..  
142c0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
142d0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
142e0 69 6e 63 72 20 73 65 71 75 65 6e 63 65 0d 0a 20  incr sequence.. 
142f0 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
14300 0d 0a 20 20 20 20 70 72 6f 63 20 63 6c 65 61 6e  ..    proc clean
14310 75 70 44 62 20 7b 20 66 69 6c 65 4e 61 6d 65 20  upDb { fileName 
14320 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20 7b 63 6f  {varName db} {co
14330 6c 6c 65 63 74 20 74 72 75 65 7d 20 7b 71 75 61  llect true} {qua
14340 6c 69 66 79 20 74 72 75 65 7d 0d 0a 20 20 20 20  lify true}..    
14350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14360 20 7b 64 65 6c 65 74 65 20 74 72 75 65 7d 20 7d   {delete true} }
14370 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
14380 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
14390 70 74 20 74 6f 20 66 6f 72 63 65 20 61 6c 6c 20  pt to force all 
143a0 70 65 6e 64 69 6e 67 20 22 67 61 72 62 61 67 65  pending "garbage
143b0 22 20 6f 62 6a 65 63 74 73 20 74 6f 20 62 65 20  " objects to be 
143c0 63 6f 6c 6c 65 63 74 65 64 2c 0d 0a 20 20 20 20  collected,..    
143d0 20 20 23 20 20 20 20 20 20 20 69 6e 63 6c 75 64    #       includ
143e0 69 6e 67 20 53 51 4c 69 74 65 20 73 74 61 74 65  ing SQLite state
143f0 6d 65 6e 74 73 20 61 6e 64 20 62 61 63 6b 75 70  ments and backup
14400 20 6f 62 6a 65 63 74 73 3b 20 74 68 69 73 20 73   objects; this s
14410 68 6f 75 6c 64 20 61 6c 6c 6f 77 0d 0a 20 20 20  hould allow..   
14420 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 75     #       the u
14430 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
14440 73 65 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65  se file to be de
14450 6c 65 74 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d  leted...      #.
14460 0a 20 20 20 20 20 20 69 66 20 7b 24 63 6f 6c 6c  .      if {$coll
14470 65 63 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ect} then {..   
14480 20 20 20 20 20 63 6f 6c 6c 65 63 74 47 61 72 62       collectGarb
14490 61 67 65 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  age $::test_chan
144a0 6e 65 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  nel..      }....
144b0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
144c0 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20   NOTE: Refer to 
144d0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61  the specified va
144e0 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62  riable (e.g. "db
144f0 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78  ") in the contex
14500 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20  t of our..      
14510 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20  #       caller. 
14520 20 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 74   The handle to t
14530 68 65 20 64 61 74 61 62 61 73 65 20 70 72 65 76  he database prev
14540 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 76 69  iously opened vi
14550 61 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  a the..      #  
14560 20 20 20 20 20 5b 73 65 74 75 70 44 62 5d 20 70       [setupDb] p
14570 72 6f 63 65 64 75 72 65 20 73 68 6f 75 6c 64 20  rocedure should 
14580 62 65 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e  be stored there.
14590 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
145a0 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d   upvar 1 $varNam
145b0 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  e db....      #.
145c0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43  .      # NOTE: C
145d0 6c 6f 73 65 20 74 68 65 20 63 6f 6e 6e 65 63 74  lose the connect
145e0 69 6f 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ion to the datab
145f0 61 73 65 20 6e 6f 77 2e 20 20 54 68 69 73 20 73  ase now.  This s
14600 68 6f 75 6c 64 20 61 6c 6c 6f 77 20 75 73 0d 0a  hould allow us..
14610 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f        #       to
14620 20 64 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65   delete the unde
14630 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
14640 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  file...      #..
14650 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
14660 65 78 69 73 74 73 20 64 62 5d 20 26 26 20 5b 63  exists db] && [c
14670 61 74 63 68 20 7b 73 71 6c 20 63 6c 6f 73 65 20  atch {sql close 
14680 24 64 62 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65  $db} error]} the
14690 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
146a0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
146b0 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65  We somehow faile
146c0 64 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 64  d to close the d
146d0 61 74 61 62 61 73 65 2c 20 72 65 70 6f 72 74 20  atabase, report 
146e0 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  why...        #.
146f0 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
14700 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
14710 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
14720 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
14730 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
14740 74 6f 20 63 6c 6f 73 65 20 64 61 74 61 62 61 73  to close databas
14750 65 20 5c 22 22 20 24 64 62 20 22 5c 22 2c 20 65  e \"" $db "\", e
14760 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20  rror: " \..     
14770 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 65 72 72         \n\t $err
14780 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d  or \n]..      }.
14790 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
147a0 20 20 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c    # NOTE: First,
147b0 20 73 65 65 20 69 66 20 6f 75 72 20 63 61 6c 6c   see if our call
147c0 65 72 20 68 61 73 20 72 65 71 75 65 73 74 65 64  er has requested
147d0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
147e0 74 61 62 61 73 65 2e 0d 0a 20 20 20 20 20 20 23  tabase...      #
147f0 0d 0a 20 20 20 20 20 20 73 65 74 20 69 73 4d 65  ..      set isMe
14800 6d 6f 72 79 20 5b 69 73 4d 65 6d 6f 72 79 44 62  mory [isMemoryDb
14810 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20   $fileName].... 
14820 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
14830 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20  NOTE: Build the 
14840 66 75 6c 6c 20 70 61 74 68 20 74 6f 20 74 68 65  full path to the
14850 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
14860 61 6d 65 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 61  ame.  For now, a
14870 6c 6c 20 74 65 73 74 0d 0a 20 20 20 20 20 20 23  ll test..      #
14880 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
14890 66 69 6c 65 73 20 61 72 65 20 73 74 6f 72 65 64  files are stored
148a0 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72   in the temporar
148b0 79 20 64 69 72 65 63 74 6f 72 79 2e 0d 0a 20 20  y directory...  
148c0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
148d0 7b 21 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24  {!$isMemory && $
148e0 71 75 61 6c 69 66 79 7d 20 74 68 65 6e 20 7b 0d  qualify} then {.
148f0 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c  .        set fil
14900 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  eName [file join
14910 20 5b 67 65 74 44 61 74 61 62 61 73 65 44 69 72   [getDatabaseDir
14920 65 63 74 6f 72 79 5d 20 5b 66 69 6c 65 20 74 61  ectory] [file ta
14930 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a  il $fileName]]..
14940 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
14950 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
14960 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 66  : Check if the f
14970 69 6c 65 20 73 74 69 6c 6c 20 65 78 69 73 74 73  ile still exists
14980 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
14990 20 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72 79    if {!$isMemory
149a0 20 26 26 20 24 64 65 6c 65 74 65 20 26 26 20 5b   && $delete && [
149b0 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c  file exists $fil
149c0 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
149d0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
149e0 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20     # NOTE: Skip 
149f0 64 65 6c 65 74 69 6e 67 20 64 61 74 61 62 61 73  deleting databas
14a00 65 20 66 69 6c 65 73 20 69 66 20 73 6f 6d 65 62  e files if someb
14a10 6f 64 79 20 73 65 74 73 20 74 68 65 20 67 6c 6f  ody sets the glo
14a20 62 61 6c 0d 0a 20 20 20 20 20 20 20 20 23 20 20  bal..        #  
14a30 20 20 20 20 20 76 61 72 69 61 62 6c 65 20 74 6f       variable to
14a40 20 70 72 65 76 65 6e 74 20 69 74 2e 0d 0a 20 20   prevent it...  
14a50 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
14a60 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
14a70 74 73 20 3a 3a 6e 6f 28 63 6c 65 61 6e 75 70 44  ts ::no(cleanupD
14a80 62 46 69 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d  bFile)]} then {.
14a90 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
14aa0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
14ab0 41 74 74 65 6d 70 74 20 74 6f 20 64 65 6c 65 74  Attempt to delet
14ac0 65 20 74 68 65 20 74 65 73 74 20 64 61 74 61 62  e the test datab
14ad0 61 73 65 20 66 69 6c 65 20 6e 6f 77 2e 0d 0a 20  ase file now... 
14ae0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
14af0 20 20 20 20 20 20 69 66 20 7b 5b 73 65 74 20 63        if {[set c
14b00 6f 64 65 20 5b 63 61 74 63 68 20 7b 66 69 6c 65  ode [catch {file
14b10 20 64 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d   delete $fileNam
14b20 65 7d 20 65 72 72 6f 72 5d 5d 7d 20 74 68 65 6e  e} error]]} then
14b30 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
14b40 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  #..            #
14b50 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f   NOTE: We someho
14b60 77 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65  w failed to dele
14b70 74 65 20 74 68 65 20 66 69 6c 65 2c 20 72 65 70  te the file, rep
14b80 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20  ort why...      
14b90 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
14ba0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
14bb0 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
14bc0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
14bd0 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
14be0 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
14bf0 74 6f 20 64 65 6c 65 74 65 20 64 61 74 61 62 61  to delete databa
14c00 73 65 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c  se file \"" $fil
14c10 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  eName \..       
14c20 20 20 20 20 20 20 20 20 20 22 5c 22 20 64 75 72           "\" dur
14c30 69 6e 67 20 63 6c 65 61 6e 75 70 2c 20 65 72 72  ing cleanup, err
14c40 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f  or: " \n\t $erro
14c50 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  r \n]..         
14c60 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c   }..        } el
14c70 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
14c80 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
14c90 4f 54 45 3a 20 53 68 6f 77 20 74 68 61 74 20 77  OTE: Show that w
14ca0 65 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69  e skipped deleti
14cb0 6e 67 20 74 68 65 20 66 69 6c 65 2e 0d 0a 20 20  ng the file...  
14cc0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
14cd0 20 20 20 20 20 73 65 74 20 63 6f 64 65 20 30 0d       set code 0.
14ce0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  ...          tpu
14cf0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
14d00 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
14d10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
14d20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 73  "==== WARNING: s
14d30 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20  kipped deleting 
14d40 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 5c 22  database file \"
14d50 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  " $fileName \.. 
14d60 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22               "\"
14d70 20 64 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 5c   during cleanup\
14d80 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  n"]..        }..
14d90 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
14da0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
14db0 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 66     # NOTE: The f
14dc0 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
14dd0 73 74 2c 20 73 75 63 63 65 73 73 21 0d 0a 20 20  st, success!..  
14de0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
14df0 20 73 65 74 20 63 6f 64 65 20 30 0d 0a 20 20 20   set code 0..   
14e00 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
14e10 74 75 72 6e 20 24 63 6f 64 65 0d 0a 20 20 20 20  turn $code..    
14e20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73  }.....    proc s
14e30 61 76 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61  aveEnvironmentVa
14e40 72 69 61 62 6c 65 73 20 7b 20 6e 61 6d 65 73 20  riables { names 
14e50 7b 76 61 72 4e 61 6d 65 20 22 22 7d 20 7d 20 7b  {varName ""} } {
14e60 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
14e70 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 65 61 63   # NOTE: For eac
14e80 68 20 6e 61 6d 65 2c 20 64 6f 65 73 20 74 68 65  h name, does the
14e90 20 6c 69 76 65 20 65 6e 76 69 72 6f 6e 6d 65 6e   live environmen
14ea0 74 20 76 61 72 69 61 62 6c 65 20 65 78 69 73 74  t variable exist
14eb0 3f 20 20 49 66 0d 0a 20 20 20 20 20 20 23 20 20  ?  If..      #  
14ec0 20 20 20 20 20 73 6f 2c 20 73 61 76 65 20 74 68       so, save th
14ed0 65 20 76 61 6c 75 65 20 66 6f 72 20 6c 61 74 65  e value for late
14ee0 72 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 6d 61  r; otherwise, ma
14ef0 6b 65 20 73 75 72 65 20 74 68 65 20 73 61 76 65  ke sure the save
14f00 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
14f10 20 76 61 6c 75 65 20 64 6f 65 73 20 6e 6f 74 20   value does not 
14f20 65 78 69 73 74 20 65 69 74 68 65 72 2e 20 20 54  exist either.  T
14f30 68 65 20 6c 69 76 65 20 65 6e 76 69 72 6f 6e 6d  he live environm
14f40 65 6e 74 20 76 61 72 69 61 62 6c 65 73 0d 0a 20  ent variables.. 
14f50 20 20 20 20 20 23 20 20 20 20 20 20 20 41 52 45       #       ARE
14f60 20 4e 4f 54 20 63 68 61 6e 67 65 64 20 62 79 20   NOT changed by 
14f70 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 2e 0d  this procedure..
14f80 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
14f90 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
14fa0 74 68 20 24 76 61 72 4e 61 6d 65 5d 20 3d 3d 20  th $varName] == 
14fb0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
14fc0 20 20 20 73 65 74 20 76 61 72 4e 61 6d 65 20 73     set varName s
14fd0 61 76 65 64 45 6e 76 0d 0a 20 20 20 20 20 20 7d  avedEnv..      }
14fe0 0d 0a 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20  ....      upvar 
14ff0 31 20 24 76 61 72 4e 61 6d 65 20 73 61 76 65 64  1 $varName saved
15000 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72  Env....      for
15010 65 61 63 68 20 6e 61 6d 65 20 24 6e 61 6d 65 73  each name $names
15020 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
15030 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65  [info exists ::e
15040 6e 76 28 24 6e 61 6d 65 29 5d 7d 20 74 68 65 6e  nv($name)]} then
15050 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
15060 74 20 73 61 76 65 64 45 6e 76 28 24 6e 61 6d 65  t savedEnv($name
15070 29 20 24 3a 3a 65 6e 76 28 24 6e 61 6d 65 29 0d  ) $::env($name).
15080 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
15090 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 75 6e 73  {..          uns
150a0 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 73  et -nocomplain s
150b0 61 76 65 64 45 6e 76 28 24 6e 61 6d 65 29 0d 0a  avedEnv($name)..
150c0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
150d0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
150e0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69       # NOTE: Thi
150f0 73 20 69 73 20 73 65 6c 66 2d 63 6c 65 61 6e 69  s is self-cleani
15100 6e 67 2e 20 20 49 66 20 6e 6f 20 73 61 76 65 64  ng.  If no saved
15110 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72   environment var
15120 69 61 62 6c 65 73 20 6e 6f 77 0d 0a 20 20 20 20  iables now..    
15130 20 20 23 20 20 20 20 20 20 20 65 78 69 73 74 2c    #       exist,
15140 20 72 65 6d 6f 76 65 20 74 68 65 20 61 72 72 61   remove the arra
15150 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  y...      #..   
15160 20 20 20 69 66 20 7b 5b 61 72 72 61 79 20 73 69     if {[array si
15170 7a 65 20 73 61 76 65 64 45 6e 76 5d 20 3d 3d 20  ze savedEnv] == 
15180 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
15190 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70     unset -nocomp
151a0 6c 61 69 6e 20 73 61 76 65 64 45 6e 76 0d 0a 20  lain savedEnv.. 
151b0 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
151c0 0d 0a 20 20 20 20 70 72 6f 63 20 72 65 73 74 6f  ..    proc resto
151d0 72 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72  reEnvironmentVar
151e0 69 61 62 6c 65 73 20 7b 20 6e 61 6d 65 73 20 7b  iables { names {
151f0 76 61 72 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d  varName ""} } {.
15200 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
15210 23 20 4e 4f 54 45 3a 20 46 6f 72 20 65 61 63 68  # NOTE: For each
15220 20 6e 61 6d 65 2c 20 64 6f 65 73 20 74 68 65 20   name, does the 
15230 73 61 76 65 64 20 65 6e 76 69 72 6f 6e 6d 65 6e  saved environmen
15240 74 20 76 61 72 69 61 62 6c 65 20 65 78 69 73 74  t variable exist
15250 3f 20 20 49 66 0d 0a 20 20 20 20 20 20 23 20 20  ?  If..      #  
15260 20 20 20 20 20 73 6f 2c 20 72 65 73 74 6f 72 65       so, restore
15270 20 74 68 65 20 73 61 76 65 64 20 76 61 6c 75 65   the saved value
15280 20 61 6e 64 20 75 6e 73 65 74 20 69 74 3b 20 6f   and unset it; o
15290 74 68 65 72 77 69 73 65 2c 20 6d 61 6b 65 20 73  therwise, make s
152a0 75 72 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ure..      #    
152b0 20 20 20 74 68 65 20 6c 69 76 65 20 65 6e 76 69     the live envi
152c0 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  ronment variable
152d0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20   does not exist 
152e0 65 69 74 68 65 72 20 28 69 2e 65 2e 20 69 74 0d  either (i.e. it.
152f0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77  .      #       w
15300 61 73 20 6e 6f 74 20 73 65 74 20 74 6f 20 62 65  as not set to be
15310 67 69 6e 20 77 69 74 68 29 2e 20 20 42 6f 74 68  gin with).  Both
15320 20 73 61 76 65 64 20 61 6e 64 20 6c 69 76 65 20   saved and live 
15330 65 6e 76 69 72 6f 6e 6d 65 6e 74 0d 0a 20 20 20  environment..   
15340 20 20 20 23 20 20 20 20 20 20 20 76 61 72 69 61     #       varia
15350 62 6c 65 73 20 41 52 45 20 63 68 61 6e 67 65 64  bles ARE changed
15360 20 62 79 20 74 68 69 73 20 70 72 6f 63 65 64 75   by this procedu
15370 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  re...      #..  
15380 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
15390 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d 65 5d  length $varName]
153a0 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
153b0 20 20 20 20 20 20 20 73 65 74 20 76 61 72 4e 61         set varNa
153c0 6d 65 20 73 61 76 65 64 45 6e 76 0d 0a 20 20 20  me savedEnv..   
153d0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 75 70     }....      up
153e0 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 73  var 1 $varName s
153f0 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20  avedEnv....     
15400 20 66 6f 72 65 61 63 68 20 6e 61 6d 65 20 24 6e   foreach name $n
15410 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
15420 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
15430 20 73 61 76 65 64 45 6e 76 28 24 6e 61 6d 65 29   savedEnv($name)
15440 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
15450 20 20 20 20 20 73 65 74 20 3a 3a 65 6e 76 28 24       set ::env($
15460 6e 61 6d 65 29 20 24 73 61 76 65 64 45 6e 76 28  name) $savedEnv(
15470 24 6e 61 6d 65 29 0d 0a 20 20 20 20 20 20 20 20  $name)..        
15480 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c    unset -nocompl
15490 61 69 6e 20 73 61 76 65 64 45 6e 76 28 24 6e 61  ain savedEnv($na
154a0 6d 65 29 0d 0a 20 20 20 20 20 20 20 20 7d 20 65  me)..        } e
154b0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
154c0 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61   unset -nocompla
154d0 69 6e 20 3a 3a 65 6e 76 28 24 6e 61 6d 65 29 0d  in ::env($name).
154e0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
154f0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
15500 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
15510 69 73 20 69 73 20 73 65 6c 66 2d 63 6c 65 61 6e  is is self-clean
15520 69 6e 67 2e 20 20 49 66 20 6e 6f 20 73 61 76 65  ing.  If no save
15530 64 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61  d environment va
15540 72 69 61 62 6c 65 73 20 6e 6f 77 0d 0a 20 20 20  riables now..   
15550 20 20 20 23 20 20 20 20 20 20 20 65 78 69 73 74     #       exist
15560 2c 20 72 65 6d 6f 76 65 20 74 68 65 20 61 72 72  , remove the arr
15570 61 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ay...      #..  
15580 20 20 20 20 69 66 20 7b 5b 61 72 72 61 79 20 73      if {[array s
15590 69 7a 65 20 73 61 76 65 64 45 6e 76 5d 20 3d 3d  ize savedEnv] ==
155a0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
155b0 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d      unset -nocom
155c0 70 6c 61 69 6e 20 73 61 76 65 64 45 6e 76 0d 0a  plain savedEnv..
155d0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
155e0 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 61 76 65  ...    proc save
155f0 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
15600 45 6e 76 69 72 6f 6e 6d 65 6e 74 20 7b 7d 20 7b  Environment {} {
15610 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20  ..      upvar 1 
15620 73 61 76 65 64 45 6e 76 20 73 61 76 65 64 45 6e  savedEnv savedEn
15630 76 0d 0a 0d 0a 20 20 20 20 20 20 73 61 76 65 45  v....      saveE
15640 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62  nvironmentVariab
15650 6c 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20  les [list \..   
15660 20 20 20 20 20 20 20 44 65 66 61 75 6c 74 46 6c         DefaultFl
15670 61 67 73 5f 53 51 4c 69 74 65 43 6f 6e 6e 65 63  ags_SQLiteConnec
15680 74 69 6f 6e 20 4e 6f 5f 53 51 4c 69 74 65 43 6f  tion No_SQLiteCo
15690 6e 6e 65 63 74 69 6f 6e 4e 65 77 50 61 72 73 65  nnectionNewParse
156a0 72 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  r] \..          
156b0 73 61 76 65 64 45 6e 76 0d 0a 20 20 20 20 7d 0d  savedEnv..    }.
156c0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 65 73  ....    proc res
156d0 74 6f 72 65 53 51 4c 69 74 65 43 6f 6e 6e 65 63  toreSQLiteConnec
156e0 74 69 6f 6e 45 6e 76 69 72 6f 6e 6d 65 6e 74 20  tionEnvironment 
156f0 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61  {} {..      upva
15700 72 20 31 20 73 61 76 65 64 45 6e 76 20 73 61 76  r 1 savedEnv sav
15710 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 72  edEnv....      r
15720 65 73 74 6f 72 65 45 6e 76 69 72 6f 6e 6d 65 6e  estoreEnvironmen
15730 74 56 61 72 69 61 62 6c 65 73 20 5b 6c 69 73 74  tVariables [list
15740 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 44 65   \..          De
15750 66 61 75 6c 74 46 6c 61 67 73 5f 53 51 4c 69 74  faultFlags_SQLit
15760 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 4e 6f 5f 53  eConnection No_S
15770 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 4e  QLiteConnectionN
15780 65 77 50 61 72 73 65 72 5d 20 5c 0d 0a 20 20 20  ewParser] \..   
15790 20 20 20 20 20 20 20 73 61 76 65 64 45 6e 76 0d         savedEnv.
157a0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
157b0 72 6f 63 20 73 61 76 65 53 51 4c 69 74 65 43 6f  roc saveSQLiteCo
157c0 6e 76 65 72 74 45 6e 76 69 72 6f 6e 6d 65 6e 74  nvertEnvironment
157d0 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76   {} {..      upv
157e0 61 72 20 31 20 73 61 76 65 64 45 6e 76 20 73 61  ar 1 savedEnv sa
157f0 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20  vedEnv....      
15800 73 61 76 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56  saveEnvironmentV
15810 61 72 69 61 62 6c 65 73 20 5b 6c 69 73 74 20 5c  ariables [list \
15820 0d 0a 20 20 20 20 20 20 20 20 20 20 55 73 65 5f  ..          Use_
15830 53 51 4c 69 74 65 43 6f 6e 76 65 72 74 5f 44 65  SQLiteConvert_De
15840 66 61 75 6c 74 44 62 54 79 70 65 20 55 73 65 5f  faultDbType Use_
15850 53 51 4c 69 74 65 43 6f 6e 76 65 72 74 5f 44 65  SQLiteConvert_De
15860 66 61 75 6c 74 54 79 70 65 4e 61 6d 65 5d 20 5c  faultTypeName] \
15870 0d 0a 20 20 20 20 20 20 20 20 20 20 73 61 76 65  ..          save
15880 64 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  dEnv..    }.....
15890 20 20 20 20 70 72 6f 63 20 72 65 73 74 6f 72 65      proc restore
158a0 53 51 4c 69 74 65 43 6f 6e 76 65 72 74 45 6e 76  SQLiteConvertEnv
158b0 69 72 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20  ironment {} {.. 
158c0 20 20 20 20 20 75 70 76 61 72 20 31 20 73 61 76       upvar 1 sav
158d0 65 64 45 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a  edEnv savedEnv..
158e0 0d 0a 20 20 20 20 20 20 72 65 73 74 6f 72 65 45  ..      restoreE
158f0 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62  nvironmentVariab
15900 6c 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20  les [list \..   
15910 20 20 20 20 20 20 20 55 73 65 5f 53 51 4c 69 74         Use_SQLit
15920 65 43 6f 6e 76 65 72 74 5f 44 65 66 61 75 6c 74  eConvert_Default
15930 44 62 54 79 70 65 20 55 73 65 5f 53 51 4c 69 74  DbType Use_SQLit
15940 65 43 6f 6e 76 65 72 74 5f 44 65 66 61 75 6c 74  eConvert_Default
15950 54 79 70 65 4e 61 6d 65 5d 20 5c 0d 0a 20 20 20  TypeName] \..   
15960 20 20 20 20 20 20 20 73 61 76 65 64 45 6e 76 0d         savedEnv.
15970 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
15980 72 6f 63 20 73 65 74 75 70 44 62 49 6e 74 65 72  roc setupDbInter
15990 72 75 70 74 43 61 6c 6c 62 61 63 6b 20 7b 20 63  ruptCallback { c
159a0 68 61 6e 6e 65 6c 20 6c 6f 67 20 7d 20 7b 0d 0a  hannel log } {..
159b0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
159c0 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 73 65 74 74 69  nnel "---- setti
159d0 6e 67 20 75 70 20 64 65 62 75 67 67 65 72 20 69  ng up debugger i
159e0 6e 74 65 72 72 75 70 74 20 63 61 6c 6c 62 61 63  nterrupt callbac
159f0 6b 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  k... "....      
15a00 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
15a10 20 20 20 20 20 20 73 61 76 65 45 6e 76 69 72 6f        saveEnviro
15a20 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20 5b  nmentVariables [
15a30 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  list \..        
15a40 20 20 20 20 71 75 69 65 74 46 69 6e 64 49 6e 74      quietFindInt
15a50 65 72 70 72 65 74 65 72 54 65 73 74 50 61 74 68  erpreterTestPath
15a60 20 71 75 69 65 74 53 65 74 75 70 49 6e 74 65 72   quietSetupInter
15a70 70 72 65 74 65 72 54 65 73 74 50 61 74 68 5d 0d  preterTestPath].
15a80 0a 0d 0a 20 20 20 20 20 20 20 20 74 72 79 20 7b  ...        try {
15a90 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
15aa0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
15ab0 20 50 72 65 76 65 6e 74 20 74 68 65 20 76 65 6e   Prevent the ven
15ac0 64 6f 72 20 73 63 72 69 70 74 20 66 72 6f 6d 20  dor script from 
15ad0 62 65 69 6e 67 20 6e 6f 69 73 79 20 77 68 65 6e  being noisy when
15ae0 20 63 72 65 61 74 69 6e 67 0d 0a 20 20 20 20 20   creating..     
15af0 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
15b00 20 69 73 6f 6c 61 74 65 64 20 69 6e 74 65 72 70   isolated interp
15b10 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20  reter...        
15b20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73    #..          s
15b30 65 74 20 3a 3a 65 6e 76 28 71 75 69 65 74 46 69  et ::env(quietFi
15b40 6e 64 49 6e 74 65 72 70 72 65 74 65 72 54 65 73  ndInterpreterTes
15b50 74 50 61 74 68 29 20 31 0d 0a 20 20 20 20 20 20  tPath) 1..      
15b60 20 20 20 20 73 65 74 20 3a 3a 65 6e 76 28 71 75      set ::env(qu
15b70 69 65 74 53 65 74 75 70 49 6e 74 65 72 70 72 65  ietSetupInterpre
15b80 74 65 72 54 65 73 74 50 61 74 68 29 20 31 0d 0a  terTestPath) 1..
15b90 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
15ba0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
15bb0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   Make sure the s
15bc0 63 72 69 70 74 20 64 65 62 75 67 67 65 72 20 61  cript debugger a
15bd0 6e 64 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20  nd the isolated 
15be0 69 6e 74 65 72 70 72 65 74 65 72 0d 0a 20 20 20  interpreter..   
15bf0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
15c00 72 65 20 73 65 74 75 70 20 61 6e 64 20 72 65 61  re setup and rea
15c10 64 79 20 66 6f 72 20 75 73 65 2e 0d 0a 20 20 20  dy for use...   
15c20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
15c30 20 20 20 20 64 65 62 75 67 20 73 65 74 75 70 20      debug setup 
15c40 74 72 75 65 20 74 72 75 65 0d 0a 0d 0a 20 20 20  true true....   
15c50 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
15c60 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64      # NOTE: Load
15c70 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 70   the necessary p
15c80 61 63 6b 61 67 65 73 20 69 6e 74 6f 20 74 68 65  ackages into the
15c90 20 69 73 6f 6c 61 74 65 64 20 69 6e 74 65 72 70   isolated interp
15ca0 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20  reter...        
15cb0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 64    #..          d
15cc0 65 62 75 67 20 65 76 61 6c 20 7b 0d 0a 20 20 20  ebug eval {..   
15cd0 20 20 20 20 20 20 20 20 20 70 61 63 6b 61 67 65           package
15ce0 20 72 65 71 75 69 72 65 20 45 61 67 6c 65 0d 0a   require Eagle..
15cf0 20 20 20 20 20 20 20 20 20 20 20 20 70 61 63 6b              pack
15d00 61 67 65 20 72 65 71 75 69 72 65 20 45 61 67 6c  age require Eagl
15d10 65 2e 4c 69 62 72 61 72 79 0d 0a 20 20 20 20 20  e.Library..     
15d20 20 20 20 20 20 20 20 70 61 63 6b 61 67 65 20 72         package r
15d30 65 71 75 69 72 65 20 45 61 67 6c 65 2e 54 65 73  equire Eagle.Tes
15d40 74 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  t..          }..
15d50 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
15d60 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
15d70 20 43 6f 70 79 20 74 68 65 20 6e 65 63 65 73 73   Copy the necess
15d80 61 72 79 20 76 61 72 69 61 62 6c 65 73 20 69 6e  ary variables in
15d90 74 6f 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20  to the isolated 
15da0 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20  interpreter...  
15db0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
15dc0 20 20 20 20 20 64 65 62 75 67 20 69 6e 76 6f 6b       debug invok
15dd0 65 20 30 20 73 65 74 20 3a 3a 74 65 73 74 5f 63  e 0 set ::test_c
15de0 68 61 6e 6e 65 6c 20 24 63 68 61 6e 6e 65 6c 3b  hannel $channel;
15df0 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 5b 74 70   # NOTE: For [tp
15e00 75 74 73 5d 2e 0d 0a 20 20 20 20 20 20 20 20 20  uts]...         
15e10 20 64 65 62 75 67 20 69 6e 76 6f 6b 65 20 30 20   debug invoke 0 
15e20 73 65 74 20 3a 3a 74 65 73 74 5f 6c 6f 67 20 24  set ::test_log $
15e30 6c 6f 67 3b 20 23 20 4e 4f 54 45 3a 20 46 6f 72  log; # NOTE: For
15e40 20 5b 74 6c 6f 67 5d 2e 0d 0a 0d 0a 20 20 20 20   [tlog].....    
15e50 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
15e60 20 20 20 23 20 4e 4f 54 45 3a 20 49 6e 73 74 61     # NOTE: Insta
15e70 6c 6c 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  ll the callback 
15e80 73 63 72 69 70 74 20 74 6f 20 62 65 20 65 76 61  script to be eva
15e90 6c 75 61 74 65 64 20 69 6e 20 74 68 65 20 69 73  luated in the is
15ea0 6f 6c 61 74 65 64 0d 0a 20 20 20 20 20 20 20 20  olated..        
15eb0 20 20 23 20 20 20 20 20 20 20 69 6e 74 65 72 70    #       interp
15ec0 72 65 74 65 72 20 77 68 65 6e 20 74 68 69 73 20  reter when this 
15ed0 69 6e 74 65 72 70 72 65 74 65 72 20 69 73 20 69  interpreter is i
15ee0 6e 74 65 72 72 75 70 74 65 64 20 62 79 20 73 63  nterrupted by sc
15ef0 72 69 70 74 0d 0a 20 20 20 20 20 20 20 20 20 20  ript..          
15f00 23 20 20 20 20 20 20 20 63 61 6e 63 65 6c 6c 61  #       cancella
15f10 74 69 6f 6e 2c 20 65 74 63 2e 0d 0a 20 20 20 20  tion, etc...    
15f20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
15f30 20 20 20 64 65 62 75 67 20 63 61 6c 6c 62 61 63     debug callbac
15f40 6b 20 61 70 70 6c 79 20 7b 7b 73 65 6e 64 65 72  k apply {{sender
15f50 20 65 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20   e} {..         
15f60 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
15f70 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
15f80 69 66 20 74 68 69 73 20 64 65 62 75 67 67 65 72  if this debugger
15f90 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 6f 6e 65   callback is one
15fa0 20 74 68 61 74 20 77 65 20 63 61 72 65 20 61 62   that we care ab
15fb0 6f 75 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  out...          
15fc0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
15fd0 20 73 65 74 20 69 6e 74 65 72 72 75 70 74 54 79   set interruptTy
15fe0 70 65 73 20 5b 73 70 6c 69 74 20 5b 24 65 20 49  pes [split [$e I
15ff0 6e 74 65 72 72 75 70 74 54 79 70 65 5d 20 22 2c  nterruptType] ",
16000 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20   "]....         
16010 20 20 20 69 66 20 7b 22 43 61 6e 63 65 6c 65 64     if {"Canceled
16020 22 20 69 6e 20 24 69 6e 74 65 72 72 75 70 74 54  " in $interruptT
16030 79 70 65 73 20 7c 7c 20 5c 0d 0a 20 20 20 20 20  ypes || \..     
16040 20 20 20 20 20 20 20 20 20 20 20 22 55 6e 77 6f             "Unwo
16050 75 6e 64 22 20 69 6e 20 24 69 6e 74 65 72 72 75  und" in $interru
16060 70 74 54 79 70 65 73 7d 20 74 68 65 6e 20 7b 0d  ptTypes} then {.
16070 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
16080 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
16090 23 20 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75 72  # NOTE: Make sur
160a0 65 20 74 68 65 20 5b 6f 62 6a 65 63 74 5d 20 63  e the [object] c
160b0 6f 6d 6d 61 6e 64 20 69 73 20 61 76 61 69 6c 61  ommand is availa
160c0 62 6c 65 2e 20 20 53 69 6e 63 65 0d 0a 20 20 20  ble.  Since..   
160d0 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
160e0 20 20 20 74 68 69 73 20 69 73 20 61 6e 20 69 73     this is an is
160f0 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72 65 74  olated interpret
16100 65 72 2c 20 63 68 65 63 6b 20 66 6f 72 20 69 74  er, check for it
16110 20 74 68 65 20 68 61 72 64 0d 0a 20 20 20 20 20   the hard..     
16120 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
16130 20 77 61 79 2e 0d 0a 20 20 20 20 20 20 20 20 20   way...         
16140 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
16150 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67        if {[lleng
16160 74 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64  th [info command
16170 73 20 6f 62 6a 65 63 74 5d 5d 20 3e 20 30 7d 20  s object]] > 0} 
16180 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
16190 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
161a0 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
161b0 45 3a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75  E: Iterate throu
161c0 67 68 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20  gh all database 
161d0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6b 6e 6f 77  connections know
161e0 6e 20 74 6f 20 74 68 65 0d 0a 20 20 20 20 20 20  n to the..      
161f0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
16200 20 20 70 61 72 65 6e 74 20 69 6e 74 65 72 70 72    parent interpr
16210 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20  eter...         
16220 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
16230 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
16240 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20   foreach -alias 
16250 70 61 69 72 20 5b 6f 62 6a 65 63 74 20 69 6e 76  pair [object inv
16260 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
16270 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
16280 20 20 20 20 20 20 20 20 20 20 20 20 20 24 65 20               $e 
16290 49 6e 74 65 72 70 72 65 74 65 72 2e 63 6f 6e 6e  Interpreter.conn
162a0 65 63 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20  ections] {..    
162b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
162c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
162d0 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
162e0 70 74 20 74 6f 20 63 61 6e 63 65 6c 20 61 6e 79  pt to cancel any
162f0 20 53 51 4c 20 71 75 65 72 69 65 73 20 69 6e 20   SQL queries in 
16300 70 72 6f 67 72 65 73 73 20 6f 6e 0d 0a 20 20 20  progress on..   
16310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
16320 20 20 20 20 20 20 20 74 68 69 73 20 64 61 74 61         this data
16330 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
16340 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
16350 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
16360 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
16370 74 63 68 20 7b 24 70 61 69 72 20 56 61 6c 75 65  tch {$pair Value
16380 2e 43 61 6e 63 65 6c 7d 20 65 72 72 6f 72 5d 7d  .Cancel} error]}
16390 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
163a0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
163b0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
163c0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
163d0 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
163e0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
163f0 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
16400 65 64 20 74 6f 20 63 61 6e 63 65 6c 20 71 75 65  ed to cancel que
16410 72 79 20 66 6f 72 20 22 20 5c 0d 0a 20 20 20 20  ry for " \..    
16420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16430 20 20 20 20 22 63 6f 6e 6e 65 63 74 69 6f 6e 20      "connection 
16440 5c 22 22 20 5b 24 70 61 69 72 20 4b 65 79 5d 20  \"" [$pair Key] 
16450 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e  "\", error: " \n
16460 5c 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  \t \..          
16470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 65                $e
16480 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  rror \n]..      
16490 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
164a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
164b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
164c0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
164d0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
164e0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
164f0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 6e 20 5c  [appendArgs \n \
16500 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
16510 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
16520 49 4e 47 3a 20 63 61 6e 6e 6f 74 20 63 61 6e 63  ING: cannot canc
16530 65 6c 20 61 6e 79 20 71 75 65 72 69 65 73 3a 20  el any queries: 
16540 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
16550 20 20 20 20 20 20 20 20 20 22 74 68 65 20 5c 22           "the \"
16560 6f 62 6a 65 63 74 5c 22 20 63 6f 6d 6d 61 6e 64  object\" command
16570 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
16580 65 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  e\n"]..         
16590 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
165a0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
165b0 20 7d 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 66   }}..        } f
165c0 69 6e 61 6c 6c 79 20 7b 0d 0a 20 20 20 20 20 20  inally {..      
165d0 20 20 20 20 72 65 73 74 6f 72 65 45 6e 76 69 72      restoreEnvir
165e0 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20  onmentVariables 
165f0 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20  [list \..       
16600 20 20 20 20 20 20 20 71 75 69 65 74 46 69 6e 64         quietFind
16610 49 6e 74 65 72 70 72 65 74 65 72 54 65 73 74 50  InterpreterTestP
16620 61 74 68 20 71 75 69 65 74 53 65 74 75 70 49 6e  ath quietSetupIn
16630 74 65 72 70 72 65 74 65 72 54 65 73 74 50 61 74  terpreterTestPat
16640 68 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  h]..        }.. 
16650 20 20 20 20 20 7d 20 65 72 72 6f 72 5d 20 3d 3d       } error] ==
16660 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
16670 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
16680 74 20 69 6e 74 65 72 72 75 70 74 43 61 6c 6c 62  t interruptCallb
16690 61 63 6b 2e 73 71 6c 69 74 65 33 0d 0a 0d 0a 20  ack.sqlite3.... 
166a0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
166b0 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20  annel yes\n..   
166c0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
166d0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
166e0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
166f0 22 6e 6f 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e  "no, error: " \n
16700 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20  \t $error \n].. 
16710 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
16720 0d 0a 20 20 20 20 70 72 6f 63 20 63 6c 65 61 6e  ..    proc clean
16730 75 70 46 69 6c 65 20 7b 20 66 69 6c 65 4e 61 6d  upFile { fileNam
16740 65 20 7b 63 6f 6c 6c 65 63 74 20 74 72 75 65 7d  e {collect true}
16750 20 7b 66 6f 72 63 65 20 66 61 6c 73 65 7d 20 7d   {force false} }
16760 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
16770 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
16780 70 74 20 74 6f 20 66 6f 72 63 65 20 61 6c 6c 20  pt to force all 
16790 70 65 6e 64 69 6e 67 20 22 67 61 72 62 61 67 65  pending "garbage
167a0 22 20 6f 62 6a 65 63 74 73 20 74 6f 20 62 65 20  " objects to be 
167b0 63 6f 6c 6c 65 63 74 65 64 2c 0d 0a 20 20 20 20  collected,..    
167c0 20 20 23 20 20 20 20 20 20 20 69 6e 63 6c 75 64    #       includ
167d0 69 6e 67 20 53 51 4c 69 74 65 20 73 74 61 74 65  ing SQLite state
167e0 6d 65 6e 74 73 20 61 6e 64 20 62 61 63 6b 75 70  ments and backup
167f0 20 6f 62 6a 65 63 74 73 3b 20 74 68 69 73 20 73   objects; this s
16800 68 6f 75 6c 64 20 61 6c 6c 6f 77 0d 0a 20 20 20  hould allow..   
16810 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 75     #       the u
16820 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
16830 73 65 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65  se file to be de
16840 6c 65 74 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d  leted...      #.
16850 0a 20 20 20 20 20 20 69 66 20 7b 24 63 6f 6c 6c  .      if {$coll
16860 65 63 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ect} then {..   
16870 20 20 20 20 20 63 6f 6c 6c 65 63 74 47 61 72 62       collectGarb
16880 61 67 65 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  age $::test_chan
16890 6e 65 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  nel..      }....
168a0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
168b0 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20   NOTE: Check if 
168c0 74 68 65 20 66 69 6c 65 20 73 74 69 6c 6c 20 65  the file still e
168d0 78 69 73 74 73 2e 0d 0a 20 20 20 20 20 20 23 0d  xists...      #.
168e0 0a 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65  .      if {[file
168f0 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d   exists $fileNam
16900 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
16910 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
16920 20 4e 4f 54 45 3a 20 53 6b 69 70 20 64 65 6c 65   NOTE: Skip dele
16930 74 69 6e 67 20 74 65 73 74 20 66 69 6c 65 73 20  ting test files 
16940 69 66 20 73 6f 6d 65 62 6f 64 79 20 73 65 74 73  if somebody sets
16950 20 74 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 69   the global vari
16960 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20  able..        # 
16970 20 20 20 20 20 20 74 6f 20 70 72 65 76 65 6e 74        to prevent
16980 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d   it...        #.
16990 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 66 6f  .        if {$fo
169a0 72 63 65 20 7c 7c 20 21 5b 69 6e 66 6f 20 65 78  rce || ![info ex
169b0 69 73 74 73 20 3a 3a 6e 6f 28 63 6c 65 61 6e 75  ists ::no(cleanu
169c0 70 46 69 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d  pFile)]} then {.
169d0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
169e0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
169f0 41 74 74 65 6d 70 74 20 74 6f 20 64 65 6c 65 74  Attempt to delet
16a00 65 20 74 68 65 20 74 65 73 74 20 66 69 6c 65 20  e the test file 
16a10 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  now...          
16a20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  #..          if 
16a30 7b 5b 73 65 74 20 63 6f 64 65 20 5b 63 61 74 63  {[set code [catc
16a40 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24  h {file delete $
16a50 66 69 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72 5d  fileName} error]
16a60 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
16a70 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
16a80 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65        # NOTE: We
16a90 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20   somehow failed 
16aa0 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 66 69  to delete the fi
16ab0 6c 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d  le, report why..
16ac0 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
16ad0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
16ae0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
16af0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
16b00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16b10 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
16b20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65  failed to delete
16b30 20 74 65 73 74 20 66 69 6c 65 20 5c 22 22 20 24   test file \"" $
16b40 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20  fileName \..    
16b50 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20              "\" 
16b60 64 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 2c 20  during cleanup, 
16b70 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65  error: " \n\t $e
16b80 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  rror \n]..      
16b90 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
16ba0 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
16bb0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
16bc0 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68 61  # NOTE: Show tha
16bd0 74 20 77 65 20 73 6b 69 70 70 65 64 20 64 65 6c  t we skipped del
16be0 65 74 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0d  eting the file..
16bf0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
16c00 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 64 65          set code
16c10 20 30 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   0....          
16c20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
16c30 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
16c40 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
16c50 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
16c60 3a 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69  : skipped deleti
16c70 6e 67 20 74 65 73 74 20 66 69 6c 65 20 5c 22 22  ng test file \""
16c80 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20   $fileName \..  
16c90 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20              "\" 
16ca0 64 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 5c 6e  during cleanup\n
16cb0 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  "]..        }.. 
16cc0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
16cd0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
16ce0 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 66 69    # NOTE: The fi
16cf0 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  le does not exis
16d00 74 2c 20 73 75 63 63 65 73 73 21 0d 0a 20 20 20  t, success!..   
16d10 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
16d20 73 65 74 20 63 6f 64 65 20 30 0d 0a 20 20 20 20  set code 0..    
16d30 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74    }....      ret
16d40 75 72 6e 20 24 63 6f 64 65 0d 0a 20 20 20 20 7d  urn $code..    }
16d50 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 6c  .....    proc cl
16d60 65 61 6e 75 70 4d 65 6d 6f 72 79 20 7b 20 76 61  eanupMemory { va
16d70 72 4e 61 6d 65 20 7b 71 75 69 65 74 20 66 61 6c  rName {quiet fal
16d80 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69  se} } {..      i
16d90 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62  f {[haveSQLiteOb
16da0 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 20 26 26 20  jectCommand] && 
16db0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
16dc0 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 72  ring length $var
16dd0 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  Name] > 0} then 
16de0 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
16df0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
16e00 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63 69  fer to the speci
16e10 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28 65  fied variable (e
16e20 2e 67 2e 20 22 63 6f 6e 6e 65 63 74 69 6f 6e 22  .g. "connection"
16e30 29 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20  ) in the..      
16e40 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74 65 78    #       contex
16e50 74 20 6f 66 20 6f 75 72 20 63 61 6c 6c 65 72 2e  t of our caller.
16e60 20 20 54 68 65 20 6f 70 61 71 75 65 20 6f 62 6a    The opaque obj
16e70 65 63 74 20 68 61 6e 64 6c 65 20 66 6f 72 20 61  ect handle for a
16e80 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  n..        #    
16e90 20 20 20 41 44 4f 2e 4e 45 54 20 63 6f 6e 6e 65     ADO.NET conne
16ea0 63 74 69 6f 6e 20 70 72 65 76 69 6f 75 73 6c 79  ction previously
16eb0 20 72 65 74 75 72 6e 65 64 20 62 79 20 5b 67 65   returned by [ge
16ec0 74 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 5d 0d 0a  tDbConnection]..
16ed0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
16ee0 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64  should be stored
16ef0 20 74 68 65 72 65 2e 0d 0a 20 20 20 20 20 20 20   there...       
16f00 20 23 0d 0a 20 20 20 20 20 20 20 20 75 70 76 61   #..        upva
16f10 72 20 31 20 24 76 61 72 4e 61 6d 65 20 63 6f 6e  r 1 $varName con
16f20 6e 65 63 74 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20  nection....     
16f30 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
16f40 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
16f50 74 20 69 6e 76 6f 6b 65 20 24 63 6f 6e 6e 65 63  t invoke $connec
16f60 74 69 6f 6e 20 52 65 6c 65 61 73 65 4d 65 6d 6f  tion ReleaseMemo
16f70 72 79 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65  ry..        } re
16f80 73 75 6c 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  sult]} then {.. 
16f90 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
16fa0 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
16fb0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
16fc0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
16fd0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
16fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
16ff0 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
17000 69 6c 65 64 20 74 6f 20 72 65 6c 65 61 73 65 20  iled to release 
17010 64 61 74 61 62 61 73 65 20 6d 65 6d 6f 72 79 2c  database memory,
17020 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20   error: " \..   
17030 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c               \n\
17040 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20  t $result \n].. 
17050 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
17060 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
17070 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65  ..      if {[lle
17080 6e 67 74 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61  ngth [info comma
17090 6e 64 73 20 64 65 62 75 67 5d 5d 20 3e 20 30 7d  nds debug]] > 0}
170a0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
170b0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
170c0 20 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c           uplevel
170d0 20 31 20 5b 6c 69 73 74 20 64 65 62 75 67 20 70   1 [list debug p
170e0 75 72 67 65 5d 0d 0a 20 20 20 20 20 20 20 20 7d  urge]..        }
170f0 20 72 65 73 75 6c 74 5d 7d 20 74 68 65 6e 20 7b   result]} then {
17100 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
17110 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
17120 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
17130 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
17140 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
17150 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17160 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
17170 20 66 61 69 6c 65 64 20 74 6f 20 70 75 72 67 65   failed to purge
17180 20 63 61 6c 6c 20 66 72 61 6d 65 2c 20 65 72 72   call frame, err
17190 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  or: " \..       
171a0 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72           \n\t $r
171b0 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20  esult \n]..     
171c0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
171d0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
171e0 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
171f0 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b       uplevel 1 [
17200 6c 69 73 74 20 64 65 62 75 67 20 63 6c 65 61 6e  list debug clean
17210 75 70 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 72  up]..        } r
17220 65 73 75 6c 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a  esult]} then {..
17230 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
17240 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
17250 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
17260 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
17270 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
17280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17290 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
172a0 61 69 6c 65 64 20 74 6f 20 63 6c 65 61 6e 75 70  ailed to cleanup
172b0 20 69 6e 74 65 72 70 72 65 74 65 72 2c 20 65 72   interpreter, er
172c0 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20  ror: " \..      
172d0 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24            \n\t $
172e0 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20  result \n]..    
172f0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
17300 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
17310 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
17320 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20        uplevel 1 
17330 5b 6c 69 73 74 20 64 65 62 75 67 20 63 6f 6c 6c  [list debug coll
17340 65 63 74 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20  ect]..        } 
17350 72 65 73 75 6c 74 5d 7d 20 74 68 65 6e 20 7b 0d  result]} then {.
17360 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
17370 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
17380 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
17390 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
173a0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
173b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
173c0 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
173d0 66 61 69 6c 65 64 20 74 6f 20 63 6f 6c 6c 65 63  failed to collec
173e0 74 20 67 61 72 62 61 67 65 2c 20 65 72 72 6f 72  t garbage, error
173f0 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  : " \..         
17400 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73         \n\t $res
17410 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ult \n]..       
17420 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
17430 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
17440 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 65 74  ....    proc set
17450 75 70 4d 65 6d 6f 72 79 43 6f 75 6e 74 65 72 73  upMemoryCounters
17460 20 7b 20 76 61 72 4e 61 6d 65 20 7d 20 7b 0d 0a   { varName } {..
17470 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53        if {[haveS
17480 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61  QLiteObjectComma
17490 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  nd]} then {..   
174a0 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61       upvar 1 $va
174b0 72 4e 61 6d 65 20 63 6f 75 6e 74 65 72 0d 0a 0d  rName counter...
174c0 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 75  .        set cou
174d0 6e 74 65 72 28 31 29 20 5b 6f 62 6a 65 63 74 20  nter(1) [object 
174e0 63 72 65 61 74 65 20 2d 61 6c 69 61 73 20 5c 0d  create -alias \.
174f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73  .            Sys
17500 74 65 6d 2e 44 69 61 67 6e 6f 73 74 69 63 73 2e  tem.Diagnostics.
17510 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74  PerformanceCount
17520 65 72 20 50 72 6f 63 65 73 73 20 5c 0d 0a 20 20  er Process \..  
17530 20 20 20 20 20 20 20 20 20 20 22 57 6f 72 6b 69            "Worki
17540 6e 67 20 53 65 74 22 20 5b 66 69 6c 65 20 72 6f  ng Set" [file ro
17550 6f 74 6e 61 6d 65 20 5b 66 69 6c 65 20 74 61 69  otname [file tai
17560 6c 20 24 3a 3a 62 69 6e 5f 66 69 6c 65 5d 5d 5d  l $::bin_file]]]
17570 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
17580 63 6f 75 6e 74 65 72 28 32 29 20 5b 6f 62 6a 65  counter(2) [obje
17590 63 74 20 63 72 65 61 74 65 20 2d 61 6c 69 61 73  ct create -alias
175a0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
175b0 53 79 73 74 65 6d 2e 44 69 61 67 6e 6f 73 74 69  System.Diagnosti
175c0 63 73 2e 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f  cs.PerformanceCo
175d0 75 6e 74 65 72 20 50 72 6f 63 65 73 73 20 5c 0d  unter Process \.
175e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 57 6f  .            "Wo
175f0 72 6b 69 6e 67 20 53 65 74 20 50 65 61 6b 22 20  rking Set Peak" 
17600 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 5b  [file rootname [
17610 66 69 6c 65 20 74 61 69 6c 20 24 3a 3a 62 69 6e  file tail $::bin
17620 5f 66 69 6c 65 5d 5d 5d 0d 0a 0d 0a 20 20 20 20  _file]]]....    
17630 20 20 20 20 73 65 74 20 63 6f 75 6e 74 65 72 28      set counter(
17640 33 29 20 5b 6f 62 6a 65 63 74 20 63 72 65 61 74  3) [object creat
17650 65 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20  e -alias \..    
17660 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
17670 69 61 67 6e 6f 73 74 69 63 73 2e 50 65 72 66 6f  iagnostics.Perfo
17680 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 20 50 72  rmanceCounter Pr
17690 6f 63 65 73 73 20 5c 0d 0a 20 20 20 20 20 20 20  ocess \..       
176a0 20 20 20 20 20 22 50 72 69 76 61 74 65 20 42 79       "Private By
176b0 74 65 73 22 20 5b 66 69 6c 65 20 72 6f 6f 74 6e  tes" [file rootn
176c0 61 6d 65 20 5b 66 69 6c 65 20 74 61 69 6c 20 24  ame [file tail $
176d0 3a 3a 62 69 6e 5f 66 69 6c 65 5d 5d 5d 0d 0a 20  ::bin_file]]].. 
176e0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
176f0 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 7d  return ""..    }
17700 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 65  .....    proc re
17710 70 6f 72 74 4d 65 6d 6f 72 79 43 6f 75 6e 74 65  portMemoryCounte
17720 72 73 20 7b 20 63 68 61 6e 6e 65 6c 20 76 61 72  rs { channel var
17730 4e 61 6d 65 20 70 72 65 66 69 78 20 7d 20 7b 0d  Name prefix } {.
17740 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65  .      if {[have
17750 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d  SQLiteObjectComm
17760 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  and]} then {..  
17770 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76        upvar 1 $v
17780 61 72 4e 61 6d 65 20 63 6f 75 6e 74 65 72 0d 0a  arName counter..
17790 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
177a0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
177b0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
177c0 20 20 20 20 22 2d 2d 2d 2d 20 22 20 24 70 72 65      "---- " $pre
177d0 66 69 78 20 22 20 63 6f 75 6e 74 65 72 20 5c 22  fix " counter \"
177e0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
177f0 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   [object invoke 
17800 24 63 6f 75 6e 74 65 72 28 31 29 20 43 6f 75 6e  $counter(1) Coun
17810 74 65 72 4e 61 6d 65 5d 20 22 5c 22 20 76 61 6c  terName] "\" val
17820 75 65 20 69 73 20 22 20 5c 0d 0a 20 20 20 20 20  ue is " \..     
17830 20 20 20 20 20 20 20 5b 6f 62 6a 65 63 74 20 69         [object i
17840 6e 76 6f 6b 65 20 24 63 6f 75 6e 74 65 72 28 31  nvoke $counter(1
17850 29 20 52 61 77 56 61 6c 75 65 5d 20 5c 6e 5d 0d  ) RawValue] \n].
17860 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  ...        tputs
17870 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
17880 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
17890 20 20 20 20 20 22 2d 2d 2d 2d 20 22 20 24 70 72       "---- " $pr
178a0 65 66 69 78 20 22 20 63 6f 75 6e 74 65 72 20 5c  efix " counter \
178b0 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
178c0 20 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65    [object invoke
178d0 20 24 63 6f 75 6e 74 65 72 28 32 29 20 43 6f 75   $counter(2) Cou
178e0 6e 74 65 72 4e 61 6d 65 5d 20 22 5c 22 20 76 61  nterName] "\" va
178f0 6c 75 65 20 69 73 20 22 20 5c 0d 0a 20 20 20 20  lue is " \..    
17900 20 20 20 20 20 20 20 20 5b 6f 62 6a 65 63 74 20          [object 
17910 69 6e 76 6f 6b 65 20 24 63 6f 75 6e 74 65 72 28  invoke $counter(
17920 32 29 20 52 61 77 56 61 6c 75 65 5d 20 5c 6e 5d  2) RawValue] \n]
17930 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74  ....        tput
17940 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
17950 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
17960 20 20 20 20 20 20 22 2d 2d 2d 2d 20 22 20 24 70        "---- " $p
17970 72 65 66 69 78 20 22 20 63 6f 75 6e 74 65 72 20  refix " counter 
17980 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
17990 20 20 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b     [object invok
179a0 65 20 24 63 6f 75 6e 74 65 72 28 33 29 20 43 6f  e $counter(3) Co
179b0 75 6e 74 65 72 4e 61 6d 65 5d 20 22 5c 22 20 76  unterName] "\" v
179c0 61 6c 75 65 20 69 73 20 22 20 5c 0d 0a 20 20 20  alue is " \..   
179d0 20 20 20 20 20 20 20 20 20 5b 6f 62 6a 65 63 74           [object
179e0 20 69 6e 76 6f 6b 65 20 24 63 6f 75 6e 74 65 72   invoke $counter
179f0 28 33 29 20 52 61 77 56 61 6c 75 65 5d 20 5c 6e  (3) RawValue] \n
17a00 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
17a10 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
17a20 6f 6c 6c 65 63 74 47 61 72 62 61 67 65 20 7b 20  ollectGarbage { 
17a30 63 68 61 6e 6e 65 6c 20 7b 6d 69 6c 6c 69 73 65  channel {millise
17a40 63 6f 6e 64 73 20 31 30 30 30 7d 20 7b 71 75 69  conds 1000} {qui
17a50 65 74 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20  et true} } {..  
17a60 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c      if {[haveSQL
17a70 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64  iteObjectCommand
17a80 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
17a90 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
17aa0 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
17ab0 74 20 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54  t invoke GC GetT
17ac0 6f 74 61 6c 4d 65 6d 6f 72 79 20 66 61 6c 73 65  otalMemory false
17ad0 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65 73 75  ..        } resu
17ae0 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  lt] == 0} then {
17af0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
17b00 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
17b10 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
17b20 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
17b30 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
17b40 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
17b50 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62   memory in use b
17b60 79 20 74 68 65 20 43 4c 52 20 62 65 66 6f 72 65  y the CLR before
17b70 20 63 6f 6c 6c 65 63 74 69 6f 6e 2e 2e 2e 20 22   collection... "
17b80 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
17b90 20 20 20 20 24 72 65 73 75 6c 74 20 22 20 62 79      $result " by
17ba0 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  tes\n"]..       
17bb0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
17bc0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
17bd0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
17be0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
17bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
17c00 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
17c10 6c 65 64 20 74 6f 20 67 65 74 20 43 4c 52 20 6d  led to get CLR m
17c20 65 6d 6f 72 79 20 75 73 61 67 65 2c 20 65 72 72  emory usage, err
17c30 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  or: " \..       
17c40 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73         \n\t $res
17c50 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ult \n]..       
17c60 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
17c70 20 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23       ###########
17c80 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
17c90 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
17ca0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
17cb0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
17cc0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
17cd0 20 23 20 4e 4f 54 45 3a 20 52 65 70 65 61 74 65   # NOTE: Repeate
17ce0 64 6c 79 20 61 74 74 65 6d 70 74 20 74 6f 20 63  dly attempt to c
17cf0 6f 6c 6c 65 63 74 20 67 61 72 62 61 67 65 20 75  ollect garbage u
17d00 6e 74 69 6c 20 74 68 65 20 61 6c 6c 6f 74 74 65  ntil the allotte
17d10 64 20 6e 75 6d 62 65 72 0d 0a 20 20 20 20 20 20  d number..      
17d20 23 20 20 20 20 20 20 20 6f 66 20 6d 69 6c 6c 69  #       of milli
17d30 73 65 63 6f 6e 64 73 20 68 61 73 20 65 6c 61 70  seconds has elap
17d40 73 65 64 2e 20 20 41 6c 77 61 79 73 20 61 74 74  sed.  Always att
17d50 65 6d 70 74 20 74 6f 20 63 6f 6c 6c 65 63 74 20  empt to collect 
17d60 67 61 72 62 61 67 65 0d 0a 20 20 20 20 20 20 23  garbage..      #
17d70 20 20 20 20 20 20 20 61 74 20 6c 65 61 73 74 20         at least 
17d80 6f 6e 63 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  once...      #..
17d90 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53        if {[haveS
17da0 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61  QLiteObjectComma
17db0 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  nd]} then {..   
17dc0 20 20 20 20 20 73 65 74 20 73 74 61 72 74 20 5b       set start [
17dd0 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 0d 0a  clock seconds]..
17de0 20 20 20 20 20 20 20 20 73 65 74 20 73 74 6f 70          set stop
17df0 20 5b 65 78 70 72 20 7b 24 73 74 61 72 74 20 2b   [expr {$start +
17e00 20 28 24 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20   ($milliseconds 
17e10 2f 20 31 30 30 30 29 7d 5d 0d 0a 0d 0a 20 20 20  / 1000)}]....   
17e20 20 20 20 20 20 64 6f 20 7b 0d 0a 20 20 20 20 20       do {..     
17e30 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
17e40 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
17e50 74 20 74 6f 20 66 6f 72 63 65 20 61 20 66 75 6c  t to force a ful
17e60 6c 20 67 61 72 62 61 67 65 20 63 6f 6c 6c 65 63  l garbage collec
17e70 74 69 6f 6e 20 6e 6f 77 2e 20 20 52 65 70 6f 72  tion now.  Repor
17e80 74 20 61 6e 79 0d 0a 20 20 20 20 20 20 20 20 20  t any..         
17e90 20 23 20 20 20 20 20 20 20 65 72 72 6f 72 20 74   #       error t
17ea0 68 61 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  hat is encounter
17eb0 65 64 20 69 66 20 77 65 20 66 61 69 6c 2e 0d 0a  ed if we fail...
17ec0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
17ed0 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
17ee0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
17ef0 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47   object invoke G
17f00 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79  C GetTotalMemory
17f10 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 20   true..         
17f20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20   } error]} then 
17f30 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
17f40 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
17f50 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
17f60 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
17f70 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
17f80 65 64 20 66 75 6c 6c 20 67 61 72 62 61 67 65 20  ed full garbage 
17f90 63 6f 6c 6c 65 63 74 69 6f 6e 2c 20 65 72 72 6f  collection, erro
17fa0 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  r: " \..        
17fb0 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 65 72          \n\t $er
17fc0 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ror \n]..       
17fd0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
17fe0 20 20 73 65 74 20 6e 6f 77 20 5b 63 6c 6f 63 6b    set now [clock
17ff0 20 73 65 63 6f 6e 64 73 5d 0d 0a 20 20 20 20 20   seconds]..     
18000 20 20 20 7d 20 77 68 69 6c 65 20 7b 24 73 74 61     } while {$sta
18010 72 74 20 3c 3d 20 24 6e 6f 77 20 26 26 20 24 6e  rt <= $now && $n
18020 6f 77 20 3c 20 24 73 74 6f 70 7d 0d 0a 20 20 20  ow < $stop}..   
18030 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 23     }....      ##
18040 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18050 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18060 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18070 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18080 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20  #######....     
18090 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65   if {[haveSQLite
180a0 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20  ObjectCommand]} 
180b0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
180c0 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
180d0 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
180e0 6e 76 6f 6b 65 20 47 43 20 47 65 74 54 6f 74 61  nvoke GC GetTota
180f0 6c 4d 65 6d 6f 72 79 20 66 61 6c 73 65 0d 0a 20  lMemory false.. 
18100 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d         } result]
18110 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
18120 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
18130 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
18140 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
18150 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
18160 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
18170 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6d 65          "---- me
18180 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 74  mory in use by t
18190 68 65 20 43 4c 52 20 61 66 74 65 72 20 63 6f 6c  he CLR after col
181a0 6c 65 63 74 69 6f 6e 2e 2e 2e 20 22 20 5c 0d 0a  lection... " \..
181b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181c0 24 72 65 73 75 6c 74 20 22 20 62 79 74 65 73 5c  $result " bytes\
181d0 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  n"]..          }
181e0 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
181f0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
18200 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
18210 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
18220 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
18230 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
18240 74 6f 20 67 65 74 20 43 4c 52 20 6d 65 6d 6f 72  to get CLR memor
18250 79 20 75 73 61 67 65 2c 20 65 72 72 6f 72 3a 20  y usage, error: 
18260 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
18270 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20     \n\t $result 
18280 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  \n]..        }..
18290 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
182a0 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 53  ...    proc getS
182b0 51 4c 69 74 65 48 61 6e 64 6c 65 43 6f 75 6e 74  QLiteHandleCount
182c0 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 71 75 69  s { channel {qui
182d0 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  et false} } {.. 
182e0 20 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20       set result 
182f0 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20  [list]....      
18300 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f  if {[haveSQLiteO
18310 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 20 26 26  bjectCommand] &&
18320 20 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74   [haveConstraint
18330 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
18340 20 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74    defineConstant
18350 2e 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  .System.Data.SQL
18360 69 74 65 2e 43 4f 55 4e 54 5f 48 41 4e 44 4c 45  ite.COUNT_HANDLE
18370 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
18380 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
18390 4e 4f 54 45 3a 20 41 64 64 20 65 61 63 68 20 63  NOTE: Add each c
183a0 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65 20 63  ritical handle c
183b0 6f 75 6e 74 20 74 6f 20 74 68 65 20 72 65 73 75  ount to the resu
183c0 6c 74 69 6e 67 20 6c 69 73 74 2e 0d 0a 20 20 20  lting list...   
183d0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
183e0 66 6f 72 65 61 63 68 20 6e 61 6d 65 20 5b 6c 69  foreach name [li
183f0 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 43 6f 75  st connectionCou
18400 6e 74 20 73 74 61 74 65 6d 65 6e 74 43 6f 75 6e  nt statementCoun
18410 74 20 62 61 63 6b 75 70 43 6f 75 6e 74 5d 20 7b  t backupCount] {
18420 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
18430 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
18440 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
18450 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
18460 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
18470 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
18480 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61  Data.SQLite.Unsa
18490 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20  feNativeMethods 
184a0 24 6e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20  $name..         
184b0 20 7d 20 76 61 6c 75 65 5d 20 3d 3d 20 30 7d 20   } value] == 0} 
184c0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
184d0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
184e0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
184f0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
18500 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
18510 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
18520 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 72 69         "---- cri
18530 74 69 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75  tical handle cou
18540 6e 74 20 5c 22 22 20 24 6e 61 6d 65 20 22 5c 22  nt \"" $name "\"
18550 20 69 73 20 22 20 24 76 61 6c 75 65 20 5c 6e 5d   is " $value \n]
18560 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
18570 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  ...            l
18580 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 24 76  append result $v
18590 61 6c 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20  alue..          
185a0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
185b0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
185c0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
185d0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
185e0 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
185f0 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74  G: failed to get
18600 20 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65   critical handle
18610 20 63 6f 75 6e 74 20 5c 22 22 20 5c 0d 0a 20 20   count \"" \..  
18620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 6e                $n
18630 61 6d 65 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20  ame "\", error: 
18640 22 20 5c 6e 5c 74 20 24 76 61 6c 75 65 20 5c 6e  " \n\t $value \n
18650 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
18660 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
18670 20 7d 20 65 6c 73 65 69 66 20 7b 21 24 71 75 69   } elseif {!$qui
18680 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
18690 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
186a0 20 4e 4f 54 45 3a 20 54 68 65 20 61 63 74 75 61   NOTE: The actua
186b0 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 73 20  l handle counts 
186c0 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  are not availabl
186d0 65 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 6a 75  e; therefore, ju
186e0 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  st..        #   
186f0 20 20 20 20 72 65 74 75 72 6e 20 61 6e 20 65 6d      return an em
18700 70 74 79 20 6c 69 73 74 2e 0d 0a 20 20 20 20 20  pty list...     
18710 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70     #..        tp
18720 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d  uts $channel "--
18730 2d 2d 20 63 72 69 74 69 63 61 6c 20 68 61 6e 64  -- critical hand
18740 6c 65 20 63 6f 75 6e 74 73 20 75 6e 61 76 61 69  le counts unavai
18750 6c 61 62 6c 65 5c 6e 22 0d 0a 20 20 20 20 20 20  lable\n"..      
18760 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
18770 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d  n $result..    }
18780 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 68  .....    proc sh
18790 75 74 64 6f 77 6e 53 51 4c 69 74 65 20 7b 20 63  utdownSQLite { c
187a0 68 61 6e 6e 65 6c 20 7b 66 6f 72 63 65 20 66 61  hannel {force fa
187b0 6c 73 65 7d 20 7b 71 75 69 65 74 20 66 61 6c 73  lse} {quiet fals
187c0 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e} } {..      #.
187d0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d  .      # NOTE: M
187e0 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 53 51  ake sure that SQ
187f0 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72  Lite core librar
18800 79 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20  y is completely 
18810 73 68 75 74 64 6f 77 6e 2e 20 20 54 68 69 73 0d  shutdown.  This.
18820 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69  .      #       i
18830 73 20 75 73 65 64 20 62 79 20 74 65 73 74 73 20  s used by tests 
18840 74 68 61 74 20 63 68 61 6e 67 65 20 63 6f 6e 66  that change conf
18850 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e  iguration option
18860 73 20 61 6e 64 2f 6f 72 20 74 68 6f 73 65 0d 0a  s and/or those..
18870 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
18880 61 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20  at need to make 
18890 73 75 72 65 20 6c 6f 67 67 69 6e 67 20 69 73 20  sure logging is 
188a0 69 6e 69 74 69 61 6c 69 7a 65 64 20 28 69 2e 65  initialized (i.e
188b0 2e 20 6a 75 73 74 20 69 6e 20 63 61 73 65 0d 0a  . just in case..
188c0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
188d0 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69  e SQLite core li
188e0 62 72 61 72 79 20 77 61 73 20 69 6e 69 74 69 61  brary was initia
188f0 6c 69 7a 65 64 20 69 6e 20 74 68 65 20 70 72 6f  lized in the pro
18900 63 65 73 73 20 70 72 69 6f 72 20 74 6f 0d 0a 20  cess prior to.. 
18910 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
18920 20 53 51 4c 69 74 65 4c 6f 67 20 63 6c 61 73 73   SQLiteLog class
18930 20 62 65 69 6e 67 20 61 62 6c 65 20 74 6f 20 73   being able to s
18940 65 74 75 70 20 69 74 73 20 6c 6f 67 67 69 6e 67  etup its logging
18950 20 63 61 6c 6c 62 61 63 6b 29 2e 0d 0a 20 20 20   callback)...   
18960 20 20 20 23 20 20 20 20 20 20 20 4e 6f 72 6d 61     #       Norma
18970 6c 6c 79 2c 20 74 68 69 73 20 73 68 6f 75 6c 64  lly, this should
18980 20 6f 6e 6c 79 20 62 65 20 70 65 72 66 6f 72 6d   only be perform
18990 65 64 20 69 66 20 53 51 4c 69 74 65 20 69 73 20  ed if SQLite is 
189a0 6c 6f 61 64 65 64 20 61 6e 64 0d 0a 20 20 20 20  loaded and..    
189b0 20 20 23 20 20 20 20 20 20 20 72 65 61 64 79 20    #       ready 
189c0 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 74  for use by the t
189d0 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20  est suite...    
189e0 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24    #..      if {$
189f0 66 6f 72 63 65 20 7c 7c 20 5b 69 73 53 51 4c 69  force || [isSQLi
18a00 74 65 52 65 61 64 79 5d 7d 20 74 68 65 6e 20 7b  teReady]} then {
18a10 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
18a20 20 20 20 20 20 23 20 42 55 47 46 49 58 3a 20 4d       # BUGFIX: M
18a30 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 61 6e  ake sure that an
18a40 79 20 22 6c 65 61 6b 65 64 22 20 74 72 61 6e 73  y "leaked" trans
18a50 61 63 74 69 6f 6e 73 20 61 6e 64 2f 6f 72 20 63  actions and/or c
18a60 6f 6e 6e 65 63 74 69 6f 6e 73 0d 0a 20 20 20 20  onnections..    
18a70 20 20 20 20 23 20 20 20 20 20 20 20 20 20 61 72      #         ar
18a80 65 20 63 6c 65 61 6e 65 64 20 75 70 20 62 65 66  e cleaned up bef
18a90 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 65 20  ore calling the 
18aa0 6e 61 74 69 76 65 20 73 68 75 74 64 6f 77 6e 20  native shutdown 
18ab0 66 75 6e 63 74 69 6f 6e 2e 0d 0a 20 20 20 20 20  function...     
18ac0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 66 6f     #..        fo
18ad0 72 65 61 63 68 20 74 72 61 6e 73 61 63 74 69 6f  reach transactio
18ae0 6e 20 5b 69 6e 66 6f 20 74 72 61 6e 73 61 63 74  n [info transact
18af0 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20  ions] {..       
18b00 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d     if {[string m
18b10 61 74 63 68 20 5c 0d 0a 20 20 20 20 20 20 20 20  atch \..        
18b20 20 20 20 20 20 20 53 79 73 74 65 6d 23 44 61 74        System#Dat
18b30 61 23 53 51 4c 69 74 65 23 53 51 4c 69 74 65 54  a#SQLite#SQLiteT
18b40 72 61 6e 73 61 63 74 69 6f 6e 23 2a 20 24 74 72  ransaction#* $tr
18b50 61 6e 73 61 63 74 69 6f 6e 5d 7d 20 74 68 65 6e  ansaction]} then
18b60 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
18b70 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
18b80 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 20              sql 
18b90 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c  transaction roll
18ba0 62 61 63 6b 20 24 74 72 61 6e 73 61 63 74 69 6f  back $transactio
18bb0 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  n..            }
18bc0 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d 20 74 68   error] == 0} th
18bd0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
18be0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
18bf0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
18c00 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
18c10 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
18c20 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
18c30 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
18c40 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6c 65 61   rolled back lea
18c50 6b 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ked transaction 
18c60 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
18c70 20 20 20 20 20 20 20 20 20 20 20 24 74 72 61 6e             $tran
18c80 73 61 63 74 69 6f 6e 20 5c 22 5c 6e 5d 0d 0a 20  saction \"\n].. 
18c90 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
18ca0 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
18cb0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
18cc0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
18cd0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
18ce0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
18cf0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
18d00 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
18d10 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
18d20 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
18d30 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6c 65 61   to rollback lea
18d40 6b 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ked transaction 
18d50 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
18d60 20 20 20 20 20 20 20 20 20 20 20 24 74 72 61 6e             $tran
18d70 73 61 63 74 69 6f 6e 20 22 5c 22 2c 20 65 72 72  saction "\", err
18d80 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f  or: " \n\t $erro
18d90 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  r \n]..         
18da0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
18db0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
18dc0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
18dd0 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  .        foreach
18de0 20 64 62 20 5b 69 6e 66 6f 20 63 6f 6e 6e 65 63   db [info connec
18df0 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20 20  tions] {..      
18e00 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
18e10 6d 61 74 63 68 20 5c 0d 0a 20 20 20 20 20 20 20  match \..       
18e20 20 20 20 20 20 20 20 53 79 73 74 65 6d 23 44 61         System#Da
18e30 74 61 23 53 51 4c 69 74 65 23 53 51 4c 69 74 65  ta#SQLite#SQLite
18e40 43 6f 6e 6e 65 63 74 69 6f 6e 23 2a 20 24 64 62  Connection#* $db
18e50 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
18e60 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
18e70 68 20 7b 73 71 6c 20 63 6c 6f 73 65 20 24 64 62  h {sql close $db
18e80 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d 20 74  } error] == 0} t
18e90 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
18ea0 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
18eb0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
18ec0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
18ed0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
18ee0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
18ef0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
18f00 2d 20 63 6c 6f 73 65 64 20 6c 65 61 6b 65 64 20  - closed leaked 
18f10 64 61 74 61 62 61 73 65 20 5c 22 22 20 24 64 62  database \"" $db
18f20 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20   \"\n]..        
18f30 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
18f40 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
18f50 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
18f60 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
18f70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18f80 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
18f90 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
18fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fb0 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
18fc0 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 63 6c 6f  G: failed to clo
18fd0 73 65 20 6c 65 61 6b 65 64 20 64 61 74 61 62 61  se leaked databa
18fe0 73 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  se \"" \..      
18ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 64                $d
19000 62 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20  b "\", error: " 
19010 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
19020 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
19030 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
19040 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
19050 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
19060 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
19070 42 55 47 46 49 58 3a 20 42 65 66 6f 72 65 20 63  BUGFIX: Before c
19080 61 6c 6c 69 6e 67 20 74 68 65 20 6e 61 74 69 76  alling the nativ
19090 65 20 73 68 75 74 64 6f 77 6e 20 66 75 6e 63 74  e shutdown funct
190a0 69 6f 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 62  ion, make sure b
190b0 6f 74 68 0d 0a 20 20 20 20 20 20 20 20 23 20 20  oth..        #  
190c0 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 50 52         of the PR
190d0 41 47 4d 41 20 72 65 6c 61 74 65 64 20 64 69 72  AGMA related dir
190e0 65 63 74 6f 72 79 20 6e 61 6d 65 73 20 61 72 65  ectory names are
190f0 20 66 72 65 65 64 2e 0d 0a 20 20 20 20 20 20 20   freed...       
19100 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63   #..        chec
19110 6b 46 6f 72 53 51 4c 69 74 65 44 69 72 65 63 74  kForSQLiteDirect
19120 6f 72 69 65 73 20 24 63 68 61 6e 6e 65 6c 20 74  ories $channel t
19130 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69  rue....        i
19140 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
19150 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
19160 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
19170 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
19180 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
19190 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66  ata.SQLite.Unsaf
191a0 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20 73  eNativeMethods s
191b0 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 0d  qlite3_shutdown.
191c0 0a 20 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c  .        } resul
191d0 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  t] == 0} then {.
191e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
191f0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
19200 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
19210 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
19220 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
19230 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
19240 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 73 68 75  call sqlite3_shu
19250 74 64 6f 77 6e 28 29 2e 2e 2e 20 6f 6b 3a 20 22  tdown()... ok: "
19260 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20   $result \n]..  
19270 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
19280 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
19290 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
192a0 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
192b0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
192c0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
192d0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
192e0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c        "---- call
192f0 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77   sqlite3_shutdow
19300 6e 28 29 2e 2e 2e 20 65 72 72 6f 72 3a 20 22 20  n()... error: " 
19310 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d  \n\t $result \n]
19320 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
19330 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
19340 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
19350 20 70 72 6f 63 20 72 65 70 6f 72 74 53 51 4c 69   proc reportSQLi
19360 74 65 52 65 73 6f 75 72 63 65 73 20 7b 0d 0a 20  teResources {.. 
19370 20 20 20 20 20 20 20 20 20 20 20 63 68 61 6e 6e             chann
19380 65 6c 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d  el {quiet false}
19390 20 7b 72 65 73 65 74 20 74 72 75 65 7d 20 7b 63   {reset true} {c
193a0 6f 6c 6c 65 63 74 20 74 72 75 65 7d 20 7d 20 7b  ollect true} } {
193b0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
193c0 20 23 20 4e 4f 54 45 3a 20 49 66 20 61 76 61 69   # NOTE: If avai
193d0 6c 61 62 6c 65 2c 20 72 65 70 6f 72 74 20 6f 6e  lable, report on
193e0 20 28 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 72   (and possibly r
193f0 65 73 65 74 29 20 74 68 65 20 72 75 6e 74 69 6d  eset) the runtim
19400 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
19410 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73   configuration s
19420 74 61 74 69 73 74 69 63 73 2e 0d 0a 20 20 20 20  tatistics...    
19430 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
19440 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74  haveSQLiteObject
19450 43 6f 6d 6d 61 6e 64 5d 20 26 26 20 5c 0d 0a 20  Command] && \.. 
19460 20 20 20 20 20 20 20 20 20 5b 68 61 76 65 43 6f           [haveCo
19470 6e 73 74 72 61 69 6e 74 20 62 75 69 6c 64 43 6f  nstraint buildCo
19480 6e 66 69 67 75 72 61 74 69 6f 6e 2e 44 65 62 75  nfiguration.Debu
19490 67 5d 20 26 26 20 5b 63 61 74 63 68 20 7b 0d 0a  g] && [catch {..
194a0 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
194b0 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
194c0 6e 50 75 62 6c 69 63 20 2d 61 6c 69 61 73 20 5c  nPublic -alias \
194d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79  ..            Sy
194e0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
194f0 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74  .UnsafeNativeMet
19500 68 6f 64 73 20 73 65 74 74 69 6e 67 52 65 61 64  hods settingRead
19510 43 6f 75 6e 74 73 0d 0a 20 20 20 20 20 20 7d 20  Counts..      } 
19520 73 65 74 74 69 6e 67 52 65 61 64 43 6f 75 6e 74  settingReadCount
19530 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  s] == 0} then {.
19540 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 61 6d  .        set nam
19550 65 43 6f 75 6e 74 20 5b 24 73 65 74 74 69 6e 67  eCount [$setting
19560 52 65 61 64 43 6f 75 6e 74 73 20 43 6f 75 6e 74  ReadCounts Count
19570 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 76  ]..        set v
19580 61 6c 75 65 43 6f 75 6e 74 20 30 0d 0a 0d 0a 20  alueCount 0.... 
19590 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f         object fo
195a0 72 65 61 63 68 20 2d 61 6c 69 61 73 20 70 61 69  reach -alias pai
195b0 72 20 24 73 65 74 74 69 6e 67 52 65 61 64 43 6f  r $settingReadCo
195c0 75 6e 74 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  unts {..        
195d0 20 20 69 6e 63 72 20 76 61 6c 75 65 43 6f 75 6e    incr valueCoun
195e0 74 20 5b 24 70 61 69 72 20 56 61 6c 75 65 5d 0d  t [$pair Value].
195f0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
19600 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
19610 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
19620 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
19630 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
19640 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
19650 2d 20 73 65 74 74 69 6e 67 20 5c 22 22 20 5b 24  - setting \"" [$
19660 70 61 69 72 20 4b 65 79 5d 20 22 5c 22 20 77 61  pair Key] "\" wa
19670 73 20 72 65 61 64 20 22 20 5c 0d 0a 20 20 20 20  s read " \..    
19680 20 20 20 20 20 20 20 20 20 20 20 20 5b 24 70 61              [$pa
19690 69 72 20 56 61 6c 75 65 5d 20 22 20 74 69 6d 65  ir Value] " time
196a0 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  s\n"]..         
196b0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
196c0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 72 65  .        if {$re
196d0 73 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  set} then {..   
196e0 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
196f0 68 20 7b 24 73 65 74 74 69 6e 67 52 65 61 64 43  h {$settingReadC
19700 6f 75 6e 74 73 20 43 6c 65 61 72 7d 20 65 72 72  ounts Clear} err
19710 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  or] == 0} then {
19720 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
19730 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
19740 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
19750 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
19760 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
19770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19780 20 22 2d 2d 2d 2d 20 72 65 73 65 74 20 73 65 74   "---- reset set
19790 74 69 6e 67 20 73 74 61 74 69 73 74 69 63 73 20  ting statistics 
197a0 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73  for the previous
197b0 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
197c0 20 20 20 20 20 20 20 20 24 6e 61 6d 65 43 6f 75          $nameCou
197d0 6e 74 20 22 20 6e 61 6d 65 73 20 61 6e 64 20 22  nt " names and "
197e0 20 24 76 61 6c 75 65 43 6f 75 6e 74 20 22 20 76   $valueCount " v
197f0 61 6c 75 65 73 20 72 65 61 64 5c 6e 22 5d 0d 0a  alues read\n"]..
19800 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
19810 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
19820 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
19830 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
19840 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
19850 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
19860 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
19870 65 64 20 74 6f 20 72 65 73 65 74 20 73 65 74 74  ed to reset sett
19880 69 6e 67 20 73 74 61 74 69 73 74 69 63 73 20 66  ing statistics f
19890 6f 72 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  or " \..        
198a0 20 20 20 20 20 20 20 20 22 74 68 65 20 70 72 65          "the pre
198b0 76 69 6f 75 73 20 22 20 24 6e 61 6d 65 43 6f 75  vious " $nameCou
198c0 6e 74 20 22 20 6e 61 6d 65 73 20 61 6e 64 20 22  nt " names and "
198d0 20 24 76 61 6c 75 65 43 6f 75 6e 74 20 5c 0d 0a   $valueCount \..
198e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198f0 22 20 76 61 6c 75 65 73 20 72 65 61 64 2c 20 65  " values read, e
19900 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72  rror: " \n\t $er
19910 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ror \n]..       
19920 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
19930 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
19940 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74    if {[haveSQLit
19950 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 20  eObjectCommand] 
19960 26 26 20 5b 68 61 76 65 43 6f 6e 73 74 72 61 69  && [haveConstrai
19970 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  nt \..          
19980 20 20 20 20 64 65 66 69 6e 65 43 6f 6e 73 74 61      defineConsta
19990 6e 74 2e 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  nt.System.Data.S
199a0 51 4c 69 74 65 2e 49 4e 54 45 52 4f 50 5f 56 49  QLite.INTEROP_VI
199b0 52 54 55 41 4c 5f 54 41 42 4c 45 5d 20 26 26 20  RTUAL_TABLE] && 
199c0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 68 61  \..          [ha
199d0 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5c 0d 0a  veConstraint \..
199e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65                de
199f0 66 69 6e 65 43 6f 6e 73 74 61 6e 74 2e 53 79 73  fineConstant.Sys
19a00 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
19a10 54 52 41 43 4b 5f 4d 45 4d 4f 52 59 5f 42 59 54  TRACK_MEMORY_BYT
19a20 45 53 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ES]} then {..   
19a30 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
19a40 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
19a50 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
19a60 65 6c 20 22 2d 2d 2d 2d 20 63 75 72 72 65 6e 74  el "---- current
19a70 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62   memory in use b
19a80 79 20 53 51 4c 69 74 65 4d 65 6d 6f 72 79 2e 2e  y SQLiteMemory..
19a90 2e 20 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  . "..        }..
19aa0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
19ab0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
19ac0 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
19ad0 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
19ae0 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
19af0 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
19b00 51 4c 69 74 65 2e 53 51 4c 69 74 65 4d 65 6d 6f  QLite.SQLiteMemo
19b10 72 79 20 62 79 74 65 73 41 6c 6c 6f 63 61 74 65  ry bytesAllocate
19b20 64 0d 0a 20 20 20 20 20 20 20 20 7d 20 6d 65 6d  d..        } mem
19b30 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ory] == 0} then 
19b40 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
19b50 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
19b60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
19b70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
19b80 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79  pendArgs $memory
19b90 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20   " bytes\n"]..  
19ba0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
19bb0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
19bc0 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72         set memor
19bd0 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20  y unknown....   
19be0 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
19bf0 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
19c00 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
19c10 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
19c20 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a  gs $memory \n]..
19c30 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
19c40 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
19c50 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
19c60 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
19c70 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
19c80 22 2d 2d 2d 2d 20 6d 61 78 69 6d 75 6d 20 6d 65  "---- maximum me
19c90 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 53  mory in use by S
19ca0 51 4c 69 74 65 4d 65 6d 6f 72 79 2e 2e 2e 20 22  QLiteMemory... "
19cb0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
19cc0 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
19cd0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f  h {..          o
19ce0 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
19cf0 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
19d00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19d10 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
19d20 74 65 2e 53 51 4c 69 74 65 4d 65 6d 6f 72 79 20  te.SQLiteMemory 
19d30 6d 61 78 69 6d 75 6d 42 79 74 65 73 41 6c 6c 6f  maximumBytesAllo
19d40 63 61 74 65 64 0d 0a 20 20 20 20 20 20 20 20 7d  cated..        }
19d50 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74   memory] == 0} t
19d60 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
19d70 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
19d80 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
19d90 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
19da0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65   [appendArgs $me
19db0 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e 22 5d  mory " bytes\n"]
19dc0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
19dd0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
19de0 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6d  .          set m
19df0 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d  emory unknown...
19e00 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
19e10 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
19e20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
19e30 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
19e40 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c  ndArgs $memory \
19e50 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
19e60 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
19e70 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
19e80 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
19e90 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
19ea0 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63  $channel "---- c
19eb0 75 72 72 65 6e 74 20 6d 65 6d 6f 72 79 20 69 6e  urrent memory in
19ec0 20 75 73 65 20 62 79 20 53 51 4c 69 74 65 2e 2e   use by SQLite..
19ed0 2e 20 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  . "..      }....
19ee0 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53        if {[haveS
19ef0 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61  QLiteObjectComma
19f00 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  nd]} then {..   
19f10 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
19f20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a  {..          obj
19f30 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
19f40 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
19f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
19f60 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
19f70 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74  .UnsafeNativeMet
19f80 68 6f 64 73 20 73 71 6c 69 74 65 33 5f 6d 65 6d  hods sqlite3_mem
19f90 6f 72 79 5f 75 73 65 64 0d 0a 20 20 20 20 20 20  ory_used..      
19fa0 20 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30    } memory] == 0
19fb0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
19fc0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
19fd0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
19fe0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
19ff0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1a000 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c  $memory " bytes\
1a010 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  n"]..          }
1a020 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
1a030 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
1a040 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
1a050 45 3a 20 4d 61 79 62 65 20 74 68 65 20 53 51 4c  E: Maybe the SQL
1a060 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79  ite core library
1a070 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 3f   is unavailable?
1a080 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
1a090 20 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d           set mem
1a0a0 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20  ory unknown.... 
1a0b0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
1a0c0 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
1a0d0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1a0e0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
1a0f0 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d  Args $memory \n]
1a100 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1a110 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1a120 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
1a130 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 61    set memory una
1a140 76 61 69 6c 61 62 6c 65 0d 0a 0d 0a 20 20 20 20  vailable....    
1a150 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
1a160 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1a170 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1a180 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
1a190 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20  emory \n]..     
1a1a0 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
1a1b0 0a 20 20 20 20 20 20 73 65 74 20 72 65 73 75 6c  .      set resul
1a1c0 74 20 24 6d 65 6d 6f 72 79 3b 20 23 20 4e 4f 54  t $memory; # NOT
1a1d0 45 3a 20 52 65 74 75 72 6e 20 6d 65 6d 6f 72 79  E: Return memory
1a1e0 20 69 6e 2d 75 73 65 20 74 6f 20 6f 75 72 20 63   in-use to our c
1a1f0 61 6c 6c 65 72 2e 0d 0a 0d 0a 20 20 20 20 20 20  aller.....      
1a200 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
1a210 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  n {..        tpu
1a220 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  ts $channel "---
1a230 2d 20 6d 61 78 69 6d 75 6d 20 6d 65 6d 6f 72 79  - maximum memory
1a240 20 69 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74   in use by SQLit
1a250 65 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 7d 0d  e... "..      }.
1a260 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61  ...      if {[ha
1a270 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f  veSQLiteObjectCo
1a280 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a  mmand]} then {..
1a290 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
1a2a0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
1a2b0 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
1a2c0 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
1a2d0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1a2e0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
1a2f0 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65  ite.UnsafeNative
1a300 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20  Methods \..     
1a310 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1a320 5f 6d 65 6d 6f 72 79 5f 68 69 67 68 77 61 74 65  _memory_highwate
1a330 72 20 30 0d 0a 20 20 20 20 20 20 20 20 7d 20 6d  r 0..        } m
1a340 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65  emory] == 0} the
1a350 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
1a360 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
1a370 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1a380 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
1a390 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f  appendArgs $memo
1a3a0 72 79 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a  ry " bytes\n"]..
1a3b0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1a3c0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1a3d0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1a3e0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61        # NOTE: Ma
1a3f0 79 62 65 20 74 68 65 20 53 51 4c 69 74 65 20 63  ybe the SQLite c
1a400 6f 72 65 20 6c 69 62 72 61 72 79 20 69 73 20 75  ore library is u
1a410 6e 61 76 61 69 6c 61 62 6c 65 3f 0d 0a 20 20 20  navailable?..   
1a420 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1a430 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75      set memory u
1a440 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20  nknown....      
1a450 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
1a460 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1a470 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1a480 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1a490 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20  $memory \n]..   
1a4a0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1a4b0 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73    }..      } els
1a4c0 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  e {..        set
1a4d0 20 6d 65 6d 6f 72 79 20 75 6e 61 76 61 69 6c 61   memory unavaila
1a4e0 62 6c 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69  ble....        i
1a4f0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
1a500 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
1a510 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
1a520 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79  pendArgs $memory
1a530 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d   \n]..        }.
1a540 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
1a550 20 20 69 66 20 7b 24 63 6f 6c 6c 65 63 74 7d 20    if {$collect} 
1a560 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1a570 63 6f 6c 6c 65 63 74 47 61 72 62 61 67 65 20 24  collectGarbage $
1a580 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20 20 7d  channel..      }
1a590 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24  ....      if {!$
1a5a0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
1a5b0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1a5c0 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 75 72 72  annel "---- curr
1a5d0 65 6e 74 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73  ent memory in us
1a5e0 65 20 62 79 20 74 68 65 20 43 4c 52 2e 2e 2e 20  e by the CLR... 
1a5f0 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  "..      }....  
1a600 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c      if {[haveSQL
1a610 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64  iteObjectCommand
1a620 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1a630 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
1a640 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
1a650 74 20 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54  t invoke GC GetT
1a660 6f 74 61 6c 4d 65 6d 6f 72 79 20 66 61 6c 73 65  otalMemory false
1a670 0d 0a 20 20 20 20 20 20 20 20 7d 20 6d 65 6d 6f  ..        } memo
1a680 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  ry] == 0} then {
1a690 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
1a6a0 5b 73 74 72 69 6e 67 20 69 73 20 69 6e 74 65 67  [string is integ
1a6b0 65 72 20 2d 73 74 72 69 63 74 20 24 6d 65 6d 6f  er -strict $memo
1a6c0 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ry]} then {..   
1a6d0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
1a6e0 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
1a6f0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1a700 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1a710 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22  ndArgs $memory "
1a720 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20   bytes\n"]..    
1a730 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1a740 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1a750 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6d             set m
1a760 65 6d 6f 72 79 20 69 6e 76 61 6c 69 64 0d 0a 0d  emory invalid...
1a770 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
1a780 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
1a790 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1a7a0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
1a7b0 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f  appendArgs $memo
1a7c0 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ry \n]..        
1a7d0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1a7e0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c   }..        } el
1a7f0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
1a800 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f  set memory unkno
1a810 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  wn....          
1a820 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
1a830 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1a840 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1a850 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d  [appendArgs $mem
1a860 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ory \n]..       
1a870 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
1a880 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
1a890 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d  .        set mem
1a8a0 6f 72 79 20 75 6e 61 76 61 69 6c 61 62 6c 65 0d  ory unavailable.
1a8b0 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
1a8c0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
1a8d0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1a8e0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
1a8f0 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d  Args $memory \n]
1a900 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
1a910 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
1a920 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20  turn $result..  
1a930 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
1a940 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44   checkForSQLiteD
1a950 69 72 65 63 74 6f 72 69 65 73 20 7b 20 63 68 61  irectories { cha
1a960 6e 6e 65 6c 20 7b 72 65 73 65 74 20 66 61 6c 73  nnel {reset fals
1a970 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e} } {..      #.
1a980 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43  .      # NOTE: C
1a990 68 65 63 6b 20 69 66 20 74 68 65 20 73 71 6c 69  heck if the sqli
1a9a0 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69  te3_win32_set_di
1a9b0 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e  rectory function
1a9c0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a   is available...
1a9d0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 74        #..      t
1a9e0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5c 0d  puts $channel \.
1a9f0 0a 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d  .          "----
1aa00 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 66 75   checking for fu
1aa10 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 5f 77  nction sqlite3_w
1aa20 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
1aa30 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  ry... "....     
1aa40 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
1aa50 3a 20 54 68 69 73 20 63 61 6c 6c 20 74 6f 20 74  : This call to t
1aa60 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  he sqlite3_win32
1aa70 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66  _set_directory f
1aa80 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 74 68 65  unction uses the
1aa90 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1aaa0 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 20 30 20  invalid value 0 
1aab0 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 61 72  for the first ar
1aac0 67 75 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f  gument.  This co
1aad0 64 65 20 69 73 20 64 65 73 69 67 6e 65 64 0d 0a  de is designed..
1aae0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f        #       to
1aaf0 20 63 68 65 63 6b 20 69 66 20 63 61 6c 6c 69 6e   check if callin
1ab00 67 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 77  g the function w
1ab10 69 6c 6c 20 72 61 69 73 65 20 61 6e 20 65 78 63  ill raise an exc
1ab20 65 70 74 69 6f 6e 20 28 69 2e 65 2e 0d 0a 20 20  eption (i.e...  
1ab30 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
1ab40 61 63 74 75 61 6c 20 72 65 73 75 6c 74 20 6f 66  actual result of
1ab50 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f   the function do
1ab60 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 20 61 73  es not matter as
1ab70 20 6c 6f 6e 67 20 61 73 20 6e 6f 0d 0a 20 20 20   long as no..   
1ab80 20 20 20 23 20 20 20 20 20 20 20 64 69 72 65 63     #       direc
1ab90 74 6f 72 79 20 69 73 20 63 68 61 6e 67 65 64 29  tory is changed)
1aba0 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
1abb0 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
1abc0 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
1abd0 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
1abe0 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
1abf0 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
1ac00 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65  ta.SQLite.Unsafe
1ac10 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d  NativeMethods \.
1ac20 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1ac30 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
1ac40 69 72 65 63 74 6f 72 79 20 30 20 6e 75 6c 6c 0d  irectory 0 null.
1ac50 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20  .      }] == 0} 
1ac60 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1ac70 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
1ac80 45 3a 20 43 61 6c 6c 69 6e 67 20 74 68 65 20 73  E: Calling the s
1ac90 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
1aca0 5f 64 69 72 65 63 74 6f 72 79 20 66 75 6e 63 74  _directory funct
1acb0 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 0d 0a 20 20  ion does not..  
1acc0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61        #       ca
1acd0 75 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e  use an exception
1ace0 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 69 74 20  ; therefore, it 
1acf0 6d 75 73 74 20 62 65 20 61 76 61 69 6c 61 62 6c  must be availabl
1ad00 65 20 28 69 2e 65 2e 0d 0a 20 20 20 20 20 20 20  e (i.e...       
1ad10 20 23 20 20 20 20 20 20 20 65 76 65 6e 20 74 68   #       even th
1ad20 6f 75 67 68 20 69 74 20 73 68 6f 75 6c 64 20 72  ough it should r
1ad30 65 74 75 72 6e 20 61 20 66 61 69 6c 75 72 65 20  eturn a failure 
1ad40 72 65 74 75 72 6e 20 63 6f 64 65 20 69 6e 20 74  return code in t
1ad50 68 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20  his..        #  
1ad60 20 20 20 20 20 63 61 73 65 29 2e 0d 0a 20 20 20       case)...   
1ad70 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1ad80 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 73 71  addConstraint sq
1ad90 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f  lite3_win32_set_
1ada0 64 69 72 65 63 74 6f 72 79 0d 0a 0d 0a 20 20 20  directory....   
1adb0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1adc0 6e 65 6c 20 79 65 73 5c 6e 0d 0a 0d 0a 20 20 20  nel yes\n....   
1add0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1ade0 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20 6f 75 72  # NOTE: Does our
1adf0 20 63 61 6c 6c 65 72 20 77 61 6e 74 20 74 6f 20   caller want to 
1ae00 72 65 73 65 74 20 74 68 65 20 64 69 72 65 63 74  reset the direct
1ae10 6f 72 69 65 73 3f 0d 0a 20 20 20 20 20 20 20 20  ories?..        
1ae20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24  #..        if {$
1ae30 72 65 73 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  reset} then {.. 
1ae40 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1ae50 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f        # NOTE: No
1ae60 77 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  w make sure the 
1ae70 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 65 6d  database and tem
1ae80 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 69  porary directori
1ae90 65 73 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20  es are..        
1aea0 20 20 23 20 20 20 20 20 20 20 72 65 73 65 74 20    #       reset 
1aeb0 74 68 65 69 72 20 64 65 66 61 75 6c 74 20 76 61  their default va
1aec0 6c 75 65 73 2c 20 77 68 69 63 68 20 73 68 6f 75  lues, which shou
1aed0 6c 64 20 62 65 20 6e 75 6c 6c 20 66 6f 72 20 62  ld be null for b
1aee0 6f 74 68 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  oth...          
1aef0 23 20 20 20 20 20 20 20 53 69 6e 63 65 20 74 68  #       Since th
1af00 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  e sqlite3_win32_
1af10 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66 75  set_directory fu
1af20 6e 63 74 69 6f 6e 20 69 73 20 61 76 61 69 6c 61  nction is availa
1af30 62 6c 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ble,..          
1af40 23 20 20 20 20 20 20 20 75 73 65 20 69 74 2e 0d  #       use it..
1af50 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
1af60 20 20 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74          for {set
1af70 20 69 6e 64 65 78 20 31 7d 20 7b 24 69 6e 64 65   index 1} {$inde
1af80 78 20 3c 20 33 7d 20 7b 69 6e 63 72 20 69 6e 64  x < 3} {incr ind
1af90 65 78 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  ex} {..         
1afa0 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
1afb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  .              o
1afc0 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
1afd0 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
1afe0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1aff0 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
1b000 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74  SQLite.UnsafeNat
1b010 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20  iveMethods \..  
1b020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b030 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
1b040 74 5f 64 69 72 65 63 74 6f 72 79 20 24 69 6e 64  t_directory $ind
1b050 65 78 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20  ex null..       
1b060 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d       } result] =
1b070 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
1b080 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1b090 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
1b0a0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1b0b0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
1b0c0 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 77 69   call sqlite3_wi
1b0d0 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
1b0e0 79 28 22 20 24 69 6e 64 65 78 20 5c 0d 0a 20 20  y(" $index \..  
1b0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b100 22 2c 20 6e 75 6c 6c 29 2e 2e 2e 20 6f 6b 3a 20  ", null)... ok: 
1b110 22 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20  " $result \n].. 
1b120 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
1b130 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
1b140 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1b150 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1b160 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b170 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71     "---- call sq
1b180 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f  lite3_win32_set_
1b190 64 69 72 65 63 74 6f 72 79 28 22 20 24 69 6e 64  directory(" $ind
1b1a0 65 78 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ex \..          
1b1b0 20 20 20 20 20 20 20 20 22 2c 20 6e 75 6c 6c 29          ", null)
1b1c0 2e 2e 2e 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  ... error: " \n\
1b1d0 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20  t $result \n].. 
1b1e0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
1b1f0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1b200 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
1b210 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  se {..        tp
1b220 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c  uts $channel no\
1b230 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n....        #..
1b240 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1b250 44 6f 65 73 20 6f 75 72 20 63 61 6c 6c 65 72 20  Does our caller 
1b260 77 61 6e 74 20 74 6f 20 72 65 73 65 74 20 74 68  want to reset th
1b270 65 20 64 69 72 65 63 74 6f 72 69 65 73 3f 20 20  e directories?  
1b280 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 0d 0a 20  This can only.. 
1b290 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62         #       b
1b2a0 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20 53  e performed if S
1b2b0 51 4c 69 74 65 20 69 73 20 6c 6f 61 64 65 64 20  QLite is loaded 
1b2c0 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20 75 73  and ready for us
1b2d0 65 20 62 79 20 74 68 65 20 74 65 73 74 0d 0a 20  e by the test.. 
1b2e0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73         #       s
1b2f0 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  uite...        #
1b300 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 72  ..        if {$r
1b310 65 73 65 74 20 26 26 20 5b 69 73 53 51 4c 69 74  eset && [isSQLit
1b320 65 52 65 61 64 79 5d 7d 20 74 68 65 6e 20 7b 0d  eReady]} then {.
1b330 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
1b340 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1b350 4e 6f 77 20 6d 61 6b 65 20 73 75 72 65 20 74 68  Now make sure th
1b360 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  e database and t
1b370 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f  emporary directo
1b380 72 69 65 73 20 61 72 65 0d 0a 20 20 20 20 20 20  ries are..      
1b390 20 20 20 20 23 20 20 20 20 20 20 20 72 65 73 65      #       rese
1b3a0 74 20 74 68 65 69 72 20 64 65 66 61 75 6c 74 20  t their default 
1b3b0 76 61 6c 75 65 73 2c 20 77 68 69 63 68 20 73 68  values, which sh
1b3c0 6f 75 6c 64 20 62 65 20 6e 75 6c 6c 20 66 6f 72  ould be null for
1b3d0 20 62 6f 74 68 2e 0d 0a 20 20 20 20 20 20 20 20   both...        
1b3e0 20 20 23 20 20 20 20 20 20 20 53 69 6e 63 65 20    #       Since 
1b3f0 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  the sqlite3_win3
1b400 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20  2_set_directory 
1b410 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
1b420 74 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  t..          #  
1b430 20 20 20 20 20 61 70 70 65 61 72 20 74 6f 20 62       appear to b
1b440 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 75 73 65  e available, use
1b450 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
1b460 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 73 0d  PRAGMA commands.
1b470 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
1b480 20 20 20 69 6e 73 74 65 61 64 2e 0d 0a 20 20 20     instead...   
1b490 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1b4a0 20 20 20 20 66 6f 72 65 61 63 68 20 64 69 72 65      foreach dire
1b4b0 63 74 6f 72 79 20 5b 6c 69 73 74 20 64 61 74 61  ctory [list data
1b4c0 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79  _store_directory
1b4d0 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65   temp_store_dire
1b4e0 63 74 6f 72 79 5d 20 7b 0d 0a 20 20 20 20 20 20  ctory] {..      
1b4f0 20 20 20 20 20 20 73 65 74 20 73 71 6c 20 5b 61        set sql [a
1b500 70 70 65 6e 64 41 72 67 73 20 22 50 52 41 47 4d  ppendArgs "PRAGM
1b510 41 20 22 20 24 64 69 72 65 63 74 6f 72 79 20 22  A " $directory "
1b520 20 3d 20 5c 22 5c 22 3b 22 5d 0d 0a 0d 0a 20 20   = \"\";"]....  
1b530 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63            if {[c
1b540 61 74 63 68 20 7b 65 78 65 63 75 74 65 53 71 6c  atch {executeSql
1b550 20 24 73 71 6c 7d 20 72 65 73 75 6c 74 5d 20 3d   $sql} result] =
1b560 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
1b570 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1b580 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
1b590 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1b5a0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
1b5b0 20 65 78 65 63 75 74 65 20 50 52 41 47 4d 41 20   execute PRAGMA 
1b5c0 22 20 24 64 69 72 65 63 74 6f 72 79 20 22 2e 2e  " $directory "..
1b5d0 2e 20 6f 6b 3a 20 5c 22 22 20 5c 0d 0a 20 20 20  . ok: \"" \..   
1b5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
1b5f0 72 65 73 75 6c 74 20 5c 22 5c 6e 5d 0d 0a 20 20  result \"\n]..  
1b600 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
1b610 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1b620 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1b630 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1b640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b650 20 20 22 2d 2d 2d 2d 20 65 78 65 63 75 74 65 20    "---- execute 
1b660 50 52 41 47 4d 41 20 22 20 24 64 69 72 65 63 74  PRAGMA " $direct
1b670 6f 72 79 20 22 2e 2e 2e 20 65 72 72 6f 72 3a 20  ory "... error: 
1b680 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
1b690 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73         \n\t $res
1b6a0 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ult \n]..       
1b6b0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1b6c0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
1b6d0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1b6e0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
1b6f0 3a 20 46 69 6e 61 6c 6c 79 2c 20 73 68 6f 77 20  : Finally, show 
1b700 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
1b710 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1b720 65 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 0d  e and temporary.
1b730 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64  .      #       d
1b740 69 72 65 63 74 6f 72 69 65 73 2e 20 20 54 68 69  irectories.  Thi
1b750 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 70 65  s can only be pe
1b760 72 66 6f 72 6d 65 64 20 69 66 20 53 51 4c 69 74  rformed if SQLit
1b770 65 20 69 73 20 6c 6f 61 64 65 64 0d 0a 20 20 20  e is loaded..   
1b780 20 20 20 23 20 20 20 20 20 20 20 61 6e 64 20 72     #       and r
1b790 65 61 64 79 20 66 6f 72 20 75 73 65 20 62 79 20  eady for use by 
1b7a0 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d  the test suite..
1b7b0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1b7c0 69 66 20 7b 5b 69 73 53 51 4c 69 74 65 52 65 61  if {[isSQLiteRea
1b7d0 64 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  dy]} then {..   
1b7e0 20 20 20 20 20 66 6f 72 65 61 63 68 20 64 69 72       foreach dir
1b7f0 65 63 74 6f 72 79 20 5b 6c 69 73 74 20 64 61 74  ectory [list dat
1b800 61 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72  a_store_director
1b810 79 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72  y temp_store_dir
1b820 65 63 74 6f 72 79 5d 20 7b 0d 0a 20 20 20 20 20  ectory] {..     
1b830 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1b840 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1b850 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 22  "---- checking "
1b860 20 24 64 69 72 65 63 74 6f 72 79 20 22 2e 2e 2e   $directory "...
1b870 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20   "]....         
1b880 20 73 65 74 20 73 71 6c 20 5b 61 70 70 65 6e 64   set sql [append
1b890 41 72 67 73 20 22 50 52 41 47 4d 41 20 22 20 24  Args "PRAGMA " $
1b8a0 64 69 72 65 63 74 6f 72 79 20 5c 3b 5d 0d 0a 0d  directory \;]...
1b8b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
1b8c0 63 61 74 63 68 20 7b 65 78 65 63 75 74 65 53 71  catch {executeSq
1b8d0 6c 20 24 73 71 6c 20 73 63 61 6c 61 72 7d 20 72  l $sql scalar} r
1b8e0 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65  esult] == 0} the
1b8f0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1b900 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1b910 5b 61 70 70 65 6e 64 41 72 67 73 20 22 6f 6b 3a  [appendArgs "ok:
1b920 20 5c 22 22 20 24 72 65 73 75 6c 74 20 5c 22 5c   \"" $result \"\
1b930 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  n]..          } 
1b940 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
1b950 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
1b960 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  el [appendArgs "
1b970 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72  error: " \n\t $r
1b980 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20  esult \n]..     
1b990 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1b9a0 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
1b9b0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 6c  }.....    proc l
1b9c0 6f 61 64 53 51 4c 69 74 65 54 65 73 74 53 65 74  oadSQLiteTestSet
1b9d0 74 69 6e 67 73 20 7b 20 63 68 61 6e 6e 65 6c 20  tings { channel 
1b9e0 7b 73 75 66 66 69 78 20 22 22 7d 20 7b 71 75 69  {suffix ""} {qui
1b9f0 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  et false} } {.. 
1ba00 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
1ba10 4e 4f 54 45 3a 20 53 6b 69 70 20 6c 6f 61 64 69  NOTE: Skip loadi
1ba20 6e 67 20 74 68 65 20 73 65 74 74 69 6e 67 73 20  ng the settings 
1ba30 69 66 20 74 68 65 69 72 20 75 73 61 67 65 20 68  if their usage h
1ba40 61 73 20 62 65 65 6e 20 64 69 73 61 62 6c 65 64  as been disabled
1ba50 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
1ba60 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
1ba70 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 54  sts ::no(sqliteT
1ba80 65 73 74 53 65 74 74 69 6e 67 73 29 5d 7d 20 74  estSettings)]} t
1ba90 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
1baa0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1bab0 3a 20 4c 6f 61 64 20 63 75 73 74 6f 6d 20 70 65  : Load custom pe
1bac0 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20 70 65  r-user and/or pe
1bad0 72 2d 68 6f 73 74 20 74 65 73 74 20 73 65 74 74  r-host test sett
1bae0 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  ings now...     
1baf0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
1bb00 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
1bb10 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 75 73  :tcl_platform(us
1bb20 65 72 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  er)]} then {..  
1bb30 20 20 20 20 20 20 20 20 73 65 74 20 75 73 65 72          set user
1bb40 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65  SettingsFileName
1bb50 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74   [file join [get
1bb60 43 6f 6d 6d 6f 6e 44 69 72 65 63 74 6f 72 79 5d  CommonDirectory]
1bb70 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1bb80 20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 73 65    [appendArgs se
1bb90 74 74 69 6e 67 73 20 24 73 75 66 66 69 78 20 2e  ttings $suffix .
1bba0 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d   $::tcl_platform
1bbb0 28 75 73 65 72 29 20 2e 65 61 67 6c 65 5d 5d 0d  (user) .eagle]].
1bbc0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
1bbd0 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 75  {[file exists $u
1bbe0 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e  serSettingsFileN
1bbf0 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
1bc00 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
1bc10 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
1bc20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
1bc30 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
1bc40 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1bc50 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
1bc60 2d 2d 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d 75  -- loading per-u
1bc70 73 65 72 20 74 65 73 74 20 73 65 74 74 69 6e 67  ser test setting
1bc80 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20  s file \"" \..  
1bc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bca0 24 75 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c  $userSettingsFil
1bcb0 65 4e 61 6d 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a  eName \"...\n]..
1bcc0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
1bcd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
1bce0 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
1bcf0 20 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c           uplevel
1bd00 20 31 20 5b 6c 69 73 74 20 73 6f 75 72 63 65 20   1 [list source 
1bd10 24 75 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c  $userSettingsFil
1bd20 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20  eName]..        
1bd30 20 20 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68      } error]} th
1bd40 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1bd50 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
1bd60 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1bd70 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1bd80 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1bd90 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1bda0 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
1bdb0 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
1bdc0 20 74 6f 20 6c 6f 61 64 20 70 65 72 2d 75 73 65   to load per-use
1bdd0 72 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20  r settings file 
1bde0 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
1bdf0 20 20 20 20 20 20 20 20 20 20 20 24 75 73 65 72             $user
1be00 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65  SettingsFileName
1be10 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c   "\", error: " \
1be20 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a  n\t $error \n]..
1be30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
1be40 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
1be50 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
1be60 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1be70 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
1be80 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1be90 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1bea0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1beb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1bec0 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64     "---- skipped
1bed0 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d 75 73 65   loading per-use
1bee0 72 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20  r test settings 
1bef0 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20  file \"" \..    
1bf00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 75                $u
1bf10 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e  serSettingsFileN
1bf20 61 6d 65 20 22 5c 22 2c 20 69 74 20 64 6f 65 73  ame "\", it does
1bf30 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a   not exist\n"]..
1bf40 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1bf50 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1bf60 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1bf70 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
1bf80 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1bf90 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1bfa0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1bfb0 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20  ########....    
1bfc0 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
1bfd0 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66  ists ::tcl_platf
1bfe0 6f 72 6d 28 68 6f 73 74 29 5d 7d 20 74 68 65 6e  orm(host)]} then
1bff0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
1c000 74 20 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69  t hostSettingsFi
1c010 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  leName [file joi
1c020 6e 20 5b 67 65 74 43 6f 6d 6d 6f 6e 44 69 72 65  n [getCommonDire
1c030 63 74 6f 72 79 5d 20 5c 0d 0a 20 20 20 20 20 20  ctory] \..      
1c040 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41          [appendA
1c050 72 67 73 20 73 65 74 74 69 6e 67 73 20 24 73 75  rgs settings $su
1c060 66 66 69 78 20 2e 20 24 3a 3a 74 63 6c 5f 70 6c  ffix . $::tcl_pl
1c070 61 74 66 6f 72 6d 28 68 6f 73 74 29 20 2e 65 61  atform(host) .ea
1c080 67 6c 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  gle]]....       
1c090 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69     if {[file exi
1c0a0 73 74 73 20 24 68 6f 73 74 53 65 74 74 69 6e 67  sts $hostSetting
1c0b0 73 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  sFileName]} then
1c0c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1c0d0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
1c0e0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1c0f0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1c100 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1c110 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c120 20 20 20 22 2d 2d 2d 2d 20 6c 6f 61 64 69 6e 67     "---- loading
1c130 20 70 65 72 2d 68 6f 73 74 20 74 65 73 74 20 73   per-host test s
1c140 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22  ettings file \""
1c150 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1c160 20 20 20 20 20 20 24 68 6f 73 74 53 65 74 74 69        $hostSetti
1c170 6e 67 73 46 69 6c 65 4e 61 6d 65 20 5c 22 2e 2e  ngsFileName \"..
1c180 2e 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  .\n]..          
1c190 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
1c1a0 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
1c1b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75  .              u
1c1c0 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 73  plevel 1 [list s
1c1d0 6f 75 72 63 65 20 24 68 6f 73 74 53 65 74 74 69  ource $hostSetti
1c1e0 6e 67 73 46 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20  ngsFileName]..  
1c1f0 20 20 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f            } erro
1c200 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  r]} then {..    
1c210 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
1c220 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
1c230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
1c240 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
1c250 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
1c260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c270 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
1c280 66 61 69 6c 65 64 20 74 6f 20 6c 6f 61 64 20 70  failed to load p
1c290 65 72 2d 68 6f 73 74 20 73 65 74 74 69 6e 67 73  er-host settings
1c2a0 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20   file \"" \..   
1c2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c2c0 20 24 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69   $hostSettingsFi
1c2d0 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 65 72 72 6f  leName "\", erro
1c2e0 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72  r: " \n\t $error
1c2f0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
1c300 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1c310 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
1c320 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
1c330 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
1c340 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
1c350 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1c360 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1c370 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1c380 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
1c390 6b 69 70 70 65 64 20 6c 6f 61 64 69 6e 67 20 70  kipped loading p
1c3a0 65 72 2d 68 6f 73 74 20 74 65 73 74 20 73 65 74  er-host test set
1c3b0 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c  tings file \"" \
1c3c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c3d0 20 20 20 20 24 68 6f 73 74 53 65 74 74 69 6e 67      $hostSetting
1c3e0 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 69  sFileName "\", i
1c3f0 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
1c400 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
1c410 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
1c420 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
1c430 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
1c440 20 20 20 20 70 72 6f 63 20 72 75 6e 53 51 4c 69      proc runSQLi
1c450 74 65 54 65 73 74 50 72 6f 6c 6f 67 75 65 20 7b  teTestPrologue {
1c460 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
1c470 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70      # NOTE: Skip
1c480 20 72 75 6e 6e 69 6e 67 20 6f 75 72 20 63 75 73   running our cus
1c490 74 6f 6d 20 70 72 6f 6c 6f 67 75 65 20 69 66 20  tom prologue if 
1c4a0 74 68 65 20 6d 61 69 6e 20 6f 6e 65 20 68 61 73  the main one has
1c4b0 20 62 65 65 6e 0d 0a 20 20 20 20 20 20 23 20 20   been..      #  
1c4c0 20 20 20 20 20 73 6b 69 70 70 65 64 2e 0d 0a 20       skipped... 
1c4d0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
1c4e0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
1c4f0 3a 3a 6e 6f 28 70 72 6f 6c 6f 67 75 65 2e 65 61  ::no(prologue.ea
1c500 67 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  gle)]} then {.. 
1c510 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1c520 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 74    # NOTE: Load t
1c530 68 65 20 22 62 65 66 6f 72 65 2d 63 6f 6e 73 74  he "before-const
1c540 72 61 69 6e 74 73 22 20 63 75 73 74 6f 6d 20 70  raints" custom p
1c550 65 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20 70  er-user and/or p
1c560 65 72 2d 68 6f 73 74 0d 0a 20 20 20 20 20 20 20  er-host..       
1c570 20 23 20 20 20 20 20 20 20 74 65 73 74 20 73 65   #       test se
1c580 74 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20 20  ttings now...   
1c590 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1c5a0 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20  uplevel 1 [list 
1c5b0 6c 6f 61 64 53 51 4c 69 74 65 54 65 73 74 53 65  loadSQLiteTestSe
1c5c0 74 74 69 6e 67 73 20 24 3a 3a 74 65 73 74 5f 63  ttings $::test_c
1c5d0 68 61 6e 6e 65 6c 20 2e 62 65 66 6f 72 65 5d 0d  hannel .before].
1c5e0 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1c5f0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
1c600 65 63 6b 20 69 66 20 74 68 65 20 5b 6f 62 6a 65  eck if the [obje
1c610 63 74 5d 20 63 6f 6d 6d 61 6e 64 20 69 73 20 61  ct] command is a
1c620 76 61 69 6c 61 62 6c 65 3b 20 69 66 20 6e 6f 74  vailable; if not
1c630 2c 20 61 64 64 20 73 6f 6d 65 0d 0a 20 20 20 20  , add some..    
1c640 20 20 20 20 23 20 20 20 20 20 20 20 73 68 69 6d      #       shim
1c650 73 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 74 65  s to make the te
1c660 73 74 20 73 75 69 74 65 20 72 75 6e 20 73 6d 6f  st suite run smo
1c670 6f 74 68 65 72 2e 0d 0a 20 20 20 20 20 20 20 20  other...        
1c680 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  #..        check
1c690 46 6f 72 53 51 4c 69 74 65 4f 62 6a 65 63 74 43  ForSQLiteObjectC
1c6a0 6f 6d 6d 61 6e 64 20 24 3a 3a 74 65 73 74 5f 63  ommand $::test_c
1c6b0 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20  hannel....      
1c6c0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
1c6d0 4f 54 45 3a 20 44 65 74 65 72 6d 69 6e 65 20 74  OTE: Determine t
1c6e0 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20  he names of the 
1c6f0 6e 61 74 69 76 65 20 70 6c 61 74 66 6f 72 6d 20  native platform 
1c700 61 6e 64 20 61 72 63 68 69 74 65 63 74 75 72 65  and architecture
1c710 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1c720 20 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f        set platfo
1c730 72 6d 20 5b 67 65 74 42 75 69 6c 64 50 6c 61 74  rm [getBuildPlat
1c740 66 6f 72 6d 20 74 72 75 65 5d 0d 0a 20 20 20 20  form true]..    
1c750 20 20 20 20 73 65 74 20 61 72 63 68 69 74 65 63      set architec
1c760 74 75 72 65 20 5b 61 72 63 68 69 74 65 63 74 75  ture [architectu
1c770 72 65 46 6f 72 50 6c 61 74 66 6f 72 6d 20 24 70  reForPlatform $p
1c780 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20  latform]....    
1c790 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1c7a0 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68 65 20   NOTE: Show the 
1c7b0 70 6c 61 74 66 6f 72 6d 20 61 6e 64 20 61 72 63  platform and arc
1c7c0 68 69 74 65 63 74 75 72 65 20 75 73 65 64 20 74  hitecture used t
1c7d0 6f 20 68 65 6c 70 20 6c 6f 63 61 74 65 20 74 68  o help locate th
1c7e0 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
1c7f0 20 20 20 6e 61 74 69 76 65 20 62 75 69 6c 64 20     native build 
1c800 66 69 6c 65 73 2e 0d 0a 20 20 20 20 20 20 20 20  files...        
1c810 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  #..        tputs
1c820 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1c830 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1c840 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
1c850 2d 20 70 6c 61 74 66 6f 72 6d 20 66 6f 72 20 6c  - platform for l
1c860 6f 63 61 74 69 6e 67 20 6e 61 74 69 76 65 20 62  ocating native b
1c870 75 69 6c 64 20 66 69 6c 65 73 20 69 73 20 5c 22  uild files is \"
1c880 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
1c890 20 24 70 6c 61 74 66 6f 72 6d 20 5c 22 5c 6e 5d   $platform \"\n]
1c8a0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74  ....        tput
1c8b0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1c8c0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1c8d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
1c8e0 2d 2d 20 61 72 63 68 69 74 65 63 74 75 72 65 20  -- architecture 
1c8f0 66 6f 72 20 6c 6f 63 61 74 69 6e 67 20 6e 61 74  for locating nat
1c900 69 76 65 20 62 75 69 6c 64 20 66 69 6c 65 73 20  ive build files 
1c910 69 73 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  is \"" \..      
1c920 20 20 20 20 20 20 24 61 72 63 68 69 74 65 63 74        $architect
1c930 75 72 65 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20  ure \"\n]....   
1c940 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1c950 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 61 20  # NOTE: Build a 
1c960 6c 69 73 74 20 6f 66 20 63 6f 6e 66 69 67 75 72  list of configur
1c970 61 74 69 6f 6e 20 66 69 6c 65 73 20 74 68 61 74  ation files that
1c980 20 77 65 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20   we handle...   
1c990 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1c9a0 73 65 74 20 63 6f 6e 66 69 67 46 69 6c 65 4e 61  set configFileNa
1c9b0 6d 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20  mes [list \..   
1c9c0 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
1c9d0 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 2e  Data.SQLite.dll.
1c9e0 63 6f 6e 66 69 67 5d 0d 0a 0d 0a 20 20 20 20 20  config]....     
1c9f0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1ca00 4e 4f 54 45 3a 20 42 75 69 6c 64 20 61 20 6c 69  NOTE: Build a li
1ca10 73 74 20 6f 66 20 61 75 78 69 6c 69 61 72 79 20  st of auxiliary 
1ca20 4d 61 6e 61 67 65 64 20 44 65 62 75 67 67 69 6e  Managed Debuggin
1ca30 67 20 41 73 73 69 73 74 61 6e 74 73 20 28 4d 44  g Assistants (MD
1ca40 41 29 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  A)..        #   
1ca50 20 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f      configuratio
1ca60 6e 20 66 69 6c 65 73 20 74 68 61 74 20 77 65 20  n files that we 
1ca70 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20  handle...       
1ca80 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
1ca90 6d 64 61 43 6f 6e 66 69 67 46 69 6c 65 4e 61 6d  mdaConfigFileNam
1caa0 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20  es [list \..    
1cab0 20 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65          EagleShe
1cac0 6c 6c 33 32 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e  ll32.exe.mda.con
1cad0 66 69 67 20 49 6e 73 74 61 6c 6c 65 72 2e 65 78  fig Installer.ex
1cae0 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 5c 0d 0a  e.mda.config \..
1caf0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
1cb00 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20  .exe.mda.config 
1cb10 74 65 73 74 6c 69 6e 71 2e 65 78 65 2e 6d 64 61  testlinq.exe.mda
1cb20 2e 63 6f 6e 66 69 67 20 5c 0d 0a 20 20 20 20 20  .config \..     
1cb30 20 20 20 20 20 20 20 74 65 73 74 65 66 36 2e 65         testef6.e
1cb40 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 5d 0d 0a  xe.mda.config]..
1cb50 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1cb60 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69       # NOTE: Bui
1cb70 6c 64 20 74 68 65 20 6c 69 73 74 20 6f 66 20 65  ld the list of e
1cb80 78 74 65 72 6e 61 6c 20 66 69 6c 65 73 20 74 68  xternal files th
1cb90 61 74 20 77 65 20 68 61 6e 64 6c 65 2e 20 20 53  at we handle.  S
1cba0 6f 6d 65 20 6f 66 0d 0a 20 20 20 20 20 20 20 20  ome of..        
1cbb0 23 20 20 20 20 20 20 20 74 68 65 73 65 20 66 69  #       these fi
1cbc0 6c 65 73 20 6d 61 79 20 62 65 20 6e 61 74 69 76  les may be nativ
1cbd0 65 20 61 6e 64 2f 6f 72 20 6d 61 6e 61 67 65 64  e and/or managed
1cbe0 20 61 73 73 65 6d 62 6c 69 65 73 20 74 68 61 74   assemblies that
1cbf0 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20   are..        # 
1cc00 20 20 20 20 20 20 72 65 71 75 69 72 65 64 20 74        required t
1cc10 6f 20 70 65 72 66 6f 72 6d 20 76 61 72 69 6f 75  o perform variou
1cc20 73 20 74 65 73 74 73 2e 0d 0a 20 20 20 20 20 20  s tests...      
1cc30 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74    #..        set
1cc40 20 65 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d   externalFileNam
1cc50 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20  es [list \..    
1cc60 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f          [file jo
1cc70 69 6e 20 45 6e 74 69 74 79 46 72 61 6d 65 77 6f  in EntityFramewo
1cc80 72 6b 20 6c 69 62 20 5b 73 74 72 69 6e 67 20 6d  rk lib [string m
1cc90 61 70 20 5b 6c 69 73 74 20 46 78 20 22 22 5d 20  ap [list Fx ""] 
1cca0 5b 73 74 72 69 6e 67 20 5c 0d 0a 20 20 20 20 20  [string \..     
1ccb0 20 20 20 20 20 20 20 6d 61 70 20 5b 6c 69 73 74         map [list
1ccc0 20 6e 65 74 46 78 34 35 31 20 6e 65 74 46 78 34   netFx451 netFx4
1ccd0 35 20 6e 65 74 46 78 34 35 32 20 6e 65 74 46 78  5 netFx452 netFx
1cce0 34 35 20 6e 65 74 46 78 34 36 20 6e 65 74 46 78  45 netFx46 netFx
1ccf0 34 35 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  45 \..          
1cd00 20 20 6e 65 74 46 78 34 36 31 20 6e 65 74 46 78    netFx461 netFx
1cd10 34 35 5d 20 5b 67 65 74 42 75 69 6c 64 4e 65 74  45] [getBuildNet
1cd20 46 78 5d 5d 5d 20 45 6e 74 69 74 79 46 72 61 6d  Fx]]] EntityFram
1cd30 65 77 6f 72 6b 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20  ework.dll]].... 
1cd40 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1cd50 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20    # NOTE: Build 
1cd60 74 68 65 20 6c 69 73 74 20 6f 66 20 6e 61 74 69  the list of nati
1cd70 76 65 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65  ve assembly file
1cd80 73 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65  s that we handle
1cd90 2e 20 20 54 68 65 0d 0a 20 20 20 20 20 20 20 20  .  The..        
1cda0 23 20 20 20 20 20 20 20 72 65 61 73 6f 6e 20 74  #       reason t
1cdb0 68 65 20 22 53 79 73 74 65 6d 2e 44 61 74 61 2e  he "System.Data.
1cdc0 53 51 4c 69 74 65 2e 64 6c 6c 22 20 66 69 6c 65  SQLite.dll" file
1cdd0 20 69 73 20 69 6e 63 6c 75 64 65 64 20 68 65 72   is included her
1cde0 65 20 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20  e is..        # 
1cdf0 20 20 20 20 20 20 62 65 63 61 75 73 65 20 69 74        because it
1ce00 20 63 6f 75 6c 64 20 62 65 20 74 68 65 20 6d 69   could be the mi
1ce10 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c  xed-mode assembl
1ce20 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  y...        #.. 
1ce30 20 20 20 20 20 20 20 73 65 74 20 6e 61 74 69 76         set nativ
1ce40 65 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74  eFileNames [list
1ce50 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1ce60 73 71 6c 69 74 65 33 2e 64 6c 6c 20 53 51 4c 69  sqlite3.dll SQLi
1ce70 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 20 53  te.Interop.dll S
1ce80 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
1ce90 65 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20  e.dll]....      
1cea0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
1ceb0 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 6c  OTE: Build the l
1cec0 69 73 74 20 6f 66 20 6d 61 6e 61 67 65 64 20 61  ist of managed a
1ced0 73 73 65 6d 62 6c 79 20 66 69 6c 65 73 20 74 68  ssembly files th
1cee0 61 74 20 77 65 20 68 61 6e 64 6c 65 2e 0d 0a 20  at we handle... 
1cef0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1cf00 20 20 73 65 74 20 6d 61 6e 61 67 65 64 46 69 6c    set managedFil
1cf10 65 4e 61 6d 65 73 20 5b 6c 69 73 74 20 5c 0d 0a  eNames [list \..
1cf20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
1cf30 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
1cf40 6c 6c 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  ll System.Data.S
1cf50 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 20 5c  QLite.Linq.dll \
1cf60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79  ..            Sy
1cf70 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
1cf80 2e 45 46 36 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20  .EF6.dll]....   
1cf90 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1cfa0 23 20 4e 4f 54 45 3a 20 52 65 6d 6f 76 65 20 61  # NOTE: Remove a
1cfb0 6e 79 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69  ny test constrai
1cfc0 6e 74 73 20 74 68 61 74 20 72 65 66 65 72 20 74  nts that refer t
1cfd0 6f 20 74 68 65 20 6e 61 74 69 76 65 20 61 6e 64  o the native and
1cfe0 2f 6f 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20  /or..        #  
1cff0 20 20 20 20 20 6d 61 6e 61 67 65 64 20 61 73 73       managed ass
1d000 65 6d 62 6c 79 20 66 69 6c 65 73 20 74 68 61 74  embly files that
1d010 20 77 65 20 68 61 6e 64 6c 65 20 75 6e 6c 65 73   we handle unles
1d020 73 20 66 6f 72 62 69 64 64 65 6e 20 66 72 6f 6d  s forbidden from
1d030 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1d040 20 20 64 6f 69 6e 67 20 73 6f 2e 0d 0a 20 20 20    doing so...   
1d050 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1d060 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
1d070 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 52 65 6d  s ::no(sqliteRem
1d080 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 73 29 5d  oveConstraints)]
1d090 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1d0a0 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
1d0b0 4e 61 6d 65 20 24 63 6f 6e 66 69 67 46 69 6c 65  Name $configFile
1d0c0 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
1d0d0 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74       removeConst
1d0e0 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
1d0f0 73 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61 6d  s file_ $fileNam
1d100 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  e]..          }.
1d110 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ...          for
1d120 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d  each fileName $m
1d130 64 61 43 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65  daConfigFileName
1d140 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
1d150 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e   removeConstrain
1d160 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
1d170 6c 65 5f 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a  le_ $fileName]..
1d180 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
1d190 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
1d1a0 20 66 69 6c 65 4e 61 6d 65 20 24 65 78 74 65 72   fileName $exter
1d1b0 6e 61 6c 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  nalFileNames {..
1d1c0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f              remo
1d1d0 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
1d1e0 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5b  pendArgs file_ [
1d1f0 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e  file tail $fileN
1d200 61 6d 65 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20  ame]]..         
1d210 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
1d220 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
1d230 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65   $nativeFileName
1d240 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
1d250 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e   removeConstrain
1d260 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
1d270 6c 65 5f 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a  le_ $fileName]..
1d280 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
1d290 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
1d2a0 20 66 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67   fileName $manag
1d2b0 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  edFileNames {.. 
1d2c0 20 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76             remov
1d2d0 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  eConstraint [app
1d2e0 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 24 66  endArgs file_ $f
1d2f0 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20  ileName]..      
1d300 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1d310 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
1d320 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
1d330 6b 69 70 20 61 6c 6c 20 53 79 73 74 65 6d 2e 44  kip all System.D
1d340 61 74 61 2e 53 51 4c 69 74 65 20 72 65 6c 61 74  ata.SQLite relat
1d350 65 64 20 66 69 6c 65 20 68 61 6e 64 6c 69 6e 67  ed file handling
1d360 20 28 64 65 6c 65 74 69 6e 67 2c 0d 0a 20 20 20   (deleting,..   
1d370 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 70       #       cop
1d380 79 69 6e 67 2c 20 61 6e 64 20 6c 6f 61 64 69 6e  ying, and loadin
1d390 67 29 20 69 66 20 69 6e 73 74 72 75 63 74 65 64  g) if instructed
1d3a0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1d3b0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
1d3c0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c   exists ::no(sql
1d3d0 69 74 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  iteFiles)]} then
1d3e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
1d3f0 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
1d400 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74  E: Skip trying t
1d410 6f 20 64 65 6c 65 74 65 20 61 6e 79 20 66 69 6c  o delete any fil
1d420 65 73 20 69 66 20 69 6e 73 74 72 75 63 74 65 64  es if instructed
1d430 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
1d440 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
1d450 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
1d460 28 64 65 6c 65 74 65 53 71 6c 69 74 65 46 69 6c  (deleteSqliteFil
1d470 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
1d480 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
1d490 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
1d4a0 28 64 65 6c 65 74 65 53 71 6c 69 74 65 43 6f 6e  (deleteSqliteCon
1d4b0 66 69 67 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  figFiles)]} then
1d4c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1d4d0 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
1d4e0 6d 65 20 24 63 6f 6e 66 69 67 46 69 6c 65 4e 61  me $configFileNa
1d4f0 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
1d500 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65         tryDelete
1d510 42 69 6e 61 72 79 46 69 6c 65 20 24 66 69 6c 65  BinaryFile $file
1d520 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Name..          
1d530 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1d540 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1d550 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
1d560 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74  xists ::no(delet
1d570 65 53 71 6c 69 74 65 45 78 74 65 72 6e 61 6c 46  eSqliteExternalF
1d580 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
1d590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
1d5a0 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
1d5b0 6d 64 61 43 6f 6e 66 69 67 46 69 6c 65 4e 61 6d  mdaConfigFileNam
1d5c0 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
1d5d0 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 42        tryDeleteB
1d5e0 75 69 6c 64 46 69 6c 65 20 24 66 69 6c 65 4e 61  uildFile $fileNa
1d5f0 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  me..            
1d600 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
1d610 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
1d620 65 4e 61 6d 65 20 24 65 78 74 65 72 6e 61 6c 46  eName $externalF
1d630 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
1d640 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44              tryD
1d650 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20  eleteBinaryFile 
1d660 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  $fileName..     
1d670 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1d680 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1d690 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
1d6a0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
1d6b0 64 65 6c 65 74 65 53 71 6c 69 74 65 4e 61 74 69  deleteSqliteNati
1d6c0 76 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  veFiles)]} then 
1d6d0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1d6e0 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
1d6f0 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71  ts ::no(deleteSq
1d700 6c 69 74 65 49 6d 70 6c 69 63 69 74 46 69 6c 65  liteImplicitFile
1d710 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
1d720 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
1d730 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e  each fileName $n
1d740 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b  ativeFileNames {
1d750 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1d760 20 20 20 20 74 72 79 44 65 6c 65 74 65 41 73 73      tryDeleteAss
1d770 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 0d  embly $fileName.
1d780 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d790 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
1d7a0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
1d7b0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
1d7c0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65  exists ::no(dele
1d7d0 74 65 53 71 6c 69 74 65 4e 6f 6e 49 6d 70 6c 69  teSqliteNonImpli
1d7e0 63 69 74 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  citFiles)]} then
1d7f0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1d800 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
1d810 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74  xists ::no(delet
1d820 65 53 71 6c 69 74 65 50 6c 61 74 66 6f 72 6d 46  eSqlitePlatformF
1d830 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20  iles)] && \..   
1d840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d850 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
1d860 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20  $platform] > 0} 
1d870 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1d880 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
1d890 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69  h fileName $nati
1d8a0 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  veFileNames {.. 
1d8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8c0 20 20 20 74 72 79 44 65 6c 65 74 65 41 73 73 65     tryDeleteAsse
1d8d0 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 24  mbly $fileName $
1d8e0 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20  platform..      
1d8f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1d900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1d910 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1d920 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
1d930 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74  xists ::no(delet
1d940 65 53 71 6c 69 74 65 41 72 63 68 69 74 65 63 74  eSqliteArchitect
1d950 75 72 65 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d  ureFiles)] && \.
1d960 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d970 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
1d980 67 74 68 20 24 61 72 63 68 69 74 65 63 74 75 72  gth $architectur
1d990 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
1d9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9b0 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
1d9c0 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61  me $nativeFileNa
1d9d0 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
1d9e0 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65             tryDe
1d9f0 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 24 66 69  leteAssembly $fi
1da00 6c 65 4e 61 6d 65 20 24 61 72 63 68 69 74 65 63  leName $architec
1da10 74 75 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20  ture..          
1da20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1da30 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
1da40 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1da50 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
1da60 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
1da70 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
1da80 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 4d  no(deleteSqliteM
1da90 61 6e 61 67 65 64 46 69 6c 65 73 29 5d 7d 20 74  anagedFiles)]} t
1daa0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1dab0 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
1dac0 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64 46 69  eName $managedFi
1dad0 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
1dae0 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65             tryDe
1daf0 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 24 66 69  leteAssembly $fi
1db00 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20  leName..        
1db10 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1db20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1db30 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
1db40 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
1db50 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f 72 20  NOTE: Check for 
1db60 74 68 65 20 22 61 75 74 6f 53 65 6c 65 63 74 22  the "autoSelect"
1db70 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 2e   runtime option.
1db80 20 20 49 66 20 70 72 65 73 65 6e 74 2c 0d 0a 20    If present,.. 
1db90 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
1dba0 20 61 74 74 65 6d 70 74 20 74 6f 20 61 75 74 6f   attempt to auto
1dbb0 6d 61 74 69 63 61 6c 6c 79 20 73 65 6c 65 63 74  matically select
1dbc0 20 74 68 65 20 66 69 72 73 74 20 61 76 61 69 6c   the first avail
1dbd0 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20  able..          
1dbe0 23 20 20 20 20 20 20 20 62 75 69 6c 64 20 28 6f  #       build (o
1dbf0 72 20 22 72 65 6c 65 61 73 65 22 29 20 6f 66 20  r "release") of 
1dc00 53 51 4c 69 74 65 20 61 6e 64 20 53 79 73 74 65  SQLite and Syste
1dc10 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 0d 0a 20  m.Data.SQLite.. 
1dc20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
1dc30 20 66 6f 72 20 75 73 65 20 77 69 74 68 20 74 68   for use with th
1dc40 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20  e test suite... 
1dc50 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1dc60 20 20 20 20 20 20 69 66 20 7b 5b 68 61 73 52 75        if {[hasRu
1dc70 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 61 75 74 6f  ntimeOption auto
1dc80 53 65 6c 65 63 74 5d 7d 20 74 68 65 6e 20 7b 0d  Select]} then {.
1dc90 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
1dca0 7b 21 5b 63 68 65 63 6b 46 6f 72 53 51 4c 69 74  {![checkForSQLit
1dcb0 65 42 75 69 6c 64 73 20 24 3a 3a 74 65 73 74 5f  eBuilds $::test_
1dcc0 63 68 61 6e 6e 65 6c 20 74 72 75 65 5d 7d 20 74  channel true]} t
1dcd0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1dce0 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c       checkForSQL
1dcf0 69 74 65 52 65 6c 65 61 73 65 73 20 24 3a 3a 74  iteReleases $::t
1dd00 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75 65  est_channel true
1dd10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
1dd20 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
1dd30 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1dd40 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
1dd50 6b 69 70 20 74 72 79 69 6e 67 20 74 6f 20 76 65  kip trying to ve
1dd60 72 69 66 79 20 74 68 65 20 62 75 69 6c 64 20 64  rify the build d
1dd70 69 72 65 63 74 6f 72 79 20 69 66 20 69 6e 73 74  irectory if inst
1dd80 72 75 63 74 65 64 3b 0d 0a 20 20 20 20 20 20 20  ructed;..       
1dd90 20 20 20 23 20 20 20 20 20 20 20 6f 74 68 65 72     #       other
1dda0 77 69 73 65 2c 20 6d 61 6b 65 20 73 75 72 65 20  wise, make sure 
1ddb0 69 74 20 61 63 74 75 61 6c 6c 79 20 65 78 69 73  it actually exis
1ddc0 74 73 20 6f 72 20 68 61 6c 74 20 74 68 65 20 65  ts or halt the e
1ddd0 6e 74 69 72 65 0d 0a 20 20 20 20 20 20 20 20 20  ntire..         
1dde0 20 23 20 20 20 20 20 20 20 74 65 73 74 69 6e 67   #       testing
1ddf0 20 70 72 6f 63 65 73 73 20 69 66 20 69 74 20 64   process if it d
1de00 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0d 0a  oes not exist...
1de10 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1de20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
1de30 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 76 65  o exists ::no(ve
1de40 72 69 66 79 42 75 69 6c 64 44 69 72 65 63 74 6f  rifyBuildDirecto
1de50 72 79 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ry)]} then {..  
1de60 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1de70 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
1de80 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
1de90 74 68 65 20 62 75 69 6c 64 20 64 69 72 65 63 74  the build direct
1dea0 6f 72 79 20 4d 55 53 54 20 65 78 69 73 74 20 61  ory MUST exist a
1deb0 73 20 61 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s a..           
1dec0 20 23 20 20 20 20 20 20 20 76 61 6c 69 64 20 64   #       valid d
1ded0 69 72 65 63 74 6f 72 79 20 66 6f 72 20 74 68 65  irectory for the
1dee0 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73   testing process
1def0 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0d 0a 20   to continue... 
1df00 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
1df10 20 20 20 20 20 20 20 20 20 20 73 65 74 20 64 69            set di
1df20 72 65 63 74 6f 72 79 20 5b 67 65 74 42 75 69 6c  rectory [getBuil
1df30 64 44 69 72 65 63 74 6f 72 79 5d 0d 0a 0d 0a 20  dDirectory].... 
1df40 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
1df50 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 64 69  [file exists $di
1df60 72 65 63 74 6f 72 79 5d 20 7c 7c 20 5c 0d 0a 20  rectory] || \.. 
1df70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21                 !
1df80 5b 66 69 6c 65 20 69 73 64 69 72 65 63 74 6f 72  [file isdirector
1df90 79 20 24 64 69 72 65 63 74 6f 72 79 5d 7d 20 74  y $directory]} t
1dfa0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1dfb0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1dfc0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4a 75        # NOTE: Ju
1dfd0 73 74 20 70 72 69 6f 72 20 74 6f 20 61 63 74 75  st prior to actu
1dfe0 61 6c 6c 79 20 68 61 6c 74 69 6e 67 20 74 68 65  ally halting the
1dff0 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73   testing process
1e000 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
1e010 20 23 20 20 20 20 20 20 20 61 64 64 20 61 6e 20   #       add an 
1e020 65 72 72 6f 72 20 74 6f 20 74 68 65 20 74 65 73  error to the tes
1e030 74 20 6c 6f 67 20 66 69 6c 65 2e 0d 0a 20 20 20  t log file...   
1e040 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
1e050 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1e060 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1e070 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1e080 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e090 20 20 20 22 2d 2d 2d 2d 20 63 6f 75 6c 64 20 6e     "---- could n
1e0a0 6f 74 20 76 65 72 69 66 79 20 62 75 69 6c 64 20  ot verify build 
1e0b0 64 69 72 65 63 74 6f 72 79 20 5c 22 22 20 24 64  directory \"" $d
1e0c0 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20  irectory \..    
1e0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c                "\
1e0e0 22 2c 20 61 6c 6c 20 74 65 73 74 69 6e 67 20 68  ", all testing h
1e0f0 61 6c 74 65 64 5c 6e 22 5d 0d 0a 0d 0a 20 20 20  alted\n"]....   
1e100 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
1e110 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
1e120 54 45 3a 20 52 61 69 73 69 6e 67 20 61 20 73 63  TE: Raising a sc
1e130 72 69 70 74 20 65 72 72 6f 72 20 66 72 6f 6d 20  ript error from 
1e140 74 68 69 73 20 70 6f 69 6e 74 20 73 68 6f 75 6c  this point shoul
1e150 64 20 68 61 6c 74 0d 0a 20 20 20 20 20 20 20 20  d halt..        
1e160 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
1e170 65 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73  e testing proces
1e180 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  s...            
1e190 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1e1a0 20 20 20 65 72 72 6f 72 20 5b 61 70 70 65 6e 64     error [append
1e1b0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1e1c0 20 20 20 20 20 20 20 20 20 20 22 63 6f 75 6c 64            "could
1e1d0 20 6e 6f 74 20 76 65 72 69 66 79 20 62 75 69 6c   not verify buil
1e1e0 64 20 64 69 72 65 63 74 6f 72 79 20 5c 22 22 20  d directory \"" 
1e1f0 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20  $directory \..  
1e200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e210 22 5c 22 2c 20 61 6c 6c 20 74 65 73 74 69 6e 67  "\", all testing
1e220 20 68 61 6c 74 65 64 22 5d 0d 0a 20 20 20 20 20   halted"]..     
1e230 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1e240 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1e250 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1e260 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72 79  # NOTE: Skip try
1e270 69 6e 67 20 74 6f 20 63 6f 70 79 20 61 6e 79 20  ing to copy any 
1e280 66 69 6c 65 73 20 69 66 20 69 6e 73 74 72 75 63  files if instruc
1e290 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ted...          
1e2a0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  #..          if 
1e2b0 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
1e2c0 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 46 69  :no(copySqliteFi
1e2d0 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
1e2e0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
1e2f0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
1e300 6f 28 63 6f 70 79 53 71 6c 69 74 65 43 6f 6e 66  o(copySqliteConf
1e310 69 67 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  igFiles)]} then 
1e320 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1e330 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
1e340 65 20 24 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d  e $configFileNam
1e350 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
1e360 20 20 20 20 20 20 74 72 79 43 6f 70 79 42 75 69        tryCopyBui
1e370 6c 64 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65  ldFile $fileName
1e380 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1e390 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
1e3a0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1e3b0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
1e3c0 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74  s ::no(copySqlit
1e3d0 65 45 78 74 65 72 6e 61 6c 46 69 6c 65 73 29 5d  eExternalFiles)]
1e3e0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1e3f0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1e400 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
1e410 20 43 6f 70 79 20 74 68 65 20 4d 61 6e 61 67 65   Copy the Manage
1e420 64 20 44 65 62 75 67 67 69 6e 67 20 41 73 73 69  d Debugging Assi
1e430 73 74 61 6e 74 73 20 28 4d 44 41 29 20 63 6f 6e  stants (MDA) con
1e440 66 69 67 75 72 61 74 69 6f 6e 0d 0a 20 20 20 20  figuration..    
1e450 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
1e460 20 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 45    file for the E
1e470 61 67 6c 65 20 73 68 65 6c 6c 20 74 6f 20 74 68  agle shell to th
1e480 65 20 62 75 69 6c 64 20 6f 75 74 70 75 74 20 64  e build output d
1e490 69 72 65 63 74 6f 72 79 2c 0d 0a 20 20 20 20 20  irectory,..     
1e4a0 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
1e4b0 20 77 68 69 6c 65 20 75 73 69 6e 67 20 65 61 63   while using eac
1e4c0 68 20 6f 66 20 74 68 65 20 6e 61 6d 65 73 20 6f  h of the names o
1e4d0 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c 65  f the various le
1e4e0 67 61 63 79 20 74 65 73 74 0d 0a 20 20 20 20 20  gacy test..     
1e4f0 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
1e500 20 65 78 65 63 75 74 61 62 6c 65 73 2e 20 20 54   executables.  T
1e510 68 69 73 20 77 69 6c 6c 20 68 65 6c 70 20 74 6f  his will help to
1e520 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
1e530 61 6c 6c 20 74 68 65 0d 0a 20 20 20 20 20 20 20  all the..       
1e540 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6c         #       l
1e550 65 67 61 63 79 20 74 65 73 74 73 20 72 75 6e 20  egacy tests run 
1e560 77 69 74 68 20 65 78 61 63 74 6c 79 20 74 68 65  with exactly the
1e570 20 73 61 6d 65 20 73 65 74 20 6f 66 20 4d 61 6e   same set of Man
1e580 61 67 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20  aged..          
1e590 20 20 20 20 23 20 20 20 20 20 20 20 44 65 62 75      #       Debu
1e5a0 67 67 69 6e 67 20 41 73 73 69 73 74 61 6e 74 73  gging Assistants
1e5b0 20 63 6f 6e 66 69 67 75 72 65 64 2e 0d 0a 20 20   configured...  
1e5c0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
1e5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
1e5e0 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d  each fileName $m
1e5f0 64 61 43 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65  daConfigFileName
1e600 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
1e610 20 20 20 20 20 74 72 79 43 6f 70 79 42 69 6e 61       tryCopyBina
1e620 72 79 46 69 6c 65 20 45 61 67 6c 65 53 68 65 6c  ryFile EagleShel
1e630 6c 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67  l.exe.mda.config
1e640 20 22 22 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20   "" $fileName.. 
1e650 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
1e660 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1e670 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
1e680 20 23 20 4e 4f 54 45 3a 20 43 6f 70 79 20 74 68   # NOTE: Copy th
1e690 65 20 65 78 74 65 72 6e 61 6c 20 62 69 6e 61 72  e external binar
1e6a0 69 65 73 2c 20 69 66 20 61 6e 79 2c 20 74 6f 20  ies, if any, to 
1e6b0 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68  the directory th
1e6c0 61 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  at..            
1e6d0 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74 61 69    #       contai
1e6e0 6e 73 20 74 68 65 20 45 61 67 6c 65 20 73 68 65  ns the Eagle she
1e6f0 6c 6c 2e 20 20 54 68 69 73 20 69 73 20 74 79 70  ll.  This is typ
1e700 69 63 61 6c 6c 79 20 75 73 65 64 20 74 6f 20 6d  ically used to m
1e710 61 6b 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ake..           
1e720 20 20 20 23 20 20 20 20 20 20 20 73 75 72 65 20     #       sure 
1e730 61 73 73 65 6d 62 6c 69 65 73 20 72 65 66 65 72  assemblies refer
1e740 65 6e 63 65 64 20 62 79 20 74 68 65 20 6f 6e 65  enced by the one
1e750 73 20 62 65 69 6e 67 20 74 65 73 74 65 64 20 61  s being tested a
1e760 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  re..            
1e770 20 20 23 20 20 20 20 20 20 20 61 76 61 69 6c 61    #       availa
1e780 62 6c 65 20 64 75 72 69 6e 67 20 74 68 65 20 74  ble during the t
1e790 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73 2e 0d  esting process..
1e7a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
1e7b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1e7c0 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
1e7d0 20 24 65 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61   $externalFileNa
1e7e0 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
1e7f0 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 45 78         tryCopyEx
1e800 74 65 72 6e 61 6c 46 69 6c 65 20 24 66 69 6c 65  ternalFile $file
1e810 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Name..          
1e820 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1e830 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1e840 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
1e850 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53  xists ::no(copyS
1e860 71 6c 69 74 65 4e 61 74 69 76 65 46 69 6c 65 73  qliteNativeFiles
1e870 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
1e880 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1e890 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
1e8a0 45 3a 20 49 66 20 74 68 65 20 74 65 73 74 20 70  E: If the test p
1e8b0 6c 61 74 66 6f 72 6d 20 69 73 20 6c 69 6b 65 6c  latform is likel
1e8c0 79 20 74 68 65 20 64 65 66 61 75 6c 74 20 66 6f  y the default fo
1e8d0 72 20 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20  r this..        
1e8e0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 61        #       ma
1e8f0 63 68 69 6e 65 2c 20 61 6c 73 6f 20 74 72 79 20  chine, also try 
1e900 74 6f 20 63 6f 70 79 20 74 68 65 20 6e 61 74 69  to copy the nati
1e910 76 65 20 66 69 6c 65 73 20 74 6f 20 74 68 65 0d  ve files to the.
1e920 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
1e930 20 20 20 20 20 20 20 62 69 6e 61 72 79 20 6c 6f         binary lo
1e940 63 61 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20  cation...       
1e950 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1e960 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
1e970 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63  fo exists ::no(c
1e980 6f 70 79 53 71 6c 69 74 65 49 6d 70 6c 69 63 69  opySqliteImplici
1e990 74 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20  tFiles)] && \.. 
1e9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9b0 20 5b 69 73 44 65 66 61 75 6c 74 42 75 69 6c 64   [isDefaultBuild
1e9c0 50 6c 61 74 66 6f 72 6d 20 74 72 75 65 5d 7d 20  Platform true]} 
1e9d0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1e9e0 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
1e9f0 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65  fileName $native
1ea00 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
1ea10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
1ea20 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 24  ryCopyAssembly $
1ea30 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20  fileName..      
1ea40 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1ea50 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
1ea60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1ea70 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
1ea80 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 4e  ::no(copySqliteN
1ea90 6f 6e 49 6d 70 6c 69 63 69 74 46 69 6c 65 73 29  onImplicitFiles)
1eaa0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1eab0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
1eac0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
1ead0 6f 28 63 6f 70 79 53 71 6c 69 74 65 50 6c 61 74  o(copySqlitePlat
1eae0 66 6f 72 6d 46 69 6c 65 73 29 5d 20 26 26 20 5c  formFiles)] && \
1eaf0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1eb00 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
1eb10 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20  ngth $platform] 
1eb20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
1eb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
1eb40 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
1eb50 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73  $nativeFileNames
1eb60 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1eb70 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 41          tryCopyA
1eb80 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d  ssembly $fileNam
1eb90 65 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20  e $platform..   
1eba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1ebb0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1ebc0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
1ebd0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
1ebe0 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f  o exists ::no(co
1ebf0 70 79 53 71 6c 69 74 65 41 72 63 68 69 74 65 63  pySqliteArchitec
1ec00 74 75 72 65 46 69 6c 65 73 29 5d 20 26 26 20 5c  tureFiles)] && \
1ec10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1ec20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
1ec30 6e 67 74 68 20 24 61 72 63 68 69 74 65 63 74 75  ngth $architectu
1ec40 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  re] > 0} then {.
1ec50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ec60 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
1ec70 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e  ame $nativeFileN
1ec80 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
1ec90 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43              tryC
1eca0 6f 70 79 41 73 73 65 6d 62 6c 79 20 24 66 69 6c  opyAssembly $fil
1ecb0 65 4e 61 6d 65 20 24 61 72 63 68 69 74 65 63 74  eName $architect
1ecc0 75 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ure..           
1ecd0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1ece0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1ecf0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
1ed00 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
1ed10 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
1ed20 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
1ed30 6f 28 63 6f 70 79 53 71 6c 69 74 65 4d 61 6e 61  o(copySqliteMana
1ed40 67 65 64 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  gedFiles)]} then
1ed50 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1ed60 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
1ed70 6d 65 20 24 6d 61 6e 61 67 65 64 46 69 6c 65 4e  me $managedFileN
1ed80 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
1ed90 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 41          tryCopyA
1eda0 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d  ssembly $fileNam
1edb0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
1edc0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
1edd0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
1ede0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
1edf0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
1ee00 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74 6f 20   Skip trying to 
1ee10 6c 6f 61 64 20 61 6e 79 20 66 69 6c 65 73 20 69  load any files i
1ee20 66 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20  f instructed... 
1ee30 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1ee40 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
1ee50 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61   exists ::no(loa
1ee60 64 53 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20  dSqliteFiles)]} 
1ee70 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1ee80 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
1ee90 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53  xists ::no(loadS
1eea0 71 6c 69 74 65 49 6d 70 6c 69 63 69 74 46 69 6c  qliteImplicitFil
1eeb0 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
1eec0 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 4c              tryL
1eed0 6f 61 64 41 73 73 65 6d 62 6c 79 20 53 79 73 74  oadAssembly Syst
1eee0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
1eef0 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll..            
1ef00 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
1ef10 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
1ef20 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69  ts ::no(loadSqli
1ef30 74 65 4c 69 6e 71 46 69 6c 65 73 29 5d 7d 20 74  teLinqFiles)]} t
1ef40 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1ef50 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73 65       tryLoadAsse
1ef60 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61  mbly System.Data
1ef70 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c  .SQLite.Linq.dll
1ef80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
1ef90 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
1efa0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
1efb0 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65   ::no(loadSqlite
1efc0 45 66 36 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  Ef6Files)]} then
1efd0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1efe0 20 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c    tryLoadAssembl
1eff0 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  y System.Data.SQ
1f000 4c 69 74 65 2e 45 46 36 2e 64 6c 6c 0d 0a 20 20  Lite.EF6.dll..  
1f010 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
1f020 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
1f030 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
1f040 6f 28 6c 6f 61 64 53 71 6c 69 74 65 4e 6f 6e 49  o(loadSqliteNonI
1f050 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d 20  mplicitFiles)]} 
1f060 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1f070 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
1f080 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61   exists ::no(loa
1f090 64 53 71 6c 69 74 65 50 6c 61 74 66 6f 72 6d 46  dSqlitePlatformF
1f0a0 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20  iles)] && \..   
1f0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
1f0c0 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70  string length $p
1f0d0 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68  latform] > 0} th
1f0e0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1f0f0 20 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73        tryLoadAss
1f100 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74  embly System.Dat
1f110 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 20 24 70 6c  a.SQLite.dll $pl
1f120 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20  atform..        
1f130 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1f140 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
1f150 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
1f160 6c 6f 61 64 53 71 6c 69 74 65 41 72 63 68 69 74  loadSqliteArchit
1f170 65 63 74 75 72 65 46 69 6c 65 73 29 5d 20 26 26  ectureFiles)] &&
1f180 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1f190 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
1f1a0 6e 67 74 68 20 24 61 72 63 68 69 74 65 63 74 75  ngth $architectu
1f1b0 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  re] > 0} then {.
1f1c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f1d0 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79   tryLoadAssembly
1f1e0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
1f1f0 69 74 65 2e 64 6c 6c 20 24 61 72 63 68 69 74 65  ite.dll $archite
1f200 63 74 75 72 65 0d 0a 20 20 20 20 20 20 20 20 20  cture..         
1f210 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1f220 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1f230 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
1f240 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b  .        catch {
1f250 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
1f260 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1f270 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1f280 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
1f290 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f  ---- file versio
1f2a0 6e 20 6f 66 20 5c 22 73 71 6c 69 74 65 33 2e 64  n of \"sqlite3.d
1f2b0 6c 6c 5c 22 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20  ll\"... " \..   
1f2c0 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
1f2d0 20 76 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e   version [getBin
1f2e0 61 72 79 46 69 6c 65 4e 61 6d 65 20 73 71 6c 69  aryFileName sqli
1f2f0 74 65 33 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20  te3.dll]] \n].. 
1f300 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1f310 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
1f320 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
1f330 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
1f340 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
1f350 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
1f360 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20  file version of 
1f370 5c 22 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70  \"SQLite.Interop
1f380 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5c 0d 0a 20  .dll\"... " \.. 
1f390 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69               [fi
1f3a0 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67 65 74 42  le version [getB
1f3b0 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 53 51  inaryFileName SQ
1f3c0 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c  Lite.Interop.dll
1f3d0 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ]] \n]..        
1f3e0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74  }....        cat
1f3f0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
1f400 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
1f410 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1f420 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1f430 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65     "---- file ve
1f440 72 73 69 6f 6e 20 6f 66 20 5c 22 53 79 73 74 65  rsion of \"Syste
1f450 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
1f460 6c 5c 22 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20  l\"... " \..    
1f470 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
1f480 76 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61  version [getBina
1f490 72 79 46 69 6c 65 4e 61 6d 65 20 53 79 73 74 65  ryFileName Syste
1f4a0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
1f4b0 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  l]] \n]..       
1f4c0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61   }....        ca
1f4d0 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
1f4e0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
1f4f0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1f500 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1f510 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76      "---- file v
1f520 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53 79 73 74  ersion of \"Syst
1f530 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c  em.Data.SQLite.L
1f540 69 6e 71 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5c  inq.dll\"... " \
1f550 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1f560 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67  [file version [g
1f570 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  etBinaryFileName
1f580 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
1f590 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 5d 5d 20 5c  ite.Linq.dll]] \
1f5a0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  n]..        }...
1f5b0 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b  .        catch {
1f5c0 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
1f5d0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1f5e0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1f5f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
1f600 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f  ---- file versio
1f610 6e 20 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44 61  n of \"System.Da
1f620 74 61 2e 53 51 4c 69 74 65 2e 45 46 36 2e 64 6c  ta.SQLite.EF6.dl
1f630 6c 5c 22 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20  l\"... " \..    
1f640 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
1f650 76 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61  version [getBina
1f660 72 79 46 69 6c 65 4e 61 6d 65 20 53 79 73 74 65  ryFileName Syste
1f670 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 45 46  m.Data.SQLite.EF
1f680 36 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20 20  6.dll]] \n]..   
1f690 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1f6a0 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
1f6b0 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20  ngth $platform] 
1f6c0 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
1f6d0 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a         catch {..
1f6e0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1f6f0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1f700 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1f710 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f720 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73   "---- file vers
1f730 69 6f 6e 20 6f 66 20 5c 22 22 20 24 70 6c 61 74  ion of \"" $plat
1f740 66 6f 72 6d 20 5c 0d 0a 20 20 20 20 20 20 20 20  form \..        
1f750 20 20 20 20 20 20 20 20 22 2f 73 71 6c 69 74 65          "/sqlite
1f760 33 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5b 66 69  3.dll\"... " [fi
1f770 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20 20  le version \..  
1f780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67                [g
1f790 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  etBinaryFileName
1f7a0 20 73 71 6c 69 74 65 33 2e 64 6c 6c 20 24 70 6c   sqlite3.dll $pl
1f7b0 61 74 66 6f 72 6d 5d 5d 20 5c 6e 5d 0d 0a 20 20  atform]] \n]..  
1f7c0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1f7d0 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a         catch {..
1f7e0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1f7f0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1f800 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1f810 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f820 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73   "---- file vers
1f830 69 6f 6e 20 6f 66 20 5c 22 22 20 24 70 6c 61 74  ion of \"" $plat
1f840 66 6f 72 6d 20 5c 0d 0a 20 20 20 20 20 20 20 20  form \..        
1f850 20 20 20 20 20 20 20 20 22 2f 53 51 4c 69 74 65          "/SQLite
1f860 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 5c 22 2e 2e  .Interop.dll\"..
1f870 2e 20 22 20 5b 66 69 6c 65 20 76 65 72 73 69 6f  . " [file versio
1f880 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
1f890 20 20 20 20 20 5b 67 65 74 42 69 6e 61 72 79 46       [getBinaryF
1f8a0 69 6c 65 4e 61 6d 65 20 53 51 4c 69 74 65 2e 49  ileName SQLite.I
1f8b0 6e 74 65 72 6f 70 2e 64 6c 6c 20 24 70 6c 61 74  nterop.dll $plat
1f8c0 66 6f 72 6d 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20  form]] \n]..    
1f8d0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1f8e0 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
1f8f0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1f900 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
1f910 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1f920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1f930 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f  ---- file versio
1f940 6e 20 6f 66 20 5c 22 22 20 24 70 6c 61 74 66 6f  n of \"" $platfo
1f950 72 6d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  rm \..          
1f960 20 20 20 20 20 20 22 2f 53 79 73 74 65 6d 2e 44        "/System.D
1f970 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c 22  ata.SQLite.dll\"
1f980 2e 2e 2e 20 22 20 5b 66 69 6c 65 20 76 65 72 73  ... " [file vers
1f990 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ion \..         
1f9a0 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61 72         [getBinar
1f9b0 79 46 69 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d  yFileName System
1f9c0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
1f9d0 20 24 70 6c 61 74 66 6f 72 6d 5d 5d 20 5c 6e 5d   $platform]] \n]
1f9e0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1f9f0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1fa00 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
1fa10 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74 65 63  length $architec
1fa20 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ture] > 0} then 
1fa30 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61 74  {..          cat
1fa40 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
1fa50 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
1fa60 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1fa70 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1fa80 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c         "---- fil
1fa90 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22  e version of \""
1faa0 20 24 61 72 63 68 69 74 65 63 74 75 72 65 20 5c   $architecture \
1fab0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1fac0 20 20 22 2f 73 71 6c 69 74 65 33 2e 64 6c 6c 5c    "/sqlite3.dll\
1fad0 22 2e 2e 2e 20 22 20 5b 66 69 6c 65 20 76 65 72  "... " [file ver
1fae0 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  sion \..        
1faf0 20 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61          [getBina
1fb00 72 79 46 69 6c 65 4e 61 6d 65 20 73 71 6c 69 74  ryFileName sqlit
1fb10 65 33 2e 64 6c 6c 20 24 61 72 63 68 69 74 65 63  e3.dll $architec
1fb20 74 75 72 65 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20  ture]] \n]..    
1fb30 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1fb40 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
1fb50 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1fb60 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
1fb70 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1fb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1fb90 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f  ---- file versio
1fba0 6e 20 6f 66 20 5c 22 22 20 24 61 72 63 68 69 74  n of \"" $archit
1fbb0 65 63 74 75 72 65 20 5c 0d 0a 20 20 20 20 20 20  ecture \..      
1fbc0 20 20 20 20 20 20 20 20 20 20 22 2f 53 51 4c 69            "/SQLi
1fbd0 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 5c 22  te.Interop.dll\"
1fbe0 2e 2e 2e 20 22 20 5b 66 69 6c 65 20 76 65 72 73  ... " [file vers
1fbf0 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ion \..         
1fc00 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61 72         [getBinar
1fc10 79 46 69 6c 65 4e 61 6d 65 20 53 51 4c 69 74 65  yFileName SQLite
1fc20 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 20 24 61 72  .Interop.dll $ar
1fc30 63 68 69 74 65 63 74 75 72 65 5d 5d 20 5c 6e 5d  chitecture]] \n]
1fc40 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
1fc50 0a 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68  .          catch
1fc60 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1fc70 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
1fc80 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1fc90 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1fca0 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20       "---- file 
1fcb0 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24  version of \"" $
1fcc0 61 72 63 68 69 74 65 63 74 75 72 65 20 5c 0d 0a  architecture \..
1fcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fce0 22 2f 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  "/System.Data.SQ
1fcf0 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20  Lite.dll\"... " 
1fd00 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d  [file version \.
1fd10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fd20 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
1fd30 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  ame System.Data.
1fd40 53 51 4c 69 74 65 2e 64 6c 6c 20 24 61 72 63 68  SQLite.dll $arch
1fd50 69 74 65 63 74 75 72 65 5d 5d 20 5c 6e 5d 0d 0a  itecture]] \n]..
1fd60 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1fd70 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1fd80 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
1fd90 4f 54 45 3a 20 47 72 61 62 20 74 68 65 20 6c 69  OTE: Grab the li
1fda0 73 74 20 6f 66 20 6d 61 6e 61 67 65 64 20 61 73  st of managed as
1fdb0 73 65 6d 62 6c 69 65 73 20 66 6f 72 20 74 68 65  semblies for the
1fdc0 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73   current process
1fdd0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1fde0 20 20 61 6e 64 20 72 65 70 6f 72 74 20 6f 6e 20    and report on 
1fdf0 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  the System.Data.
1fe00 53 51 4c 69 74 65 20 72 65 6c 61 74 65 64 20 6f  SQLite related o
1fe10 6e 65 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  nes...        #.
1fe20 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61  .        if {[ha
1fe30 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f  veSQLiteObjectCo
1fe40 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a  mmand]} then {..
1fe50 20 20 20 20 20 20 20 20 20 20 73 65 74 20 61 73            set as
1fe60 73 65 6d 62 6c 69 65 73 20 5b 6f 62 6a 65 63 74  semblies [object
1fe70 20 69 6e 76 6f 6b 65 20 41 70 70 44 6f 6d 61 69   invoke AppDomai
1fe80 6e 2e 43 75 72 72 65 6e 74 44 6f 6d 61 69 6e 20  n.CurrentDomain 
1fe90 47 65 74 41 73 73 65 6d 62 6c 69 65 73 5d 0d 0a  GetAssemblies]..
1fea0 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65  ..          obje
1feb0 63 74 20 66 6f 72 65 61 63 68 20 61 73 73 65 6d  ct foreach assem
1fec0 62 6c 79 20 24 61 73 73 65 6d 62 6c 69 65 73 20  bly $assemblies 
1fed0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
1fee0 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68  f {[string match
1fef0 20 5c 7b 53 79 73 74 65 6d 2e 44 61 74 61 2e 53   \{System.Data.S
1ff00 51 4c 69 74 65 2a 20 24 61 73 73 65 6d 62 6c 79  QLite* $assembly
1ff10 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1ff20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1ff30 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
1ff40 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1ff50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff60 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c 6f 61 64  "---- found load
1ff70 65 64 20 61 73 73 65 6d 62 6c 79 3a 20 22 20 24  ed assembly: " $
1ff80 61 73 73 65 6d 62 6c 79 20 5c 6e 5d 0d 0a 20 20  assembly \n]..  
1ff90 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1ffa0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1ffb0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63    }....        c
1ffc0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
1ffd0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
1ffe0 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20  channel \..     
1fff0 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 64           "---- d
20000 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74 73 20  efine constants 
20010 66 6f 72 20 5c 22 53 79 73 74 65 6d 2e 44 61 74  for \"System.Dat
20020 61 2e 53 51 4c 69 74 65 5c 22 2e 2e 2e 20 22 0d  a.SQLite\"... ".
20030 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
20040 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
20050 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
20060 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
20070 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
20080 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
20090 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
200a0 69 74 65 33 20 44 65 66 69 6e 65 43 6f 6e 73 74  ite3 DefineConst
200b0 61 6e 74 73 0d 0a 20 20 20 20 20 20 20 20 20 20  ants..          
200c0 7d 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74  } defineConstant
200d0 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  s] == 0} then {.
200e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
200f0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
20100 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b  el [appendArgs [
20110 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73 6f 72  formatList [lsor
20120 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
20130 20 20 20 20 20 24 64 65 66 69 6e 65 43 6f 6e 73       $defineCons
20140 74 61 6e 74 73 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c  tants] <none>] \
20150 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  n]..          } 
20160 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
20170 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
20180 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77  t_channel unknow
20190 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  n\n..          }
201a0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
201b0 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a         catch {..
201c0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
201d0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
201e0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
201f0 20 22 2d 2d 2d 2d 20 73 6f 75 72 63 65 20 76 65   "---- source ve
20200 72 73 69 6f 6e 20 6f 66 20 5c 22 53 79 73 74 65  rsion of \"Syste
20210 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
20220 6c 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  l\"... "....    
20230 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
20240 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
20250 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
20260 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
20270 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
20280 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
20290 51 4c 69 74 65 2e 53 51 4c 69 74 65 43 6f 6e 6e  QLite.SQLiteConn
202a0 65 63 74 69 6f 6e 20 50 72 6f 76 69 64 65 72 56  ection ProviderV
202b0 65 72 73 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20  ersion..        
202c0 20 20 7d 20 76 65 72 73 69 6f 6e 5d 20 3d 3d 20    } version] == 
202d0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
202e0 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
202f0 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72 73 69  ng length $versi
20300 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  on] == 0} then {
20310 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
20320 73 65 74 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c  set version null
20330 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
20340 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
20350 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
20360 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  el [appendArgs $
20370 76 65 72 73 69 6f 6e 20 5c 6e 5d 0d 0a 20 20 20  version \n]..   
20380 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
20390 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
203a0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
203b0 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20  el unknown\n..  
203c0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
203d0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
203e0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
203f0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
20400 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20  _channel \..    
20410 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
20420 73 6f 75 72 63 65 20 63 68 65 63 6b 6f 75 74 20  source checkout 
20430 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61  of \"System.Data
20440 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e  .SQLite.dll\"...
20450 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   "....          
20460 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
20470 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
20480 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
20490 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
204a0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
204b0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
204c0 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
204d0 20 50 72 6f 76 69 64 65 72 53 6f 75 72 63 65 49   ProviderSourceI
204e0 64 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 73  d..          } s
204f0 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74  ourceId] == 0} t
20500 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
20510 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
20520 65 6e 67 74 68 20 24 73 6f 75 72 63 65 49 64 5d  ength $sourceId]
20530 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
20540 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
20550 20 73 6f 75 72 63 65 49 64 20 6e 75 6c 6c 0d 0a   sourceId null..
20560 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
20570 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
20580 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
20590 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 73 6f   [appendArgs $so
205a0 75 72 63 65 49 64 20 5c 6e 5d 0d 0a 20 20 20 20  urceId \n]..    
205b0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
205c0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
205d0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
205e0 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20  l unknown\n..   
205f0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
20600 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
20610 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
20620 3a 20 43 68 65 63 6b 20 74 68 65 20 61 76 61 69  : Check the avai
20630 6c 61 62 6c 65 20 62 75 69 6c 64 73 20 28 61 6e  lable builds (an
20640 64 20 22 72 65 6c 65 61 73 65 73 22 29 20 6f 66  d "releases") of
20650 20 53 51 4c 69 74 65 20 61 6e 64 0d 0a 20 20 20   SQLite and..   
20660 20 20 20 20 20 23 20 20 20 20 20 20 20 53 79 73       #       Sys
20670 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
20680 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
20690 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c       checkForSQL
206a0 69 74 65 42 75 69 6c 64 73 20 24 3a 3a 74 65 73  iteBuilds $::tes
206b0 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20  t_channel..     
206c0 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74     checkForSQLit
206d0 65 52 65 6c 65 61 73 65 73 20 24 3a 3a 74 65 73  eReleases $::tes
206e0 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20  t_channel....   
206f0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
20700 23 20 4e 4f 54 45 3a 20 4e 6f 77 2c 20 77 65 20  # NOTE: Now, we 
20710 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 66 20  need to know if 
20720 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20  the SQLite core 
20730 6c 69 62 72 61 72 79 20 69 73 20 61 76 61 69 6c  library is avail
20740 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20  able..        # 
20750 20 20 20 20 20 20 28 69 2e 65 2e 20 62 65 63 61        (i.e. beca
20760 75 73 65 20 74 68 65 20 6d 61 6e 61 67 65 64 2d  use the managed-
20770 6f 6e 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61  only System.Data
20780 2e 53 51 4c 69 74 65 20 61 73 73 65 6d 62 6c 79  .SQLite assembly
20790 20 63 61 6e 0d 0a 20 20 20 20 20 20 20 20 23 20   can..        # 
207a0 20 20 20 20 20 20 6c 6f 61 64 20 77 69 74 68 6f        load witho
207b0 75 74 20 69 74 3b 20 68 6f 77 65 76 65 72 2c 20  ut it; however, 
207c0 69 74 20 63 61 6e 6e 6f 74 20 64 6f 20 61 6e 79  it cannot do any
207d0 74 68 69 6e 67 20 75 73 65 66 75 6c 20 77 69 74  thing useful wit
207e0 68 6f 75 74 0d 0a 20 20 20 20 20 20 20 20 23 20  hout..        # 
207f0 20 20 20 20 20 20 69 74 29 2e 20 20 49 66 20 77        it).  If w
20800 65 20 61 72 65 20 75 73 69 6e 67 20 74 68 65 20  e are using the 
20810 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d  mixed-mode assem
20820 62 6c 79 20 61 6e 64 20 77 65 20 61 6c 72 65 61  bly and we alrea
20830 64 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  dy..        #   
20840 20 20 20 20 66 6f 75 6e 64 20 69 74 20 28 61 62      found it (ab
20850 6f 76 65 29 2c 20 74 68 69 73 20 73 68 6f 75 6c  ove), this shoul
20860 64 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64  d always succeed
20870 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
20880 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51        checkForSQ
20890 4c 69 74 65 4c 69 62 72 61 72 79 20 24 3a 3a 74  LiteLibrary $::t
208a0 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20  est_channel.... 
208b0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
208c0 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
208d0 69 66 20 74 68 65 20 53 51 4c 69 74 65 20 69 6e  if the SQLite in
208e0 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 69  terop assembly i
208f0 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20  s available...  
20900 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
20910 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 49   checkForSQLiteI
20920 6e 74 65 72 6f 70 20 24 3a 3a 74 65 73 74 5f 63  nterop $::test_c
20930 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20  hannel....      
20940 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
20950 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20 53  OTE: Check the S
20960 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 61  QLite database a
20970 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72  nd temporary dir
20980 65 63 74 6f 72 69 65 73 2e 0d 0a 20 20 20 20 20  ectories...     
20990 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68     #..        ch
209a0 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 69 72 65  eckForSQLiteDire
209b0 63 74 6f 72 69 65 73 20 24 3a 3a 74 65 73 74 5f  ctories $::test_
209c0 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20  channel....     
209d0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
209e0 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
209f0 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 76 61   determine if va
20a00 72 69 6f 75 73 20 63 6f 6d 70 69 6c 65 2d 74 69  rious compile-ti
20a10 6d 65 20 6f 70 74 69 6f 6e 73 20 6e 65 65 64 65  me options neede
20a20 64 20 66 6f 72 0d 0a 20 20 20 20 20 20 20 20 23  d for..        #
20a30 20 20 20 20 20 20 20 74 65 73 74 20 63 6f 6e 73         test cons
20a40 74 72 61 69 6e 74 73 20 77 65 72 65 20 65 6e 61  traints were ena
20a50 62 6c 65 64 20 66 6f 72 20 74 68 65 20 6d 61 6e  bled for the man
20a60 61 67 65 64 20 61 73 73 65 6d 62 6c 79 2e 20 20  aged assembly.  
20a70 54 68 65 72 65 0d 0a 20 20 20 20 20 20 20 20 23  There..        #
20a80 20 20 20 20 20 20 20 61 72 65 20 73 6f 6d 65 20         are some 
20a90 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
20aa0 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20 61  ions that must a
20ab0 6c 73 6f 20 68 61 76 65 20 62 65 65 6e 20 65 6e  lso have been en
20ac0 61 62 6c 65 64 0d 0a 20 20 20 20 20 20 20 20 23  abled..        #
20ad0 20 20 20 20 20 20 20 66 6f 72 20 74 68 65 20 69         for the i
20ae0 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20  nterop assembly 
20af0 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 65  in order to be e
20b00 66 66 65 63 74 69 76 65 2e 20 20 46 6f 72 20 74  ffective.  For t
20b10 68 6f 73 65 0d 0a 20 20 20 20 20 20 20 20 23 20  hose..        # 
20b20 20 20 20 20 20 20 6f 70 74 69 6f 6e 73 2c 20 69        options, i
20b30 74 20 77 69 6c 6c 20 62 65 20 61 73 73 75 6d 65  t will be assume
20b40 64 20 74 68 61 74 20 69 74 20 77 61 73 20 65 6e  d that it was en
20b50 61 62 6c 65 64 20 66 6f 72 20 74 68 65 20 69 6e  abled for the in
20b60 74 65 72 6f 70 0d 0a 20 20 20 20 20 20 20 20 23  terop..        #
20b70 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 20         assembly 
20b80 69 66 20 69 74 20 77 61 73 20 65 6e 61 62 6c 65  if it was enable
20b90 64 20 66 6f 72 20 74 68 65 20 6d 61 6e 61 67 65  d for the manage
20ba0 64 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20  d assembly...   
20bb0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
20bc0 66 6f 72 65 61 63 68 20 64 65 66 69 6e 65 43 6f  foreach defineCo
20bd0 6e 73 74 61 6e 74 20 5b 6c 69 73 74 20 5c 0d 0a  nstant [list \..
20be0 20 20 20 20 20 20 20 20 20 20 20 20 43 48 45 43              CHEC
20bf0 4b 5f 53 54 41 54 45 20 43 4f 55 4e 54 5f 48 41  K_STATE COUNT_HA
20c00 4e 44 4c 45 20 44 45 42 55 47 20 49 4e 54 45 52  NDLE DEBUG INTER
20c10 4f 50 5f 43 4f 44 45 43 20 49 4e 54 45 52 4f 50  OP_CODEC INTEROP
20c20 5f 44 45 42 55 47 20 5c 0d 0a 20 20 20 20 20 20  _DEBUG \..      
20c30 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 45 58        INTEROP_EX
20c40 54 45 4e 53 49 4f 4e 5f 46 55 4e 43 54 49 4f 4e  TENSION_FUNCTION
20c50 53 20 49 4e 54 45 52 4f 50 5f 46 54 53 35 5f 45  S INTEROP_FTS5_E
20c60 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20  XTENSION \..    
20c70 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f          INTEROP_
20c80 49 4e 43 4c 55 44 45 5f 43 45 52 4f 44 20 49 4e  INCLUDE_CEROD IN
20c90 54 45 52 4f 50 5f 49 4e 43 4c 55 44 45 5f 45 58  TEROP_INCLUDE_EX
20ca0 54 52 41 20 49 4e 54 45 52 4f 50 5f 49 4e 43 4c  TRA INTEROP_INCL
20cb0 55 44 45 5f 53 45 45 20 5c 0d 0a 20 20 20 20 20  UDE_SEE \..     
20cc0 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 49         INTEROP_I
20cd0 4e 43 4c 55 44 45 5f 5a 49 50 56 46 53 20 49 4e  NCLUDE_ZIPVFS IN
20ce0 54 45 52 4f 50 5f 4a 53 4f 4e 31 5f 45 58 54 45  TEROP_JSON1_EXTE
20cf0 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20  NSION \..       
20d00 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 4c 45 47       INTEROP_LEG
20d10 41 43 59 5f 43 4c 4f 53 45 20 49 4e 54 45 52 4f  ACY_CLOSE INTERO
20d20 50 5f 4c 4f 47 20 49 4e 54 45 52 4f 50 5f 50 45  P_LOG INTEROP_PE
20d30 52 43 45 4e 54 49 4c 45 5f 45 58 54 45 4e 53 49  RCENTILE_EXTENSI
20d40 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ON \..          
20d50 20 20 49 4e 54 45 52 4f 50 5f 52 45 47 45 58 50    INTEROP_REGEXP
20d60 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54 45 52  _EXTENSION INTER
20d70 4f 50 5f 54 45 53 54 5f 45 58 54 45 4e 53 49 4f  OP_TEST_EXTENSIO
20d80 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  N \..           
20d90 20 49 4e 54 45 52 4f 50 5f 54 4f 54 59 50 45 5f   INTEROP_TOTYPE_
20da0 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54 45 52 4f  EXTENSION INTERO
20db0 50 5f 56 49 52 54 55 41 4c 5f 54 41 42 4c 45 20  P_VIRTUAL_TABLE 
20dc0 4e 45 54 5f 32 30 20 4e 45 54 5f 33 35 20 5c 0d  NET_20 NET_35 \.
20dd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 4e 45 54  .            NET
20de0 5f 34 30 20 4e 45 54 5f 34 35 20 4e 45 54 5f 34  _40 NET_45 NET_4
20df0 35 31 20 4e 45 54 5f 34 35 32 20 4e 45 54 5f 34  51 NET_452 NET_4
20e00 36 20 4e 45 54 5f 34 36 31 20 4e 45 54 5f 43 4f  6 NET_461 NET_CO
20e10 4d 50 41 43 54 5f 32 30 20 5c 0d 0a 20 20 20 20  MPACT_20 \..    
20e20 20 20 20 20 20 20 20 20 50 4c 41 54 46 4f 52 4d          PLATFORM
20e30 5f 43 4f 4d 50 41 43 54 46 52 41 4d 45 57 4f 52  _COMPACTFRAMEWOR
20e40 4b 20 50 52 45 4c 4f 41 44 5f 4e 41 54 49 56 45  K PRELOAD_NATIVE
20e50 5f 4c 49 42 52 41 52 59 20 52 45 54 41 52 47 45  _LIBRARY RETARGE
20e60 54 41 42 4c 45 20 5c 0d 0a 20 20 20 20 20 20 20  TABLE \..       
20e70 20 20 20 20 20 53 51 4c 49 54 45 5f 53 54 41 4e       SQLITE_STAN
20e80 44 41 52 44 20 54 48 52 4f 57 5f 4f 4e 5f 44 49  DARD THROW_ON_DI
20e90 53 50 4f 53 45 44 20 54 52 41 43 45 20 54 52 41  SPOSED TRACE TRA
20ea0 43 45 5f 43 4f 4e 4e 45 43 54 49 4f 4e 20 5c 0d  CE_CONNECTION \.
20eb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 52 41  .            TRA
20ec0 43 45 5f 44 45 54 45 43 54 49 4f 4e 20 54 52 41  CE_DETECTION TRA
20ed0 43 45 5f 48 41 4e 44 4c 45 20 54 52 41 43 45 5f  CE_HANDLE TRACE_
20ee0 50 52 45 4c 4f 41 44 20 54 52 41 43 45 5f 53 48  PRELOAD TRACE_SH
20ef0 41 52 45 44 20 5c 0d 0a 20 20 20 20 20 20 20 20  ARED \..        
20f00 20 20 20 20 54 52 41 43 45 5f 53 54 41 54 45 4d      TRACE_STATEM
20f10 45 4e 54 20 54 52 41 43 45 5f 57 41 52 4e 49 4e  ENT TRACE_WARNIN
20f20 47 20 54 52 41 43 4b 5f 4d 45 4d 4f 52 59 5f 42  G TRACK_MEMORY_B
20f30 59 54 45 53 20 5c 0d 0a 20 20 20 20 20 20 20 20  YTES \..        
20f40 20 20 20 20 55 53 45 5f 45 4e 54 49 54 59 5f 46      USE_ENTITY_F
20f50 52 41 4d 45 57 4f 52 4b 5f 36 20 55 53 45 5f 49  RAMEWORK_6 USE_I
20f60 4e 54 45 52 4f 50 5f 44 4c 4c 20 55 53 45 5f 50  NTEROP_DLL USE_P
20f70 52 45 50 41 52 45 5f 56 32 20 57 49 4e 44 4f 57  REPARE_V2 WINDOW
20f80 53 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  S] {..          
20f90 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
20fa0 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68  OTE: Check if th
20fb0 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  e compile-time o
20fc0 70 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64 20  ption is listed 
20fd0 69 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 0d 0a  in the list of..
20fe0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
20ff0 20 20 22 64 65 66 69 6e 65 20 63 6f 6e 73 74 61    "define consta
21000 6e 74 73 22 20 6b 65 70 74 20 74 72 61 63 6b 20  nts" kept track 
21010 6f 66 20 62 79 20 74 68 65 20 6d 61 6e 61 67 65  of by the manage
21020 64 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20  d assembly...   
21030 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
21040 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69      checkForSQLi
21050 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74  teDefineConstant
21060 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
21070 20 24 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74   $defineConstant
21080 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
21090 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
210a0 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
210b0 69 66 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61  if the System.Da
210c0 74 61 2e 53 51 4c 69 74 65 20 70 72 6f 76 69 64  ta.SQLite provid
210d0 65 72 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 20  er was compiled 
210e0 77 69 74 68 0d 0a 20 20 20 20 20 20 20 20 23 20  with..        # 
210f0 20 20 20 20 20 20 73 75 70 70 6f 72 74 20 66 6f        support fo
21100 72 20 61 6e 79 20 65 6e 63 72 79 70 74 65 64 20  r any encrypted 
21110 64 61 74 61 62 61 73 65 73 2e 0d 0a 20 20 20 20  databases...    
21120 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
21130 66 20 7b 5b 68 61 76 65 43 6f 6e 73 74 72 61 69  f {[haveConstrai
21140 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  nt \..          
21150 20 20 20 20 20 20 64 65 66 69 6e 65 43 6f 6e 73        defineCons
21160 74 61 6e 74 2e 53 79 73 74 65 6d 2e 44 61 74 61  tant.System.Data
21170 2e 53 51 4c 69 74 65 2e 49 4e 54 45 52 4f 50 5f  .SQLite.INTEROP_
21180 43 4f 44 45 43 5d 20 7c 7c 20 5c 0d 0a 20 20 20  CODEC] || \..   
21190 20 20 20 20 20 20 20 20 20 5b 68 61 76 65 43 6f           [haveCo
211a0 6e 73 74 72 61 69 6e 74 20 5c 0d 0a 20 20 20 20  nstraint \..    
211b0 20 20 20 20 20 20 20 20 20 20 20 20 64 65 66 69              defi
211c0 6e 65 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74 65  neConstant.Syste
211d0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 49 4e  m.Data.SQLite.IN
211e0 54 45 52 4f 50 5f 49 4e 43 4c 55 44 45 5f 53 45  TEROP_INCLUDE_SE
211f0 45 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  E]} then {..    
21200 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
21210 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20     # NOTE: Yes, 
21220 61 64 64 20 67 65 6e 65 72 69 63 20 63 6f 6e 73  add generic cons
21230 74 72 61 69 6e 74 20 66 6f 72 20 75 73 65 20 62  traint for use b
21240 79 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  y the test suite
21250 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
21260 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
21270 73 74 72 61 69 6e 74 20 53 79 73 74 65 6d 2e 44  straint System.D
21280 61 74 61 2e 53 51 4c 69 74 65 2e 45 6e 63 72 79  ata.SQLite.Encry
21290 70 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 7d  ption..        }
212a0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
212b0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
212c0 68 65 63 6b 20 74 68 65 20 63 75 72 72 65 6e 74  heck the current
212d0 20 62 75 69 6c 64 20 79 65 61 72 2e 20 20 42 61   build year.  Ba
212e0 73 69 63 61 6c 6c 79 2c 20 74 68 69 73 20 69 6e  sically, this in
212f0 64 69 63 61 74 65 73 0d 0a 20 20 20 20 20 20 20  dicates..       
21300 20 23 20 20 20 20 20 20 20 77 68 69 63 68 20 76   #       which v
21310 65 72 73 69 6f 6e 20 6f 66 20 4d 53 42 75 69 6c  ersion of MSBuil
21320 64 20 61 6e 64 2f 6f 72 20 56 69 73 75 61 6c 20  d and/or Visual 
21330 53 74 75 64 69 6f 20 77 61 73 20 75 73 65 64 20  Studio was used 
21340 74 6f 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  to..        #   
21350 20 20 20 20 63 6f 6d 70 69 6c 65 20 74 68 65 20      compile the 
21360 61 73 73 65 6d 62 6c 79 20 62 69 6e 61 72 69 65  assembly binarie
21370 73 20 75 6e 64 65 72 20 74 65 73 74 2e 0d 0a 20  s under test... 
21380 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
21390 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
213a0 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20  channel \..     
213b0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65         "---- che
213c0 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d  cking for System
213d0 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75 69  .Data.SQLite bui
213e0 6c 64 20 79 65 61 72 2e 2e 2e 20 22 0d 0a 0d 0a  ld year... "....
213f0 20 20 20 20 20 20 20 20 73 65 74 20 79 65 61 72          set year
21400 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72 5d 0d   [getBuildYear].
21410 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73  .        addCons
21420 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
21430 67 73 20 62 75 69 6c 64 59 65 61 72 2e 20 24 79  gs buildYear. $y
21440 65 61 72 5d 0d 0a 20 20 20 20 20 20 20 20 74 70  ear]..        tp
21450 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
21460 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
21470 5c 22 20 24 79 65 61 72 20 5c 22 5c 6e 5d 0d 0a  \" $year \"\n]..
21480 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
21490 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
214a0 63 6b 20 74 68 65 20 63 75 72 72 65 6e 74 20 62  ck the current b
214b0 75 69 6c 64 20 2e 4e 45 54 20 46 72 61 6d 65 77  uild .NET Framew
214c0 6f 72 6b 2e 20 20 42 61 73 69 63 61 6c 6c 79 2c  ork.  Basically,
214d0 20 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20 23   this..        #
214e0 20 20 20 20 20 20 20 69 6e 64 69 63 61 74 65 73         indicates
214f0 20 77 68 69 63 68 20 76 65 72 73 69 6f 6e 20 6f   which version o
21500 66 20 74 68 65 20 2e 4e 45 54 20 46 72 61 6d 65  f the .NET Frame
21510 77 6f 72 6b 20 69 73 20 62 65 69 6e 67 0d 0a 20  work is being.. 
21520 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75         #       u
21530 73 65 64 20 62 79 20 74 68 65 20 61 73 73 65 6d  sed by the assem
21540 62 6c 79 20 62 69 6e 61 72 69 65 73 20 75 6e 64  bly binaries und
21550 65 72 20 74 65 73 74 2e 0d 0a 20 20 20 20 20 20  er test...      
21560 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75    #..        tpu
21570 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
21580 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  el \..          
21590 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67    "---- checking
215a0 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61   for System.Data
215b0 2e 53 51 4c 69 74 65 20 62 75 69 6c 64 20 2e 4e  .SQLite build .N
215c0 45 54 20 46 72 61 6d 65 77 6f 72 6b 2e 2e 2e 20  ET Framework... 
215d0 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74  "....        set
215e0 20 6e 65 74 46 78 20 5b 67 65 74 42 75 69 6c 64   netFx [getBuild
215f0 4e 65 74 46 78 5d 0d 0a 20 20 20 20 20 20 20 20  NetFx]..        
21600 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  addConstraint [a
21610 70 70 65 6e 64 41 72 67 73 20 62 75 69 6c 64 46  ppendArgs buildF
21620 72 61 6d 65 77 6f 72 6b 2e 20 24 6e 65 74 46 78  ramework. $netFx
21630 5d 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  ]..        tputs
21640 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
21650 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20   [appendArgs \" 
21660 24 6e 65 74 46 78 20 5c 22 5c 6e 5d 0d 0a 0d 0a  $netFx \"\n]....
21670 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
21680 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
21690 20 74 68 65 20 63 75 72 72 65 6e 74 20 62 75 69   the current bui
216a0 6c 64 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ld configuration
216b0 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e  .  This should n
216c0 6f 72 6d 61 6c 6c 79 0d 0a 20 20 20 20 20 20 20  ormally..       
216d0 20 23 20 20 20 20 20 20 20 62 65 20 65 69 74 68   #       be eith
216e0 65 72 20 22 44 65 62 75 67 22 20 6f 72 20 22 52  er "Debug" or "R
216f0 65 6c 65 61 73 65 22 2e 0d 0a 20 20 20 20 20 20  elease"...      
21700 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75    #..        tpu
21710 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
21720 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  el \..          
21730 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67    "---- checking
21740 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61   for System.Data
21750 2e 53 51 4c 69 74 65 20 62 75 69 6c 64 20 63 6f  .SQLite build co
21760 6e 66 69 67 75 72 61 74 69 6f 6e 2e 2e 2e 20 22  nfiguration... "
21770 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
21780 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 5b 67  configuration [g
21790 65 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72 61  etBuildConfigura
217a0 74 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 20 20 61  tion]..        a
217b0 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  ddConstraint [ap
217c0 70 65 6e 64 41 72 67 73 20 62 75 69 6c 64 43 6f  pendArgs buildCo
217d0 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 24 63 6f  nfiguration. $co
217e0 6e 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 20 20  nfiguration]..  
217f0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
21800 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
21810 65 6e 64 41 72 67 73 20 5c 22 20 24 63 6f 6e 66  endArgs \" $conf
21820 69 67 75 72 61 74 69 6f 6e 20 5c 22 5c 6e 5d 0d  iguration \"\n].
21830 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
21840 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 72        # NOTE: Tr
21850 79 20 74 6f 20 73 65 74 75 70 20 61 6e 20 69 6e  y to setup an in
21860 74 65 72 72 75 70 74 20 63 61 6c 6c 62 61 63 6b  terrupt callback
21870 20 75 73 69 6e 67 20 74 68 65 20 73 63 72 69 70   using the scrip
21880 74 20 64 65 62 75 67 67 65 72 0d 0a 20 20 20 20  t debugger..    
21890 20 20 20 20 23 20 20 20 20 20 20 20 74 68 61 74      #       that
218a0 20 77 69 6c 6c 20 63 61 6e 63 65 6c 20 61 6c 6c   will cancel all
218b0 20 53 51 4c 20 71 75 65 72 69 65 73 20 69 6e 20   SQL queries in 
218c0 70 72 6f 67 72 65 73 73 20 66 6f 72 20 61 6c 6c  progress for all
218d0 20 64 61 74 61 62 61 73 65 0d 0a 20 20 20 20 20   database..     
218e0 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 6e 65     #       conne
218f0 63 74 69 6f 6e 73 20 6b 6e 6f 77 6e 20 74 6f 20  ctions known to 
21900 74 68 69 73 20 69 6e 74 65 72 70 72 65 74 65 72  this interpreter
21910 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
21920 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
21930 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c   exists ::no(sql
21940 69 74 65 49 6e 74 65 72 72 75 70 74 43 61 6c 6c  iteInterruptCall
21950 62 61 63 6b 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  back)]} then {..
21960 20 20 20 20 20 20 20 20 20 20 73 65 74 75 70 44            setupD
21970 62 49 6e 74 65 72 72 75 70 74 43 61 6c 6c 62 61  bInterruptCallba
21980 63 6b 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ck $::test_chann
21990 65 6c 20 24 3a 3a 74 65 73 74 5f 6c 6f 67 0d 0a  el $::test_log..
219a0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
219b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
219c0 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f  # NOTE: Check fo
219d0 72 20 74 68 65 20 6e 61 74 69 76 65 20 72 75 6e  r the native run
219e0 74 69 6d 65 20 6f 70 74 69 6f 6e 2c 20 77 68 69  time option, whi
219f0 63 68 20 77 6f 75 6c 64 20 6d 65 61 6e 20 77 65  ch would mean we
21a00 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20   are..        # 
21a10 20 20 20 20 20 20 75 73 69 6e 67 20 74 68 65 20        using the 
21a20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d  mixed-mode assem
21a30 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  bly...        #.
21a40 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f  .        checkFo
21a50 72 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 24  rRuntimeOption $
21a60 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 6e  ::test_channel n
21a70 61 74 69 76 65 0d 0a 0d 0a 20 20 20 20 20 20 20  ative....       
21a80 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
21a90 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65  TE: Check if the
21aa0 20 74 65 73 74 20 73 75 69 74 65 20 73 68 6f 75   test suite shou
21ab0 6c 64 20 63 6f 75 6e 74 20 74 68 65 20 6e 75 6d  ld count the num
21ac0 62 65 72 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f  ber of connectio
21ad0 6e 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ns..        #   
21ae0 20 20 20 20 22 6f 70 65 6e 65 64 22 20 61 6e 64      "opened" and
21af0 20 22 63 6c 6f 73 65 64 22 20 66 72 6f 6d 20 74   "closed" from t
21b00 68 65 20 70 6f 6f 6c 20 77 68 65 6e 20 64 65 74  he pool when det
21b10 65 72 6d 69 6e 69 6e 67 20 69 66 20 61 20 74 65  ermining if a te
21b20 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  st..        #   
21b30 20 20 20 20 70 61 73 73 65 64 2e 20 20 44 69 73      passed.  Dis
21b40 61 62 6c 69 6e 67 20 74 68 69 73 20 62 65 68 61  abling this beha
21b50 76 69 6f 72 20 69 73 20 73 6f 6d 65 74 69 6d 65  vior is sometime
21b60 73 20 6e 65 63 65 73 73 61 72 79 20 28 65 2e 67  s necessary (e.g
21b70 2e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ...        #    
21b80 20 20 20 64 75 72 69 6e 67 20 74 68 65 20 72 65     during the re
21b90 6c 65 61 73 65 20 74 65 73 74 69 6e 67 20 70 72  lease testing pr
21ba0 6f 63 65 73 73 29 20 62 65 63 61 75 73 65 20 74  ocess) because t
21bb0 68 65 72 65 20 61 72 65 20 73 65 76 65 72 61 6c  here are several
21bc0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
21bd0 20 20 74 65 73 74 73 20 74 68 61 74 20 72 65 6c    tests that rel
21be0 79 20 6f 6e 20 74 68 65 20 22 6f 70 65 6e 65 64  y on the "opened
21bf0 20 66 72 6f 6d 20 70 6f 6f 6c 22 20 63 6f 75 6e   from pool" coun
21c00 74 20 62 65 69 6e 67 20 67 72 65 61 74 65 72 0d  t being greater.
21c10 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
21c20 20 74 68 61 6e 20 7a 65 72 6f 2e 20 20 54 68 65   than zero.  The
21c30 73 65 20 74 65 73 74 73 20 6d 61 79 20 66 61 69  se tests may fai
21c40 6c 20 64 75 65 20 74 6f 20 74 68 65 20 6e 6f 6e  l due to the non
21c50 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 0d 0a  -deterministic..
21c60 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
21c70 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20  behavior of the 
21c80 43 4c 52 20 47 43 2c 20 65 76 65 6e 20 77 68 65  CLR GC, even whe
21c90 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 62 75  n there is no bu
21ca0 67 20 69 6e 20 74 68 65 20 63 6f 64 65 0d 0a 20  g in the code.. 
21cb0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62         #       b
21cc0 65 69 6e 67 20 74 65 73 74 65 64 2e 0d 0a 20 20  eing tested...  
21cd0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
21ce0 20 63 68 65 63 6b 46 6f 72 52 75 6e 74 69 6d 65   checkForRuntime
21cf0 4f 70 74 69 6f 6e 20 24 3a 3a 74 65 73 74 5f 63  Option $::test_c
21d00 68 61 6e 6e 65 6c 20 6e 6f 50 6f 6f 6c 43 6f 75  hannel noPoolCou
21d10 6e 74 73 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  nts....        #
21d20 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
21d30 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 74  : Check if the t
21d40 65 73 74 20 73 75 69 74 65 20 73 68 6f 75 6c 64  est suite should
21d50 20 75 73 65 20 73 68 61 72 65 64 2d 63 61 63 68   use shared-cach
21d60 65 20 6d 6f 64 65 2e 0d 0a 20 20 20 20 20 20 20  e mode...       
21d70 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63   #..        chec
21d80 6b 46 6f 72 52 75 6e 74 69 6d 65 4f 70 74 69 6f  kForRuntimeOptio
21d90 6e 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  n $::test_channe
21da0 6c 20 73 68 61 72 65 64 43 61 63 68 65 0d 0a 0d  l sharedCache...
21db0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
21dc0 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 70 6f      # NOTE: Repo
21dd0 72 74 20 74 68 65 20 72 65 73 6f 75 72 63 65 20  rt the resource 
21de0 75 73 61 67 65 20 70 72 69 6f 72 20 74 6f 20 72  usage prior to r
21df0 75 6e 6e 69 6e 67 20 61 6e 79 20 74 65 73 74 73  unning any tests
21e00 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
21e10 20 20 20 20 20 20 72 65 70 6f 72 74 53 51 4c 69        reportSQLi
21e20 74 65 52 65 73 6f 75 72 63 65 73 20 24 3a 3a 74  teResources $::t
21e30 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20  est_channel.... 
21e40 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
21e50 20 20 23 20 4e 4f 54 45 3a 20 47 72 61 62 20 74    # NOTE: Grab t
21e60 68 65 20 6c 69 73 74 20 6f 66 20 6e 61 74 69 76  he list of nativ
21e70 65 20 6d 6f 64 75 6c 65 73 20 66 6f 72 20 74 68  e modules for th
21e80 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73  e current proces
21e90 73 20 61 6e 64 0d 0a 20 20 20 20 20 20 20 20 23  s and..        #
21ea0 20 20 20 20 20 20 20 72 65 70 6f 72 74 20 6f 6e         report on
21eb0 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61   the System.Data
21ec0 2e 53 51 4c 69 74 65 20 72 65 6c 61 74 65 64 20  .SQLite related 
21ed0 6f 6e 65 73 2e 0d 0a 20 20 20 20 20 20 20 20 23  ones...        #
21ee0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68  ..        if {[h
21ef0 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43  aveSQLiteObjectC
21f00 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d  ommand]} then {.
21f10 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6d  .          set m
21f20 6f 64 75 6c 65 73 20 5b 6f 62 6a 65 63 74 20 69  odules [object i
21f30 6e 76 6f 6b 65 20 5c 0d 0a 20 20 20 20 20 20 20  nvoke \..       
21f40 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 69         System.Di
21f50 61 67 6e 6f 73 74 69 63 73 2e 50 72 6f 63 65 73  agnostics.Proces
21f60 73 2e 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  s.GetCurrentProc
21f70 65 73 73 20 4d 6f 64 75 6c 65 73 5d 0d 0a 0d 0a  ess Modules]....
21f80 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
21f90 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20   foreach -alias 
21fa0 6d 6f 64 75 6c 65 20 24 6d 6f 64 75 6c 65 73 20  module $modules 
21fb0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  {..            #
21fc0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
21fd0 4e 4f 54 45 3a 20 54 68 65 20 6d 6f 64 75 6c 65  NOTE: The module
21fe0 20 66 69 6c 65 20 6e 61 6d 65 20 68 65 72 65 20   file name here 
21ff0 6d 75 73 74 20 62 65 20 6e 6f 72 6d 61 6c 69 7a  must be normaliz
22000 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ed...           
22010 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
22020 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69  set fileName [fi
22030 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65 20 5b 24 6d  le normalize [$m
22040 6f 64 75 6c 65 20 46 69 6c 65 4e 61 6d 65 5d 5d  odule FileName]]
22050 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
22060 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63  if {[string matc
22070 68 20 2d 6e 6f 63 61 73 65 20 2a 2f 73 71 6c 69  h -nocase */sqli
22080 74 65 33 2e 64 6c 6c 20 24 66 69 6c 65 4e 61 6d  te3.dll $fileNam
22090 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
220a0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
220b0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
220c0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
220d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220e0 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c 6f 61   "---- found loa
220f0 64 65 64 20 53 51 4c 69 74 65 20 6e 61 74 69 76  ded SQLite nativ
22100 65 20 6c 69 62 72 61 72 79 20 6d 6f 64 75 6c 65  e library module
22110 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  : " \..         
22120 20 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61           $fileNa
22130 6d 65 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  me \n]..        
22140 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 73      } elseif {[s
22150 74 72 69 6e 67 20 6d 61 74 63 68 20 5c 0d 0a 20  tring match \.. 
22160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
22170 6e 6f 63 61 73 65 20 2a 2f 53 51 4c 69 74 65 2e  nocase */SQLite.
22180 49 6e 74 65 72 6f 70 2e 64 6c 6c 20 24 66 69 6c  Interop.dll $fil
22190 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
221a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
221b0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
221c0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
221d0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
221e0 20 20 20 20 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64       "---- found
221f0 20 6c 6f 61 64 65 64 20 53 51 4c 69 74 65 20 69   loaded SQLite i
22200 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20  nterop assembly 
22210 6d 6f 64 75 6c 65 3a 20 22 20 5c 0d 0a 20 20 20  module: " \..   
22220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
22230 66 69 6c 65 4e 61 6d 65 20 5c 6e 5d 0d 0a 20 20  fileName \n]..  
22240 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
22250 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
22260 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63    }....        c
22270 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
22280 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
22290 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20  channel \..     
222a0 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
222b0 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69  ompile-time opti
222c0 6f 6e 73 20 66 6f 72 20 53 51 4c 69 74 65 20 63  ons for SQLite c
222d0 6f 72 65 20 6c 69 62 72 61 72 79 2e 2e 2e 20 22  ore library... "
222e0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
222f0 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
22300 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
22310 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
22320 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
22330 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
22340 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51  m.Data.SQLite.SQ
22350 4c 69 74 65 33 20 53 51 4c 69 74 65 43 6f 6d 70  Lite3 SQLiteComp
22360 69 6c 65 4f 70 74 69 6f 6e 73 0d 0a 20 20 20 20  ileOptions..    
22370 20 20 20 20 20 20 7d 20 63 6f 6d 70 69 6c 65 4f        } compileO
22380 70 74 69 6f 6e 73 5d 20 3d 3d 20 30 7d 20 74 68  ptions] == 0} th
22390 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
223a0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
223b0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
223c0 72 67 73 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20  rgs [formatList 
223d0 5b 6c 73 6f 72 74 20 5c 0d 0a 20 20 20 20 20 20  [lsort \..      
223e0 20 20 20 20 20 20 20 20 20 20 24 63 6f 6d 70 69            $compi
223f0 6c 65 4f 70 74 69 6f 6e 73 5d 20 3c 6e 6f 6e 65  leOptions] <none
22400 3e 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  >] \n]..        
22410 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
22420 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
22430 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e  :test_channel un
22440 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20  known\n..       
22450 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
22460 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68  ...        catch
22470 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
22480 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
22490 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  nel \..         
224a0 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 6d 70 69       "---- compi
224b0 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20  le-time options 
224c0 66 6f 72 20 53 51 4c 69 74 65 20 69 6e 74 65 72  for SQLite inter
224d0 6f 70 20 61 73 73 65 6d 62 6c 79 2e 2e 2e 20 22  op assembly... "
224e0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
224f0 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
22500 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
22510 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
22520 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
22530 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
22540 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51  m.Data.SQLite.SQ
22550 4c 69 74 65 33 20 49 6e 74 65 72 6f 70 43 6f 6d  Lite3 InteropCom
22560 70 69 6c 65 4f 70 74 69 6f 6e 73 0d 0a 20 20 20  pileOptions..   
22570 20 20 20 20 20 20 20 7d 20 63 6f 6d 70 69 6c 65         } compile
22580 4f 70 74 69 6f 6e 73 5d 20 3d 3d 20 30 7d 20 74  Options] == 0} t
22590 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
225a0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
225b0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
225c0 41 72 67 73 20 5b 66 6f 72 6d 61 74 4c 69 73 74  Args [formatList
225d0 20 5b 6c 73 6f 72 74 20 5c 0d 0a 20 20 20 20 20   [lsort \..     
225e0 20 20 20 20 20 20 20 20 20 20 20 24 63 6f 6d 70             $comp
225f0 69 6c 65 4f 70 74 69 6f 6e 73 5d 20 3c 6e 6f 6e  ileOptions] <non
22600 65 3e 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  e>] \n]..       
22610 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
22620 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
22630 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75  ::test_channel u
22640 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20  nknown\n..      
22650 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
22660 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
22670 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
22680 68 6f 77 20 74 68 65 20 61 63 74 69 76 65 20 74  how the active t
22690 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  est constraints.
226a0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
226b0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
226c0 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
226d0 6e 64 41 72 67 73 20 22 2d 2d 2d 2d 20 63 6f 6e  ndArgs "---- con
226e0 73 74 72 61 69 6e 74 73 3a 20 22 20 5c 0d 0a 20  straints: " \.. 
226f0 20 20 20 20 20 20 20 20 20 20 20 5b 66 6f 72 6d             [form
22700 61 74 4c 69 73 74 20 5b 6c 73 6f 72 74 20 5b 67  atList [lsort [g
22710 65 74 43 6f 6e 73 74 72 61 69 6e 74 73 5d 5d 20  etConstraints]] 
22720 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a 0d 0a 20  <none>] \n].... 
22730 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
22740 20 20 23 20 4e 4f 54 45 3a 20 53 61 76 65 20 74    # NOTE: Save t
22750 68 65 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69  he test constrai
22760 6e 74 73 20 66 6f 72 20 75 73 65 20 62 79 20 74  nts for use by t
22770 68 72 65 61 64 73 20 63 72 65 61 74 65 64 20 69  hreads created i
22780 6e 20 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20  n this..        
22790 23 20 20 20 20 20 20 20 61 70 70 6c 69 63 61 74  #       applicat
227a0 69 6f 6e 20 64 6f 6d 61 69 6e 2e 20 20 54 68 69  ion domain.  Thi
227b0 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62  s is necessary b
227c0 65 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20 45  ecause all the E
227d0 61 67 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20  agle..        # 
227e0 20 20 20 20 20 20 22 74 65 73 74 20 63 6f 6e 74        "test cont
227f0 65 78 74 22 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ext" information
22800 20 69 73 20 70 65 72 2d 74 68 72 65 61 64 2e 0d   is per-thread..
22810 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
22820 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
22830 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 63 6f 6e  xists ::test_con
22840 73 74 72 61 69 6e 74 73 5d 7d 20 74 68 65 6e 20  straints]} then 
22850 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
22860 20 3a 3a 74 65 73 74 5f 63 6f 6e 73 74 72 61 69   ::test_constrai
22870 6e 74 73 20 24 3a 3a 65 61 67 6c 65 5f 74 65 73  nts $::eagle_tes
22880 74 73 28 63 6f 6e 73 74 72 61 69 6e 74 73 29 0d  ts(constraints).
22890 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
228a0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
228b0 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 74 68   # NOTE: Load th
228c0 65 20 22 61 66 74 65 72 2d 63 6f 6e 73 74 72 61  e "after-constra
228d0 69 6e 74 73 22 20 63 75 73 74 6f 6d 20 70 65 72  ints" custom per
228e0 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20 70 65 72  -user and/or per
228f0 2d 68 6f 73 74 0d 0a 20 20 20 20 20 20 20 20 23  -host..        #
22900 20 20 20 20 20 20 20 74 65 73 74 20 73 65 74 74         test sett
22910 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  ings now...     
22920 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 75 70     #..        up
22930 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 6c 6f  level 1 [list lo
22940 61 64 53 51 4c 69 74 65 54 65 73 74 53 65 74 74  adSQLiteTestSett
22950 69 6e 67 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  ings $::test_cha
22960 6e 6e 65 6c 20 2e 61 66 74 65 72 5d 0d 0a 0d 0a  nnel .after]....
22970 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
22980 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6e 65     # NOTE: If ne
22990 63 65 73 73 61 72 79 2c 20 65 6e 61 62 6c 65 20  cessary, enable 
229a0 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64  shared-cache mod
229b0 65 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20  e now...        
229c0 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  #..        if {[
229d0 68 61 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  hasRuntimeOption
229e0 20 73 68 61 72 65 64 43 61 63 68 65 5d 7d 20 74   sharedCache]} t
229f0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
22a00 20 65 6e 61 62 6c 65 53 68 61 72 65 64 43 61 63   enableSharedCac
22a10 68 65 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  he $::test_chann
22a20 65 6c 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20  el true..       
22a30 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
22a40 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
22a50 20 53 68 6f 77 20 77 68 65 6e 20 6f 75 72 20 74   Show when our t
22a60 65 73 74 73 20 61 63 74 75 61 6c 6c 79 20 62 65  ests actually be
22a70 67 61 6e 20 28 6e 6f 77 29 2e 0d 0a 20 20 20 20  gan (now)...    
22a80 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74      #..        t
22a90 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
22aa0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
22ab0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
22ac0 22 2d 2d 2d 2d 20 53 79 73 74 65 6d 2e 44 61 74  "---- System.Dat
22ad0 61 2e 53 51 4c 69 74 65 20 74 65 73 74 73 20 62  a.SQLite tests b
22ae0 65 67 61 6e 20 61 74 20 22 20 5c 0d 0a 20 20 20  egan at " \..   
22af0 20 20 20 20 20 20 20 20 20 5b 63 6c 6f 63 6b 20           [clock 
22b00 66 6f 72 6d 61 74 20 5b 63 6c 6f 63 6b 20 73 65  format [clock se
22b10 63 6f 6e 64 73 5d 5d 20 5c 6e 5d 0d 0a 20 20 20  conds]] \n]..   
22b20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
22b30 20 20 20 20 70 72 6f 63 20 72 75 6e 53 51 4c 69      proc runSQLi
22b40 74 65 54 65 73 74 46 69 6c 65 73 50 72 6f 6c 6f  teTestFilesProlo
22b50 67 75 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  gue {} {..      
22b60 75 70 6c 65 76 65 6c 20 31 20 7b 0d 0a 20 20 20  uplevel 1 {..   
22b70 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
22b80 23 20 4e 4f 54 45 3a 20 53 65 74 75 70 20 74 68  # NOTE: Setup th
22b90 65 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74  e variables that
22ba0 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 76 61   refer to the va
22bb0 72 69 6f 75 73 20 6e 6f 6e 2d 64 61 74 61 20 66  rious non-data f
22bc0 69 6c 65 73 0d 0a 20 20 20 20 20 20 20 20 23 20  iles..        # 
22bd0 20 20 20 20 20 20 72 65 71 75 69 72 65 64 20 62        required b
22be0 79 20 74 68 65 20 74 65 73 74 73 20 69 6e 20 74  y the tests in t
22bf0 68 69 73 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20  his file...     
22c00 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65     #..        se
22c10 74 20 65 6e 74 69 74 79 46 72 61 6d 65 77 6f 72  t entityFramewor
22c20 6b 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20  kDllFile \..    
22c30 20 20 20 20 20 20 20 20 5b 67 65 74 42 75 69 6c          [getBuil
22c40 64 46 69 6c 65 4e 61 6d 65 20 45 6e 74 69 74 79  dFileName Entity
22c50 46 72 61 6d 65 77 6f 72 6b 2e 64 6c 6c 5d 0d 0a  Framework.dll]..
22c60 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 69 6e  ..        set in
22c70 73 74 61 6c 6c 65 72 45 78 65 46 69 6c 65 20 5b  stallerExeFile [
22c80 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65  getBuildFileName
22c90 20 49 6e 73 74 61 6c 6c 65 72 2e 65 78 65 5d 0d   Installer.exe].
22ca0 0a 20 20 20 20 20 20 20 20 73 65 74 20 73 71 6c  .        set sql
22cb0 69 74 65 44 65 73 69 67 6e 65 72 44 6c 6c 46 69  iteDesignerDllFi
22cc0 6c 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65  le [getBuildFile
22cd0 4e 61 6d 65 20 53 51 4c 69 74 65 2e 44 65 73 69  Name SQLite.Desi
22ce0 67 6e 65 72 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20  gner.dll]....   
22cf0 20 20 20 20 20 73 65 74 20 73 79 73 74 65 6d 44       set systemD
22d00 61 74 61 53 51 4c 69 74 65 44 6c 6c 46 69 6c 65  ataSQLiteDllFile
22d10 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
22d20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d  [getBuildFileNam
22d30 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  e System.Data.SQ
22d40 4c 69 74 65 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20  Lite.dll]....   
22d50 20 20 20 20 20 73 65 74 20 73 79 73 74 65 6d 44       set systemD
22d60 61 74 61 53 51 4c 69 74 65 4c 69 6e 71 44 6c 6c  ataSQLiteLinqDll
22d70 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  File \..        
22d80 20 20 20 20 5b 67 65 74 42 75 69 6c 64 46 69 6c      [getBuildFil
22d90 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74  eName System.Dat
22da0 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c  a.SQLite.Linq.dl
22db0 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65  l]....        se
22dc0 74 20 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69  t systemDataSQLi
22dd0 74 65 45 66 36 44 6c 6c 46 69 6c 65 20 5c 0d 0a  teEf6DllFile \..
22de0 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
22df0 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 53 79  BuildFileName Sy
22e00 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
22e10 2e 45 46 36 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20  .EF6.dll]....   
22e20 20 20 20 20 20 73 65 74 20 74 65 73 74 45 78 65       set testExe
22e30 46 69 6c 65 20 5b 67 65 74 42 75 69 6c 64 46 69  File [getBuildFi
22e40 6c 65 4e 61 6d 65 20 74 65 73 74 2e 65 78 65 5d  leName test.exe]
22e50 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 65  ..        set te
22e60 73 74 4c 69 6e 71 45 78 65 46 69 6c 65 20 5b 67  stLinqExeFile [g
22e70 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20  etBuildFileName 
22e80 74 65 73 74 6c 69 6e 71 2e 65 78 65 5d 0d 0a 20  testlinq.exe].. 
22e90 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74 45         set testE
22ea0 66 36 45 78 65 46 69 6c 65 20 5b 67 65 74 42 75  f6ExeFile [getBu
22eb0 69 6c 64 46 69 6c 65 4e 61 6d 65 20 74 65 73 74  ildFileName test
22ec0 65 66 36 2e 65 78 65 5d 0d 0a 0d 0a 20 20 20 20  ef6.exe]....    
22ed0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
22ee0 20 4e 4f 54 45 3a 20 53 65 74 75 70 20 74 68 65   NOTE: Setup the
22ef0 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20   variables that 
22f00 72 65 66 65 72 20 74 6f 20 74 68 65 20 76 61 72  refer to the var
22f10 69 6f 75 73 20 64 61 74 61 20 66 69 6c 65 73 0d  ious data files.
22f20 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
22f30 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
22f40 20 74 65 73 74 73 20 69 6e 20 74 68 69 73 20 66   tests in this f
22f50 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ile...        #.
22f60 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73  .        set tes
22f70 74 4c 69 6e 71 4f 75 74 46 69 6c 65 20 5b 66 69  tLinqOutFile [fi
22f80 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
22f90 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20  ile join \..    
22fa0 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69          [getSQLi
22fb0 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20  teTestDataPath] 
22fc0 74 65 73 74 6c 69 6e 71 2e 6f 75 74 5d 5d 0d 0a  testlinq.out]]..
22fd0 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 6f  ..        set no
22fe0 72 74 68 77 69 6e 64 45 66 44 62 46 69 6c 65 20  rthwindEfDbFile 
22ff0 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
23000 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20   [file join \.. 
23010 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
23020 20 64 69 72 6e 61 6d 65 20 5b 66 69 6c 65 20 64   dirname [file d
23030 69 72 6e 61 6d 65 20 5b 67 65 74 53 51 4c 69 74  irname [getSQLit
23040 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 5d 5d  eTestDataPath]]]
23050 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
23060 74 65 73 74 6c 69 6e 71 20 6e 6f 72 74 68 77 69  testlinq northwi
23070 6e 64 45 46 2e 64 62 5d 5d 0d 0a 0d 0a 20 20 20  ndEF.db]]....   
23080 20 20 20 20 20 73 65 74 20 6e 6f 6e 57 61 6c 44       set nonWalD
23090 62 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69  bFile [file nati
230a0 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  vename [file joi
230b0 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
230c0 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44   [getSQLiteTestD
230d0 61 74 61 50 61 74 68 5d 20 6e 6f 6e 57 61 6c 2e  ataPath] nonWal.
230e0 64 62 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  db]]....        
230f0 73 65 74 20 77 61 6c 44 62 46 69 6c 65 20 5b 66  set walDbFile [f
23100 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b  ile nativename [
23110 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20  file join \..   
23120 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c           [getSQL
23130 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d  iteTestDataPath]
23140 20 77 61 6c 2e 64 62 5d 5d 0d 0a 0d 0a 20 20 20   wal.db]]....   
23150 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
23160 23 20 4e 4f 54 45 3a 20 54 68 65 20 76 61 72 69  # NOTE: The vari
23170 6f 75 73 20 69 6e 73 74 61 6c 6c 2f 75 6e 69 6e  ous install/unin
23180 73 74 61 6c 6c 20 6c 6f 67 20 66 69 6c 65 73 20  stall log files 
23190 75 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 65  used to test the
231a0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
231b0 20 20 64 65 73 69 67 6e 2d 74 69 6d 65 20 63 6f    design-time co
231c0 6d 70 6f 6e 65 6e 74 20 69 6e 73 74 61 6c 6c 65  mponent installe
231d0 72 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  r...        #.. 
231e0 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74 49         set testI
231f0 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46  nstallVs2005LogF
23200 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ile [file native
23210 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
23220 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
23230 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74  getSQLiteTestDat
23240 61 50 61 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72  aPath] Installer
23250 5f 54 65 73 74 5f 56 73 32 30 30 35 2e 6c 6f 67  _Test_Vs2005.log
23260 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65  ]]....        se
23270 74 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32  t testInstallVs2
23280 30 30 38 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65  008LogFile [file
23290 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
232a0 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20  e join \..      
232b0 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65        [getSQLite
232c0 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 49 6e  TestDataPath] In
232d0 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32  staller_Test_Vs2
232e0 30 30 38 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20  008.log]]....   
232f0 20 20 20 20 20 73 65 74 20 74 65 73 74 49 6e 73       set testIns
23300 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c  tallVs2010LogFil
23310 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
23320 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d  me [file join \.
23330 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65  .            [ge
23340 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50  tSQLiteTestDataP
23350 61 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54  ath] Installer_T
23360 65 73 74 5f 56 73 32 30 31 30 2e 6c 6f 67 5d 5d  est_Vs2010.log]]
23370 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
23380 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31  testInstallVs201
23390 32 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e  2LogFile [file n
233a0 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
233b0 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  join \..        
233c0 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65      [getSQLiteTe
233d0 73 74 44 61 74 61 50 61 74 68 5d 20 49 6e 73 74  stDataPath] Inst
233e0 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31  aller_Test_Vs201
233f0 32 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20  2.log]]....     
23400 20 20 20 73 65 74 20 74 65 73 74 49 6e 73 74 61     set testInsta
23410 6c 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 20  llVs2013LogFile 
23420 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
23430 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20   [file join \.. 
23440 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53             [getS
23450 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74  QLiteTestDataPat
23460 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54 65 73  h] Installer_Tes
23470 74 5f 56 73 32 30 31 33 2e 6c 6f 67 5d 5d 0d 0a  t_Vs2013.log]]..
23480 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 65  ..        set te
23490 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c  stInstallVs2015L
234a0 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74  ogFile [file nat
234b0 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
234c0 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  in \..          
234d0 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74    [getSQLiteTest
234e0 44 61 74 61 50 61 74 68 5d 20 49 6e 73 74 61 6c  DataPath] Instal
234f0 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31 35 2e  ler_Test_Vs2015.
23500 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  log]]....       
23510 20 73 65 74 20 74 65 73 74 55 6e 69 6e 73 74 61   set testUninsta
23520 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 20  llVs2005LogFile 
23530 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
23540 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20   [file join \.. 
23550 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53             [getS
23560 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74  QLiteTestDataPat
23570 68 5d 20 55 6e 69 6e 73 74 61 6c 6c 65 72 5f 54  h] Uninstaller_T
23580 65 73 74 5f 56 73 32 30 30 35 2e 6c 6f 67 5d 5d  est_Vs2005.log]]
23590 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
235a0 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
235b0 30 30 38 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65  008LogFile [file
235c0 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
235d0 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20  e join \..      
235e0 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65        [getSQLite
235f0 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 55 6e  TestDataPath] Un
23600 69 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56  installer_Test_V
23610 73 32 30 30 38 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20  s2008.log]].... 
23620 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74 55         set testU
23630 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f  ninstallVs2010Lo
23640 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69  gFile [file nati
23650 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  vename [file joi
23660 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
23670 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44   [getSQLiteTestD
23680 61 74 61 50 61 74 68 5d 20 55 6e 69 6e 73 74 61  ataPath] Uninsta
23690 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31 30  ller_Test_Vs2010
236a0 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  .log]]....      
236b0 20 20 73 65 74 20 74 65 73 74 55 6e 69 6e 73 74    set testUninst
236c0 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65  allVs2012LogFile
236d0 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
236e0 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a  e [file join \..
236f0 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
23700 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61  SQLiteTestDataPa
23710 74 68 5d 20 55 6e 69 6e 73 74 61 6c 6c 65 72 5f  th] Uninstaller_
23720 54 65 73 74 5f 56 73 32 30 31 32 2e 6c 6f 67 5d  Test_Vs2012.log]
23730 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74  ]....        set
23740 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73   testUninstallVs
23750 32 30 31 33 4c 6f 67 46 69 6c 65 20 5b 66 69 6c  2013LogFile [fil
23760 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69  e nativename [fi
23770 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20  le join \..     
23780 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74         [getSQLit
23790 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 55  eTestDataPath] U
237a0 6e 69 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f  ninstaller_Test_
237b0 56 73 32 30 31 33 2e 6c 6f 67 5d 5d 0d 0a 0d 0a  Vs2013.log]]....
237c0 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74          set test
237d0 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c  UninstallVs2015L
237e0 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74  ogFile [file nat
237f0 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
23800 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  in \..          
23810 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74    [getSQLiteTest
23820 44 61 74 61 50 61 74 68 5d 20 55 6e 69 6e 73 74  DataPath] Uninst
23830 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31  aller_Test_Vs201
23840 35 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20  5.log]]....     
23850 20 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23     #############
23860 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
23870 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
23880 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
23890 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20  ##########....  
238a0 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
238b0 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
238c0 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
238d0 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
238e0 65 20 74 61 69 6c 20 24 65 6e 74 69 74 79 46 72  e tail $entityFr
238f0 61 6d 65 77 6f 72 6b 44 6c 6c 46 69 6c 65 5d 5d  ameworkDllFile]]
23900 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
23910 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
23920 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
23930 24 65 6e 74 69 74 79 46 72 61 6d 65 77 6f 72 6b  $entityFramework
23940 44 6c 6c 46 69 6c 65 0d 0a 20 20 20 20 20 20 20  DllFile..       
23950 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
23960 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69   {![haveConstrai
23970 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
23980 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ile_ \..        
23990 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
239a0 69 6e 73 74 61 6c 6c 65 72 45 78 65 46 69 6c 65  installerExeFile
239b0 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
239c0 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
239d0 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
239e0 6c 20 24 69 6e 73 74 61 6c 6c 65 72 45 78 65 46  l $installerExeF
239f0 69 6c 65 20 49 6e 73 74 61 6c 6c 65 72 2e 65 78  ile Installer.ex
23a00 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  e..        }....
23a10 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61          if {![ha
23a20 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
23a30 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c  pendArgs file_ \
23a40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
23a50 69 6c 65 20 74 61 69 6c 20 24 73 71 6c 69 74 65  ile tail $sqlite
23a60 44 65 73 69 67 6e 65 72 44 6c 6c 46 69 6c 65 5d  DesignerDllFile]
23a70 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
23a80 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69        checkForFi
23a90 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c  le $test_channel
23aa0 20 24 73 71 6c 69 74 65 44 65 73 69 67 6e 65 72   $sqliteDesigner
23ab0 44 6c 6c 46 69 6c 65 0d 0a 20 20 20 20 20 20 20  DllFile..       
23ac0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
23ad0 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69   {![haveConstrai
23ae0 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
23af0 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ile_ \..        
23b00 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
23b10 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65  systemDataSQLite
23b20 44 6c 6c 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  DllFile]]]} then
23b30 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   {..          ch
23b40 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74  eckForFile $test
23b50 5f 63 68 61 6e 6e 65 6c 20 24 73 79 73 74 65 6d  _channel $system
23b60 44 61 74 61 53 51 4c 69 74 65 44 6c 6c 46 69 6c  DataSQLiteDllFil
23b70 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  e..        }....
23b80 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61          if {![ha
23b90 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
23ba0 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c  pendArgs file_ \
23bb0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
23bc0 69 6c 65 20 74 61 69 6c 20 24 73 79 73 74 65 6d  ile tail $system
23bd0 44 61 74 61 53 51 4c 69 74 65 4c 69 6e 71 44 6c  DataSQLiteLinqDl
23be0 6c 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b  lFile]]]} then {
23bf0 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63  ..          chec
23c00 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63  kForFile $test_c
23c10 68 61 6e 6e 65 6c 20 24 73 79 73 74 65 6d 44 61  hannel $systemDa
23c20 74 61 53 51 4c 69 74 65 4c 69 6e 71 44 6c 6c 46  taSQLiteLinqDllF
23c30 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ile..        }..
23c40 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
23c50 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
23c60 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
23c70 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
23c80 5b 66 69 6c 65 20 74 61 69 6c 20 24 73 79 73 74  [file tail $syst
23c90 65 6d 44 61 74 61 53 51 4c 69 74 65 45 66 36 44  emDataSQLiteEf6D
23ca0 6c 6c 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  llFile]]]} then 
23cb0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65  {..          che
23cc0 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f  ckForFile $test_
23cd0 63 68 61 6e 6e 65 6c 20 24 73 79 73 74 65 6d 44  channel $systemD
23ce0 61 74 61 53 51 4c 69 74 65 45 66 36 44 6c 6c 46  ataSQLiteEf6DllF
23cf0 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ile..        }..
23d00 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
23d10 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
23d20 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
23d30 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
23d40 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74  [file tail $test
23d50 45 78 65 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  ExeFile]]]} then
23d60 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   {..          ch
23d70 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74  eckForFile $test
23d80 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 45 78  _channel $testEx
23d90 65 46 69 6c 65 20 74 65 73 74 2e 65 78 65 0d 0a  eFile test.exe..
23da0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
23db0 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43       if {![haveC
23dc0 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
23dd0 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20  dArgs file_ \.. 
23de0 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
23df0 20 74 61 69 6c 20 24 74 65 73 74 4c 69 6e 71 45   tail $testLinqE
23e00 78 65 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  xeFile]]]} then 
23e10 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65  {..          che
23e20 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f  ckForFile $test_
23e30 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 4c 69 6e  channel $testLin
23e40 71 45 78 65 46 69 6c 65 20 74 65 73 74 6c 69 6e  qExeFile testlin
23e50 71 2e 65 78 65 0d 0a 20 20 20 20 20 20 20 20 7d  q.exe..        }
23e60 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
23e70 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
23e80 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
23e90 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
23ea0 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65    [file tail $te
23eb0 73 74 45 66 36 45 78 65 46 69 6c 65 5d 5d 5d 7d  stEf6ExeFile]]]}
23ec0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
23ed0 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20     checkForFile 
23ee0 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74  $test_channel $t
23ef0 65 73 74 45 66 36 45 78 65 46 69 6c 65 20 74 65  estEf6ExeFile te
23f00 73 74 65 66 36 2e 65 78 65 0d 0a 20 20 20 20 20  stef6.exe..     
23f10 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
23f20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
23f30 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
23f40 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
23f50 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c        [file tail
23f60 20 24 74 65 73 74 4c 69 6e 71 4f 75 74 46 69 6c   $testLinqOutFil
23f70 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e]]]} then {..  
23f80 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
23f90 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e  File $test_chann
23fa0 65 6c 20 24 74 65 73 74 4c 69 6e 71 4f 75 74 46  el $testLinqOutF
23fb0 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ile..        }..
23fc0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
23fd0 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
23fe0 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
23ff0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
24000 5b 66 69 6c 65 20 74 61 69 6c 20 24 6e 6f 72 74  [file tail $nort
24010 68 77 69 6e 64 45 66 44 62 46 69 6c 65 5d 5d 5d  hwindEfDbFile]]]
24020 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
24030 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65      checkForFile
24040 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24   $test_channel $
24050 6e 6f 72 74 68 77 69 6e 64 45 66 44 62 46 69 6c  northwindEfDbFil
24060 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  e..        }....
24070 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61          if {![ha
24080 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
24090 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c  pendArgs file_ \
240a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
240b0 69 6c 65 20 74 61 69 6c 20 24 6e 6f 6e 57 61 6c  ile tail $nonWal
240c0 44 62 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  DbFile]]]} then 
240d0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65  {..          che
240e0 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f  ckForFile $test_
240f0 63 68 61 6e 6e 65 6c 20 24 6e 6f 6e 57 61 6c 44  channel $nonWalD
24100 62 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d  bFile..        }
24110 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
24120 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
24130 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
24140 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
24150 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 77 61    [file tail $wa
24160 6c 44 62 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  lDbFile]]]} then
24170 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   {..          ch
24180 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74  eckForFile $test
24190 5f 63 68 61 6e 6e 65 6c 20 24 77 61 6c 44 62 46  _channel $walDbF
241a0 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ile..        }..
241b0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
241c0 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
241d0 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
241e0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
241f0 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74  [file tail $test
24200 49 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67  InstallVs2005Log
24210 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d  File]]]} then {.
24220 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b  .          check
24230 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
24240 61 6e 6e 65 6c 20 24 74 65 73 74 49 6e 73 74 61  annel $testInsta
24250 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 0d  llVs2005LogFile.
24260 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
24270 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
24280 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
24290 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
242a0 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
242b0 65 20 74 61 69 6c 20 24 74 65 73 74 49 6e 73 74  e tail $testInst
242c0 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c 65  allVs2008LogFile
242d0 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
242e0 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
242f0 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
24300 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73  l $testInstallVs
24310 32 30 30 38 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2008LogFile..   
24320 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
24330 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
24340 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
24350 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
24360 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
24370 69 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56  il $testInstallV
24380 73 32 30 31 30 4c 6f 67 46 69 6c 65 5d 5d 5d 7d  s2010LogFile]]]}
24390 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
243a0 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20     checkForFile 
243b0 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74  $test_channel $t
243c0 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 30  estInstallVs2010
243d0 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20  LogFile..       
243e0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
243f0 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69   {![haveConstrai
24400 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
24410 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ile_ \..        
24420 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
24430 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31  testInstallVs201
24440 32 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65  2LogFile]]]} the
24450 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  n {..          c
24460 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
24470 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 49  t_channel $testI
24480 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46  nstallVs2012LogF
24490 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ile..        }..
244a0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
244b0 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
244c0 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
244d0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
244e0 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74  [file tail $test
244f0 49 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67  InstallVs2013Log
24500 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d  File]]]} then {.
24510 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b  .          check
24520 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
24530 61 6e 6e 65 6c 20 24 74 65 73 74 49 6e 73 74 61  annel $testInsta
24540 6c 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 0d  llVs2013LogFile.
24550 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
24560 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
24570 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
24580 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
24590 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
245a0 65 20 74 61 69 6c 20 24 74 65 73 74 49 6e 73 74  e tail $testInst
245b0 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c 65  allVs2015LogFile
245c0 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
245d0 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
245e0 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
245f0 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73  l $testInstallVs
24600 32 30 31 35 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2015LogFile..   
24610 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
24620 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
24630 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
24640 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
24650 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
24660 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c  il $testUninstal
24670 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 5d 5d  lVs2005LogFile]]
24680 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
24690 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
246a0 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
246b0 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
246c0 32 30 30 35 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2005LogFile..   
246d0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
246e0 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
246f0 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
24700 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
24710 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
24720 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c  il $testUninstal
24730 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c 65 5d 5d  lVs2008LogFile]]
24740 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
24750 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
24760 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
24770 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
24780 32 30 30 38 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2008LogFile..   
24790 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
247a0 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
247b0 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
247c0 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
247d0 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
247e0 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c  il $testUninstal
247f0 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65 5d 5d  lVs2010LogFile]]
24800 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
24810 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
24820 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
24830 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
24840 32 30 31 30 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2010LogFile..   
24850 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
24860 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
24870 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
24880 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
24890 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
248a0 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c  il $testUninstal
248b0 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65 5d 5d  lVs2012LogFile]]
248c0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
248d0 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
248e0 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
248f0 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
24900 32 30 31 32 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2012LogFile..   
24910 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
24920 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
24930 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
24940 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
24950 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
24960 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c  il $testUninstal
24970 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 5d 5d  lVs2013LogFile]]
24980 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
24990 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
249a0 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
249b0 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
249c0 32 30 31 33 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2013LogFile..   
249d0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
249e0 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
249f0 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
24a00 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
24a10 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
24a20 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c  il $testUninstal
24a30 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c 65 5d 5d  lVs2015LogFile]]
24a40 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
24a50 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
24a60 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
24a70 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
24a80 32 30 31 35 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2015LogFile..   
24a90 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
24aa0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
24ab0 72 6f 63 20 72 75 6e 53 51 4c 69 74 65 54 65 73  roc runSQLiteTes
24ac0 74 46 69 6c 65 73 45 70 69 6c 6f 67 75 65 20 7b  tFilesEpilogue {
24ad0 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 6c 65 76  } {..      uplev
24ae0 65 6c 20 31 20 7b 0d 0a 20 20 20 20 20 20 20 20  el 1 {..        
24af0 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69  unset -nocomplai
24b00 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
24b10 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73   testUninstallVs
24b20 32 30 31 35 4c 6f 67 46 69 6c 65 20 74 65 73 74  2015LogFile test
24b30 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c  UninstallVs2013L
24b40 6f 67 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20  ogFile \..      
24b50 20 20 20 20 20 20 74 65 73 74 55 6e 69 6e 73 74        testUninst
24b60 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65  allVs2012LogFile
24b70 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73   testUninstallVs
24b80 32 30 31 30 4c 6f 67 46 69 6c 65 20 5c 0d 0a 20  2010LogFile \.. 
24b90 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 55             testU
24ba0 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f  ninstallVs2008Lo
24bb0 67 46 69 6c 65 20 74 65 73 74 55 6e 69 6e 73 74  gFile testUninst
24bc0 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65  allVs2005LogFile
24bd0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
24be0 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31  testInstallVs201
24bf0 35 4c 6f 67 46 69 6c 65 20 74 65 73 74 49 6e 73  5LogFile testIns
24c00 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c  tallVs2013LogFil
24c10 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
24c20 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30   testInstallVs20
24c30 31 32 4c 6f 67 46 69 6c 65 20 74 65 73 74 49 6e  12LogFile testIn
24c40 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69  stallVs2010LogFi
24c50 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  le \..          
24c60 20 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32    testInstallVs2
24c70 30 30 38 4c 6f 67 46 69 6c 65 20 74 65 73 74 49  008LogFile testI
24c80 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46  nstallVs2005LogF
24c90 69 6c 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 75  ile....        u
24ca0 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e  nset -nocomplain
24cb0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
24cc0 6e 6f 72 74 68 77 69 6e 64 45 66 44 62 46 69 6c  northwindEfDbFil
24cd0 65 20 74 65 73 74 4c 69 6e 71 4f 75 74 46 69 6c  e testLinqOutFil
24ce0 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
24cf0 20 77 61 6c 44 62 46 69 6c 65 20 6e 6f 6e 57 61   walDbFile nonWa
24d00 6c 44 62 46 69 6c 65 0d 0a 0d 0a 20 20 20 20 20  lDbFile....     
24d10 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70     unset -nocomp
24d20 6c 61 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  lain \..        
24d30 20 20 20 20 74 65 73 74 45 66 36 45 78 65 46 69      testEf6ExeFi
24d40 6c 65 20 74 65 73 74 4c 69 6e 71 45 78 65 46 69  le testLinqExeFi
24d50 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  le \..          
24d60 20 20 74 65 73 74 45 78 65 46 69 6c 65 20 73 79    testExeFile sy
24d70 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65 45 66  stemDataSQLiteEf
24d80 36 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20  6DllFile \..    
24d90 20 20 20 20 20 20 20 20 73 79 73 74 65 6d 44 61          systemDa
24da0 74 61 53 51 4c 69 74 65 4c 69 6e 71 44 6c 6c 46  taSQLiteLinqDllF
24db0 69 6c 65 20 73 79 73 74 65 6d 44 61 74 61 53 51  ile systemDataSQ
24dc0 4c 69 74 65 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20  LiteDllFile \.. 
24dd0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
24de0 65 44 65 73 69 67 6e 65 72 44 6c 6c 46 69 6c 65  eDesignerDllFile
24df0 20 69 6e 73 74 61 6c 6c 65 72 45 78 65 46 69 6c   installerExeFil
24e00 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
24e10 20 65 6e 74 69 74 79 46 72 61 6d 65 77 6f 72 6b   entityFramework
24e20 44 6c 6c 46 69 6c 65 0d 0a 20 20 20 20 20 20 7d  DllFile..      }
24e30 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
24e40 70 72 6f 63 20 72 75 6e 53 51 4c 69 74 65 54 65  proc runSQLiteTe
24e50 73 74 45 70 69 6c 6f 67 75 65 20 7b 7d 20 7b 0d  stEpilogue {} {.
24e60 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
24e70 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 72 75 6e  # NOTE: Skip run
24e80 6e 69 6e 67 20 6f 75 72 20 63 75 73 74 6f 6d 20  ning our custom 
24e90 65 70 69 6c 6f 67 75 65 20 69 66 20 74 68 65 20  epilogue if the 
24ea0 6d 61 69 6e 20 6f 6e 65 20 68 61 73 20 62 65 65  main one has bee
24eb0 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  n..      #      
24ec0 20 73 6b 69 70 70 65 64 2e 0d 0a 20 20 20 20 20   skipped...     
24ed0 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b   #..      if {![
24ee0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
24ef0 28 65 70 69 6c 6f 67 75 65 2e 65 61 67 6c 65 29  (epilogue.eagle)
24f00 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
24f10 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
24f20 4e 4f 54 45 3a 20 53 68 6f 77 20 77 68 65 6e 20  NOTE: Show when 
24f30 6f 75 72 20 74 65 73 74 73 20 61 63 74 75 61 6c  our tests actual
24f40 6c 79 20 65 6e 64 65 64 20 28 6e 6f 77 29 2e 0d  ly ended (now)..
24f50 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
24f60 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
24f70 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
24f80 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
24f90 20 20 20 20 20 22 2d 2d 2d 2d 20 53 79 73 74 65       "---- Syste
24fa0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 74 65  m.Data.SQLite te
24fb0 73 74 73 20 65 6e 64 65 64 20 61 74 20 22 20 5c  sts ended at " \
24fc0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 63  ..            [c
24fd0 6c 6f 63 6b 20 66 6f 72 6d 61 74 20 5b 63 6c 6f  lock format [clo
24fe0 63 6b 20 73 65 63 6f 6e 64 73 5d 5d 20 5c 6e 5d  ck seconds]] \n]
24ff0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
25000 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c         # NOTE: L
25010 6f 61 64 20 74 68 65 20 22 65 70 69 6c 6f 67 75  oad the "epilogu
25020 65 22 20 63 75 73 74 6f 6d 20 70 65 72 2d 75 73  e" custom per-us
25030 65 72 20 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f  er and/or per-ho
25040 73 74 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20  st test..       
25050 20 23 20 20 20 20 20 20 20 73 65 74 74 69 6e 67   #       setting
25060 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20  s now...        
25070 23 0d 0a 20 20 20 20 20 20 20 20 75 70 6c 65 76  #..        uplev
25080 65 6c 20 31 20 5b 6c 69 73 74 20 6c 6f 61 64 53  el 1 [list loadS
25090 51 4c 69 74 65 54 65 73 74 53 65 74 74 69 6e 67  QLiteTestSetting
250a0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
250b0 6c 20 2e 65 70 69 6c 6f 67 75 65 5d 0d 0a 0d 0a  l .epilogue]....
250c0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
250d0 20 20 20 23 20 42 55 47 46 49 58 3a 20 42 65 66     # BUGFIX: Bef
250e0 6f 72 65 20 63 68 65 63 6b 69 6e 67 20 74 68 65  ore checking the
250f0 20 66 69 6e 61 6c 20 72 65 73 6f 75 72 63 65 73   final resources
25100 20 69 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74   in use by SQLit
25110 65 2c 20 6d 61 6b 65 0d 0a 20 20 20 20 20 20 20  e, make..       
25120 20 23 20 20 20 20 20 20 20 20 20 73 75 72 65 20   #         sure 
25130 62 6f 74 68 20 6f 66 20 74 68 65 20 50 52 41 47  both of the PRAG
25140 4d 41 20 72 65 6c 61 74 65 64 20 64 69 72 65 63  MA related direc
25150 74 6f 72 79 20 6e 61 6d 65 73 20 61 72 65 20 66  tory names are f
25160 72 65 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23  reed...        #
25170 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46  ..        checkF
25180 6f 72 53 51 4c 69 74 65 44 69 72 65 63 74 6f 72  orSQLiteDirector
25190 69 65 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  ies $::test_chan
251a0 6e 65 6c 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20  nel true....    
251b0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
251c0 20 4e 4f 54 45 3a 20 41 6c 73 6f 20 72 65 70 6f   NOTE: Also repo
251d0 72 74 20 74 68 65 20 72 65 73 6f 75 72 63 65 20  rt the resource 
251e0 75 73 61 67 65 20 61 66 74 65 72 20 72 75 6e 6e  usage after runn
251f0 69 6e 67 20 74 68 65 20 74 65 73 74 73 2e 0d 0a  ing the tests...
25200 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
25210 20 20 20 72 65 70 6f 72 74 53 51 4c 69 74 65 52     reportSQLiteR
25220 65 73 6f 75 72 63 65 73 20 24 3a 3a 74 65 73 74  esources $::test
25230 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20  _channel....    
25240 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
25250 20 4e 4f 54 45 3a 20 52 65 70 6f 72 74 20 74 68   NOTE: Report th
25260 65 20 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c  e critical handl
25270 65 20 63 6f 75 6e 74 73 20 61 66 74 65 72 20 72  e counts after r
25280 75 6e 6e 69 6e 67 20 74 68 65 20 74 65 73 74 73  unning the tests
25290 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
252a0 20 20 20 20 20 20 67 65 74 53 51 4c 69 74 65 48        getSQLiteH
252b0 61 6e 64 6c 65 43 6f 75 6e 74 73 20 24 3a 3a 74  andleCounts $::t
252c0 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20  est_channel.... 
252d0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
252e0 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6e 65 63    # NOTE: If nec
252f0 65 73 73 61 72 79 2c 20 64 69 73 61 62 6c 65 20  essary, disable 
25300 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64  shared-cache mod
25310 65 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20  e now...        
25320 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  #..        if {[
25330 68 61 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  hasRuntimeOption
25340 20 73 68 61 72 65 64 43 61 63 68 65 5d 7d 20 74   sharedCache]} t
25350 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
25360 20 65 6e 61 62 6c 65 53 68 61 72 65 64 43 61 63   enableSharedCac
25370 68 65 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  he $::test_chann
25380 65 6c 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20  el false..      
25390 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
253a0 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 23 23 23 23    }.....    ####
253b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
253c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
253d0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
253e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
253f0 23 23 23 23 23 23 23 0d 0a 20 20 20 20 23 23 23  #######..    ###
25400 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
25410 23 23 23 23 23 23 23 23 23 23 20 45 4e 44 20 45  ########## END E
25420 61 67 6c 65 20 4f 4e 4c 59 20 23 23 23 23 23 23  agle ONLY ######
25430 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
25440 23 23 23 23 23 23 23 23 0d 0a 20 20 20 20 23 23  ########..    ##
25450 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
25460 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
25470 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
25480 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
25490 23 23 23 23 23 23 23 23 23 0d 0a 20 20 7d 0d 0a  #########..  }..
254a0 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a  ..  #..  # NOTE:
254b0 20 53 61 76 65 20 74 68 65 20 6e 61 6d 65 20 6f   Save the name o
254c0 66 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  f the directory 
254d0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20  containing this 
254e0 66 69 6c 65 2e 0d 0a 20 20 23 0d 0a 20 20 69 66  file...  #..  if
254f0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
25500 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79  common_directory
25510 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 73  ]} then {..    s
25520 65 74 20 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74  et common_direct
25530 6f 72 79 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  ory [file dirnam
25540 65 20 5b 69 6e 66 6f 20 73 63 72 69 70 74 5d 5d  e [info script]]
25550 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 0d 0a 20 20  ..  }....  #..  
25560 23 20 4e 4f 54 45 3a 20 50 72 6f 76 69 64 65 20  # NOTE: Provide 
25570 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  the System.Data.
25580 53 51 4c 69 74 65 20 74 65 73 74 20 70 61 63 6b  SQLite test pack
25590 61 67 65 20 74 6f 20 74 68 65 20 69 6e 74 65 72  age to the inter
255a0 70 72 65 74 65 72 2e 0d 0a 20 20 23 0d 0a 20 20  preter...  #..  
255b0 70 61 63 6b 61 67 65 20 70 72 6f 76 69 64 65 20  package provide 
255c0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
255d0 74 65 2e 54 65 73 74 20 31 2e 30 0d 0a 7d 0d 0a  te.Test 1.0..}..