System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact c1f06b2b6e771ac7924b1acd50a525bc81302961:


0000: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0010: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0020: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0030: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0040: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
0050: 0a 23 0d 0a 23 20 63 6f 6d 6d 6f 6e 2e 65 61 67  .#..# common.eag
0060: 6c 65 20 2d 2d 0d 0a 23 0d 0a 23 20 57 72 69 74  le --..#..# Writ
0070: 74 65 6e 20 62 79 20 4a 6f 65 20 4d 69 73 74 61  ten by Joe Mista
0080: 63 68 6b 69 6e 2e 0d 0a 23 20 52 65 6c 65 61 73  chkin...# Releas
0090: 65 64 20 74 6f 20 74 68 65 20 70 75 62 6c 69 63  ed to the public
00a0: 20 64 6f 6d 61 69 6e 2c 20 75 73 65 20 61 74 20   domain, use at 
00b0: 79 6f 75 72 20 6f 77 6e 20 72 69 73 6b 21 0d 0a  your own risk!..
00c0: 23 0d 0a 23 23 23 23 23 23 23 23 23 23 23 23 23  #..#############
00d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
00e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
00f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0100: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0110: 23 23 0d 0a 0d 0a 23 0d 0a 23 20 4e 4f 54 45 3a  ##....#..# NOTE:
0120: 20 55 73 65 20 6f 75 72 20 6f 77 6e 20 6e 61 6d   Use our own nam
0130: 65 73 70 61 63 65 20 68 65 72 65 20 62 65 63 61  espace here beca
0140: 75 73 65 20 65 76 65 6e 20 74 68 6f 75 67 68 20  use even though 
0150: 77 65 20 64 6f 20 6e 6f 74 20 64 69 72 65 63 74  we do not direct
0160: 6c 79 0d 0a 23 20 20 20 20 20 20 20 73 75 70 70  ly..#       supp
0170: 6f 72 74 20 6e 61 6d 65 73 70 61 63 65 73 20 6f  ort namespaces o
0180: 75 72 73 65 6c 76 65 73 2c 20 77 65 20 64 6f 20  urselves, we do 
0190: 6e 6f 74 20 77 61 6e 74 20 74 6f 20 70 6f 6c 6c  not want to poll
01a0: 75 74 65 20 74 68 65 20 67 6c 6f 62 61 6c 0d 0a  ute the global..
01b0: 23 20 20 20 20 20 20 20 6e 61 6d 65 73 70 61 63  #       namespac
01c0: 65 20 69 66 20 74 68 69 73 20 73 63 72 69 70 74  e if this script
01d0: 20 61 63 74 75 61 6c 6c 79 20 65 6e 64 73 20 75   actually ends u
01e0: 70 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65  p being evaluate
01f0: 64 20 69 6e 20 54 63 6c 2e 0d 0a 23 0d 0a 6e 61  d in Tcl...#..na
0200: 6d 65 73 70 61 63 65 20 65 76 61 6c 20 3a 3a 45  mespace eval ::E
0210: 61 67 6c 65 20 7b 0d 0a 20 20 69 66 20 7b 5b 69  agle {..  if {[i
0220: 73 45 61 67 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d  sEagle]} then {.
0230: 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23  .    ###########
0240: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0250: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0260: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0270: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0280: 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23  ..    ##########
0290: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02a0: 23 23 20 42 45 47 49 4e 20 45 61 67 6c 65 20 4f  ## BEGIN Eagle O
02b0: 4e 4c 59 20 23 23 23 23 23 23 23 23 23 23 23 23  NLY ############
02c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02d0: 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23  #..    #########
02e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0300: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0310: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0320: 23 23 0d 0a 0d 0a 20 20 20 20 70 72 6f 63 20 67  ##....    proc g
0330: 65 74 42 75 69 6c 64 59 65 61 72 20 7b 7d 20 7b  etBuildYear {} {
0340: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
0350: 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66 20   # NOTE: See if 
0360: 74 68 65 20 22 79 65 61 72 22 20 73 65 74 74 69  the "year" setti
0370: 6e 67 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  ng has been over
0380: 72 69 64 64 65 6e 20 62 79 20 74 68 65 20 75 73  ridden by the us
0390: 65 72 20 28 65 2e 67 2e 0d 0a 20 20 20 20 20 20  er (e.g...      
03a0: 23 20 20 20 20 20 20 20 6f 6e 20 74 68 65 20 63  #       on the c
03b0: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 20 20 54  ommand line).  T
03c0: 68 69 73 20 68 65 6c 70 73 20 63 6f 6e 74 72 6f  his helps contro
03d0: 6c 20 65 78 61 63 74 6c 79 20 77 68 69 63 68 20  l exactly which 
03e0: 73 65 74 20 6f 66 0d 0a 20 20 20 20 20 20 23 20  set of..      # 
03f0: 20 20 20 20 20 20 62 69 6e 61 72 69 65 73 20 77        binaries w
0400: 65 20 61 72 65 20 74 65 73 74 69 6e 67 2c 20 74  e are testing, t
0410: 68 6f 73 65 20 70 72 6f 64 75 63 65 64 20 75 73  hose produced us
0420: 69 6e 67 20 74 68 65 20 56 69 73 75 61 6c 20 53  ing the Visual S
0430: 74 75 64 69 6f 0d 0a 20 20 20 20 20 20 23 20 20  tudio..      #  
0440: 20 20 20 20 20 32 30 30 35 2c 20 32 30 30 38 2c       2005, 2008,
0450: 20 32 30 31 30 2c 20 32 30 31 32 2c 20 32 30 31   2010, 2012, 201
0460: 33 2c 20 6f 72 20 32 30 31 35 20 62 75 69 6c 64  3, or 2015 build
0470: 20 73 79 73 74 65 6d 73 2e 20 20 54 6f 20 6f 76   systems.  To ov
0480: 65 72 72 69 64 65 0d 0a 20 20 20 20 20 20 23 20  erride..      # 
0490: 20 20 20 20 20 20 74 68 69 73 20 76 61 6c 75 65        this value
04a0: 20 76 69 61 20 74 68 65 20 63 6f 6d 6d 61 6e 64   via the command
04b0: 20 6c 69 6e 65 2c 20 65 6e 74 65 72 20 61 20 63   line, enter a c
04c0: 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c 61 72 20 74  ommand similar t
04d0: 6f 20 6f 6e 65 0d 0a 20 20 20 20 20 20 23 20 20  o one..      #  
04e0: 20 20 20 20 20 6f 66 20 74 68 65 20 66 6f 6c 6c       of the foll
04f0: 6f 77 69 6e 67 20 28 61 6c 6c 20 6f 6e 20 6f 6e  owing (all on on
0500: 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20 20 20 20  e line):..      
0510: 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  #..      #      
0520: 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20   EagleShell.exe 
0530: 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20 22  -anyInitialize "
0540: 73 65 74 20 74 65 73 74 5f 79 65 61 72 20 32 30  set test_year 20
0550: 30 35 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20  05"..      #    
0560: 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74       -file .\pat
0570: 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a  h\to\all.eagle..
0580: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
0590: 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c         EagleShel
05a0: 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61  l.exe -anyInitia
05b0: 6c 69 7a 65 20 22 73 65 74 20 74 65 73 74 5f 79  lize "set test_y
05c0: 65 61 72 20 32 30 30 38 22 0d 0a 20 20 20 20 20  ear 2008"..     
05d0: 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65   #         -file
05e0: 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65   .\path\to\all.e
05f0: 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20  agle..      #.. 
0600: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
0610: 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79  leShell.exe -any
0620: 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20  Initialize "set 
0630: 74 65 73 74 5f 79 65 61 72 20 32 30 31 30 22 0d  test_year 2010".
0640: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20  .      #        
0650: 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f   -file .\path\to
0660: 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20  \all.eagle..    
0670: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20    #..      #    
0680: 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78     EagleShell.ex
0690: 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65  e -anyInitialize
06a0: 20 22 73 65 74 20 74 65 73 74 5f 79 65 61 72 20   "set test_year 
06b0: 32 30 31 32 22 0d 0a 20 20 20 20 20 20 23 20 20  2012"..      #  
06c0: 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70         -file .\p
06d0: 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65  ath\to\all.eagle
06e0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
06f0: 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68   #       EagleSh
0700: 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74  ell.exe -anyInit
0710: 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65 73 74  ialize "set test
0720: 5f 79 65 61 72 20 32 30 31 33 22 0d 0a 20 20 20  _year 2013"..   
0730: 20 20 20 23 20 20 20 20 20 20 20 20 20 2d 66 69     #         -fi
0740: 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c  le .\path\to\all
0750: 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d  .eagle..      #.
0760: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45  .      #       E
0770: 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61  agleShell.exe -a
0780: 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65  nyInitialize "se
0790: 74 20 74 65 73 74 5f 79 65 61 72 20 32 30 31 35  t test_year 2015
07a0: 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  "..      #      
07b0: 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c     -file .\path\
07c0: 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20  to\all.eagle..  
07d0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20      #..      #  
07e0: 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e       EagleShell.
07f0: 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69  exe -anyInitiali
0800: 7a 65 20 22 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d  ze "unset -nocom
0810: 70 6c 61 69 6e 20 74 65 73 74 5f 79 65 61 72 22  plain test_year"
0820: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
0830: 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74    -file .\path\t
0840: 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20  o\all.eagle..   
0850: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
0860: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
0870: 65 73 74 5f 79 65 61 72 5d 20 26 26 20 5b 73 74  est_year] && [st
0880: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74  ring length $::t
0890: 65 73 74 5f 79 65 61 72 5d 20 3e 20 30 7d 20 74  est_year] > 0} t
08a0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
08b0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
08c0: 3a 20 55 73 65 20 74 68 65 20 73 70 65 63 69 66  : Use the specif
08d0: 69 65 64 20 74 65 73 74 20 79 65 61 72 2e 20 20  ied test year.  
08e0: 49 66 20 74 68 69 73 20 76 61 72 69 61 62 6c 65  If this variable
08f0: 20 69 73 20 6e 6f 74 20 73 65 74 2c 20 74 68 65   is not set, the
0900: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
0910: 20 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20    default value 
0920: 77 69 6c 6c 20 62 65 20 62 61 73 65 64 20 6f 6e  will be based on
0930: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
0940: 45 61 67 6c 65 20 68 61 73 20 62 65 65 6e 0d 0a  Eagle has been..
0950: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
0960: 63 6f 6d 70 69 6c 65 64 20 61 67 61 69 6e 73 74  compiled against
0970: 20 74 68 65 20 43 4c 52 20 76 32 2e 30 20 6f 72   the CLR v2.0 or
0980: 20 43 4c 52 20 76 34 2e 30 2e 0d 0a 20 20 20 20   CLR v4.0...    
0990: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
09a0: 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 79 65  eturn $::test_ye
09b0: 61 72 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ar..      } else
09c0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
09d0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49         # NOTE: I
09e0: 66 20 45 61 67 6c 65 20 68 61 73 20 62 65 65 6e  f Eagle has been
09f0: 20 63 6f 6d 70 69 6c 65 64 20 61 67 61 69 6e 73   compiled agains
0a00: 74 20 74 68 65 20 43 4c 52 20 76 34 2e 30 2c 20  t the CLR v4.0, 
0a10: 75 73 65 20 22 32 30 31 30 22 20 62 79 0d 0a 20  use "2010" by.. 
0a20: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64         #       d
0a30: 65 66 61 75 6c 74 20 28 77 65 20 63 6f 75 6c 64  efault (we could
0a40: 20 75 73 65 20 22 32 30 31 32 22 2c 20 22 32 30   use "2012", "20
0a50: 31 33 22 2c 20 6f 72 20 22 32 30 31 35 22 20 69  13", or "2015" i
0a60: 6e 20 74 68 61 74 20 63 61 73 65 20 61 73 0d 0a  n that case as..
0a70: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
0a80: 77 65 6c 6c 29 20 61 73 20 74 68 65 20 74 65 73  well) as the tes
0a90: 74 20 79 65 61 72 3b 20 6f 74 68 65 72 77 69 73  t year; otherwis
0aa0: 65 2c 20 75 73 65 20 22 32 30 30 38 22 20 62 79  e, use "2008" by
0ab0: 20 64 65 66 61 75 6c 74 20 28 77 65 0d 0a 20 20   default (we..  
0ac0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
0ad0: 75 6c 64 20 75 73 65 20 22 32 30 30 35 22 20 69  uld use "2005" i
0ae0: 6e 20 74 68 61 74 20 63 61 73 65 20 61 73 20 77  n that case as w
0af0: 65 6c 6c 29 2e 20 20 49 66 20 61 6e 6f 74 68 65  ell).  If anothe
0b00: 72 20 6d 61 6a 6f 72 0d 0a 20 20 20 20 20 20 20  r major..       
0b10: 20 23 20 20 20 20 20 20 20 5b 69 6e 63 6f 6d 70   #       [incomp
0b20: 61 74 69 62 6c 65 5d 20 76 65 72 73 69 6f 6e 20  atible] version 
0b30: 6f 66 20 74 68 65 20 43 4c 52 20 69 73 20 72 65  of the CLR is re
0b40: 6c 65 61 73 65 64 2c 20 74 68 69 73 20 63 68 65  leased, this che
0b50: 63 6b 20 77 69 6c 6c 0d 0a 20 20 20 20 20 20 20  ck will..       
0b60: 20 23 20 20 20 20 20 20 20 68 61 76 65 20 74 6f   #       have to
0b70: 20 62 65 20 63 68 61 6e 67 65 64 2e 20 20 54 68   be changed.  Th
0b80: 65 20 64 65 66 61 75 6c 74 20 74 65 73 74 20 79  e default test y
0b90: 65 61 72 20 74 6f 20 75 73 65 20 66 6f 72 20 61  ear to use for a
0ba0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
0bb0: 20 20 70 61 72 74 69 63 75 6c 61 72 20 43 4c 52    particular CLR
0bc0: 20 76 65 72 73 69 6f 6e 20 6d 61 79 20 62 65 20   version may be 
0bd0: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 73 65  overridden by se
0be0: 74 74 69 6e 67 20 74 68 65 20 67 6c 6f 62 61 6c  tting the global
0bf0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
0c00: 20 20 76 61 72 69 61 62 6c 65 20 22 74 65 73 74    variable "test
0c10: 5f 79 65 61 72 5f 63 6c 72 5f 76 24 58 22 2c 20  _year_clr_v$X", 
0c20: 77 68 65 72 65 20 22 24 58 22 20 6d 61 79 20 5b  where "$X" may [
0c30: 63 75 72 72 65 6e 74 6c 79 5d 20 62 65 0d 0a 20  currently] be.. 
0c40: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65         #       e
0c50: 69 74 68 65 72 20 22 32 22 20 6f 72 20 22 34 22  ither "2" or "4"
0c60: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
0c70: 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 43        if {[haveC
0c80: 6f 6e 73 74 72 61 69 6e 74 20 69 6d 61 67 65 52  onstraint imageR
0c90: 75 6e 74 69 6d 65 34 30 5d 7d 20 74 68 65 6e 20  untime40]} then 
0ca0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
0cb0: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
0cc0: 74 65 73 74 5f 79 65 61 72 5f 63 6c 72 5f 76 34  test_year_clr_v4
0cd0: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
0ce0: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
0cf0: 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 79 65 61  ngth $::test_yea
0d00: 72 5f 63 6c 72 5f 76 34 5d 20 3e 20 30 7d 20 74  r_clr_v4] > 0} t
0d10: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
0d20: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
0d30: 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68    # NOTE: Use th
0d40: 65 20 73 70 65 63 69 66 69 65 64 20 74 65 73 74  e specified test
0d50: 20 79 65 61 72 20 66 6f 72 20 74 68 65 20 43 4c   year for the CL
0d60: 52 20 76 34 2e 30 2e 0d 0a 20 20 20 20 20 20 20  R v4.0...       
0d70: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
0d80: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65      return $::te
0d90: 73 74 5f 79 65 61 72 5f 63 6c 72 5f 76 34 0d 0a  st_year_clr_v4..
0da0: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
0db0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
0dc0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  #..            #
0dd0: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 64   NOTE: Use the d
0de0: 65 66 61 75 6c 74 20 74 65 73 74 20 79 65 61 72  efault test year
0df0: 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76 34 2e   for the CLR v4.
0e00: 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  0...            
0e10: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  #..            r
0e20: 65 74 75 72 6e 20 32 30 31 30 3b 20 23 20 54 4f  eturn 2010; # TO
0e30: 44 4f 3a 20 47 6f 6f 64 20 22 66 61 6c 6c 62 61  DO: Good "fallba
0e40: 63 6b 22 20 64 65 66 61 75 6c 74 3f 0d 0a 20 20  ck" default?..  
0e50: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
0e60: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
0e70: 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f         if {[info
0e80: 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 79   exists ::test_y
0e90: 65 61 72 5f 63 6c 72 5f 76 32 5d 20 26 26 20 5c  ear_clr_v2] && \
0ea0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
0eb0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
0ec0: 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c 72 5f  ::test_year_clr_
0ed0: 76 32 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  v2] > 0} then {.
0ee0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
0ef0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
0f00: 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63  TE: Use the spec
0f10: 69 66 69 65 64 20 74 65 73 74 20 79 65 61 72 20  ified test year 
0f20: 66 6f 72 20 74 68 65 20 43 4c 52 20 76 32 2e 30  for the CLR v2.0
0f30: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
0f40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
0f50: 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 79 65 61  turn $::test_yea
0f60: 72 5f 63 6c 72 5f 76 32 0d 0a 20 20 20 20 20 20  r_clr_v2..      
0f70: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
0f80: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
0f90: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
0fa0: 20 55 73 65 20 74 68 65 20 64 65 66 61 75 6c 74   Use the default
0fb0: 20 74 65 73 74 20 79 65 61 72 20 66 6f 72 20 74   test year for t
0fc0: 68 65 20 43 4c 52 20 76 32 2e 30 2e 0d 0a 20 20  he CLR v2.0...  
0fd0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
0fe0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
0ff0: 32 30 30 38 3b 20 23 20 54 4f 44 4f 3a 20 47 6f  2008; # TODO: Go
1000: 6f 64 20 22 66 61 6c 6c 62 61 63 6b 22 20 64 65  od "fallback" de
1010: 66 61 75 6c 74 3f 0d 0a 20 20 20 20 20 20 20 20  fault?..        
1020: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
1030: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
1040: 0c 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20  ...    #..    # 
1050: 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65  NOTE: This proce
1060: 64 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  dure is only use
1070: 64 20 77 68 65 6e 20 61 64 64 69 6e 67 20 73 68  d when adding sh
1080: 69 6d 6d 65 64 20 74 65 73 74 20 63 6f 6e 73 74  immed test const
1090: 72 61 69 6e 74 73 2e 0d 0a 20 20 20 20 23 0d 0a  raints...    #..
10a0: 20 20 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c      proc getBuil
10b0: 64 43 6c 72 56 65 72 73 69 6f 6e 20 7b 7d 20 7b  dClrVersion {} {
10c0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
10d0: 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f  o exists ::test_
10e0: 63 6c 72 5d 20 26 26 20 5b 73 74 72 69 6e 67 20  clr] && [string 
10f0: 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 63  length $::test_c
1100: 6c 72 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  lr] > 0} then {.
1110: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1120: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
1130: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65  the specified te
1140: 73 74 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 74  st version for t
1150: 68 65 20 43 4c 52 2e 20 20 49 66 20 74 68 69 73  he CLR.  If this
1160: 20 76 61 72 69 61 62 6c 65 0d 0a 20 20 20 20 20   variable..     
1170: 20 20 20 23 20 20 20 20 20 20 20 69 73 20 6e 6f     #       is no
1180: 74 20 73 65 74 2c 20 74 68 65 20 64 65 66 61 75  t set, the defau
1190: 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65  lt value will be
11a0: 20 62 61 73 65 64 20 6f 6e 20 77 68 65 74 68 65   based on whethe
11b0: 72 20 6f 72 20 6e 6f 74 0d 0a 20 20 20 20 20 20  r or not..      
11c0: 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 20    #       Eagle 
11d0: 68 61 73 20 62 65 65 6e 20 63 6f 6d 70 69 6c 65  has been compile
11e0: 64 20 61 67 61 69 6e 73 74 20 74 68 65 20 43 4c  d against the CL
11f0: 52 20 76 32 2e 30 20 6f 72 20 43 4c 52 20 76 34  R v2.0 or CLR v4
1200: 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  .0...        #..
1210: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
1220: 3a 3a 74 65 73 74 5f 63 6c 72 0d 0a 20 20 20 20  ::test_clr..    
1230: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1240: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1250: 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20   NOTE: Check if 
1260: 45 61 67 6c 65 20 68 61 73 20 62 65 65 6e 20 63  Eagle has been c
1270: 6f 6d 70 69 6c 65 64 20 61 67 61 69 6e 73 74 20  ompiled against 
1280: 74 68 65 20 43 4c 52 20 76 34 2e 30 2e 20 20 49  the CLR v4.0.  I
1290: 66 20 73 6f 2c 0d 0a 20 20 20 20 20 20 20 20 23  f so,..        #
12a0: 20 20 20 20 20 20 20 6a 75 73 74 20 75 73 65 20         just use 
12b0: 74 68 61 74 20 43 4c 52 20 76 65 72 73 69 6f 6e  that CLR version
12c0: 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73  .  Otherwise, us
12d0: 65 20 74 68 65 20 76 65 72 73 69 6f 6e 20 66 6f  e the version fo
12e0: 72 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23  r the..        #
12f0: 20 20 20 20 20 20 20 43 4c 52 20 76 32 2e 30 2e         CLR v2.0.
1300: 20 20 49 66 20 61 6e 6f 74 68 65 72 20 6d 61 6a    If another maj
1310: 6f 72 20 5b 69 6e 63 6f 6d 70 61 74 69 62 6c 65  or [incompatible
1320: 5d 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  ] version of the
1330: 20 43 4c 52 0d 0a 20 20 20 20 20 20 20 20 23 20   CLR..        # 
1340: 20 20 20 20 20 20 69 73 20 72 65 6c 65 61 73 65        is release
1350: 64 2c 20 74 68 69 73 20 63 68 65 63 6b 20 77 69  d, this check wi
1360: 6c 6c 20 68 61 76 65 20 74 6f 20 62 65 20 63 68  ll have to be ch
1370: 61 6e 67 65 64 2e 20 20 54 68 65 20 64 65 66 61  anged.  The defa
1380: 75 6c 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ult..        #  
1390: 20 20 20 20 20 76 65 72 73 69 6f 6e 20 76 61 6c       version val
13a0: 75 65 20 66 6f 72 20 61 20 70 61 72 74 69 63 75  ue for a particu
13b0: 6c 61 72 20 43 4c 52 20 76 65 72 73 69 6f 6e 20  lar CLR version 
13c0: 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64 64 65  may be overridde
13d0: 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  n..        #    
13e0: 20 20 20 62 79 20 73 65 74 74 69 6e 67 20 74 68     by setting th
13f0: 65 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  e global variabl
1400: 65 20 22 74 65 73 74 5f 63 6c 72 5f 76 24 58 22  e "test_clr_v$X"
1410: 2c 20 77 68 65 72 65 20 22 24 58 22 20 6d 61 79  , where "$X" may
1420: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1430: 20 20 5b 63 75 72 72 65 6e 74 6c 79 5d 20 62 65    [currently] be
1440: 20 65 69 74 68 65 72 20 22 32 22 20 6f 72 20 22   either "2" or "
1450: 34 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  4"...        #..
1460: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76          if {[hav
1470: 65 43 6f 6e 73 74 72 61 69 6e 74 20 69 6d 61 67  eConstraint imag
1480: 65 52 75 6e 74 69 6d 65 34 30 5d 7d 20 74 68 65  eRuntime40]} the
1490: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
14a0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
14b0: 3a 3a 74 65 73 74 5f 63 6c 72 5f 76 34 5d 20 26  ::test_clr_v4] &
14c0: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
14d0: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
14e0: 68 20 24 3a 3a 74 65 73 74 5f 63 6c 72 5f 76 34  h $::test_clr_v4
14f0: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
1500: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
1510: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
1520: 3a 20 55 73 65 20 74 68 65 20 73 70 65 63 69 66  : Use the specif
1530: 69 65 64 20 74 65 73 74 20 76 65 72 73 69 6f 6e  ied test version
1540: 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76 34 2e   for the CLR v4.
1550: 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  0...            
1560: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  #..            r
1570: 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 63 6c  eturn $::test_cl
1580: 72 5f 76 34 0d 0a 20 20 20 20 20 20 20 20 20 20  r_v4..          
1590: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
15a0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
15b0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65       # NOTE: Use
15c0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 74 65 73   the default tes
15d0: 74 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 74 68  t version for th
15e0: 65 20 43 4c 52 20 76 34 2e 30 2e 0d 0a 20 20 20  e CLR v4.0...   
15f0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1600: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 34          return 4
1610: 2e 30 2e 33 30 33 31 39 3b 20 23 20 54 4f 44 4f  .0.30319; # TODO
1620: 3a 20 47 6f 6f 64 20 22 66 61 6c 6c 62 61 63 6b  : Good "fallback
1630: 22 20 64 65 66 61 75 6c 74 3f 0d 0a 20 20 20 20  " default?..    
1640: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1650: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1660: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
1670: 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 63 6c 72  xists ::test_clr
1680: 5f 76 32 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  _v2] && \..     
1690: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
16a0: 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f   length $::test_
16b0: 63 6c 72 5f 76 32 5d 20 3e 20 30 7d 20 74 68 65  clr_v2] > 0} the
16c0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
16d0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
16e0: 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20  # NOTE: Use the 
16f0: 73 70 65 63 69 66 69 65 64 20 74 65 73 74 20 76  specified test v
1700: 65 72 73 69 6f 6e 20 66 6f 72 20 74 68 65 20 43  ersion for the C
1710: 4c 52 20 76 32 2e 30 2e 0d 0a 20 20 20 20 20 20  LR v2.0...      
1720: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1730: 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74       return $::t
1740: 65 73 74 5f 63 6c 72 5f 76 32 0d 0a 20 20 20 20  est_clr_v2..    
1750: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1760: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
1770: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
1780: 45 3a 20 55 73 65 20 74 68 65 20 64 65 66 61 75  E: Use the defau
1790: 6c 74 20 74 65 73 74 20 76 65 72 73 69 6f 6e 20  lt test version 
17a0: 66 6f 72 20 74 68 65 20 43 4c 52 20 76 32 2e 30  for the CLR v2.0
17b0: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
17c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
17d0: 74 75 72 6e 20 32 2e 30 2e 35 30 37 32 37 3b 20  turn 2.0.50727; 
17e0: 23 20 54 4f 44 4f 3a 20 47 6f 6f 64 20 22 66 61  # TODO: Good "fa
17f0: 6c 6c 62 61 63 6b 22 20 64 65 66 61 75 6c 74 3f  llback" default?
1800: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1810: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1820: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
1830: 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 59 65   proc getBuildYe
1840: 61 72 73 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  ars {} {..      
1850: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
1860: 20 53 65 65 20 69 66 20 74 68 65 20 6c 69 73 74   See if the list
1870: 20 6f 66 20 74 65 73 74 20 79 65 61 72 73 20 68   of test years h
1880: 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64  as been overridd
1890: 65 6e 20 62 79 20 74 68 65 20 75 73 65 72 0d 0a  en by the user..
18a0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 28 65        #       (e
18b0: 2e 67 2e 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61  .g. on the comma
18c0: 6e 64 20 6c 69 6e 65 29 2e 0d 0a 20 20 20 20 20  nd line)...     
18d0: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
18e0: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73  nfo exists ::tes
18f0: 74 5f 79 65 61 72 73 5d 20 26 26 20 5b 6c 6c 65  t_years] && [lle
1900: 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 79 65 61  ngth $::test_yea
1910: 72 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  rs] > 0} then {.
1920: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1930: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
1940: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 69  the specified li
1950: 73 74 20 6f 66 20 74 65 73 74 20 79 65 61 72 73  st of test years
1960: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1970: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
1980: 74 65 73 74 5f 79 65 61 72 73 0d 0a 20 20 20 20  test_years..    
1990: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
19a0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
19b0: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 64   NOTE: Use the d
19c0: 65 66 61 75 6c 74 20 6c 69 73 74 20 6f 66 20 74  efault list of t
19d0: 65 73 74 20 79 65 61 72 73 20 28 69 2e 65 2e 20  est years (i.e. 
19e0: 61 6c 6c 29 2e 0d 0a 20 20 20 20 20 20 20 20 23  all)...        #
19f0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
1a00: 20 5b 6c 69 73 74 20 32 30 30 35 20 32 30 30 38   [list 2005 2008
1a10: 20 32 30 31 30 20 32 30 31 32 20 32 30 31 33 20   2010 2012 2013 
1a20: 32 30 31 35 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  2015]..      }..
1a30: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
1a40: 6f 63 20 67 65 74 42 75 69 6c 64 4e 65 74 46 78  oc getBuildNetFx
1a50: 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
1a60: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 65        # NOTE: Se
1a70: 65 20 69 66 20 74 68 65 20 74 65 73 74 20 2e 4e  e if the test .N
1a80: 45 54 20 46 72 61 6d 65 77 6f 72 6b 20 73 65 74  ET Framework set
1a90: 74 69 6e 67 20 68 61 73 20 62 65 65 6e 20 6f 76  ting has been ov
1aa0: 65 72 72 69 64 64 65 6e 20 62 79 0d 0a 20 20 20  erridden by..   
1ab0: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 75     #       the u
1ac0: 73 65 72 20 28 65 2e 67 2e 20 6f 6e 20 74 68 65  ser (e.g. on the
1ad0: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 0d   command line)..
1ae0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1af0: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
1b00: 20 3a 3a 74 65 73 74 5f 6e 65 74 5f 66 78 5d 20   ::test_net_fx] 
1b10: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
1b20: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
1b30: 3a 3a 74 65 73 74 5f 6e 65 74 5f 66 78 5d 20 3e  ::test_net_fx] >
1b40: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1b50: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1b60: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73   NOTE: Use the s
1b70: 70 65 63 69 66 69 65 64 20 74 65 73 74 20 2e 4e  pecified test .N
1b80: 45 54 20 46 72 61 6d 65 77 6f 72 6b 2e 0d 0a 20  ET Framework... 
1b90: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1ba0: 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74    return $::test
1bb0: 5f 6e 65 74 5f 66 78 0d 0a 20 20 20 20 20 20 7d  _net_fx..      }
1bc0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1bd0: 20 73 65 74 20 79 65 61 72 20 5b 67 65 74 42 75   set year [getBu
1be0: 69 6c 64 59 65 61 72 5d 0d 0a 20 20 20 20 20 20  ildYear]..      
1bf0: 20 20 73 65 74 20 79 65 61 72 56 61 72 4e 61 6d    set yearVarNam
1c00: 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20 3a 3a  e [appendArgs ::
1c10: 74 65 73 74 5f 6e 65 74 5f 66 78 5f 20 24 79 65  test_net_fx_ $ye
1c20: 61 72 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69  ar]....        i
1c30: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
1c40: 24 79 65 61 72 56 61 72 4e 61 6d 65 5d 20 26 26  $yearVarName] &&
1c50: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1c60: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 5b  [string length [
1c70: 73 65 74 20 24 79 65 61 72 56 61 72 4e 61 6d 65  set $yearVarName
1c80: 5d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ]] > 0} then {..
1c90: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1ca0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55         # NOTE: U
1cb0: 73 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64  se the specified
1cc0: 20 74 65 73 74 20 2e 4e 45 54 20 46 72 61 6d 65   test .NET Frame
1cd0: 77 6f 72 6b 2c 20 62 61 73 65 64 20 6f 6e 20 74  work, based on t
1ce0: 68 65 20 62 75 69 6c 64 0d 0a 20 20 20 20 20 20  he build..      
1cf0: 20 20 20 20 23 20 20 20 20 20 20 20 79 65 61 72      #       year
1d00: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
1d10: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1d20: 20 5b 73 65 74 20 24 79 65 61 72 56 61 72 4e 61   [set $yearVarNa
1d30: 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65  me]..        } e
1d40: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
1d50: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
1d60: 4e 4f 54 45 3a 20 46 61 6c 6c 62 61 63 6b 20 74  NOTE: Fallback t
1d70: 6f 20 74 68 65 20 22 77 65 6c 6c 20 6b 6e 6f 77  o the "well know
1d80: 6e 22 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72  n" .NET Framewor
1d90: 6b 20 76 65 72 73 69 6f 6e 20 74 68 61 74 0d 0a  k version that..
1da0: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
1db0: 20 20 69 73 20 6d 6f 73 74 20 63 6c 6f 73 65 6c    is most closel
1dc0: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
1dd0: 68 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 76  h a particular v
1de0: 65 72 73 69 6f 6e 20 6f 66 0d 0a 20 20 20 20 20  ersion of..     
1df0: 20 20 20 20 20 23 20 20 20 20 20 20 20 56 69 73       #       Vis
1e00: 75 61 6c 20 53 74 75 64 69 6f 2e 0d 0a 20 20 20  ual Studio...   
1e10: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1e20: 20 20 20 20 73 77 69 74 63 68 20 2d 65 78 61 63      switch -exac
1e30: 74 20 2d 2d 20 24 79 65 61 72 20 7b 0d 0a 20 20  t -- $year {..  
1e40: 20 20 20 20 20 20 20 20 20 20 32 30 30 35 20 7b            2005 {
1e50: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1e60: 72 65 74 75 72 6e 20 6e 65 74 46 78 32 30 0d 0a  return netFx20..
1e70: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1e80: 20 20 20 20 20 20 20 20 20 20 20 32 30 30 38 20             2008 
1e90: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1ea0: 20 72 65 74 75 72 6e 20 6e 65 74 46 78 33 35 0d   return netFx35.
1eb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
1ec0: 20 20 20 20 20 20 20 20 20 20 20 20 32 30 31 30              2010
1ed0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1ee0: 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78 34 30    return netFx40
1ef0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
1f00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 32 30 31  .            201
1f10: 32 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  2 {..           
1f20: 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78 34     return netFx4
1f30: 35 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  5..            }
1f40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 32 30  ..            20
1f50: 31 33 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  13 {..          
1f60: 20 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78      return netFx
1f70: 34 35 31 3b 20 23 20 54 4f 44 4f 3a 20 4f 72 20  451; # TODO: Or 
1f80: 22 6e 65 74 46 78 34 35 32 22 3f 0d 0a 20 20 20  "netFx452"?..   
1f90: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1fa0: 20 20 20 20 20 20 20 20 32 30 31 35 20 7b 0d 0a          2015 {..
1fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1fc0: 74 75 72 6e 20 6e 65 74 46 78 34 36 3b 20 23 20  turn netFx46; # 
1fd0: 54 4f 44 4f 3a 20 4f 72 20 22 6e 65 74 46 78 34  TODO: Or "netFx4
1fe0: 36 31 22 3f 0d 0a 20 20 20 20 20 20 20 20 20 20  61"?..          
1ff0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
2000: 20 64 65 66 61 75 6c 74 20 7b 0d 0a 20 20 20 20   default {..    
2010: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2020: 20 6e 65 74 46 78 33 35 3b 20 23 20 54 4f 44 4f   netFx35; # TODO
2030: 3a 20 47 6f 6f 64 20 22 66 61 6c 6c 62 61 63 6b  : Good "fallback
2040: 22 20 64 65 66 61 75 6c 74 3f 0d 0a 20 20 20 20  " default?..    
2050: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
2060: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
2070: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
2080: 7d 0d 0a 0c 0d 0a 20 20 20 20 23 0d 0a 20 20 20  }.....    #..   
2090: 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72   # NOTE: This pr
20a0: 6f 63 65 64 75 72 65 20 73 68 6f 75 6c 64 20 72  ocedure should r
20b0: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
20c0: 66 20 74 68 65 20 63 6f 6e 66 69 67 75 72 65 64  f the configured
20d0: 20 74 65 73 74 0d 0a 20 20 20 20 23 20 20 20 20   test..    #    
20e0: 20 20 20 70 6c 61 74 66 6f 72 6d 20 69 73 20 6d     platform is m
20f0: 6f 73 74 20 6c 69 6b 65 6c 79 20 74 68 65 20 64  ost likely the d
2100: 65 66 61 75 6c 74 20 66 6f 72 20 74 68 69 73 20  efault for this 
2110: 6d 61 63 68 69 6e 65 2e 0d 0a 20 20 20 20 23 0d  machine...    #.
2120: 0a 20 20 20 20 70 72 6f 63 20 69 73 44 65 66 61  .    proc isDefa
2130: 75 6c 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d  ultBuildPlatform
2140: 20 7b 20 7b 76 65 72 62 6f 73 65 20 66 61 6c 73   { {verbose fals
2150: 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e} } {..      #.
2160: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
2170: 75 6e 6e 69 6e 67 20 6f 6e 20 57 6f 57 36 34 20  unning on WoW64 
2180: 69 73 20 6e 65 76 65 72 20 74 68 65 20 64 65 66  is never the def
2190: 61 75 6c 74 20 70 6c 61 74 66 6f 72 6d 2e 0d 0a  ault platform...
21a0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
21b0: 66 20 7b 5b 69 73 52 75 6e 6e 69 6e 67 57 6f 57  f {[isRunningWoW
21c0: 36 34 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  64]} then {..   
21d0: 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73       if {$verbos
21e0: 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
21f0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
2200: 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20  st_channel \..  
2210: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
2220: 2d 20 64 65 74 65 63 74 65 64 20 6e 6f 6e 2d 64  - detected non-d
2230: 65 66 61 75 6c 74 20 70 6c 61 74 66 6f 72 6d 20  efault platform 
2240: 28 57 6f 57 36 34 29 5c 6e 22 0d 0a 20 20 20 20  (WoW64)\n"..    
2250: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 72      }..        r
2260: 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20  eturn false..   
2270: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
2280: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
2290: 68 69 73 20 68 61 73 20 61 20 67 6f 6f 64 20 63  his has a good c
22a0: 68 61 6e 63 65 20 6f 66 20 62 65 69 6e 67 20 74  hance of being t
22b0: 68 65 20 64 65 66 61 75 6c 74 20 70 6c 61 74 66  he default platf
22c0: 6f 72 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  orm...      #.. 
22d0: 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73       if {$verbos
22e0: 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
22f0: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
2300: 5f 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 64  _channel "---- d
2310: 65 74 65 63 74 65 64 20 64 65 66 61 75 6c 74 20  etected default 
2320: 70 6c 61 74 66 6f 72 6d 5c 6e 22 0d 0a 20 20 20  platform\n"..   
2330: 20 20 20 7d 0d 0a 20 20 20 20 20 20 72 65 74 75     }..      retu
2340: 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 7d 0d 0a  rn true..    }..
2350: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42  ...    proc getB
2360: 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20 7b 20 6e  uildPlatform { n
2370: 61 74 69 76 65 20 7d 20 7b 0d 0a 20 20 20 20 20  ative } {..     
2380: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
2390: 73 20 3a 3a 74 65 73 74 5f 70 6c 61 74 66 6f 72  s ::test_platfor
23a0: 6d 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  m] && \..       
23b0: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
23c0: 68 20 24 3a 3a 74 65 73 74 5f 70 6c 61 74 66 6f  h $::test_platfo
23d0: 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  rm] > 0} then {.
23e0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
23f0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
2400: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65  the specified te
2410: 73 74 20 70 6c 61 74 66 6f 72 6d 2e 20 20 49 66  st platform.  If
2420: 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 69   this variable i
2430: 73 20 6e 6f 74 20 73 65 74 2c 0d 0a 20 20 20 20  s not set,..    
2440: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
2450: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 77 69  default value wi
2460: 6c 6c 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74  ll be based on t
2470: 68 65 20 6d 61 63 68 69 6e 65 20 61 72 63 68 69  he machine archi
2480: 74 65 63 74 75 72 65 2e 0d 0a 20 20 20 20 20 20  tecture...      
2490: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
24a0: 75 72 6e 20 5b 65 78 70 72 20 7b 24 6e 61 74 69  urn [expr {$nati
24b0: 76 65 20 3f 20 24 3a 3a 74 65 73 74 5f 70 6c 61  ve ? $::test_pla
24c0: 74 66 6f 72 6d 20 3a 20 22 22 7d 5d 0d 0a 20 20  tform : ""}]..  
24d0: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69      } elseif {[i
24e0: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73  nfo exists ::tes
24f0: 74 5f 6d 61 63 68 69 6e 65 5d 20 26 26 20 5c 0d  t_machine] && \.
2500: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
2510: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73  ng length $::tes
2520: 74 5f 6d 61 63 68 69 6e 65 5d 20 3e 20 30 7d 20  t_machine] > 0} 
2530: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
2540: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
2550: 45 3a 20 46 6f 72 20 6e 61 74 69 76 65 20 62 75  E: For native bu
2560: 69 6c 64 73 2c 20 72 65 74 75 72 6e 20 74 68 65  ilds, return the
2570: 20 70 6c 61 74 66 6f 72 6d 20 6e 61 6d 65 20 63   platform name c
2580: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 0d  orresponding to.
2590: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
25a0: 20 74 68 65 20 74 65 73 74 20 6d 61 63 68 69 6e   the test machin
25b0: 65 20 61 72 63 68 69 74 65 63 74 75 72 65 3b 20  e architecture; 
25c0: 6f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  otherwise, retur
25d0: 6e 20 61 6e 20 65 6d 70 74 79 0d 0a 20 20 20 20  n an empty..    
25e0: 20 20 20 20 23 20 20 20 20 20 20 20 73 74 72 69      #       stri
25f0: 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ng...        #..
2600: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
2610: 65 78 70 72 20 7b 0d 0a 20 20 20 20 20 20 20 20  expr {..        
2620: 20 20 24 6e 61 74 69 76 65 20 3f 20 5b 6d 61 63    $native ? [mac
2630: 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72 6d 20 24  hineToPlatform $
2640: 3a 3a 74 65 73 74 5f 6d 61 63 68 69 6e 65 5d 20  ::test_machine] 
2650: 3a 20 22 22 0d 0a 20 20 20 20 20 20 20 20 7d 5d  : ""..        }]
2660: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66  ..      } elseif
2670: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
2680: 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61  :tcl_platform(ma
2690: 63 68 69 6e 65 29 5d 7d 20 74 68 65 6e 20 7b 0d  chine)]} then {.
26a0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
26b0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20      # NOTE: For 
26c0: 6e 61 74 69 76 65 20 62 75 69 6c 64 73 2c 20 72  native builds, r
26d0: 65 74 75 72 6e 20 74 68 65 20 70 6c 61 74 66 6f  eturn the platfo
26e0: 72 6d 20 6e 61 6d 65 20 63 6f 72 72 65 73 70 6f  rm name correspo
26f0: 6e 64 69 6e 67 20 74 6f 0d 0a 20 20 20 20 20 20  nding to..      
2700: 20 20 23 20 20 20 20 20 20 20 74 68 65 20 6d 61    #       the ma
2710: 63 68 69 6e 65 20 61 72 63 68 69 74 65 63 74 75  chine architectu
2720: 72 65 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 72  re; otherwise, r
2730: 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73  eturn an empty s
2740: 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20  tring...        
2750: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
2760: 6e 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20 20  n [expr {..     
2770: 20 20 20 20 20 24 6e 61 74 69 76 65 20 3f 20 5b       $native ? [
2780: 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72  machineToPlatfor
2790: 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72  m $::tcl_platfor
27a0: 6d 28 6d 61 63 68 69 6e 65 29 5d 20 3a 20 22 22  m(machine)] : ""
27b0: 0d 0a 20 20 20 20 20 20 20 20 7d 5d 0d 0a 20 20  ..        }]..  
27c0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
27d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
27e0: 20 23 20 4e 4f 54 45 3a 20 4e 6f 20 6d 61 63 68   # NOTE: No mach
27f0: 69 6e 65 20 61 72 63 68 69 74 65 63 74 75 72 65  ine architecture
2800: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72   is available, r
2810: 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73  eturn an empty s
2820: 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20  tring...        
2830: 23 20 20 20 20 20 20 20 49 74 20 69 73 20 69 6d  #       It is im
2840: 70 6f 72 74 61 6e 74 20 74 6f 20 72 65 74 75 72  portant to retur
2850: 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  n an empty strin
2860: 67 20 68 65 72 65 20 62 65 63 61 75 73 65 20 74  g here because t
2870: 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  he..        #   
2880: 20 20 20 20 72 65 73 75 6c 74 20 6f 66 20 74 68      result of th
2890: 69 73 20 70 72 6f 63 65 64 75 72 65 20 6d 61 79  is procedure may
28a0: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 5b 66   be used with [f
28b0: 69 6c 65 20 6a 6f 69 6e 5d 2e 0d 0a 20 20 20 20  ile join]...    
28c0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
28d0: 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 20 20  eturn ""..      
28e0: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
28f0: 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 43 6f   proc getBuildCo
2900: 6e 66 69 67 75 72 61 74 69 6f 6e 20 7b 7d 20 7b  nfiguration {} {
2910: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
2920: 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66 20   # NOTE: See if 
2930: 74 68 65 20 22 63 6f 6e 66 69 67 75 72 61 74 69  the "configurati
2940: 6f 6e 22 20 73 65 74 74 69 6e 67 20 68 61 73 20  on" setting has 
2950: 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 20  been overridden 
2960: 62 79 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  by the..      # 
2970: 20 20 20 20 20 20 75 73 65 72 20 28 65 2e 67 2e        user (e.g.
2980: 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20   on the command 
2990: 6c 69 6e 65 29 2e 20 20 54 68 69 73 20 68 65 6c  line).  This hel
29a0: 70 73 20 63 6f 6e 74 72 6f 6c 20 65 78 61 63 74  ps control exact
29b0: 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ly..      #     
29c0: 20 20 77 68 69 63 68 20 73 65 74 20 6f 66 20 62    which set of b
29d0: 69 6e 61 72 69 65 73 20 77 65 20 61 72 65 20 74  inaries we are t
29e0: 65 73 74 69 6e 67 20 28 69 2e 65 2e 20 74 68 6f  esting (i.e. tho
29f0: 73 65 20 62 75 69 6c 74 20 69 6e 20 74 68 65 0d  se built in the.
2a00: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22  .      #       "
2a10: 44 65 62 75 67 22 20 6f 72 20 22 52 65 6c 65 61  Debug" or "Relea
2a20: 73 65 22 20 62 75 69 6c 64 20 63 6f 6e 66 69 67  se" build config
2a30: 75 72 61 74 69 6f 6e 73 29 2e 20 20 54 6f 20 6f  urations).  To o
2a40: 76 65 72 72 69 64 65 20 74 68 69 73 0d 0a 20 20  verride this..  
2a50: 20 20 20 20 23 20 20 20 20 20 20 20 76 61 6c 75      #       valu
2a60: 65 20 76 69 61 20 74 68 65 20 63 6f 6d 6d 61 6e  e via the comman
2a70: 64 20 6c 69 6e 65 2c 20 65 6e 74 65 72 20 61 20  d line, enter a 
2a80: 63 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c 61 72 20  command similar 
2a90: 74 6f 20 6f 6e 65 20 6f 66 0d 0a 20 20 20 20 20  to one of..     
2aa0: 20 23 20 20 20 20 20 20 20 74 68 65 20 66 6f 6c   #       the fol
2ab0: 6c 6f 77 69 6e 67 20 28 61 6c 6c 20 6f 6e 20 6f  lowing (all on o
2ac0: 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20 20 20  ne line):..     
2ad0: 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20   #..      #     
2ae0: 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65    EagleShell.exe
2af0: 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20   -anyInitialize 
2b00: 22 73 65 74 20 74 65 73 74 5f 63 6f 6e 66 69 67  "set test_config
2b10: 75 72 61 74 69 6f 6e 20 44 65 62 75 67 22 0d 0a  uration Debug"..
2b20: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
2b30: 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c  -file .\path\to\
2b40: 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20  all.eagle..     
2b50: 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20   #..      #     
2b60: 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65    EagleShell.exe
2b70: 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20   -anyInitialize 
2b80: 22 73 65 74 20 74 65 73 74 5f 63 6f 6e 66 69 67  "set test_config
2b90: 75 72 61 74 69 6f 6e 20 52 65 6c 65 61 73 65 22  uration Release"
2ba0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
2bb0: 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74    -file .\path\t
2bc0: 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20  o\all.eagle..   
2bd0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20     #..      #   
2be0: 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65      EagleShell.e
2bf0: 78 65 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c  xe -file .\path\
2c00: 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 20 2d 70 72  to\all.eagle -pr
2c10: 65 54 65 73 74 0d 0a 20 20 20 20 20 20 23 20 20  eTest..      #  
2c20: 20 20 20 20 20 20 20 22 75 6e 73 65 74 20 2d 6e         "unset -n
2c30: 6f 63 6f 6d 70 6c 61 69 6e 20 74 65 73 74 5f 63  ocomplain test_c
2c40: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 0d 0a 20  onfiguration".. 
2c50: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
2c60: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
2c70: 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74  :test_configurat
2c80: 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ion] && \..     
2c90: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
2ca0: 67 74 68 20 24 3a 3a 74 65 73 74 5f 63 6f 6e 66  gth $::test_conf
2cb0: 69 67 75 72 61 74 69 6f 6e 5d 20 3e 20 30 7d 20  iguration] > 0} 
2cc0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
2cd0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
2ce0: 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63 69  E: Use the speci
2cf0: 66 69 65 64 20 74 65 73 74 20 63 6f 6e 66 69 67  fied test config
2d00: 75 72 61 74 69 6f 6e 2e 20 20 54 68 65 20 64 65  uration.  The de
2d10: 66 61 75 6c 74 20 76 61 6c 75 65 20 75 73 65 64  fault value used
2d20: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
2d30: 20 20 66 6f 72 20 74 68 69 73 20 76 61 72 69 61    for this varia
2d40: 62 6c 65 20 69 73 20 74 79 70 69 63 61 6c 6c 79  ble is typically
2d50: 20 22 52 65 6c 65 61 73 65 22 2c 20 61 73 20 73   "Release", as s
2d60: 65 74 20 62 79 20 74 68 65 20 74 65 73 74 0d 0a  et by the test..
2d70: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2d80: 73 75 69 74 65 20 69 74 73 65 6c 66 2e 0d 0a 20  suite itself... 
2d90: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2da0: 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74    return $::test
2db0: 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0d 0a  _configuration..
2dc0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
2dd0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2de0: 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 72 6d 61     # NOTE: Norma
2df0: 6c 6c 79 2c 20 77 65 20 77 69 6c 6c 20 6e 65 76  lly, we will nev
2e00: 65 72 20 68 69 74 20 74 68 69 73 20 63 61 73 65  er hit this case
2e10: 20 62 65 63 61 75 73 65 20 74 68 65 20 76 61 6c   because the val
2e20: 75 65 20 6f 66 20 74 68 65 0d 0a 20 20 20 20 20  ue of the..     
2e30: 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74 20     #       test 
2e40: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 76 61  configuration va
2e50: 72 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73  riable is always
2e60: 20 73 65 74 20 62 79 20 74 68 65 20 74 65 73 74   set by the test
2e70: 20 73 75 69 74 65 0d 0a 20 20 20 20 20 20 20 20   suite..        
2e80: 23 20 20 20 20 20 20 20 69 74 73 65 6c 66 3b 20  #       itself; 
2e90: 68 6f 77 65 76 65 72 2c 20 69 74 20 63 61 6e 20  however, it can 
2ea0: 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 75 73  be overridden us
2eb0: 69 6e 67 20 74 68 65 20 75 6e 73 65 74 20 63 6f  ing the unset co
2ec0: 6d 6d 61 6e 64 0d 0a 20 20 20 20 20 20 20 20 23  mmand..        #
2ed0: 20 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20         from the 
2ee0: 2d 70 72 65 54 65 73 74 20 6f 70 74 69 6f 6e 20  -preTest option 
2ef0: 74 6f 20 74 68 65 20 74 65 73 74 20 73 75 69 74  to the test suit
2f00: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
2f10: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
2f20: 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d 28  :eagle_platform(
2f30: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 29 0d 0a  configuration)..
2f40: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
2f50: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42  ...    proc getB
2f60: 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f  uildConfiguratio
2f70: 6e 73 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ns {} {..      #
2f80: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
2f90: 53 65 65 20 69 66 20 74 68 65 20 6c 69 73 74 20  See if the list 
2fa0: 6f 66 20 74 65 73 74 20 63 6f 6e 66 69 67 75 72  of test configur
2fb0: 61 74 69 6f 6e 73 20 68 61 73 20 62 65 65 6e 20  ations has been 
2fc0: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 0d 0a 20  overridden by.. 
2fd0: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
2fe0: 20 75 73 65 72 20 28 65 2e 67 2e 20 6f 6e 20 74   user (e.g. on t
2ff0: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29  he command line)
3000: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
3010: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
3020: 74 73 20 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67  ts ::test_config
3030: 75 72 61 74 69 6f 6e 73 5d 20 26 26 20 5c 0d 0a  urations] && \..
3040: 20 20 20 20 20 20 20 20 20 20 5b 6c 6c 65 6e 67            [lleng
3050: 74 68 20 24 3a 3a 74 65 73 74 5f 63 6f 6e 66 69  th $::test_confi
3060: 67 75 72 61 74 69 6f 6e 73 5d 20 3e 20 30 7d 20  gurations] > 0} 
3070: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
3080: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
3090: 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63 69  E: Use the speci
30a0: 66 69 65 64 20 6c 69 73 74 20 6f 66 20 74 65 73  fied list of tes
30b0: 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  t configurations
30c0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
30d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
30e0: 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69  test_configurati
30f0: 6f 6e 73 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  ons..      } els
3100: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e {..        #..
3110: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
3120: 55 73 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  Use the default 
3130: 6c 69 73 74 20 6f 66 20 74 65 73 74 20 63 6f 6e  list of test con
3140: 66 69 67 75 72 61 74 69 6f 6e 73 2e 0d 0a 20 20  figurations...  
3150: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
3160: 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 44 65   return [list De
3170: 62 75 67 20 52 65 6c 65 61 73 65 5d 0d 0a 20 20  bug Release]..  
3180: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
3190: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 75 69  .    proc getBui
31a0: 6c 64 42 61 73 65 44 69 72 65 63 74 6f 72 79 20  ldBaseDirectory 
31b0: 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
31c0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 67       # NOTE: Fig
31d0: 75 72 65 20 6f 75 74 20 74 68 65 20 62 61 73 65  ure out the base
31e0: 20 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65   directory where
31f0: 20 61 6c 6c 20 74 68 65 20 62 75 69 6c 64 73 20   all the builds 
3200: 73 68 6f 75 6c 64 20 62 65 0d 0a 20 20 20 20 20  should be..     
3210: 20 23 20 20 20 20 20 20 20 6c 6f 63 61 74 65 64   #       located
3220: 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20  .  This will be 
3230: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68  the directory th
3240: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
3250: 61 63 74 75 61 6c 0d 0a 20 20 20 20 20 20 23 20  actual..      # 
3260: 20 20 20 20 20 20 62 75 69 6c 64 20 6f 75 74 70        build outp
3270: 75 74 20 64 69 72 65 63 74 6f 72 79 20 28 65 2e  ut directory (e.
3280: 67 2e 20 70 61 72 65 6e 74 20 6f 66 20 22 62 69  g. parent of "bi
3290: 6e 22 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  n")...      #.. 
32a0: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
32b0: 78 69 73 74 73 20 3a 3a 62 75 69 6c 64 5f 62 61  xists ::build_ba
32c0: 73 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26  se_directory] &&
32d0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
32e0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
32f0: 62 75 69 6c 64 5f 62 61 73 65 5f 64 69 72 65 63  build_base_direc
3300: 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20  tory] > 0} then 
3310: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
3320: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
3330: 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  e location of th
3340: 65 20 62 75 69 6c 64 20 62 61 73 65 20 64 69 72  e build base dir
3350: 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
3360: 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20  overridden;..   
3370: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
3380: 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 76  refore, use it v
3390: 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20  erbatim...      
33a0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
33b0: 75 72 6e 20 24 3a 3a 62 75 69 6c 64 5f 62 61 73  urn $::build_bas
33c0: 65 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  e_directory..   
33d0: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e     } elseif {[in
33e0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f 6d 6d  fo exists ::comm
33f0: 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26  on_directory] &&
3400: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
3410: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
3420: 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79  common_directory
3430: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
3440: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
3450: 20 20 23 20 4e 4f 54 45 3a 20 4e 65 78 74 2c 20    # NOTE: Next, 
3460: 66 61 6c 6c 62 61 63 6b 20 74 6f 20 74 68 65 20  fallback to the 
3470: 67 72 61 6e 64 70 61 72 65 6e 74 20 64 69 72 65  grandparent dire
3480: 63 74 6f 72 79 20 6f 66 20 74 68 65 20 6f 6e 65  ctory of the one
3490: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
34a0: 20 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69    containing thi
34b0: 73 20 66 69 6c 65 20 28 69 2e 65 2e 20 22 63 6f  s file (i.e. "co
34c0: 6d 6d 6f 6e 2e 65 61 67 6c 65 22 29 2c 20 69 66  mmon.eagle"), if
34d0: 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20   available...   
34e0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
34f0: 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 64 69 72  return [file dir
3500: 6e 61 6d 65 20 5b 66 69 6c 65 20 64 69 72 6e 61  name [file dirna
3510: 6d 65 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72  me $::common_dir
3520: 65 63 74 6f 72 79 5d 5d 0d 0a 20 20 20 20 20 20  ectory]]..      
3530: 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20  } elseif {[info 
3540: 65 78 69 73 74 73 20 3a 3a 70 61 74 68 5d 20 26  exists ::path] &
3550: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
3560: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
3570: 3a 70 61 74 68 5d 20 3e 20 30 7d 20 74 68 65 6e  :path] > 0} then
3580: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
3590: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46         # NOTE: F
35a0: 69 6e 61 6c 6c 79 2c 20 66 61 6c 6c 62 61 63 6b  inally, fallback
35b0: 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 64   to the parent d
35c0: 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20  irectory of the 
35d0: 45 61 67 6c 65 54 65 73 74 0d 0a 20 20 20 20 20  EagleTest..     
35e0: 20 20 20 23 20 20 20 20 20 20 20 70 61 74 68 2e     #       path.
35f0: 20 20 54 68 65 20 45 61 67 6c 65 54 65 73 74 20    The EagleTest 
3600: 70 61 63 6b 61 67 65 20 67 75 61 72 61 6e 74 65  package guarante
3610: 65 73 20 74 68 61 74 20 74 68 69 73 20 76 61 72  es that this var
3620: 69 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 23  iable..        #
3630: 20 20 20 20 20 20 20 77 69 6c 6c 20 62 65 20 73         will be s
3640: 65 74 20 74 6f 20 74 68 65 20 64 69 72 65 63 74  et to the direct
3650: 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ory containing t
3660: 68 65 20 66 69 72 73 74 20 66 69 6c 65 20 74 6f  he first file to
3670: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
3680: 20 20 65 78 65 63 75 74 65 20 74 68 65 20 5b 72    execute the [r
3690: 75 6e 54 65 73 74 50 72 6f 6c 6f 67 75 65 5d 20  unTestPrologue] 
36a0: 73 63 72 69 70 74 20 6c 69 62 72 61 72 79 20 70  script library p
36b0: 72 6f 63 65 64 75 72 65 2e 0d 0a 20 20 20 20 20  rocedure...     
36c0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
36d0: 74 75 72 6e 20 5b 66 69 6c 65 20 64 69 72 6e 61  turn [file dirna
36e0: 6d 65 20 24 3a 3a 70 61 74 68 5d 0d 0a 20 20 20  me $::path]..   
36f0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
3700: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
3710: 23 20 4e 4f 54 45 3a 20 4e 6f 20 70 61 74 68 20  # NOTE: No path 
3720: 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65  is available, re
3730: 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74  turn an empty st
3740: 72 69 6e 67 2e 20 20 54 68 69 73 20 70 6f 69 6e  ring.  This poin
3750: 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
3760: 20 20 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65     should not be
3770: 20 72 65 61 63 68 65 64 2e 0d 0a 20 20 20 20 20   reached...     
3780: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
3790: 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 20 20 7d  turn ""..      }
37a0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
37b0: 70 72 6f 63 20 67 65 74 53 51 4c 69 74 65 54 65  proc getSQLiteTe
37c0: 73 74 44 61 74 61 50 61 74 68 20 7b 7d 20 7b 0d  stDataPath {} {.
37d0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
37e0: 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f  # NOTE: Figure o
37f0: 75 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ut the directory
3800: 20 77 68 65 72 65 20 61 6c 6c 20 74 68 65 20 74   where all the t
3810: 65 73 74 20 64 61 74 61 20 66 69 6c 65 73 20 73  est data files s
3820: 68 6f 75 6c 64 0d 0a 20 20 20 20 20 20 23 20 20  hould..      #  
3830: 20 20 20 20 20 62 65 20 6c 6f 63 61 74 65 64 2e       be located.
3840: 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65    This should be
3850: 20 74 68 65 20 22 64 61 74 61 22 20 64 69 72 65   the "data" dire
3860: 63 74 6f 72 79 20 62 65 6e 65 61 74 68 20 74 68  ctory beneath th
3870: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
3880: 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61   directory conta
3890: 69 6e 69 6e 67 20 74 68 65 20 61 63 74 75 61 6c  ining the actual
38a0: 20 74 65 73 74 20 73 63 72 69 70 74 73 2e 0d 0a   test scripts...
38b0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72        #..      r
38c0: 65 74 75 72 6e 20 5b 66 69 6c 65 20 6a 6f 69 6e  eturn [file join
38d0: 20 24 3a 3a 70 61 74 68 20 64 61 74 61 5d 0d 0a   $::path data]..
38e0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
38f0: 6f 63 20 69 73 52 75 6e 6e 69 6e 67 57 6f 57 36  oc isRunningWoW6
3900: 34 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  4 {} {..      #.
3910: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46  .      # NOTE: F
3920: 6f 72 20 6e 6f 77 2c 20 6a 75 73 74 20 75 73 65  or now, just use
3930: 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 74 65   the existing te
3940: 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 6f  st constraint fo
3950: 72 20 64 65 74 65 63 74 69 6e 67 0d 0a 20 20 20  r detecting..   
3960: 20 20 20 23 20 20 20 20 20 20 20 61 20 57 6f 57     #       a WoW
3970: 36 34 20 70 72 6f 63 65 73 73 2e 0d 0a 20 20 20  64 process...   
3980: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
3990: 72 6e 20 5b 68 61 76 65 43 6f 6e 73 74 72 61 69  rn [haveConstrai
39a0: 6e 74 20 77 6f 77 36 34 5d 0d 0a 20 20 20 20 7d  nt wow64]..    }
39b0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73  .....    proc is
39c0: 4d 69 78 65 64 4d 6f 64 65 41 73 73 65 6d 62 6c  MixedModeAssembl
39d0: 79 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 76 61  y { fileName {va
39e0: 72 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20  rName ""} } {.. 
39f0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
3a00: 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20 6d 61 6b  NOTE: First, mak
3a10: 65 20 73 75 72 65 20 74 68 65 20 74 65 73 74 20  e sure the test 
3a20: 73 75 69 74 65 20 69 6e 66 72 61 73 74 72 75 63  suite infrastruc
3a30: 74 75 72 65 20 69 73 20 61 6c 6c 6f 77 65 64 20  ture is allowed 
3a40: 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  to..      #     
3a50: 20 20 75 73 65 20 74 68 65 20 5b 65 78 65 63 5d    use the [exec]
3a60: 20 63 6f 6d 6d 61 6e 64 2e 0d 0a 20 20 20 20 20   command...     
3a70: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b   #..      if {![
3a80: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
3a90: 28 65 78 65 63 29 5d 20 26 26 20 21 5b 69 6e 66  (exec)] && ![inf
3aa0: 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f  o exists ::no(co
3ab0: 72 46 6c 61 67 73 29 5d 7d 20 74 68 65 6e 20 7b  rFlags)]} then {
3ac0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
3ad0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
3ae0: 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  the location of 
3af0: 43 6f 72 46 6c 61 67 73 20 69 73 20 70 72 65 73  CorFlags is pres
3b00: 65 6e 74 20 69 6e 20 74 68 65 20 65 6e 76 69 72  ent in the envir
3b10: 6f 6e 6d 65 6e 74 2c 0d 0a 20 20 20 20 20 20 20  onment,..       
3b20: 20 23 20 20 20 20 20 20 20 75 73 65 20 69 74 3b   #       use it;
3b30: 20 6f 74 68 65 72 77 69 73 65 20 61 73 73 75 6d   otherwise assum
3b40: 65 20 69 74 20 69 73 20 69 6e 20 74 68 65 20 50  e it is in the P
3b50: 41 54 48 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ATH...        #.
3b60: 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 72  .        set cor
3b70: 46 6c 61 67 73 20 5b 65 78 70 72 20 7b 0d 0a 20  Flags [expr {.. 
3b80: 20 20 20 20 20 20 20 20 20 5b 69 6e 66 6f 20 65           [info e
3b90: 78 69 73 74 73 20 3a 3a 65 6e 76 28 43 6f 72 46  xists ::env(CorF
3ba0: 6c 61 67 73 29 5d 20 3f 20 24 3a 3a 65 6e 76 28  lags)] ? $::env(
3bb0: 43 6f 72 46 6c 61 67 73 29 20 3a 20 22 43 6f 72  CorFlags) : "Cor
3bc0: 46 6c 61 67 73 22 0d 0a 20 20 20 20 20 20 20 20  Flags"..        
3bd0: 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  }]....        #.
3be0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
3bf0: 20 41 74 74 65 6d 70 74 20 74 6f 20 65 78 65 63   Attempt to exec
3c00: 75 74 65 20 43 6f 72 46 6c 61 67 73 20 6f 6e 20  ute CorFlags on 
3c10: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
3c20: 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  le...        #..
3c30: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
3c40: 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
3c50: 65 78 65 63 20 2d 2d 20 24 63 6f 72 46 6c 61 67  exec -- $corFlag
3c60: 73 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  s [file nativena
3c70: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20  me $fileName].. 
3c80: 20 20 20 20 20 20 20 7d 20 65 78 65 63 5d 20 3d         } exec] =
3c90: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
3ca0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
3cb0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 72      # NOTE: If r
3cc0: 65 71 75 65 73 74 65 64 20 62 79 20 6f 75 72 20  equested by our 
3cd0: 63 61 6c 6c 65 72 2c 20 61 74 74 65 6d 70 74 20  caller, attempt 
3ce0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
3cf0: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
3d00: 20 20 20 20 70 6c 61 74 66 6f 72 6d 20 66 6f 72      platform for
3d10: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
3d20: 69 6c 65 20 61 73 20 77 65 6c 6c 2e 0d 0a 20 20  ile as well...  
3d30: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
3d40: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
3d50: 20 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d 65   length $varName
3d60: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
3d70: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
3d80: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
3d90: 3a 20 53 74 6f 72 65 20 74 68 65 20 70 6c 61 74  : Store the plat
3da0: 66 6f 72 6d 20 69 6e 20 74 68 65 20 6e 61 6d 65  form in the name
3db0: 64 20 76 61 72 69 61 62 6c 65 20 69 6e 20 74 68  d variable in th
3dc0: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  e..            #
3dd0: 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 20 6f         context o
3de0: 66 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20  f our caller... 
3df0: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
3e00: 20 20 20 20 20 20 20 20 20 20 75 70 76 61 72 20            upvar 
3e10: 31 20 24 76 61 72 4e 61 6d 65 20 70 6c 61 74 66  1 $varName platf
3e20: 6f 72 6d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  orm....         
3e30: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
3e40: 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
3e50: 74 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65  t to extract the
3e60: 20 50 45 20 6c 69 6e 65 20 66 72 6f 6d 20 74 68   PE line from th
3e70: 65 20 63 61 70 74 75 72 65 64 0d 0a 20 20 20 20  e captured..    
3e80: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
3e90: 6f 75 74 70 75 74 2e 20 20 49 66 20 74 68 69 73  output.  If this
3ea0: 20 76 61 6c 75 65 20 69 73 20 22 50 45 33 32 22   value is "PE32"
3eb0: 20 6f 72 20 22 50 45 33 32 2b 22 2c 20 74 68 65   or "PE32+", the
3ec0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
3ed0: 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 20 66        assembly f
3ee0: 69 6c 65 20 69 73 20 33 32 2d 62 69 74 20 6f 72  ile is 32-bit or
3ef0: 20 36 34 2d 62 69 74 2c 20 72 65 73 70 65 63 74   64-bit, respect
3f00: 69 76 65 6c 79 3b 0d 0a 20 20 20 20 20 20 20 20  ively;..        
3f10: 20 20 20 20 23 20 20 20 20 20 20 20 6f 74 68 65      #       othe
3f20: 72 77 69 73 65 2c 20 69 74 73 20 74 79 70 65 20  rwise, its type 
3f30: 69 73 20 75 6e 6b 6e 6f 77 6e 2e 0d 0a 20 20 20  is unknown...   
3f40: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
3f50: 20 20 20 20 20 20 20 20 73 65 74 20 70 61 74 74          set patt
3f60: 65 72 6e 20 7b 5e 50 45 20 20 20 20 20 20 20 20  ern {^PE        
3f70: 3a 20 28 50 45 33 32 7c 50 45 33 32 5c 2b 29 5c  : (PE32|PE32\+)\
3f80: 73 2b 24 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  s+$}....        
3f90: 20 20 20 20 69 66 20 7b 5b 72 65 67 65 78 70 20      if {[regexp 
3fa0: 2d 6c 69 6e 65 20 2d 2d 20 24 70 61 74 74 65 72  -line -- $patter
3fb0: 6e 20 24 65 78 65 63 20 64 75 6d 6d 79 20 70 65  n $exec dummy pe
3fc0: 33 32 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  32]} then {..   
3fd0: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
3fe0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 48 41              # HA
3ff0: 43 4b 3a 20 54 68 69 73 20 5b 73 77 69 74 63 68  CK: This [switch
4000: 5d 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 33  ] assumes that 3
4010: 32 2d 62 69 74 20 65 78 65 63 75 74 61 62 6c 65  2-bit executable
4020: 73 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20 20  s are..         
4030: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6c 77       #       alw
4040: 61 79 73 20 78 38 36 20 61 6e 64 20 74 68 61 74  ays x86 and that
4050: 20 36 34 2d 62 69 74 20 65 78 65 63 75 74 61 62   64-bit executab
4060: 6c 65 73 20 61 72 65 20 61 6c 77 61 79 73 0d 0a  les are always..
4070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
4080: 20 20 20 20 20 20 78 36 34 2e 0d 0a 20 20 20 20        x64...    
4090: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
40a0: 20 20 20 20 20 20 20 20 20 20 20 73 77 69 74 63             switc
40b0: 68 20 2d 65 78 61 63 74 20 2d 2d 20 24 70 65 33  h -exact -- $pe3
40c0: 32 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  2 {..           
40d0: 20 20 20 20 20 50 45 33 32 20 7b 0d 0a 20 20 20       PE32 {..   
40e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
40f0: 65 74 20 70 6c 61 74 66 6f 72 6d 20 57 69 6e 33  et platform Win3
4100: 32 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2..             
4110: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
4120: 20 20 20 20 20 20 50 45 33 32 2b 20 7b 0d 0a 20        PE32+ {.. 
4130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4140: 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 78 36   set platform x6
4150: 34 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  4..             
4160: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
4170: 20 20 20 20 20 20 64 65 66 61 75 6c 74 20 7b 0d        default {.
4180: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4190: 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20     set platform 
41a0: 22 22 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ""..            
41b0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
41c0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
41d0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
41e0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
41f0: 70 6c 61 74 66 6f 72 6d 20 22 22 0d 0a 20 20 20  platform ""..   
4200: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
4210: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
4220: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4230: 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
4240: 74 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65  t to extract the
4250: 20 49 4c 4f 4e 4c 59 20 6c 69 6e 65 20 66 72 6f   ILONLY line fro
4260: 6d 20 74 68 65 20 63 61 70 74 75 72 65 64 0d 0a  m the captured..
4270: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
4280: 20 20 6f 75 74 70 75 74 2e 20 20 49 66 20 74 68    output.  If th
4290: 69 73 20 76 61 6c 75 65 20 69 73 20 7a 65 72 6f  is value is zero
42a0: 2c 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  , the specified 
42b0: 66 69 6c 65 20 6d 75 73 74 0d 0a 20 20 20 20 20  file must..     
42c0: 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65 20       #       be 
42d0: 61 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73  a mixed-mode ass
42e0: 65 6d 62 6c 79 3b 20 6f 74 68 65 72 77 69 73 65  embly; otherwise
42f0: 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  , it contains on
4300: 6c 79 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  ly..          # 
4310: 20 20 20 20 20 20 6d 61 6e 61 67 65 64 20 63 6f        managed co
4320: 6d 70 6f 6e 65 6e 74 73 2e 0d 0a 20 20 20 20 20  mponents...     
4330: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4340: 20 20 73 65 74 20 70 61 74 74 65 72 6e 20 7b 5e    set pattern {^
4350: 49 4c 4f 4e 4c 59 20 20 20 20 3a 20 28 30 7c 31  ILONLY    : (0|1
4360: 29 5c 73 2b 24 7d 0d 0a 0d 0a 20 20 20 20 20 20  )\s+$}....      
4370: 20 20 20 20 69 66 20 7b 21 5b 72 65 67 65 78 70      if {![regexp
4380: 20 2d 6c 69 6e 65 20 2d 2d 20 24 70 61 74 74 65   -line -- $patte
4390: 72 6e 20 24 65 78 65 63 20 64 75 6d 6d 79 20 69  rn $exec dummy i
43a0: 6c 4f 6e 6c 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  lOnly]} then {..
43b0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
43c0: 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20  rn false..      
43d0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
43e0: 20 20 20 69 66 20 7b 21 24 69 6c 4f 6e 6c 79 7d     if {!$ilOnly}
43f0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
4400: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
4410: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
4420: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
4430: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
4440: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74      # NOTE: If t
4450: 68 65 20 74 65 73 74 20 73 75 69 74 65 20 63 61  he test suite ca
4460: 6e 6e 6f 74 20 75 73 65 20 5b 65 78 65 63 5d 20  nnot use [exec] 
4470: 6f 72 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  or execution of 
4480: 43 6f 72 46 6c 61 67 73 0d 0a 20 20 20 20 20 20  CorFlags..      
4490: 23 20 20 20 20 20 20 20 66 61 69 6c 65 64 2c 20  #       failed, 
44a0: 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 0d 0a 20  return false... 
44b0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
44c0: 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20  turn false..    
44d0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
44e0: 65 74 43 6f 72 65 42 69 6e 61 72 79 46 69 6c 65  etCoreBinaryFile
44f0: 4e 61 6d 65 73 4f 6e 6c 79 20 7b 7d 20 7b 0d 0a  NamesOnly {} {..
4500: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
4510: 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20 63 68   NOTE: First, ch
4520: 65 63 6b 20 69 66 20 74 68 65 20 6c 69 73 74 20  eck if the list 
4530: 6f 66 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72  of native librar
4540: 79 20 66 69 6c 65 20 6e 61 6d 65 73 20 68 61 73  y file names has
4550: 20 62 65 65 6e 0d 0a 20 20 20 20 20 20 23 20 20   been..      #  
4560: 20 20 20 20 20 6d 61 6e 75 61 6c 6c 79 20 6f 76       manually ov
4570: 65 72 72 69 64 64 65 6e 2e 0d 0a 20 20 20 20 20  erridden...     
4580: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
4590: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 61 74  nfo exists ::nat
45a0: 69 76 65 5f 6c 69 62 72 61 72 79 5f 66 69 6c 65  ive_library_file
45b0: 5f 6e 61 6d 65 73 5d 20 26 26 20 5c 0d 0a 20 20  _names] && \..  
45c0: 20 20 20 20 20 20 20 20 5b 6c 6c 65 6e 67 74 68          [llength
45d0: 20 24 3a 3a 6e 61 74 69 76 65 5f 6c 69 62 72 61   $::native_libra
45e0: 72 79 5f 66 69 6c 65 5f 6e 61 6d 65 73 5d 20 3e  ry_file_names] >
45f0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
4600: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
4610: 20 4e 4f 54 45 3a 20 54 68 65 20 6c 69 73 74 20   NOTE: The list 
4620: 6f 66 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72  of native librar
4630: 79 20 66 69 6c 65 20 6e 61 6d 65 73 20 68 61 73  y file names has
4640: 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e   been overridden
4650: 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ;..        #    
4660: 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73     therefore, us
4670: 65 20 69 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a  e it verbatim...
4680: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
4690: 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 6e 61 74     return $::nat
46a0: 69 76 65 5f 6c 69 62 72 61 72 79 5f 66 69 6c 65  ive_library_file
46b0: 5f 6e 61 6d 65 73 0d 0a 20 20 20 20 20 20 7d 20  _names..      } 
46c0: 65 6c 73 65 69 66 20 7b 5b 69 73 57 69 6e 64 6f  elseif {[isWindo
46d0: 77 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ws]} then {..   
46e0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
46f0: 23 20 4e 4f 54 45 3a 20 4f 74 68 65 72 77 69 73  # NOTE: Otherwis
4700: 65 2c 20 6f 6e 20 57 69 6e 64 6f 77 73 2c 20 61  e, on Windows, a
4710: 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 64 65  lways use the de
4720: 66 61 75 6c 74 20 66 69 6c 65 20 6e 61 6d 65 0d  fault file name.
4730: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
4740: 20 22 73 71 6c 69 74 65 33 2e 64 6c 6c 22 2e 0d   "sqlite3.dll"..
4750: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
4760: 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74      return [list
4770: 20 73 71 6c 69 74 65 33 2e 64 6c 6c 5d 0d 0a 20   sqlite3.dll].. 
4780: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
4790: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
47a0: 20 20 23 20 4e 4f 54 45 3a 20 4f 74 68 65 72 77    # NOTE: Otherw
47b0: 69 73 65 2c 20 72 65 74 75 72 6e 20 62 6f 74 68  ise, return both
47c0: 20 74 68 65 20 67 65 6e 65 72 69 63 20 50 4f 53   the generic POS
47d0: 49 58 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64  IX file name and
47e0: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
47f0: 20 20 20 20 20 20 4d 61 63 20 4f 53 20 58 20 66        Mac OS X f
4800: 69 6c 65 20 6e 61 6d 65 2c 20 73 69 6e 63 65 20  ile name, since 
4810: 77 65 20 64 6f 20 6e 6f 74 20 63 75 72 72 65 6e  we do not curren
4820: 74 6c 79 20 68 61 76 65 20 61 6e 20 65 61 73 79  tly have an easy
4830: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
4840: 20 20 77 61 79 20 74 6f 20 64 65 74 65 63 74 20    way to detect 
4850: 77 68 69 63 68 20 6f 66 20 74 68 6f 73 65 20 70  which of those p
4860: 6c 61 74 66 6f 72 6d 73 20 77 65 20 61 72 65 20  latforms we are 
4870: 72 75 6e 6e 69 6e 67 20 6f 6e 2e 0d 0a 20 20 20  running on...   
4880: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4890: 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 6c 69 62  return [list lib
48a0: 73 71 6c 69 74 65 33 2e 73 6f 20 6c 69 62 73 71  sqlite3.so libsq
48b0: 6c 69 74 65 33 2e 64 79 6c 69 62 5d 0d 0a 20 20  lite3.dylib]..  
48c0: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
48d0: 0a 20 20 20 20 70 72 6f 63 20 69 73 42 75 69 6c  .    proc isBuil
48e0: 64 41 76 61 69 6c 61 62 6c 65 20 7b 20 6e 61 74  dAvailable { nat
48f0: 69 76 65 20 64 69 72 65 63 74 6f 72 79 20 7b 76  ive directory {v
4900: 61 72 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a  arName ""} } {..
4910: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
4920: 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65   NOTE: Build the
4930: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
4940: 20 66 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 74   file name for t
4950: 68 65 20 70 72 69 6d 61 72 79 20 61 73 73 65 6d  he primary assem
4960: 62 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  bly..      #    
4970: 20 20 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68     containing th
4980: 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  e System.Data.SQ
4990: 4c 69 74 65 20 6d 61 6e 61 67 65 64 20 63 6f 6d  Lite managed com
49a0: 70 6f 6e 65 6e 74 73 2e 20 20 49 74 0d 0a 20 20  ponents.  It..  
49b0: 20 20 20 20 23 20 20 20 20 20 20 20 73 68 6f 75      #       shou
49c0: 6c 64 20 62 65 20 6e 6f 74 65 64 20 74 68 61 74  ld be noted that
49d0: 20 74 68 69 73 20 61 73 73 65 6d 62 6c 79 20 66   this assembly f
49e0: 69 6c 65 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e  ile may also con
49f0: 74 61 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20  tain the..      
4a00: 23 20 20 20 20 20 20 20 6e 61 74 69 76 65 20 63  #       native c
4a10: 6f 6d 70 6f 6e 65 6e 74 73 2c 20 69 66 20 61 20  omponents, if a 
4a20: 6e 61 74 69 76 65 20 62 75 69 6c 64 20 69 73 20  native build is 
4a30: 69 6e 20 75 73 65 2e 0d 0a 20 20 20 20 20 20 23  in use...      #
4a40: 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65  ..      set file
4a50: 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  Name [file nativ
4a60: 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
4a70: 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20   $directory \.. 
4a80: 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
4a90: 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d  Data.SQLite.dll]
4aa0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21  ]....      if {!
4ab0: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69  [file exists $fi
4ac0: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
4ad0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
4ae0: 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a  false..      }..
4af0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
4b00: 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
4b10: 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   to automaticall
4b20: 79 20 64 65 74 65 63 74 20 69 66 20 74 68 65 20  y detect if the 
4b30: 70 72 69 6d 61 72 79 20 61 73 73 65 6d 62 6c 79  primary assembly
4b40: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
4b50: 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 6e 61 74  contains any nat
4b60: 69 76 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 2c 20  ive components, 
4b70: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0d 0a 20  if necessary... 
4b80: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
4b90: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
4ba0: 20 24 6e 61 74 69 76 65 5d 20 3d 3d 20 30 7d 20   $native] == 0} 
4bb0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
4bc0: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
4bd0: 74 68 20 24 76 61 72 4e 61 6d 65 5d 20 3e 20 30  th $varName] > 0
4be0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
4bf0: 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72      upvar 1 $var
4c00: 4e 61 6d 65 20 24 76 61 72 4e 61 6d 65 0d 0a 20  Name $varName.. 
4c10: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
4c20: 20 20 20 20 73 65 74 20 6e 61 74 69 76 65 20 5b      set native [
4c30: 69 73 4d 69 78 65 64 4d 6f 64 65 41 73 73 65 6d  isMixedModeAssem
4c40: 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 24 76  bly $fileName $v
4c50: 61 72 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 7d  arName]..      }
4c60: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
4c70: 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68     # NOTE: If th
4c80: 65 20 70 72 69 6d 61 72 79 20 61 73 73 65 6d 62  e primary assemb
4c90: 6c 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 73  ly also contains
4ca0: 20 74 68 65 20 6e 61 74 69 76 65 20 63 6f 6d 70   the native comp
4cb0: 6f 6e 65 6e 74 73 2c 0d 0a 20 20 20 20 20 20 23  onents,..      #
4cc0: 20 20 20 20 20 20 20 77 65 20 68 61 76 65 20 65         we have e
4cd0: 76 65 72 79 74 68 69 6e 67 20 77 65 20 6e 65 65  verything we nee
4ce0: 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  d...      #..   
4cf0: 20 20 20 69 66 20 7b 24 6e 61 74 69 76 65 7d 20     if {$native} 
4d00: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
4d10: 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20  return true..   
4d20: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
4d30: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57  .      # NOTE: W
4d40: 68 61 74 20 69 73 20 74 68 65 20 61 72 63 68 69  hat is the archi
4d50: 74 65 63 74 75 72 65 20 66 6f 72 20 74 68 69 73  tecture for this
4d60: 20 6d 61 63 68 69 6e 65 3f 0d 0a 20 20 20 20 20   machine?..     
4d70: 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 61 72   #..      set ar
4d80: 63 68 69 74 65 63 74 75 72 65 20 5b 6d 61 63 68  chitecture [mach
4d90: 69 6e 65 54 6f 50 6c 61 74 66 6f 72 6d 20 24 3a  ineToPlatform $:
4da0: 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61  :tcl_platform(ma
4db0: 63 68 69 6e 65 29 20 74 72 75 65 5d 0d 0a 0d 0a  chine) true]....
4dc0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
4dd0: 20 4e 4f 54 45 3a 20 57 68 61 74 20 69 73 20 74   NOTE: What is t
4de0: 68 65 20 70 6c 61 74 66 6f 72 6d 20 66 6f 72 20  he platform for 
4df0: 74 68 69 73 20 6d 61 63 68 69 6e 65 3f 0d 0a 20  this machine?.. 
4e00: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65       #..      se
4e10: 74 20 70 6c 61 74 66 6f 72 6d 20 5b 6d 61 63 68  t platform [mach
4e20: 69 6e 65 54 6f 50 6c 61 74 66 6f 72 6d 20 24 3a  ineToPlatform $:
4e30: 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61  :tcl_platform(ma
4e40: 63 68 69 6e 65 29 5d 0d 0a 0d 0a 20 20 20 20 20  chine)]....     
4e50: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
4e60: 3a 20 42 75 69 6c 64 20 74 68 65 20 66 75 6c 6c  : Build the full
4e70: 79 20 71 75 61 6c 69 66 69 65 64 20 66 69 6c 65  y qualified file
4e80: 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 69 6e   name for the in
4e90: 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 0d 0a  terop assembly..
4ea0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
4eb0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 53 79 73  ntaining the Sys
4ec0: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
4ed0: 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e 65 6e 74  native component
4ee0: 73 2e 20 20 49 66 20 74 68 69 73 0d 0a 20 20 20  s.  If this..   
4ef0: 20 20 20 23 20 20 20 20 20 20 20 66 69 6c 65 20     #       file 
4f00: 65 78 69 73 74 73 2c 20 77 65 20 73 68 6f 75 6c  exists, we shoul
4f10: 64 20 68 61 76 65 20 65 76 65 72 79 74 68 69 6e  d have everythin
4f20: 67 20 77 65 20 6e 65 65 64 2e 0d 0a 20 20 20 20  g we need...    
4f30: 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 66    #..      set f
4f40: 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61  ileName [file na
4f50: 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a  tivename [file j
4f60: 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20 5c  oin $directory \
4f70: 0d 0a 20 20 20 20 20 20 20 20 20 20 24 61 72 63  ..          $arc
4f80: 68 69 74 65 63 74 75 72 65 20 53 51 4c 69 74 65  hitecture SQLite
4f90: 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 5d 5d 0d 0a  .Interop.dll]]..
4fa0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c  ..      if {[fil
4fb0: 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61  e exists $fileNa
4fc0: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
4fd0: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
4fe0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
4ff0: 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20     set fileName 
5000: 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
5010: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72   [file join $dir
5020: 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20  ectory \..      
5030: 20 20 20 20 24 70 6c 61 74 66 6f 72 6d 20 53 51      $platform SQ
5040: 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c  Lite.Interop.dll
5050: 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  ]]....      if {
5060: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69  [file exists $fi
5070: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
5080: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
5090: 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  true..      }...
50a0: 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e  .      set fileN
50b0: 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ame [file native
50c0: 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
50d0: 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20  $directory \..  
50e0: 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 2e 49          SQLite.I
50f0: 6e 74 65 72 6f 70 2e 64 6c 6c 5d 5d 0d 0a 0d 0a  nterop.dll]]....
5100: 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20        if {[file 
5110: 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65  exists $fileName
5120: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
5130: 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a     return true..
5140: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
5150: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
5160: 3a 20 42 75 69 6c 64 20 74 68 65 20 66 75 6c 6c  : Build the full
5170: 79 20 71 75 61 6c 69 66 69 65 64 20 66 69 6c 65  y qualified file
5180: 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 53 51   name for the SQ
5190: 4c 69 74 65 20 63 6f 72 65 0d 0a 20 20 20 20 20  Lite core..     
51a0: 20 23 20 20 20 20 20 20 20 6c 69 62 72 61 72 79   #       library
51b0: 2e 20 20 49 66 20 74 68 69 73 20 66 69 6c 65 20  .  If this file 
51c0: 65 78 69 73 74 73 2c 20 77 65 20 73 68 6f 75 6c  exists, we shoul
51d0: 64 20 68 61 76 65 20 65 76 65 72 79 74 68 69 6e  d have everythin
51e0: 67 20 77 65 0d 0a 20 20 20 20 20 20 23 20 20 20  g we..      #   
51f0: 20 20 20 20 6e 65 65 64 2e 0d 0a 20 20 20 20 20      need...     
5200: 20 23 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63   #..      foreac
5210: 68 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5b  h fileNameOnly [
5220: 67 65 74 43 6f 72 65 42 69 6e 61 72 79 46 69 6c  getCoreBinaryFil
5230: 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 7b 0d 0a 20  eNamesOnly] {.. 
5240: 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e         set fileN
5250: 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ame [file native
5260: 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
5270: 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20  $directory \..  
5280: 20 20 20 20 20 20 20 20 20 20 24 61 72 63 68 69            $archi
5290: 74 65 63 74 75 72 65 20 24 66 69 6c 65 4e 61 6d  tecture $fileNam
52a0: 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20 20 20 20 20  eOnly]]....     
52b0: 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69     if {[file exi
52c0: 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20  sts $fileName]} 
52d0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
52e0: 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20    return true.. 
52f0: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
5300: 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65      set fileName
5310: 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
5320: 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69  e [file join $di
5330: 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20  rectory \..     
5340: 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72 6d         $platform
5350: 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d   $fileNameOnly]]
5360: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
5370: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69  [file exists $fi
5380: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
5390: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
53a0: 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20  n true..        
53b0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74  }....        set
53c0: 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20   fileName [file 
53d0: 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
53e0: 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79   join $directory
53f0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
5400: 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d  $fileNameOnly]].
5410: 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  ...        if {[
5420: 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c  file exists $fil
5430: 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
5440: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
5450: 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 7d   true..        }
5460: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
5470: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
5480: 54 45 3a 20 4f 6e 65 20 6f 72 20 6d 6f 72 65 20  TE: One or more 
5490: 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e 65 6e 74  native component
54a0: 73 20 6e 65 65 64 65 64 20 62 79 20 53 79 73 74  s needed by Syst
54b0: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 0d 0a  em.Data.SQLite..
54c0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 72        #       ar
54d0: 65 20 6d 69 73 73 69 6e 67 2e 0d 0a 20 20 20 20  e missing...    
54e0: 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72    #..      retur
54f0: 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a  n false..    }..
5500: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73 52 65  ...    proc isRe
5510: 6c 65 61 73 65 41 76 61 69 6c 61 62 6c 65 20 7b  leaseAvailable {
5520: 20 64 69 72 65 63 74 6f 72 79 20 7b 76 61 72 4e   directory {varN
5530: 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20  ame ""} } {..   
5540: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
5550: 65 6e 67 74 68 20 24 76 61 72 4e 61 6d 65 5d 20  ength $varName] 
5560: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
5570: 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61       upvar 1 $va
5580: 72 4e 61 6d 65 20 24 76 61 72 4e 61 6d 65 0d 0a  rName $varName..
5590: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
55a0: 20 72 65 74 75 72 6e 20 5b 69 73 42 75 69 6c 64   return [isBuild
55b0: 41 76 61 69 6c 61 62 6c 65 20 22 22 20 24 64 69  Available "" $di
55c0: 72 65 63 74 6f 72 79 20 24 76 61 72 4e 61 6d 65  rectory $varName
55d0: 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  ]..    }.....   
55e0: 20 70 72 6f 63 20 6a 6f 69 6e 42 75 69 6c 64 44   proc joinBuildD
55f0: 69 72 65 63 74 6f 72 79 20 7b 20 6e 61 74 69 76  irectory { nativ
5600: 65 20 70 61 74 68 20 79 65 61 72 20 70 6c 61 74  e path year plat
5610: 66 6f 72 6d 20 63 6f 6e 66 69 67 75 72 61 74 69  form configurati
5620: 6f 6e 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  on } {..      #.
5630: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46  .      # NOTE: F
5640: 69 67 75 72 65 20 6f 75 74 20 61 6e 64 20 74 68  igure out and th
5650: 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 66 75  en return the fu
5660: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 70 61  lly qualified pa
5670: 74 68 20 74 6f 20 74 68 65 20 62 75 69 6c 64 0d  th to the build.
5680: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64  .      #       d
5690: 69 72 65 63 74 6f 72 79 20 62 61 73 65 64 20 6f  irectory based o
56a0: 6e 20 61 6c 6c 20 74 68 65 20 61 72 67 75 6d 65  n all the argume
56b0: 6e 74 73 20 70 72 6f 76 69 64 65 64 20 62 79 20  nts provided by 
56c0: 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20  our caller...   
56d0: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
56e0: 24 6e 61 74 69 76 65 7d 20 74 68 65 6e 20 7b 0d  $native} then {.
56f0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
5700: 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 70 61 74 68  [file join $path
5710: 20 62 69 6e 20 24 79 65 61 72 20 24 70 6c 61 74   bin $year $plat
5720: 66 6f 72 6d 20 24 63 6f 6e 66 69 67 75 72 61 74  form $configurat
5730: 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  ion]..      } el
5740: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  se {..        re
5750: 74 75 72 6e 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  turn [file join 
5760: 24 70 61 74 68 20 62 69 6e 20 24 79 65 61 72 20  $path bin $year 
5770: 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 62  $configuration b
5780: 69 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  in]..      }..  
5790: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
57a0: 20 67 65 74 42 75 69 6c 64 44 69 72 65 63 74 6f   getBuildDirecto
57b0: 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ry {} {..      #
57c0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
57d0: 53 65 65 20 69 66 20 74 68 65 20 22 6e 61 74 69  See if the "nati
57e0: 76 65 22 20 72 75 6e 74 69 6d 65 20 6f 70 74 69  ve" runtime opti
57f0: 6f 6e 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  on has been set.
5800: 20 20 49 66 20 73 6f 2c 20 75 73 65 20 74 68 65    If so, use the
5810: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
5820: 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20 74 68  directory for th
5830: 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73  e mixed-mode ass
5840: 65 6d 62 6c 79 20 28 61 2e 6b 2e 61 2e 20 74 68  embly (a.k.a. th
5850: 65 20 6e 61 74 69 76 65 20 69 6e 74 65 72 6f 70  e native interop
5860: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
5870: 61 73 73 65 6d 62 6c 79 29 2e 20 20 54 6f 20 65  assembly).  To e
5880: 6e 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6f  nable this optio
5890: 6e 20 76 69 61 20 74 68 65 20 63 6f 6d 6d 61 6e  n via the comman
58a0: 64 20 6c 69 6e 65 2c 20 65 6e 74 65 72 20 61 0d  d line, enter a.
58b0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
58c0: 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c 61 72 20 74  ommand similar t
58d0: 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c  o one of the fol
58e0: 6c 6f 77 69 6e 67 20 28 61 6c 6c 20 6f 6e 20 6f  lowing (all on o
58f0: 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20 20 20  ne line):..     
5900: 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20   #..      #     
5910: 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65    EagleShell.exe
5920: 20 2d 69 6e 69 74 69 61 6c 69 7a 65 20 2d 72 75   -initialize -ru
5930: 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69  ntimeOption nati
5940: 76 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ve..      #     
5950: 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68      -file .\path
5960: 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20  \to\all.eagle.. 
5970: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
5980: 20 20 20 20 20 20 54 6f 20 65 6e 61 62 6c 65 20        To enable 
5990: 74 68 69 73 20 6f 70 74 69 6f 6e 20 76 69 61 20  this option via 
59a0: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
59b0: 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 22 62   prior to the "b
59c0: 65 74 61 20 31 36 22 0d 0a 20 20 20 20 20 20 23  eta 16"..      #
59d0: 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 20 6f         release o
59e0: 66 20 45 61 67 6c 65 2c 20 74 68 65 20 66 6f 6c  f Eagle, the fol
59f0: 6c 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e 64 20 6d  lowing command m
5a00: 75 73 74 20 62 65 20 75 73 65 64 20 69 6e 73 74  ust be used inst
5a10: 65 61 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ead..      #    
5a20: 20 20 20 28 61 6c 73 6f 20 61 6c 6c 20 6f 6e 20     (also all on 
5a30: 6f 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20 20  one line):..    
5a40: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20    #..      #    
5a50: 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78     EagleShell.ex
5a60: 65 20 2d 69 6e 69 74 69 61 6c 69 7a 65 20 2d 70  e -initialize -p
5a70: 6f 73 74 49 6e 69 74 69 61 6c 69 7a 65 0d 0a 20  ostInitialize.. 
5a80: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 22       #         "
5a90: 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49 6e  object invoke In
5aa0: 74 65 72 70 72 65 74 65 72 2e 47 65 74 41 63 74  terpreter.GetAct
5ab0: 69 76 65 20 41 64 64 52 75 6e 74 69 6d 65 4f 70  ive AddRuntimeOp
5ac0: 74 69 6f 6e 20 6e 61 74 69 76 65 22 0d 0a 20 20  tion native"..  
5ad0: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 2d 66      #         -f
5ae0: 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c  ile .\path\to\al
5af0: 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23  l.eagle..      #
5b00: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
5b10: 6f 20 65 78 69 73 74 73 20 3a 3a 62 75 69 6c 64  o exists ::build
5b20: 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c  _directory] && \
5b30: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
5b40: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 62 75  ing length $::bu
5b50: 69 6c 64 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e  ild_directory] >
5b60: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
5b70: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
5b80: 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74   NOTE: The locat
5b90: 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 64  ion of the build
5ba0: 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
5bb0: 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d  een overridden;.
5bc0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
5bd0: 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   therefore, use 
5be0: 69 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20  it verbatim...  
5bf0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
5c00: 20 72 65 74 75 72 6e 20 24 3a 3a 62 75 69 6c 64   return $::build
5c10: 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20  _directory..    
5c20: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
5c30: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
5c40: 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 22 6e   NOTE: If the "n
5c50: 61 74 69 76 65 22 20 72 75 6e 74 69 6d 65 20 6f  ative" runtime o
5c60: 70 74 69 6f 6e 20 69 73 20 73 65 74 2c 20 74 68  ption is set, th
5c70: 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73  e mixed-mode ass
5c80: 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 20 20 23  embly..        #
5c90: 20 20 20 20 20 20 20 69 73 20 62 65 69 6e 67 20         is being 
5ca0: 74 65 73 74 65 64 2e 20 20 49 6e 20 74 68 61 74  tested.  In that
5cb0: 20 63 61 73 65 2c 20 74 68 65 20 70 61 74 68 20   case, the path 
5cc0: 74 6f 20 74 68 65 20 62 75 69 6c 64 20 64 69 72  to the build dir
5cd0: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 20 20  ectory..        
5ce0: 23 20 20 20 20 20 20 20 77 69 6c 6c 20 63 6f 6e  #       will con
5cf0: 74 61 69 6e 20 74 68 65 20 70 6c 61 74 66 6f 72  tain the platfor
5d00: 6d 20 6e 61 6d 65 20 61 6e 64 20 61 6c 6c 20 74  m name and all t
5d10: 68 65 20 62 69 6e 61 72 69 65 73 20 75 6e 64 65  he binaries unde
5d20: 72 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20  r test..        
5d30: 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62  #       should b
5d40: 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 61  e present in tha
5d50: 74 20 64 69 72 65 63 74 6f 72 79 2e 20 20 49 66  t directory.  If
5d60: 20 74 68 65 20 22 6e 61 74 69 76 65 22 20 72 75   the "native" ru
5d70: 6e 74 69 6d 65 0d 0a 20 20 20 20 20 20 20 20 23  ntime..        #
5d80: 20 20 20 20 20 20 20 6f 70 74 69 6f 6e 20 69 73         option is
5d90: 20 6e 6f 74 20 73 65 74 2c 20 74 68 65 20 62 75   not set, the bu
5da0: 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20 77 69  ild directory wi
5db0: 6c 6c 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64  ll be considered
5dc0: 20 74 6f 20 62 65 0d 0a 20 20 20 20 20 20 20 20   to be..        
5dd0: 23 20 20 20 20 20 20 20 22 70 6c 61 74 66 6f 72  #       "platfor
5de0: 6d 2d 6e 65 75 74 72 61 6c 22 2c 20 77 69 74 68  m-neutral", with
5df0: 20 74 68 65 20 6e 6f 74 61 62 6c 65 20 65 78 63   the notable exc
5e00: 65 70 74 69 6f 6e 20 6f 66 20 61 6e 79 20 6e 61  eption of any na
5e10: 74 69 76 65 0d 0a 20 20 20 20 20 20 20 20 23 20  tive..        # 
5e20: 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 20 28        assembly (
5e30: 65 2e 67 2e 20 22 53 51 4c 69 74 65 2e 49 6e 74  e.g. "SQLite.Int
5e40: 65 72 6f 70 2e 64 6c 6c 22 29 20 63 6f 70 69 65  erop.dll") copie
5e50: 64 20 74 68 65 72 65 20 64 75 72 69 6e 67 20 74  d there during t
5e60: 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  he..        #   
5e70: 20 20 20 20 62 75 69 6c 64 20 70 72 6f 63 65 73      build proces
5e80: 73 20 69 74 73 65 6c 66 2e 20 20 49 66 20 74 68  s itself.  If th
5e90: 65 20 62 75 69 6c 64 20 70 72 6f 63 65 73 73 20  e build process 
5ea0: 73 6f 6d 65 68 6f 77 20 64 6f 65 73 20 6e 6f 74  somehow does not
5eb0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
5ec0: 20 20 63 6f 70 79 20 74 68 65 20 6e 61 74 69 76    copy the nativ
5ed0: 65 20 61 73 73 65 6d 62 6c 79 20 66 6f 72 20 74  e assembly for t
5ee0: 68 69 73 20 70 6c 61 74 66 6f 72 6d 2c 20 6d 6f  his platform, mo
5ef0: 73 74 20 6f 66 20 74 68 65 20 74 65 73 74 73 0d  st of the tests.
5f00: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
5f10: 20 69 6e 20 74 68 65 20 73 75 69 74 65 20 77 69   in the suite wi
5f20: 6c 6c 20 73 69 6d 70 6c 79 20 62 65 20 73 6b 69  ll simply be ski
5f30: 70 70 65 64 2e 20 20 47 65 6e 65 72 61 6c 6c 79  pped.  Generally
5f40: 20 73 70 65 61 6b 69 6e 67 2c 20 74 68 65 72 65   speaking, there
5f50: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
5f60: 20 20 61 72 65 20 74 77 6f 20 77 61 79 73 20 74    are two ways t
5f70: 6f 20 62 75 69 6c 64 20 74 68 65 20 62 69 6e 61  o build the bina
5f80: 72 69 65 73 20 77 68 65 6e 20 70 72 65 70 61 72  ries when prepar
5f90: 69 6e 67 20 74 6f 20 72 75 6e 20 74 68 65 0d 0a  ing to run the..
5fa0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
5fb0: 74 65 73 74 20 73 75 69 74 65 3a 0d 0a 20 20 20  test suite:..   
5fc0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
5fd0: 23 20 20 20 20 20 20 20 31 2e 20 42 75 69 6c 64  #       1. Build
5fe0: 20 74 68 65 20 73 65 70 61 72 61 74 65 20 6d 61   the separate ma
5ff0: 6e 61 67 65 64 20 61 6e 64 20 6e 61 74 69 76 65  naged and native
6000: 20 61 73 73 65 6d 62 6c 69 65 73 20 75 73 69 6e   assemblies usin
6010: 67 20 73 6f 6d 65 0d 0a 20 20 20 20 20 20 20 20  g some..        
6020: 23 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 61  #          comma
6030: 6e 64 73 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0d  nds similar to:.
6040: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
6050: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 62      #          b
6060: 75 69 6c 64 2e 62 61 74 20 24 7b 43 6f 6e 66 69  uild.bat ${Confi
6070: 67 75 72 61 74 69 6f 6e 7d 4d 61 6e 61 67 65 64  guration}Managed
6080: 4f 6e 6c 79 20 24 7b 50 6c 61 74 66 6f 72 6d 7d  Only ${Platform}
6090: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
60a0: 20 20 20 20 20 62 75 69 6c 64 2e 62 61 74 20 24       build.bat $
60b0: 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 4e  {Configuration}N
60c0: 61 74 69 76 65 4f 6e 6c 79 20 24 7b 50 6c 61 74  ativeOnly ${Plat
60d0: 66 6f 72 6d 7d 0d 0a 20 20 20 20 20 20 20 20 23  form}..        #
60e0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
60f0: 20 20 20 20 20 57 68 65 72 65 20 24 7b 43 6f 6e       Where ${Con
6100: 66 69 67 75 72 61 74 69 6f 6e 7d 20 69 73 20 65  figuration} is e
6110: 69 74 68 65 72 20 22 44 65 62 75 67 22 20 6f 72  ither "Debug" or
6120: 20 22 52 65 6c 65 61 73 65 22 20 61 6e 64 0d 0a   "Release" and..
6130: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6140: 20 20 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 20 69     ${Platform} i
6150: 73 20 65 69 74 68 65 72 20 22 57 69 6e 33 32 22  s either "Win32"
6160: 20 6f 72 20 22 78 36 34 22 2e 0d 0a 20 20 20 20   or "x64"...    
6170: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
6180: 20 20 20 20 20 20 20 32 2e 20 42 75 69 6c 64 20         2. Build 
6190: 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61  the mixed-mode a
61a0: 73 73 65 6d 62 6c 79 20 75 73 69 6e 67 20 61 20  ssembly using a 
61b0: 63 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c 61 72 20  command similar 
61c0: 74 6f 3a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  to:..        #..
61d0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
61e0: 20 20 20 62 75 69 6c 64 2e 62 61 74 20 24 7b 43     build.bat ${C
61f0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 20 24 7b  onfiguration} ${
6200: 50 6c 61 74 66 6f 72 6d 7d 0d 0a 20 20 20 20 20  Platform}..     
6210: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
6220: 20 20 20 20 20 20 20 20 20 57 68 65 72 65 20 24           Where $
6230: 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 20  {Configuration} 
6240: 69 73 20 65 69 74 68 65 72 20 22 44 65 62 75 67  is either "Debug
6250: 22 20 6f 72 20 22 52 65 6c 65 61 73 65 22 20 61  " or "Release" a
6260: 6e 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  nd..        #   
6270: 20 20 20 20 20 20 20 24 7b 50 6c 61 74 66 6f 72         ${Platfor
6280: 6d 7d 20 69 73 20 65 69 74 68 65 72 20 22 57 69  m} is either "Wi
6290: 6e 33 32 22 20 6f 72 20 22 78 36 34 22 2e 20 20  n32" or "x64".  
62a0: 49 66 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  If this command 
62b0: 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  is..        #   
62c0: 20 20 20 20 20 20 20 75 73 65 64 2c 20 76 61 72         used, var
62d0: 69 6f 75 73 20 74 65 73 74 73 20 74 68 61 74 20  ious tests that 
62e0: 72 65 71 75 69 72 65 20 73 75 70 70 6c 65 6d 65  require suppleme
62f0: 6e 74 61 72 79 20 6d 61 6e 61 67 65 64 0d 0a 20  ntary managed.. 
6300: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
6310: 20 20 61 73 73 65 6d 62 6c 69 65 73 20 28 65 2e    assemblies (e.
6320: 67 2e 20 4c 49 4e 51 29 20 6d 61 79 20 62 65 20  g. LINQ) may be 
6330: 73 6b 69 70 70 65 64 20 75 6e 6c 65 73 73 20 74  skipped unless t
6340: 68 6f 73 65 20 62 69 6e 61 72 69 65 73 0d 0a 20  hose binaries.. 
6350: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
6360: 20 20 61 72 65 20 73 75 62 73 65 71 75 65 6e 74    are subsequent
6370: 6c 79 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74  ly copied into t
6380: 68 65 20 63 6f 72 72 65 63 74 20 64 69 72 65 63  he correct direc
6390: 74 6f 72 79 20 28 69 2e 65 2e 20 62 79 0d 0a 20  tory (i.e. by.. 
63a0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
63b0: 20 20 22 74 65 73 74 5f 61 6c 6c 2e 62 61 74 22    "test_all.bat"
63c0: 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  )...        #.. 
63d0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 4e         #       N
63e0: 6f 74 65 20 74 68 61 74 20 61 6c 6c 20 6f 66 20  ote that all of 
63f0: 74 68 65 20 62 75 69 6c 64 20 63 6f 6d 6d 61 6e  the build comman
6400: 64 73 20 61 62 6f 76 65 20 77 69 6c 6c 20 64 65  ds above will de
6410: 66 61 75 6c 74 20 74 6f 20 75 73 69 6e 67 0d 0a  fault to using..
6420: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6430: 74 68 65 20 6c 61 74 65 73 74 20 76 65 72 73 69  the latest versi
6440: 6f 6e 20 6f 66 20 4d 53 42 75 69 6c 64 20 61 76  on of MSBuild av
6450: 61 69 6c 61 62 6c 65 20 61 6e 64 20 74 68 65 20  ailable and the 
6460: 22 74 65 73 74 5f 79 65 61 72 22 20 6d 61 79 0d  "test_year" may.
6470: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
6480: 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64 6a 75   need to be adju
6490: 73 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79  sted accordingly
64a0: 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 72 75 6e   to actually run
64b0: 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e   the test suite.
64c0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
64d0: 20 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 63    Refer to the c
64e0: 6f 6d 6d 65 6e 74 73 20 69 6e 20 5b 67 65 74 42  omments in [getB
64f0: 75 69 6c 64 59 65 61 72 5d 20 66 6f 72 20 6d 6f  uildYear] for mo
6500: 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  re information o
6510: 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  n..        #    
6520: 20 20 20 68 6f 77 20 74 6f 20 73 65 74 20 74 68     how to set th
6530: 69 73 20 76 61 72 69 61 62 6c 65 2e 0d 0a 20 20  is variable...  
6540: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
6550: 20 73 65 74 20 6e 61 74 69 76 65 20 5b 68 61 73   set native [has
6560: 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61  RuntimeOption na
6570: 74 69 76 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  tive]....       
6580: 20 72 65 74 75 72 6e 20 5b 6a 6f 69 6e 42 75 69   return [joinBui
6590: 6c 64 44 69 72 65 63 74 6f 72 79 20 24 6e 61 74  ldDirectory $nat
65a0: 69 76 65 20 5b 67 65 74 42 75 69 6c 64 42 61 73  ive [getBuildBas
65b0: 65 44 69 72 65 63 74 6f 72 79 5d 20 5c 0d 0a 20  eDirectory] \.. 
65c0: 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42             [getB
65d0: 75 69 6c 64 59 65 61 72 5d 20 5b 67 65 74 42 75  uildYear] [getBu
65e0: 69 6c 64 50 6c 61 74 66 6f 72 6d 20 24 6e 61 74  ildPlatform $nat
65f0: 69 76 65 5d 20 5b 67 65 74 42 75 69 6c 64 43 6f  ive] [getBuildCo
6600: 6e 66 69 67 75 72 61 74 69 6f 6e 5d 5d 0d 0a 20  nfiguration]].. 
6610: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
6620: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 52 65  ..    proc getRe
6630: 6c 65 61 73 65 56 65 72 73 69 6f 6e 20 7b 7d 20  leaseVersion {} 
6640: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
6650: 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65    # NOTE: Figure
6660: 20 6f 75 74 20 74 68 65 20 72 65 6c 65 61 73 65   out the release
6670: 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 75 73 65   version for use
6680: 20 77 69 74 68 20 74 68 65 20 62 75 69 6c 64 20   with the build 
6690: 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20  directory..     
66a0: 20 23 20 20 20 20 20 20 20 77 68 65 6e 20 63 68   #       when ch
66b0: 65 63 6b 69 6e 67 20 66 6f 72 20 61 76 61 69 6c  ecking for avail
66c0: 61 62 6c 65 20 72 65 6c 65 61 73 65 73 2e 0d 0a  able releases...
66d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
66e0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
66f0: 3a 3a 72 65 6c 65 61 73 65 5f 76 65 72 73 69 6f  ::release_versio
6700: 6e 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  n] && \..       
6710: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
6720: 68 20 24 3a 3a 72 65 6c 65 61 73 65 5f 76 65 72  h $::release_ver
6730: 73 69 6f 6e 5d 20 3e 20 30 7d 20 74 68 65 6e 20  sion] > 0} then 
6740: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
6750: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
6760: 65 20 72 65 6c 65 61 73 65 20 76 65 72 73 69 6f  e release versio
6770: 6e 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  n has been overr
6780: 69 64 64 65 6e 3b 20 74 68 65 72 65 66 6f 72 65  idden; therefore
6790: 2c 20 75 73 65 20 69 74 0d 0a 20 20 20 20 20 20  , use it..      
67a0: 20 20 23 20 20 20 20 20 20 20 76 65 72 62 61 74    #       verbat
67b0: 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  im...        #..
67c0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
67d0: 3a 3a 72 65 6c 65 61 73 65 5f 76 65 72 73 69 6f  ::release_versio
67e0: 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  n..      } else 
67f0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
6800: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f        # NOTE: No
6810: 20 72 65 6c 65 61 73 65 20 76 65 72 73 69 6f 6e   release version
6820: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72   is available, r
6830: 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73  eturn an empty s
6840: 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20  tring...        
6850: 23 20 20 20 20 20 20 20 49 74 20 69 73 20 69 6d  #       It is im
6860: 70 6f 72 74 61 6e 74 20 74 6f 20 72 65 74 75 72  portant to retur
6870: 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  n an empty strin
6880: 67 20 68 65 72 65 20 62 65 63 61 75 73 65 20 74  g here because t
6890: 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  he..        #   
68a0: 20 20 20 20 72 65 73 75 6c 74 20 6f 66 20 74 68      result of th
68b0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 6d 61 79  is procedure may
68c0: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 5b 66   be used with [f
68d0: 69 6c 65 20 6a 6f 69 6e 5d 2e 0d 0a 20 20 20 20  ile join]...    
68e0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
68f0: 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 20 20  eturn ""..      
6900: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
6910: 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 46 69   proc getBuildFi
6920: 6c 65 4e 61 6d 65 20 7b 20 66 69 6c 65 4e 61 6d  leName { fileNam
6930: 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20  e {platform ""} 
6940: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
6950: 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75      # NOTE: Retu
6960: 72 6e 73 20 74 68 65 20 73 70 65 63 69 66 69 65  rns the specifie
6970: 64 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 69  d file name as i
6980: 66 20 69 74 20 77 65 72 65 20 6c 6f 63 61 74 65  f it were locate
6990: 64 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20  d in the..      
69a0: 23 20 20 20 20 20 20 20 62 75 69 6c 64 20 64 69  #       build di
69b0: 72 65 63 74 6f 72 79 2c 20 64 69 73 63 61 72 64  rectory, discard
69c0: 69 6e 67 20 61 6e 79 20 64 69 72 65 63 74 6f 72  ing any director
69d0: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 72  y information pr
69e0: 65 73 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20  esent..      #  
69f0: 20 20 20 20 20 69 6e 20 74 68 65 20 66 69 6c 65       in the file
6a00: 20 6e 61 6d 65 20 61 73 20 70 72 6f 76 69 64 65   name as provide
6a10: 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e  d by our caller.
6a20: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
6a30: 20 73 65 74 20 72 65 73 75 6c 74 20 5b 66 69 6c   set result [fil
6a40: 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a  e nativename \..
6a50: 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
6a60: 6a 6f 69 6e 20 5b 67 65 74 42 75 69 6c 64 44 69  join [getBuildDi
6a70: 72 65 63 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f  rectory] $platfo
6a80: 72 6d 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66  rm [file tail $f
6a90: 69 6c 65 4e 61 6d 65 5d 5d 5d 0d 0a 0d 0a 20 20  ileName]]]....  
6aa0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 48      #..      # H
6ab0: 41 43 4b 3a 20 57 68 65 6e 20 72 75 6e 6e 69 6e  ACK: When runnin
6ac0: 67 20 6f 6e 20 57 6f 57 36 34 2c 20 61 73 73 75  g on WoW64, assu
6ad0: 6d 65 20 74 68 65 20 74 65 73 74 20 65 78 65 63  me the test exec
6ae0: 75 74 61 62 6c 65 73 20 61 72 65 20 70 72 65 73  utables are pres
6af0: 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ent..      #    
6b00: 20 20 20 77 69 74 68 20 74 68 65 20 22 33 32 22     with the "32"
6b10: 20 73 75 66 66 69 78 20 6f 6e 20 74 68 65 6d 2e   suffix on them.
6b20: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
6b30: 20 69 66 20 7b 5b 69 73 52 75 6e 6e 69 6e 67 57   if {[isRunningW
6b40: 6f 57 36 34 5d 20 26 26 20 5b 66 69 6c 65 20 65  oW64] && [file e
6b50: 78 74 65 6e 73 69 6f 6e 20 24 72 65 73 75 6c 74  xtension $result
6b60: 5d 20 65 71 20 22 2e 65 78 65 22 7d 20 74 68 65  ] eq ".exe"} the
6b70: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  n {..        set
6b80: 20 72 65 73 75 6c 74 20 5b 61 70 70 65 6e 64 41   result [appendA
6b90: 72 67 73 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61  rgs [file rootna
6ba0: 6d 65 20 24 72 65 73 75 6c 74 5d 20 33 32 2e 65  me $result] 32.e
6bb0: 78 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  xe]..      }....
6bc0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65        return $re
6bd0: 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  sult..    }.....
6be0: 20 20 20 20 70 72 6f 63 20 67 65 74 45 78 74 65      proc getExte
6bf0: 72 6e 61 6c 44 69 72 65 63 74 6f 72 79 20 7b 7d  rnalDirectory {}
6c00: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
6c10: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20     # NOTE: This 
6c20: 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72 6e  procedure return
6c30: 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  s the directory 
6c40: 77 68 65 72 65 20 74 68 65 20 65 78 74 65 72 6e  where the extern
6c50: 61 6c 20 62 69 6e 61 72 79 0d 0a 20 20 20 20 20  al binary..     
6c60: 20 23 20 20 20 20 20 20 20 66 69 6c 65 73 20 61   #       files a
6c70: 72 65 20 6c 6f 63 61 74 65 64 2e 0d 0a 20 20 20  re located...   
6c80: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
6c90: 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  rn [file nativen
6ca0: 61 6d 65 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  ame [file dirnam
6cb0: 65 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20  e [file dirname 
6cc0: 5b 69 6e 66 6f 20 62 69 6e 61 72 79 5d 5d 5d 5d  [info binary]]]]
6cd0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
6ce0: 70 72 6f 63 20 67 65 74 42 69 6e 61 72 79 44 69  proc getBinaryDi
6cf0: 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20  rectory {} {..  
6d00: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
6d10: 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64  OTE: This proced
6d20: 75 72 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ure returns the 
6d30: 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65 20  directory where 
6d40: 74 68 65 20 74 65 73 74 20 61 70 70 6c 69 63 61  the test applica
6d50: 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  tion..      #   
6d60: 20 20 20 20 69 74 73 65 6c 66 20 28 69 2e 65 2e      itself (i.e.
6d70: 20 74 68 65 20 45 61 67 6c 65 20 73 68 65 6c 6c   the Eagle shell
6d80: 29 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 54  ) is located.  T
6d90: 68 69 73 20 77 69 6c 6c 20 62 65 20 75 73 65 64  his will be used
6da0: 20 61 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20   as..      #    
6db0: 20 20 20 74 68 65 20 64 65 73 74 69 6e 61 74 69     the destinati
6dc0: 6f 6e 20 66 6f 72 20 74 68 65 20 63 6f 70 69 65  on for the copie
6dd0: 64 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  d System.Data.SQ
6de0: 4c 69 74 65 20 6e 61 74 69 76 65 20 61 6e 64 0d  Lite native and.
6df0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6d  .      #       m
6e00: 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 69 65  anaged assemblie
6e10: 73 20 28 69 2e 65 2e 20 62 65 63 61 75 73 65 20  s (i.e. because 
6e20: 74 68 69 73 20 69 73 20 6f 6e 65 20 6f 66 20 74  this is one of t
6e30: 68 65 20 66 65 77 20 70 6c 61 63 65 73 0d 0a 20  he few places.. 
6e40: 20 20 20 20 20 23 20 20 20 20 20 20 20 77 68 65       #       whe
6e50: 72 65 20 74 68 65 20 43 4c 52 20 77 69 6c 6c 20  re the CLR will 
6e60: 61 63 74 75 61 6c 6c 79 20 66 69 6e 64 20 61 6e  actually find an
6e70: 64 20 6c 6f 61 64 20 74 68 65 6d 20 70 72 6f 70  d load them prop
6e80: 65 72 6c 79 29 2e 0d 0a 20 20 20 20 20 20 23 0d  erly)...      #.
6e90: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
6ea0: 20 65 78 69 73 74 73 20 3a 3a 62 69 6e 61 72 79   exists ::binary
6eb0: 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c  _directory] && \
6ec0: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
6ed0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 62 69  ing length $::bi
6ee0: 6e 61 72 79 5f 64 69 72 65 63 74 6f 72 79 5d 20  nary_directory] 
6ef0: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
6f00: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
6f10: 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61  # NOTE: The loca
6f20: 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 69 6e 61  tion of the bina
6f30: 72 79 20 64 69 72 65 63 74 6f 72 79 20 68 61 73  ry directory has
6f40: 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e   been overridden
6f50: 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ;..        #    
6f60: 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73     therefore, us
6f70: 65 20 69 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a  e it verbatim...
6f80: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
6f90: 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 62 69 6e     return $::bin
6fa0: 61 72 79 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20  ary_directory.. 
6fb0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
6fc0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 69         return [i
6fd0: 6e 66 6f 20 62 69 6e 61 72 79 5d 0d 0a 20 20 20  nfo binary]..   
6fe0: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
6ff0: 20 20 20 20 70 72 6f 63 20 67 65 74 45 78 74 65      proc getExte
7000: 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 20 7b 20 66  rnalFileName { f
7010: 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20  ileName } {..   
7020: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
7030: 54 45 3a 20 52 65 74 75 72 6e 73 20 74 68 65 20  TE: Returns the 
7040: 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 6e  specified file n
7050: 61 6d 65 20 61 73 20 69 66 20 69 74 20 77 65 72  ame as if it wer
7060: 65 20 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65  e located in the
7070: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
7080: 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69  directory contai
7090: 6e 69 6e 67 20 74 68 65 20 65 78 74 65 72 6e 61  ning the externa
70a0: 6c 20 62 69 6e 61 72 69 65 73 2e 0d 0a 20 20 20  l binaries...   
70b0: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
70c0: 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  rn [file nativen
70d0: 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b  ame [file join [
70e0: 67 65 74 45 78 74 65 72 6e 61 6c 44 69 72 65 63  getExternalDirec
70f0: 74 6f 72 79 5d 20 24 66 69 6c 65 4e 61 6d 65 5d  tory] $fileName]
7100: 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  ]..    }.....   
7110: 20 70 72 6f 63 20 67 65 74 42 69 6e 61 72 79 46   proc getBinaryF
7120: 69 6c 65 4e 61 6d 65 20 7b 20 66 69 6c 65 4e 61  ileName { fileNa
7130: 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d  me {platform ""}
7140: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
7150: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74       # NOTE: Ret
7160: 75 72 6e 73 20 74 68 65 20 73 70 65 63 69 66 69  urns the specifi
7170: 65 64 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20  ed file name as 
7180: 69 66 20 69 74 20 77 65 72 65 20 6c 6f 63 61 74  if it were locat
7190: 65 64 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20  ed in the..     
71a0: 20 23 20 20 20 20 20 20 20 62 69 6e 61 72 79 20   #       binary 
71b0: 64 69 72 65 63 74 6f 72 79 2c 20 64 69 73 63 61  directory, disca
71c0: 72 64 69 6e 67 20 61 6e 79 20 64 69 72 65 63 74  rding any direct
71d0: 6f 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ory information 
71e0: 70 72 65 73 65 6e 74 0d 0a 20 20 20 20 20 20 23  present..      #
71f0: 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 66 69         in the fi
7200: 6c 65 20 6e 61 6d 65 20 61 73 20 70 72 6f 76 69  le name as provi
7210: 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65  ded by our calle
7220: 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  r...      #..   
7230: 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20     return [file 
7240: 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20  nativename \..  
7250: 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f          [file jo
7260: 69 6e 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72  in [getBinaryDir
7270: 65 63 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72  ectory] $platfor
7280: 6d 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69  m [file tail $fi
7290: 6c 65 4e 61 6d 65 5d 5d 5d 0d 0a 20 20 20 20 7d  leName]]]..    }
72a0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
72b0: 74 43 6f 72 65 42 69 6e 61 72 79 46 69 6c 65 4e  tCoreBinaryFileN
72c0: 61 6d 65 20 7b 20 7b 70 6c 61 74 66 6f 72 6d 20  ame { {platform 
72d0: 22 22 7d 20 7b 73 74 61 6e 64 61 72 64 20 66 61  ""} {standard fa
72e0: 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  lse} } {..      
72f0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
7300: 20 52 65 74 75 72 6e 73 20 74 68 65 20 66 75 6c   Returns the ful
7310: 6c 20 70 61 74 68 20 66 6f 72 20 74 68 65 20 66  l path for the f
7320: 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ile containing t
7330: 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 0d 0a  he SQLite core..
7340: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61        #       na
7350: 74 69 76 65 20 6c 69 62 72 61 72 79 20 63 6f 64  tive library cod
7360: 65 20 66 6f 72 20 74 68 69 73 20 70 6c 61 74 66  e for this platf
7370: 6f 72 6d 2e 20 20 46 69 72 73 74 2c 20 63 68 65  orm.  First, che
7380: 63 6b 20 61 6e 64 20 73 65 65 20 69 66 0d 0a 20  ck and see if.. 
7390: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
73a0: 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6e 61 74   SQLite core nat
73b0: 69 76 65 20 6c 69 62 72 61 72 79 20 68 61 73 20  ive library has 
73c0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6c 6f 61  already been loa
73d0: 64 65 64 2e 20 20 4e 65 78 74 2c 0d 0a 20 20 20  ded.  Next,..   
73e0: 20 20 20 23 20 20 20 20 20 20 20 66 61 6c 6c 62     #       fallb
73f0: 61 63 6b 20 74 6f 20 77 68 61 74 20 74 68 65 20  ack to what the 
7400: 66 75 6c 6c 20 70 61 74 68 20 73 68 6f 75 6c 64  full path should
7410: 20 62 65 2c 20 62 61 73 65 64 20 6f 6e 20 77 68   be, based on wh
7420: 65 74 68 65 72 20 74 68 65 0d 0a 20 20 20 20 20  ether the..     
7430: 20 23 20 20 20 20 20 20 20 6d 69 78 65 64 2d 6d   #       mixed-m
7440: 6f 64 65 20 61 73 73 65 6d 62 6c 79 20 69 73 20  ode assembly is 
7450: 62 65 69 6e 67 20 75 73 65 64 20 61 6e 64 20 74  being used and t
7460: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 63  he name of the c
7470: 75 72 72 65 6e 74 0d 0a 20 20 20 20 20 20 23 20  urrent..      # 
7480: 20 20 20 20 20 20 70 6c 61 74 66 6f 72 6d 2e 0d        platform..
7490: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
74a0: 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
74b0: 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
74c0: 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
74d0: 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
74e0: 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
74f0: 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61  .SQLite.UnsafeNa
7500: 74 69 76 65 4d 65 74 68 6f 64 73 20 5f 53 51 4c  tiveMethods _SQL
7510: 69 74 65 4e 61 74 69 76 65 4d 6f 64 75 6c 65 46  iteNativeModuleF
7520: 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d  ileName..      }
7530: 20 66 69 6c 65 4e 61 6d 65 5d 20 3d 3d 20 30 20   fileName] == 0 
7540: 26 26 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  && [string lengt
7550: 68 20 24 66 69 6c 65 4e 61 6d 65 5d 20 3e 20 30  h $fileName] > 0
7560: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
7570: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
7580: 4f 54 45 3a 20 54 68 65 20 53 51 4c 69 74 65 20  OTE: The SQLite 
7590: 63 6f 72 65 20 6e 61 74 69 76 65 20 6c 69 62 72  core native libr
75a0: 61 72 79 20 68 61 73 20 61 6c 72 65 61 64 79 20  ary has already 
75b0: 62 65 65 6e 20 6c 6f 61 64 65 64 20 76 69 61 0d  been loaded via.
75c0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
75d0: 20 74 68 65 20 6e 61 74 69 76 65 20 6c 69 62 72   the native libr
75e0: 61 72 79 20 70 72 65 2d 6c 6f 61 64 65 72 2e 20  ary pre-loader. 
75f0: 20 52 65 74 75 72 6e 20 74 68 61 74 20 66 69 6c   Return that fil
7600: 65 20 6e 61 6d 65 20 6e 6f 77 2e 0d 0a 20 20 20  e name now...   
7610: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
7620: 72 65 74 75 72 6e 20 24 66 69 6c 65 4e 61 6d 65  return $fileName
7630: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
7640: 20 20 20 69 66 20 7b 5b 68 61 73 52 75 6e 74 69     if {[hasRunti
7650: 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65 5d  meOption native]
7660: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
7670: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
7680: 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65 20  OTE: Return the 
7690: 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d  mixed-mode assem
76a0: 62 6c 79 20 66 69 6c 65 20 6e 61 6d 65 2e 0d 0a  bly file name...
76b0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
76c0: 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20     return [file 
76d0: 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20  nativename \..  
76e0: 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
76f0: 6a 6f 69 6e 20 5b 67 65 74 42 69 6e 61 72 79 44  join [getBinaryD
7700: 69 72 65 63 74 6f 72 79 5d 20 24 70 6c 61 74 66  irectory] $platf
7710: 6f 72 6d 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  orm System.Data.
7720: 53 51 4c 69 74 65 2e 64 6c 6c 5d 5d 0d 0a 20 20  SQLite.dll]]..  
7730: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 73      } elseif {$s
7740: 74 61 6e 64 61 72 64 7d 20 74 68 65 6e 20 7b 0d  tandard} then {.
7750: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
7760: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
7770: 6d 70 74 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  mpt to determine
7780: 20 74 68 65 20 6e 61 74 69 76 65 2d 6f 6e 6c 79   the native-only
7790: 20 73 74 61 6e 64 61 72 64 20 53 51 4c 69 74 65   standard SQLite
77a0: 20 6c 69 62 72 61 72 79 0d 0a 20 20 20 20 20 20   library..      
77b0: 20 20 23 20 20 20 20 20 20 20 66 69 6c 65 20 6e    #       file n
77c0: 61 6d 65 20 66 6f 72 20 74 68 69 73 20 70 6c 61  ame for this pla
77d0: 74 66 6f 72 6d 20 61 6e 64 20 74 68 65 6e 20 72  tform and then r
77e0: 65 74 75 72 6e 20 69 74 2e 0d 0a 20 20 20 20 20  eturn it...     
77f0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 66 6f     #..        fo
7800: 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 4f 6e  reach fileNameOn
7810: 6c 79 20 5b 67 65 74 43 6f 72 65 42 69 6e 61 72  ly [getCoreBinar
7820: 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20  yFileNamesOnly] 
7830: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
7840: 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20   fileName [file 
7850: 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20  nativename \..  
7860: 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
7870: 65 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e 61 72  e join [getBinar
7880: 79 44 69 72 65 63 74 6f 72 79 5d 20 24 70 6c 61  yDirectory] $pla
7890: 74 66 6f 72 6d 20 24 66 69 6c 65 4e 61 6d 65 4f  tform $fileNameO
78a0: 6e 6c 79 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  nly]]....       
78b0: 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69     if {[file exi
78c0: 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20  sts $fileName]} 
78d0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
78e0: 20 20 20 20 72 65 74 75 72 6e 20 24 66 69 6c 65      return $file
78f0: 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Name..          
7900: 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
7910: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
7920: 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 6c 6c 62     # NOTE: Fallb
7930: 61 63 6b 20 74 6f 20 72 65 74 75 72 6e 69 6e 67  ack to returning
7940: 20 74 68 65 20 6e 61 74 69 76 65 2d 6f 6e 6c 79   the native-only
7950: 20 73 74 61 6e 64 61 72 64 20 53 51 4c 69 74 65   standard SQLite
7960: 20 6c 69 62 72 61 72 79 0d 0a 20 20 20 20 20 20   library..      
7970: 20 20 23 20 20 20 20 20 20 20 66 69 6c 65 20 6e    #       file n
7980: 61 6d 65 20 66 6f 72 20 57 69 6e 64 6f 77 73 2e  ame for Windows.
7990: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
79a0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c       return [fil
79b0: 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a  e nativename \..
79c0: 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
79d0: 65 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e 61 72  e join [getBinar
79e0: 79 44 69 72 65 63 74 6f 72 79 5d 20 24 70 6c 61  yDirectory] $pla
79f0: 74 66 6f 72 6d 20 73 71 6c 69 74 65 33 2e 64 6c  tform sqlite3.dl
7a00: 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  l]]..      } els
7a10: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e {..        #..
7a20: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
7a30: 52 65 74 75 72 6e 20 74 68 65 20 6e 61 74 69 76  Return the nativ
7a40: 65 2d 6f 6e 6c 79 20 69 6e 74 65 72 6f 70 20 61  e-only interop a
7a50: 73 73 65 6d 62 6c 79 20 66 69 6c 65 20 6e 61 6d  ssembly file nam
7a60: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
7a70: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66         return [f
7a80: 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c  ile nativename \
7a90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
7aa0: 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e  ile join [getBin
7ab0: 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20 24 70  aryDirectory] $p
7ac0: 6c 61 74 66 6f 72 6d 20 53 51 4c 69 74 65 2e 49  latform SQLite.I
7ad0: 6e 74 65 72 6f 70 2e 64 6c 6c 5d 5d 0d 0a 20 20  nterop.dll]]..  
7ae0: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
7af0: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 43 6f 6d  .    proc getCom
7b00: 6d 6f 6e 44 69 72 65 63 74 6f 72 79 20 7b 7d 20  monDirectory {} 
7b10: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
7b20: 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70    # NOTE: This p
7b30: 72 6f 63 65 64 75 72 65 20 72 65 74 75 72 6e 73  rocedure returns
7b40: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 77   the directory w
7b50: 68 65 72 65 20 74 68 65 20 74 65 73 74 20 73 63  here the test sc
7b60: 72 69 70 74 73 0d 0a 20 20 20 20 20 20 23 20 20  ripts..      #  
7b70: 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 6c       should be l
7b80: 6f 63 61 74 65 64 2e 20 20 42 79 20 64 65 66 61  ocated.  By defa
7b90: 75 6c 74 2c 20 74 68 69 73 20 6a 75 73 74 20 72  ult, this just r
7ba0: 65 74 75 72 6e 73 20 74 68 65 20 45 61 67 6c 65  eturns the Eagle
7bb0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
7bc0: 62 69 6e 61 72 79 20 64 69 72 65 63 74 6f 72 79  binary directory
7bd0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
7be0: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
7bf0: 74 73 20 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65  ts ::common_dire
7c00: 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20  ctory] && \..   
7c10: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
7c20: 65 6e 67 74 68 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f  ength $::common_
7c30: 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20  directory] > 0} 
7c40: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
7c50: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
7c60: 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  E: The location 
7c70: 6f 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 64 69  of the common di
7c80: 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e  rectory has been
7c90: 20 73 65 74 3b 0d 0a 20 20 20 20 20 20 20 20 23   set;..        #
7ca0: 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65         therefore
7cb0: 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20  , use it...     
7cc0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
7cd0: 74 75 72 6e 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64  turn $::common_d
7ce0: 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20  irectory..      
7cf0: 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20  } elseif {[info 
7d00: 65 78 69 73 74 73 20 3a 3a 76 65 6e 64 6f 72 5f  exists ::vendor_
7d10: 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d  directory] && \.
7d20: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
7d30: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 76 65 6e  ng length $::ven
7d40: 64 6f 72 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e  dor_directory] >
7d50: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
7d60: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
7d70: 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74   NOTE: The locat
7d80: 69 6f 6e 20 6f 66 20 74 68 65 20 76 65 6e 64 6f  ion of the vendo
7d90: 72 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20  r directory has 
7da0: 62 65 65 6e 20 73 65 74 3b 0d 0a 20 20 20 20 20  been set;..     
7db0: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 72 65     #       there
7dc0: 66 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20  fore, use it... 
7dd0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
7de0: 20 20 72 65 74 75 72 6e 20 24 3a 3a 76 65 6e 64    return $::vend
7df0: 6f 72 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20  or_directory..  
7e00: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69      } elseif {[i
7e10: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63 6c  nfo exists ::tcl
7e20: 5f 6c 69 62 72 61 72 79 5d 20 26 26 20 5c 0d 0a  _library] && \..
7e30: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
7e40: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 63 6c 5f  g length $::tcl_
7e50: 6c 69 62 72 61 72 79 5d 20 3e 20 30 20 26 26 20  library] > 0 && 
7e60: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 66 69  \..          [fi
7e70: 6c 65 20 69 73 64 69 72 65 63 74 6f 72 79 20 24  le isdirectory $
7e80: 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79 5d 7d 20  ::tcl_library]} 
7e90: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
7ea0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
7eb0: 45 3a 20 54 68 65 20 76 61 72 69 61 62 6c 65 20  E: The variable 
7ec0: 77 69 74 68 20 74 68 65 20 6c 6f 63 61 74 69 6f  with the locatio
7ed0: 6e 20 6f 66 20 74 68 65 20 73 63 72 69 70 74 20  n of the script 
7ee0: 6c 69 62 72 61 72 79 20 69 73 0d 0a 20 20 20 20  library is..    
7ef0: 20 20 20 20 23 20 20 20 20 20 20 20 73 65 74 20      #       set 
7f00: 61 6e 64 20 61 70 70 65 61 72 73 20 74 6f 20 62  and appears to b
7f10: 65 20 61 20 72 65 61 6c 20 64 69 72 65 63 74 6f  e a real directo
7f20: 72 79 20 28 69 2e 65 2e 20 6e 6f 74 20 65 6d 62  ry (i.e. not emb
7f30: 65 64 64 65 64 0d 0a 20 20 20 20 20 20 20 20 23  edded..        #
7f40: 20 20 20 20 20 20 20 77 69 74 68 69 6e 20 61 20         within a 
7f50: 66 69 6c 65 29 3b 20 74 68 65 72 65 66 6f 72 65  file); therefore
7f60: 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20  , use it...     
7f70: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
7f80: 74 75 72 6e 20 24 3a 3a 74 63 6c 5f 6c 69 62 72  turn $::tcl_libr
7f90: 61 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  ary..      } els
7fa0: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e {..        #..
7fb0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
7fc0: 46 61 6c 6c 62 61 63 6b 20 74 6f 20 74 68 65 20  Fallback to the 
7fd0: 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69  directory contai
7fe0: 6e 69 6e 67 20 74 68 65 20 65 78 65 63 75 74 61  ning the executa
7ff0: 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ble...        #.
8000: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
8010: 5b 69 6e 66 6f 20 62 69 6e 61 72 79 5d 0d 0a 20  [info binary].. 
8020: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
8030: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 44 61  ..    proc getDa
8040: 74 61 62 61 73 65 44 69 72 65 63 74 6f 72 79 20  tabaseDirectory 
8050: 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
8060: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69       # NOTE: Thi
8070: 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75  s procedure retu
8080: 72 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f 72  rns the director
8090: 79 20 77 68 65 72 65 20 74 68 65 20 74 65 73 74  y where the test
80a0: 20 64 61 74 61 62 61 73 65 73 0d 0a 20 20 20 20   databases..    
80b0: 20 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64    #       should
80c0: 20 62 65 20 6c 6f 63 61 74 65 64 2e 20 20 42 79   be located.  By
80d0: 20 64 65 66 61 75 6c 74 2c 20 74 68 69 73 20 6a   default, this j
80e0: 75 73 74 20 75 73 65 73 20 74 68 65 20 74 65 6d  ust uses the tem
80f0: 70 6f 72 61 72 79 0d 0a 20 20 20 20 20 20 23 20  porary..      # 
8100: 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20        directory 
8110: 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 74  configured for t
8120: 68 69 73 20 73 79 73 74 65 6d 2e 0d 0a 20 20 20  his system...   
8130: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
8140: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 64  [info exists ::d
8150: 61 74 61 62 61 73 65 5f 64 69 72 65 63 74 6f 72  atabase_director
8160: 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  y] && \..       
8170: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
8180: 68 20 24 3a 3a 64 61 74 61 62 61 73 65 5f 64 69  h $::database_di
8190: 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68  rectory] > 0} th
81a0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
81b0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
81c0: 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   The location of
81d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64 69   the database di
81e0: 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e  rectory has been
81f0: 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20   overridden;..  
8200: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
8210: 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 2e  erefore, use it.
8220: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
8230: 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 64       return $::d
8240: 61 74 61 62 61 73 65 5f 64 69 72 65 63 74 6f 72  atabase_director
8250: 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69  y..      } elsei
8260: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
8270: 3a 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63 74  ::scratch_direct
8280: 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ory] && \..     
8290: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
82a0: 67 74 68 20 24 3a 3a 73 63 72 61 74 63 68 5f 64  gth $::scratch_d
82b0: 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74  irectory] > 0} t
82c0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
82d0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
82e0: 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f  : The location o
82f0: 66 20 74 68 65 20 73 63 72 61 74 63 68 20 64 69  f the scratch di
8300: 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e  rectory has been
8310: 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20   overridden;..  
8320: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
8330: 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 2e  erefore, use it.
8340: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
8350: 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 73       return $::s
8360: 63 72 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79  cratch_directory
8370: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
8380: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
8390: 20 5b 67 65 74 54 65 6d 70 6f 72 61 72 79 50 61   [getTemporaryPa
83a0: 74 68 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  th]..      }..  
83b0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
83c0: 20 67 65 74 54 65 6d 70 6f 72 61 72 79 44 69 72   getTemporaryDir
83d0: 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20  ectory {} {..   
83e0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
83f0: 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75  TE: This procedu
8400: 72 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 64  re returns the d
8410: 69 72 65 63 74 6f 72 79 20 77 68 65 72 65 20 74  irectory where t
8420: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  he temporary fil
8430: 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  es..      #     
8440: 20 20 73 68 6f 75 6c 64 20 62 65 20 6c 6f 63 61    should be loca
8450: 74 65 64 2e 20 20 42 79 20 64 65 66 61 75 6c 74  ted.  By default
8460: 2c 20 74 68 69 73 20 6a 75 73 74 20 75 73 65 73  , this just uses
8470: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0d 0a   the temporary..
8480: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 69        #       di
8490: 72 65 63 74 6f 72 79 20 63 6f 6e 66 69 67 75 72  rectory configur
84a0: 65 64 20 66 6f 72 20 74 68 69 73 20 73 79 73 74  ed for this syst
84b0: 65 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  em...      #..  
84c0: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
84d0: 69 73 74 73 20 3a 3a 74 65 6d 70 6f 72 61 72 79  ists ::temporary
84e0: 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c  _directory] && \
84f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
8500: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65  ing length $::te
8510: 6d 70 6f 72 61 72 79 5f 64 69 72 65 63 74 6f 72  mporary_director
8520: 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  y] > 0} then {..
8530: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
8540: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c     # NOTE: The l
8550: 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 74  ocation of the t
8560: 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f  emporary directo
8570: 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  ry has been over
8580: 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20  ridden;..       
8590: 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f   #       therefo
85a0: 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20  re, use it...   
85b0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
85c0: 72 65 74 75 72 6e 20 24 3a 3a 74 65 6d 70 6f 72  return $::tempor
85d0: 61 72 79 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20  ary_directory.. 
85e0: 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b       } elseif {[
85f0: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 73 63  info exists ::sc
8600: 72 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79 5d  ratch_directory]
8610: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
8620: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
8630: 24 3a 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63  $::scratch_direc
8640: 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20  tory] > 0} then 
8650: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
8660: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
8670: 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  e location of th
8680: 65 20 73 63 72 61 74 63 68 20 64 69 72 65 63 74  e scratch direct
8690: 6f 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65  ory has been ove
86a0: 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20  rridden;..      
86b0: 20 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66    #       theref
86c0: 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20  ore, use it...  
86d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
86e0: 20 72 65 74 75 72 6e 20 24 3a 3a 73 63 72 61 74   return $::scrat
86f0: 63 68 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20  ch_directory..  
8700: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
8710: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 67 65        return [ge
8720: 74 54 65 6d 70 6f 72 61 72 79 50 61 74 68 5d 0d  tTemporaryPath].
8730: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
8740: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
8750: 45 78 65 63 75 74 65 4f 6e 53 65 74 75 70 20 7b  ExecuteOnSetup {
8760: 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  } {..      if {[
8770: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65 78  info exists ::ex
8780: 65 63 75 74 65 5f 6f 6e 5f 73 65 74 75 70 5d 20  ecute_on_setup] 
8790: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
87a0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
87b0: 3a 3a 65 78 65 63 75 74 65 5f 6f 6e 5f 73 65 74  ::execute_on_set
87c0: 75 70 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  up] > 0} then {.
87d0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
87e0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75      # NOTE: Retu
87f0: 72 6e 20 74 68 65 20 63 6f 6e 66 69 67 75 72 65  rn the configure
8800: 64 20 53 51 4c 20 74 6f 20 65 78 65 63 75 74 65  d SQL to execute
8810: 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6e 6e   during the conn
8820: 65 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20  ection..        
8830: 23 20 20 20 20 20 20 20 73 65 74 75 70 20 70 72  #       setup pr
8840: 6f 63 65 64 75 72 65 20 28 69 2e 65 2e 20 66 6f  ocedure (i.e. fo
8850: 72 20 65 76 65 72 79 20 74 65 73 74 20 64 61 74  r every test dat
8860: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
8870: 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  )...        #.. 
8880: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
8890: 3a 65 78 65 63 75 74 65 5f 6f 6e 5f 73 65 74 75  :execute_on_setu
88a0: 70 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  p..      } else 
88b0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
88c0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 79        # NOTE: By
88d0: 20 64 65 66 61 75 6c 74 2c 20 74 68 65 72 65 20   default, there 
88e0: 69 73 20 6e 6f 20 53 51 4c 20 74 6f 20 65 78 65  is no SQL to exe
88f0: 63 75 74 65 20 64 75 72 69 6e 67 20 74 68 65 20  cute during the 
8900: 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20  connection..    
8910: 20 20 20 20 23 20 20 20 20 20 20 20 73 65 74 75      #       setu
8920: 70 20 70 72 6f 63 65 64 75 72 65 20 28 69 2e 65  p procedure (i.e
8930: 2e 20 66 6f 72 20 65 76 65 72 79 20 74 65 73 74  . for every test
8940: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
8950: 74 69 6f 6e 29 2e 0d 0a 20 20 20 20 20 20 20 20  tion)...        
8960: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
8970: 6e 20 22 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  n ""..      }.. 
8980: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
8990: 63 20 67 65 74 54 65 73 74 4f 76 65 72 72 69 64  c getTestOverrid
89a0: 65 73 50 72 65 61 6d 62 6c 65 20 7b 20 7b 65 78  esPreamble { {ex
89b0: 74 72 61 56 61 72 4e 61 6d 65 73 20 22 22 7d 20  traVarNames ""} 
89c0: 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 76  } {..      set v
89d0: 61 72 4e 61 6d 65 73 20 5b 6c 69 73 74 5d 0d 0a  arNames [list]..
89e0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
89f0: 20 23 20 4e 4f 54 45 3a 20 49 66 20 61 76 61 69   # NOTE: If avai
8a00: 6c 61 62 6c 65 2c 20 73 74 61 72 74 20 77 69 74  lable, start wit
8a10: 68 20 74 68 65 20 6d 61 73 74 65 72 20 6c 69 73  h the master lis
8a20: 74 20 6f 66 20 74 65 73 74 20 6f 76 65 72 72 69  t of test overri
8a30: 64 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  de..      #     
8a40: 20 20 76 61 72 69 61 62 6c 65 73 2e 0d 0a 20 20    variables...  
8a50: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
8a60: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
8a70: 74 65 73 74 5f 6f 76 65 72 72 69 64 65 73 5d 20  test_overrides] 
8a80: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
8a90: 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74  [llength $::test
8aa0: 5f 6f 76 65 72 72 69 64 65 73 5d 20 3e 20 30 7d  _overrides] > 0}
8ab0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
8ac0: 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 76 61   eval lappend va
8ad0: 72 4e 61 6d 65 73 20 24 3a 3a 74 65 73 74 5f 6f  rNames $::test_o
8ae0: 76 65 72 72 69 64 65 73 0d 0a 20 20 20 20 20 20  verrides..      
8af0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
8b00: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 72      # NOTE: If r
8b10: 65 71 75 65 73 74 65 64 20 62 79 20 6f 75 72 20  equested by our 
8b20: 63 61 6c 6c 65 72 2c 20 61 64 64 20 61 6e 79 20  caller, add any 
8b30: 61 64 64 69 74 69 6f 6e 61 6c 20 76 61 72 69 61  additional varia
8b40: 62 6c 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ble..      #    
8b50: 20 20 20 6e 61 6d 65 73 20 74 6f 20 63 6f 70 79     names to copy
8b60: 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a   now...      #..
8b70: 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67        if {[lleng
8b80: 74 68 20 24 65 78 74 72 61 56 61 72 4e 61 6d 65  th $extraVarName
8b90: 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  s] > 0} then {..
8ba0: 20 20 20 20 20 20 20 20 65 76 61 6c 20 6c 61 70          eval lap
8bb0: 70 65 6e 64 20 76 61 72 4e 61 6d 65 73 20 24 65  pend varNames $e
8bc0: 78 74 72 61 56 61 72 4e 61 6d 65 73 0d 0a 20 20  xtraVarNames..  
8bd0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
8be0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
8bf0: 42 75 69 6c 64 20 74 68 65 20 73 63 72 69 70 74  Build the script
8c00: 20 66 72 61 67 6d 65 6e 74 20 74 6f 20 62 65 20   fragment to be 
8c10: 72 65 74 75 72 6e 65 64 20 62 79 20 70 72 6f 63  returned by proc
8c20: 65 73 73 69 6e 67 20 65 61 63 68 0d 0a 20 20 20  essing each..   
8c30: 20 20 20 23 20 20 20 20 20 20 20 76 61 72 69 61     #       varia
8c40: 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 61 64 64  ble name and add
8c50: 69 6e 67 20 74 68 65 20 6e 65 63 65 63 65 73 73  ing the nececess
8c60: 61 72 79 20 73 63 72 69 70 74 20 66 72 61 67 6d  ary script fragm
8c70: 65 6e 74 73 20 66 6f 72 0d 0a 20 20 20 20 20 20  ents for..      
8c80: 23 20 20 20 20 20 20 20 65 61 63 68 20 6f 6e 65  #       each one
8c90: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
8ca0: 20 20 73 65 74 20 72 65 73 75 6c 74 20 22 22 0d    set result "".
8cb0: 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68  ...      foreach
8cc0: 20 76 61 72 4e 61 6d 65 20 24 76 61 72 4e 61 6d   varName $varNam
8cd0: 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  es {..        #.
8ce0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
8cf0: 20 42 75 69 6c 64 20 74 68 65 20 71 75 61 6c 69   Build the quali
8d00: 66 69 65 64 20 67 6c 6f 62 61 6c 20 76 61 72 69  fied global vari
8d10: 61 62 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20 20 20  able name...    
8d20: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
8d30: 65 74 20 66 75 6c 6c 56 61 72 4e 61 6d 65 20 5b  et fullVarName [
8d40: 61 70 70 65 6e 64 41 72 67 73 20 3a 3a 20 24 76  appendArgs :: $v
8d50: 61 72 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20  arName]....     
8d60: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
8d70: 4e 4f 54 45 3a 20 44 6f 65 73 20 74 68 65 20 76  NOTE: Does the v
8d80: 61 72 69 61 62 6c 65 20 65 78 69 73 74 20 69 6e  ariable exist in
8d90: 20 74 68 69 73 20 69 6e 74 65 72 70 72 65 74 65   this interprete
8da0: 72 20 63 6f 6e 74 65 78 74 3f 0d 0a 20 20 20 20  r context?..    
8db0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
8dc0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
8dd0: 24 66 75 6c 6c 56 61 72 4e 61 6d 65 5d 7d 20 74  $fullVarName]} t
8de0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
8df0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
8e00: 4e 4f 54 45 3a 20 41 70 70 65 6e 64 20 61 20 73  NOTE: Append a s
8e10: 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20 74  cript fragment t
8e20: 6f 20 74 68 65 20 72 65 73 75 6c 74 20 74 68 61  o the result tha
8e30: 74 20 77 69 6c 6c 20 63 6f 72 72 65 63 74 6c 79  t will correctly
8e40: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
8e50: 20 20 20 20 63 6f 70 79 20 61 6e 79 20 63 6f 6e      copy any con
8e60: 74 61 69 6e 65 64 20 76 61 6c 75 65 20 74 6f 20  tained value to 
8e70: 61 6e 6f 74 68 65 72 20 69 6e 74 65 72 70 72 65  another interpre
8e80: 74 65 72 20 63 6f 6e 74 65 78 74 2e 0d 0a 20 20  ter context...  
8e90: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
8ea0: 20 20 20 20 20 61 70 70 65 6e 64 20 72 65 73 75       append resu
8eb0: 6c 74 20 5c 6e 20 22 73 65 74 20 22 20 24 66 75  lt \n "set " $fu
8ec0: 6c 6c 56 61 72 4e 61 6d 65 20 22 20 5c 7b 22 20  llVarName " \{" 
8ed0: 5b 73 65 74 20 24 66 75 6c 6c 56 61 72 4e 61 6d  [set $fullVarNam
8ee0: 65 5d 20 5c 7d 0d 0a 20 20 20 20 20 20 20 20 7d  e] \}..        }
8ef0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
8f00: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
8f10: 54 45 3a 20 49 66 20 74 68 65 20 72 65 73 75 6c  TE: If the resul
8f20: 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f  t contains one o
8f30: 72 20 6d 6f 72 65 20 73 63 72 69 70 74 20 66 72  r more script fr
8f40: 61 67 6d 65 6e 74 73 2c 20 61 70 70 65 6e 64 20  agments, append 
8f50: 61 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  a..      #      
8f60: 20 6e 65 77 6c 69 6e 65 2e 0d 0a 20 20 20 20 20   newline...     
8f70: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   #..      if {[s
8f80: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 72 65  tring length $re
8f90: 73 75 6c 74 5d 20 3e 20 30 7d 20 74 68 65 6e 20  sult] > 0} then 
8fa0: 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  {..        appen
8fb0: 64 20 72 65 73 75 6c 74 20 5c 6e 0d 0a 20 20 20  d result \n..   
8fc0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
8fd0: 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20  turn $result..  
8fe0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
8ff0: 20 6d 6f 76 65 53 79 73 74 65 6d 44 61 74 61 53   moveSystemDataS
9000: 51 4c 69 74 65 44 6c 6c 43 6f 6e 66 69 67 20 7b  QLiteDllConfig {
9010: 20 7b 72 65 73 74 6f 72 65 20 66 61 6c 73 65 7d   {restore false}
9020: 20 7b 76 65 72 62 6f 73 65 20 66 61 6c 73 65 7d   {verbose false}
9030: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20   } {..      set 
9040: 64 69 72 65 63 74 6f 72 79 20 5b 6f 62 6a 65 63  directory [objec
9050: 74 20 69 6e 76 6f 6b 65 20 41 70 70 44 6f 6d 61  t invoke AppDoma
9060: 69 6e 20 43 75 72 72 65 6e 74 44 6f 6d 61 69 6e  in CurrentDomain
9070: 2e 42 61 73 65 44 69 72 65 63 74 6f 72 79 5d 0d  .BaseDirectory].
9080: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  ...      if {[st
9090: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 64 69 72  ring length $dir
90a0: 65 63 74 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68  ectory] == 0} th
90b0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
90c0: 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e   {$verbose} then
90d0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
90e0: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
90f0: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
9100: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
9110: 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6d   "---- skipped m
9120: 6f 76 69 6e 67 20 5c 22 53 79 73 74 65 6d 2e 44  oving \"System.D
9130: 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 2e 63  ata.SQLite.dll.c
9140: 6f 6e 66 69 67 5c 22 2c 20 22 20 5c 0d 0a 20 20  onfig\", " \..  
9150: 20 20 20 20 20 20 20 20 20 20 20 20 22 6e 6f 20              "no 
9160: 62 61 73 65 20 64 69 72 65 63 74 6f 72 79 5c 6e  base directory\n
9170: 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  "]..        }.. 
9180: 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20         return.. 
9190: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
91a0: 73 65 74 20 66 69 6c 65 4e 61 6d 65 28 31 29 20  set fileName(1) 
91b0: 5b 66 69 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65 20  [file normalize 
91c0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 66 69  \..          [fi
91d0: 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f  le join $directo
91e0: 72 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  ry System.Data.S
91f0: 51 4c 69 74 65 2e 64 6c 6c 2e 63 6f 6e 66 69 67  QLite.dll.config
9200: 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20  ]]....      set 
9210: 66 69 6c 65 4e 61 6d 65 28 32 29 20 5b 61 70 70  fileName(2) [app
9220: 65 6e 64 41 72 67 73 20 24 66 69 6c 65 4e 61 6d  endArgs $fileNam
9230: 65 28 31 29 20 2e 6d 6f 76 65 64 5d 0d 0a 0d 0a  e(1) .moved]....
9240: 20 20 20 20 20 20 69 66 20 7b 24 72 65 73 74 6f        if {$resto
9250: 72 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  re} then {..    
9260: 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78      if {[file ex
9270: 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 28 32  ists $fileName(2
9280: 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
9290: 20 20 20 20 20 20 66 69 6c 65 20 72 65 6e 61 6d        file renam
92a0: 65 20 24 66 69 6c 65 4e 61 6d 65 28 32 29 20 24  e $fileName(2) $
92b0: 66 69 6c 65 4e 61 6d 65 28 31 29 0d 0a 0d 0a 20  fileName(1).... 
92c0: 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65           if {$ve
92d0: 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20  rbose} then {.. 
92e0: 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
92f0: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
9300: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
9310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9320: 22 2d 2d 2d 2d 20 6d 6f 76 65 64 20 5c 22 22 20  "---- moved \"" 
9330: 24 66 69 6c 65 4e 61 6d 65 28 32 29 20 22 5c 22  $fileName(2) "\"
9340: 20 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20   to \"" \..     
9350: 20 20 20 20 20 20 20 20 20 20 20 24 66 69 6c 65             $file
9360: 4e 61 6d 65 28 31 29 20 5c 22 5c 6e 5d 0d 0a 20  Name(1) \"\n].. 
9370: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
9380: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
9390: 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72          if {$ver
93a0: 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  bose} then {..  
93b0: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
93c0: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
93d0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
93e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
93f0: 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6d 6f 76  ---- skipped mov
9400: 69 6e 67 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d  ing \"" $fileNam
9410: 65 28 32 29 20 5c 0d 0a 20 20 20 20 20 20 20 20  e(2) \..        
9420: 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69 74 20          "\", it 
9430: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e  does not exist\n
9440: 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  "]..          }.
9450: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
9460: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
9470: 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78      if {[file ex
9480: 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 28 31  ists $fileName(1
9490: 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
94a0: 20 20 20 20 20 20 66 69 6c 65 20 72 65 6e 61 6d        file renam
94b0: 65 20 24 66 69 6c 65 4e 61 6d 65 28 31 29 20 24  e $fileName(1) $
94c0: 66 69 6c 65 4e 61 6d 65 28 32 29 0d 0a 0d 0a 20  fileName(2).... 
94d0: 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65           if {$ve
94e0: 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20  rbose} then {.. 
94f0: 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
9500: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
9510: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
9520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9530: 22 2d 2d 2d 2d 20 6d 6f 76 65 64 20 5c 22 22 20  "---- moved \"" 
9540: 24 66 69 6c 65 4e 61 6d 65 28 31 29 20 22 5c 22  $fileName(1) "\"
9550: 20 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20   to \"" \..     
9560: 20 20 20 20 20 20 20 20 20 20 20 24 66 69 6c 65             $file
9570: 4e 61 6d 65 28 32 29 20 5c 22 5c 6e 5d 0d 0a 20  Name(2) \"\n].. 
9580: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
9590: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
95a0: 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72          if {$ver
95b0: 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  bose} then {..  
95c0: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
95d0: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
95e0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
95f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
9600: 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6d 6f 76  ---- skipped mov
9610: 69 6e 67 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d  ing \"" $fileNam
9620: 65 28 31 29 20 5c 0d 0a 20 20 20 20 20 20 20 20  e(1) \..        
9630: 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69 74 20          "\", it 
9640: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e  does not exist\n
9650: 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  "]..          }.
9660: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
9670: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
9680: 20 20 20 70 72 6f 63 20 67 65 74 41 70 70 44 6f     proc getAppDo
9690: 6d 61 69 6e 50 72 65 61 6d 62 6c 65 20 7b 20 7b  mainPreamble { {
96a0: 70 72 65 66 69 78 20 22 22 7d 20 7b 73 75 66 66  prefix ""} {suff
96b0: 69 78 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20  ix ""} } {..    
96c0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
96d0: 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72  E: This procedur
96e0: 65 20 72 65 74 75 72 6e 73 20 61 20 74 65 73 74  e returns a test
96f0: 20 73 65 74 75 70 20 73 63 72 69 70 74 20 66 72   setup script fr
9700: 61 67 6d 65 6e 74 20 73 75 69 74 61 62 6c 65 20  agment suitable 
9710: 66 6f 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20  for..      #    
9720: 20 20 20 65 76 61 6c 75 61 74 69 6f 6e 20 62 79     evaluation by
9730: 20 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72 20   an interpreter 
9740: 63 72 65 61 74 65 64 20 69 6e 20 61 6e 20 69 73  created in an is
9750: 6f 6c 61 74 65 64 20 61 70 70 6c 69 63 61 74 69  olated applicati
9760: 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  on..      #     
9770: 20 20 64 6f 6d 61 69 6e 2e 20 20 54 68 65 20 73    domain.  The s
9780: 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20 62  cript fragment b
9790: 65 69 6e 67 20 72 65 74 75 72 6e 65 64 20 77 69  eing returned wi
97a0: 6c 6c 20 62 65 20 73 75 72 72 6f 75 6e 64 65 64  ll be surrounded
97b0: 20 62 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20   by..      #    
97c0: 20 20 20 74 68 65 20 70 72 65 66 69 78 20 61 6e     the prefix an
97d0: 64 20 73 75 66 66 69 78 20 22 73 63 72 69 70 74  d suffix "script
97e0: 20 66 72 61 67 6d 65 6e 74 73 22 20 73 70 65 63   fragments" spec
97f0: 69 66 69 65 64 20 62 79 20 6f 75 72 20 63 61 6c  ified by our cal
9800: 6c 65 72 2c 0d 0a 20 20 20 20 20 20 23 20 20 20  ler,..      #   
9810: 20 20 20 20 69 66 20 61 6e 79 2e 20 20 54 68 65      if any.  The
9820: 20 65 6e 74 69 72 65 20 73 63 72 69 70 74 20 62   entire script b
9830: 65 69 6e 67 20 72 65 74 75 72 6e 65 64 20 77 69  eing returned wi
9840: 6c 6c 20 62 65 20 73 75 62 73 74 69 74 75 74 65  ll be substitute
9850: 64 20 76 69 61 0d 0a 20 20 20 20 20 20 23 20 20  d via..      #  
9860: 20 20 20 20 20 5b 73 75 62 73 74 5d 2c 20 69 6e       [subst], in
9870: 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20   the context of 
9880: 6f 75 72 20 63 61 6c 6c 65 72 2c 20 62 65 66 6f  our caller, befo
9890: 72 65 20 62 65 69 6e 67 20 72 65 74 75 72 6e 65  re being returne
98a0: 64 2e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  d...      #     
98b0: 20 20 54 68 69 73 20 73 74 65 70 20 69 73 20 6e    This step is n
98c0: 65 63 65 73 73 61 72 79 20 73 6f 20 74 68 61 74  ecessary so that
98d0: 20 73 6f 6d 65 20 6c 69 6d 69 74 65 64 20 63 6f   some limited co
98e0: 6e 74 65 78 74 20 69 6e 66 6f 72 6d 61 74 69 6f  ntext informatio
98f0: 6e 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  n,..      #     
9900: 20 20 70 72 69 6d 61 72 69 6c 79 20 72 65 6c 61    primarily rela
9910: 74 65 64 20 74 6f 20 74 68 65 20 74 65 73 74 69  ted to the testi
9920: 6e 67 20 64 69 72 65 63 74 6f 72 69 65 73 2c 20  ng directories, 
9930: 63 61 6e 20 62 65 20 74 72 61 6e 73 66 65 72 72  can be transferr
9940: 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ed..      #     
9950: 20 20 74 6f 20 74 68 65 20 69 6e 74 65 72 70 72    to the interpr
9960: 65 74 65 72 20 69 6e 20 74 68 65 20 69 73 6f 6c  eter in the isol
9970: 61 74 65 64 20 61 70 70 6c 69 63 61 74 69 6f 6e  ated application
9980: 20 64 6f 6d 61 69 6e 2c 20 6d 61 6b 69 6e 67 20   domain, making 
9990: 69 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  it..      #     
99a0: 20 20 61 62 6c 65 20 74 6f 20 73 75 63 63 65 73    able to succes
99b0: 73 66 75 6c 6c 79 20 72 75 6e 20 74 65 73 74 73  sfully run tests
99c0: 20 74 68 61 74 20 72 65 71 75 69 72 65 20 6f 6e   that require on
99d0: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65  e or more of the
99e0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
99f0: 66 69 6c 65 73 20 69 6e 20 6f 6e 65 20 6f 66 20  files in one of 
9a00: 74 68 65 20 74 65 73 74 69 6e 67 20 64 69 72 65  the testing dire
9a10: 63 74 6f 72 69 65 73 2e 20 20 43 61 6c 6c 65 72  ctories.  Caller
9a20: 73 20 73 68 6f 75 6c 64 20 6b 65 65 70 20 69 6e  s should keep in
9a30: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
9a40: 6d 69 6e 64 20 74 68 61 74 20 74 68 65 20 74 65  mind that the te
9a50: 73 74 20 73 63 72 69 70 74 20 66 72 61 67 6d 65  st script fragme
9a60: 6e 74 20 62 65 69 6e 67 20 72 65 74 75 72 6e 65  nt being returne
9a70: 64 20 63 61 6e 6e 6f 74 20 72 65 6c 79 20 6f 6e  d cannot rely on
9a80: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
9a90: 61 6e 79 20 73 63 72 69 70 74 20 6c 69 62 72 61  any script libra
9aa0: 72 79 20 70 72 6f 63 65 64 75 72 65 73 20 74 68  ry procedures th
9ab0: 61 74 20 61 72 65 20 6e 6f 74 20 70 72 6f 76 69  at are not provi
9ac0: 64 65 64 20 62 79 20 74 68 65 20 45 61 67 6c 65  ded by the Eagle
9ad0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
9ae0: 6c 69 62 72 61 72 79 20 70 61 63 6b 61 67 65 20  library package 
9af0: 28 69 2e 65 2e 20 22 69 6e 69 74 2e 65 61 67 6c  (i.e. "init.eagl
9b00: 65 22 29 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74  e"), including t
9b10: 68 6f 73 65 20 70 72 6f 76 69 64 65 64 20 62 79  hose provided by
9b20: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
9b30: 74 68 65 20 45 61 67 6c 65 20 74 65 73 74 20 70  the Eagle test p
9b40: 61 63 6b 61 67 65 2c 20 75 6e 6c 65 73 73 20 74  ackage, unless t
9b50: 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69  he file containi
9b60: 6e 67 20 74 68 65 6d 20 69 73 20 6c 6f 61 64 65  ng them is loade
9b70: 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
9b80: 20 6d 61 6e 75 61 6c 6c 79 20 76 69 61 20 73 6f   manually via so
9b90: 6d 65 20 6f 74 68 65 72 20 6d 65 63 68 61 6e 69  me other mechani
9ba0: 73 6d 20 28 65 2e 67 2e 20 62 79 20 69 6e 63 6c  sm (e.g. by incl
9bb0: 75 64 69 6e 67 20 61 70 70 72 6f 70 72 69 61 74  uding appropriat
9bc0: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
9bd0: 20 5b 70 61 63 6b 61 67 65 20 72 65 71 75 69 72   [package requir
9be0: 65 5d 20 6f 72 20 5b 73 6f 75 72 63 65 5d 20 63  e] or [source] c
9bf0: 6f 6d 6d 61 6e 64 73 20 69 6e 20 74 68 65 20 70  ommands in the p
9c00: 72 65 66 69 78 20 6f 72 20 73 75 66 66 69 78 0d  refix or suffix.
9c10: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
9c20: 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 73 29  cript fragments)
9c30: 2e 20 20 41 6c 73 6f 2c 20 61 6c 6c 20 76 61 72  .  Also, all var
9c40: 69 61 62 6c 65 20 72 65 66 65 72 65 6e 63 65 73  iable references
9c50: 20 61 6e 64 20 61 6c 6c 20 6e 65 73 74 65 64 0d   and all nested.
9c60: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
9c70: 6f 6d 6d 61 6e 64 73 20 28 69 2e 65 2e 20 74 68  ommands (i.e. th
9c80: 6f 73 65 20 69 6e 20 73 71 75 61 72 65 20 62 72  ose in square br
9c90: 61 63 6b 65 74 73 29 20 63 6f 6e 74 61 69 6e 65  ackets) containe
9ca0: 64 20 69 6e 20 74 68 65 20 66 69 6e 61 6c 0d 0a  d in the final..
9cb0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 63        #       sc
9cc0: 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20 77 69  ript fragment wi
9cd0: 6c 6c 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20  ll end up being 
9ce0: 65 76 61 6c 75 61 74 65 64 20 69 6e 20 74 68 65  evaluated in the
9cf0: 20 63 6f 6e 74 65 78 74 20 6f 66 20 74 68 65 0d   context of the.
9d00: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
9d10: 61 6c 6c 69 6e 67 20 69 6e 74 65 72 70 72 65 74  alling interpret
9d20: 65 72 20 61 6e 64 20 6e 6f 74 20 74 68 65 20 74  er and not the t
9d30: 61 72 67 65 74 20 69 6e 74 65 72 70 72 65 74 65  arget interprete
9d40: 72 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65  r created in the
9d50: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
9d60: 69 73 6f 6c 61 74 65 64 20 61 70 70 6c 69 63 61  isolated applica
9d70: 74 69 6f 6e 20 64 6f 6d 61 69 6e 20 75 6e 6c 65  tion domain unle
9d80: 73 73 20 74 68 65 20 64 6f 6c 6c 61 72 20 73 69  ss the dollar si
9d90: 67 6e 73 20 61 6e 64 2f 6f 72 20 73 71 75 61 72  gns and/or squar
9da0: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
9db0: 20 62 72 61 63 6b 65 74 73 20 61 72 65 20 73 70   brackets are sp
9dc0: 65 63 69 61 6c 6c 79 20 71 75 6f 74 65 64 20 77  ecially quoted w
9dd0: 69 74 68 20 62 61 63 6b 73 6c 61 73 68 65 73 2e  ith backslashes.
9de0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
9df0: 20 72 65 74 75 72 6e 20 5b 75 70 6c 65 76 65 6c   return [uplevel
9e00: 20 31 20 5b 6c 69 73 74 20 73 75 62 73 74 20 5b   1 [list subst [
9e10: 61 70 70 65 6e 64 41 72 67 73 20 24 70 72 65 66  appendArgs $pref
9e20: 69 78 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  ix {..        #.
9e30: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
9e40: 20 54 68 65 20 5c 5b 6f 62 6a 65 63 74 5c 5d 20   The \[object\] 
9e50: 63 6f 6d 6d 61 6e 64 20 6d 61 79 20 62 65 20 6d  command may be m
9e60: 69 73 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20 45  issing in some E
9e70: 61 67 6c 65 20 63 6f 72 65 0d 0a 20 20 20 20 20  agle core..     
9e80: 20 20 20 23 20 20 20 20 20 20 20 6c 69 62 72 61     #       libra
9e90: 72 79 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ry configuration
9ea0: 73 2e 20 20 43 6c 6f 6e 69 6e 67 20 61 6e 64 20  s.  Cloning and 
9eb0: 75 73 69 6e 67 20 74 68 65 20 70 72 6f 63 65 64  using the proced
9ec0: 75 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ure..        #  
9ed0: 20 20 20 20 20 5c 5b 63 68 61 6e 67 65 4e 61 74       \[changeNat
9ee0: 69 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  iveRuntimeOption
9ef0: 5c 5d 20 6d 61 79 20 68 65 6c 70 20 74 6f 20 6d  \] may help to m
9f00: 69 74 69 67 61 74 65 20 74 68 69 73 2e 0d 0a 20  itigate this... 
9f10: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
9f20: 20 20 70 72 6f 63 20 63 68 61 6e 67 65 4e 61 74    proc changeNat
9f30: 69 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  iveRuntimeOption
9f40: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
9f50: 7b 5b 69 6e 66 6f 20 61 72 67 73 20 63 68 61 6e  {[info args chan
9f60: 67 65 4e 61 74 69 76 65 52 75 6e 74 69 6d 65 4f  geNativeRuntimeO
9f70: 70 74 69 6f 6e 5d 7d 20 5c 0d 0a 20 20 20 20 20  ption]} \..     
9f80: 20 20 20 20 20 20 20 7b 5b 69 6e 66 6f 20 62 6f         {[info bo
9f90: 64 79 20 63 68 61 6e 67 65 4e 61 74 69 76 65 52  dy changeNativeR
9fa0: 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 5d 7d 0d 0a  untimeOption]}..
9fb0: 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20  ..        catch 
9fc0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  {..          cha
9fd0: 6e 67 65 4e 61 74 69 76 65 52 75 6e 74 69 6d 65  ngeNativeRuntime
9fe0: 4f 70 74 69 6f 6e 20 5b 68 61 73 52 75 6e 74 69  Option [hasRunti
9ff0: 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65 5d  meOption native]
a000: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
a010: 20 20 20 7d 20 5b 67 65 74 54 65 73 74 4f 76 65     } [getTestOve
a020: 72 72 69 64 65 73 50 72 65 61 6d 62 6c 65 20 5b  rridesPreamble [
a030: 6c 69 73 74 20 70 61 74 68 20 74 65 73 74 5f 63  list path test_c
a040: 68 61 6e 6e 65 6c 5d 5d 20 24 73 75 66 66 69 78  hannel]] $suffix
a050: 5d 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  ]]]..    }..... 
a060: 20 20 20 70 72 6f 63 20 74 72 79 43 6f 70 79 45     proc tryCopyE
a070: 78 74 65 72 6e 61 6c 46 69 6c 65 20 7b 0d 0a 20  xternalFile {.. 
a080: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 4e             fileN
a090: 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22  ame {platform ""
a0a0: 7d 20 7b 6e 65 77 46 69 6c 65 4e 61 6d 65 20 22  } {newFileName "
a0b0: 22 7d 20 7b 76 65 72 62 6f 73 65 20 66 61 6c 73  "} {verbose fals
a0c0: 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  e} } {..      se
a0d0: 74 20 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65  t sourceFileName
a0e0: 20 5b 67 65 74 45 78 74 65 72 6e 61 6c 46 69 6c   [getExternalFil
a0f0: 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d  eName $fileName]
a100: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b  ....      if {![
a110: 66 69 6c 65 20 65 78 69 73 74 73 20 24 73 6f 75  file exists $sou
a120: 72 63 65 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  rceFileName]} th
a130: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
a140: 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e   {$verbose} then
a150: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
a160: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
a170: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
a180: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
a190: 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 63   "---- skipped c
a1a0: 6f 70 79 69 6e 67 20 65 78 74 65 72 6e 61 6c 20  opying external 
a1b0: 66 69 6c 65 20 5c 22 22 20 24 73 6f 75 72 63 65  file \"" $source
a1c0: 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20  FileName \..    
a1d0: 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69            "\", i
a1e0: 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
a1f0: 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d  \n"]..        }.
a200: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d  .        return.
a210: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
a220: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
a230: 6e 67 74 68 20 24 6e 65 77 46 69 6c 65 4e 61 6d  ngth $newFileNam
a240: 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
a250: 20 20 20 20 20 20 20 20 73 65 74 20 74 61 72 67          set targ
a260: 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42  etFileName [getB
a270: 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 6e  inaryFileName $n
a280: 65 77 46 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74  ewFileName $plat
a290: 66 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 7d 20 65  form]..      } e
a2a0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  lse {..        s
a2b0: 65 74 20 74 61 72 67 65 74 46 69 6c 65 4e 61 6d  et targetFileNam
a2c0: 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65  e [getBinaryFile
a2d0: 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24  Name $fileName $
a2e0: 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20  platform]..     
a2f0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20   }....      set 
a300: 74 61 72 67 65 74 44 69 72 65 63 74 6f 72 79 20  targetDirectory 
a310: 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 74  [file dirname $t
a320: 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 5d 0d 0a  argetFileName]..
a330: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74  ..      if {[cat
a340: 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  ch {..        if
a350: 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20   {![file exists 
a360: 24 74 61 72 67 65 74 44 69 72 65 63 74 6f 72 79  $targetDirectory
a370: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
a380: 20 20 20 20 20 66 69 6c 65 20 6d 6b 64 69 72 20       file mkdir 
a390: 24 74 61 72 67 65 74 44 69 72 65 63 74 6f 72 79  $targetDirectory
a3a0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
a3b0: 20 20 20 20 20 66 69 6c 65 20 63 6f 70 79 20 2d       file copy -
a3c0: 66 6f 72 63 65 20 24 73 6f 75 72 63 65 46 69 6c  force $sourceFil
a3d0: 65 4e 61 6d 65 20 24 74 61 72 67 65 74 46 69 6c  eName $targetFil
a3e0: 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 5d 20  eName..      }] 
a3f0: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
a400: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
a410: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
a420: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
a430: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70         "---- cop
a440: 69 65 64 20 65 78 74 65 72 6e 61 6c 20 66 69 6c  ied external fil
a450: 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72  e from \"" $sour
a460: 63 65 46 69 6c 65 4e 61 6d 65 20 22 5c 22 20 74  ceFileName "\" t
a470: 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  o \"" \..       
a480: 20 20 20 20 20 24 74 61 72 67 65 74 46 69 6c 65       $targetFile
a490: 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20  Name \"\n]..    
a4a0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
a4b0: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
a4c0: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
a4d0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
a4e0: 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65       "---- faile
a4f0: 64 20 74 6f 20 63 6f 70 79 20 65 78 74 65 72 6e  d to copy extern
a500: 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22  al file from \""
a510: 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65   $sourceFileName
a520: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
a530: 22 5c 22 20 74 6f 20 5c 22 22 20 24 74 61 72 67  "\" to \"" $targ
a540: 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d  etFileName \"\n]
a550: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
a560: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72  .....    proc tr
a570: 79 43 6f 70 79 42 69 6e 61 72 79 46 69 6c 65 20  yCopyBinaryFile 
a580: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  {..            f
a590: 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72  ileName {platfor
a5a0: 6d 20 22 22 7d 20 7b 6e 65 77 46 69 6c 65 4e 61  m ""} {newFileNa
a5b0: 6d 65 20 22 22 7d 20 7b 76 65 72 62 6f 73 65 20  me ""} {verbose 
a5c0: 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20  false} } {..    
a5d0: 20 20 73 65 74 20 73 6f 75 72 63 65 46 69 6c 65    set sourceFile
a5e0: 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46  Name [getBinaryF
a5f0: 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d  ileName $fileNam
a600: 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a  e $platform]....
a610: 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65        if {![file
a620: 20 65 78 69 73 74 73 20 24 73 6f 75 72 63 65 46   exists $sourceF
a630: 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
a640: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 76  ..        if {$v
a650: 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a  erbose} then {..
a660: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
a670: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
a680: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
a690: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
a6a0: 2d 2d 20 73 6b 69 70 70 65 64 20 63 6f 70 79 69  -- skipped copyi
a6b0: 6e 67 20 62 69 6e 61 72 79 20 66 69 6c 65 20 5c  ng binary file \
a6c0: 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61  "" $sourceFileNa
a6d0: 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
a6e0: 20 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73      "\", it does
a6f0: 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a   not exist\n"]..
a700: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
a710: 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20     return..     
a720: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   }....      if {
a730: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
a740: 6e 65 77 46 69 6c 65 4e 61 6d 65 5d 20 3e 20 30  newFileName] > 0
a750: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
a760: 20 20 73 65 74 20 74 61 72 67 65 74 46 69 6c 65    set targetFile
a770: 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c 64 46 69  Name [getBuildFi
a780: 6c 65 4e 61 6d 65 20 24 6e 65 77 46 69 6c 65 4e  leName $newFileN
a790: 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a  ame $platform]..
a7a0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
a7b0: 20 20 20 20 20 20 20 20 73 65 74 20 74 61 72 67          set targ
a7c0: 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42  etFileName [getB
a7d0: 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 24 66 69  uildFileName $fi
a7e0: 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d  leName $platform
a7f0: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ]..      }....  
a800: 20 20 20 20 73 65 74 20 74 61 72 67 65 74 44 69      set targetDi
a810: 72 65 63 74 6f 72 79 20 5b 66 69 6c 65 20 64 69  rectory [file di
a820: 72 6e 61 6d 65 20 24 74 61 72 67 65 74 46 69 6c  rname $targetFil
a830: 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  eName]....      
a840: 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
a850: 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65        if {![file
a860: 20 65 78 69 73 74 73 20 24 74 61 72 67 65 74 44   exists $targetD
a870: 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20  irectory]} then 
a880: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66 69 6c  {..          fil
a890: 65 20 6d 6b 64 69 72 20 24 74 61 72 67 65 74 44  e mkdir $targetD
a8a0: 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20  irectory..      
a8b0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 66 69 6c    }..        fil
a8c0: 65 20 63 6f 70 79 20 2d 66 6f 72 63 65 20 24 73  e copy -force $s
a8d0: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 24 74  ourceFileName $t
a8e0: 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 0d 0a 20  argetFileName.. 
a8f0: 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68       }] == 0} th
a900: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  en {..        tp
a910: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
a920: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
a930: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
a940: 2d 2d 2d 2d 20 63 6f 70 69 65 64 20 62 69 6e 61  ---- copied bina
a950: 72 79 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22  ry file from \""
a960: 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65   $sourceFileName
a970: 20 22 5c 22 20 74 6f 20 5c 22 22 20 5c 0d 0a 20   "\" to \"" \.. 
a980: 20 20 20 20 20 20 20 20 20 20 20 24 74 61 72 67             $targ
a990: 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d  etFileName \"\n]
a9a0: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
a9b0: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
a9c0: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
a9d0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
a9e0: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
a9f0: 20 66 61 69 6c 65 64 20 74 6f 20 63 6f 70 79 20   failed to copy 
aa00: 62 69 6e 61 72 79 20 66 69 6c 65 20 66 72 6f 6d  binary file from
aa10: 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65   \"" $sourceFile
aa20: 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  Name \..        
aa30: 20 20 20 20 22 5c 22 20 74 6f 20 5c 22 22 20 24      "\" to \"" $
aa40: 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5c  targetFileName \
aa50: 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  "\n]..      }.. 
aa60: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
aa70: 63 20 74 72 79 43 6f 70 79 42 75 69 6c 64 46 69  c tryCopyBuildFi
aa80: 6c 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  le {..          
aa90: 20 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74    fileName {plat
aaa0: 66 6f 72 6d 20 22 22 7d 20 7b 6e 65 77 46 69 6c  form ""} {newFil
aab0: 65 4e 61 6d 65 20 22 22 7d 20 7b 76 65 72 62 6f  eName ""} {verbo
aac0: 73 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  se false} } {.. 
aad0: 20 20 20 20 20 73 65 74 20 73 6f 75 72 63 65 46       set sourceF
aae0: 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c  ileName [getBuil
aaf0: 64 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e  dFileName $fileN
ab00: 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a  ame $platform]..
ab10: 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69  ..      if {![fi
ab20: 6c 65 20 65 78 69 73 74 73 20 24 73 6f 75 72 63  le exists $sourc
ab30: 65 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  eFileName]} then
ab40: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
ab50: 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b  $verbose} then {
ab60: 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
ab70: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
ab80: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
ab90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
aba0: 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 63 6f 70  ---- skipped cop
abb0: 79 69 6e 67 20 62 75 69 6c 64 20 66 69 6c 65 20  ying build file 
abc0: 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e  \"" $sourceFileN
abd0: 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
abe0: 20 20 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65       "\", it doe
abf0: 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d  s not exist\n"].
ac00: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
ac10: 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20      return..    
ac20: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
ac30: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
ac40: 24 6e 65 77 46 69 6c 65 4e 61 6d 65 5d 20 3e 20  $newFileName] > 
ac50: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
ac60: 20 20 20 73 65 74 20 74 61 72 67 65 74 46 69 6c     set targetFil
ac70: 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79  eName [getBinary
ac80: 46 69 6c 65 4e 61 6d 65 20 24 6e 65 77 46 69 6c  FileName $newFil
ac90: 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d  eName $platform]
aca0: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
acb0: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 61  ..        set ta
acc0: 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65  rgetFileName [ge
acd0: 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
ace0: 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66  $fileName $platf
acf0: 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  orm]..      }...
ad00: 0a 20 20 20 20 20 20 73 65 74 20 74 61 72 67 65  .      set targe
ad10: 74 44 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65  tDirectory [file
ad20: 20 64 69 72 6e 61 6d 65 20 24 74 61 72 67 65 74   dirname $target
ad30: 46 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20  FileName]....   
ad40: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
ad50: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 66  .        if {![f
ad60: 69 6c 65 20 65 78 69 73 74 73 20 24 74 61 72 67  ile exists $targ
ad70: 65 74 44 69 72 65 63 74 6f 72 79 5d 7d 20 74 68  etDirectory]} th
ad80: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
ad90: 66 69 6c 65 20 6d 6b 64 69 72 20 24 74 61 72 67  file mkdir $targ
ada0: 65 74 44 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  etDirectory..   
adb0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
adc0: 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63 65  file copy -force
add0: 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65   $sourceFileName
ade0: 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65   $targetFileName
adf0: 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d  ..      }] == 0}
ae00: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
ae10: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
ae20: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
ae30: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
ae40: 20 20 22 2d 2d 2d 2d 20 63 6f 70 69 65 64 20 62    "---- copied b
ae50: 75 69 6c 64 20 66 69 6c 65 20 66 72 6f 6d 20 5c  uild file from \
ae60: 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61  "" $sourceFileNa
ae70: 6d 65 20 22 5c 22 20 74 6f 20 5c 22 22 20 5c 0d  me "\" to \"" \.
ae80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 74 61  .            $ta
ae90: 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c  rgetFileName \"\
aea0: 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  n]..      } else
aeb0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
aec0: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
aed0: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
aee0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
aef0: 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20 63 6f 70  -- failed to cop
af00: 79 20 62 75 69 6c 64 20 66 69 6c 65 20 66 72 6f  y build file fro
af10: 6d 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c  m \"" $sourceFil
af20: 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  eName \..       
af30: 20 20 20 20 20 22 5c 22 20 74 6f 20 5c 22 22 20       "\" to \"" 
af40: 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20  $targetFileName 
af50: 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  \"\n]..      }..
af60: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
af70: 6f 63 20 74 72 79 44 65 6c 65 74 65 42 69 6e 61  oc tryDeleteBina
af80: 72 79 46 69 6c 65 20 7b 20 66 69 6c 65 4e 61 6d  ryFile { fileNam
af90: 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20  e {platform ""} 
afa0: 7b 76 65 72 62 6f 73 65 20 66 61 6c 73 65 7d 20  {verbose false} 
afb0: 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 66  } {..      set f
afc0: 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61  ileName [getBina
afd0: 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  ryFileName $file
afe0: 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d  Name $platform].
aff0: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 66  ...      if {![f
b000: 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65  ile exists $file
b010: 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
b020: 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62         if {$verb
b030: 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ose} then {..   
b040: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
b050: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
b060: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
b070: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
b080: 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67  skipped deleting
b090: 20 62 69 6e 61 72 79 20 66 69 6c 65 20 5c 22 22   binary file \""
b0a0: 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20   $fileName \..  
b0b0: 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c              "\",
b0c0: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
b0d0: 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  st\n"]..        
b0e0: 7d 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  }..        retur
b0f0: 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  n..      }....  
b100: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
b110: 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66 69 6c  file delete $fil
b120: 65 4e 61 6d 65 7d 5d 20 3d 3d 20 30 7d 20 74 68  eName}] == 0} th
b130: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  en {..        tp
b140: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
b150: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
b160: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
b170: 2d 2d 2d 2d 20 64 65 6c 65 74 65 64 20 62 69 6e  ---- deleted bin
b180: 61 72 79 20 66 69 6c 65 20 5c 22 22 20 24 66 69  ary file \"" $fi
b190: 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20  leName \"\n]..  
b1a0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
b1b0: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
b1c0: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
b1d0: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
b1e0: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69         "---- fai
b1f0: 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 62 69  led to delete bi
b200: 6e 61 72 79 20 66 69 6c 65 20 5c 22 22 20 24 66  nary file \"" $f
b210: 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20  ileName \"\n].. 
b220: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
b230: 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79 44 65  ..    proc tryDe
b240: 6c 65 74 65 42 75 69 6c 64 46 69 6c 65 20 7b 20  leteBuildFile { 
b250: 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f  fileName {platfo
b260: 72 6d 20 22 22 7d 20 7b 76 65 72 62 6f 73 65 20  rm ""} {verbose 
b270: 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20  false} } {..    
b280: 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b    set fileName [
b290: 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65  getBuildFileName
b2a0: 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74   $fileName $plat
b2b0: 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69  form]....      i
b2c0: 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73  f {![file exists
b2d0: 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65   $fileName]} the
b2e0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
b2f0: 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20  {$verbose} then 
b300: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
b310: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
b320: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
b330: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
b340: 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 64 65  "---- skipped de
b350: 6c 65 74 69 6e 67 20 62 75 69 6c 64 20 66 69 6c  leting build fil
b360: 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20  e \"" $fileName 
b370: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
b380: 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f   "\", it does no
b390: 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20  t exist\n"]..   
b3a0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
b3b0: 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d  return..      }.
b3c0: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  ...      if {[ca
b3d0: 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65  tch {file delete
b3e0: 20 24 66 69 6c 65 4e 61 6d 65 7d 5d 20 3d 3d 20   $fileName}] == 
b3f0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
b400: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
b410: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
b420: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
b430: 20 20 20 20 22 2d 2d 2d 2d 20 64 65 6c 65 74 65      "---- delete
b440: 64 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22  d build file \""
b450: 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d   $fileName \"\n]
b460: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
b470: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
b480: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
b490: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
b4a0: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
b4b0: 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74   failed to delet
b4c0: 65 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22  e build file \""
b4d0: 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d   $fileName \"\n]
b4e0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
b4f0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72  .....    proc tr
b500: 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 7b 0d  yCopyAssembly {.
b510: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c  .            fil
b520: 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20  eName {platform 
b530: 22 22 7d 20 7b 70 64 62 20 74 72 75 65 7d 20 7b  ""} {pdb true} {
b540: 76 65 72 62 6f 73 65 20 66 61 6c 73 65 7d 20 7d  verbose false} }
b550: 20 7b 0d 0a 20 20 20 20 20 20 74 72 79 43 6f 70   {..      tryCop
b560: 79 42 75 69 6c 64 46 69 6c 65 20 24 66 69 6c 65  yBuildFile $file
b570: 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 20 22  Name $platform "
b580: 22 20 24 76 65 72 62 6f 73 65 0d 0a 0d 0a 20 20  " $verbose....  
b590: 20 20 20 20 69 66 20 7b 24 70 64 62 7d 20 74 68      if {$pdb} th
b5a0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 72  en {..        tr
b5b0: 79 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20 5b  yCopyBuildFile [
b5c0: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
b5d0: 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
b5e0: 72 6f 6f 74 6e 61 6d 65 20 24 66 69 6c 65 4e 61  rootname $fileNa
b5f0: 6d 65 5d 20 2e 70 64 62 5d 20 24 70 6c 61 74 66  me] .pdb] $platf
b600: 6f 72 6d 20 22 22 20 24 76 65 72 62 6f 73 65 0d  orm "" $verbose.
b610: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
b620: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79  ....    proc try
b630: 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 7b  DeleteAssembly {
b640: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 69  ..            fi
b650: 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d  leName {platform
b660: 20 22 22 7d 20 7b 70 64 62 20 74 72 75 65 7d 20   ""} {pdb true} 
b670: 7b 76 65 72 62 6f 73 65 20 66 61 6c 73 65 7d 20  {verbose false} 
b680: 7d 20 7b 0d 0a 20 20 20 20 20 20 74 72 79 44 65  } {..      tryDe
b690: 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20 24  leteBinaryFile $
b6a0: 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f  fileName $platfo
b6b0: 72 6d 20 24 76 65 72 62 6f 73 65 0d 0a 0d 0a 20  rm $verbose.... 
b6c0: 20 20 20 20 20 69 66 20 7b 24 70 64 62 7d 20 74       if {$pdb} t
b6d0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  hen {..        t
b6e0: 72 79 44 65 6c 65 74 65 42 69 6e 61 72 79 46 69  ryDeleteBinaryFi
b6f0: 6c 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  le [appendArgs \
b700: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
b710: 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 24 66 69  ile rootname $fi
b720: 6c 65 4e 61 6d 65 5d 20 2e 70 64 62 5d 20 24 70  leName] .pdb] $p
b730: 6c 61 74 66 6f 72 6d 20 24 76 65 72 62 6f 73 65  latform $verbose
b740: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
b750: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72  .....    proc tr
b760: 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20 7b 20  yLoadAssembly { 
b770: 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f  fileName {platfo
b780: 72 6d 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20  rm ""} } {..    
b790: 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b    set fileName [
b7a0: 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
b7b0: 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61  e $fileName $pla
b7c0: 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20  tform]....      
b7d0: 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
b7e0: 20 20 20 20 20 20 73 65 74 20 61 73 73 65 6d 62        set assemb
b7f0: 6c 79 20 5b 6f 62 6a 65 63 74 20 6c 6f 61 64 20  ly [object load 
b800: 2d 6c 6f 61 64 74 79 70 65 20 46 69 6c 65 20 2d  -loadtype File -
b810: 61 6c 69 61 73 20 24 66 69 6c 65 4e 61 6d 65 5d  alias $fileName]
b820: 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d  ..      }] == 0}
b830: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
b840: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
b850: 54 45 3a 20 4e 6f 77 2c 20 61 64 64 20 74 68 65  TE: Now, add the
b860: 20 6e 65 63 65 73 73 61 72 79 20 74 65 73 74 20   necessary test 
b870: 63 6f 6e 73 74 72 61 69 6e 74 2e 0d 0a 20 20 20  constraint...   
b880: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
b890: 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 66  addConstraint [f
b8a0: 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 5b 66 69  ile rootname [fi
b8b0: 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d  le tail $fileNam
b8c0: 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  e]]....        #
b8d0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
b8e0: 3a 20 47 72 61 62 20 74 68 65 20 69 6d 61 67 65  : Grab the image
b8f0: 20 72 75 6e 74 69 6d 65 20 76 65 72 73 69 6f 6e   runtime version
b900: 20 66 72 6f 6d 20 74 68 65 20 61 73 73 65 6d 62   from the assemb
b910: 6c 79 20 62 65 63 61 75 73 65 0d 0a 20 20 20 20  ly because..    
b920: 20 20 20 20 23 20 20 20 20 20 20 20 73 65 76 65      #       seve
b930: 72 61 6c 20 74 65 73 74 73 20 72 65 6c 79 20 6f  ral tests rely o
b940: 6e 20 69 74 20 68 61 76 69 6e 67 20 61 20 63 65  n it having a ce
b950: 72 74 61 69 6e 20 76 61 6c 75 65 2e 0d 0a 20 20  rtain value...  
b960: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
b970: 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b   addConstraint [
b980: 61 70 70 65 6e 64 41 72 67 73 20 5b 66 69 6c 65  appendArgs [file
b990: 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d   tail $fileName]
b9a0: 20 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   _ \..          
b9b0: 20 20 5b 24 61 73 73 65 6d 62 6c 79 20 49 6d 61    [$assembly Ima
b9c0: 67 65 52 75 6e 74 69 6d 65 56 65 72 73 69 6f 6e  geRuntimeVersion
b9d0: 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  ]]....        #.
b9e0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
b9f0: 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
ba00: 20 70 61 74 68 20 6f 66 20 74 68 65 20 6c 6f 61   path of the loa
ba10: 64 65 64 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20  ded file...     
ba20: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
ba30: 74 75 72 6e 20 24 66 69 6c 65 4e 61 6d 65 0d 0a  turn $fileName..
ba40: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
ba50: 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20   return ""..    
ba60: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69  }.....    proc i
ba70: 73 53 51 4c 69 74 65 52 65 61 64 79 20 7b 7d 20  sSQLiteReady {} 
ba80: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
ba90: 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70    # NOTE: This p
baa0: 72 6f 63 65 64 75 72 65 20 6d 75 73 74 20 72 65  rocedure must re
bab0: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e  turn non-zero on
bac0: 6c 79 20 69 66 20 74 68 65 20 53 51 4c 69 74 65  ly if the SQLite
bad0: 20 6e 61 74 69 76 65 0d 0a 20 20 20 20 20 20 23   native..      #
bae0: 20 20 20 20 20 20 20 6c 69 62 72 61 72 79 20 61         library a
baf0: 6e 64 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61  nd the System.Da
bb00: 74 61 2e 53 51 4c 69 74 65 20 6d 61 6e 61 67 65  ta.SQLite manage
bb10: 64 20 61 73 73 65 6d 62 6c 79 20 61 72 65 20 6c  d assembly are l
bb20: 6f 61 64 65 64 0d 0a 20 20 20 20 20 20 23 20 20  oaded..      #  
bb30: 20 20 20 20 20 61 6e 64 20 72 65 61 64 79 20 66       and ready f
bb40: 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 74 65  or use by the te
bb50: 73 74 20 73 75 69 74 65 2e 20 20 43 75 72 72 65  st suite.  Curre
bb60: 6e 74 6c 79 2c 20 74 68 69 73 20 70 72 6f 63 65  ntly, this proce
bb70: 64 75 72 65 0d 0a 20 20 20 20 20 20 23 20 20 20  dure..      #   
bb80: 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 63 61      should be ca
bb90: 6c 6c 65 64 20 6f 6e 6c 79 20 61 66 74 65 72 20  lled only after 
bba0: 74 68 65 20 5b 74 72 79 4c 6f 61 64 41 73 73 65  the [tryLoadAsse
bbb0: 6d 62 6c 79 5d 20 70 72 6f 63 65 64 75 72 65 20  mbly] procedure 
bbc0: 68 61 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20  has..      #    
bbd0: 20 20 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74     been called t
bbe0: 6f 20 70 72 6f 62 65 20 66 6f 72 20 74 68 65 20  o probe for the 
bbf0: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
bc00: 74 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d  te managed assem
bc10: 62 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  bly..      #    
bc20: 20 20 20 61 6e 64 20 74 68 65 20 5b 63 68 65 63     and the [chec
bc30: 6b 46 6f 72 53 51 4c 69 74 65 5d 20 70 72 6f 63  kForSQLite] proc
bc40: 65 64 75 72 65 20 68 61 73 20 62 65 65 6e 20 63  edure has been c
bc50: 61 6c 6c 65 64 20 74 6f 20 70 72 6f 62 65 20 66  alled to probe f
bc60: 6f 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  or..      #     
bc70: 20 20 74 68 65 20 53 51 4c 69 74 65 20 6e 61 74    the SQLite nat
bc80: 69 76 65 20 6c 69 62 72 61 72 79 3b 20 6f 74 68  ive library; oth
bc90: 65 72 77 69 73 65 2c 20 74 68 69 73 20 70 72 6f  erwise, this pro
bca0: 63 65 64 75 72 65 20 77 69 6c 6c 20 73 69 6d 70  cedure will simp
bcb0: 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ly..      #     
bcc0: 20 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20    always return 
bcd0: 7a 65 72 6f 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  zero...      #..
bce0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78        return [ex
bcf0: 70 72 20 7b 0d 0a 20 20 20 20 20 20 20 20 5b 68  pr {..        [h
bd00: 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 53 79  aveConstraint Sy
bd10: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
bd20: 5d 20 26 26 20 5b 68 61 76 65 43 6f 6e 73 74 72  ] && [haveConstr
bd30: 61 69 6e 74 20 53 51 4c 69 74 65 5d 0d 0a 20 20  aint SQLite]..  
bd40: 20 20 20 20 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c      }]..    }...
bd50: 0d 0a 20 20 20 20 70 72 6f 63 20 6d 61 74 63 68  ..    proc match
bd60: 50 6c 61 74 66 6f 72 6d 20 7b 20 70 6c 61 74 66  Platform { platf
bd70: 6f 72 6d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  orm } {..      #
bd80: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
bd90: 41 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20  An empty string 
bda0: 66 6f 72 20 74 68 65 20 70 6c 61 74 66 6f 72 6d  for the platform
bdb0: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
bdc0: 62 75 69 6c 64 20 69 73 20 6e 6f 74 0d 0a 20 20  build is not..  
bdd0: 20 20 20 20 23 20 20 20 20 20 20 20 5b 70 72 69      #       [pri
bde0: 6d 61 72 69 6c 79 5d 20 61 20 6e 61 74 69 76 65  marily] a native
bdf0: 20 62 75 69 6c 64 3b 20 74 68 65 72 65 66 6f 72   build; therefor
be00: 65 2c 20 69 74 20 61 6c 77 61 79 73 20 6d 61 74  e, it always mat
be10: 63 68 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ches...      #..
be20: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
be30: 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f  g length $platfo
be40: 72 6d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  rm] == 0} then {
be50: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
be60: 20 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a   true..      }..
be70: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
be80: 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20 74 68   # NOTE: Does th
be90: 65 20 73 70 65 63 69 66 69 65 64 20 70 6c 61 74  e specified plat
bea0: 66 6f 72 6d 20 6d 61 74 63 68 20 75 70 20 74 6f  form match up to
beb0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f   the current pro
bec0: 63 65 73 73 3f 0d 0a 20 20 20 20 20 20 23 0d 0a  cess?..      #..
bed0: 20 20 20 20 20 20 69 66 20 7b 24 70 6c 61 74 66        if {$platf
bee0: 6f 72 6d 20 65 71 20 5b 6d 61 63 68 69 6e 65 54  orm eq [machineT
bef0: 6f 50 6c 61 74 66 6f 72 6d 20 24 3a 3a 74 63 6c  oPlatform $::tcl
bf00: 5f 70 6c 61 74 66 6f 72 6d 28 6d 61 63 68 69 6e  _platform(machin
bf10: 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  e)]} then {..   
bf20: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
bf30: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
bf40: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
bf50: 54 45 3a 20 54 68 65 20 73 70 65 63 69 66 69 65  TE: The specifie
bf60: 64 20 70 6c 61 74 66 6f 72 6d 20 64 6f 65 73 20  d platform does 
bf70: 6e 6f 74 20 6d 61 74 63 68 20 75 70 20 77 69 74  not match up wit
bf80: 68 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 0d 0a  h the platform..
bf90: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66 6f        #       fo
bfa0: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72  r the current pr
bfb0: 6f 63 65 73 73 2e 0d 0a 20 20 20 20 20 20 23 0d  ocess...      #.
bfc0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61  .      return fa
bfd0: 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  lse..    }..... 
bfe0: 20 20 20 70 72 6f 63 20 68 61 76 65 53 51 4c 69     proc haveSQLi
bff0: 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 20  teObjectCommand 
c000: 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
c010: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 73 20       # NOTE: Is 
c020: 74 68 65 20 5b 6f 62 6a 65 63 74 5d 20 63 6f 6d  the [object] com
c030: 6d 61 6e 64 20 63 75 72 72 65 6e 74 6c 79 20 61  mand currently a
c040: 76 61 69 6c 61 62 6c 65 3f 0d 0a 20 20 20 20 20  vailable?..     
c050: 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   #..      return
c060: 20 5b 65 78 70 72 20 7b 5b 6c 6c 65 6e 67 74 68   [expr {[llength
c070: 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73 20   [info commands 
c080: 6f 62 6a 65 63 74 5d 5d 20 3e 20 30 7d 5d 0d 0a  object]] > 0}]..
c090: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
c0a0: 6f 63 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74  oc checkForSQLit
c0b0: 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 20 7b  eObjectCommand {
c0c0: 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20   channel } {..  
c0d0: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
c0e0: 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e  el "---- checkin
c0f0: 67 20 66 6f 72 20 5c 22 6f 62 6a 65 63 74 5c 22  g for \"object\"
c100: 20 63 6f 6d 6d 61 6e 64 20 75 73 61 67 65 2e 2e   command usage..
c110: 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  . "....      if 
c120: 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
c130: 3a 6e 6f 28 73 71 6c 69 74 65 4f 62 6a 65 63 74  :no(sqliteObject
c140: 43 6f 6d 6d 61 6e 64 29 5d 20 26 26 20 5c 0d 0a  Command)] && \..
c150: 20 20 20 20 20 20 20 20 20 20 5b 68 61 76 65 53            [haveS
c160: 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61  QLiteObjectComma
c170: 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  nd]} then {..   
c180: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
c190: 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20  nel yes\n..     
c1a0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
c1b0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
c1c0: 4e 4f 54 45 3a 20 55 6e 6c 65 73 73 20 77 65 20  NOTE: Unless we 
c1d0: 61 72 65 20 66 6f 72 62 69 64 64 65 6e 20 66 72  are forbidden fr
c1e0: 6f 6d 20 64 6f 69 6e 67 20 73 6f 2c 20 61 64 64  om doing so, add
c1f0: 20 73 6f 6d 65 20 63 6f 6e 73 74 72 61 69 6e 74   some constraint
c200: 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  s..        #    
c210: 20 20 20 74 68 61 74 20 77 69 6c 6c 20 61 6c 6c     that will all
c220: 6f 77 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 74  ow most of the t
c230: 65 73 74 20 73 75 69 74 65 20 74 6f 20 72 75 6e  est suite to run
c240: 20 28 69 2e 65 2e 20 74 68 6f 73 65 0d 0a 20 20   (i.e. those..  
c250: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65        #       te
c260: 73 74 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  sts that do not 
c270: 64 69 72 65 63 74 6c 79 20 72 65 6c 79 20 75 70  directly rely up
c280: 6f 6e 20 74 68 65 20 5b 6f 62 6a 65 63 74 5d 20  on the [object] 
c290: 63 6f 6d 6d 61 6e 64 29 2e 0d 0a 20 20 20 20 20  command)...     
c2a0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
c2b0: 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
c2c0: 3a 3a 6e 6f 28 73 68 69 6d 53 51 4c 69 74 65 41  ::no(shimSQLiteA
c2d0: 73 73 65 6d 62 6c 79 43 6f 6e 73 74 72 61 69 6e  ssemblyConstrain
c2e0: 74 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ts)]} then {..  
c2f0: 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
c300: 72 61 69 6e 74 20 53 51 4c 69 74 65 0d 0a 20 20  raint SQLite..  
c310: 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
c320: 72 61 69 6e 74 20 53 51 4c 69 74 65 49 6e 74 65  raint SQLiteInte
c330: 72 6f 70 0d 0a 20 20 20 20 20 20 20 20 20 20 61  rop..          a
c340: 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 53 79 73  ddConstraint Sys
c350: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 0d  tem.Data.SQLite.
c360: 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f  .          addCo
c370: 6e 73 74 72 61 69 6e 74 20 53 79 73 74 65 6d 2e  nstraint System.
c380: 44 61 74 61 2e 53 51 4c 69 74 65 2e 45 6e 63 72  Data.SQLite.Encr
c390: 79 70 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20  yption..        
c3a0: 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
c3b0: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
c3c0: 74 65 2e 4c 69 6e 71 0d 0a 0d 0a 20 20 20 20 20  te.Linq....     
c3d0: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
c3e0: 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  nt [appendArgs \
c3f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
c400: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
c410: 74 65 2e 64 6c 6c 5f 76 20 5b 67 65 74 42 75 69  te.dll_v [getBui
c420: 6c 64 43 6c 72 56 65 72 73 69 6f 6e 5d 5d 0d 0a  ldClrVersion]]..
c430: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
c440: 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
c450: 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 68 69 6d  exists ::no(shim
c460: 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73  SQLiteDefineCons
c470: 74 61 6e 74 43 6f 6e 73 74 72 61 69 6e 74 73 29  tantConstraints)
c480: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
c490: 20 20 20 20 20 66 6f 72 65 61 63 68 20 64 65 66       foreach def
c4a0: 69 6e 65 43 6f 6e 73 74 61 6e 74 20 5b 6c 69 73  ineConstant [lis
c4b0: 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
c4c0: 20 20 20 49 4e 54 45 52 4f 50 5f 45 58 54 45 4e     INTEROP_EXTEN
c4d0: 53 49 4f 4e 5f 46 55 4e 43 54 49 4f 4e 53 20 49  SION_FUNCTIONS I
c4e0: 4e 54 45 52 4f 50 5f 46 54 53 35 5f 45 58 54 45  NTEROP_FTS5_EXTE
c4f0: 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20  NSION \..       
c500: 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 4a         INTEROP_J
c510: 53 4f 4e 31 5f 45 58 54 45 4e 53 49 4f 4e 20 49  SON1_EXTENSION I
c520: 4e 54 45 52 4f 50 5f 50 45 52 43 45 4e 54 49 4c  NTEROP_PERCENTIL
c530: 45 5f 45 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20  E_EXTENSION \.. 
c540: 20 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 54               INT
c550: 45 52 4f 50 5f 52 45 47 45 58 50 5f 45 58 54 45  EROP_REGEXP_EXTE
c560: 4e 53 49 4f 4e 20 49 4e 54 45 52 4f 50 5f 54 45  NSION INTEROP_TE
c570: 53 54 5f 45 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a  ST_EXTENSION \..
c580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49 4e                IN
c590: 54 45 52 4f 50 5f 54 4f 54 59 50 45 5f 45 58 54  TEROP_TOTYPE_EXT
c5a0: 45 4e 53 49 4f 4e 20 49 4e 54 45 52 4f 50 5f 56  ENSION INTEROP_V
c5b0: 49 52 54 55 41 4c 5f 54 41 42 4c 45 20 5c 0d 0a  IRTUAL_TABLE \..
c5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 55 53                US
c5d0: 45 5f 49 4e 54 45 52 4f 50 5f 44 4c 4c 5d 20 7b  E_INTEROP_DLL] {
c5e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 64  ..            ad
c5f0: 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  dConstraint [app
c600: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
c610: 20 20 20 20 20 20 20 20 20 20 20 64 65 66 69 6e             defin
c620: 65 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74 65 6d  eConstant.System
c630: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 20 24 64  .Data.SQLite. $d
c640: 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 5d 0d 0a  efineConstant]..
c650: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
c660: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
c670: 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
c680: 73 74 73 20 3a 3a 6e 6f 28 73 68 69 6d 53 51 4c  sts ::no(shimSQL
c690: 69 74 65 56 69 73 75 61 6c 53 74 75 64 69 6f 43  iteVisualStudioC
c6a0: 6f 6e 73 74 72 61 69 6e 74 73 29 5d 7d 20 74 68  onstraints)]} th
c6b0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
c6c0: 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  addConstraint [a
c6d0: 70 70 65 6e 64 41 72 67 73 20 76 69 73 75 61 6c  ppendArgs visual
c6e0: 53 74 75 64 69 6f 20 5b 67 65 74 42 75 69 6c 64  Studio [getBuild
c6f0: 59 65 61 72 5d 5d 0d 0a 20 20 20 20 20 20 20 20  Year]]..        
c700: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75  }....        tpu
c710: 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e  ts $channel no\n
c720: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
c730: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68  .....    proc ch
c740: 61 6e 67 65 4e 61 74 69 76 65 52 75 6e 74 69 6d  angeNativeRuntim
c750: 65 4f 70 74 69 6f 6e 20 7b 20 6e 61 74 69 76 65  eOption { native
c760: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b   } {..      if {
c770: 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66 6f 20 63  [llength [info c
c780: 6f 6d 6d 61 6e 64 73 20 64 65 62 75 67 5d 5d 20  ommands debug]] 
c790: 3e 20 30 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  > 0 && \..      
c7a0: 20 20 20 20 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e      [llength [in
c7b0: 66 6f 20 73 75 62 63 6f 6d 6d 61 6e 64 73 20 64  fo subcommands d
c7c0: 65 62 75 67 20 72 75 6e 74 69 6d 65 6f 70 74 69  ebug runtimeopti
c7d0: 6f 6e 5d 5d 20 3e 20 30 20 26 26 20 5b 63 61 74  on]] > 0 && [cat
c7e0: 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 64 65  ch {..        de
c7f0: 62 75 67 20 72 75 6e 74 69 6d 65 6f 70 74 69 6f  bug runtimeoptio
c800: 6e 20 5b 65 78 70 72 20 7b 24 6e 61 74 69 76 65  n [expr {$native
c810: 20 3f 20 22 61 64 64 22 20 3a 20 22 72 65 6d 6f   ? "add" : "remo
c820: 76 65 22 7d 5d 20 6e 61 74 69 76 65 0d 0a 20 20  ve"}] native..  
c830: 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65      }] == 0} the
c840: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  n {..        ret
c850: 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
c860: 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  }....      if {[
c870: 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74  haveSQLiteObject
c880: 43 6f 6d 6d 61 6e 64 5d 20 26 26 20 5b 63 61 74  Command] && [cat
c890: 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62  ch {..        ob
c8a0: 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49 6e 74 65  ject invoke Inte
c8b0: 72 70 72 65 74 65 72 2e 47 65 74 41 63 74 69 76  rpreter.GetActiv
c8c0: 65 20 5b 65 78 70 72 20 7b 24 6e 61 74 69 76 65  e [expr {$native
c8d0: 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   ? \..          
c8e0: 20 20 22 41 64 64 52 75 6e 74 69 6d 65 4f 70 74    "AddRuntimeOpt
c8f0: 69 6f 6e 22 20 3a 20 22 52 65 6d 6f 76 65 52 75  ion" : "RemoveRu
c900: 6e 74 69 6d 65 4f 70 74 69 6f 6e 22 7d 5d 20 6e  ntimeOption"}] n
c910: 61 74 69 76 65 0d 0a 20 20 20 20 20 20 7d 5d 20  ative..      }] 
c920: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
c930: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
c940: 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  e..      }....  
c950: 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
c960: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
c970: 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51 4c  proc checkForSQL
c980: 69 74 65 42 75 69 6c 64 73 20 7b 20 63 68 61 6e  iteBuilds { chan
c990: 6e 65 6c 20 7b 73 65 6c 65 63 74 20 66 61 6c 73  nel {select fals
c9a0: 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e} } {..      #.
c9b0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43  .      # NOTE: C
c9c0: 68 65 63 6b 20 66 6f 72 20 65 76 65 72 79 20 70  heck for every p
c9d0: 6f 73 73 69 62 6c 65 20 76 61 6c 69 64 20 63 6f  ossible valid co
c9e0: 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 76 61 6c  mbination of val
c9f0: 75 65 73 20 75 73 65 64 20 77 68 65 6e 0d 0a 20  ues used when.. 
ca00: 20 20 20 20 20 23 20 20 20 20 20 20 20 6c 6f 63       #       loc
ca10: 61 74 69 6e 67 20 6f 75 74 20 74 68 65 20 62 75  ating out the bu
ca20: 69 6c 64 20 6f 75 74 70 75 74 20 64 69 72 65 63  ild output direc
ca30: 74 6f 72 79 2c 20 73 68 6f 77 69 6e 67 20 65 61  tory, showing ea
ca40: 63 68 20 61 76 61 69 6c 61 62 6c 65 0d 0a 20 20  ch available..  
ca50: 20 20 20 20 23 20 20 20 20 20 20 20 62 75 69 6c      #       buil
ca60: 64 20 76 61 72 69 61 74 69 6f 6e 20 61 6c 6f 6e  d variation alon
ca70: 67 20 74 68 65 20 77 61 79 2e 0d 0a 20 20 20 20  g the way...    
ca80: 20 20 23 0d 0a 20 20 20 20 20 20 66 6f 72 65 61    #..      forea
ca90: 63 68 20 6e 61 74 69 76 65 20 5b 6c 69 73 74 20  ch native [list 
caa0: 66 61 6c 73 65 20 74 72 75 65 5d 20 7b 0d 0a 20  false true] {.. 
cab0: 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 79         foreach y
cac0: 65 61 72 20 5b 67 65 74 42 75 69 6c 64 59 65 61  ear [getBuildYea
cad0: 72 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  rs] {..         
cae0: 20 66 6f 72 65 61 63 68 20 63 6f 6e 66 69 67 75   foreach configu
caf0: 72 61 74 69 6f 6e 20 5b 67 65 74 42 75 69 6c 64  ration [getBuild
cb00: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 5d 20  Configurations] 
cb10: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  {..            #
cb20: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
cb30: 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f 75 74  NOTE: Figure out
cb40: 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 62   the effective b
cb50: 75 69 6c 64 20 70 6c 61 74 66 6f 72 6d 2e 20 20  uild platform.  
cb60: 54 68 69 73 20 69 73 0d 0a 20 20 20 20 20 20 20  This is..       
cb70: 20 20 20 20 20 23 20 20 20 20 20 20 20 62 61 73       #       bas
cb80: 65 64 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ed on whether or
cb90: 20 6e 6f 74 20 61 20 5b 70 72 69 6d 61 72 69 6c   not a [primaril
cba0: 79 5d 20 6e 61 74 69 76 65 20 62 75 69 6c 64 0d  y] native build.
cbb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20  .            #  
cbc0: 20 20 20 20 20 69 73 20 62 65 69 6e 67 20 75 73       is being us
cbd0: 65 64 2e 20 20 46 6f 72 20 5b 70 72 69 6d 61 72  ed.  For [primar
cbe0: 69 6c 79 5d 20 6e 6f 6e 2d 6e 61 74 69 76 65 20  ily] non-native 
cbf0: 62 75 69 6c 64 73 2c 0d 0a 20 20 20 20 20 20 20  builds,..       
cc00: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 69       #       thi
cc10: 73 20 77 69 6c 6c 20 62 65 20 61 6e 20 65 6d 70  s will be an emp
cc20: 74 79 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20  ty string...    
cc30: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
cc40: 20 20 20 20 20 20 20 73 65 74 20 70 6c 61 74 66         set platf
cc50: 6f 72 6d 20 5b 67 65 74 42 75 69 6c 64 50 6c 61  orm [getBuildPla
cc60: 74 66 6f 72 6d 20 24 6e 61 74 69 76 65 5d 0d 0a  tform $native]..
cc70: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
cc80: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
cc90: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
cca0: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
ccb0: 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53  - checking for S
ccc0: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
ccd0: 65 20 62 75 69 6c 64 20 5c 22 22 20 5b 65 78 70  e build \"" [exp
cce0: 72 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  r \..           
ccf0: 20 20 20 20 20 7b 24 6e 61 74 69 76 65 20 3f 20       {$native ? 
cd00: 22 6e 61 74 69 76 65 2f 22 20 3a 20 22 22 7d 5d  "native/" : ""}]
cd10: 20 5b 65 78 70 72 20 7b 5b 73 74 72 69 6e 67 20   [expr {[string 
cd20: 6c 65 6e 67 74 68 20 5c 0d 0a 20 20 20 20 20 20  length \..      
cd30: 20 20 20 20 20 20 20 20 20 20 24 70 6c 61 74 66            $platf
cd40: 6f 72 6d 5d 20 3e 20 30 20 3f 20 5b 61 70 70 65  orm] > 0 ? [appe
cd50: 6e 64 41 72 67 73 20 24 70 6c 61 74 66 6f 72 6d  ndArgs $platform
cd60: 20 2f 5d 20 3a 20 22 22 7d 5d 20 24 79 65 61 72   /] : ""}] $year
cd70: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
cd80: 20 20 20 20 2f 20 24 63 6f 6e 66 69 67 75 72 61      / $configura
cd90: 74 69 6f 6e 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a  tion "\"... "]..
cda0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
cdb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
cdc0: 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 66  OTE: Build the f
cdd0: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 64  ully qualified d
cde0: 69 72 65 63 74 6f 72 79 20 77 68 65 72 65 20 74  irectory where t
cdf0: 68 65 20 6e 65 63 65 73 73 61 72 79 0d 0a 20 20  he necessary..  
ce00: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
ce10: 20 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 66 6f 72    components for
ce20: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
ce30: 69 74 65 20 73 68 6f 75 6c 64 20 62 65 20 66 6f  ite should be fo
ce40: 75 6e 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  und...          
ce50: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
ce60: 20 73 65 74 20 64 69 72 65 63 74 6f 72 79 20 5b   set directory [
ce70: 6a 6f 69 6e 42 75 69 6c 64 44 69 72 65 63 74 6f  joinBuildDirecto
ce80: 72 79 20 24 6e 61 74 69 76 65 20 5c 0d 0a 20 20  ry $native \..  
ce90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67                [g
cea0: 65 74 42 75 69 6c 64 42 61 73 65 44 69 72 65 63  etBuildBaseDirec
ceb0: 74 6f 72 79 5d 20 24 79 65 61 72 20 24 70 6c 61  tory] $year $pla
cec0: 74 66 6f 72 6d 20 24 63 6f 6e 66 69 67 75 72 61  tform $configura
ced0: 74 69 6f 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  tion]....       
cee0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
cef0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f 20 74      # NOTE: Do t
cf00: 68 65 20 6e 65 63 65 73 73 61 72 79 20 66 69 6c  he necessary fil
cf10: 65 73 20 65 78 69 73 74 3f 20 20 43 75 72 72 65  es exist?  Curre
cf20: 6e 74 6c 79 2c 20 6e 6f 20 6f 74 68 65 72 20 73  ntly, no other s
cf30: 74 65 70 73 0d 0a 20 20 20 20 20 20 20 20 20 20  teps..          
cf40: 20 20 23 20 20 20 20 20 20 20 61 72 65 20 74 61    #       are ta
cf50: 6b 65 6e 20 74 6f 20 76 65 72 69 66 79 20 74 68  ken to verify th
cf60: 69 73 20 62 75 69 6c 64 20 69 73 20 61 63 74 75  is build is actu
cf70: 61 6c 6c 79 20 76 69 61 62 6c 65 2e 0d 0a 20 20  ally viable...  
cf80: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
cf90: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 73           if {[is
cfa0: 42 75 69 6c 64 41 76 61 69 6c 61 62 6c 65 20 24  BuildAvailable $
cfb0: 6e 61 74 69 76 65 20 24 64 69 72 65 63 74 6f 72  native $director
cfc0: 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  y]} then {..    
cfd0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
cfe0: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
cff0: 45 3a 20 57 68 65 6e 20 69 6e 20 22 73 65 6c 65  E: When in "sele
d000: 63 74 22 20 6d 6f 64 65 2c 20 61 75 74 6f 6d 61  ct" mode, automa
d010: 74 69 63 61 6c 6c 79 20 73 65 6c 65 63 74 20 74  tically select t
d020: 68 65 20 66 69 72 73 74 0d 0a 20 20 20 20 20 20  he first..      
d030: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
d040: 61 76 61 69 6c 61 62 6c 65 20 62 75 69 6c 64 20  available build 
d050: 6f 66 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  of System.Data.S
d060: 51 4c 69 74 65 20 61 6e 64 20 74 68 65 6e 20 72  QLite and then r
d070: 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 20 20 20  eturn..         
d080: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6d 6d       #       imm
d090: 65 64 69 61 74 65 6c 79 2e 0d 0a 20 20 20 20 20  ediately...     
d0a0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
d0b0: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 73            if {$s
d0c0: 65 6c 65 63 74 20 26 26 20 5b 6d 61 74 63 68 50  elect && [matchP
d0d0: 6c 61 74 66 6f 72 6d 20 24 70 6c 61 74 66 6f 72  latform $platfor
d0e0: 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  m]} then {..    
d0f0: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
d100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
d110: 20 4e 4f 54 45 3a 20 4d 61 6e 75 61 6c 6c 79 20   NOTE: Manually 
d120: 6f 76 65 72 72 69 64 65 20 61 6c 6c 20 74 68 65  override all the
d130: 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79   build directory
d140: 20 73 65 6c 65 63 74 69 6f 6e 0d 0a 20 20 20 20   selection..    
d150: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
d160: 20 20 20 20 72 65 6c 61 74 65 64 20 74 65 73 74      related test
d170: 20 73 65 74 74 69 6e 67 73 20 69 6e 20 6f 72 64   settings in ord
d180: 65 72 20 74 6f 20 66 6f 72 63 65 20 74 68 69 73  er to force this
d190: 20 62 75 69 6c 64 0d 0a 20 20 20 20 20 20 20 20   build..        
d1a0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
d1b0: 6f 66 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  of System.Data.S
d1c0: 51 4c 69 74 65 20 74 6f 20 62 65 20 75 73 65 64  QLite to be used
d1d0: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
d1e0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
d1f0: 20 20 20 20 20 20 69 66 20 7b 21 5b 63 68 61 6e        if {![chan
d200: 67 65 4e 61 74 69 76 65 52 75 6e 74 69 6d 65 4f  geNativeRuntimeO
d210: 70 74 69 6f 6e 20 24 6e 61 74 69 76 65 5d 7d 20  ption $native]} 
d220: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
d230: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
d240: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
d250: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
d260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 6e                "n
d270: 6f 2c 20 66 61 69 6c 65 64 20 74 6f 20 22 20 5b  o, failed to " [
d280: 65 78 70 72 20 7b 24 6e 61 74 69 76 65 20 3f 20  expr {$native ? 
d290: 22 61 64 64 22 20 3a 20 22 72 65 6d 6f 76 65 22  "add" : "remove"
d2a0: 7d 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  }] \..          
d2b0: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 74 68              " th
d2c0: 65 20 5c 22 6e 61 74 69 76 65 5c 22 20 72 75 6e  e \"native\" run
d2d0: 74 69 6d 65 20 6f 70 74 69 6f 6e 5c 6e 22 5d 0d  time option\n"].
d2e0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
d2f0: 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73       return fals
d300: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
d310: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
d320: 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65          set ::te
d330: 73 74 5f 79 65 61 72 20 24 79 65 61 72 0d 0a 20  st_year $year.. 
d340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
d350: 65 74 20 3a 3a 74 65 73 74 5f 70 6c 61 74 66 6f  et ::test_platfo
d360: 72 6d 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 20 20  rm $platform..  
d370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
d380: 74 20 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75  t ::test_configu
d390: 72 61 74 69 6f 6e 20 24 63 6f 6e 66 69 67 75 72  ration $configur
d3a0: 61 74 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20  ation....       
d3b0: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
d3c0: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
d3d0: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
d3e0: 20 20 20 20 20 20 20 20 20 20 20 22 79 65 73 2c             "yes,
d3f0: 20 73 65 6c 65 63 74 65 64 20 28 22 20 5b 65 78   selected (" [ex
d400: 70 72 20 7b 24 6e 61 74 69 76 65 20 3f 20 22 6e  pr {$native ? "n
d410: 61 74 69 76 65 2f 22 20 3a 20 22 22 7d 5d 20 5c  ative/" : ""}] \
d420: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
d430: 20 20 20 20 20 20 5b 65 78 70 72 20 7b 5b 73 74        [expr {[st
d440: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61  ring length $pla
d450: 74 66 6f 72 6d 5d 20 3e 20 30 20 3f 20 5b 61 70  tform] > 0 ? [ap
d460: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
d470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d480: 24 70 6c 61 74 66 6f 72 6d 20 2f 5d 20 3a 20 22  $platform /] : "
d490: 22 7d 5d 20 24 79 65 61 72 20 2f 20 24 63 6f 6e  "}] $year / $con
d4a0: 66 69 67 75 72 61 74 69 6f 6e 20 22 29 5c 6e 22  figuration ")\n"
d4b0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
d4c0: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
d4d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
d4e0: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
d4f0: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
d500: 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a  $channel yes\n..
d510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
d520: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65  .            } e
d530: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
d540: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
d550: 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20  nel no\n..      
d560: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
d570: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
d580: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
d590: 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a    return false..
d5a0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
d5b0: 6f 63 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74  oc checkForSQLit
d5c0: 65 52 65 6c 65 61 73 65 73 20 7b 20 63 68 61 6e  eReleases { chan
d5d0: 6e 65 6c 20 7b 73 65 6c 65 63 74 20 66 61 6c 73  nel {select fals
d5e0: 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e} } {..      #.
d5f0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43  .      # NOTE: C
d600: 68 65 63 6b 20 66 6f 72 20 70 61 73 74 20 72 65  heck for past re
d610: 6c 65 61 73 65 73 20 6f 66 20 53 79 73 74 65 6d  leases of System
d620: 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 69 6e 20  .Data.SQLite in 
d630: 74 68 65 20 64 69 72 65 63 74 6f 72 79 0d 0a 20  the directory.. 
d640: 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e       #       con
d650: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 22 53  tained in the "S
d660: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
d670: 65 22 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76  e" environment v
d680: 61 72 69 61 62 6c 65 2c 20 69 66 0d 0a 20 20 20  ariable, if..   
d690: 20 20 20 23 20 20 20 20 20 20 20 70 72 65 73 65     #       prese
d6a0: 6e 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  nt...      #..  
d6b0: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
d6c0: 69 73 74 73 20 3a 3a 65 6e 76 28 53 79 73 74 65  ists ::env(Syste
d6d0: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 29 5d 20  m.Data.SQLite)] 
d6e0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
d6f0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
d700: 3a 3a 65 6e 76 28 53 79 73 74 65 6d 2e 44 61 74  ::env(System.Dat
d710: 61 2e 53 51 4c 69 74 65 29 5d 20 3e 20 30 7d 20  a.SQLite)] > 0} 
d720: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
d730: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
d740: 45 3a 20 42 75 69 6c 64 20 74 68 65 20 66 75 6c  E: Build the ful
d750: 6c 79 20 71 75 61 6c 69 66 69 65 64 20 64 69 72  ly qualified dir
d760: 65 63 74 6f 72 79 20 77 68 65 72 65 20 74 68 65  ectory where the
d770: 20 6e 65 63 65 73 73 61 72 79 0d 0a 20 20 20 20   necessary..    
d780: 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6d 70      #       comp
d790: 6f 6e 65 6e 74 73 20 66 6f 72 20 53 79 73 74 65  onents for Syste
d7a0: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 73 68  m.Data.SQLite sh
d7b0: 6f 75 6c 64 20 62 65 20 66 6f 75 6e 64 2e 0d 0a  ould be found...
d7c0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
d7d0: 20 20 20 73 65 74 20 64 69 72 65 63 74 6f 72 79     set directory
d7e0: 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
d7f0: 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a  e [file join \..
d800: 20 20 20 20 20 20 20 20 20 20 20 20 24 3a 3a 65              $::e
d810: 6e 76 28 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  nv(System.Data.S
d820: 51 4c 69 74 65 29 20 5b 67 65 74 52 65 6c 65 61  QLite) [getRelea
d830: 73 65 56 65 72 73 69 6f 6e 5d 5d 5d 0d 0a 0d 0a  seVersion]]]....
d840: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
d850: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
d860: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
d870: 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67    "---- checking
d880: 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61   for System.Data
d890: 2e 53 51 4c 69 74 65 20 72 65 6c 65 61 73 65 20  .SQLite release 
d8a0: 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
d8b0: 20 20 20 24 64 69 72 65 63 74 6f 72 79 20 22 5c     $directory "\
d8c0: 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20  "... "]....     
d8d0: 20 20 20 69 66 20 7b 5b 69 73 52 65 6c 65 61 73     if {[isReleas
d8e0: 65 41 76 61 69 6c 61 62 6c 65 20 24 64 69 72 65  eAvailable $dire
d8f0: 63 74 6f 72 79 20 70 6c 61 74 66 6f 72 6d 5d 7d  ctory platform]}
d900: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
d910: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
d920: 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d  ength $platform]
d930: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
d940: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 70             set p
d950: 6c 61 74 66 6f 72 6d 20 75 6e 6b 6e 6f 77 6e 0d  latform unknown.
d960: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
d970: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 73            if {$s
d980: 65 6c 65 63 74 20 26 26 20 5b 6d 61 74 63 68 50  elect && [matchP
d990: 6c 61 74 66 6f 72 6d 20 24 70 6c 61 74 66 6f 72  latform $platfor
d9a0: 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  m]} then {..    
d9b0: 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 62 75          set ::bu
d9c0: 69 6c 64 5f 64 69 72 65 63 74 6f 72 79 20 24 64  ild_directory $d
d9d0: 69 72 65 63 74 6f 72 79 0d 0a 0d 0a 20 20 20 20  irectory....    
d9e0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
d9f0: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
da00: 67 73 20 22 79 65 73 2c 20 73 65 6c 65 63 74 65  gs "yes, selecte
da10: 64 20 28 22 20 24 70 6c 61 74 66 6f 72 6d 20 22  d (" $platform "
da20: 29 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  )\n"]....       
da30: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
da40: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
da50: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
da60: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
da70: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79 65   [appendArgs "ye
da80: 73 20 28 22 20 24 70 6c 61 74 66 6f 72 6d 20 22  s (" $platform "
da90: 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  )\n"]..         
daa0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c   }..        } el
dab0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
dac0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e  tputs $channel n
dad0: 6f 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  o\n....         
dae0: 20 66 6f 72 65 61 63 68 20 70 61 74 68 20 5b 6c   foreach path [l
daf0: 73 6f 72 74 20 2d 64 65 63 72 65 61 73 69 6e 67  sort -decreasing
db00: 20 5b 66 69 6c 65 20 6c 69 73 74 20 24 64 69 72   [file list $dir
db10: 65 63 74 6f 72 79 20 2a 5d 5d 20 7b 0d 0a 20 20  ectory *]] {..  
db20: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66            if {[f
db30: 69 6c 65 20 65 78 69 73 74 73 20 24 70 61 74 68  ile exists $path
db40: 5d 20 26 26 20 5b 66 69 6c 65 20 69 73 64 69 72  ] && [file isdir
db50: 65 63 74 6f 72 79 20 24 70 61 74 68 5d 7d 20 74  ectory $path]} t
db60: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
db70: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
db80: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
db90: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
dba0: 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b       "---- check
dbb0: 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e 44  ing for System.D
dbc0: 61 74 61 2e 53 51 4c 69 74 65 20 72 65 6c 65 61  ata.SQLite relea
dbd0: 73 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  se \"" \..      
dbe0: 20 20 20 20 20 20 20 20 20 20 20 20 24 70 61 74              $pat
dbf0: 68 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20  h "\"... "].... 
dc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
dc10: 7b 5b 69 73 52 65 6c 65 61 73 65 41 76 61 69 6c  {[isReleaseAvail
dc20: 61 62 6c 65 20 24 70 61 74 68 20 70 6c 61 74 66  able $path platf
dc30: 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  orm]} then {..  
dc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
dc50: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
dc60: 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3d 3d 20 30   $platform] == 0
dc70: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
dc80: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
dc90: 70 6c 61 74 66 6f 72 6d 20 75 6e 6b 6e 6f 77 6e  platform unknown
dca0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
dcb0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
dcc0: 20 20 20 20 20 20 20 69 66 20 7b 24 73 65 6c 65         if {$sele
dcd0: 63 74 20 26 26 20 5b 6d 61 74 63 68 50 6c 61 74  ct && [matchPlat
dce0: 66 6f 72 6d 20 24 70 6c 61 74 66 6f 72 6d 5d 7d  form $platform]}
dcf0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
dd00: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a             set :
dd10: 3a 62 75 69 6c 64 5f 64 69 72 65 63 74 6f 72 79  :build_directory
dd20: 20 24 70 61 74 68 0d 0a 0d 0a 20 20 20 20 20 20   $path....      
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
dd40: 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
dd50: 6e 64 41 72 67 73 20 22 79 65 73 2c 20 73 65 6c  ndArgs "yes, sel
dd60: 65 63 74 65 64 20 28 22 20 24 70 6c 61 74 66 6f  ected (" $platfo
dd70: 72 6d 20 22 29 5c 6e 22 5d 0d 0a 0d 0a 20 20 20  rm ")\n"]....   
dd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
dd90: 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20  eturn true..    
dda0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
ddb0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
ddc0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
ddd0: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
dde0: 67 73 20 22 79 65 73 20 28 22 20 24 70 6c 61 74  gs "yes (" $plat
ddf0: 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a 20 20 20  form ")\n"]..   
de00: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
de10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20                } 
de20: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
de30: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
de40: 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20  hannel no\n..   
de50: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
de60: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
de70: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
de80: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73    }..      } els
de90: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e {..        tpu
dea0: 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
deb0: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
dec0: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 65 6e 76         "---- env
ded0: 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c  ironment variabl
dee0: 65 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e  e \"System.Data.
def0: 53 51 4c 69 74 65 5c 22 20 69 73 20 6e 6f 74 20  SQLite\" is not 
df00: 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
df10: 20 22 73 65 74 2c 20 73 6b 69 70 70 69 6e 67 20   "set, skipping 
df20: 63 68 65 63 6b 20 66 6f 72 20 72 65 6c 65 61 73  check for releas
df30: 65 73 2e 2e 2e 5c 6e 22 5d 0d 0a 20 20 20 20 20  es...\n"]..     
df40: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
df50: 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d  rn false..    }.
df60: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65  ....    proc che
df70: 63 6b 46 6f 72 53 51 4c 69 74 65 4c 69 62 72 61  ckForSQLiteLibra
df80: 72 79 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b  ry { channel } {
df90: 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63  ..      tputs $c
dfa0: 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65  hannel "---- che
dfb0: 63 6b 69 6e 67 20 66 6f 72 20 53 51 4c 69 74 65  cking for SQLite
dfc0: 20 63 6f 72 65 20 6c 69 62 72 61 72 79 2e 2e 2e   core library...
dfd0: 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   "....      if {
dfe0: 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
dff0: 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
e000: 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
e010: 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
e020: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
e030: 69 74 65 2e 53 51 4c 69 74 65 33 20 53 51 4c 69  ite.SQLite3 SQLi
e040: 74 65 56 65 72 73 69 6f 6e 0d 0a 20 20 20 20 20  teVersion..     
e050: 20 7d 20 76 65 72 73 69 6f 6e 5d 20 3d 3d 20 30   } version] == 0
e060: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
e070: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
e080: 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68  OTE: Check if th
e090: 65 20 72 65 74 75 72 6e 65 64 20 76 65 72 73 69  e returned versi
e0a0: 6f 6e 20 77 61 73 20 6e 75 6c 6c 2e 20 20 49 66  on was null.  If
e0b0: 20 73 6f 2c 20 6d 61 6b 65 20 69 74 20 65 61 73   so, make it eas
e0c0: 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
e0d0: 20 20 20 74 6f 20 73 70 6f 74 2e 0d 0a 20 20 20     to spot...   
e0e0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
e0f0: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
e100: 74 68 20 24 76 65 72 73 69 6f 6e 5d 20 3d 3d 20  th $version] == 
e110: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
e120: 20 20 20 20 20 73 65 74 20 76 65 72 73 69 6f 6e       set version
e130: 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d   null..        }
e140: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
e150: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41         # NOTE: A
e160: 74 74 65 6d 70 74 20 74 6f 20 71 75 65 72 79 20  ttempt to query 
e170: 74 68 65 20 46 6f 73 73 69 6c 20 73 6f 75 72 63  the Fossil sourc
e180: 65 20 69 64 65 6e 74 69 66 69 65 72 20 66 6f 72  e identifier for
e190: 20 74 68 65 20 53 51 4c 69 74 65 0d 0a 20 20 20   the SQLite..   
e1a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 72       #       cor
e1b0: 65 20 6c 69 62 72 61 72 79 2e 0d 0a 20 20 20 20  e library...    
e1c0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
e1d0: 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
e1e0: 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
e1f0: 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
e200: 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
e210: 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
e220: 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74  ata.SQLite.SQLit
e230: 65 33 20 53 51 4c 69 74 65 53 6f 75 72 63 65 49  e3 SQLiteSourceI
e240: 64 0d 0a 20 20 20 20 20 20 20 20 7d 20 73 6f 75  d..        } sou
e250: 72 63 65 49 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a  rceId]} then {..
e260: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
e270: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57         # NOTE: W
e280: 65 20 66 61 69 6c 65 64 20 74 6f 20 71 75 65 72  e failed to quer
e290: 79 20 74 68 65 20 46 6f 73 73 69 6c 20 73 6f 75  y the Fossil sou
e2a0: 72 63 65 20 69 64 65 6e 74 69 66 69 65 72 2e 0d  rce identifier..
e2b0: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
e2c0: 20 20 20 20 20 20 20 20 73 65 74 20 73 6f 75 72          set sour
e2d0: 63 65 49 64 20 75 6e 6b 6e 6f 77 6e 0d 0a 20 20  ceId unknown..  
e2e0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
e2f0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
e300: 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74  NOTE: Check if t
e310: 68 65 20 72 65 74 75 72 6e 65 64 20 46 6f 73 73  he returned Foss
e320: 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69  il source identi
e330: 66 69 65 72 20 77 61 73 20 6e 75 6c 6c 2e 20 20  fier was null.  
e340: 49 66 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  If..        #   
e350: 20 20 20 20 73 6f 2c 20 6d 61 6b 65 20 69 74 20      so, make it 
e360: 65 61 73 79 20 74 6f 20 73 70 6f 74 2e 0d 0a 20  easy to spot... 
e370: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
e380: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
e390: 6e 67 74 68 20 24 73 6f 75 72 63 65 49 64 5d 20  ngth $sourceId] 
e3a0: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
e3b0: 20 20 20 20 20 20 20 20 73 65 74 20 73 6f 75 72          set sour
e3c0: 63 65 49 64 20 6e 75 6c 6c 0d 0a 20 20 20 20 20  ceId null..     
e3d0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
e3e0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
e3f0: 45 3a 20 59 65 73 2c 20 74 68 65 20 53 51 4c 69  E: Yes, the SQLi
e400: 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20  te core library 
e410: 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 61 76  appears to be av
e420: 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20  ailable...      
e430: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64    #..        add
e440: 43 6f 6e 73 74 72 61 69 6e 74 20 53 51 4c 69 74  Constraint SQLit
e450: 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e....        tpu
e460: 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
e470: 65 6e 64 41 72 67 73 20 22 79 65 73 20 28 22 20  endArgs "yes (" 
e480: 24 76 65 72 73 69 6f 6e 20 22 20 22 20 24 73 6f  $version " " $so
e490: 75 72 63 65 49 64 20 22 29 5c 6e 22 5d 0d 0a 20  urceId ")\n"].. 
e4a0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
e4b0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
e4c0: 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20  annel no\n..    
e4d0: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
e4e0: 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72     proc checkFor
e4f0: 53 51 4c 69 74 65 49 6e 74 65 72 6f 70 20 7b 20  SQLiteInterop { 
e500: 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20  channel } {..   
e510: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
e520: 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67  l "---- checking
e530: 20 66 6f 72 20 53 51 4c 69 74 65 20 69 6e 74 65   for SQLite inte
e540: 72 6f 70 20 61 73 73 65 6d 62 6c 79 2e 2e 2e 20  rop assembly... 
e550: 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  "....      if {[
e560: 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
e570: 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
e580: 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
e590: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
e5a0: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
e5b0: 74 65 2e 53 51 4c 69 74 65 33 20 49 6e 74 65 72  te.SQLite3 Inter
e5c0: 6f 70 56 65 72 73 69 6f 6e 0d 0a 20 20 20 20 20  opVersion..     
e5d0: 20 7d 20 76 65 72 73 69 6f 6e 5d 20 3d 3d 20 30   } version] == 0
e5e0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
e5f0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
e600: 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68  OTE: Check if th
e610: 65 20 72 65 74 75 72 6e 65 64 20 76 65 72 73 69  e returned versi
e620: 6f 6e 20 77 61 73 20 6e 75 6c 6c 2e 20 20 49 66  on was null.  If
e630: 20 73 6f 2c 20 6d 61 6b 65 20 69 74 20 65 61 73   so, make it eas
e640: 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
e650: 20 20 20 74 6f 20 73 70 6f 74 2e 0d 0a 20 20 20     to spot...   
e660: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
e670: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
e680: 74 68 20 24 76 65 72 73 69 6f 6e 5d 20 3d 3d 20  th $version] == 
e690: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
e6a0: 20 20 20 20 20 73 65 74 20 76 65 72 73 69 6f 6e       set version
e6b0: 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d   null..        }
e6c0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
e6d0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41         # NOTE: A
e6e0: 74 74 65 6d 70 74 20 74 6f 20 71 75 65 72 79 20  ttempt to query 
e6f0: 74 68 65 20 46 6f 73 73 69 6c 20 73 6f 75 72 63  the Fossil sourc
e700: 65 20 69 64 65 6e 74 69 66 69 65 72 20 66 6f 72  e identifier for
e710: 20 74 68 65 20 53 51 4c 69 74 65 0d 0a 20 20 20   the SQLite..   
e720: 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 72       #       cor
e730: 65 20 6c 69 62 72 61 72 79 2e 0d 0a 20 20 20 20  e library...    
e740: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
e750: 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
e760: 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
e770: 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
e780: 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
e790: 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
e7a0: 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74  ata.SQLite.SQLit
e7b0: 65 33 20 49 6e 74 65 72 6f 70 53 6f 75 72 63 65  e3 InteropSource
e7c0: 49 64 0d 0a 20 20 20 20 20 20 20 20 7d 20 73 6f  Id..        } so
e7d0: 75 72 63 65 49 64 5d 7d 20 74 68 65 6e 20 7b 0d  urceId]} then {.
e7e0: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
e7f0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
e800: 57 65 20 66 61 69 6c 65 64 20 74 6f 20 71 75 65  We failed to que
e810: 72 79 20 74 68 65 20 46 6f 73 73 69 6c 20 73 6f  ry the Fossil so
e820: 75 72 63 65 20 69 64 65 6e 74 69 66 69 65 72 2e  urce identifier.
e830: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
e840: 20 20 20 20 20 20 20 20 20 73 65 74 20 73 6f 75           set sou
e850: 72 63 65 49 64 20 75 6e 6b 6e 6f 77 6e 0d 0a 20  rceId unknown.. 
e860: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
e870: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
e880: 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20   NOTE: Check if 
e890: 74 68 65 20 72 65 74 75 72 6e 65 64 20 46 6f 73  the returned Fos
e8a0: 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74  sil source ident
e8b0: 69 66 69 65 72 20 77 61 73 20 6e 75 6c 6c 2e 20  ifier was null. 
e8c0: 20 49 66 0d 0a 20 20 20 20 20 20 20 20 23 20 20   If..        #  
e8d0: 20 20 20 20 20 73 6f 2c 20 6d 61 6b 65 20 69 74       so, make it
e8e0: 20 65 61 73 79 20 74 6f 20 73 70 6f 74 2e 0d 0a   easy to spot...
e8f0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
e900: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
e910: 65 6e 67 74 68 20 24 73 6f 75 72 63 65 49 64 5d  ength $sourceId]
e920: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
e930: 20 20 20 20 20 20 20 20 20 73 65 74 20 73 6f 75           set sou
e940: 72 63 65 49 64 20 6e 75 6c 6c 0d 0a 20 20 20 20  rceId null..    
e950: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
e960: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
e970: 54 45 3a 20 42 65 66 6f 72 65 20 61 63 74 75 61  TE: Before actua
e980: 6c 6c 79 20 61 64 64 69 6e 67 20 74 68 65 20 74  lly adding the t
e990: 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20  est constraint, 
e9a0: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 0d 0a 20  make sure the.. 
e9b0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76         #       v
e9c0: 65 72 73 69 6f 6e 20 69 73 20 76 61 6c 69 64 20  ersion is valid 
e9d0: 28 69 2e 65 2e 20 6e 6f 74 20 6a 75 73 74 20 74  (i.e. not just t
e9e0: 68 61 74 20 77 65 20 63 6f 75 6c 64 20 71 75 65  hat we could que
e9f0: 72 79 20 69 74 29 2e 0d 0a 20 20 20 20 20 20 20  ry it)...       
ea00: 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
ea10: 24 76 65 72 73 69 6f 6e 20 6e 65 20 22 6e 75 6c  $version ne "nul
ea20: 6c 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  l"} then {..    
ea30: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
ea40: 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20     # NOTE: Yes, 
ea50: 74 68 65 20 53 51 4c 69 74 65 20 69 6e 74 65 72  the SQLite inter
ea60: 6f 70 20 61 73 73 65 6d 62 6c 79 20 61 70 70 65  op assembly appe
ea70: 61 72 73 20 74 6f 20 62 65 20 61 76 61 69 6c 61  ars to be availa
ea80: 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ble...          
ea90: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  #..          add
eaa0: 43 6f 6e 73 74 72 61 69 6e 74 20 53 51 4c 69 74  Constraint SQLit
eab0: 65 49 6e 74 65 72 6f 70 0d 0a 0d 0a 20 20 20 20  eInterop....    
eac0: 20 20 20 20 20 20 73 65 74 20 61 6e 73 77 65 72        set answer
ead0: 20 79 65 73 0d 0a 20 20 20 20 20 20 20 20 7d 20   yes..        } 
eae0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
eaf0: 20 20 73 65 74 20 61 6e 73 77 65 72 20 6e 6f 0d    set answer no.
eb00: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
eb10: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
eb20: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
eb30: 20 24 61 6e 73 77 65 72 20 22 20 28 22 20 24 76   $answer " (" $v
eb40: 65 72 73 69 6f 6e 20 22 20 22 20 24 73 6f 75 72  ersion " " $sour
eb50: 63 65 49 64 20 22 29 5c 6e 22 5d 0d 0a 20 20 20  ceId ")\n"]..   
eb60: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
eb70: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
eb80: 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20  nel no\n..      
eb90: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
eba0: 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51   proc checkForSQ
ebb0: 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61  LiteDefineConsta
ebc0: 6e 74 20 7b 20 63 68 61 6e 6e 65 6c 20 6e 61 6d  nt { channel nam
ebd0: 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75  e } {..      tpu
ebe0: 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
ebf0: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
ec00: 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b       "---- check
ec10: 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e 44  ing for System.D
ec20: 61 74 61 2e 53 51 4c 69 74 65 20 64 65 66 69 6e  ata.SQLite defin
ec30: 65 20 63 6f 6e 73 74 61 6e 74 20 5c 22 22 20 24  e constant \"" $
ec40: 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  name \..        
ec50: 20 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20    "\"... "].... 
ec60: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
ec70: 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63  {..        objec
ec80: 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
ec90: 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
eca0: 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
ecb0: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
ecc0: 69 74 65 33 20 44 65 66 69 6e 65 43 6f 6e 73 74  ite3 DefineConst
ecd0: 61 6e 74 73 0d 0a 20 20 20 20 20 20 7d 20 64 65  ants..      } de
ece0: 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73 5d 20 3d  fineConstants] =
ecf0: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
ed00: 20 20 20 20 20 69 66 20 7b 5b 6c 73 65 61 72 63       if {[lsearc
ed10: 68 20 2d 65 78 61 63 74 20 2d 6e 6f 63 61 73 65  h -exact -nocase
ed20: 20 24 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74   $defineConstant
ed30: 73 20 24 6e 61 6d 65 5d 20 21 3d 20 2d 31 7d 20  s $name] != -1} 
ed40: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
ed50: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
ed60: 20 4e 4f 54 45 3a 20 59 65 73 2c 20 74 68 69 73   NOTE: Yes, this
ed70: 20 64 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74   define constant
ed80: 20 77 61 73 20 65 6e 61 62 6c 65 64 20 77 68 65   was enabled whe
ed90: 6e 20 74 68 65 20 6d 61 6e 61 67 65 64 0d 0a 20  n the managed.. 
eda0: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
edb0: 20 61 73 73 65 6d 62 6c 79 20 77 61 73 20 63 6f   assembly was co
edc0: 6d 70 69 6c 65 64 2e 0d 0a 20 20 20 20 20 20 20  mpiled...       
edd0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
ede0: 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  addConstraint [a
edf0: 70 70 65 6e 64 41 72 67 73 20 64 65 66 69 6e 65  ppendArgs define
ee00: 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74 65 6d 2e  Constant.System.
ee10: 44 61 74 61 2e 53 51 4c 69 74 65 2e 20 24 6e 61  Data.SQLite. $na
ee20: 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  me]....         
ee30: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
ee40: 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d  yes\n..        }
ee50: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
ee60: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
ee70: 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20  l no\n..        
ee80: 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  }..      } else 
ee90: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
eea0: 20 24 63 68 61 6e 6e 65 6c 20 65 72 72 6f 72 5c   $channel error\
eeb0: 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  n..      }..    
eec0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
eed0: 65 74 44 61 74 65 54 69 6d 65 46 6f 72 6d 61 74  etDateTimeFormat
eee0: 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
eef0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
ef00: 69 73 20 70 72 6f 63 65 64 75 72 65 20 73 69 6d  is procedure sim
ef10: 70 6c 79 20 72 65 74 75 72 6e 73 20 74 68 65 20  ply returns the 
ef20: 22 64 65 66 61 75 6c 74 22 20 44 61 74 65 54 69  "default" DateTi
ef30: 6d 65 20 66 6f 72 6d 61 74 20 75 73 65 64 0d 0a  me format used..
ef40: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 79        #       by
ef50: 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e   the test suite.
ef60: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
ef70: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
ef80: 73 20 3a 3a 64 61 74 65 74 69 6d 65 5f 66 6f 72  s ::datetime_for
ef90: 6d 61 74 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  mat] && \..     
efa0: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
efb0: 67 74 68 20 24 3a 3a 64 61 74 65 74 69 6d 65 5f  gth $::datetime_
efc0: 66 6f 72 6d 61 74 5d 20 3e 20 30 7d 20 74 68 65  format] > 0} the
efd0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
efe0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
eff0: 52 65 74 75 72 6e 20 74 68 65 20 6d 61 6e 75 61  Return the manua
f000: 6c 6c 79 20 6f 76 65 72 72 69 64 64 65 6e 20 76  lly overridden v
f010: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 44 61 74  alue for the Dat
f020: 65 54 69 6d 65 20 66 6f 72 6d 61 74 2e 0d 0a 20  eTime format... 
f030: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
f040: 20 20 72 65 74 75 72 6e 20 24 3a 3a 64 61 74 65    return $::date
f050: 74 69 6d 65 5f 66 6f 72 6d 61 74 0d 0a 20 20 20  time_format..   
f060: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
f070: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
f080: 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 61  # NOTE: Return a
f090: 6e 20 49 53 4f 38 36 30 31 20 44 61 74 65 54 69  n ISO8601 DateTi
f0a0: 6d 65 20 66 6f 72 6d 61 74 20 63 6f 6d 70 61 74  me format compat
f0b0: 69 62 6c 65 20 77 69 74 68 20 53 51 4c 69 74 65  ible with SQLite
f0c0: 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ,..        #    
f0d0: 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
f0e0: 51 4c 69 74 65 2c 20 61 6e 64 20 73 75 69 74 61  QLite, and suita
f0f0: 62 6c 65 20 66 6f 72 20 72 6f 75 6e 64 2d 74 72  ble for round-tr
f100: 69 70 70 69 6e 67 20 77 69 74 68 20 74 68 65 0d  ipping with the.
f110: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
f120: 20 44 61 74 65 54 69 6d 65 20 63 6c 61 73 73 20   DateTime class 
f130: 6f 66 20 74 68 65 20 66 72 61 6d 65 77 6f 72 6b  of the framework
f140: 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65  .  If this value
f150: 20 69 73 20 63 68 61 6e 67 65 64 2c 0d 0a 20 20   is changed,..  
f160: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61        #       va
f170: 72 69 6f 75 73 20 74 65 73 74 73 20 6d 61 79 20  rious tests may 
f180: 66 61 69 6c 2e 0d 0a 20 20 20 20 20 20 20 20 23  fail...        #
f190: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
f1a0: 20 22 79 79 79 79 2d 4d 4d 2d 64 64 20 48 48 3a   "yyyy-MM-dd HH:
f1b0: 6d 6d 3a 73 73 2e 46 46 46 46 46 46 46 4b 22 0d  mm:ss.FFFFFFFK".
f1c0: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
f1d0: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 65 6e 75  ....    proc enu
f1e0: 6d 65 72 61 62 6c 65 54 6f 4c 69 73 74 20 7b 20  merableToList { 
f1f0: 65 6e 75 6d 65 72 61 62 6c 65 20 7d 20 7b 0d 0a  enumerable } {..
f200: 20 20 20 20 20 20 73 65 74 20 72 65 73 75 6c 74        set result
f210: 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20   [list]....     
f220: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
f230: 67 74 68 20 24 65 6e 75 6d 65 72 61 62 6c 65 5d  gth $enumerable]
f240: 20 3d 3d 20 30 20 7c 7c 20 24 65 6e 75 6d 65 72   == 0 || $enumer
f250: 61 62 6c 65 20 65 71 20 22 6e 75 6c 6c 22 7d 20  able eq "null"} 
f260: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
f270: 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a  return $result..
f280: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
f290: 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20   object foreach 
f2a0: 2d 61 6c 69 61 73 20 69 74 65 6d 20 24 65 6e 75  -alias item $enu
f2b0: 6d 65 72 61 62 6c 65 20 7b 0d 0a 20 20 20 20 20  merable {..     
f2c0: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
f2d0: 65 6e 67 74 68 20 24 69 74 65 6d 5d 20 3e 20 30  ength $item] > 0
f2e0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
f2f0: 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75      lappend resu
f300: 6c 74 20 5b 24 69 74 65 6d 20 54 6f 53 74 72 69  lt [$item ToStri
f310: 6e 67 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ng]..        }..
f320: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
f330: 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d   return $result.
f340: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
f350: 72 6f 63 20 63 61 74 63 68 41 6e 64 52 65 74 75  roc catchAndRetu
f360: 72 6e 20 7b 20 73 63 72 69 70 74 20 7b 73 74 61  rn { script {sta
f370: 63 6b 54 72 61 63 65 20 66 61 6c 73 65 7d 20 7b  ckTrace false} {
f380: 73 74 72 69 63 74 20 74 72 75 65 7d 20 7d 20 7b  strict true} } {
f390: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
f3a0: 20 23 20 4e 4f 54 45 3a 20 45 76 61 6c 75 61 74   # NOTE: Evaluat
f3b0: 65 20 74 68 65 20 73 63 72 69 70 74 20 70 72 6f  e the script pro
f3c0: 76 69 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c  vided by our cal
f3d0: 6c 65 72 20 69 6e 20 74 68 65 69 72 20 63 6f 6e  ler in their con
f3e0: 74 65 78 74 2c 0d 0a 20 20 20 20 20 20 23 20 20  text,..      #  
f3f0: 20 20 20 20 20 63 61 70 74 75 72 69 6e 67 20 62       capturing b
f400: 6f 74 68 20 74 68 65 20 72 65 73 75 6c 74 20 61  oth the result a
f410: 6e 64 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f  nd the return co
f420: 64 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  de...      #..  
f430: 20 20 20 20 73 65 74 20 63 6f 64 65 20 5b 63 61      set code [ca
f440: 74 63 68 20 7b 75 70 6c 65 76 65 6c 20 31 20 24  tch {uplevel 1 $
f450: 73 63 72 69 70 74 7d 20 72 65 73 75 6c 74 5d 0d  script} result].
f460: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
f470: 20 20 23 20 4e 4f 54 45 3a 20 44 69 64 20 74 68    # NOTE: Did th
f480: 65 20 73 63 72 69 70 74 20 70 72 6f 76 69 64 65  e script provide
f490: 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 20  d by our caller 
f4a0: 4e 4f 54 20 72 61 69 73 65 20 61 6e 20 65 72 72  NOT raise an err
f4b0: 6f 72 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  or?..      #..  
f4c0: 20 20 20 20 69 66 20 7b 24 73 74 72 69 63 74 20      if {$strict 
f4d0: 26 26 20 24 63 6f 64 65 20 3d 3d 20 30 20 7c 7c  && $code == 0 ||
f4e0: 20 21 24 73 74 72 69 63 74 20 26 26 20 24 63 6f   !$strict && $co
f4f0: 64 65 20 21 3d 20 31 7d 20 74 68 65 6e 20 7b 0d  de != 1} then {.
f500: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
f510: 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 75 63 63      # NOTE: Succ
f520: 65 73 73 2e 20 20 52 65 74 75 72 6e 20 61 20 6c  ess.  Return a l
f530: 69 73 74 20 77 69 74 68 20 74 68 65 20 72 65 74  ist with the ret
f540: 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 74 68 65  urn code and the
f550: 20 72 65 73 75 6c 74 2e 0d 0a 20 20 20 20 20 20   result...      
f560: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
f570: 75 72 6e 20 5b 6c 69 73 74 20 24 63 6f 64 65 20  urn [list $code 
f580: 24 72 65 73 75 6c 74 5d 0d 0a 20 20 20 20 20 20  $result]..      
f590: 7d 20 65 6c 73 65 69 66 20 7b 24 73 74 61 63 6b  } elseif {$stack
f5a0: 54 72 61 63 65 7d 20 74 68 65 6e 20 7b 0d 0a 20  Trace} then {.. 
f5b0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
f5c0: 20 20 23 20 4e 4f 54 45 3a 20 46 61 69 6c 75 72    # NOTE: Failur
f5d0: 65 2e 20 20 4f 75 72 20 63 61 6c 6c 65 72 20 77  e.  Our caller w
f5e0: 61 6e 74 73 20 61 20 66 75 6c 6c 20 73 74 61 63  ants a full stac
f5f0: 6b 20 74 72 61 63 65 20 28 69 66 20 61 70 70 6c  k trace (if appl
f600: 69 63 61 62 6c 65 29 2c 0d 0a 20 20 20 20 20 20  icable),..      
f610: 20 20 23 20 20 20 20 20 20 20 72 65 74 75 72 6e    #       return
f620: 20 61 20 6c 69 73 74 20 77 69 74 68 20 74 68 65   a list with the
f630: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64   return code and
f640: 20 74 68 65 20 72 65 73 75 6c 74 20 76 65 72 62   the result verb
f650: 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23  atim...        #
f660: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
f670: 20 5b 6c 69 73 74 20 24 63 6f 64 65 20 24 72 65   [list $code $re
f680: 73 75 6c 74 5d 0d 0a 20 20 20 20 20 20 7d 20 65  sult]..      } e
f690: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
f6a0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
f6b0: 3a 20 46 61 69 6c 75 72 65 2e 20 20 4f 75 72 20  : Failure.  Our 
f6c0: 63 61 6c 6c 65 72 20 64 6f 65 73 20 6e 6f 74 20  caller does not 
f6d0: 77 61 6e 74 20 61 20 66 75 6c 6c 20 73 74 61 63  want a full stac
f6e0: 6b 20 74 72 61 63 65 20 28 69 66 0d 0a 20 20 20  k trace (if..   
f6f0: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 70 70       #       app
f700: 6c 69 63 61 62 6c 65 29 2c 20 72 65 74 75 72 6e  licable), return
f710: 20 61 20 6c 69 73 74 20 77 69 74 68 20 74 68 65   a list with the
f720: 20 72 65 74 75 72 6e 20 63 6f 64 65 2c 20 74 68   return code, th
f730: 65 20 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20  e error..       
f740: 20 23 20 20 20 20 20 20 20 63 6f 64 65 20 66 6f   #       code fo
f750: 72 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65  r the interprete
f760: 72 2c 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  r, and the error
f770: 20 6d 65 73 73 61 67 65 20 75 70 20 74 6f 20 74   message up to t
f780: 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  he..        #   
f790: 20 20 20 20 70 6f 69 6e 74 20 77 68 65 72 65 20      point where 
f7a0: 74 68 65 20 73 74 61 63 6b 20 74 72 61 63 65 20  the stack trace 
f7b0: 73 68 6f 75 6c 64 20 73 74 61 72 74 2e 0d 0a 20  should start... 
f7c0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
f7d0: 20 20 73 65 74 20 69 6e 64 65 78 20 5b 73 74 72    set index [str
f7e0: 69 6e 67 20 66 69 72 73 74 20 22 20 20 20 61 74  ing first "   at
f7f0: 20 22 20 24 72 65 73 75 6c 74 5d 3b 20 23 20 48   " $result]; # H
f800: 41 43 4b 3a 20 52 65 6c 69 61 62 6c 65 3f 0d 0a  ACK: Reliable?..
f810: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
f820: 20 5b 6c 69 73 74 20 24 63 6f 64 65 20 24 3a 3a   [list $code $::
f830: 65 72 72 6f 72 43 6f 64 65 20 5b 65 78 70 72 20  errorCode [expr 
f840: 7b 24 69 6e 64 65 78 20 21 3d 20 2d 31 20 3f 20  {$index != -1 ? 
f850: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
f860: 73 74 72 69 6e 67 20 74 72 69 6d 20 5b 73 74 72  string trim [str
f870: 69 6e 67 20 72 61 6e 67 65 20 24 72 65 73 75 6c  ing range $resul
f880: 74 20 30 20 24 69 6e 64 65 78 5d 5d 20 3a 20 24  t 0 $index]] : $
f890: 72 65 73 75 6c 74 7d 5d 5d 0d 0a 20 20 20 20 20  result}]]..     
f8a0: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
f8b0: 20 20 70 72 6f 63 20 63 6f 6d 70 69 6c 65 43 53    proc compileCS
f8c0: 68 61 72 70 57 69 74 68 20 7b 0d 0a 20 20 20 20  harpWith {..    
f8d0: 20 20 20 20 20 20 20 20 74 65 78 74 20 6d 65 6d          text mem
f8e0: 6f 72 79 20 73 79 6d 62 6f 6c 73 20 73 74 72 69  ory symbols stri
f8f0: 63 74 20 72 65 73 75 6c 74 73 56 61 72 4e 61 6d  ct resultsVarNam
f900: 65 20 65 72 72 6f 72 73 56 61 72 4e 61 6d 65 20  e errorsVarName 
f910: 66 69 6c 65 4e 61 6d 65 73 0d 0a 20 20 20 20 20  fileNames..     
f920: 20 20 20 20 20 20 20 61 72 67 73 20 7d 20 7b 0d         args } {.
f930: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
f940: 23 20 4e 4f 54 45 3a 20 53 69 6e 63 65 20 77 65  # NOTE: Since we
f950: 20 61 72 65 20 67 6f 69 6e 67 20 74 6f 20 75 73   are going to us
f960: 65 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6e 61  e this method na
f970: 6d 65 20 61 20 6c 6f 74 2c 20 61 73 73 69 67 6e  me a lot, assign
f980: 20 69 74 20 74 6f 20 61 0d 0a 20 20 20 20 20 20   it to a..      
f990: 23 20 20 20 20 20 20 20 76 61 72 69 61 62 6c 65  #       variable
f9a0: 20 66 69 72 73 74 2e 0d 0a 20 20 20 20 20 20 23   first...      #
f9b0: 0d 0a 20 20 20 20 20 20 73 65 74 20 61 64 64 20  ..      set add 
f9c0: 52 65 66 65 72 65 6e 63 65 64 41 73 73 65 6d 62  ReferencedAssemb
f9d0: 6c 69 65 73 2e 41 64 64 0d 0a 0d 0a 20 20 20 20  lies.Add....    
f9e0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
f9f0: 45 3a 20 43 72 65 61 74 65 20 74 68 65 20 62 61  E: Create the ba
fa00: 73 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76  se command to ev
fa10: 61 6c 75 61 74 65 20 61 6e 64 20 61 64 64 20 74  aluate and add t
fa20: 68 65 20 70 72 6f 70 65 72 74 79 20 73 65 74 74  he property sett
fa30: 69 6e 67 73 0d 0a 20 20 20 20 20 20 23 20 20 20  ings..      #   
fa40: 20 20 20 20 74 68 61 74 20 61 72 65 20 61 6c 6d      that are alm
fa50: 6f 73 74 20 61 6c 77 61 79 73 20 6e 65 65 64 65  ost always neede
fa60: 64 20 62 79 20 6f 75 72 20 75 6e 69 74 20 74 65  d by our unit te
fa70: 73 74 73 20 28 69 2e 65 2e 20 74 68 65 20 53 79  sts (i.e. the Sy
fa80: 73 74 65 6d 0d 0a 20 20 20 20 20 20 23 20 20 20  stem..      #   
fa90: 20 20 20 20 61 6e 64 20 53 79 73 74 65 6d 2e 44      and System.D
faa0: 61 74 61 20 61 73 73 65 6d 62 6c 79 20 72 65 66  ata assembly ref
fab0: 65 72 65 6e 63 65 73 29 2e 0d 0a 20 20 20 20 20  erences)...     
fac0: 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 63 6f   #..      set co
fad0: 6d 6d 61 6e 64 20 5b 6c 69 73 74 20 5c 0d 0a 20  mmand [list \.. 
fae0: 20 20 20 20 20 20 20 20 20 63 6f 6d 70 69 6c 65           compile
faf0: 43 53 68 61 72 70 20 24 74 65 78 74 20 24 6d 65  CSharp $text $me
fb00: 6d 6f 72 79 20 24 73 79 6d 62 6f 6c 73 20 24 73  mory $symbols $s
fb10: 74 72 69 63 74 20 72 65 73 75 6c 74 73 20 65 72  trict results er
fb20: 72 6f 72 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  rors \..        
fb30: 20 20 24 61 64 64 20 53 79 73 74 65 6d 2e 64 6c    $add System.dl
fb40: 6c 20 24 61 64 64 20 53 79 73 74 65 6d 2e 44 61  l $add System.Da
fb50: 74 61 2e 64 6c 6c 20 24 61 64 64 20 53 79 73 74  ta.dll $add Syst
fb60: 65 6d 2e 54 72 61 6e 73 61 63 74 69 6f 6e 73 2e  em.Transactions.
fb70: 64 6c 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  dll \..         
fb80: 20 24 61 64 64 20 53 79 73 74 65 6d 2e 58 6d 6c   $add System.Xml
fb90: 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20 23  .dll]....      #
fba0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
fbb0: 41 64 64 20 61 6c 6c 20 74 68 65 20 70 72 6f 76  Add all the prov
fbc0: 69 64 65 64 20 66 69 6c 65 20 6e 61 6d 65 73 20  ided file names 
fbd0: 61 73 20 61 73 73 65 6d 62 6c 79 20 72 65 66 65  as assembly refe
fbe0: 72 65 6e 63 65 73 2e 0d 0a 20 20 20 20 20 20 23  rences...      #
fbf0: 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  ..      foreach 
fc00: 66 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61  fileName $fileNa
fc10: 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 6c  mes {..        l
fc20: 61 70 70 65 6e 64 20 63 6f 6d 6d 61 6e 64 20 24  append command $
fc30: 61 64 64 20 5b 67 65 74 42 69 6e 61 72 79 46 69  add [getBinaryFi
fc40: 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  leName $fileName
fc50: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ]..      }....  
fc60: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
fc70: 4f 54 45 3a 20 41 64 64 20 74 68 65 20 65 78 74  OTE: Add the ext
fc80: 72 61 20 61 72 67 75 6d 65 6e 74 73 2c 20 69 66  ra arguments, if
fc90: 20 61 6e 79 2c 20 74 6f 20 74 68 65 20 63 6f 6d   any, to the com
fca0: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 75 61 74 65  mand to evaluate
fcb0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
fcc0: 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 63    eval lappend c
fcd0: 6f 6d 6d 61 6e 64 20 24 61 72 67 73 0d 0a 0d 0a  ommand $args....
fce0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
fcf0: 20 4e 4f 54 45 3a 20 41 6c 69 61 73 20 74 68 65   NOTE: Alias the
fd00: 20 63 6f 6d 70 69 6c 65 72 20 6c 6f 63 61 6c 20   compiler local 
fd10: 72 65 73 75 6c 74 73 20 61 6e 64 20 65 72 72 6f  results and erro
fd20: 72 73 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20  rs variables to 
fd30: 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
fd40: 20 20 20 76 61 72 69 61 62 6c 65 20 6e 61 6d 65     variable name
fd50: 73 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75  s provided by ou
fd60: 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20  r caller...     
fd70: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   #..      if {[s
fd80: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 72 65  tring length $re
fd90: 73 75 6c 74 73 56 61 72 4e 61 6d 65 5d 20 3e 20  sultsVarName] > 
fda0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
fdb0: 20 20 20 75 70 76 61 72 20 31 20 24 72 65 73 75     upvar 1 $resu
fdc0: 6c 74 73 56 61 72 4e 61 6d 65 20 72 65 73 75 6c  ltsVarName resul
fdd0: 74 73 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ts..      }.... 
fde0: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
fdf0: 20 6c 65 6e 67 74 68 20 24 65 72 72 6f 72 73 56   length $errorsV
fe00: 61 72 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65  arName] > 0} the
fe10: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 70 76  n {..        upv
fe20: 61 72 20 31 20 24 65 72 72 6f 72 73 56 61 72 4e  ar 1 $errorsVarN
fe30: 61 6d 65 20 65 72 72 6f 72 73 0d 0a 20 20 20 20  ame errors..    
fe40: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
fe50: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 45 76        # NOTE: Ev
fe60: 61 6c 75 61 74 65 20 74 68 65 20 63 6f 6e 73 74  aluate the const
fe70: 72 75 63 74 65 64 20 5b 63 6f 6d 70 69 6c 65 43  ructed [compileC
fe80: 53 68 61 72 70 5d 20 63 6f 6d 6d 61 6e 64 20 61  Sharp] command a
fe90: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0d 0a 20  nd return the.. 
fea0: 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65 73       #       res
feb0: 75 6c 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ult...      #.. 
fec0: 20 20 20 20 20 65 76 61 6c 20 24 63 6f 6d 6d 61       eval $comma
fed0: 6e 64 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  nd..    }.....  
fee0: 20 20 70 72 6f 63 20 69 73 4d 65 6d 6f 72 79 44    proc isMemoryD
fef0: 62 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20 7b  b { fileName } {
ff00: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
ff10: 20 23 20 4e 4f 54 45 3a 20 49 73 20 74 68 65 20   # NOTE: Is the 
ff20: 73 70 65 63 69 66 69 65 64 20 64 61 74 61 62 61  specified databa
ff30: 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 72 65 61  se file name rea
ff40: 6c 6c 79 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  lly an in-memory
ff50: 20 64 61 74 61 62 61 73 65 3f 0d 0a 20 20 20 20   database?..    
ff60: 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72    #..      retur
ff70: 6e 20 5b 65 78 70 72 20 7b 24 66 69 6c 65 4e 61  n [expr {$fileNa
ff80: 6d 65 20 65 71 20 22 3a 6d 65 6d 6f 72 79 3a 22  me eq ":memory:"
ff90: 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   || \..         
ffa0: 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24   [string range $
ffb0: 66 69 6c 65 4e 61 6d 65 20 30 20 31 32 5d 20 65  fileName 0 12] e
ffc0: 71 20 22 66 69 6c 65 3a 3a 6d 65 6d 6f 72 79 3a  q "file::memory:
ffd0: 22 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  "}]..    }..... 
ffe0: 20 20 20 70 72 6f 63 20 69 73 54 61 62 6c 65 49     proc isTableI
fff0: 6e 44 62 20 7b 20 6e 61 6d 65 20 7b 76 61 72 4e  nDb { name {varN
10000 61 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a 20 20 20  ame db} } {..   
10010 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
10020 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65  TE: Refer to the
10030 20 73 70 65 63 69 66 69 65 64 20 76 61 72 69 61   specified varia
10040 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22 29 20  ble (e.g. "db") 
10050 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f  in the context o
10060 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23 20 20  f our..      #  
10070 20 20 20 20 20 63 61 6c 6c 65 72 2e 20 20 49 74       caller.  It
10080 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
10090 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
100a0 6e 20 68 61 6e 64 6c 65 20 74 68 61 74 20 77 69  n handle that wi
100b0 6c 6c 20 62 65 0d 0a 20 20 20 20 20 20 23 20 20  ll be..      #  
100c0 20 20 20 20 20 75 73 65 64 20 74 6f 20 65 78 65       used to exe
100d0 63 75 74 65 20 74 68 65 20 71 75 65 72 79 20 75  cute the query u
100e0 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
100f0 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61   if the named ta
10100 62 6c 65 20 69 73 0d 0a 20 20 20 20 20 20 23 20  ble is..      # 
10110 20 20 20 20 20 20 70 72 65 73 65 6e 74 20 69 6e        present in
10120 20 74 68 61 74 20 64 61 74 61 62 61 73 65 2e 0d   that database..
10130 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
10140 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65  upvar 1 $varName
10150 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a   db....      #..
10160 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
10170 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  e the sqlite_mas
10180 74 65 72 20 74 61 62 6c 65 20 74 6f 20 64 65 74  ter table to det
10190 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 61  ermine if the na
101a0 6d 65 64 20 74 61 62 6c 65 20 69 73 0d 0a 20 20  med table is..  
101b0 20 20 20 20 23 20 20 20 20 20 20 20 70 72 65 73      #       pres
101c0 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  ent in the datab
101d0 61 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ase...      #.. 
101e0 20 20 20 20 20 73 65 74 20 73 71 6c 20 7b 0d 0a       set sql {..
101f0 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 43          SELECT C
10200 4f 55 4e 54 28 2a 29 20 46 52 4f 4d 20 73 71 6c  OUNT(*) FROM sql
10210 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45  ite_master WHERE
10220 20 74 79 70 65 20 3d 20 27 74 61 62 6c 65 27 20   type = 'table' 
10230 41 4e 44 20 6e 61 6d 65 20 3d 20 3f 3b 0d 0a 20  AND name = ?;.. 
10240 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
10250 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
10260 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
10270 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61   if the named ta
10280 62 6c 65 20 69 73 20 70 72 65 73 65 6e 74 2e 0d  ble is present..
10290 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
102a0 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 0d 0a  return [expr {..
102b0 20 20 20 20 20 20 20 20 5b 73 71 6c 20 65 78 65          [sql exe
102c0 63 75 74 65 20 2d 65 78 65 63 75 74 65 20 73 63  cute -execute sc
102d0 61 6c 61 72 20 24 64 62 20 24 73 71 6c 20 5b 6c  alar $db $sql [l
102e0 69 73 74 20 70 61 72 61 6d 31 20 53 74 72 69 6e  ist param1 Strin
102f0 67 20 24 6e 61 6d 65 5d 5d 20 3e 20 30 0d 0a 20  g $name]] > 0.. 
10300 20 20 20 20 20 7d 5d 0d 0a 20 20 20 20 7d 0d 0a       }]..    }..
10310 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 69 6d  ...    proc trim
10320 53 71 6c 20 7b 20 73 71 6c 20 7d 20 7b 0d 0a 20  Sql { sql } {.. 
10330 20 20 20 20 20 72 65 74 75 72 6e 20 5b 72 65 67       return [reg
10340 73 75 62 20 2d 61 6c 6c 20 2d 2d 20 7b 5c 73 2b  sub -all -- {\s+
10350 7d 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 24  } [string trim $
10360 73 71 6c 5d 20 22 20 22 5d 0d 0a 20 20 20 20 7d  sql] " "]..    }
10370 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 65 78  .....    proc ex
10380 65 63 75 74 65 53 71 6c 20 7b 20 73 71 6c 20 7b  ecuteSql { sql {
10390 65 78 65 63 75 74 65 20 6e 6f 6e 65 7d 20 7b 66  execute none} {f
103a0 6f 72 6d 61 74 20 6e 6f 6e 65 7d 20 7b 66 69 6c  ormat none} {fil
103b0 65 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20  eName ""} } {.. 
103c0 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
103d0 20 6c 65 6e 67 74 68 20 24 66 69 6c 65 4e 61 6d   length $fileNam
103e0 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 73  e] == 0} then {s
103f0 65 74 20 66 69 6c 65 4e 61 6d 65 20 3a 6d 65 6d  et fileName :mem
10400 6f 72 79 3a 7d 0d 0a 20 20 20 20 20 20 73 65 74  ory:}..      set
10410 75 70 44 62 20 24 66 69 6c 65 4e 61 6d 65 20 22  upDb $fileName "
10420 22 20 22 22 20 22 22 20 22 22 20 22 22 20 66 61  " "" "" "" "" fa
10430 6c 73 65 20 66 61 6c 73 65 20 66 61 6c 73 65 20  lse false false 
10440 66 61 6c 73 65 20 64 62 20 74 72 75 65 0d 0a 0d  false db true...
10450 0a 20 20 20 20 20 20 74 72 79 20 7b 0d 0a 20 20  .      try {..  
10460 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 75 70        return [up
10470 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 5c 0d  level 1 [list \.
10480 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
10490 20 65 78 65 63 75 74 65 20 2d 65 78 65 63 75 74   execute -execut
104a0 65 20 24 65 78 65 63 75 74 65 20 2d 66 6f 72 6d  e $execute -form
104b0 61 74 20 24 66 6f 72 6d 61 74 20 24 64 62 20 24  at $format $db $
104c0 73 71 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d 20 66  sql]]..      } f
104d0 69 6e 61 6c 6c 79 20 7b 0d 0a 20 20 20 20 20 20  inally {..      
104e0 20 20 63 6c 65 61 6e 75 70 44 62 20 24 66 69 6c    cleanupDb $fil
104f0 65 4e 61 6d 65 20 64 62 20 66 61 6c 73 65 20 66  eName db false f
10500 61 6c 73 65 20 66 61 6c 73 65 0d 0a 20 20 20 20  alse false..    
10510 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
10520 20 20 20 70 72 6f 63 20 68 61 73 4e 6f 46 6c 61     proc hasNoFla
10530 67 73 20 7b 20 76 61 72 4e 61 6d 65 20 6e 6f 6e  gs { varName non
10540 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76  e } {..      upv
10550 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 66 6c  ar 1 $varName fl
10560 61 67 73 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  ags....      if 
10570 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 66  {![info exists f
10580 6c 61 67 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  lags]} then {.. 
10590 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
105a0 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ue..      }.... 
105b0 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
105c0 20 6c 65 6e 67 74 68 20 24 66 6c 61 67 73 5d 20   length $flags] 
105d0 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
105e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
105f0 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  e..      }....  
10600 20 20 20 20 69 66 20 7b 24 6e 6f 6e 65 20 26 26      if {$none &&
10610 20 24 66 6c 61 67 73 20 65 71 20 22 4e 6f 6e 65   $flags eq "None
10620 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  "} then {..     
10630 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a     return true..
10640 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
10650 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20   return false.. 
10660 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
10670 63 20 67 65 74 43 6f 6e 6e 65 63 74 69 6f 6e 46  c getConnectionF
10680 6c 61 67 73 20 7b 20 66 69 6c 65 4e 61 6d 65 20  lags { fileName 
10690 66 6c 61 67 73 20 7b 71 75 69 65 74 20 66 61 6c  flags {quiet fal
106a0 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  se} } {..      #
106b0 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
106c0 46 69 67 75 72 65 20 6f 75 74 20 77 68 69 63 68  Figure out which
106d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
106e0 61 6d 65 20 6f 72 20 63 6f 6e 6e 65 63 74 69 6f  ame or connectio
106f0 6e 20 73 74 72 69 6e 67 20 74 68 65 73 65 0d 0a  n string these..
10700 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
10710 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 77  nnection flags w
10720 69 6c 6c 20 61 63 74 75 61 6c 6c 79 20 61 70 70  ill actually app
10730 6c 79 20 74 6f 2e 20 20 54 68 69 73 20 69 73 20  ly to.  This is 
10740 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 0d 0a 20  not necessary.. 
10750 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 20       #       in 
10760 71 75 69 65 74 20 6d 6f 64 65 20 62 65 63 61 75  quiet mode becau
10770 73 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74  se this informat
10780 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ion is only used
10790 20 66 6f 72 20 6c 6f 67 67 69 6e 67 0d 0a 20 20   for logging..  
107a0 20 20 20 20 23 20 20 20 20 20 20 20 61 6e 64 20      #       and 
107b0 72 65 70 6f 72 74 69 6e 67 20 70 75 72 70 6f 73  reporting purpos
107c0 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  es...      #..  
107d0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
107e0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
107f0 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
10800 67 74 68 20 24 66 69 6c 65 4e 61 6d 65 5d 20 3e  gth $fileName] >
10810 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
10820 20 20 20 20 20 20 73 65 74 20 64 61 74 61 62 61        set databa
10830 73 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  se [appendArgs "
10840 66 69 6c 65 20 6e 61 6d 65 20 5c 22 22 20 24 66  file name \"" $f
10850 69 6c 65 4e 61 6d 65 20 5c 22 5d 0d 0a 20 20 20  ileName \"]..   
10860 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b       } elseif {[
10870 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 64 61  info exists ::da
10880 74 61 53 6f 75 72 63 65 5d 20 26 26 20 5c 0d 0a  taSource] && \..
10890 20 20 20 20 20 20 20 20 20 20 20 20 21 5b 61 72              ![ar
108a0 72 61 79 20 65 78 69 73 74 73 20 3a 3a 64 61 74  ray exists ::dat
108b0 61 53 6f 75 72 63 65 5d 7d 20 74 68 65 6e 20 7b  aSource]} then {
108c0 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
108d0 64 61 74 61 62 61 73 65 20 5b 61 70 70 65 6e 64  database [append
108e0 41 72 67 73 20 22 64 61 74 61 20 73 6f 75 72 63  Args "data sourc
108f0 65 20 5c 22 22 20 24 3a 3a 64 61 74 61 53 6f 75  e \"" $::dataSou
10900 72 63 65 20 5c 22 5d 0d 0a 20 20 20 20 20 20 20  rce \"]..       
10910 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
10920 20 20 20 20 20 73 65 74 20 64 61 74 61 62 61 73       set databas
10930 65 20 3c 75 6e 6b 6e 6f 77 6e 3e 0d 0a 20 20 20  e <unknown>..   
10940 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
10950 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
10960 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 28    # NOTE: Show (
10970 61 6e 64 20 6c 6f 67 29 20 74 68 65 20 6c 6f 63  and log) the loc
10980 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c  al connection fl
10990 61 67 73 20 61 6e 64 20 74 68 65 20 61 73 73 6f  ags and the asso
109a0 63 69 61 74 65 64 0d 0a 20 20 20 20 20 20 23 20  ciated..      # 
109b0 20 20 20 20 20 20 64 61 74 61 20 73 6f 75 72 63        data sourc
109c0 65 20 6f 72 20 66 69 6c 65 20 6e 61 6d 65 2e 0d  e or file name..
109d0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
109e0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
109f0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
10a00 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
10a10 3a 6e 6f 28 65 6d 69 74 4c 6f 63 61 6c 46 6c 61  :no(emitLocalFla
10a20 67 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  gs)] && \..     
10a30 20 20 20 20 20 20 20 28 21 5b 69 6e 66 6f 20 65         (![info e
10a40 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 4c  xists ::no(emitL
10a50 6f 63 61 6c 46 6c 61 67 73 49 66 4e 6f 6e 65 29  ocalFlagsIfNone)
10a60 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] || \..        
10a70 20 20 20 20 20 21 5b 68 61 73 4e 6f 46 6c 61 67       ![hasNoFlag
10a80 73 20 66 6c 61 67 73 20 66 61 6c 73 65 5d 29 7d  s flags false])}
10a90 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
10aa0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
10ab0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
10ac0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
10ad0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 6f 63 61        "---- loca
10ae0 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61  l connection fla
10af0 67 73 20 66 6f 72 20 22 20 24 64 61 74 61 62 61  gs for " $databa
10b00 73 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  se \..          
10b10 20 20 20 20 22 20 61 72 65 3a 20 22 20 5b 65 78      " are: " [ex
10b20 70 72 20 7b 21 5b 68 61 73 4e 6f 46 6c 61 67 73  pr {![hasNoFlags
10b30 20 66 6c 61 67 73 20 66 61 6c 73 65 5d 20 3f 20   flags false] ? 
10b40 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
10b50 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20   [appendArgs \" 
10b60 24 66 6c 61 67 73 20 5c 22 5d 20 3a 20 22 3c 6e  $flags \"] : "<n
10b70 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20 20 20  one>"}] \n]..   
10b80 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
10b90 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
10ba0 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 28    # NOTE: Show (
10bb0 61 6e 64 20 6c 6f 67 29 20 74 68 65 20 73 68 61  and log) the sha
10bc0 72 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  red connection f
10bd0 6c 61 67 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  lags...      #..
10be0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
10bf0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
10c00 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
10c10 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
10c20 74 20 69 6e 76 6f 6b 65 20 53 79 73 74 65 6d 2e  t invoke System.
10c30 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69  Data.SQLite.SQLi
10c40 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 53 68 61  teConnection Sha
10c50 72 65 64 46 6c 61 67 73 0d 0a 20 20 20 20 20 20  redFlags..      
10c60 20 20 7d 20 73 68 61 72 65 64 46 6c 61 67 73 5d    } sharedFlags]
10c70 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
10c80 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
10c90 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
10ca0 65 6d 69 74 53 68 61 72 65 64 46 6c 61 67 73 29  emitSharedFlags)
10cb0 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
10cc0 20 20 20 20 20 20 28 21 5b 69 6e 66 6f 20 65 78        (![info ex
10cd0 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 53 68  ists ::no(emitSh
10ce0 61 72 65 64 46 6c 61 67 73 49 66 4e 6f 6e 65 29  aredFlagsIfNone)
10cf0 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] || \..        
10d00 20 20 20 20 20 20 20 21 5b 68 61 73 4e 6f 46 6c         ![hasNoFl
10d10 61 67 73 20 73 68 61 72 65 64 46 6c 61 67 73 20  ags sharedFlags 
10d20 74 72 75 65 5d 29 7d 20 74 68 65 6e 20 7b 0d 0a  true])} then {..
10d30 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
10d40 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
10d50 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
10d60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10d70 20 22 2d 2d 2d 2d 20 73 68 61 72 65 64 20 63 6f   "---- shared co
10d80 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 66  nnection flags f
10d90 6f 72 20 22 20 24 64 61 74 61 62 61 73 65 20 5c  or " $database \
10da0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
10db0 20 20 22 20 61 72 65 3a 20 22 20 5b 65 78 70 72    " are: " [expr
10dc0 20 7b 21 5b 68 61 73 4e 6f 46 6c 61 67 73 20 73   {![hasNoFlags s
10dd0 68 61 72 65 64 46 6c 61 67 73 20 74 72 75 65 5d  haredFlags true]
10de0 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   ? \..          
10df0 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72 67        [appendArg
10e00 73 20 5c 22 20 24 73 68 61 72 65 64 46 6c 61 67  s \" $sharedFlag
10e10 73 20 5c 22 5d 20 3a 20 22 3c 6e 6f 6e 65 3e 22  s \"] : "<none>"
10e20 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  }] \n]..        
10e30 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65    }..        } e
10e40 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
10e50 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
10e60 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 53 68 61 72  ts ::no(emitShar
10e70 65 64 46 6c 61 67 73 29 5d 20 26 26 20 5c 0d 0a  edFlags)] && \..
10e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21 5b                ![
10e90 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
10ea0 28 65 6d 69 74 53 68 61 72 65 64 46 6c 61 67 73  (emitSharedFlags
10eb0 49 66 55 6e 61 76 61 69 6c 61 62 6c 65 29 5d 7d  IfUnavailable)]}
10ec0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
10ed0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
10ee0 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
10ef0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
10f00 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
10f10 73 68 61 72 65 64 20 63 6f 6e 6e 65 63 74 69 6f  shared connectio
10f20 6e 20 66 6c 61 67 73 20 66 6f 72 20 22 20 24 64  n flags for " $d
10f30 61 74 61 62 61 73 65 20 5c 0d 0a 20 20 20 20 20  atabase \..     
10f40 20 20 20 20 20 20 20 20 20 20 20 22 20 61 72 65             " are
10f50 3a 20 3c 75 6e 61 76 61 69 6c 61 62 6c 65 3e 5c  : <unavailable>\
10f60 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  n"]..          }
10f70 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
10f80 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
10f90 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53  .      # NOTE: S
10fa0 68 6f 77 20 28 61 6e 64 20 6c 6f 67 29 20 74 68  how (and log) th
10fb0 65 20 64 65 74 65 63 74 65 64 20 67 6c 6f 62 61  e detected globa
10fc0 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61  l connection fla
10fd0 67 73 2c 20 69 66 20 61 6e 79 2e 0d 0a 20 20 20  gs, if any...   
10fe0 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
10ff0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
11000 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69  .        if {![i
11010 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
11020 65 6d 69 74 47 6c 6f 62 61 6c 46 6c 61 67 73 29  emitGlobalFlags)
11030 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
11040 20 20 20 20 28 21 5b 69 6e 66 6f 20 65 78 69 73      (![info exis
11050 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 47 6c 6f 62  ts ::no(emitGlob
11060 61 6c 46 6c 61 67 73 49 66 4e 6f 6e 65 29 5d 20  alFlagsIfNone)] 
11070 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  || \..          
11080 20 20 20 21 5b 68 61 73 4e 6f 46 6c 61 67 73 20     ![hasNoFlags 
11090 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61  ::connection_fla
110a0 67 73 20 66 61 6c 73 65 5d 29 7d 20 74 68 65 6e  gs false])} then
110b0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
110c0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
110d0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
110e0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
110f0 20 22 2d 2d 2d 2d 20 67 6c 6f 62 61 6c 20 63 6f   "---- global co
11100 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 61  nnection flags a
11110 72 65 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  re: " \..       
11120 20 20 20 20 20 20 20 5b 65 78 70 72 20 7b 21 5b         [expr {![
11130 68 61 73 4e 6f 46 6c 61 67 73 20 3a 3a 63 6f 6e  hasNoFlags ::con
11140 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73 20 66 61  nection_flags fa
11150 6c 73 65 5d 20 3f 20 5c 0d 0a 20 20 20 20 20 20  lse] ? \..      
11160 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41          [appendA
11170 72 67 73 20 5c 22 20 24 3a 3a 63 6f 6e 6e 65 63  rgs \" $::connec
11180 74 69 6f 6e 5f 66 6c 61 67 73 20 5c 22 5d 20 3a  tion_flags \"] :
11190 20 22 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d   "<none>"}] \n].
111a0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
111b0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
111c0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
111d0 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 67   there are any g
111e0 6c 6f 62 61 6c 20 28 70 65 72 20 74 65 73 74 20  lobal (per test 
111f0 72 75 6e 29 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  run) connection 
11200 66 6c 61 67 73 20 63 75 72 72 65 6e 74 6c 79 0d  flags currently.
11210 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
11220 65 74 2c 20 75 73 65 20 74 68 65 6d 20 6e 6f 77  et, use them now
11230 20 28 69 2e 65 2e 20 62 79 20 63 6f 6d 62 69 6e   (i.e. by combin
11240 69 6e 67 20 74 68 65 6d 20 77 69 74 68 20 74 68  ing them with th
11250 65 20 6f 6e 65 73 20 66 6f 72 20 74 68 69 73 0d  e ones for this.
11260 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
11270 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0d 0a 20 20 20  onnection)...   
11280 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
11290 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 63  [info exists ::c
112a0 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73 5d  onnection_flags]
112b0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
112c0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
112d0 4f 54 45 3a 20 43 6f 6d 62 69 6e 65 20 61 6e 64  OTE: Combine and
112e0 2f 6f 72 20 72 65 70 6c 61 63 65 20 74 68 65 20  /or replace the 
112f0 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
11300 20 61 6e 64 20 74 68 65 6e 20 73 68 6f 77 20 74   and then show t
11310 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  he..        #   
11320 20 20 20 20 6e 65 77 20 76 61 6c 75 65 2e 0d 0a      new value...
11330 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
11340 20 20 20 73 65 74 20 66 6c 61 67 73 20 5b 63 6f     set flags [co
11350 6d 62 69 6e 65 46 6c 61 67 73 20 24 66 6c 61 67  mbineFlags $flag
11360 73 20 24 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f  s $::connection_
11370 66 6c 61 67 73 5d 0d 0a 0d 0a 20 20 20 20 20 20  flags]....      
11380 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
11390 4f 54 45 3a 20 53 68 6f 77 20 28 61 6e 64 20 6c  OTE: Show (and l
113a0 6f 67 29 20 74 68 65 20 6e 65 77 20 65 66 66 65  og) the new effe
113b0 63 74 69 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  ctive connection
113c0 20 66 6c 61 67 73 2e 0d 0a 20 20 20 20 20 20 20   flags...       
113d0 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
113e0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
113f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
11400 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
11410 6f 28 65 6d 69 74 43 6f 6d 62 69 6e 65 64 46 6c  o(emitCombinedFl
11420 61 67 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20  ags)] && \..    
11430 20 20 20 20 20 20 20 20 20 20 28 21 5b 69 6e 66            (![inf
11440 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d  o exists ::no(em
11450 69 74 43 6f 6d 62 69 6e 65 64 46 6c 61 67 73 49  itCombinedFlagsI
11460 66 4e 6f 6e 65 29 5d 20 7c 7c 20 5c 0d 0a 20 20  fNone)] || \..  
11470 20 20 20 20 20 20 20 20 20 20 20 20 20 21 5b 68               ![h
11480 61 73 4e 6f 46 6c 61 67 73 20 66 6c 61 67 73 20  asNoFlags flags 
11490 66 61 6c 73 65 5d 29 7d 20 74 68 65 6e 20 7b 0d  false])} then {.
114a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
114b0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
114c0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
114d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
114e0 20 20 22 2d 2d 2d 2d 20 63 6f 6d 62 69 6e 65 64    "---- combined
114f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67   connection flag
11500 73 20 66 6f 72 20 22 20 24 64 61 74 61 62 61 73  s for " $databas
11510 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
11520 20 20 20 20 20 22 20 61 72 65 3a 20 22 20 5b 65       " are: " [e
11530 78 70 72 20 7b 21 5b 68 61 73 4e 6f 46 6c 61 67  xpr {![hasNoFlag
11540 73 20 66 6c 61 67 73 20 66 61 6c 73 65 5d 20 3f  s flags false] ?
11550 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
11560 20 20 20 20 5b 61 70 70 65 6e 64 41 72 67 73 20      [appendArgs 
11570 5c 22 20 24 66 6c 61 67 73 20 5c 22 5d 20 3a 20  \" $flags \"] : 
11580 22 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a  "<none>"}] \n]..
11590 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
115a0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
115b0 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
115c0 24 66 6c 61 67 73 0d 0a 20 20 20 20 7d 0d 0a 0c  $flags..    }...
115d0 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 46 6c  ..    proc getFl
115e0 61 67 73 50 72 6f 70 65 72 74 79 20 7b 20 7b 66  agsProperty { {f
115f0 6c 61 67 73 20 22 22 7d 20 7b 71 75 69 65 74 20  lags ""} {quiet 
11600 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20  false} } {..    
11610 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
11620 45 3a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 61  E: Determine wha
11630 74 20 74 68 65 20 63 6f 6d 62 69 6e 65 64 20 28  t the combined (
11640 67 6c 6f 62 61 6c 20 61 6e 64 20 6c 6f 63 61 6c  global and local
11650 29 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20  ) connection..  
11660 20 20 20 20 23 20 20 20 20 20 20 20 66 6c 61 67      #       flag
11670 73 20 73 68 6f 75 6c 64 20 62 65 2c 20 70 6f 73  s should be, pos
11680 73 69 62 6c 79 20 71 75 69 65 74 6c 79 2e 0d 0a  sibly quietly...
11690 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73        #..      s
116a0 65 74 20 66 6c 61 67 73 20 5b 67 65 74 43 6f 6e  et flags [getCon
116b0 6e 65 63 74 69 6f 6e 46 6c 61 67 73 20 22 22 20  nectionFlags "" 
116c0 24 66 6c 61 67 73 20 24 71 75 69 65 74 5d 0d 0a  $flags $quiet]..
116d0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
116e0 20 23 20 4e 4f 54 45 3a 20 49 66 20 6e 6f 20 67   # NOTE: If no g
116f0 6c 6f 62 61 6c 20 6f 72 20 6c 6f 63 61 6c 20 63  lobal or local c
11700 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20  onnection flags 
11710 77 65 72 65 20 73 70 65 63 69 66 69 65 64 2c 20  were specified, 
11720 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
11730 20 20 20 64 65 66 61 75 6c 74 20 63 6f 6e 6e 65     default conne
11740 63 74 69 6f 6e 20 66 6c 61 67 73 20 73 68 6f 75  ction flags shou
11750 6c 64 20 62 65 20 75 73 65 64 3b 20 74 68 65 72  ld be used; ther
11760 65 66 6f 72 65 2c 20 72 65 74 75 72 6e 0d 0a 20  efore, return.. 
11770 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6e 20       #       an 
11780 65 6d 70 74 79 20 73 74 72 69 6e 67 20 69 6e 20  empty string in 
11790 74 68 61 74 20 63 61 73 65 2e 0d 0a 20 20 20 20  that case...    
117a0 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
117b0 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66  string length $f
117c0 6c 61 67 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  lags] == 0} then
117d0 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
117e0 72 6e 20 22 22 0d 0a 20 20 20 20 20 20 7d 0d 0a  rn ""..      }..
117f0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
11800 20 23 20 4e 4f 54 45 3a 20 49 6e 20 6f 72 64 65   # NOTE: In orde
11810 72 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68  r to check if th
11820 65 20 64 65 66 61 75 6c 74 20 63 6f 6e 6e 65 63  e default connec
11830 74 69 6f 6e 20 66 6c 61 67 73 20 61 72 65 20 62  tion flags are b
11840 65 69 6e 67 20 75 73 65 64 0d 0a 20 20 20 20 20  eing used..     
11850 20 23 20 20 20 20 20 20 20 69 74 20 69 73 20 6e   #       it is n
11860 65 63 65 73 73 61 72 79 20 74 6f 20 61 74 74 65  ecessary to atte
11870 6d 70 74 20 61 20 63 6f 6e 76 65 72 73 69 6f 6e  mpt a conversion
11880 20 74 6f 20 74 68 65 20 61 63 74 75 61 6c 20 65   to the actual e
11890 6e 75 6d 65 72 61 74 65 64 0d 0a 20 20 20 20 20  numerated..     
118a0 20 23 20 20 20 20 20 20 20 74 79 70 65 2e 20 20   #       type.  
118b0 46 61 69 6c 69 6e 67 20 74 68 61 74 2c 20 74 68  Failing that, th
118c0 65 20 63 68 65 63 6b 20 61 67 61 69 6e 73 74 20  e check against 
118d0 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  the default valu
118e0 65 20 77 69 6c 6c 20 62 65 0d 0a 20 20 20 20 20  e will be..     
118f0 20 23 20 20 20 20 20 20 20 73 6b 69 70 70 65 64   #       skipped
11900 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
11910 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
11920 20 20 20 20 20 20 20 20 73 65 74 20 65 72 72 6f          set erro
11930 72 20 6e 75 6c 6c 3b 20 23 20 49 47 4e 4f 52 45  r null; # IGNORE
11940 44 0d 0a 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a  D....        obj
11950 65 63 74 20 69 6e 76 6f 6b 65 20 55 74 69 6c 69  ect invoke Utili
11960 74 79 20 54 72 79 50 61 72 73 65 46 6c 61 67 73  ty TryParseFlags
11970 45 6e 75 6d 20 22 22 20 5c 0d 0a 20 20 20 20 20  Enum "" \..     
11980 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
11990 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65  ta.SQLite.SQLite
119a0 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 20  ConnectionFlags 
119b0 22 22 20 24 66 6c 61 67 73 20 6e 75 6c 6c 20 74  "" $flags null t
119c0 72 75 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rue \..         
119d0 20 20 20 74 72 75 65 20 65 72 72 6f 72 0d 0a 20     true error.. 
119e0 20 20 20 20 20 7d 20 76 61 6c 75 65 5d 7d 20 74       } value]} t
119f0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
11a00 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
11a10 3a 20 41 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  : Attempting to 
11a20 70 61 72 73 65 20 74 68 65 20 63 6f 6e 6e 65 63  parse the connec
11a30 74 69 6f 6e 20 66 6c 61 67 73 20 63 61 75 73 65  tion flags cause
11a40 64 20 61 20 73 63 72 69 70 74 0d 0a 20 20 20 20  d a script..    
11a50 20 20 20 20 23 20 20 20 20 20 20 20 65 72 72 6f      #       erro
11a60 72 2e 20 20 45 6d 69 74 20 61 20 77 61 72 6e 69  r.  Emit a warni
11a70 6e 67 20 74 6f 20 74 68 65 20 74 65 73 74 20 6c  ng to the test l
11a80 6f 67 20 66 69 6c 65 20 61 6e 64 20 63 6f 6e 74  og file and cont
11a90 69 6e 75 65 0d 0a 20 20 20 20 20 20 20 20 23 20  inue..        # 
11aa0 20 20 20 20 20 20 75 73 69 6e 67 20 61 6e 20 65        using an e
11ab0 6d 74 70 79 20 73 74 72 69 6e 67 20 69 6e 73 74  mtpy string inst
11ac0 65 61 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ead...        #.
11ad0 0a 20 20 20 20 20 20 20 20 74 6c 6f 67 20 5b 61  .        tlog [a
11ae0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
11af0 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
11b00 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
11b10 6f 20 70 61 72 73 65 20 63 6f 6e 6e 65 63 74 69  o parse connecti
11b20 6f 6e 20 66 6c 61 67 73 2c 20 65 72 72 6f 72 3a  on flags, error:
11b30 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
11b40 20 20 5c 6e 5c 74 20 24 76 61 6c 75 65 20 5c 6e    \n\t $value \n
11b50 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74  ]....        set
11b60 20 76 61 6c 75 65 20 22 22 0d 0a 20 20 20 20 20   value ""..     
11b70 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
11b80 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
11b90 74 68 65 20 63 6f 6d 62 69 6e 65 64 20 66 6c 61  the combined fla
11ba0 67 73 20 73 74 72 69 6e 67 20 63 6f 75 6c 64 20  gs string could 
11bb0 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20  not actually be 
11bc0 63 6f 6e 76 65 72 74 65 64 0d 0a 20 20 20 20 20  converted..     
11bd0 20 23 20 20 20 20 20 20 20 74 6f 20 74 68 65 20   #       to the 
11be0 65 6e 75 6d 65 72 61 74 65 64 20 74 79 70 65 20  enumerated type 
11bf0 69 74 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  it is the defaul
11c00 74 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 6a 75  t value, then ju
11c10 73 74 20 75 73 65 0d 0a 20 20 20 20 20 20 23 20  st use..      # 
11c20 20 20 20 20 20 20 69 74 20 76 65 72 62 61 74 69        it verbati
11c30 6d 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 6a 75  m; otherwise, ju
11c40 73 74 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70  st return an emp
11c50 74 79 20 73 74 72 69 6e 67 2e 20 20 49 6e 20 74  ty string.  In t
11c60 68 61 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20  hat..      #    
11c70 20 20 20 63 61 73 65 2c 20 74 68 65 20 64 65 66     case, the def
11c80 61 75 6c 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ault connection 
11c90 66 6c 61 67 73 20 77 69 6c 6c 20 62 65 20 75 73  flags will be us
11ca0 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ed...      #..  
11cb0 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
11cc0 6c 65 6e 67 74 68 20 24 76 61 6c 75 65 5d 20 3d  length $value] =
11cd0 3d 20 30 20 7c 7c 20 24 76 61 6c 75 65 20 6e 65  = 0 || $value ne
11ce0 20 22 44 65 66 61 75 6c 74 22 7d 20 74 68 65 6e   "Default"} then
11cf0 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
11d00 20 20 20 20 20 20 20 23 20 57 41 52 4e 49 4e 47         # WARNING
11d10 3a 20 54 68 69 73 20 72 65 74 75 72 6e 73 20 74  : This returns t
11d20 68 65 20 73 74 72 69 6e 67 20 76 61 6c 75 65 20  he string value 
11d30 6f 66 20 74 68 65 20 63 6f 6d 62 69 6e 65 64 20  of the combined 
11d40 66 6c 61 67 73 2c 20 6e 6f 74 0d 0a 20 20 20 20  flags, not..    
11d50 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 74      #          t
11d60 68 65 20 65 6e 75 6d 65 72 61 74 65 64 20 76 61  he enumerated va
11d70 6c 75 65 2e 20 20 54 68 69 73 20 69 73 20 62 79  lue.  This is by
11d80 20 64 65 73 69 67 6e 20 61 6e 64 20 73 68 6f 75   design and shou
11d90 6c 64 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20  ld not..        
11da0 23 20 20 20 20 20 20 20 20 20 20 62 65 20 63 68  #          be ch
11db0 61 6e 67 65 64 20 77 69 74 68 6f 75 74 20 63 61  anged without ca
11dc0 72 65 66 75 6c 20 63 6f 6e 73 69 64 65 72 61 74  reful considerat
11dd0 69 6f 6e 20 28 65 2e 67 2e 20 69 74 20 77 6f 75  ion (e.g. it wou
11de0 6c 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ld..        #   
11df0 20 20 20 20 20 20 20 70 72 65 76 65 6e 74 20 74         prevent t
11e00 68 65 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74  he SQLiteConnect
11e10 69 6f 6e 20 63 6c 61 73 73 20 66 72 6f 6d 20 61  ion class from a
11e20 6c 6c 6f 77 69 6e 67 20 69 6e 76 61 6c 69 64 0d  llowing invalid.
11e30 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
11e40 20 20 20 20 5b 22 6d 61 67 69 63 61 6c 22 5d 20      ["magical"] 
11e50 6d 65 74 61 2d 66 6c 61 67 73 29 2e 0d 0a 20 20  meta-flags)...  
11e60 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
11e70 20 72 65 74 75 72 6e 20 5b 61 70 70 65 6e 64 41   return [appendA
11e80 72 67 73 20 22 46 6c 61 67 73 3d 22 20 24 66 6c  rgs "Flags=" $fl
11e90 61 67 73 20 5c 3b 5d 0d 0a 20 20 20 20 20 20 7d  ags \;]..      }
11ea0 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ....      return
11eb0 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20   ""..    }..... 
11ec0 20 20 20 70 72 6f 63 20 65 6e 61 62 6c 65 53 68     proc enableSh
11ed0 61 72 65 64 43 61 63 68 65 20 7b 20 63 68 61 6e  aredCache { chan
11ee0 6e 65 6c 20 65 6e 61 62 6c 65 20 7b 71 75 69 65  nel enable {quie
11ef0 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20  t false} } {..  
11f00 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
11f10 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74  ..        object
11f20 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
11f30 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
11f40 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
11f50 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61  Data.SQLite.Unsa
11f60 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20  feNativeMethods 
11f70 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  \..            s
11f80 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68  qlite3_enable_sh
11f90 61 72 65 64 5f 63 61 63 68 65 20 5b 65 78 70 72  ared_cache [expr
11fa0 20 69 6e 74 28 24 65 6e 61 62 6c 65 29 5d 0d 0a   int($enable)]..
11fb0 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 20        } result] 
11fc0 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
11fd0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
11fe0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
11ff0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
12000 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
12010 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
12020 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69   "---- call sqli
12030 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65  te3_enable_share
12040 64 5f 63 61 63 68 65 28 22 20 24 65 6e 61 62 6c  d_cache(" $enabl
12050 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
12060 20 20 20 22 29 2e 2e 2e 20 6f 6b 3a 20 22 20 24     ")... ok: " $
12070 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20  result \n]..    
12080 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65      }..      } e
12090 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  lse {..        i
120a0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
120b0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
120c0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
120d0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
120e0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
120f0 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 65 6e 61  call sqlite3_ena
12100 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65  ble_shared_cache
12110 28 22 20 24 65 6e 61 62 6c 65 20 5c 0d 0a 20 20  (" $enable \..  
12120 20 20 20 20 20 20 20 20 20 20 20 20 22 29 2e 2e              ")..
12130 2e 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  . error: " \n\t 
12140 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
12150 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
12160 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
12170 72 6f 63 20 73 65 74 75 70 44 62 20 7b 0d 0a 20  roc setupDb {.. 
12180 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 4e             fileN
12190 61 6d 65 20 7b 6d 6f 64 65 20 22 22 7d 20 7b 64  ame {mode ""} {d
121a0 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 20 22 22  ateTimeFormat ""
121b0 7d 20 7b 64 61 74 65 54 69 6d 65 4b 69 6e 64 20  } {dateTimeKind 
121c0 22 22 7d 20 7b 66 6c 61 67 73 20 22 22 7d 0d 0a  ""} {flags ""}..
121d0 20 20 20 20 20 20 20 20 20 20 20 20 7b 65 78 74              {ext
121e0 72 61 20 22 22 7d 20 7b 71 75 61 6c 69 66 79 20  ra ""} {qualify 
121f0 74 72 75 65 7d 20 7b 64 65 6c 65 74 65 20 74 72  true} {delete tr
12200 75 65 7d 20 7b 75 72 69 20 66 61 6c 73 65 7d 0d  ue} {uri false}.
12210 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 74 65  .            {te
12220 6d 70 6f 72 61 72 79 20 74 72 75 65 7d 20 7b 76  mporary true} {v
12230 61 72 4e 61 6d 65 20 64 62 7d 20 7b 71 75 69 65  arName db} {quie
12240 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20  t false} } {..  
12250 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
12260 4f 54 45 3a 20 46 69 72 73 74 2c 20 73 65 65 20  OTE: First, see 
12270 69 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 68 61  if our caller ha
12280 73 20 72 65 71 75 65 73 74 65 64 20 61 6e 20 69  s requested an i
12290 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
122a0 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
122b0 20 20 20 73 65 74 20 69 73 4d 65 6d 6f 72 79 20     set isMemory 
122c0 5b 69 73 4d 65 6d 6f 72 79 44 62 20 24 66 69 6c  [isMemoryDb $fil
122d0 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  eName]....      
122e0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
122f0 20 46 6f 72 20 6e 6f 77 2c 20 61 6c 6c 20 74 65   For now, all te
12300 73 74 20 64 61 74 61 62 61 73 65 73 20 75 73 65  st databases use
12310 64 20 62 79 20 74 68 65 20 74 65 73 74 20 73 75  d by the test su
12320 69 74 65 20 61 72 65 20 70 6c 61 63 65 64 0d 0a  ite are placed..
12330 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e        #       in
12340 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
12350 64 69 72 65 63 74 6f 72 79 2e 20 20 45 61 63 68  directory.  Each
12360 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72 65   database and re
12370 6c 61 74 65 64 20 66 69 6c 65 73 0d 0a 20 20 20  lated files..   
12380 20 20 20 23 20 20 20 20 20 20 20 75 73 65 64 20     #       used 
12390 62 79 20 61 20 74 65 73 74 20 73 68 6f 75 6c 64  by a test should
123a0 20 62 65 20 63 6c 65 61 6e 65 64 20 75 70 20 62   be cleaned up b
123b0 79 20 74 68 61 74 20 74 65 73 74 20 75 73 69 6e  y that test usin
123c0 67 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  g the..      #  
123d0 20 20 20 20 20 22 63 6c 65 61 6e 75 70 44 62 22       "cleanupDb"
123e0 20 70 72 6f 63 65 64 75 72 65 2c 20 62 65 6c 6f   procedure, belo
123f0 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  w...      #..   
12400 20 20 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72     if {!$isMemor
12410 79 20 26 26 20 24 71 75 61 6c 69 66 79 7d 20 74  y && $qualify} t
12420 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  hen {..        s
12430 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c  et fileName [fil
12440 65 20 6a 6f 69 6e 20 5b 67 65 74 44 61 74 61 62  e join [getDatab
12450 61 73 65 44 69 72 65 63 74 6f 72 79 5d 20 5b 66  aseDirectory] [f
12460 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61  ile tail $fileNa
12470 6d 65 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  me]]..      }...
12480 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
12490 23 20 4e 4f 54 45 3a 20 42 79 20 64 65 66 61 75  # NOTE: By defau
124a0 6c 74 2c 20 64 65 6c 65 74 65 20 61 6e 79 20 70  lt, delete any p
124b0 72 65 2d 65 78 69 73 74 69 6e 67 20 64 61 74 61  re-existing data
124c0 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61  base with the sa
124d0 6d 65 20 66 69 6c 65 0d 0a 20 20 20 20 20 20 23  me file..      #
124e0 20 20 20 20 20 20 20 6e 61 6d 65 20 69 66 20 69         name if i
124f0 74 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73  t currently exis
12500 74 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ts...      #..  
12510 20 20 20 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f      if {!$isMemo
12520 72 79 20 26 26 20 24 64 65 6c 65 74 65 20 26 26  ry && $delete &&
12530 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66   [file exists $f
12540 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
12550 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
12560 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74       # NOTE: Att
12570 65 6d 70 74 20 74 6f 20 64 65 6c 65 74 65 20 61  empt to delete a
12580 6e 79 20 70 72 65 2d 65 78 69 73 74 69 6e 67 20  ny pre-existing 
12590 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68  database with th
125a0 65 20 73 61 6d 65 20 66 69 6c 65 0d 0a 20 20 20  e same file..   
125b0 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d       #       nam
125c0 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
125d0 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
125e0 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24  h {file delete $
125f0 66 69 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72 5d  fileName} error]
12600 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
12610 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
12620 20 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65   # NOTE: We some
12630 68 6f 77 20 66 61 69 6c 65 64 20 74 6f 20 64 65  how failed to de
12640 6c 65 74 65 20 74 68 65 20 66 69 6c 65 2c 20 72  lete the file, r
12650 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20  eport why...    
12660 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
12670 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
12680 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
12690 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
126a0 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
126b0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
126c0 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
126d0 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
126e0 6f 20 64 65 6c 65 74 65 20 64 61 74 61 62 61 73  o delete databas
126f0 65 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65  e file \"" $file
12700 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  Name \..        
12710 20 20 20 20 20 20 20 20 22 5c 22 20 64 75 72 69          "\" duri
12720 6e 67 20 73 65 74 75 70 2c 20 65 72 72 6f 72 3a  ng setup, error:
12730 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c   " \n\t $error \
12740 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
12750 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
12760 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
12770 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
12780 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63 69  fer to the speci
12790 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28 65  fied variable (e
127a0 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65  .g. "db") in the
127b0 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d   context of our.
127c0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
127d0 61 6c 6c 65 72 2e 20 20 54 68 65 20 68 61 6e 64  aller.  The hand
127e0 6c 65 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64  le to the opened
127f0 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62   database will b
12800 65 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e 0d  e stored there..
12810 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
12820 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65  upvar 1 $varName
12830 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a   db....      #..
12840 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 74        # NOTE: St
12850 61 72 74 20 62 75 69 6c 64 69 6e 67 20 74 68 65  art building the
12860 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69   connection stri
12870 6e 67 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72 65  ng.  The only re
12880 71 75 69 72 65 64 20 70 6f 72 74 69 6f 6e 0d 0a  quired portion..
12890 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 66        #       of
128a0 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
128b0 73 74 72 69 6e 67 20 69 73 20 74 68 65 20 64 61  string is the da
128c0 74 61 20 73 6f 75 72 63 65 2c 20 77 68 69 63 68  ta source, which
128d0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0d 0a 20   contains the.. 
128e0 20 20 20 20 20 23 20 20 20 20 20 20 20 64 61 74       #       dat
128f0 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20  abase file name 
12900 69 74 73 65 6c 66 2e 20 20 49 66 20 6f 75 72 20  itself.  If our 
12910 63 61 6c 6c 65 72 20 77 61 6e 74 73 20 74 6f 20  caller wants to 
12920 75 73 65 20 61 20 55 52 49 20 61 73 0d 0a 20 20  use a URI as..  
12930 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
12940 64 61 74 61 20 73 6f 75 72 63 65 2c 20 75 73 65  data source, use
12950 20 74 68 65 20 46 75 6c 6c 55 72 69 20 63 6f 6e   the FullUri con
12960 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 70  nection string p
12970 72 6f 70 65 72 74 79 20 74 6f 0d 0a 20 20 20 20  roperty to..    
12980 20 20 23 20 20 20 20 20 20 20 70 72 65 76 65 6e    #       preven
12990 74 20 74 68 65 20 64 61 74 61 20 73 6f 75 72 63  t the data sourc
129a0 65 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 62 65  e string from be
129b0 69 6e 67 20 6d 61 6e 67 6c 65 64 2e 0d 0a 20 20  ing mangled...  
129c0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
129d0 7b 24 75 72 69 7d 20 74 68 65 6e 20 7b 0d 0a 20  {$uri} then {.. 
129e0 20 20 20 20 20 20 20 73 65 74 20 63 6f 6e 6e 65         set conne
129f0 63 74 69 6f 6e 20 7b 46 75 6c 6c 55 72 69 3d 24  ction {FullUri=$
12a00 7b 66 69 6c 65 4e 61 6d 65 7d 7d 0d 0a 20 20 20  {fileName}}..   
12a10 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
12a20 20 20 20 20 20 73 65 74 20 63 6f 6e 6e 65 63 74       set connect
12a30 69 6f 6e 20 7b 44 61 74 61 20 53 6f 75 72 63 65  ion {Data Source
12a40 3d 24 7b 66 69 6c 65 4e 61 6d 65 7d 7d 0d 0a 20  =${fileName}}.. 
12a50 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
12a60 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
12a70 20 53 69 6e 63 65 20 74 68 69 73 20 70 72 6f 63   Since this proc
12a80 65 64 75 72 65 20 68 61 73 20 6e 6f 20 73 70 65  edure has no spe
12a90 63 69 61 6c 20 6b 6e 6f 77 6c 65 64 67 65 20 6f  cial knowledge o
12aa0 66 20 77 68 61 74 20 74 68 65 20 64 65 66 61 75  f what the defau
12ab0 6c 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  lt..      #     
12ac0 20 20 73 65 74 74 69 6e 67 20 69 73 20 66 6f 72    setting is for
12ad0 20 74 68 65 20 54 6f 46 75 6c 6c 50 61 74 68 20   the ToFullPath 
12ae0 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e  connection strin
12af0 67 20 70 72 6f 70 65 72 79 2c 20 61 6c 77 61 79  g propery, alway
12b00 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
12b10 20 61 64 64 20 74 68 65 20 76 61 6c 75 65 20 77   add the value w
12b20 65 20 6b 6e 6f 77 20 61 62 6f 75 74 20 74 6f 20  e know about to 
12b30 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  the connection s
12b40 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 23 0d  tring...      #.
12b50 0a 20 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f  .      append co
12b60 6e 6e 65 63 74 69 6f 6e 20 7b 3b 54 6f 46 75 6c  nnection {;ToFul
12b70 6c 50 61 74 68 3d 24 7b 71 75 61 6c 69 66 79 7d  lPath=${qualify}
12b80 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
12b90 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f      # NOTE: If o
12ba0 75 72 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66  ur caller specif
12bb0 69 65 64 20 61 20 6a 6f 75 72 6e 61 6c 20 6d 6f  ied a journal mo
12bc0 64 65 2c 20 61 64 64 20 74 68 65 20 6e 65 63 65  de, add the nece
12bd0 73 73 61 72 79 20 70 6f 72 74 69 6f 6e 0d 0a 20  ssary portion.. 
12be0 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 66 20       #       of 
12bf0 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  the connection s
12c00 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20  tring now...    
12c10 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
12c20 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6d  string length $m
12c30 6f 64 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ode] > 0} then {
12c40 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  ..        append
12c50 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 4a 6f   connection {;Jo
12c60 75 72 6e 61 6c 20 4d 6f 64 65 3d 24 7b 6d 6f 64  urnal Mode=${mod
12c70 65 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  e}}..      }....
12c80 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
12c90 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20 63 61   NOTE: If our ca
12ca0 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64 20 61  ller specified a
12cb0 20 44 61 74 65 54 69 6d 65 20 66 6f 72 6d 61 74   DateTime format
12cc0 2c 20 61 64 64 20 74 68 65 20 6e 65 63 65 73 73  , add the necess
12cd0 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ary..      #    
12ce0 20 20 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68     portion of th
12cf0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72  e connection str
12d00 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  ing now...      
12d10 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  #..      if {[st
12d20 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 64 61 74  ring length $dat
12d30 65 54 69 6d 65 46 6f 72 6d 61 74 5d 20 3e 20 30  eTimeFormat] > 0
12d40 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
12d50 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74    append connect
12d60 69 6f 6e 20 7b 3b 44 61 74 65 54 69 6d 65 46 6f  ion {;DateTimeFo
12d70 72 6d 61 74 3d 24 7b 64 61 74 65 54 69 6d 65 46  rmat=${dateTimeF
12d80 6f 72 6d 61 74 7d 7d 0d 0a 20 20 20 20 20 20 7d  ormat}}..      }
12d90 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
12da0 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75     # NOTE: If ou
12db0 72 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69  r caller specifi
12dc0 65 64 20 61 20 44 61 74 65 54 69 6d 65 4b 69 6e  ed a DateTimeKin
12dd0 64 2c 20 61 64 64 20 74 68 65 20 6e 65 63 65 73  d, add the neces
12de0 73 61 72 79 20 70 6f 72 74 69 6f 6e 0d 0a 20 20  sary portion..  
12df0 20 20 20 20 23 20 20 20 20 20 20 20 6f 66 20 74      #       of t
12e00 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74  he connection st
12e10 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  ring now...     
12e20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   #..      if {[s
12e30 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 64 61  tring length $da
12e40 74 65 54 69 6d 65 4b 69 6e 64 5d 20 3e 20 30 7d  teTimeKind] > 0}
12e50 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
12e60 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69   append connecti
12e70 6f 6e 20 7b 3b 44 61 74 65 54 69 6d 65 4b 69 6e  on {;DateTimeKin
12e80 64 3d 24 7b 64 61 74 65 54 69 6d 65 4b 69 6e 64  d=${dateTimeKind
12e90 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  }}..      }.... 
12ea0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
12eb0 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f 75 74  NOTE: Figure out
12ec0 20 77 68 61 74 20 74 68 65 20 66 69 6e 61 6c 20   what the final 
12ed0 66 6c 61 67 73 20 66 6f 72 20 74 68 69 73 20 63  flags for this c
12ee0 6f 6e 6e 65 63 74 69 6f 6e 20 6e 65 65 64 20 74  onnection need t
12ef0 6f 20 62 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  o be...      #..
12f00 20 20 20 20 20 20 73 65 74 20 66 6c 61 67 73 20        set flags 
12f10 5b 67 65 74 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c  [getConnectionFl
12f20 61 67 73 20 24 66 69 6c 65 4e 61 6d 65 20 24 66  ags $fileName $f
12f30 6c 61 67 73 20 24 71 75 69 65 74 5d 0d 0a 0d 0a  lags $quiet]....
12f40 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
12f50 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20 63 61   NOTE: If our ca
12f60 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64 20 73  ller specified s
12f70 6f 6d 65 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63  ome SQLiteConnec
12f80 74 69 6f 6e 46 6c 61 67 73 2c 20 61 64 64 20 74  tionFlags, add t
12f90 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
12fa0 20 20 6e 65 63 65 73 73 61 72 79 20 70 6f 72 74    necessary port
12fb0 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65  ion of the conne
12fc0 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77  ction string now
12fd0 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
12fe0 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
12ff0 6e 67 74 68 20 24 66 6c 61 67 73 5d 20 3e 20 30  ngth $flags] > 0
13000 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
13010 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74    append connect
13020 69 6f 6e 20 7b 3b 46 6c 61 67 73 3d 24 7b 66 6c  ion {;Flags=${fl
13030 61 67 73 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a  ags}}..      }..
13040 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
13050 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20   # NOTE: If our 
13060 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64  caller specified
13070 20 61 6e 20 65 78 74 72 61 20 70 61 79 6c 6f 61   an extra payloa
13080 64 20 74 6f 20 74 68 65 20 63 6f 6e 6e 65 63 74  d to the connect
13090 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ion..      #    
130a0 20 20 20 73 74 72 69 6e 67 2c 20 61 70 70 65 6e     string, appen
130b0 64 20 69 74 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  d it now...     
130c0 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   #..      if {[s
130d0 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 65 78  tring length $ex
130e0 74 72 61 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  tra] > 0} then {
130f0 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  ..        append
13100 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 3b 20 24   connection \; $
13110 65 78 74 72 61 0d 0a 20 20 20 20 20 20 7d 0d 0a  extra..      }..
13120 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
13130 20 23 20 4e 4f 54 45 3a 20 4f 70 65 6e 20 74 68   # NOTE: Open th
13140 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
13150 63 74 69 6f 6e 20 6e 6f 77 2c 20 70 6c 61 63 69  ction now, placi
13160 6e 67 20 74 68 65 20 6f 70 61 71 75 65 20 68 61  ng the opaque ha
13170 6e 64 6c 65 20 76 61 6c 75 65 0d 0a 20 20 20 20  ndle value..    
13180 20 20 23 20 20 20 20 20 20 20 69 6e 74 6f 20 74    #       into t
13190 68 65 20 76 61 72 69 61 62 6c 65 20 73 70 65 63  he variable spec
131a0 69 66 69 65 64 20 62 79 20 6f 75 72 20 63 61 6c  ified by our cal
131b0 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ler...      #.. 
131c0 20 20 20 20 20 73 65 74 20 64 62 20 5b 73 71 6c       set db [sql
131d0 20 6f 70 65 6e 20 2d 74 79 70 65 20 53 51 4c 69   open -type SQLi
131e0 74 65 20 5b 73 75 62 73 74 20 24 63 6f 6e 6e 65  te [subst $conne
131f0 63 74 69 6f 6e 5d 5d 0d 0a 0d 0a 20 20 20 20 20  ction]]....     
13200 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
13210 3a 20 43 6f 6e 66 69 67 75 72 65 20 74 68 65 20  : Configure the 
13220 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
13230 6f 72 79 20 66 6f 72 20 74 68 65 20 6e 65 77 6c  ory for the newl
13240 79 20 6f 70 65 6e 65 64 20 64 61 74 61 62 61 73  y opened databas
13250 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
13260 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 77 20   connection now 
13270 75 6e 6c 65 73 73 20 6f 75 72 20 63 61 6c 6c 65  unless our calle
13280 72 20 66 6f 72 62 69 64 73 20 69 74 2e 0d 0a 20  r forbids it... 
13290 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
132a0 20 7b 24 74 65 6d 70 6f 72 61 72 79 20 26 26 20   {$temporary && 
132b0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
132c0 6e 6f 28 73 65 74 54 65 6d 70 6f 72 61 72 79 44  no(setTemporaryD
132d0 69 72 65 63 74 6f 72 79 29 5d 7d 20 74 68 65 6e  irectory)]} then
132e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 71 6c 20   {..        sql 
132f0 65 78 65 63 75 74 65 20 24 64 62 20 5b 61 70 70  execute $db [app
13300 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
13310 20 20 20 20 20 20 20 22 50 52 41 47 4d 41 20 74         "PRAGMA t
13320 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74  emp_store_direct
13330 6f 72 79 20 3d 20 5c 22 22 20 5b 67 65 74 54 65  ory = \"" [getTe
13340 6d 70 6f 72 61 72 79 44 69 72 65 63 74 6f 72 79  mporaryDirectory
13350 5d 20 5c 22 5c 3b 5d 0d 0a 20 20 20 20 20 20 7d  ] \"\;]..      }
13360 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
13370 20 20 20 23 20 4e 4f 54 45 3a 20 50 65 72 66 6f     # NOTE: Perfo
13380 72 6d 20 61 6e 79 20 65 78 74 72 61 20 70 65 72  rm any extra per
13390 2d 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 65 74 75  -connection setu
133a0 70 20 66 6f 72 20 74 68 65 20 6e 65 77 6c 79 20  p for the newly 
133b0 6f 70 65 6e 65 64 0d 0a 20 20 20 20 20 20 23 20  opened..      # 
133c0 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 6e        database n
133d0 6f 77 20 75 6e 6c 65 73 73 20 6f 75 72 20 63 61  ow unless our ca
133e0 6c 6c 65 72 20 66 6f 72 62 69 64 73 20 69 74 2e  ller forbids it.
133f0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
13400 20 73 65 74 20 65 78 65 63 75 74 65 4f 6e 53 65   set executeOnSe
13410 74 75 70 20 5b 67 65 74 45 78 65 63 75 74 65 4f  tup [getExecuteO
13420 6e 53 65 74 75 70 5d 0d 0a 0d 0a 20 20 20 20 20  nSetup]....     
13430 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
13440 67 74 68 20 24 65 78 65 63 75 74 65 4f 6e 53 65  gth $executeOnSe
13450 74 75 70 5d 20 3e 20 30 20 26 26 20 5c 0d 0a 20  tup] > 0 && \.. 
13460 20 20 20 20 20 20 20 20 20 21 5b 69 6e 66 6f 20           ![info 
13470 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 78 65 63  exists ::no(exec
13480 75 74 65 4f 6e 53 65 74 75 70 29 5d 7d 20 74 68  uteOnSetup)]} th
13490 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
134a0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
134b0 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 6d 61   This command ma
134c0 79 20 72 61 69 73 65 20 61 6e 20 65 72 72 6f 72  y raise an error
134d0 3b 20 69 66 20 73 6f 2c 20 74 68 61 74 20 69 73  ; if so, that is
134e0 20 66 69 6e 65 2c 20 61 73 0d 0a 20 20 20 20 20   fine, as..     
134f0 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 65     #       the e
13500 6e 63 6c 6f 73 69 6e 67 20 74 65 73 74 20 77 69  nclosing test wi
13510 6c 6c 20 74 68 65 6e 20 66 61 69 6c 2e 20 20 54  ll then fail.  T
13520 68 65 20 5b 73 75 62 73 74 5d 20 63 6f 6d 6d 61  he [subst] comma
13530 6e 64 20 69 73 0d 0a 20 20 20 20 20 20 20 20 23  nd is..        #
13540 20 20 20 20 20 20 20 75 73 65 64 20 6f 6e 20 74         used on t
13550 68 65 20 53 51 4c 20 69 6e 20 63 61 73 65 20 69  he SQL in case i
13560 74 20 6e 65 65 64 73 20 74 6f 20 72 65 66 65 72  t needs to refer
13570 20 74 6f 20 73 74 61 74 65 20 69 6e 20 6f 75 72   to state in our
13580 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
13590 20 20 63 6f 6e 74 65 78 74 2e 0d 0a 20 20 20 20    context...    
135a0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
135b0 71 6c 20 65 78 65 63 75 74 65 20 24 64 62 20 5b  ql execute $db [
135c0 73 75 62 73 74 20 24 65 78 65 63 75 74 65 4f 6e  subst $executeOn
135d0 53 65 74 75 70 5d 0d 0a 20 20 20 20 20 20 7d 0d  Setup]..      }.
135e0 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
135f0 20 20 23 20 4e 4f 54 45 3a 20 41 6c 77 61 79 73    # NOTE: Always
13600 20 72 65 74 75 72 6e 20 74 68 65 20 63 6f 6e 6e   return the conn
13610 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 75 70  ection handle up
13620 6f 6e 20 73 75 63 63 65 73 73 2e 0d 0a 20 20 20  on success...   
13630 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
13640 72 6e 20 24 64 62 0d 0a 20 20 20 20 7d 0d 0a 0c  rn $db..    }...
13650 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 44 62  ..    proc getDb
13660 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20 7b 76 61  Connection { {va
13670 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a 20  rName db} } {.. 
13680 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
13690 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74  NOTE: Refer to t
136a0 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72  he specified var
136b0 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22  iable (e.g. "db"
136c0 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74  ) in the context
136d0 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23   of our..      #
136e0 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20 20         caller.  
136f0 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 74 68  The handle to th
13700 65 20 64 61 74 61 62 61 73 65 20 70 72 65 76 69  e database previ
13710 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 76 69 61  ously opened via
13720 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
13730 20 20 20 20 5b 73 65 74 75 70 44 62 5d 20 70 72      [setupDb] pr
13740 6f 63 65 64 75 72 65 20 73 68 6f 75 6c 64 20 62  ocedure should b
13750 65 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e 0d  e stored there..
13760 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
13770 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65  upvar 1 $varName
13780 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a   db....      #..
13790 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
137a0 69 73 20 72 65 74 75 72 6e 73 20 74 68 65 20 41  is returns the A
137b0 44 4f 2e 4e 45 54 20 49 44 62 43 6f 6e 6e 65 63  DO.NET IDbConnec
137c0 74 69 6f 6e 20 6f 62 6a 65 63 74 20 69 6e 73 74  tion object inst
137d0 61 6e 63 65 20 66 6f 72 20 74 68 65 0d 0a 20 20  ance for the..  
137e0 20 20 20 20 23 20 20 20 20 20 20 20 73 70 65 63      #       spec
137f0 69 66 69 65 64 20 64 61 74 61 62 73 65 20 68 61  ified databse ha
13800 6e 64 6c 65 2e 20 20 53 69 6e 63 65 20 67 65 74  ndle.  Since get
13810 74 69 6e 67 20 74 68 69 73 20 6f 62 6a 65 63 74  ting this object
13820 20 72 65 6c 69 65 73 20 75 70 6f 6e 0d 0a 20 20   relies upon..  
13830 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c      #       Eagl
13840 65 20 69 6e 74 65 72 6e 61 6c 73 2c 20 67 72 65  e internals, gre
13850 61 74 20 63 61 72 65 20 73 68 6f 75 6c 64 20 62  at care should b
13860 65 20 74 61 6b 65 6e 20 74 6f 20 61 76 6f 69 64  e taken to avoid
13870 20 64 69 73 70 6f 73 69 6e 67 20 6f 66 0d 0a 20   disposing of.. 
13880 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 69       #       thi
13890 73 20 6f 62 6a 65 63 74 20 6f 72 20 6f 74 68 65  s object or othe
138a0 72 77 69 73 65 20 70 75 74 74 69 6e 67 20 69 74  rwise putting it
138b0 20 69 6e 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64   into an invalid
138c0 20 73 74 61 74 65 2e 0d 0a 20 20 20 20 20 20 23   state...      #
138d0 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
138e0 6f 20 65 78 69 73 74 73 20 64 62 5d 7d 20 74 68  o exists db]} th
138f0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
13900 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
13910 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
13920 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
13930 75 62 6c 69 63 20 2d 6f 62 6a 65 63 74 66 6c 61  ublic -objectfla
13940 67 73 20 2b 4e 6f 44 69 73 70 6f 73 65 20 2d 61  gs +NoDispose -a
13950 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  lias \..        
13960 20 20 20 20 20 20 49 6e 74 65 72 70 72 65 74 65        Interprete
13970 72 2e 47 65 74 41 63 74 69 76 65 2e 63 6f 6e 6e  r.GetActive.conn
13980 65 63 74 69 6f 6e 73 20 49 74 65 6d 20 24 64 62  ections Item $db
13990 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65 73 75  ..        } resu
139a0 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  lt] == 0} then {
139b0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
139c0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
139d0 20 53 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e   Success, return
139e0 20 74 68 65 20 6f 70 61 71 75 65 20 6f 62 6a 65   the opaque obje
139f0 63 74 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20  ct handle...    
13a00 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
13a10 20 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c     return $resul
13a20 74 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  t..        } els
13a30 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  e {..          #
13a40 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
13a50 54 45 3a 20 46 61 69 6c 75 72 65 2c 20 72 65 70  TE: Failure, rep
13a60 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20  ort why...      
13a70 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
13a80 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
13a90 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
13aa0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
13ab0 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
13ac0 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74  G: failed to get
13ad0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64   connection hand
13ae0 6c 65 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  le for database 
13af0 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
13b00 20 20 20 20 20 24 64 62 20 22 5c 22 2c 20 65 72       $db "\", er
13b10 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65 73  ror: " \n\t $res
13b20 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ult \n]..       
13b30 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
13b40 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
13b50 4e 4f 54 45 3a 20 46 61 69 6c 75 72 65 2c 20 72  NOTE: Failure, r
13b60 65 74 75 72 6e 20 61 6e 20 6f 62 76 69 6f 75 73  eturn an obvious
13b70 6c 79 20 69 6e 76 61 6c 69 64 20 6f 70 61 71 75  ly invalid opaqu
13b80 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 2e  e object handle.
13b90 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
13ba0 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20   return ""..    
13bb0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 66  }.....    proc f
13bc0 72 65 65 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20  reeDbConnection 
13bd0 7b 20 7b 76 61 72 4e 61 6d 65 20 63 6f 6e 6e 65  { {varName conne
13be0 63 74 69 6f 6e 7d 20 7d 20 7b 0d 0a 20 20 20 20  ction} } {..    
13bf0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
13c00 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65 20  E: Refer to the 
13c10 73 70 65 63 69 66 69 65 64 20 76 61 72 69 61 62  specified variab
13c20 6c 65 20 28 65 2e 67 2e 20 22 63 6f 6e 6e 65 63  le (e.g. "connec
13c30 74 69 6f 6e 22 29 20 69 6e 20 74 68 65 0d 0a 20  tion") in the.. 
13c40 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e       #       con
13c50 74 65 78 74 20 6f 66 20 6f 75 72 20 63 61 6c 6c  text of our call
13c60 65 72 2e 20 20 54 68 65 20 6f 70 61 71 75 65 20  er.  The opaque 
13c70 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 66 6f  object handle fo
13c80 72 20 61 6e 20 41 44 4f 2e 4e 45 54 0d 0a 20 20  r an ADO.NET..  
13c90 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 6e      #       conn
13ca0 65 63 74 69 6f 6e 20 70 72 65 76 69 6f 75 73 6c  ection previousl
13cb0 79 20 72 65 74 75 72 6e 65 64 20 62 79 20 5b 67  y returned by [g
13cc0 65 74 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 5d 20  etDbConnection] 
13cd0 73 68 6f 75 6c 64 20 62 65 0d 0a 20 20 20 20 20  should be..     
13ce0 20 23 20 20 20 20 20 20 20 73 74 6f 72 65 64 20   #       stored 
13cf0 74 68 65 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d  there...      #.
13d00 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24  .      upvar 1 $
13d10 76 61 72 4e 61 6d 65 20 63 6f 6e 6e 65 63 74 69  varName connecti
13d20 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  on....      #.. 
13d30 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74       # NOTE: Att
13d40 65 6d 70 74 20 74 6f 20 72 65 6d 6f 76 65 20 74  empt to remove t
13d50 68 65 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74  he opaque object
13d60 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 74 68 65   handle from the
13d70 20 69 6e 74 65 72 70 72 65 74 65 72 0d 0a 20 20   interpreter..  
13d80 20 20 20 20 23 20 20 20 20 20 20 20 6e 6f 77 2e      #       now.
13d90 20 20 54 68 69 73 20 5b 6f 62 6a 65 63 74 20 64    This [object d
13da0 69 73 70 6f 73 65 5d 20 63 61 6c 6c 20 77 69 6c  ispose] call wil
13db0 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 64  l not actually d
13dc0 69 73 70 6f 73 65 20 6f 66 20 74 68 65 0d 0a 20  ispose of the.. 
13dd0 20 20 20 20 20 23 20 20 20 20 20 20 20 75 6e 64       #       und
13de0 65 72 6c 79 69 6e 67 20 6f 62 6a 65 63 74 20 62  erlying object b
13df0 65 63 61 75 73 65 20 74 68 65 20 2b 4e 6f 44 69  ecause the +NoDi
13e00 73 70 6f 73 65 20 66 6c 61 67 20 77 61 73 20 73  spose flag was s
13e10 65 74 20 6f 6e 20 69 74 0d 0a 20 20 20 20 20 20  et on it..      
13e20 23 20 20 20 20 20 20 20 64 75 72 69 6e 67 20 63  #       during c
13e30 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f  reation of the o
13e40 70 61 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e  paque object han
13e50 64 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  dle...      #.. 
13e60 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
13e70 78 69 73 74 73 20 63 6f 6e 6e 65 63 74 69 6f 6e  xists connection
13e80 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
13e90 20 20 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74    [catch {object
13ea0 20 64 69 73 70 6f 73 65 20 24 63 6f 6e 6e 65 63   dispose $connec
13eb0 74 69 6f 6e 7d 20 65 72 72 6f 72 5d 7d 20 74 68  tion} error]} th
13ec0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
13ed0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
13ee0 20 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c   We somehow fail
13ef0 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  ed to remove the
13f00 20 68 61 6e 64 6c 65 2c 20 72 65 70 6f 72 74 20   handle, report 
13f10 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  why...        #.
13f20 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
13f30 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
13f40 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
13f50 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
13f60 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
13f70 74 6f 20 72 65 6d 6f 76 65 20 63 6f 6e 6e 65 63  to remove connec
13f80 74 69 6f 6e 20 68 61 6e 64 6c 65 20 5c 22 22 20  tion handle \"" 
13f90 24 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 0d 0a 20  $connection \.. 
13fa0 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20             "\", 
13fb0 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65  error: " \n\t $e
13fc0 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  rror \n]..      
13fd0 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
13fe0 20 70 72 6f 63 20 61 64 64 44 62 43 6f 6e 6e 65   proc addDbConne
13ff0 63 74 69 6f 6e 20 7b 20 63 6f 6e 6e 65 63 74 69  ction { connecti
14000 6f 6e 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20  on {varName db} 
14010 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
14020 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65      # NOTE: Refe
14030 72 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69  r to the specifi
14040 65 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67  ed variable (e.g
14050 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65 20 63  . "db") in the c
14060 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20  ontext of our.. 
14070 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6c       #       cal
14080 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ler...      #.. 
14090 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61       upvar 1 $va
140a0 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20  rName db....    
140b0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
140c0 45 3a 20 43 72 65 61 74 65 20 61 20 63 6f 72 72  E: Create a corr
140d0 65 63 74 6c 79 20 66 6f 72 6d 61 74 74 65 64 20  ectly formatted 
140e0 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 64 61 74  name for the dat
140f0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
14100 20 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20   to..      #    
14110 20 20 20 62 65 20 61 64 64 65 64 20 74 6f 20 74     be added to t
14120 68 65 20 6c 69 73 74 20 6d 61 6e 61 67 65 64 20  he list managed 
14130 62 79 20 74 68 65 20 45 61 67 6c 65 20 69 6e 74  by the Eagle int
14140 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20  erpreter...     
14150 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 64 62   #..      set db
14160 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   [object invoke 
14170 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
14180 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 45  c \..          E
14190 61 67 6c 65 2e 5f 43 6f 6d 70 6f 6e 65 6e 74 73  agle._Components
141a0 2e 50 72 69 76 61 74 65 2e 46 6f 72 6d 61 74 4f  .Private.FormatO
141b0 70 73 20 44 61 74 61 62 61 73 65 4f 62 6a 65 63  ps DatabaseObjec
141c0 74 4e 61 6d 65 20 24 63 6f 6e 6e 65 63 74 69 6f  tName $connectio
141d0 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 53  n \..          S
141e0 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20  QLiteConnection 
141f0 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49  [object invoke I
14200 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74 41 63  nterpreter.GetAc
14210 74 69 76 65 20 4e 65 78 74 49 64 5d 5d 0d 0a 0d  tive NextId]]...
14220 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
14230 23 20 4e 4f 54 45 3a 20 41 64 64 20 74 68 65 20  # NOTE: Add the 
14240 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
14250 69 6f 6e 20 70 72 6f 76 69 64 65 64 20 62 79 20  ion provided by 
14260 6f 75 72 20 63 61 6c 6c 65 72 20 74 6f 20 74 68  our caller to th
14270 65 20 6c 69 73 74 0d 0a 20 20 20 20 20 20 23 20  e list..      # 
14280 20 20 20 20 20 20 6f 66 20 74 68 6f 73 65 20 6b        of those k
14290 6e 6f 77 6e 20 74 6f 20 74 68 65 20 45 61 67 6c  nown to the Eagl
142a0 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a  e interpreter...
142b0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 6f        #..      o
142c0 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
142d0 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 49  ags +NonPublic I
142e0 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74 41 63  nterpreter.GetAc
142f0 74 69 76 65 2e 63 6f 6e 6e 65 63 74 69 6f 6e 73  tive.connections
14300 20 41 64 64 20 5c 0d 0a 20 20 20 20 20 20 20 20   Add \..        
14310 20 20 24 64 62 20 24 63 6f 6e 6e 65 63 74 69 6f    $db $connectio
14320 6e 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  n..    }.....   
14330 20 70 72 6f 63 20 67 65 74 52 6f 77 73 46 72 6f   proc getRowsFro
14340 6d 44 61 74 61 54 61 62 6c 65 20 7b 20 64 61 74  mDataTable { dat
14350 61 54 61 62 6c 65 20 7d 20 7b 0d 0a 20 20 20 20  aTable } {..    
14360 20 20 73 65 74 20 72 6f 77 73 20 5b 6c 69 73 74    set rows [list
14370 5d 0d 0a 20 20 20 20 20 20 73 65 74 20 63 6f 75  ]..      set cou
14380 6e 74 20 5b 24 64 61 74 61 54 61 62 6c 65 20 43  nt [$dataTable C
14390 6f 6c 75 6d 6e 73 2e 43 6f 75 6e 74 5d 0d 0a 0d  olumns.Count]...
143a0 0a 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20  .      for {set 
143b0 69 6e 64 65 78 20 30 7d 20 7b 24 69 6e 64 65 78  index 0} {$index
143c0 20 3c 20 24 63 6f 75 6e 74 7d 20 7b 69 6e 63 72   < $count} {incr
143d0 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20 20 20   index} {..     
143e0 20 20 20 73 65 74 20 64 61 74 61 43 6f 6c 75 6d     set dataColum
143f0 6e 20 5b 24 64 61 74 61 54 61 62 6c 65 20 2d 61  n [$dataTable -a
14400 6c 69 61 73 20 43 6f 6c 75 6d 6e 73 2e 67 65 74  lias Columns.get
14410 5f 49 74 65 6d 20 24 69 6e 64 65 78 5d 0d 0a 20  _Item $index].. 
14420 20 20 20 20 20 20 20 73 65 74 20 6e 61 6d 65 73         set names
14430 28 24 69 6e 64 65 78 29 20 5b 24 64 61 74 61 43  ($index) [$dataC
14440 6f 6c 75 6d 6e 20 43 6f 6c 75 6d 6e 4e 61 6d 65  olumn ColumnName
14450 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ]..      }....  
14460 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61      object forea
14470 63 68 20 2d 61 6c 69 61 73 20 64 61 74 61 52 6f  ch -alias dataRo
14480 77 20 5b 73 65 74 20 64 61 74 61 52 6f 77 73 20  w [set dataRows 
14490 5b 24 64 61 74 61 54 61 62 6c 65 20 52 6f 77 73  [$dataTable Rows
144a0 5d 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  ]] {..        se
144b0 74 20 72 6f 77 20 5b 6c 69 73 74 5d 0d 0a 0d 0a  t row [list]....
144c0 20 20 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74          for {set
144d0 20 69 6e 64 65 78 20 30 7d 20 7b 24 69 6e 64 65   index 0} {$inde
144e0 78 20 3c 20 24 63 6f 75 6e 74 7d 20 7b 69 6e 63  x < $count} {inc
144f0 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20 20  r index} {..    
14500 20 20 20 20 20 20 73 65 74 20 76 61 6c 75 65 20        set value 
14510 5b 24 64 61 74 61 52 6f 77 20 2d 63 72 65 61 74  [$dataRow -creat
14520 65 20 2d 61 6c 69 61 73 20 67 65 74 5f 49 74 65  e -alias get_Ite
14530 6d 20 24 69 6e 64 65 78 5d 0d 0a 0d 0a 20 20 20  m $index]....   
14540 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
14550 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 6c 75 65  ng length $value
14560 5d 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20 20 20  ] > 0 && \..    
14570 20 20 20 20 20 20 20 20 20 20 21 5b 6f 62 6a 65            ![obje
14580 63 74 20 69 6e 76 6f 6b 65 20 43 6f 6e 76 65 72  ct invoke Conver
14590 74 20 49 73 44 42 4e 75 6c 6c 20 24 76 61 6c 75  t IsDBNull $valu
145a0 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
145b0 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
145c0 72 6f 77 20 5b 6c 69 73 74 20 24 6e 61 6d 65 73  row [list $names
145d0 28 24 69 6e 64 65 78 29 20 5b 24 76 61 6c 75 65  ($index) [$value
145e0 20 54 6f 53 74 72 69 6e 67 5d 5d 0d 0a 20 20 20   ToString]]..   
145f0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
14600 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70  .            lap
14610 70 65 6e 64 20 72 6f 77 20 5b 6c 69 73 74 20 24  pend row [list $
14620 6e 61 6d 65 73 28 24 69 6e 64 65 78 29 5d 0d 0a  names($index)]..
14630 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
14640 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
14650 20 20 6c 61 70 70 65 6e 64 20 72 6f 77 73 20 24    lappend rows $
14660 72 6f 77 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  row..      }....
14670 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 6f        return $ro
14680 77 73 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  ws..    }.....  
14690 20 20 70 72 6f 63 20 64 75 6d 70 52 6f 77 73 46    proc dumpRowsF
146a0 72 6f 6d 44 61 74 61 54 61 62 6c 65 20 7b 20 63  romDataTable { c
146b0 68 61 6e 6e 65 6c 20 72 6f 77 73 20 7d 20 7b 0d  hannel rows } {.
146c0 0a 20 20 20 20 20 20 73 65 74 20 73 65 71 75 65  .      set seque
146d0 6e 63 65 20 31 0d 0a 0d 0a 20 20 20 20 20 20 66  nce 1....      f
146e0 6f 72 65 61 63 68 20 72 6f 77 20 24 72 6f 77 73  oreach row $rows
146f0 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
14700 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
14710 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
14720 20 20 20 20 20 20 5b 65 78 70 72 20 7b 24 73 65        [expr {$se
14730 71 75 65 6e 63 65 20 3e 20 31 20 3f 20 22 5c 6e  quence > 1 ? "\n
14740 22 20 3a 20 22 22 7d 5d 20 22 2d 2d 2d 2d 20 52  " : ""}] "---- R
14750 4f 57 20 23 22 20 24 73 65 71 75 65 6e 63 65 20  OW #" $sequence 
14760 3a 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  :\n]....        
14770 66 6f 72 65 61 63 68 20 70 61 69 72 20 24 72 6f  foreach pair $ro
14780 77 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  w {..          i
14790 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 70 61 69  f {[llength $pai
147a0 72 5d 20 3e 3d 20 32 7d 20 74 68 65 6e 20 7b 0d  r] >= 2} then {.
147b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
147c0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
147d0 65 6e 64 41 72 67 73 20 5c 74 20 5c 0d 0a 20 20  endArgs \t \..  
147e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 6c                [l
147f0 69 73 74 20 5b 6c 69 6e 64 65 78 20 24 70 61 69  ist [lindex $pai
14800 72 20 30 5d 5d 20 22 3a 20 22 20 5b 6c 69 73 74  r 0]] ": " [list
14810 20 5b 6c 69 6e 64 65 78 20 24 70 61 69 72 20 31   [lindex $pair 1
14820 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ]] \n]..        
14830 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 6c 6c 65    } elseif {[lle
14840 6e 67 74 68 20 24 70 61 69 72 5d 20 3d 3d 20 31  ngth $pair] == 1
14850 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
14860 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
14870 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
14880 20 5c 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   \t \..         
14890 20 20 20 20 20 20 20 5b 6c 69 73 74 20 5b 6c 69         [list [li
148a0 6e 64 65 78 20 24 70 61 69 72 20 30 5d 5d 20 22  ndex $pair 0]] "
148b0 3a 20 3c 6e 75 6c 6c 3e 5c 6e 22 5d 0d 0a 20 20  : <null>\n"]..  
148c0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
148d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
148e0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5c 74 3c  uts $channel \t<
148f0 65 6d 70 74 79 3e 5c 6e 3b 20 23 20 4e 4f 54 45  empty>\n; # NOTE
14900 3a 20 4e 6f 20 64 61 74 61 3f 0d 0a 20 20 20 20  : No data?..    
14910 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
14920 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 6e   }....        in
14930 63 72 20 73 65 71 75 65 6e 63 65 0d 0a 20 20 20  cr sequence..   
14940 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
14950 20 20 20 20 70 72 6f 63 20 63 6c 65 61 6e 75 70      proc cleanup
14960 44 62 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 76  Db { fileName {v
14970 61 72 4e 61 6d 65 20 64 62 7d 20 7b 63 6f 6c 6c  arName db} {coll
14980 65 63 74 20 74 72 75 65 7d 20 7b 71 75 61 6c 69  ect true} {quali
14990 66 79 20 74 72 75 65 7d 0d 0a 20 20 20 20 20 20  fy true}..      
149a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
149b0 64 65 6c 65 74 65 20 74 72 75 65 7d 20 7d 20 7b  delete true} } {
149c0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
149d0 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
149e0 20 74 6f 20 66 6f 72 63 65 20 61 6c 6c 20 70 65   to force all pe
149f0 6e 64 69 6e 67 20 22 67 61 72 62 61 67 65 22 20  nding "garbage" 
14a00 6f 62 6a 65 63 74 73 20 74 6f 20 62 65 20 63 6f  objects to be co
14a10 6c 6c 65 63 74 65 64 2c 0d 0a 20 20 20 20 20 20  llected,..      
14a20 23 20 20 20 20 20 20 20 69 6e 63 6c 75 64 69 6e  #       includin
14a30 67 20 53 51 4c 69 74 65 20 73 74 61 74 65 6d 65  g SQLite stateme
14a40 6e 74 73 20 61 6e 64 20 62 61 63 6b 75 70 20 6f  nts and backup o
14a50 62 6a 65 63 74 73 3b 20 74 68 69 73 20 73 68 6f  bjects; this sho
14a60 75 6c 64 20 61 6c 6c 6f 77 0d 0a 20 20 20 20 20  uld allow..     
14a70 20 23 20 20 20 20 20 20 20 74 68 65 20 75 6e 64   #       the und
14a80 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
14a90 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65   file to be dele
14aa0 74 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ted...      #.. 
14ab0 20 20 20 20 20 69 66 20 7b 24 63 6f 6c 6c 65 63       if {$collec
14ac0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
14ad0 20 20 20 63 6f 6c 6c 65 63 74 47 61 72 62 61 67     collectGarbag
14ae0 65 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  e $::test_channe
14af0 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  l..      }....  
14b00 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
14b10 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68  OTE: Refer to th
14b20 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72 69  e specified vari
14b30 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22 29  able (e.g. "db")
14b40 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20   in the context 
14b50 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23 20  of our..      # 
14b60 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20 20 54        caller.  T
14b70 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 74 68 65  he handle to the
14b80 20 64 61 74 61 62 61 73 65 20 70 72 65 76 69 6f   database previo
14b90 75 73 6c 79 20 6f 70 65 6e 65 64 20 76 69 61 20  usly opened via 
14ba0 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
14bb0 20 20 20 5b 73 65 74 75 70 44 62 5d 20 70 72 6f     [setupDb] pro
14bc0 63 65 64 75 72 65 20 73 68 6f 75 6c 64 20 62 65  cedure should be
14bd0 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a   stored there...
14be0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75        #..      u
14bf0 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20  pvar 1 $varName 
14c00 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  db....      #.. 
14c10 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6c 6f       # NOTE: Clo
14c20 73 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  se the connectio
14c30 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
14c40 65 20 6e 6f 77 2e 20 20 54 68 69 73 20 73 68 6f  e now.  This sho
14c50 75 6c 64 20 61 6c 6c 6f 77 20 75 73 0d 0a 20 20  uld allow us..  
14c60 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 64      #       to d
14c70 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c  elete the underl
14c80 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
14c90 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  le...      #..  
14ca0 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
14cb0 69 73 74 73 20 64 62 5d 20 26 26 20 5b 63 61 74  ists db] && [cat
14cc0 63 68 20 7b 73 71 6c 20 63 6c 6f 73 65 20 24 64  ch {sql close $d
14cd0 62 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20  b} error]} then 
14ce0 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
14cf0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65        # NOTE: We
14d00 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20   somehow failed 
14d10 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 64 61 74  to close the dat
14d20 61 62 61 73 65 2c 20 72 65 70 6f 72 74 20 77 68  abase, report wh
14d30 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  y...        #.. 
14d40 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
14d50 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
14d60 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
14d70 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
14d80 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
14d90 20 63 6c 6f 73 65 20 64 61 74 61 62 61 73 65 20   close database 
14da0 5c 22 22 20 24 64 62 20 22 5c 22 2c 20 65 72 72  \"" $db "\", err
14db0 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  or: " \..       
14dc0 20 20 20 20 20 5c 6e 5c 74 20 24 65 72 72 6f 72       \n\t $error
14dd0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d   \n]..      }...
14de0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
14df0 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20 73  # NOTE: First, s
14e00 65 65 20 69 66 20 6f 75 72 20 63 61 6c 6c 65 72  ee if our caller
14e10 20 68 61 73 20 72 65 71 75 65 73 74 65 64 20 61   has requested a
14e20 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
14e30 62 61 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  base...      #..
14e40 20 20 20 20 20 20 73 65 74 20 69 73 4d 65 6d 6f        set isMemo
14e50 72 79 20 5b 69 73 4d 65 6d 6f 72 79 44 62 20 24  ry [isMemoryDb $
14e60 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20  fileName]....   
14e70 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
14e80 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 66 75  TE: Build the fu
14e90 6c 6c 20 70 61 74 68 20 74 6f 20 74 68 65 20 64  ll path to the d
14ea0 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
14eb0 65 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 61 6c 6c  e.  For now, all
14ec0 20 74 65 73 74 0d 0a 20 20 20 20 20 20 23 20 20   test..      #  
14ed0 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
14ee0 6c 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 69  les are stored i
14ef0 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  n the temporary 
14f00 64 69 72 65 63 74 6f 72 79 2e 0d 0a 20 20 20 20  directory...    
14f10 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21    #..      if {!
14f20 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24 71 75  $isMemory && $qu
14f30 61 6c 69 66 79 7d 20 74 68 65 6e 20 7b 0d 0a 20  alify} then {.. 
14f40 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e         set fileN
14f50 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b  ame [file join [
14f60 67 65 74 44 61 74 61 62 61 73 65 44 69 72 65 63  getDatabaseDirec
14f70 74 6f 72 79 5d 20 5b 66 69 6c 65 20 74 61 69 6c  tory] [file tail
14f80 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20   $fileName]]..  
14f90 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
14fa0 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
14fb0 43 68 65 63 6b 20 69 66 20 74 68 65 20 66 69 6c  Check if the fil
14fc0 65 20 73 74 69 6c 6c 20 65 78 69 73 74 73 2e 0d  e still exists..
14fd0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
14fe0 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72 79 20 26  if {!$isMemory &
14ff0 26 20 24 64 65 6c 65 74 65 20 26 26 20 5b 66 69  & $delete && [fi
15000 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e  le exists $fileN
15010 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
15020 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
15030 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 64 65   # NOTE: Skip de
15040 6c 65 74 69 6e 67 20 64 61 74 61 62 61 73 65 20  leting database 
15050 66 69 6c 65 73 20 69 66 20 73 6f 6d 65 62 6f 64  files if somebod
15060 79 20 73 65 74 73 20 74 68 65 20 67 6c 6f 62 61  y sets the globa
15070 6c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  l..        #    
15080 20 20 20 76 61 72 69 61 62 6c 65 20 74 6f 20 70     variable to p
15090 72 65 76 65 6e 74 20 69 74 2e 0d 0a 20 20 20 20  revent it...    
150a0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
150b0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
150c0 20 3a 3a 6e 6f 28 63 6c 65 61 6e 75 70 44 62 46   ::no(cleanupDbF
150d0 69 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ile)]} then {.. 
150e0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
150f0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74        # NOTE: At
15100 74 65 6d 70 74 20 74 6f 20 64 65 6c 65 74 65 20  tempt to delete 
15110 74 68 65 20 74 65 73 74 20 64 61 74 61 62 61 73  the test databas
15120 65 20 66 69 6c 65 20 6e 6f 77 2e 0d 0a 20 20 20  e file now...   
15130 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
15140 20 20 20 20 69 66 20 7b 5b 73 65 74 20 63 6f 64      if {[set cod
15150 65 20 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64  e [catch {file d
15160 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d  elete $fileName}
15170 20 65 72 72 6f 72 5d 5d 7d 20 74 68 65 6e 20 7b   error]]} then {
15180 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
15190 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
151a0 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20  OTE: We somehow 
151b0 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65  failed to delete
151c0 20 74 68 65 20 66 69 6c 65 2c 20 72 65 70 6f 72   the file, repor
151d0 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20  t why...        
151e0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
151f0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
15200 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
15210 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
15220 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
15230 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
15240 20 64 65 6c 65 74 65 20 64 61 74 61 62 61 73 65   delete database
15250 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e   file \"" $fileN
15260 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
15270 20 20 20 20 20 20 20 22 5c 22 20 64 75 72 69 6e         "\" durin
15280 67 20 63 6c 65 61 6e 75 70 2c 20 65 72 72 6f 72  g cleanup, error
15290 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20  : " \n\t $error 
152a0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
152b0 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
152c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
152d0 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
152e0 45 3a 20 53 68 6f 77 20 74 68 61 74 20 77 65 20  E: Show that we 
152f0 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67  skipped deleting
15300 20 74 68 65 20 66 69 6c 65 2e 0d 0a 20 20 20 20   the file...    
15310 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
15320 20 20 20 73 65 74 20 63 6f 64 65 20 30 0d 0a 0d     set code 0...
15330 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
15340 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
15350 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
15360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
15370 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 73 6b 69  === WARNING: ski
15380 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20 64 61  pped deleting da
15390 74 61 62 61 73 65 20 66 69 6c 65 20 5c 22 22 20  tabase file \"" 
153a0 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20  $fileName \..   
153b0 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 64             "\" d
153c0 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 5c 6e 22  uring cleanup\n"
153d0 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
153e0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
153f0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
15400 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 66 69 6c   # NOTE: The fil
15410 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
15420 2c 20 73 75 63 63 65 73 73 21 0d 0a 20 20 20 20  , success!..    
15430 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
15440 65 74 20 63 6f 64 65 20 30 0d 0a 20 20 20 20 20  et code 0..     
15450 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
15460 72 6e 20 24 63 6f 64 65 0d 0a 20 20 20 20 7d 0d  rn $code..    }.
15470 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 61 76  ....    proc sav
15480 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69  eEnvironmentVari
15490 61 62 6c 65 73 20 7b 20 6e 61 6d 65 73 20 7b 76  ables { names {v
154a0 61 72 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a  arName ""} } {..
154b0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
154c0 20 4e 4f 54 45 3a 20 46 6f 72 20 65 61 63 68 20   NOTE: For each 
154d0 6e 61 6d 65 2c 20 64 6f 65 73 20 74 68 65 20 6c  name, does the l
154e0 69 76 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  ive environment 
154f0 76 61 72 69 61 62 6c 65 20 65 78 69 73 74 3f 20  variable exist? 
15500 20 49 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20   If..      #    
15510 20 20 20 73 6f 2c 20 73 61 76 65 20 74 68 65 20     so, save the 
15520 76 61 6c 75 65 20 66 6f 72 20 6c 61 74 65 72 3b  value for later;
15530 20 6f 74 68 65 72 77 69 73 65 2c 20 6d 61 6b 65   otherwise, make
15540 20 73 75 72 65 20 74 68 65 20 73 61 76 65 64 0d   sure the saved.
15550 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76  .      #       v
15560 61 6c 75 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  alue does not ex
15570 69 73 74 20 65 69 74 68 65 72 2e 20 20 54 68 65  ist either.  The
15580 20 6c 69 76 65 20 65 6e 76 69 72 6f 6e 6d 65 6e   live environmen
15590 74 20 76 61 72 69 61 62 6c 65 73 0d 0a 20 20 20  t variables..   
155a0 20 20 20 23 20 20 20 20 20 20 20 41 52 45 20 4e     #       ARE N
155b0 4f 54 20 63 68 61 6e 67 65 64 20 62 79 20 74 68  OT changed by th
155c0 69 73 20 70 72 6f 63 65 64 75 72 65 2e 0d 0a 20  is procedure... 
155d0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
155e0 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
155f0 20 24 76 61 72 4e 61 6d 65 5d 20 3d 3d 20 30 7d   $varName] == 0}
15600 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
15610 20 73 65 74 20 76 61 72 4e 61 6d 65 20 73 61 76   set varName sav
15620 65 64 45 6e 76 0d 0a 20 20 20 20 20 20 7d 0d 0a  edEnv..      }..
15630 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20  ..      upvar 1 
15640 24 76 61 72 4e 61 6d 65 20 73 61 76 65 64 45 6e  $varName savedEn
15650 76 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65 61  v....      forea
15660 63 68 20 6e 61 6d 65 20 24 6e 61 6d 65 73 20 7b  ch name $names {
15670 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69  ..        if {[i
15680 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65 6e 76  nfo exists ::env
15690 28 24 6e 61 6d 65 29 5d 7d 20 74 68 65 6e 20 7b  ($name)]} then {
156a0 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
156b0 73 61 76 65 64 45 6e 76 28 24 6e 61 6d 65 29 20  savedEnv($name) 
156c0 24 3a 3a 65 6e 76 28 24 6e 61 6d 65 29 0d 0a 20  $::env($name).. 
156d0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
156e0 0a 20 20 20 20 20 20 20 20 20 20 75 6e 73 65 74  .          unset
156f0 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 73 61 76   -nocomplain sav
15700 65 64 45 6e 76 28 24 6e 61 6d 65 29 0d 0a 20 20  edEnv($name)..  
15710 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
15720 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
15730 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20     # NOTE: This 
15740 69 73 20 73 65 6c 66 2d 63 6c 65 61 6e 69 6e 67  is self-cleaning
15750 2e 20 20 49 66 20 6e 6f 20 73 61 76 65 64 20 65  .  If no saved e
15760 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61  nvironment varia
15770 62 6c 65 73 20 6e 6f 77 0d 0a 20 20 20 20 20 20  bles now..      
15780 23 20 20 20 20 20 20 20 65 78 69 73 74 2c 20 72  #       exist, r
15790 65 6d 6f 76 65 20 74 68 65 20 61 72 72 61 79 2e  emove the array.
157a0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
157b0 20 69 66 20 7b 5b 61 72 72 61 79 20 73 69 7a 65   if {[array size
157c0 20 73 61 76 65 64 45 6e 76 5d 20 3d 3d 20 30 7d   savedEnv] == 0}
157d0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
157e0 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61   unset -nocompla
157f0 69 6e 20 73 61 76 65 64 45 6e 76 0d 0a 20 20 20  in savedEnv..   
15800 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
15810 20 20 20 20 70 72 6f 63 20 72 65 73 74 6f 72 65      proc restore
15820 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61  EnvironmentVaria
15830 62 6c 65 73 20 7b 20 6e 61 6d 65 73 20 7b 76 61  bles { names {va
15840 72 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20  rName ""} } {.. 
15850 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
15860 4e 4f 54 45 3a 20 46 6f 72 20 65 61 63 68 20 6e  NOTE: For each n
15870 61 6d 65 2c 20 64 6f 65 73 20 74 68 65 20 73 61  ame, does the sa
15880 76 65 64 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  ved environment 
15890 76 61 72 69 61 62 6c 65 20 65 78 69 73 74 3f 20  variable exist? 
158a0 20 49 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20   If..      #    
158b0 20 20 20 73 6f 2c 20 72 65 73 74 6f 72 65 20 74     so, restore t
158c0 68 65 20 73 61 76 65 64 20 76 61 6c 75 65 20 61  he saved value a
158d0 6e 64 20 75 6e 73 65 74 20 69 74 3b 20 6f 74 68  nd unset it; oth
158e0 65 72 77 69 73 65 2c 20 6d 61 6b 65 20 73 75 72  erwise, make sur
158f0 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
15900 20 74 68 65 20 6c 69 76 65 20 65 6e 76 69 72 6f   the live enviro
15910 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 64  nment variable d
15920 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 65 69  oes not exist ei
15930 74 68 65 72 20 28 69 2e 65 2e 20 69 74 0d 0a 20  ther (i.e. it.. 
15940 20 20 20 20 20 23 20 20 20 20 20 20 20 77 61 73       #       was
15950 20 6e 6f 74 20 73 65 74 20 74 6f 20 62 65 67 69   not set to begi
15960 6e 20 77 69 74 68 29 2e 20 20 42 6f 74 68 20 73  n with).  Both s
15970 61 76 65 64 20 61 6e 64 20 6c 69 76 65 20 65 6e  aved and live en
15980 76 69 72 6f 6e 6d 65 6e 74 0d 0a 20 20 20 20 20  vironment..     
15990 20 23 20 20 20 20 20 20 20 76 61 72 69 61 62 6c   #       variabl
159a0 65 73 20 41 52 45 20 63 68 61 6e 67 65 64 20 62  es ARE changed b
159b0 79 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  y this procedure
159c0 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
159d0 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
159e0 6e 67 74 68 20 24 76 61 72 4e 61 6d 65 5d 20 3d  ngth $varName] =
159f0 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
15a00 20 20 20 20 20 73 65 74 20 76 61 72 4e 61 6d 65       set varName
15a10 20 73 61 76 65 64 45 6e 76 0d 0a 20 20 20 20 20   savedEnv..     
15a20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 75 70 76 61   }....      upva
15a30 72 20 31 20 24 76 61 72 4e 61 6d 65 20 73 61 76  r 1 $varName sav
15a40 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 66  edEnv....      f
15a50 6f 72 65 61 63 68 20 6e 61 6d 65 20 24 6e 61 6d  oreach name $nam
15a60 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  es {..        if
15a70 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 73   {[info exists s
15a80 61 76 65 64 45 6e 76 28 24 6e 61 6d 65 29 5d 7d  avedEnv($name)]}
15a90 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
15aa0 20 20 20 73 65 74 20 3a 3a 65 6e 76 28 24 6e 61     set ::env($na
15ab0 6d 65 29 20 24 73 61 76 65 64 45 6e 76 28 24 6e  me) $savedEnv($n
15ac0 61 6d 65 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ame)..          
15ad0 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69  unset -nocomplai
15ae0 6e 20 73 61 76 65 64 45 6e 76 28 24 6e 61 6d 65  n savedEnv($name
15af0 29 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  )..        } els
15b00 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 75  e {..          u
15b10 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e  nset -nocomplain
15b20 20 3a 3a 65 6e 76 28 24 6e 61 6d 65 29 0d 0a 20   ::env($name).. 
15b30 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
15b40 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
15b50 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73      # NOTE: This
15b60 20 69 73 20 73 65 6c 66 2d 63 6c 65 61 6e 69 6e   is self-cleanin
15b70 67 2e 20 20 49 66 20 6e 6f 20 73 61 76 65 64 20  g.  If no saved 
15b80 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69  environment vari
15b90 61 62 6c 65 73 20 6e 6f 77 0d 0a 20 20 20 20 20  ables now..     
15ba0 20 23 20 20 20 20 20 20 20 65 78 69 73 74 2c 20   #       exist, 
15bb0 72 65 6d 6f 76 65 20 74 68 65 20 61 72 72 61 79  remove the array
15bc0 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
15bd0 20 20 69 66 20 7b 5b 61 72 72 61 79 20 73 69 7a    if {[array siz
15be0 65 20 73 61 76 65 64 45 6e 76 5d 20 3d 3d 20 30  e savedEnv] == 0
15bf0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
15c00 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c    unset -nocompl
15c10 61 69 6e 20 73 61 76 65 64 45 6e 76 0d 0a 20 20  ain savedEnv..  
15c20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
15c30 0a 20 20 20 20 70 72 6f 63 20 73 61 76 65 53 51  .    proc saveSQ
15c40 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 45 6e  LiteConnectionEn
15c50 76 69 72 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a  vironment {} {..
15c60 20 20 20 20 20 20 75 70 76 61 72 20 31 20 73 61        upvar 1 sa
15c70 76 65 64 45 6e 76 20 73 61 76 65 64 45 6e 76 0d  vedEnv savedEnv.
15c80 0a 0d 0a 20 20 20 20 20 20 73 61 76 65 45 6e 76  ...      saveEnv
15c90 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65  ironmentVariable
15ca0 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20  s [list \..     
15cb0 20 20 20 20 20 44 65 66 61 75 6c 74 46 6c 61 67       DefaultFlag
15cc0 73 5f 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69  s_SQLiteConnecti
15cd0 6f 6e 20 4e 6f 5f 53 51 4c 69 74 65 43 6f 6e 6e  on No_SQLiteConn
15ce0 65 63 74 69 6f 6e 4e 65 77 50 61 72 73 65 72 5d  ectionNewParser]
15cf0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 73 61   \..          sa
15d00 76 65 64 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c  vedEnv..    }...
15d10 0d 0a 20 20 20 20 70 72 6f 63 20 72 65 73 74 6f  ..    proc resto
15d20 72 65 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69  reSQLiteConnecti
15d30 6f 6e 45 6e 76 69 72 6f 6e 6d 65 6e 74 20 7b 7d  onEnvironment {}
15d40 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20   {..      upvar 
15d50 31 20 73 61 76 65 64 45 6e 76 20 73 61 76 65 64  1 savedEnv saved
15d60 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 72 65 73  Env....      res
15d70 74 6f 72 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56  toreEnvironmentV
15d80 61 72 69 61 62 6c 65 73 20 5b 6c 69 73 74 20 5c  ariables [list \
15d90 0d 0a 20 20 20 20 20 20 20 20 20 20 44 65 66 61  ..          Defa
15da0 75 6c 74 46 6c 61 67 73 5f 53 51 4c 69 74 65 43  ultFlags_SQLiteC
15db0 6f 6e 6e 65 63 74 69 6f 6e 20 4e 6f 5f 53 51 4c  onnection No_SQL
15dc0 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 4e 65 77  iteConnectionNew
15dd0 50 61 72 73 65 72 5d 20 5c 0d 0a 20 20 20 20 20  Parser] \..     
15de0 20 20 20 20 20 73 61 76 65 64 45 6e 76 0d 0a 20       savedEnv.. 
15df0 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
15e00 63 20 73 61 76 65 53 51 4c 69 74 65 43 6f 6e 76  c saveSQLiteConv
15e10 65 72 74 45 6e 76 69 72 6f 6e 6d 65 6e 74 20 7b  ertEnvironment {
15e20 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61 72  } {..      upvar
15e30 20 31 20 73 61 76 65 64 45 6e 76 20 73 61 76 65   1 savedEnv save
15e40 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 73 61  dEnv....      sa
15e50 76 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72  veEnvironmentVar
15e60 69 61 62 6c 65 73 20 5b 6c 69 73 74 20 5c 0d 0a  iables [list \..
15e70 20 20 20 20 20 20 20 20 20 20 55 73 65 5f 53 51            Use_SQ
15e80 4c 69 74 65 43 6f 6e 76 65 72 74 5f 44 65 66 61  LiteConvert_Defa
15e90 75 6c 74 44 62 54 79 70 65 20 55 73 65 5f 53 51  ultDbType Use_SQ
15ea0 4c 69 74 65 43 6f 6e 76 65 72 74 5f 44 65 66 61  LiteConvert_Defa
15eb0 75 6c 74 54 79 70 65 4e 61 6d 65 5d 20 5c 0d 0a  ultTypeName] \..
15ec0 20 20 20 20 20 20 20 20 20 20 73 61 76 65 64 45            savedE
15ed0 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  nv..    }.....  
15ee0 20 20 70 72 6f 63 20 72 65 73 74 6f 72 65 53 51    proc restoreSQ
15ef0 4c 69 74 65 43 6f 6e 76 65 72 74 45 6e 76 69 72  LiteConvertEnvir
15f00 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20  onment {} {..   
15f10 20 20 20 75 70 76 61 72 20 31 20 73 61 76 65 64     upvar 1 saved
15f20 45 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a  Env savedEnv....
15f30 20 20 20 20 20 20 72 65 73 74 6f 72 65 45 6e 76        restoreEnv
15f40 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65  ironmentVariable
15f50 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20  s [list \..     
15f60 20 20 20 20 20 55 73 65 5f 53 51 4c 69 74 65 43       Use_SQLiteC
15f70 6f 6e 76 65 72 74 5f 44 65 66 61 75 6c 74 44 62  onvert_DefaultDb
15f80 54 79 70 65 20 55 73 65 5f 53 51 4c 69 74 65 43  Type Use_SQLiteC
15f90 6f 6e 76 65 72 74 5f 44 65 66 61 75 6c 74 54 79  onvert_DefaultTy
15fa0 70 65 4e 61 6d 65 5d 20 5c 0d 0a 20 20 20 20 20  peName] \..     
15fb0 20 20 20 20 20 73 61 76 65 64 45 6e 76 0d 0a 20       savedEnv.. 
15fc0 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
15fd0 63 20 73 65 74 75 70 44 62 49 6e 74 65 72 72 75  c setupDbInterru
15fe0 70 74 43 61 6c 6c 62 61 63 6b 20 7b 20 63 68 61  ptCallback { cha
15ff0 6e 6e 65 6c 20 6c 6f 67 20 7d 20 7b 0d 0a 20 20  nnel log } {..  
16000 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
16010 65 6c 20 22 2d 2d 2d 2d 20 73 65 74 74 69 6e 67  el "---- setting
16020 20 75 70 20 64 65 62 75 67 67 65 72 20 69 6e 74   up debugger int
16030 65 72 72 75 70 74 20 63 61 6c 6c 62 61 63 6b 2e  errupt callback.
16040 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66  .. "....      if
16050 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
16060 20 20 20 20 73 61 76 65 45 6e 76 69 72 6f 6e 6d      saveEnvironm
16070 65 6e 74 56 61 72 69 61 62 6c 65 73 20 5b 6c 69  entVariables [li
16080 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  st \..          
16090 20 20 71 75 69 65 74 46 69 6e 64 49 6e 74 65 72    quietFindInter
160a0 70 72 65 74 65 72 54 65 73 74 50 61 74 68 20 71  preterTestPath q
160b0 75 69 65 74 53 65 74 75 70 49 6e 74 65 72 70 72  uietSetupInterpr
160c0 65 74 65 72 54 65 73 74 50 61 74 68 5d 0d 0a 0d  eterTestPath]...
160d0 0a 20 20 20 20 20 20 20 20 74 72 79 20 7b 0d 0a  .        try {..
160e0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
160f0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 50         # NOTE: P
16100 72 65 76 65 6e 74 20 74 68 65 20 76 65 6e 64 6f  revent the vendo
16110 72 20 73 63 72 69 70 74 20 66 72 6f 6d 20 62 65  r script from be
16120 69 6e 67 20 6e 6f 69 73 79 20 77 68 65 6e 20 63  ing noisy when c
16130 72 65 61 74 69 6e 67 0d 0a 20 20 20 20 20 20 20  reating..       
16140 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 69     #       the i
16150 73 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72 65  solated interpre
16160 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ter...          
16170 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  #..          set
16180 20 3a 3a 65 6e 76 28 71 75 69 65 74 46 69 6e 64   ::env(quietFind
16190 49 6e 74 65 72 70 72 65 74 65 72 54 65 73 74 50  InterpreterTestP
161a0 61 74 68 29 20 31 0d 0a 20 20 20 20 20 20 20 20  ath) 1..        
161b0 20 20 73 65 74 20 3a 3a 65 6e 76 28 71 75 69 65    set ::env(quie
161c0 74 53 65 74 75 70 49 6e 74 65 72 70 72 65 74 65  tSetupInterprete
161d0 72 54 65 73 74 50 61 74 68 29 20 31 0d 0a 0d 0a  rTestPath) 1....
161e0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
161f0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d         # NOTE: M
16200 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 63 72  ake sure the scr
16210 69 70 74 20 64 65 62 75 67 67 65 72 20 61 6e 64  ipt debugger and
16220 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20 69 6e   the isolated in
16230 74 65 72 70 72 65 74 65 72 0d 0a 20 20 20 20 20  terpreter..     
16240 20 20 20 20 20 23 20 20 20 20 20 20 20 61 72 65       #       are
16250 20 73 65 74 75 70 20 61 6e 64 20 72 65 61 64 79   setup and ready
16260 20 66 6f 72 20 75 73 65 2e 0d 0a 20 20 20 20 20   for use...     
16270 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
16280 20 20 64 65 62 75 67 20 73 65 74 75 70 20 74 72    debug setup tr
16290 75 65 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20  ue true....     
162a0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
162b0 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 74    # NOTE: Load t
162c0 68 65 20 6e 65 63 65 73 73 61 72 79 20 70 61 63  he necessary pac
162d0 6b 61 67 65 73 20 69 6e 74 6f 20 74 68 65 20 69  kages into the i
162e0 73 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72 65  solated interpre
162f0 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ter...          
16300 23 0d 0a 20 20 20 20 20 20 20 20 20 20 64 65 62  #..          deb
16310 75 67 20 65 76 61 6c 20 7b 0d 0a 20 20 20 20 20  ug eval {..     
16320 20 20 20 20 20 20 20 70 61 63 6b 61 67 65 20 72         package r
16330 65 71 75 69 72 65 20 45 61 67 6c 65 0d 0a 20 20  equire Eagle..  
16340 20 20 20 20 20 20 20 20 20 20 70 61 63 6b 61 67            packag
16350 65 20 72 65 71 75 69 72 65 20 45 61 67 6c 65 2e  e require Eagle.
16360 4c 69 62 72 61 72 79 0d 0a 20 20 20 20 20 20 20  Library..       
16370 20 20 20 20 20 70 61 63 6b 61 67 65 20 72 65 71       package req
16380 75 69 72 65 20 45 61 67 6c 65 2e 54 65 73 74 0d  uire Eagle.Test.
16390 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
163a0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
163b0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
163c0 6f 70 79 20 74 68 65 20 6e 65 63 65 73 73 61 72  opy the necessar
163d0 79 20 76 61 72 69 61 62 6c 65 73 20 69 6e 74 6f  y variables into
163e0 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20 69 6e   the isolated in
163f0 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20  terpreter...    
16400 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
16410 20 20 20 64 65 62 75 67 20 69 6e 76 6f 6b 65 20     debug invoke 
16420 30 20 73 65 74 20 3a 3a 74 65 73 74 5f 63 68 61  0 set ::test_cha
16430 6e 6e 65 6c 20 24 63 68 61 6e 6e 65 6c 3b 20 23  nnel $channel; #
16440 20 4e 4f 54 45 3a 20 46 6f 72 20 5b 74 70 75 74   NOTE: For [tput
16450 73 5d 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 64  s]...          d
16460 65 62 75 67 20 69 6e 76 6f 6b 65 20 30 20 73 65  ebug invoke 0 se
16470 74 20 3a 3a 74 65 73 74 5f 6c 6f 67 20 24 6c 6f  t ::test_log $lo
16480 67 3b 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 5b  g; # NOTE: For [
16490 74 6c 6f 67 5d 2e 0d 0a 0d 0a 20 20 20 20 20 20  tlog].....      
164a0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
164b0 20 23 20 4e 4f 54 45 3a 20 49 6e 73 74 61 6c 6c   # NOTE: Install
164c0 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 73 63   the callback sc
164d0 72 69 70 74 20 74 6f 20 62 65 20 65 76 61 6c 75  ript to be evalu
164e0 61 74 65 64 20 69 6e 20 74 68 65 20 69 73 6f 6c  ated in the isol
164f0 61 74 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20  ated..          
16500 23 20 20 20 20 20 20 20 69 6e 74 65 72 70 72 65  #       interpre
16510 74 65 72 20 77 68 65 6e 20 74 68 69 73 20 69 6e  ter when this in
16520 74 65 72 70 72 65 74 65 72 20 69 73 20 69 6e 74  terpreter is int
16530 65 72 72 75 70 74 65 64 20 62 79 20 73 63 72 69  errupted by scri
16540 70 74 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  pt..          # 
16550 20 20 20 20 20 20 63 61 6e 63 65 6c 6c 61 74 69        cancellati
16560 6f 6e 2c 20 65 74 63 2e 0d 0a 20 20 20 20 20 20  on, etc...      
16570 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
16580 20 64 65 62 75 67 20 63 61 6c 6c 62 61 63 6b 20   debug callback 
16590 61 70 70 6c 79 20 7b 7b 73 65 6e 64 65 72 20 65  apply {{sender e
165a0 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  } {..           
165b0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
165c0 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66  # NOTE: Check if
165d0 20 74 68 69 73 20 64 65 62 75 67 67 65 72 20 63   this debugger c
165e0 61 6c 6c 62 61 63 6b 20 69 73 20 6f 6e 65 20 74  allback is one t
165f0 68 61 74 20 77 65 20 63 61 72 65 20 61 62 6f 75  hat we care abou
16600 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t...            
16610 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  #..            s
16620 65 74 20 69 6e 74 65 72 72 75 70 74 54 79 70 65  et interruptType
16630 73 20 5b 73 70 6c 69 74 20 5b 24 65 20 49 6e 74  s [split [$e Int
16640 65 72 72 75 70 74 54 79 70 65 5d 20 22 2c 20 22  erruptType] ", "
16650 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
16660 20 69 66 20 7b 22 43 61 6e 63 65 6c 65 64 22 20   if {"Canceled" 
16670 69 6e 20 24 69 6e 74 65 72 72 75 70 74 54 79 70  in $interruptTyp
16680 65 73 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20  es || \..       
16690 20 20 20 20 20 20 20 20 20 22 55 6e 77 6f 75 6e           "Unwoun
166a0 64 22 20 69 6e 20 24 69 6e 74 65 72 72 75 70 74  d" in $interrupt
166b0 54 79 70 65 73 7d 20 74 68 65 6e 20 7b 0d 0a 20  Types} then {.. 
166c0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
166d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
166e0 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75 72 65 20  NOTE: Make sure 
166f0 74 68 65 20 5b 6f 62 6a 65 63 74 5d 20 63 6f 6d  the [object] com
16700 6d 61 6e 64 20 69 73 20 61 76 61 69 6c 61 62 6c  mand is availabl
16710 65 2e 20 20 53 69 6e 63 65 0d 0a 20 20 20 20 20  e.  Since..     
16720 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
16730 20 74 68 69 73 20 69 73 20 61 6e 20 69 73 6f 6c   this is an isol
16740 61 74 65 64 20 69 6e 74 65 72 70 72 65 74 65 72  ated interpreter
16750 2c 20 63 68 65 63 6b 20 66 6f 72 20 69 74 20 74  , check for it t
16760 68 65 20 68 61 72 64 0d 0a 20 20 20 20 20 20 20  he hard..       
16770 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77         #       w
16780 61 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ay...           
16790 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
167a0 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68      if {[llength
167b0 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73 20   [info commands 
167c0 6f 62 6a 65 63 74 5d 5d 20 3e 20 30 7d 20 74 68  object]] > 0} th
167d0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
167e0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
167f0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
16800 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   Iterate through
16810 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20 63 6f   all database co
16820 6e 6e 65 63 74 69 6f 6e 73 20 6b 6e 6f 77 6e 20  nnections known 
16830 74 6f 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  to the..        
16840 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
16850 70 61 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74  parent interpret
16860 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  er...           
16870 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
16880 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66          object f
16890 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20 70 61  oreach -alias pa
168a0 69 72 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b  ir [object invok
168b0 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
168c0 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
168d0 20 20 20 20 20 20 20 20 20 20 20 24 65 20 49 6e             $e In
168e0 74 65 72 70 72 65 74 65 72 2e 63 6f 6e 6e 65 63  terpreter.connec
168f0 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20 20  tions] {..      
16900 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
16910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16920 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
16930 20 74 6f 20 63 61 6e 63 65 6c 20 61 6e 79 20 53   to cancel any S
16940 51 4c 20 71 75 65 72 69 65 73 20 69 6e 20 70 72  QL queries in pr
16950 6f 67 72 65 73 73 20 6f 6e 0d 0a 20 20 20 20 20  ogress on..     
16960 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
16970 20 20 20 20 20 74 68 69 73 20 64 61 74 61 62 61       this databa
16980 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0d 0a  se connection...
16990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
169a0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
169b0 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
169c0 68 20 7b 24 70 61 69 72 20 56 61 6c 75 65 2e 43  h {$pair Value.C
169d0 61 6e 63 65 6c 7d 20 65 72 72 6f 72 5d 7d 20 74  ancel} error]} t
169e0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
169f0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
16a00 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
16a10 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 6e 20   [appendArgs \n 
16a20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
16a30 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
16a40 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
16a50 20 74 6f 20 63 61 6e 63 65 6c 20 71 75 65 72 79   to cancel query
16a60 20 66 6f 72 20 22 20 5c 0d 0a 20 20 20 20 20 20   for " \..      
16a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a80 20 20 22 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 22    "connection \"
16a90 22 20 5b 24 70 61 69 72 20 4b 65 79 5d 20 22 5c  " [$pair Key] "\
16aa0 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  ", error: " \n\t
16ab0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
16ac0 20 20 20 20 20 20 20 20 20 20 20 20 24 65 72 72              $err
16ad0 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  or \n]..        
16ae0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
16af0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
16b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20                } 
16b10 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
16b20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
16b30 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
16b40 70 70 65 6e 64 41 72 67 73 20 5c 6e 20 5c 0d 0a  ppendArgs \n \..
16b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b60 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
16b70 47 3a 20 63 61 6e 6e 6f 74 20 63 61 6e 63 65 6c  G: cannot cancel
16b80 20 61 6e 79 20 71 75 65 72 69 65 73 3a 20 22 20   any queries: " 
16b90 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
16ba0 20 20 20 20 20 20 20 22 74 68 65 20 5c 22 6f 62         "the \"ob
16bb0 6a 65 63 74 5c 22 20 63 6f 6d 6d 61 6e 64 20 69  ject\" command i
16bc0 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 5c  s not available\
16bd0 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n"]..           
16be0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
16bf0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
16c00 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 66 69 6e  }..        } fin
16c10 61 6c 6c 79 20 7b 0d 0a 20 20 20 20 20 20 20 20  ally {..        
16c20 20 20 72 65 73 74 6f 72 65 45 6e 76 69 72 6f 6e    restoreEnviron
16c30 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20 5b 6c  mentVariables [l
16c40 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ist \..         
16c50 20 20 20 20 20 71 75 69 65 74 46 69 6e 64 49 6e       quietFindIn
16c60 74 65 72 70 72 65 74 65 72 54 65 73 74 50 61 74  terpreterTestPat
16c70 68 20 71 75 69 65 74 53 65 74 75 70 49 6e 74 65  h quietSetupInte
16c80 72 70 72 65 74 65 72 54 65 73 74 50 61 74 68 5d  rpreterTestPath]
16c90 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
16ca0 20 20 20 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30     } error] == 0
16cb0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
16cc0 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
16cd0 69 6e 74 65 72 72 75 70 74 43 61 6c 6c 62 61 63  interruptCallbac
16ce0 6b 2e 73 71 6c 69 74 65 33 0d 0a 0d 0a 20 20 20  k.sqlite3....   
16cf0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
16d00 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20  nel yes\n..     
16d10 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
16d20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
16d30 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 6e  l [appendArgs "n
16d40 6f 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  o, error: " \n\t
16d50 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20   $error \n]..   
16d60 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
16d70 20 20 20 20 70 72 6f 63 20 63 6c 65 61 6e 75 70      proc cleanup
16d80 46 69 6c 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20  File { fileName 
16d90 7b 63 6f 6c 6c 65 63 74 20 74 72 75 65 7d 20 7b  {collect true} {
16da0 66 6f 72 63 65 20 66 61 6c 73 65 7d 20 7d 20 7b  force false} } {
16db0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
16dc0 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
16dd0 20 74 6f 20 66 6f 72 63 65 20 61 6c 6c 20 70 65   to force all pe
16de0 6e 64 69 6e 67 20 22 67 61 72 62 61 67 65 22 20  nding "garbage" 
16df0 6f 62 6a 65 63 74 73 20 74 6f 20 62 65 20 63 6f  objects to be co
16e00 6c 6c 65 63 74 65 64 2c 0d 0a 20 20 20 20 20 20  llected,..      
16e10 23 20 20 20 20 20 20 20 69 6e 63 6c 75 64 69 6e  #       includin
16e20 67 20 53 51 4c 69 74 65 20 73 74 61 74 65 6d 65  g SQLite stateme
16e30 6e 74 73 20 61 6e 64 20 62 61 63 6b 75 70 20 6f  nts and backup o
16e40 62 6a 65 63 74 73 3b 20 74 68 69 73 20 73 68 6f  bjects; this sho
16e50 75 6c 64 20 61 6c 6c 6f 77 0d 0a 20 20 20 20 20  uld allow..     
16e60 20 23 20 20 20 20 20 20 20 74 68 65 20 75 6e 64   #       the und
16e70 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
16e80 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65   file to be dele
16e90 74 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ted...      #.. 
16ea0 20 20 20 20 20 69 66 20 7b 24 63 6f 6c 6c 65 63       if {$collec
16eb0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
16ec0 20 20 20 63 6f 6c 6c 65 63 74 47 61 72 62 61 67     collectGarbag
16ed0 65 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  e $::test_channe
16ee0 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  l..      }....  
16ef0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
16f00 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68  OTE: Check if th
16f10 65 20 66 69 6c 65 20 73 74 69 6c 6c 20 65 78 69  e file still exi
16f20 73 74 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  sts...      #.. 
16f30 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65       if {[file e
16f40 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d  xists $fileName]
16f50 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
16f60 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
16f70 4f 54 45 3a 20 53 6b 69 70 20 64 65 6c 65 74 69  OTE: Skip deleti
16f80 6e 67 20 74 65 73 74 20 66 69 6c 65 73 20 69 66  ng test files if
16f90 20 73 6f 6d 65 62 6f 64 79 20 73 65 74 73 20 74   somebody sets t
16fa0 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  he global variab
16fb0 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  le..        #   
16fc0 20 20 20 20 74 6f 20 70 72 65 76 65 6e 74 20 69      to prevent i
16fd0 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
16fe0 20 20 20 20 20 20 20 69 66 20 7b 24 66 6f 72 63         if {$forc
16ff0 65 20 7c 7c 20 21 5b 69 6e 66 6f 20 65 78 69 73  e || ![info exis
17000 74 73 20 3a 3a 6e 6f 28 63 6c 65 61 6e 75 70 46  ts ::no(cleanupF
17010 69 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ile)]} then {.. 
17020 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
17030 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74        # NOTE: At
17040 74 65 6d 70 74 20 74 6f 20 64 65 6c 65 74 65 20  tempt to delete 
17050 74 68 65 20 74 65 73 74 20 66 69 6c 65 20 6e 6f  the test file no
17060 77 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  w...          #.
17070 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
17080 73 65 74 20 63 6f 64 65 20 5b 63 61 74 63 68 20  set code [catch 
17090 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66 69  {file delete $fi
170a0 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72 5d 5d 7d  leName} error]]}
170b0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
170c0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
170d0 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73      # NOTE: We s
170e0 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f  omehow failed to
170f0 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65   delete the file
17100 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20  , report why... 
17110 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
17120 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
17130 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
17140 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
17150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
17160 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
17170 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 74  iled to delete t
17180 65 73 74 20 66 69 6c 65 20 5c 22 22 20 24 66 69  est file \"" $fi
17190 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  leName \..      
171a0 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 64 75            "\" du
171b0 72 69 6e 67 20 63 6c 65 61 6e 75 70 2c 20 65 72  ring cleanup, er
171c0 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72  ror: " \n\t $err
171d0 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  or \n]..        
171e0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65    }..        } e
171f0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
17200 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
17210 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68 61 74 20  NOTE: Show that 
17220 77 65 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74  we skipped delet
17230 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0d 0a 20  ing the file... 
17240 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
17250 20 20 20 20 20 20 73 65 74 20 63 6f 64 65 20 30        set code 0
17260 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70  ....          tp
17270 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
17280 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
17290 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
172a0 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
172b0 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67  skipped deleting
172c0 20 74 65 73 74 20 66 69 6c 65 20 5c 22 22 20 24   test file \"" $
172d0 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20  fileName \..    
172e0 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 64 75            "\" du
172f0 72 69 6e 67 20 63 6c 65 61 6e 75 70 5c 6e 22 5d  ring cleanup\n"]
17300 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
17310 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
17320 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
17330 23 20 4e 4f 54 45 3a 20 54 68 65 20 66 69 6c 65  # NOTE: The file
17340 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
17350 20 73 75 63 63 65 73 73 21 0d 0a 20 20 20 20 20   success!..     
17360 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65     #..        se
17370 74 20 63 6f 64 65 20 30 0d 0a 20 20 20 20 20 20  t code 0..      
17380 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
17390 6e 20 24 63 6f 64 65 0d 0a 20 20 20 20 7d 0d 0a  n $code..    }..
173a0 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 6c 65 61  ...    proc clea
173b0 6e 75 70 4d 65 6d 6f 72 79 20 7b 20 76 61 72 4e  nupMemory { varN
173c0 61 6d 65 20 7b 71 75 69 65 74 20 66 61 6c 73 65  ame {quiet false
173d0 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20  } } {..      if 
173e0 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65  {[haveSQLiteObje
173f0 63 74 43 6f 6d 6d 61 6e 64 5d 20 26 26 20 5c 0d  ctCommand] && \.
17400 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
17410 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 72 4e 61  ng length $varNa
17420 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  me] > 0} then {.
17430 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
17440 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65      # NOTE: Refe
17450 72 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69  r to the specifi
17460 65 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67  ed variable (e.g
17470 2e 20 22 63 6f 6e 6e 65 63 74 69 6f 6e 22 29 20  . "connection") 
17480 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  in the..        
17490 23 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 20  #       context 
174a0 6f 66 20 6f 75 72 20 63 61 6c 6c 65 72 2e 20 20  of our caller.  
174b0 54 68 65 20 6f 70 61 71 75 65 20 6f 62 6a 65 63  The opaque objec
174c0 74 20 68 61 6e 64 6c 65 20 66 6f 72 20 61 6e 0d  t handle for an.
174d0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
174e0 20 41 44 4f 2e 4e 45 54 20 63 6f 6e 6e 65 63 74   ADO.NET connect
174f0 69 6f 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 72  ion previously r
17500 65 74 75 72 6e 65 64 20 62 79 20 5b 67 65 74 44  eturned by [getD
17510 62 43 6f 6e 6e 65 63 74 69 6f 6e 5d 0d 0a 20 20  bConnection]..  
17520 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 68        #       sh
17530 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20 74  ould be stored t
17540 68 65 72 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  here...        #
17550 0d 0a 20 20 20 20 20 20 20 20 75 70 76 61 72 20  ..        upvar 
17560 31 20 24 76 61 72 4e 61 6d 65 20 63 6f 6e 6e 65  1 $varName conne
17570 63 74 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20  ction....       
17580 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
17590 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
175a0 69 6e 76 6f 6b 65 20 24 63 6f 6e 6e 65 63 74 69  invoke $connecti
175b0 6f 6e 20 52 65 6c 65 61 73 65 4d 65 6d 6f 72 79  on ReleaseMemory
175c0 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65 73 75  ..        } resu
175d0 6c 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  lt]} then {..   
175e0 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
175f0 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
17600 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
17610 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
17620 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
17630 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
17640 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
17650 65 64 20 74 6f 20 72 65 6c 65 61 73 65 20 64 61  ed to release da
17660 74 61 62 61 73 65 20 6d 65 6d 6f 72 79 2c 20 65  tabase memory, e
17670 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20  rror: " \..     
17680 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20             \n\t 
17690 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
176a0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
176b0 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
176c0 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67        if {[lleng
176d0 74 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64  th [info command
176e0 73 20 64 65 62 75 67 5d 5d 20 3e 20 30 7d 20 74  s debug]] > 0} t
176f0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
17700 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
17710 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31         uplevel 1
17720 20 5b 6c 69 73 74 20 64 65 62 75 67 20 70 75 72   [list debug pur
17730 67 65 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 72  ge]..        } r
17740 65 73 75 6c 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a  esult]} then {..
17750 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
17760 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
17770 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
17780 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
17790 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
177a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
177b0 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
177c0 61 69 6c 65 64 20 74 6f 20 70 75 72 67 65 20 63  ailed to purge c
177d0 61 6c 6c 20 66 72 61 6d 65 2c 20 65 72 72 6f 72  all frame, error
177e0 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  : " \..         
177f0 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73         \n\t $res
17800 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ult \n]..       
17810 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
17820 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  ...        if {[
17830 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
17840 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69     uplevel 1 [li
17850 73 74 20 64 65 62 75 67 20 63 6c 65 61 6e 75 70  st debug cleanup
17860 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65 73  ]..        } res
17870 75 6c 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ult]} then {..  
17880 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
17890 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
178a0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
178b0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
178c0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
178d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
178e0 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
178f0 6c 65 64 20 74 6f 20 63 6c 65 61 6e 75 70 20 69  led to cleanup i
17900 6e 74 65 72 70 72 65 74 65 72 2c 20 65 72 72 6f  nterpreter, erro
17910 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  r: " \..        
17920 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65          \n\t $re
17930 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  sult \n]..      
17940 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
17950 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
17960 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
17970 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c      uplevel 1 [l
17980 69 73 74 20 64 65 62 75 67 20 63 6f 6c 6c 65 63  ist debug collec
17990 74 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65  t]..        } re
179a0 73 75 6c 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  sult]} then {.. 
179b0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
179c0 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
179d0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
179e0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
179f0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
17a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
17a10 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
17a20 69 6c 65 64 20 74 6f 20 63 6f 6c 6c 65 63 74 20  iled to collect 
17a30 67 61 72 62 61 67 65 2c 20 65 72 72 6f 72 3a 20  garbage, error: 
17a40 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
17a50 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c       \n\t $resul
17a60 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  t \n]..         
17a70 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
17a80 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
17a90 0d 0a 20 20 20 20 70 72 6f 63 20 73 65 74 75 70  ..    proc setup
17aa0 4d 65 6d 6f 72 79 43 6f 75 6e 74 65 72 73 20 7b  MemoryCounters {
17ab0 20 76 61 72 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20   varName } {..  
17ac0 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c      if {[haveSQL
17ad0 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64  iteObjectCommand
17ae0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
17af0 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e     upvar 1 $varN
17b00 61 6d 65 20 63 6f 75 6e 74 65 72 0d 0a 0d 0a 20  ame counter.... 
17b10 20 20 20 20 20 20 20 73 65 74 20 63 6f 75 6e 74         set count
17b20 65 72 28 31 29 20 5b 6f 62 6a 65 63 74 20 63 72  er(1) [object cr
17b30 65 61 74 65 20 2d 61 6c 69 61 73 20 5c 0d 0a 20  eate -alias \.. 
17b40 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
17b50 6d 2e 44 69 61 67 6e 6f 73 74 69 63 73 2e 50 65  m.Diagnostics.Pe
17b60 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72  rformanceCounter
17b70 20 50 72 6f 63 65 73 73 20 5c 0d 0a 20 20 20 20   Process \..    
17b80 20 20 20 20 20 20 20 20 22 57 6f 72 6b 69 6e 67          "Working
17b90 20 53 65 74 22 20 5b 66 69 6c 65 20 72 6f 6f 74   Set" [file root
17ba0 6e 61 6d 65 20 5b 66 69 6c 65 20 74 61 69 6c 20  name [file tail 
17bb0 24 3a 3a 62 69 6e 5f 66 69 6c 65 5d 5d 5d 0d 0a  $::bin_file]]]..
17bc0 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f  ..        set co
17bd0 75 6e 74 65 72 28 32 29 20 5b 6f 62 6a 65 63 74  unter(2) [object
17be0 20 63 72 65 61 74 65 20 2d 61 6c 69 61 73 20 5c   create -alias \
17bf0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79  ..            Sy
17c00 73 74 65 6d 2e 44 69 61 67 6e 6f 73 74 69 63 73  stem.Diagnostics
17c10 2e 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e  .PerformanceCoun
17c20 74 65 72 20 50 72 6f 63 65 73 73 20 5c 0d 0a 20  ter Process \.. 
17c30 20 20 20 20 20 20 20 20 20 20 20 22 57 6f 72 6b             "Work
17c40 69 6e 67 20 53 65 74 20 50 65 61 6b 22 20 5b 66  ing Set Peak" [f
17c50 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 5b 66 69  ile rootname [fi
17c60 6c 65 20 74 61 69 6c 20 24 3a 3a 62 69 6e 5f 66  le tail $::bin_f
17c70 69 6c 65 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  ile]]]....      
17c80 20 20 73 65 74 20 63 6f 75 6e 74 65 72 28 33 29    set counter(3)
17c90 20 5b 6f 62 6a 65 63 74 20 63 72 65 61 74 65 20   [object create 
17ca0 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20 20  -alias \..      
17cb0 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 69 61        System.Dia
17cc0 67 6e 6f 73 74 69 63 73 2e 50 65 72 66 6f 72 6d  gnostics.Perform
17cd0 61 6e 63 65 43 6f 75 6e 74 65 72 20 50 72 6f 63  anceCounter Proc
17ce0 65 73 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ess \..         
17cf0 20 20 20 22 50 72 69 76 61 74 65 20 42 79 74 65     "Private Byte
17d00 73 22 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d  s" [file rootnam
17d10 65 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 3a 3a  e [file tail $::
17d20 62 69 6e 5f 66 69 6c 65 5d 5d 5d 0d 0a 20 20 20  bin_file]]]..   
17d30 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
17d40 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 7d 0d 0a  turn ""..    }..
17d50 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 65 70 6f  ...    proc repo
17d60 72 74 4d 65 6d 6f 72 79 43 6f 75 6e 74 65 72 73  rtMemoryCounters
17d70 20 7b 20 63 68 61 6e 6e 65 6c 20 76 61 72 4e 61   { channel varNa
17d80 6d 65 20 70 72 65 66 69 78 20 7d 20 7b 0d 0a 20  me prefix } {.. 
17d90 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51       if {[haveSQ
17da0 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e  LiteObjectComman
17db0 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  d]} then {..    
17dc0 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72      upvar 1 $var
17dd0 4e 61 6d 65 20 63 6f 75 6e 74 65 72 0d 0a 0d 0a  Name counter....
17de0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
17df0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
17e00 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
17e10 20 20 22 2d 2d 2d 2d 20 22 20 24 70 72 65 66 69    "---- " $prefi
17e20 78 20 22 20 63 6f 75 6e 74 65 72 20 5c 22 22 20  x " counter \"" 
17e30 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
17e40 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24 63  object invoke $c
17e50 6f 75 6e 74 65 72 28 31 29 20 43 6f 75 6e 74 65  ounter(1) Counte
17e60 72 4e 61 6d 65 5d 20 22 5c 22 20 76 61 6c 75 65  rName] "\" value
17e70 20 69 73 20 22 20 5c 0d 0a 20 20 20 20 20 20 20   is " \..       
17e80 20 20 20 20 20 5b 6f 62 6a 65 63 74 20 69 6e 76       [object inv
17e90 6f 6b 65 20 24 63 6f 75 6e 74 65 72 28 31 29 20  oke $counter(1) 
17ea0 52 61 77 56 61 6c 75 65 5d 20 5c 6e 5d 0d 0a 0d  RawValue] \n]...
17eb0 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
17ec0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
17ed0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
17ee0 20 20 20 22 2d 2d 2d 2d 20 22 20 24 70 72 65 66     "---- " $pref
17ef0 69 78 20 22 20 63 6f 75 6e 74 65 72 20 5c 22 22  ix " counter \""
17f00 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
17f10 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24  [object invoke $
17f20 63 6f 75 6e 74 65 72 28 32 29 20 43 6f 75 6e 74  counter(2) Count
17f30 65 72 4e 61 6d 65 5d 20 22 5c 22 20 76 61 6c 75  erName] "\" valu
17f40 65 20 69 73 20 22 20 5c 0d 0a 20 20 20 20 20 20  e is " \..      
17f50 20 20 20 20 20 20 5b 6f 62 6a 65 63 74 20 69 6e        [object in
17f60 76 6f 6b 65 20 24 63 6f 75 6e 74 65 72 28 32 29  voke $counter(2)
17f70 20 52 61 77 56 61 6c 75 65 5d 20 5c 6e 5d 0d 0a   RawValue] \n]..
17f80 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
17f90 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
17fa0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
17fb0 20 20 20 20 22 2d 2d 2d 2d 20 22 20 24 70 72 65      "---- " $pre
17fc0 66 69 78 20 22 20 63 6f 75 6e 74 65 72 20 5c 22  fix " counter \"
17fd0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
17fe0 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   [object invoke 
17ff0 24 63 6f 75 6e 74 65 72 28 33 29 20 43 6f 75 6e  $counter(3) Coun
18000 74 65 72 4e 61 6d 65 5d 20 22 5c 22 20 76 61 6c  terName] "\" val
18010 75 65 20 69 73 20 22 20 5c 0d 0a 20 20 20 20 20  ue is " \..     
18020 20 20 20 20 20 20 20 5b 6f 62 6a 65 63 74 20 69         [object i
18030 6e 76 6f 6b 65 20 24 63 6f 75 6e 74 65 72 28 33  nvoke $counter(3
18040 29 20 52 61 77 56 61 6c 75 65 5d 20 5c 6e 5d 0d  ) RawValue] \n].
18050 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
18060 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 6f 6c  ....    proc col
18070 6c 65 63 74 47 61 72 62 61 67 65 20 7b 20 63 68  lectGarbage { ch
18080 61 6e 6e 65 6c 20 7b 6d 69 6c 6c 69 73 65 63 6f  annel {milliseco
18090 6e 64 73 20 31 30 30 30 7d 20 7b 71 75 69 65 74  nds 1000} {quiet
180a0 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20   true} } {..    
180b0 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74    if {[haveSQLit
180c0 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d  eObjectCommand]}
180d0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
180e0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
180f0 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
18100 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54 6f 74  invoke GC GetTot
18110 61 6c 4d 65 6d 6f 72 79 20 66 61 6c 73 65 0d 0a  alMemory false..
18120 20 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74          } result
18130 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
18140 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
18150 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
18160 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
18170 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
18180 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
18190 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6d           "---- m
181a0 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20  emory in use by 
181b0 74 68 65 20 43 4c 52 20 62 65 66 6f 72 65 20 63  the CLR before c
181c0 6f 6c 6c 65 63 74 69 6f 6e 2e 2e 2e 20 22 20 5c  ollection... " \
181d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
181e0 20 20 24 72 65 73 75 6c 74 20 22 20 62 79 74 65    $result " byte
181f0 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  s\n"]..         
18200 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c   }..        } el
18210 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
18220 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
18230 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
18240 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
18250 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
18260 64 20 74 6f 20 67 65 74 20 43 4c 52 20 6d 65 6d  d to get CLR mem
18270 6f 72 79 20 75 73 61 67 65 2c 20 65 72 72 6f 72  ory usage, error
18280 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  : " \..         
18290 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c       \n\t $resul
182a0 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d  t \n]..        }
182b0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
182c0 20 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23     #############
182d0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
182e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
182f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18300 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a  ############....
18310 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
18320 20 4e 4f 54 45 3a 20 52 65 70 65 61 74 65 64 6c   NOTE: Repeatedl
18330 79 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6f 6c  y attempt to col
18340 6c 65 63 74 20 67 61 72 62 61 67 65 20 75 6e 74  lect garbage unt
18350 69 6c 20 74 68 65 20 61 6c 6c 6f 74 74 65 64 20  il the allotted 
18360 6e 75 6d 62 65 72 0d 0a 20 20 20 20 20 20 23 20  number..      # 
18370 20 20 20 20 20 20 6f 66 20 6d 69 6c 6c 69 73 65        of millise
18380 63 6f 6e 64 73 20 68 61 73 20 65 6c 61 70 73 65  conds has elapse
18390 64 2e 20 20 41 6c 77 61 79 73 20 61 74 74 65 6d  d.  Always attem
183a0 70 74 20 74 6f 20 63 6f 6c 6c 65 63 74 20 67 61  pt to collect ga
183b0 72 62 61 67 65 0d 0a 20 20 20 20 20 20 23 20 20  rbage..      #  
183c0 20 20 20 20 20 61 74 20 6c 65 61 73 74 20 6f 6e       at least on
183d0 63 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ce...      #..  
183e0 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c      if {[haveSQL
183f0 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64  iteObjectCommand
18400 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
18410 20 20 20 73 65 74 20 73 74 61 72 74 20 5b 63 6c     set start [cl
18420 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 0d 0a 20 20  ock seconds]..  
18430 20 20 20 20 20 20 73 65 74 20 73 74 6f 70 20 5b        set stop [
18440 65 78 70 72 20 7b 24 73 74 61 72 74 20 2b 20 28  expr {$start + (
18450 24 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 2f 20  $milliseconds / 
18460 31 30 30 30 29 7d 5d 0d 0a 0d 0a 20 20 20 20 20  1000)}]....     
18470 20 20 20 64 6f 20 7b 0d 0a 20 20 20 20 20 20 20     do {..       
18480 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
18490 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
184a0 74 6f 20 66 6f 72 63 65 20 61 20 66 75 6c 6c 20  to force a full 
184b0 67 61 72 62 61 67 65 20 63 6f 6c 6c 65 63 74 69  garbage collecti
184c0 6f 6e 20 6e 6f 77 2e 20 20 52 65 70 6f 72 74 20  on now.  Report 
184d0 61 6e 79 0d 0a 20 20 20 20 20 20 20 20 20 20 23  any..          #
184e0 20 20 20 20 20 20 20 65 72 72 6f 72 20 74 68 61         error tha
184f0 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  t is encountered
18500 20 69 66 20 77 65 20 66 61 69 6c 2e 0d 0a 20 20   if we fail...  
18510 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
18520 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
18530 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  {..            o
18540 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47 43 20  bject invoke GC 
18550 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 74  GetTotalMemory t
18560 72 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  rue..          }
18570 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d   error]} then {.
18580 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
18590 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
185a0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
185b0 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
185c0 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
185d0 20 66 75 6c 6c 20 67 61 72 62 61 67 65 20 63 6f   full garbage co
185e0 6c 6c 65 63 74 69 6f 6e 2c 20 65 72 72 6f 72 3a  llection, error:
185f0 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
18600 20 20 20 20 20 20 5c 6e 5c 74 20 24 65 72 72 6f        \n\t $erro
18610 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  r \n]..         
18620 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
18630 73 65 74 20 6e 6f 77 20 5b 63 6c 6f 63 6b 20 73  set now [clock s
18640 65 63 6f 6e 64 73 5d 0d 0a 20 20 20 20 20 20 20  econds]..       
18650 20 7d 20 77 68 69 6c 65 20 7b 24 73 74 61 72 74   } while {$start
18660 20 3c 3d 20 24 6e 6f 77 20 26 26 20 24 6e 6f 77   <= $now && $now
18670 20 3c 20 24 73 74 6f 70 7d 0d 0a 20 20 20 20 20   < $stop}..     
18680 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 23 23 23   }....      ####
18690 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
186a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
186b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
186c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
186d0 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20 20 69  #####....      i
186e0 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62  f {[haveSQLiteOb
186f0 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68  jectCommand]} th
18700 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
18710 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
18720 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
18730 6f 6b 65 20 47 43 20 47 65 74 54 6f 74 61 6c 4d  oke GC GetTotalM
18740 65 6d 6f 72 79 20 66 61 6c 73 65 0d 0a 20 20 20  emory false..   
18750 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d       } result] =
18760 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
18770 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
18780 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
18790 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
187a0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
187b0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
187c0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6d 65 6d 6f        "---- memo
187d0 72 79 20 69 6e 20 75 73 65 20 62 79 20 74 68 65  ry in use by the
187e0 20 43 4c 52 20 61 66 74 65 72 20 63 6f 6c 6c 65   CLR after colle
187f0 63 74 69 6f 6e 2e 2e 2e 20 22 20 5c 0d 0a 20 20  ction... " \..  
18800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 72                $r
18810 65 73 75 6c 74 20 22 20 62 79 74 65 73 5c 6e 22  esult " bytes\n"
18820 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
18830 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
18840 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
18850 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
18860 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
18870 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
18880 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
18890 20 67 65 74 20 43 4c 52 20 6d 65 6d 6f 72 79 20   get CLR memory 
188a0 75 73 61 67 65 2c 20 65 72 72 6f 72 3a 20 22 20  usage, error: " 
188b0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
188c0 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e   \n\t $result \n
188d0 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
188e0 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
188f0 0a 20 20 20 20 70 72 6f 63 20 67 65 74 53 51 4c  .    proc getSQL
18900 69 74 65 48 61 6e 64 6c 65 43 6f 75 6e 74 73 20  iteHandleCounts 
18910 7b 20 63 68 61 6e 6e 65 6c 20 7b 71 75 69 65 74  { channel {quiet
18920 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20   false} } {..   
18930 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 6c     set result [l
18940 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  ist]....      if
18950 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a   {[haveSQLiteObj
18960 65 63 74 43 6f 6d 6d 61 6e 64 5d 20 26 26 20 5b  ectCommand] && [
18970 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5c  haveConstraint \
18980 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18990 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 2e 53  defineConstant.S
189a0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
189b0 65 2e 43 4f 55 4e 54 5f 48 41 4e 44 4c 45 5d 7d  e.COUNT_HANDLE]}
189c0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
189d0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
189e0 54 45 3a 20 41 64 64 20 65 61 63 68 20 63 72 69  TE: Add each cri
189f0 74 69 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75  tical handle cou
18a00 6e 74 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74  nt to the result
18a10 69 6e 67 20 6c 69 73 74 2e 0d 0a 20 20 20 20 20  ing list...     
18a20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 66 6f     #..        fo
18a30 72 65 61 63 68 20 6e 61 6d 65 20 5b 6c 69 73 74  reach name [list
18a40 20 63 6f 6e 6e 65 63 74 69 6f 6e 43 6f 75 6e 74   connectionCount
18a50 20 73 74 61 74 65 6d 65 6e 74 43 6f 75 6e 74 20   statementCount 
18a60 62 61 63 6b 75 70 43 6f 75 6e 74 5d 20 7b 0d 0a  backupCount] {..
18a70 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63            if {[c
18a80 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
18a90 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
18aa0 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
18ab0 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
18ac0 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
18ad0 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65  ta.SQLite.Unsafe
18ae0 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20 24 6e  NativeMethods $n
18af0 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  ame..          }
18b00 20 76 61 6c 75 65 5d 20 3d 3d 20 30 7d 20 74 68   value] == 0} th
18b10 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
18b20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
18b30 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
18b40 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
18b50 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
18b60 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
18b70 20 20 20 20 20 22 2d 2d 2d 2d 20 63 72 69 74 69       "---- criti
18b80 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74  cal handle count
18b90 20 5c 22 22 20 24 6e 61 6d 65 20 22 5c 22 20 69   \"" $name "\" i
18ba0 73 20 22 20 24 76 61 6c 75 65 20 5c 6e 5d 0d 0a  s " $value \n]..
18bb0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
18bc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70  .            lap
18bd0 70 65 6e 64 20 72 65 73 75 6c 74 20 24 76 61 6c  pend result $val
18be0 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  ue..          } 
18bf0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
18c00 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
18c10 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
18c20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18c30 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
18c40 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 63   failed to get c
18c50 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65 20 63  ritical handle c
18c60 6f 75 6e 74 20 5c 22 22 20 5c 0d 0a 20 20 20 20  ount \"" \..    
18c70 20 20 20 20 20 20 20 20 20 20 20 20 24 6e 61 6d              $nam
18c80 65 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20  e "\", error: " 
18c90 5c 6e 5c 74 20 24 76 61 6c 75 65 20 5c 6e 5d 0d  \n\t $value \n].
18ca0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
18cb0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
18cc0 20 65 6c 73 65 69 66 20 7b 21 24 71 75 69 65 74   elseif {!$quiet
18cd0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
18ce0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
18cf0 4f 54 45 3a 20 54 68 65 20 61 63 74 75 61 6c 20  OTE: The actual 
18d00 68 61 6e 64 6c 65 20 63 6f 75 6e 74 73 20 61 72  handle counts ar
18d10 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 3b  e not available;
18d20 20 74 68 65 72 65 66 6f 72 65 2c 20 6a 75 73 74   therefore, just
18d30 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
18d40 20 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74    return an empt
18d50 79 20 6c 69 73 74 2e 0d 0a 20 20 20 20 20 20 20  y list...       
18d60 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   #..        tput
18d70 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
18d80 20 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65   critical handle
18d90 20 63 6f 75 6e 74 73 20 75 6e 61 76 61 69 6c 61   counts unavaila
18da0 62 6c 65 5c 6e 22 0d 0a 20 20 20 20 20 20 7d 0d  ble\n"..      }.
18db0 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
18dc0 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a  $result..    }..
18dd0 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 68 75 74  ...    proc shut
18de0 64 6f 77 6e 53 51 4c 69 74 65 20 7b 20 63 68 61  downSQLite { cha
18df0 6e 6e 65 6c 20 7b 66 6f 72 63 65 20 66 61 6c 73  nnel {force fals
18e00 65 7d 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d  e} {quiet false}
18e10 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
18e20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 6b       # NOTE: Mak
18e30 65 20 73 75 72 65 20 74 68 61 74 20 53 51 4c 69  e sure that SQLi
18e40 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20  te core library 
18e50 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 73 68  is completely sh
18e60 75 74 64 6f 77 6e 2e 20 20 54 68 69 73 0d 0a 20  utdown.  This.. 
18e70 20 20 20 20 20 23 20 20 20 20 20 20 20 69 73 20       #       is 
18e80 75 73 65 64 20 62 79 20 74 65 73 74 73 20 74 68  used by tests th
18e90 61 74 20 63 68 61 6e 67 65 20 63 6f 6e 66 69 67  at change config
18ea0 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20  uration options 
18eb0 61 6e 64 2f 6f 72 20 74 68 6f 73 65 0d 0a 20 20  and/or those..  
18ec0 20 20 20 20 23 20 20 20 20 20 20 20 74 68 61 74      #       that
18ed0 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75   need to make su
18ee0 72 65 20 6c 6f 67 67 69 6e 67 20 69 73 20 69 6e  re logging is in
18ef0 69 74 69 61 6c 69 7a 65 64 20 28 69 2e 65 2e 20  itialized (i.e. 
18f00 6a 75 73 74 20 69 6e 20 63 61 73 65 0d 0a 20 20  just in case..  
18f10 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
18f20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72  SQLite core libr
18f30 61 72 79 20 77 61 73 20 69 6e 69 74 69 61 6c 69  ary was initiali
18f40 7a 65 64 20 69 6e 20 74 68 65 20 70 72 6f 63 65  zed in the proce
18f50 73 73 20 70 72 69 6f 72 20 74 6f 0d 0a 20 20 20  ss prior to..   
18f60 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 53     #       the S
18f70 51 4c 69 74 65 4c 6f 67 20 63 6c 61 73 73 20 62  QLiteLog class b
18f80 65 69 6e 67 20 61 62 6c 65 20 74 6f 20 73 65 74  eing able to set
18f90 75 70 20 69 74 73 20 6c 6f 67 67 69 6e 67 20 63  up its logging c
18fa0 61 6c 6c 62 61 63 6b 29 2e 0d 0a 20 20 20 20 20  allback)...     
18fb0 20 23 20 20 20 20 20 20 20 4e 6f 72 6d 61 6c 6c   #       Normall
18fc0 79 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6f  y, this should o
18fd0 6e 6c 79 20 62 65 20 70 65 72 66 6f 72 6d 65 64  nly be performed
18fe0 20 69 66 20 53 51 4c 69 74 65 20 69 73 20 6c 6f   if SQLite is lo
18ff0 61 64 65 64 20 61 6e 64 0d 0a 20 20 20 20 20 20  aded and..      
19000 23 20 20 20 20 20 20 20 72 65 61 64 79 20 66 6f  #       ready fo
19010 72 20 75 73 65 20 62 79 20 74 68 65 20 74 65 73  r use by the tes
19020 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20  t suite...      
19030 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 66 6f  #..      if {$fo
19040 72 63 65 20 7c 7c 20 5b 69 73 53 51 4c 69 74 65  rce || [isSQLite
19050 52 65 61 64 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  Ready]} then {..
19060 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
19070 20 20 20 23 20 42 55 47 46 49 58 3a 20 4d 61 6b     # BUGFIX: Mak
19080 65 20 73 75 72 65 20 74 68 61 74 20 61 6e 79 20  e sure that any 
19090 22 6c 65 61 6b 65 64 22 20 74 72 61 6e 73 61 63  "leaked" transac
190a0 74 69 6f 6e 73 20 61 6e 64 2f 6f 72 20 63 6f 6e  tions and/or con
190b0 6e 65 63 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20  nections..      
190c0 20 20 23 20 20 20 20 20 20 20 20 20 61 72 65 20    #         are 
190d0 63 6c 65 61 6e 65 64 20 75 70 20 62 65 66 6f 72  cleaned up befor
190e0 65 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 6e 61  e calling the na
190f0 74 69 76 65 20 73 68 75 74 64 6f 77 6e 20 66 75  tive shutdown fu
19100 6e 63 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20  nction...       
19110 20 23 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65   #..        fore
19120 61 63 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ach transaction 
19130 5b 69 6e 66 6f 20 74 72 61 6e 73 61 63 74 69 6f  [info transactio
19140 6e 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  ns] {..         
19150 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74   if {[string mat
19160 63 68 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ch \..          
19170 20 20 20 20 53 79 73 74 65 6d 23 44 61 74 61 23      System#Data#
19180 53 51 4c 69 74 65 23 53 51 4c 69 74 65 54 72 61  SQLite#SQLiteTra
19190 6e 73 61 63 74 69 6f 6e 23 2a 20 24 74 72 61 6e  nsaction#* $tran
191a0 73 61 63 74 69 6f 6e 5d 7d 20 74 68 65 6e 20 7b  saction]} then {
191b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
191c0 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
191d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 20 74 72            sql tr
191e0 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61  ansaction rollba
191f0 63 6b 20 24 74 72 61 6e 73 61 63 74 69 6f 6e 0d  ck $transaction.
19200 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65  .            } e
19210 72 72 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  rror] == 0} then
19220 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
19230 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
19240 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
19250 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
19260 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
19270 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
19280 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 72           "---- r
19290 6f 6c 6c 65 64 20 62 61 63 6b 20 6c 65 61 6b 65  olled back leake
192a0 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 5c 22  d transaction \"
192b0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
192c0 20 20 20 20 20 20 20 20 20 24 74 72 61 6e 73 61           $transa
192d0 63 74 69 6f 6e 20 5c 22 5c 6e 5d 0d 0a 20 20 20  ction \"\n]..   
192e0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
192f0 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
19300 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
19310 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
19320 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
19330 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
19340 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
19350 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
19360 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
19370 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
19380 6f 20 72 6f 6c 6c 62 61 63 6b 20 6c 65 61 6b 65  o rollback leake
19390 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 5c 22  d transaction \"
193a0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
193b0 20 20 20 20 20 20 20 20 20 24 74 72 61 6e 73 61           $transa
193c0 63 74 69 6f 6e 20 22 5c 22 2c 20 65 72 72 6f 72  ction "\", error
193d0 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20  : " \n\t $error 
193e0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n]..           
193f0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
19400 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
19410 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
19420 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 64         foreach d
19430 62 20 5b 69 6e 66 6f 20 63 6f 6e 6e 65 63 74 69  b [info connecti
19440 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20  ons] {..        
19450 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61    if {[string ma
19460 74 63 68 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  tch \..         
19470 20 20 20 20 20 53 79 73 74 65 6d 23 44 61 74 61       System#Data
19480 23 53 51 4c 69 74 65 23 53 51 4c 69 74 65 43 6f  #SQLite#SQLiteCo
19490 6e 6e 65 63 74 69 6f 6e 23 2a 20 24 64 62 5d 7d  nnection#* $db]}
194a0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
194b0 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
194c0 7b 73 71 6c 20 63 6c 6f 73 65 20 24 64 62 7d 20  {sql close $db} 
194d0 65 72 72 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65  error] == 0} the
194e0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
194f0 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
19500 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
19510 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
19520 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
19530 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
19540 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
19550 63 6c 6f 73 65 64 20 6c 65 61 6b 65 64 20 64 61  closed leaked da
19560 74 61 62 61 73 65 20 5c 22 22 20 24 64 62 20 5c  tabase \"" $db \
19570 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  "\n]..          
19580 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
19590 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
195a0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
195b0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
195c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195d0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
195e0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
195f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19600 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
19610 20 66 61 69 6c 65 64 20 74 6f 20 63 6c 6f 73 65   failed to close
19620 20 6c 65 61 6b 65 64 20 64 61 74 61 62 61 73 65   leaked database
19630 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
19640 20 20 20 20 20 20 20 20 20 20 20 20 24 64 62 20              $db 
19650 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e  "\", error: " \n
19660 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20  \t $error \n].. 
19670 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
19680 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
19690 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
196a0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
196b0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 42 55   #..        # BU
196c0 47 46 49 58 3a 20 42 65 66 6f 72 65 20 63 61 6c  GFIX: Before cal
196d0 6c 69 6e 67 20 74 68 65 20 6e 61 74 69 76 65 20  ling the native 
196e0 73 68 75 74 64 6f 77 6e 20 66 75 6e 63 74 69 6f  shutdown functio
196f0 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 62 6f 74  n, make sure bot
19700 68 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  h..        #    
19710 20 20 20 20 20 6f 66 20 74 68 65 20 50 52 41 47       of the PRAG
19720 4d 41 20 72 65 6c 61 74 65 64 20 64 69 72 65 63  MA related direc
19730 74 6f 72 79 20 6e 61 6d 65 73 20 61 72 65 20 66  tory names are f
19740 72 65 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23  reed...        #
19750 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46  ..        checkF
19760 6f 72 53 51 4c 69 74 65 44 69 72 65 63 74 6f 72  orSQLiteDirector
19770 69 65 73 20 24 63 68 61 6e 6e 65 6c 20 74 72 75  ies $channel tru
19780 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  e....        if 
19790 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
197a0 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
197b0 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
197c0 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
197d0 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
197e0 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e  a.SQLite.UnsafeN
197f0 61 74 69 76 65 4d 65 74 68 6f 64 73 20 73 71 6c  ativeMethods sql
19800 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 0d 0a 20  ite3_shutdown.. 
19810 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d         } result]
19820 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
19830 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
19840 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
19850 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
19860 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
19870 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
19880 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61          "---- ca
19890 6c 6c 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64  ll sqlite3_shutd
198a0 6f 77 6e 28 29 2e 2e 2e 20 6f 6b 3a 20 22 20 24  own()... ok: " $
198b0 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20  result \n]..    
198c0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
198d0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
198e0 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
198f0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
19900 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
19910 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
19920 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
19930 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73      "---- call s
19940 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28  qlite3_shutdown(
19950 29 2e 2e 2e 20 65 72 72 6f 72 3a 20 22 20 5c 6e  )... error: " \n
19960 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a  \t $result \n]..
19970 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
19980 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
19990 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
199a0 72 6f 63 20 72 65 70 6f 72 74 53 51 4c 69 74 65  roc reportSQLite
199b0 52 65 73 6f 75 72 63 65 73 20 7b 0d 0a 20 20 20  Resources {..   
199c0 20 20 20 20 20 20 20 20 20 63 68 61 6e 6e 65 6c           channel
199d0 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7b   {quiet false} {
199e0 72 65 73 65 74 20 74 72 75 65 7d 20 7b 63 6f 6c  reset true} {col
199f0 6c 65 63 74 20 74 72 75 65 7d 20 7d 20 7b 0d 0a  lect true} } {..
19a00 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
19a10 20 4e 4f 54 45 3a 20 49 66 20 61 76 61 69 6c 61   NOTE: If availa
19a20 62 6c 65 2c 20 72 65 70 6f 72 74 20 6f 6e 20 28  ble, report on (
19a30 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 72 65 73  and possibly res
19a40 65 74 29 20 74 68 65 20 72 75 6e 74 69 6d 65 0d  et) the runtime.
19a50 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
19a60 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 74 61  onfiguration sta
19a70 74 69 73 74 69 63 73 2e 0d 0a 20 20 20 20 20 20  tistics...      
19a80 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61  #..      if {[ha
19a90 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f  veSQLiteObjectCo
19aa0 6d 6d 61 6e 64 5d 20 26 26 20 5c 0d 0a 20 20 20  mmand] && \..   
19ab0 20 20 20 20 20 20 20 5b 68 61 76 65 43 6f 6e 73         [haveCons
19ac0 74 72 61 69 6e 74 20 62 75 69 6c 64 43 6f 6e 66  traint buildConf
19ad0 69 67 75 72 61 74 69 6f 6e 2e 44 65 62 75 67 5d  iguration.Debug]
19ae0 20 26 26 20 5b 63 61 74 63 68 20 7b 0d 0a 20 20   && [catch {..  
19af0 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
19b00 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
19b10 75 62 6c 69 63 20 2d 61 6c 69 61 73 20 5c 0d 0a  ublic -alias \..
19b20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
19b30 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55  em.Data.SQLite.U
19b40 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
19b50 64 73 20 73 65 74 74 69 6e 67 52 65 61 64 43 6f  ds settingReadCo
19b60 75 6e 74 73 0d 0a 20 20 20 20 20 20 7d 20 73 65  unts..      } se
19b70 74 74 69 6e 67 52 65 61 64 43 6f 75 6e 74 73 5d  ttingReadCounts]
19b80 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
19b90 20 20 20 20 20 20 20 73 65 74 20 6e 61 6d 65 43         set nameC
19ba0 6f 75 6e 74 20 5b 24 73 65 74 74 69 6e 67 52 65  ount [$settingRe
19bb0 61 64 43 6f 75 6e 74 73 20 43 6f 75 6e 74 5d 0d  adCounts Count].
19bc0 0a 20 20 20 20 20 20 20 20 73 65 74 20 76 61 6c  .        set val
19bd0 75 65 43 6f 75 6e 74 20 30 0d 0a 0d 0a 20 20 20  ueCount 0....   
19be0 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65       object fore
19bf0 61 63 68 20 2d 61 6c 69 61 73 20 70 61 69 72 20  ach -alias pair 
19c00 24 73 65 74 74 69 6e 67 52 65 61 64 43 6f 75 6e  $settingReadCoun
19c10 74 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ts {..          
19c20 69 6e 63 72 20 76 61 6c 75 65 43 6f 75 6e 74 20  incr valueCount 
19c30 5b 24 70 61 69 72 20 56 61 6c 75 65 5d 0d 0a 0d  [$pair Value]...
19c40 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
19c50 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
19c60 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
19c70 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
19c80 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
19c90 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
19ca0 73 65 74 74 69 6e 67 20 5c 22 22 20 5b 24 70 61  setting \"" [$pa
19cb0 69 72 20 4b 65 79 5d 20 22 5c 22 20 77 61 73 20  ir Key] "\" was 
19cc0 72 65 61 64 20 22 20 5c 0d 0a 20 20 20 20 20 20  read " \..      
19cd0 20 20 20 20 20 20 20 20 20 20 5b 24 70 61 69 72            [$pair
19ce0 20 56 61 6c 75 65 5d 20 22 20 74 69 6d 65 73 5c   Value] " times\
19cf0 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  n"]..          }
19d00 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
19d10 20 20 20 20 20 20 20 69 66 20 7b 24 72 65 73 65         if {$rese
19d20 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
19d30 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
19d40 7b 24 73 65 74 74 69 6e 67 52 65 61 64 43 6f 75  {$settingReadCou
19d50 6e 74 73 20 43 6c 65 61 72 7d 20 65 72 72 6f 72  nts Clear} error
19d60 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
19d70 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
19d80 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
19d90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
19da0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
19db0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
19dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
19dd0 2d 2d 2d 2d 20 72 65 73 65 74 20 73 65 74 74 69  ---- reset setti
19de0 6e 67 20 73 74 61 74 69 73 74 69 63 73 20 66 6f  ng statistics fo
19df0 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 22  r the previous "
19e00 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
19e10 20 20 20 20 20 20 24 6e 61 6d 65 43 6f 75 6e 74        $nameCount
19e20 20 22 20 6e 61 6d 65 73 20 61 6e 64 20 22 20 24   " names and " $
19e30 76 61 6c 75 65 43 6f 75 6e 74 20 22 20 76 61 6c  valueCount " val
19e40 75 65 73 20 72 65 61 64 5c 6e 22 5d 0d 0a 20 20  ues read\n"]..  
19e50 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
19e60 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
19e70 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
19e80 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
19e90 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
19ea0 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
19eb0 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
19ec0 20 74 6f 20 72 65 73 65 74 20 73 65 74 74 69 6e   to reset settin
19ed0 67 20 73 74 61 74 69 73 74 69 63 73 20 66 6f 72  g statistics for
19ee0 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
19ef0 20 20 20 20 20 20 22 74 68 65 20 70 72 65 76 69        "the previ
19f00 6f 75 73 20 22 20 24 6e 61 6d 65 43 6f 75 6e 74  ous " $nameCount
19f10 20 22 20 6e 61 6d 65 73 20 61 6e 64 20 22 20 24   " names and " $
19f20 76 61 6c 75 65 43 6f 75 6e 74 20 5c 0d 0a 20 20  valueCount \..  
19f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
19f40 76 61 6c 75 65 73 20 72 65 61 64 2c 20 65 72 72  values read, err
19f50 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f  or: " \n\t $erro
19f60 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  r \n]..         
19f70 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
19f80 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
19f90 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f  if {[haveSQLiteO
19fa0 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 20 26 26  bjectCommand] &&
19fb0 20 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74   [haveConstraint
19fc0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
19fd0 20 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74    defineConstant
19fe0 2e 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  .System.Data.SQL
19ff0 69 74 65 2e 49 4e 54 45 52 4f 50 5f 56 49 52 54  ite.INTEROP_VIRT
1a000 55 41 4c 5f 54 41 42 4c 45 5d 20 26 26 20 5c 0d  UAL_TABLE] && \.
1a010 0a 20 20 20 20 20 20 20 20 20 20 5b 68 61 76 65  .          [have
1a020 43 6f 6e 73 74 72 61 69 6e 74 20 5c 0d 0a 20 20  Constraint \..  
1a030 20 20 20 20 20 20 20 20 20 20 20 20 64 65 66 69              defi
1a040 6e 65 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74 65  neConstant.Syste
1a050 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 54 52  m.Data.SQLite.TR
1a060 41 43 4b 5f 4d 45 4d 4f 52 59 5f 42 59 54 45 53  ACK_MEMORY_BYTES
1a070 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1a080 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
1a090 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1a0a0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1a0b0 20 22 2d 2d 2d 2d 20 63 75 72 72 65 6e 74 20 6d   "---- current m
1a0c0 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20  emory in use by 
1a0d0 53 51 4c 69 74 65 4d 65 6d 6f 72 79 2e 2e 2e 20  SQLiteMemory... 
1a0e0 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  "..        }....
1a0f0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
1a100 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
1a110 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
1a120 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
1a130 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1a140 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
1a150 69 74 65 2e 53 51 4c 69 74 65 4d 65 6d 6f 72 79  ite.SQLiteMemory
1a160 20 62 79 74 65 73 41 6c 6c 6f 63 61 74 65 64 0d   bytesAllocated.
1a170 0a 20 20 20 20 20 20 20 20 7d 20 6d 65 6d 6f 72  .        } memor
1a180 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  y] == 0} then {.
1a190 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
1a1a0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
1a1b0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1a1c0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1a1d0 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22  ndArgs $memory "
1a1e0 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20   bytes\n"]..    
1a1f0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1a200 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1a210 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20       set memory 
1a220 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20  unknown....     
1a230 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
1a240 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1a250 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
1a260 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1a270 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20   $memory \n]..  
1a280 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1a290 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1a2a0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
1a2b0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
1a2c0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
1a2d0 2d 2d 2d 20 6d 61 78 69 6d 75 6d 20 6d 65 6d 6f  --- maximum memo
1a2e0 72 79 20 69 6e 20 75 73 65 20 62 79 20 53 51 4c  ry in use by SQL
1a2f0 69 74 65 4d 65 6d 6f 72 79 2e 2e 2e 20 22 0d 0a  iteMemory... "..
1a300 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1a310 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
1a320 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a  {..          obj
1a330 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
1a340 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
1a350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
1a360 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
1a370 2e 53 51 4c 69 74 65 4d 65 6d 6f 72 79 20 6d 61  .SQLiteMemory ma
1a380 78 69 6d 75 6d 42 79 74 65 73 41 6c 6c 6f 63 61  ximumBytesAlloca
1a390 74 65 64 0d 0a 20 20 20 20 20 20 20 20 7d 20 6d  ted..        } m
1a3a0 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65  emory] == 0} the
1a3b0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
1a3c0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
1a3d0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1a3e0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
1a3f0 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f  appendArgs $memo
1a400 72 79 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a  ry " bytes\n"]..
1a410 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1a420 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1a430 20 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d           set mem
1a440 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20  ory unknown.... 
1a450 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
1a460 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
1a470 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1a480 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
1a490 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d  Args $memory \n]
1a4a0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1a4b0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1a4c0 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21  }....      if {!
1a4d0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
1a4e0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1a4f0 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 75 72  hannel "---- cur
1a500 72 65 6e 74 20 6d 65 6d 6f 72 79 20 69 6e 20 75  rent memory in u
1a510 73 65 20 62 79 20 53 51 4c 69 74 65 2e 2e 2e 20  se by SQLite... 
1a520 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  "..      }....  
1a530 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c      if {[haveSQL
1a540 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64  iteObjectCommand
1a550 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1a560 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
1a570 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
1a580 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
1a590 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
1a5a0 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
1a5b0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55  em.Data.SQLite.U
1a5c0 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
1a5d0 64 73 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72  ds sqlite3_memor
1a5e0 79 5f 75 73 65 64 0d 0a 20 20 20 20 20 20 20 20  y_used..        
1a5f0 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20  } memory] == 0} 
1a600 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1a610 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
1a620 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1a630 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1a640 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
1a650 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e 22  emory " bytes\n"
1a660 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
1a670 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
1a680 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
1a690 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
1a6a0 20 4d 61 79 62 65 20 74 68 65 20 53 51 4c 69 74   Maybe the SQLit
1a6b0 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20 69  e core library i
1a6c0 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 3f 0d 0a  s unavailable?..
1a6d0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1a6e0 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72         set memor
1a6f0 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20  y unknown....   
1a700 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
1a710 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
1a720 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1a730 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1a740 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a  gs $memory \n]..
1a750 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1a760 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20       }..      } 
1a770 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
1a780 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 61 76 61  set memory unava
1a790 69 6c 61 62 6c 65 0d 0a 0d 0a 20 20 20 20 20 20  ilable....      
1a7a0 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
1a7b0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1a7c0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1a7d0 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d  [appendArgs $mem
1a7e0 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ory \n]..       
1a7f0 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
1a800 20 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20       set result 
1a810 24 6d 65 6d 6f 72 79 3b 20 23 20 4e 4f 54 45 3a  $memory; # NOTE:
1a820 20 52 65 74 75 72 6e 20 6d 65 6d 6f 72 79 20 69   Return memory i
1a830 6e 2d 75 73 65 20 74 6f 20 6f 75 72 20 63 61 6c  n-use to our cal
1a840 6c 65 72 2e 0d 0a 0d 0a 20 20 20 20 20 20 69 66  ler.....      if
1a850 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
1a860 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
1a870 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
1a880 6d 61 78 69 6d 75 6d 20 6d 65 6d 6f 72 79 20 69  maximum memory i
1a890 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74 65 2e  n use by SQLite.
1a8a0 2e 2e 20 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  .. "..      }...
1a8b0 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65  .      if {[have
1a8c0 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d  SQLiteObjectComm
1a8d0 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  and]} then {..  
1a8e0 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
1a8f0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62   {..          ob
1a900 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
1a910 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
1a920 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  .              S
1a930 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
1a940 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  e.UnsafeNativeMe
1a950 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20  thods \..       
1a960 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
1a970 65 6d 6f 72 79 5f 68 69 67 68 77 61 74 65 72 20  emory_highwater 
1a980 30 0d 0a 20 20 20 20 20 20 20 20 7d 20 6d 65 6d  0..        } mem
1a990 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ory] == 0} then 
1a9a0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
1a9b0 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
1a9c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
1a9d0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
1a9e0 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79  pendArgs $memory
1a9f0 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20   " bytes\n"]..  
1aa00 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1aa10 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1aa20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1aa30 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 79 62      # NOTE: Mayb
1aa40 65 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72  e the SQLite cor
1aa50 65 20 6c 69 62 72 61 72 79 20 69 73 20 75 6e 61  e library is una
1aa60 76 61 69 6c 61 62 6c 65 3f 0d 0a 20 20 20 20 20  vailable?..     
1aa70 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1aa80 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b    set memory unk
1aa90 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nown....        
1aaa0 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
1aab0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1aac0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1aad0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
1aae0 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20  emory \n]..     
1aaf0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1ab00 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  }..      } else 
1ab10 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d  {..        set m
1ab20 65 6d 6f 72 79 20 75 6e 61 76 61 69 6c 61 62 6c  emory unavailabl
1ab30 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  e....        if 
1ab40 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
1ab50 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
1ab60 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1ab70 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c  ndArgs $memory \
1ab80 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  n]..        }.. 
1ab90 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1aba0 69 66 20 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68  if {$collect} th
1abb0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f  en {..        co
1abc0 6c 6c 65 63 74 47 61 72 62 61 67 65 20 24 63 68  llectGarbage $ch
1abd0 61 6e 6e 65 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a  annel..      }..
1abe0 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71 75  ..      if {!$qu
1abf0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
1ac00 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
1ac10 6e 65 6c 20 22 2d 2d 2d 2d 20 63 75 72 72 65 6e  nel "---- curren
1ac20 74 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20  t memory in use 
1ac30 62 79 20 74 68 65 20 43 4c 52 2e 2e 2e 20 22 0d  by the CLR... ".
1ac40 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
1ac50 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74    if {[haveSQLit
1ac60 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d  eObjectCommand]}
1ac70 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1ac80 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
1ac90 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
1aca0 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54 6f 74  invoke GC GetTot
1acb0 61 6c 4d 65 6d 6f 72 79 20 66 61 6c 73 65 0d 0a  alMemory false..
1acc0 20 20 20 20 20 20 20 20 7d 20 6d 65 6d 6f 72 79          } memory
1acd0 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
1ace0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73            if {[s
1acf0 74 72 69 6e 67 20 69 73 20 69 6e 74 65 67 65 72  tring is integer
1ad00 20 2d 73 74 72 69 63 74 20 24 6d 65 6d 6f 72 79   -strict $memory
1ad10 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1ad20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
1ad30 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
1ad40 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1ad50 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
1ad60 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20 62  Args $memory " b
1ad70 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  ytes\n"]..      
1ad80 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1ad90 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1ada0 20 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d           set mem
1adb0 6f 72 79 20 69 6e 76 61 6c 69 64 0d 0a 0d 0a 20  ory invalid.... 
1adc0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
1add0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
1ade0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
1adf0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
1ae00 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79  pendArgs $memory
1ae10 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
1ae20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
1ae30 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
1ae40 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
1ae50 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e  t memory unknown
1ae60 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
1ae70 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
1ae80 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
1ae90 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
1aea0 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72  ppendArgs $memor
1aeb0 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  y \n]..         
1aec0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
1aed0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1aee0 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72         set memor
1aef0 79 20 75 6e 61 76 61 69 6c 61 62 6c 65 0d 0a 0d  y unavailable...
1af00 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71  .        if {!$q
1af10 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
1af20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1af30 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1af40 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a  gs $memory \n]..
1af50 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1af60 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
1af70 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20  rn $result..    
1af80 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
1af90 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 69 72  heckForSQLiteDir
1afa0 65 63 74 6f 72 69 65 73 20 7b 20 63 68 61 6e 6e  ectories { chann
1afb0 65 6c 20 7b 72 65 73 65 74 20 66 61 6c 73 65 7d  el {reset false}
1afc0 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
1afd0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
1afe0 63 6b 20 69 66 20 74 68 65 20 73 71 6c 69 74 65  ck if the sqlite
1aff0 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65  3_win32_set_dire
1b000 63 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20 69  ctory function i
1b010 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20  s available...  
1b020 20 20 20 20 23 0d 0a 20 20 20 20 20 20 74 70 75      #..      tpu
1b030 74 73 20 24 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20  ts $channel \.. 
1b040 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
1b050 68 65 63 6b 69 6e 67 20 66 6f 72 20 66 75 6e 63  hecking for func
1b060 74 69 6f 6e 20 73 71 6c 69 74 65 33 5f 77 69 6e  tion sqlite3_win
1b070 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79  32_set_directory
1b080 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 23  ... "....      #
1b090 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
1b0a0 54 68 69 73 20 63 61 6c 6c 20 74 6f 20 74 68 65  This call to the
1b0b0 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
1b0c0 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66 75 6e  et_directory fun
1b0d0 63 74 69 6f 6e 20 75 73 65 73 20 74 68 65 0d 0a  ction uses the..
1b0e0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e        #       in
1b0f0 76 61 6c 69 64 20 76 61 6c 75 65 20 30 20 66 6f  valid value 0 fo
1b100 72 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  r the first argu
1b110 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 64 65  ment.  This code
1b120 20 69 73 20 64 65 73 69 67 6e 65 64 0d 0a 20 20   is designed..  
1b130 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 63      #       to c
1b140 68 65 63 6b 20 69 66 20 63 61 6c 6c 69 6e 67 20  heck if calling 
1b150 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  the function wil
1b160 6c 20 72 61 69 73 65 20 61 6e 20 65 78 63 65 70  l raise an excep
1b170 74 69 6f 6e 20 28 69 2e 65 2e 0d 0a 20 20 20 20  tion (i.e...    
1b180 20 20 23 20 20 20 20 20 20 20 74 68 65 20 61 63    #       the ac
1b190 74 75 61 6c 20 72 65 73 75 6c 74 20 6f 66 20 74  tual result of t
1b1a0 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  he function does
1b1b0 20 6e 6f 74 20 6d 61 74 74 65 72 20 61 73 20 6c   not matter as l
1b1c0 6f 6e 67 20 61 73 20 6e 6f 0d 0a 20 20 20 20 20  ong as no..     
1b1d0 20 23 20 20 20 20 20 20 20 64 69 72 65 63 74 6f   #       directo
1b1e0 72 79 20 69 73 20 63 68 61 6e 67 65 64 29 2e 0d  ry is changed)..
1b1f0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1b200 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
1b210 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
1b220 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
1b230 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
1b240 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
1b250 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61  .SQLite.UnsafeNa
1b260 74 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20  tiveMethods \.. 
1b270 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1b280 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72  e3_win32_set_dir
1b290 65 63 74 6f 72 79 20 30 20 6e 75 6c 6c 0d 0a 20  ectory 0 null.. 
1b2a0 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68       }] == 0} th
1b2b0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
1b2c0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
1b2d0 20 43 61 6c 6c 69 6e 67 20 74 68 65 20 73 71 6c   Calling the sql
1b2e0 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
1b2f0 69 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f  irectory functio
1b300 6e 20 64 6f 65 73 20 6e 6f 74 0d 0a 20 20 20 20  n does not..    
1b310 20 20 20 20 23 20 20 20 20 20 20 20 63 61 75 73      #       caus
1b320 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 3b 20  e an exception; 
1b330 74 68 65 72 65 66 6f 72 65 2c 20 69 74 20 6d 75  therefore, it mu
1b340 73 74 20 62 65 20 61 76 61 69 6c 61 62 6c 65 20  st be available 
1b350 28 69 2e 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  (i.e...        #
1b360 20 20 20 20 20 20 20 65 76 65 6e 20 74 68 6f 75         even thou
1b370 67 68 20 69 74 20 73 68 6f 75 6c 64 20 72 65 74  gh it should ret
1b380 75 72 6e 20 61 20 66 61 69 6c 75 72 65 20 72 65  urn a failure re
1b390 74 75 72 6e 20 63 6f 64 65 20 69 6e 20 74 68 69  turn code in thi
1b3a0 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  s..        #    
1b3b0 20 20 20 63 61 73 65 29 2e 0d 0a 20 20 20 20 20     case)...     
1b3c0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64     #..        ad
1b3d0 64 43 6f 6e 73 74 72 61 69 6e 74 20 73 71 6c 69  dConstraint sqli
1b3e0 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69  te3_win32_set_di
1b3f0 72 65 63 74 6f 72 79 0d 0a 0d 0a 20 20 20 20 20  rectory....     
1b400 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1b410 6c 20 79 65 73 5c 6e 0d 0a 0d 0a 20 20 20 20 20  l yes\n....     
1b420 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1b430 4e 4f 54 45 3a 20 44 6f 65 73 20 6f 75 72 20 63  NOTE: Does our c
1b440 61 6c 6c 65 72 20 77 61 6e 74 20 74 6f 20 72 65  aller want to re
1b450 73 65 74 20 74 68 65 20 64 69 72 65 63 74 6f 72  set the director
1b460 69 65 73 3f 0d 0a 20 20 20 20 20 20 20 20 23 0d  ies?..        #.
1b470 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 72 65  .        if {$re
1b480 73 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  set} then {..   
1b490 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1b4a0 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 20      # NOTE: Now 
1b4b0 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 64 61  make sure the da
1b4c0 74 61 62 61 73 65 20 61 6e 64 20 74 65 6d 70 6f  tabase and tempo
1b4d0 72 61 72 79 20 64 69 72 65 63 74 6f 72 69 65 73  rary directories
1b4e0 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20   are..          
1b4f0 23 20 20 20 20 20 20 20 72 65 73 65 74 20 74 68  #       reset th
1b500 65 69 72 20 64 65 66 61 75 6c 74 20 76 61 6c 75  eir default valu
1b510 65 73 2c 20 77 68 69 63 68 20 73 68 6f 75 6c 64  es, which should
1b520 20 62 65 20 6e 75 6c 6c 20 66 6f 72 20 62 6f 74   be null for bot
1b530 68 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  h...          # 
1b540 20 20 20 20 20 20 53 69 6e 63 65 20 74 68 65 20        Since the 
1b550 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
1b560 74 5f 64 69 72 65 63 74 6f 72 79 20 66 75 6e 63  t_directory func
1b570 74 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c  tion is availabl
1b580 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  e,..          # 
1b590 20 20 20 20 20 20 75 73 65 20 69 74 2e 0d 0a 20        use it... 
1b5a0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1b5b0 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69        for {set i
1b5c0 6e 64 65 78 20 31 7d 20 7b 24 69 6e 64 65 78 20  ndex 1} {$index 
1b5d0 3c 20 33 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78  < 3} {incr index
1b5e0 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  } {..           
1b5f0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
1b600 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a               obj
1b610 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
1b620 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
1b630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b640 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
1b650 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76  Lite.UnsafeNativ
1b660 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20  eMethods \..    
1b670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
1b680 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f  lite3_win32_set_
1b690 64 69 72 65 63 74 6f 72 79 20 24 69 6e 64 65 78  directory $index
1b6a0 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20   null..         
1b6b0 20 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20     } result] == 
1b6c0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
1b6d0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1b6e0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1b6f0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1b700 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
1b710 61 6c 6c 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  all sqlite3_win3
1b720 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28  2_set_directory(
1b730 22 20 24 69 6e 64 65 78 20 5c 0d 0a 20 20 20 20  " $index \..    
1b740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2c                ",
1b750 20 6e 75 6c 6c 29 2e 2e 2e 20 6f 6b 3a 20 22 20   null)... ok: " 
1b760 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
1b770 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
1b780 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1b790 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1b7a0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1b7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7c0 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69   "---- call sqli
1b7d0 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69  te3_win32_set_di
1b7e0 72 65 63 74 6f 72 79 28 22 20 24 69 6e 64 65 78  rectory(" $index
1b7f0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1b800 20 20 20 20 20 20 22 2c 20 6e 75 6c 6c 29 2e 2e        ", null)..
1b810 2e 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  . error: " \n\t 
1b820 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
1b830 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1b840 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1b850 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65   }..      } else
1b860 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
1b870 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d  s $channel no\n.
1b880 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1b890 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f        # NOTE: Do
1b8a0 65 73 20 6f 75 72 20 63 61 6c 6c 65 72 20 77 61  es our caller wa
1b8b0 6e 74 20 74 6f 20 72 65 73 65 74 20 74 68 65 20  nt to reset the 
1b8c0 64 69 72 65 63 74 6f 72 69 65 73 3f 20 20 54 68  directories?  Th
1b8d0 69 73 20 63 61 6e 20 6f 6e 6c 79 0d 0a 20 20 20  is can only..   
1b8e0 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65 20       #       be 
1b8f0 70 65 72 66 6f 72 6d 65 64 20 69 66 20 53 51 4c  performed if SQL
1b900 69 74 65 20 69 73 20 6c 6f 61 64 65 64 20 61 6e  ite is loaded an
1b910 64 20 72 65 61 64 79 20 66 6f 72 20 75 73 65 20  d ready for use 
1b920 62 79 20 74 68 65 20 74 65 73 74 0d 0a 20 20 20  by the test..   
1b930 20 20 20 20 20 23 20 20 20 20 20 20 20 73 75 69       #       sui
1b940 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  te...        #..
1b950 20 20 20 20 20 20 20 20 69 66 20 7b 24 72 65 73          if {$res
1b960 65 74 20 26 26 20 5b 69 73 53 51 4c 69 74 65 52  et && [isSQLiteR
1b970 65 61 64 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  eady]} then {.. 
1b980 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1b990 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f        # NOTE: No
1b9a0 77 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  w make sure the 
1b9b0 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 65 6d  database and tem
1b9c0 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 69  porary directori
1b9d0 65 73 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20  es are..        
1b9e0 20 20 23 20 20 20 20 20 20 20 72 65 73 65 74 20    #       reset 
1b9f0 74 68 65 69 72 20 64 65 66 61 75 6c 74 20 76 61  their default va
1ba00 6c 75 65 73 2c 20 77 68 69 63 68 20 73 68 6f 75  lues, which shou
1ba10 6c 64 20 62 65 20 6e 75 6c 6c 20 66 6f 72 20 62  ld be null for b
1ba20 6f 74 68 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  oth...          
1ba30 23 20 20 20 20 20 20 20 53 69 6e 63 65 20 74 68  #       Since th
1ba40 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  e sqlite3_win32_
1ba50 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66 75  set_directory fu
1ba60 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 0d  nction does not.
1ba70 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
1ba80 20 20 20 61 70 70 65 61 72 20 74 6f 20 62 65 20     appear to be 
1ba90 61 76 61 69 6c 61 62 6c 65 2c 20 75 73 65 20 74  available, use t
1baa0 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 50 52  he associated PR
1bab0 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 73 0d 0a 20  AGMA commands.. 
1bac0 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
1bad0 20 69 6e 73 74 65 61 64 2e 0d 0a 20 20 20 20 20   instead...     
1bae0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1baf0 20 20 66 6f 72 65 61 63 68 20 64 69 72 65 63 74    foreach direct
1bb00 6f 72 79 20 5b 6c 69 73 74 20 64 61 74 61 5f 73  ory [list data_s
1bb10 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20 74  tore_directory t
1bb20 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74  emp_store_direct
1bb30 6f 72 79 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20  ory] {..        
1bb40 20 20 20 20 73 65 74 20 73 71 6c 20 5b 61 70 70      set sql [app
1bb50 65 6e 64 41 72 67 73 20 22 50 52 41 47 4d 41 20  endArgs "PRAGMA 
1bb60 22 20 24 64 69 72 65 63 74 6f 72 79 20 22 20 3d  " $directory " =
1bb70 20 5c 22 5c 22 3b 22 5d 0d 0a 0d 0a 20 20 20 20   \"\";"]....    
1bb80 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
1bb90 63 68 20 7b 65 78 65 63 75 74 65 53 71 6c 20 24  ch {executeSql $
1bba0 73 71 6c 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20  sql} result] == 
1bbb0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
1bbc0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1bbd0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1bbe0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1bbf0 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 65           "---- e
1bc00 78 65 63 75 74 65 20 50 52 41 47 4d 41 20 22 20  xecute PRAGMA " 
1bc10 24 64 69 72 65 63 74 6f 72 79 20 22 2e 2e 2e 20  $directory "... 
1bc20 6f 6b 3a 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ok: \"" \..     
1bc30 20 20 20 20 20 20 20 20 20 20 20 20 20 24 72 65               $re
1bc40 73 75 6c 74 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20  sult \"\n]..    
1bc50 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
1bc60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1bc70 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
1bc80 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1bc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bca0 22 2d 2d 2d 2d 20 65 78 65 63 75 74 65 20 50 52  "---- execute PR
1bcb0 41 47 4d 41 20 22 20 24 64 69 72 65 63 74 6f 72  AGMA " $director
1bcc0 79 20 22 2e 2e 2e 20 65 72 72 6f 72 3a 20 22 20  y "... error: " 
1bcd0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1bce0 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c       \n\t $resul
1bcf0 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  t \n]..         
1bd00 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
1bd10 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
1bd20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
1bd30 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
1bd40 46 69 6e 61 6c 6c 79 2c 20 73 68 6f 77 20 74 68  Finally, show th
1bd50 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
1bd60 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1bd70 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 0d 0a 20  and temporary.. 
1bd80 20 20 20 20 20 23 20 20 20 20 20 20 20 64 69 72       #       dir
1bd90 65 63 74 6f 72 69 65 73 2e 20 20 54 68 69 73 20  ectories.  This 
1bda0 63 61 6e 20 6f 6e 6c 79 20 62 65 20 70 65 72 66  can only be perf
1bdb0 6f 72 6d 65 64 20 69 66 20 53 51 4c 69 74 65 20  ormed if SQLite 
1bdc0 69 73 20 6c 6f 61 64 65 64 0d 0a 20 20 20 20 20  is loaded..     
1bdd0 20 23 20 20 20 20 20 20 20 61 6e 64 20 72 65 61   #       and rea
1bde0 64 79 20 66 6f 72 20 75 73 65 20 62 79 20 74 68  dy for use by th
1bdf0 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20  e test suite... 
1be00 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
1be10 20 7b 5b 69 73 53 51 4c 69 74 65 52 65 61 64 79   {[isSQLiteReady
1be20 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1be30 20 20 20 66 6f 72 65 61 63 68 20 64 69 72 65 63     foreach direc
1be40 74 6f 72 79 20 5b 6c 69 73 74 20 64 61 74 61 5f  tory [list data_
1be50 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20  store_directory 
1be60 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63  temp_store_direc
1be70 74 6f 72 79 5d 20 7b 0d 0a 20 20 20 20 20 20 20  tory] {..       
1be80 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
1be90 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 2d  l [appendArgs "-
1bea0 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 22 20 24  --- checking " $
1beb0 64 69 72 65 63 74 6f 72 79 20 22 2e 2e 2e 20 22  directory "... "
1bec0 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73  ]....          s
1bed0 65 74 20 73 71 6c 20 5b 61 70 70 65 6e 64 41 72  et sql [appendAr
1bee0 67 73 20 22 50 52 41 47 4d 41 20 22 20 24 64 69  gs "PRAGMA " $di
1bef0 72 65 63 74 6f 72 79 20 5c 3b 5d 0d 0a 0d 0a 20  rectory \;].... 
1bf00 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
1bf10 74 63 68 20 7b 65 78 65 63 75 74 65 53 71 6c 20  tch {executeSql 
1bf20 24 73 71 6c 20 73 63 61 6c 61 72 7d 20 72 65 73  $sql scalar} res
1bf30 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ult] == 0} then 
1bf40 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
1bf50 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
1bf60 70 70 65 6e 64 41 72 67 73 20 22 6f 6b 3a 20 5c  ppendArgs "ok: \
1bf70 22 22 20 24 72 65 73 75 6c 74 20 5c 22 5c 6e 5d  "" $result \"\n]
1bf80 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
1bf90 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
1bfa0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
1bfb0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 65 72   [appendArgs "er
1bfc0 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65 73  ror: " \n\t $res
1bfd0 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ult \n]..       
1bfe0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
1bff0 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
1c000 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 6c 6f 61  ....    proc loa
1c010 64 53 51 4c 69 74 65 54 65 73 74 53 65 74 74 69  dSQLiteTestSetti
1c020 6e 67 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 73  ngs { channel {s
1c030 75 66 66 69 78 20 22 22 7d 20 7b 71 75 69 65 74  uffix ""} {quiet
1c040 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20   false} } {..   
1c050 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
1c060 54 45 3a 20 53 6b 69 70 20 6c 6f 61 64 69 6e 67  TE: Skip loading
1c070 20 74 68 65 20 73 65 74 74 69 6e 67 73 20 69 66   the settings if
1c080 20 74 68 65 69 72 20 75 73 61 67 65 20 68 61 73   their usage has
1c090 20 62 65 65 6e 20 64 69 73 61 62 6c 65 64 2e 0d   been disabled..
1c0a0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1c0b0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
1c0c0 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 54 65 73  s ::no(sqliteTes
1c0d0 74 53 65 74 74 69 6e 67 73 29 5d 7d 20 74 68 65  tSettings)]} the
1c0e0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
1c0f0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1c100 4c 6f 61 64 20 63 75 73 74 6f 6d 20 70 65 72 2d  Load custom per-
1c110 75 73 65 72 20 61 6e 64 2f 6f 72 20 70 65 72 2d  user and/or per-
1c120 68 6f 73 74 20 74 65 73 74 20 73 65 74 74 69 6e  host test settin
1c130 67 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20  gs now...       
1c140 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
1c150 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
1c160 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 75 73 65 72  cl_platform(user
1c170 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
1c180 20 20 20 20 20 20 73 65 74 20 75 73 65 72 53 65        set userSe
1c190 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 5b  ttingsFileName [
1c1a0 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 43 6f  file join [getCo
1c1b0 6d 6d 6f 6e 44 69 72 65 63 74 6f 72 79 5d 20 5c  mmonDirectory] \
1c1c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c1d0 5b 61 70 70 65 6e 64 41 72 67 73 20 73 65 74 74  [appendArgs sett
1c1e0 69 6e 67 73 20 24 73 75 66 66 69 78 20 2e 20 24  ings $suffix . $
1c1f0 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 75  ::tcl_platform(u
1c200 73 65 72 29 20 2e 65 61 67 6c 65 5d 5d 0d 0a 0d  ser) .eagle]]...
1c210 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
1c220 66 69 6c 65 20 65 78 69 73 74 73 20 24 75 73 65  file exists $use
1c230 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d  rSettingsFileNam
1c240 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
1c250 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
1c260 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
1c270 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1c280 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
1c290 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1c2a0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
1c2b0 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d 75 73 65   loading per-use
1c2c0 72 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20  r test settings 
1c2d0 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20  file \"" \..    
1c2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 75                $u
1c2f0 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e  serSettingsFileN
1c300 61 6d 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 20 20  ame \"...\n]..  
1c310 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
1c320 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
1c330 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
1c340 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31         uplevel 1
1c350 20 5b 6c 69 73 74 20 73 6f 75 72 63 65 20 24 75   [list source $u
1c360 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e  serSettingsFileN
1c370 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  ame]..          
1c380 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e    } error]} then
1c390 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1c3a0 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
1c3b0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1c3c0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1c3d0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1c3e0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1c3f0 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
1c400 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
1c410 6f 20 6c 6f 61 64 20 70 65 72 2d 75 73 65 72 20  o load per-user 
1c420 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22  settings file \"
1c430 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
1c440 20 20 20 20 20 20 20 20 20 24 75 73 65 72 53 65           $userSe
1c450 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22  ttingsFileName "
1c460 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  \", error: " \n\
1c470 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20  t $error \n]..  
1c480 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1c490 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
1c4a0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
1c4b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
1c4c0 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
1c4d0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1c4e0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1c4f0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1c500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c510 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6c   "---- skipped l
1c520 6f 61 64 69 6e 67 20 70 65 72 2d 75 73 65 72 20  oading per-user 
1c530 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 66 69  test settings fi
1c540 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  le \"" \..      
1c550 20 20 20 20 20 20 20 20 20 20 20 20 24 75 73 65              $use
1c560 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d  rSettingsFileNam
1c570 65 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e  e "\", it does n
1c580 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20  ot exist\n"]..  
1c590 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1c5a0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1c5b0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
1c5c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1c5d0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1c5e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1c5f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1c600 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20 20  ######....      
1c610 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
1c620 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72  ts ::tcl_platfor
1c630 6d 28 68 6f 73 74 29 5d 7d 20 74 68 65 6e 20 7b  m(host)]} then {
1c640 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
1c650 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65  hostSettingsFile
1c660 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  Name [file join 
1c670 5b 67 65 74 43 6f 6d 6d 6f 6e 44 69 72 65 63 74  [getCommonDirect
1c680 6f 72 79 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20  ory] \..        
1c690 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72 67        [appendArg
1c6a0 73 20 73 65 74 74 69 6e 67 73 20 24 73 75 66 66  s settings $suff
1c6b0 69 78 20 2e 20 24 3a 3a 74 63 6c 5f 70 6c 61 74  ix . $::tcl_plat
1c6c0 66 6f 72 6d 28 68 6f 73 74 29 20 2e 65 61 67 6c  form(host) .eagl
1c6d0 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  e]]....         
1c6e0 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74   if {[file exist
1c6f0 73 20 24 68 6f 73 74 53 65 74 74 69 6e 67 73 46  s $hostSettingsF
1c700 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
1c710 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
1c720 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
1c730 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1c740 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
1c750 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1c760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c770 20 22 2d 2d 2d 2d 20 6c 6f 61 64 69 6e 67 20 70   "---- loading p
1c780 65 72 2d 68 6f 73 74 20 74 65 73 74 20 73 65 74  er-host test set
1c790 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c  tings file \"" \
1c7a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c7b0 20 20 20 20 24 68 6f 73 74 53 65 74 74 69 6e 67      $hostSetting
1c7c0 73 46 69 6c 65 4e 61 6d 65 20 5c 22 2e 2e 2e 5c  sFileName \"...\
1c7d0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
1c7e0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
1c7f0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
1c800 20 20 20 20 20 20 20 20 20 20 20 20 20 75 70 6c               upl
1c810 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 73 6f 75  evel 1 [list sou
1c820 72 63 65 20 24 68 6f 73 74 53 65 74 74 69 6e 67  rce $hostSetting
1c830 73 46 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20  sFileName]..    
1c840 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d          } error]
1c850 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1c860 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
1c870 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
1c880 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
1c890 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
1c8a0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1c8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1c8c0 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
1c8d0 69 6c 65 64 20 74 6f 20 6c 6f 61 64 20 70 65 72  iled to load per
1c8e0 2d 68 6f 73 74 20 73 65 74 74 69 6e 67 73 20 66  -host settings f
1c8f0 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ile \"" \..     
1c900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
1c910 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65  hostSettingsFile
1c920 4e 61 6d 65 20 22 5c 22 2c 20 65 72 72 6f 72 3a  Name "\", error:
1c930 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c   " \n\t $error \
1c940 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
1c950 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
1c960 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20   }..          } 
1c970 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
1c980 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
1c990 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1c9a0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
1c9b0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1c9c0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1c9d0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69         "---- ski
1c9e0 70 70 65 64 20 6c 6f 61 64 69 6e 67 20 70 65 72  pped loading per
1c9f0 2d 68 6f 73 74 20 74 65 73 74 20 73 65 74 74 69  -host test setti
1ca00 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a  ngs file \"" \..
1ca10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca20 20 20 24 68 6f 73 74 53 65 74 74 69 6e 67 73 46    $hostSettingsF
1ca30 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 69 74 20  ileName "\", it 
1ca40 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e  does not exist\n
1ca50 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  "]..            
1ca60 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
1ca70 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1ca80 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
1ca90 20 20 70 72 6f 63 20 72 75 6e 53 51 4c 69 74 65    proc runSQLite
1caa0 54 65 73 74 50 72 6f 6c 6f 67 75 65 20 7b 7d 20  TestPrologue {} 
1cab0 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
1cac0 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 72    # NOTE: Skip r
1cad0 75 6e 6e 69 6e 67 20 6f 75 72 20 63 75 73 74 6f  unning our custo
1cae0 6d 20 70 72 6f 6c 6f 67 75 65 20 69 66 20 74 68  m prologue if th
1caf0 65 20 6d 61 69 6e 20 6f 6e 65 20 68 61 73 20 62  e main one has b
1cb00 65 65 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  een..      #    
1cb10 20 20 20 73 6b 69 70 70 65 64 2e 0d 0a 20 20 20     skipped...   
1cb20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
1cb30 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
1cb40 6e 6f 28 70 72 6f 6c 6f 67 75 65 2e 65 61 67 6c  no(prologue.eagl
1cb50 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  e)]} then {..   
1cb60 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1cb70 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 74 68 65  # NOTE: Load the
1cb80 20 22 62 65 66 6f 72 65 2d 63 6f 6e 73 74 72 61   "before-constra
1cb90 69 6e 74 73 22 20 63 75 73 74 6f 6d 20 70 65 72  ints" custom per
1cba0 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20 70 65 72  -user and/or per
1cbb0 2d 68 6f 73 74 0d 0a 20 20 20 20 20 20 20 20 23  -host..        #
1cbc0 20 20 20 20 20 20 20 74 65 73 74 20 73 65 74 74         test sett
1cbd0 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  ings now...     
1cbe0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 75 70     #..        up
1cbf0 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 6c 6f  level 1 [list lo
1cc00 61 64 53 51 4c 69 74 65 54 65 73 74 53 65 74 74  adSQLiteTestSett
1cc10 69 6e 67 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  ings $::test_cha
1cc20 6e 6e 65 6c 20 2e 62 65 66 6f 72 65 5d 0d 0a 0d  nnel .before]...
1cc30 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1cc40 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
1cc50 6b 20 69 66 20 74 68 65 20 5b 6f 62 6a 65 63 74  k if the [object
1cc60 5d 20 63 6f 6d 6d 61 6e 64 20 69 73 20 61 76 61  ] command is ava
1cc70 69 6c 61 62 6c 65 3b 20 69 66 20 6e 6f 74 2c 20  ilable; if not, 
1cc80 61 64 64 20 73 6f 6d 65 0d 0a 20 20 20 20 20 20  add some..      
1cc90 20 20 23 20 20 20 20 20 20 20 73 68 69 6d 73 20    #       shims 
1cca0 74 6f 20 6d 61 6b 65 20 74 68 65 20 74 65 73 74  to make the test
1ccb0 20 73 75 69 74 65 20 72 75 6e 20 73 6d 6f 6f 74   suite run smoot
1ccc0 68 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  her...        #.
1ccd0 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f  .        checkFo
1cce0 72 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d  rSQLiteObjectCom
1ccf0 6d 61 6e 64 20 24 3a 3a 74 65 73 74 5f 63 68 61  mand $::test_cha
1cd00 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nnel....        
1cd10 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
1cd20 45 3a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  E: Determine the
1cd30 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 6e 61   names of the na
1cd40 74 69 76 65 20 70 6c 61 74 66 6f 72 6d 20 61 6e  tive platform an
1cd50 64 20 61 72 63 68 69 74 65 63 74 75 72 65 2e 0d  d architecture..
1cd60 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1cd70 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d      set platform
1cd80 20 5b 67 65 74 42 75 69 6c 64 50 6c 61 74 66 6f   [getBuildPlatfo
1cd90 72 6d 20 74 72 75 65 5d 0d 0a 20 20 20 20 20 20  rm true]..      
1cda0 20 20 73 65 74 20 61 72 63 68 69 74 65 63 74 75    set architectu
1cdb0 72 65 20 5b 61 72 63 68 69 74 65 63 74 75 72 65  re [architecture
1cdc0 46 6f 72 50 6c 61 74 66 6f 72 6d 20 24 70 6c 61  ForPlatform $pla
1cdd0 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20  tform]....      
1cde0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
1cdf0 4f 54 45 3a 20 53 68 6f 77 20 74 68 65 20 70 6c  OTE: Show the pl
1ce00 61 74 66 6f 72 6d 20 61 6e 64 20 61 72 63 68 69  atform and archi
1ce10 74 65 63 74 75 72 65 20 75 73 65 64 20 74 6f 20  tecture used to 
1ce20 68 65 6c 70 20 6c 6f 63 61 74 65 20 74 68 65 0d  help locate the.
1ce30 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
1ce40 20 6e 61 74 69 76 65 20 62 75 69 6c 64 20 66 69   native build fi
1ce50 6c 65 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  les...        #.
1ce60 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
1ce70 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
1ce80 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1ce90 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
1cea0 70 6c 61 74 66 6f 72 6d 20 66 6f 72 20 6c 6f 63  platform for loc
1ceb0 61 74 69 6e 67 20 6e 61 74 69 76 65 20 62 75 69  ating native bui
1cec0 6c 64 20 66 69 6c 65 73 20 69 73 20 5c 22 22 20  ld files is \"" 
1ced0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24  \..            $
1cee0 70 6c 61 74 66 6f 72 6d 20 5c 22 5c 6e 5d 0d 0a  platform \"\n]..
1cef0 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
1cf00 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
1cf10 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1cf20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
1cf30 20 61 72 63 68 69 74 65 63 74 75 72 65 20 66 6f   architecture fo
1cf40 72 20 6c 6f 63 61 74 69 6e 67 20 6e 61 74 69 76  r locating nativ
1cf50 65 20 62 75 69 6c 64 20 66 69 6c 65 73 20 69 73  e build files is
1cf60 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
1cf70 20 20 20 20 24 61 72 63 68 69 74 65 63 74 75 72      $architectur
1cf80 65 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20  e \"\n]....     
1cf90 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1cfa0 4e 4f 54 45 3a 20 42 75 69 6c 64 20 61 20 6c 69  NOTE: Build a li
1cfb0 73 74 20 6f 66 20 63 6f 6e 66 69 67 75 72 61 74  st of configurat
1cfc0 69 6f 6e 20 66 69 6c 65 73 20 74 68 61 74 20 77  ion files that w
1cfd0 65 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20  e handle...     
1cfe0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65     #..        se
1cff0 74 20 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65  t configFileName
1d000 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20  s [list \..     
1d010 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
1d020 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 2e 63 6f  ta.SQLite.dll.co
1d030 6e 66 69 67 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  nfig]....       
1d040 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1d050 54 45 3a 20 42 75 69 6c 64 20 61 20 6c 69 73 74  TE: Build a list
1d060 20 6f 66 20 61 75 78 69 6c 69 61 72 79 20 4d 61   of auxiliary Ma
1d070 6e 61 67 65 64 20 44 65 62 75 67 67 69 6e 67 20  naged Debugging 
1d080 41 73 73 69 73 74 61 6e 74 73 20 28 4d 44 41 29  Assistants (MDA)
1d090 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1d0a0 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20    configuration 
1d0b0 66 69 6c 65 73 20 74 68 61 74 20 77 65 20 68 61  files that we ha
1d0c0 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  ndle...        #
1d0d0 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d 64  ..        set md
1d0e0 61 43 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73  aConfigFileNames
1d0f0 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20   [list \..      
1d100 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c        EagleShell
1d110 33 32 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69  32.exe.mda.confi
1d120 67 20 49 6e 73 74 61 6c 6c 65 72 2e 65 78 65 2e  g Installer.exe.
1d130 6d 64 61 2e 63 6f 6e 66 69 67 20 5c 0d 0a 20 20  mda.config \..  
1d140 20 20 20 20 20 20 20 20 20 20 74 65 73 74 2e 65            test.e
1d150 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 74 65  xe.mda.config te
1d160 73 74 6c 69 6e 71 2e 65 78 65 2e 6d 64 61 2e 63  stlinq.exe.mda.c
1d170 6f 6e 66 69 67 20 5c 0d 0a 20 20 20 20 20 20 20  onfig \..       
1d180 20 20 20 20 20 74 65 73 74 65 66 36 2e 65 78 65       testef6.exe
1d190 2e 6d 64 61 2e 63 6f 6e 66 69 67 5d 0d 0a 0d 0a  .mda.config]....
1d1a0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1d1b0 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64     # NOTE: Build
1d1c0 20 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78 74   the list of ext
1d1d0 65 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61 74  ernal files that
1d1e0 20 77 65 20 68 61 6e 64 6c 65 2e 20 20 53 6f 6d   we handle.  Som
1d1f0 65 20 6f 66 0d 0a 20 20 20 20 20 20 20 20 23 20  e of..        # 
1d200 20 20 20 20 20 20 74 68 65 73 65 20 66 69 6c 65        these file
1d210 73 20 6d 61 79 20 62 65 20 6e 61 74 69 76 65 20  s may be native 
1d220 61 6e 64 2f 6f 72 20 6d 61 6e 61 67 65 64 20 61  and/or managed a
1d230 73 73 65 6d 62 6c 69 65 73 20 74 68 61 74 20 61  ssemblies that a
1d240 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  re..        #   
1d250 20 20 20 20 72 65 71 75 69 72 65 64 20 74 6f 20      required to 
1d260 70 65 72 66 6f 72 6d 20 76 61 72 69 6f 75 73 20  perform various 
1d270 74 65 73 74 73 2e 0d 0a 20 20 20 20 20 20 20 20  tests...        
1d280 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 65  #..        set e
1d290 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 73  xternalFileNames
1d2a0 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20   [list \..      
1d2b0 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e        [file join
1d2c0 20 45 6e 74 69 74 79 46 72 61 6d 65 77 6f 72 6b   EntityFramework
1d2d0 20 6c 69 62 20 5b 73 74 72 69 6e 67 20 6d 61 70   lib [string map
1d2e0 20 5b 6c 69 73 74 20 46 78 20 22 22 5d 20 5b 73   [list Fx ""] [s
1d2f0 74 72 69 6e 67 20 5c 0d 0a 20 20 20 20 20 20 20  tring \..       
1d300 20 20 20 20 20 6d 61 70 20 5b 6c 69 73 74 20 6e       map [list n
1d310 65 74 46 78 34 35 31 20 6e 65 74 46 78 34 35 20  etFx451 netFx45 
1d320 6e 65 74 46 78 34 35 32 20 6e 65 74 46 78 34 35  netFx452 netFx45
1d330 20 6e 65 74 46 78 34 36 20 6e 65 74 46 78 34 35   netFx46 netFx45
1d340 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1d350 6e 65 74 46 78 34 36 31 20 6e 65 74 46 78 34 35  netFx461 netFx45
1d360 5d 20 5b 67 65 74 42 75 69 6c 64 4e 65 74 46 78  ] [getBuildNetFx
1d370 5d 5d 5d 20 45 6e 74 69 74 79 46 72 61 6d 65 77  ]]] EntityFramew
1d380 6f 72 6b 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20  ork.dll]]....   
1d390 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1d3a0 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68  # NOTE: Build th
1d3b0 65 20 6c 69 73 74 20 6f 66 20 6e 61 74 69 76 65  e list of native
1d3c0 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 73 20   assembly files 
1d3d0 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65 2e 20  that we handle. 
1d3e0 20 54 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   The..        # 
1d3f0 20 20 20 20 20 20 72 65 61 73 6f 6e 20 74 68 65        reason the
1d400 20 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51   "System.Data.SQ
1d410 4c 69 74 65 2e 64 6c 6c 22 20 66 69 6c 65 20 69  Lite.dll" file i
1d420 73 20 69 6e 63 6c 75 64 65 64 20 68 65 72 65 20  s included here 
1d430 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  is..        #   
1d440 20 20 20 20 62 65 63 61 75 73 65 20 69 74 20 63      because it c
1d450 6f 75 6c 64 20 62 65 20 74 68 65 20 6d 69 78 65  ould be the mixe
1d460 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 2e  d-mode assembly.
1d470 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1d480 20 20 20 20 20 73 65 74 20 6e 61 74 69 76 65 46       set nativeF
1d490 69 6c 65 4e 61 6d 65 73 20 5b 67 65 74 43 6f 72  ileNames [getCor
1d4a0 65 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 73  eBinaryFileNames
1d4b0 4f 6e 6c 79 5d 0d 0a 20 20 20 20 20 20 20 20 6c  Only]..        l
1d4c0 61 70 70 65 6e 64 20 6e 61 74 69 76 65 46 69 6c  append nativeFil
1d4d0 65 4e 61 6d 65 73 20 53 51 4c 69 74 65 2e 49 6e  eNames SQLite.In
1d4e0 74 65 72 6f 70 2e 64 6c 6c 20 53 79 73 74 65 6d  terop.dll System
1d4f0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
1d500 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
1d510 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42         # NOTE: B
1d520 75 69 6c 64 20 74 68 65 20 6c 69 73 74 20 6f 66  uild the list of
1d530 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c   managed assembl
1d540 79 20 66 69 6c 65 73 20 74 68 61 74 20 77 65 20  y files that we 
1d550 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20  handle...       
1d560 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
1d570 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73  managedFileNames
1d580 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20   [list \..      
1d590 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
1d5a0 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 20 53 79 73  a.SQLite.dll Sys
1d5b0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
1d5c0 4c 69 6e 71 2e 64 6c 6c 20 5c 0d 0a 20 20 20 20  Linq.dll \..    
1d5d0 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
1d5e0 61 74 61 2e 53 51 4c 69 74 65 2e 45 46 36 2e 64  ata.SQLite.EF6.d
1d5f0 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  ll]....        #
1d600 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1d610 3a 20 52 65 6d 6f 76 65 20 61 6e 79 20 74 65 73  : Remove any tes
1d620 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 68  t constraints th
1d630 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 20  at refer to the 
1d640 6e 61 74 69 76 65 20 61 6e 64 2f 6f 72 0d 0a 20  native and/or.. 
1d650 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6d         #       m
1d660 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 20  anaged assembly 
1d670 66 69 6c 65 73 20 74 68 61 74 20 77 65 20 68 61  files that we ha
1d680 6e 64 6c 65 20 75 6e 6c 65 73 73 20 66 6f 72 62  ndle unless forb
1d690 69 64 64 65 6e 20 66 72 6f 6d 0d 0a 20 20 20 20  idden from..    
1d6a0 20 20 20 20 23 20 20 20 20 20 20 20 64 6f 69 6e      #       doin
1d6b0 67 20 73 6f 2e 0d 0a 20 20 20 20 20 20 20 20 23  g so...        #
1d6c0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
1d6d0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
1d6e0 28 73 71 6c 69 74 65 52 65 6d 6f 76 65 43 6f 6e  (sqliteRemoveCon
1d6f0 73 74 72 61 69 6e 74 73 29 5d 7d 20 74 68 65 6e  straints)]} then
1d700 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f   {..          fo
1d710 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
1d720 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20  configFileNames 
1d730 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  {..            r
1d740 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  emoveConstraint 
1d750 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
1d760 5f 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20  _ $fileName]..  
1d770 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1d780 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
1d790 69 6c 65 4e 61 6d 65 20 24 6d 64 61 43 6f 6e 66  ileName $mdaConf
1d7a0 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  igFileNames {.. 
1d7b0 20 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76             remov
1d7c0 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  eConstraint [app
1d7d0 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 24 66  endArgs file_ $f
1d7e0 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20  ileName]..      
1d7f0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1d800 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
1d810 61 6d 65 20 24 65 78 74 65 72 6e 61 6c 46 69 6c  ame $externalFil
1d820 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
1d830 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73        removeCons
1d840 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
1d850 67 73 20 66 69 6c 65 5f 20 5b 66 69 6c 65 20 74  gs file_ [file t
1d860 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d  ail $fileName]].
1d870 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
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 72 65 6d 6f 76             remov
1d8c0 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  eConstraint [app
1d8d0 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 24 66  endArgs file_ $f
1d8e0 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20  ileName]..      
1d8f0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1d900 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
1d910 61 6d 65 20 24 6d 61 6e 61 67 65 64 46 69 6c 65  ame $managedFile
1d920 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
1d930 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74       removeConst
1d940 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
1d950 73 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61 6d  s file_ $fileNam
1d960 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  e]..          }.
1d970 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
1d980 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1d990 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 61 6c   # NOTE: Skip al
1d9a0 6c 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  l System.Data.SQ
1d9b0 4c 69 74 65 20 72 65 6c 61 74 65 64 20 66 69 6c  Lite related fil
1d9c0 65 20 68 61 6e 64 6c 69 6e 67 20 28 64 65 6c 65  e handling (dele
1d9d0 74 69 6e 67 2c 0d 0a 20 20 20 20 20 20 20 20 23  ting,..        #
1d9e0 20 20 20 20 20 20 20 63 6f 70 79 69 6e 67 2c 20         copying, 
1d9f0 61 6e 64 20 6c 6f 61 64 69 6e 67 29 20 69 66 20  and loading) if 
1da00 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20  instructed...   
1da10 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1da20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
1da30 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 46 69 6c  s ::no(sqliteFil
1da40 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
1da50 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1da60 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69       # NOTE: Ski
1da70 70 20 74 72 79 69 6e 67 20 74 6f 20 64 65 6c 65  p trying to dele
1da80 74 65 20 61 6e 79 20 66 69 6c 65 73 20 69 66 20  te any files if 
1da90 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20  instructed...   
1daa0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1dab0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
1dac0 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74  xists ::no(delet
1dad0 65 53 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20  eSqliteFiles)]} 
1dae0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1daf0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
1db00 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74  xists ::no(delet
1db10 65 53 71 6c 69 74 65 43 6f 6e 66 69 67 46 69 6c  eSqliteConfigFil
1db20 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
1db30 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
1db40 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 63 6f  ach fileName $co
1db50 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  nfigFileNames {.
1db60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1db70 20 74 72 79 44 65 6c 65 74 65 42 69 6e 61 72 79   tryDeleteBinary
1db80 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a  File $fileName..
1db90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
1dba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
1dbb0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
1dbc0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
1dbd0 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74  ::no(deleteSqlit
1dbe0 65 45 78 74 65 72 6e 61 6c 46 69 6c 65 73 29 5d  eExternalFiles)]
1dbf0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1dc00 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
1dc10 66 69 6c 65 4e 61 6d 65 20 24 6d 64 61 43 6f 6e  fileName $mdaCon
1dc20 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  figFileNames {..
1dc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc40 74 72 79 44 65 6c 65 74 65 42 75 69 6c 64 46 69  tryDeleteBuildFi
1dc50 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20  le $fileName..  
1dc60 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
1dc70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .              f
1dc80 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
1dc90 24 65 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d  $externalFileNam
1dca0 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
1dcb0 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 42        tryDeleteB
1dcc0 69 6e 61 72 79 46 69 6c 65 20 24 66 69 6c 65 4e  inaryFile $fileN
1dcd0 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ame..           
1dce0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
1dcf0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
1dd00 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
1dd10 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65  ists ::no(delete
1dd20 53 71 6c 69 74 65 4e 61 74 69 76 65 46 69 6c 65  SqliteNativeFile
1dd30 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
1dd40 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
1dd50 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
1dd60 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 49 6d  o(deleteSqliteIm
1dd70 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d 20 74  plicitFiles)]} t
1dd80 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1dd90 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
1dda0 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46  ileName $nativeF
1ddb0 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
1ddc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
1ddd0 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79 20  yDeleteAssembly 
1dde0 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  $fileName..     
1ddf0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
1de00 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
1de10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1de20 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
1de30 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69   ::no(deleteSqli
1de40 74 65 4e 6f 6e 49 6d 70 6c 69 63 69 74 46 69 6c  teNonImplicitFil
1de50 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
1de60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1de70 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
1de80 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74  ::no(deleteSqlit
1de90 65 50 6c 61 74 66 6f 72 6d 46 69 6c 65 73 29 5d  ePlatformFiles)]
1dea0 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
1deb0 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69             [stri
1dec0 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66  ng length $platf
1ded0 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  orm] > 0} then {
1dee0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1def0 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
1df00 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65  Name $nativeFile
1df10 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
1df20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
1df30 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 24  DeleteAssembly $
1df40 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f  fileName $platfo
1df50 72 6d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  rm..            
1df60 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1df70 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
1df80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1df90 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
1dfa0 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74  ::no(deleteSqlit
1dfb0 65 41 72 63 68 69 74 65 63 74 75 72 65 46 69 6c  eArchitectureFil
1dfc0 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  es)] && \..     
1dfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
1dfe0 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 61  string length $a
1dff0 72 63 68 69 74 65 63 74 75 72 65 5d 20 3e 20 30  rchitecture] > 0
1e000 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1e010 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
1e020 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61  ach fileName $na
1e030 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  tiveFileNames {.
1e040 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e050 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 41 73       tryDeleteAs
1e060 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65  sembly $fileName
1e070 20 24 61 72 63 68 69 74 65 63 74 75 72 65 0d 0a   $architecture..
1e080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e090 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
1e0a0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1e0b0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1e0c0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1e0d0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
1e0e0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c   exists ::no(del
1e0f0 65 74 65 53 71 6c 69 74 65 4d 61 6e 61 67 65 64  eteSqliteManaged
1e100 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
1e110 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .              f
1e120 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
1e130 24 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65  $managedFileName
1e140 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
1e150 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 41 73       tryDeleteAs
1e160 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65  sembly $fileName
1e170 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1e180 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
1e190 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
1e1a0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
1e1b0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1e1c0 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20 22 61  Check for the "a
1e1d0 75 74 6f 53 65 6c 65 63 74 22 20 72 75 6e 74 69  utoSelect" runti
1e1e0 6d 65 20 6f 70 74 69 6f 6e 2e 20 20 49 66 20 70  me option.  If p
1e1f0 72 65 73 65 6e 74 2c 0d 0a 20 20 20 20 20 20 20  resent,..       
1e200 20 20 20 23 20 20 20 20 20 20 20 61 74 74 65 6d     #       attem
1e210 70 74 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61  pt to automatica
1e220 6c 6c 79 20 73 65 6c 65 63 74 20 74 68 65 20 66  lly select the f
1e230 69 72 73 74 20 61 76 61 69 6c 61 62 6c 65 0d 0a  irst available..
1e240 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
1e250 20 20 62 75 69 6c 64 20 28 6f 72 20 22 72 65 6c    build (or "rel
1e260 65 61 73 65 22 29 20 6f 66 20 53 51 4c 69 74 65  ease") of SQLite
1e270 20 61 6e 64 20 53 79 73 74 65 6d 2e 44 61 74 61   and System.Data
1e280 2e 53 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 20  .SQLite..       
1e290 20 20 20 23 20 20 20 20 20 20 20 66 6f 72 20 75     #       for u
1e2a0 73 65 20 77 69 74 68 20 74 68 65 20 74 65 73 74  se with the test
1e2b0 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20   suite...       
1e2c0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1e2d0 69 66 20 7b 5b 68 61 73 52 75 6e 74 69 6d 65 4f  if {[hasRuntimeO
1e2e0 70 74 69 6f 6e 20 61 75 74 6f 53 65 6c 65 63 74  ption autoSelect
1e2f0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1e300 20 20 20 20 20 20 20 69 66 20 7b 21 5b 63 68 65         if {![che
1e310 63 6b 46 6f 72 53 51 4c 69 74 65 42 75 69 6c 64  ckForSQLiteBuild
1e320 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1e330 6c 20 74 72 75 65 5d 7d 20 74 68 65 6e 20 7b 0d  l true]} then {.
1e340 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
1e350 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 52 65 6c  heckForSQLiteRel
1e360 65 61 73 65 73 20 24 3a 3a 74 65 73 74 5f 63 68  eases $::test_ch
1e370 61 6e 6e 65 6c 20 74 72 75 65 0d 0a 20 20 20 20  annel true..    
1e380 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1e390 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1e3a0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1e3b0 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72   # NOTE: Skip tr
1e3c0 79 69 6e 67 20 74 6f 20 76 65 72 69 66 79 20 74  ying to verify t
1e3d0 68 65 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f  he build directo
1e3e0 72 79 20 69 66 20 69 6e 73 74 72 75 63 74 65 64  ry if instructed
1e3f0 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  ;..          #  
1e400 20 20 20 20 20 6f 74 68 65 72 77 69 73 65 2c 20       otherwise, 
1e410 6d 61 6b 65 20 73 75 72 65 20 69 74 20 61 63 74  make sure it act
1e420 75 61 6c 6c 79 20 65 78 69 73 74 73 20 6f 72 20  ually exists or 
1e430 68 61 6c 74 20 74 68 65 20 65 6e 74 69 72 65 0d  halt the entire.
1e440 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
1e450 20 20 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65     testing proce
1e460 73 73 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  ss if it does no
1e470 74 20 65 78 69 73 74 2e 0d 0a 20 20 20 20 20 20  t exist...      
1e480 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1e490 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
1e4a0 74 73 20 3a 3a 6e 6f 28 76 65 72 69 66 79 42 75  ts ::no(verifyBu
1e4b0 69 6c 64 44 69 72 65 63 74 6f 72 79 29 5d 7d 20  ildDirectory)]} 
1e4c0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1e4d0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1e4e0 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 20 74 68     # NOTE: At th
1e4f0 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 62 75  is point, the bu
1e500 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20 4d 55  ild directory MU
1e510 53 54 20 65 78 69 73 74 20 61 73 20 61 0d 0a 20  ST exist as a.. 
1e520 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
1e530 20 20 20 76 61 6c 69 64 20 64 69 72 65 63 74 6f     valid directo
1e540 72 79 20 66 6f 72 20 74 68 65 20 74 65 73 74 69  ry for the testi
1e550 6e 67 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f  ng process to co
1e560 6e 74 69 6e 75 65 2e 0d 0a 20 20 20 20 20 20 20  ntinue...       
1e570 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1e580 20 20 20 20 73 65 74 20 64 69 72 65 63 74 6f 72      set director
1e590 79 20 5b 67 65 74 42 75 69 6c 64 44 69 72 65 63  y [getBuildDirec
1e5a0 74 6f 72 79 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  tory]....       
1e5b0 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20       if {![file 
1e5c0 65 78 69 73 74 73 20 24 64 69 72 65 63 74 6f 72  exists $director
1e5d0 79 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20  y] || \..       
1e5e0 20 20 20 20 20 20 20 20 20 21 5b 66 69 6c 65 20           ![file 
1e5f0 69 73 64 69 72 65 63 74 6f 72 79 20 24 64 69 72  isdirectory $dir
1e600 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d  ectory]} then {.
1e610 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
1e620 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1e630 23 20 4e 4f 54 45 3a 20 4a 75 73 74 20 70 72 69  # NOTE: Just pri
1e640 6f 72 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 68  or to actually h
1e650 61 6c 74 69 6e 67 20 74 68 65 20 74 65 73 74 69  alting the testi
1e660 6e 67 20 70 72 6f 63 65 73 73 2c 0d 0a 20 20 20  ng process,..   
1e670 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
1e680 20 20 20 61 64 64 20 61 6e 20 65 72 72 6f 72 20     add an error 
1e690 74 6f 20 74 68 65 20 74 65 73 74 20 6c 6f 67 20  to the test log 
1e6a0 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20  file...         
1e6b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1e6c0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
1e6d0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
1e6e0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1e6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
1e700 2d 2d 20 63 6f 75 6c 64 20 6e 6f 74 20 76 65 72  -- could not ver
1e710 69 66 79 20 62 75 69 6c 64 20 64 69 72 65 63 74  ify build direct
1e720 6f 72 79 20 5c 22 22 20 24 64 69 72 65 63 74 6f  ory \"" $directo
1e730 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ry \..          
1e740 20 20 20 20 20 20 20 20 22 5c 22 2c 20 61 6c 6c          "\", all
1e750 20 74 65 73 74 69 6e 67 20 68 61 6c 74 65 64 5c   testing halted\
1e760 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  n"]....         
1e770 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1e780 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 61        # NOTE: Ra
1e790 69 73 69 6e 67 20 61 20 73 63 72 69 70 74 20 65  ising a script e
1e7a0 72 72 6f 72 20 66 72 6f 6d 20 74 68 69 73 20 70  rror from this p
1e7b0 6f 69 6e 74 20 73 68 6f 75 6c 64 20 68 61 6c 74  oint should halt
1e7c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1e7d0 23 20 20 20 20 20 20 20 74 68 65 20 74 65 73 74  #       the test
1e7e0 69 6e 67 20 70 72 6f 63 65 73 73 2e 0d 0a 20 20  ing process...  
1e7f0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
1e800 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72               err
1e810 6f 72 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  or [appendArgs \
1e820 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1e830 20 20 20 20 22 63 6f 75 6c 64 20 6e 6f 74 20 76      "could not v
1e840 65 72 69 66 79 20 62 75 69 6c 64 20 64 69 72 65  erify build dire
1e850 63 74 6f 72 79 20 5c 22 22 20 24 64 69 72 65 63  ctory \"" $direc
1e860 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20  tory \..        
1e870 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 61            "\", a
1e880 6c 6c 20 74 65 73 74 69 6e 67 20 68 61 6c 74 65  ll testing halte
1e890 64 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  d"]..           
1e8a0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
1e8b0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
1e8c0 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
1e8d0 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74 6f  : Skip trying to
1e8e0 20 63 6f 70 79 20 61 6e 79 20 66 69 6c 65 73 20   copy any files 
1e8f0 69 66 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a  if instructed...
1e900 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1e910 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
1e920 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f  o exists ::no(co
1e930 70 79 53 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d  pySqliteFiles)]}
1e940 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1e950 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
1e960 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79  exists ::no(copy
1e970 53 71 6c 69 74 65 43 6f 6e 66 69 67 46 69 6c 65  SqliteConfigFile
1e980 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
1e990 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61             forea
1e9a0 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 63 6f 6e  ch fileName $con
1e9b0 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  figFileNames {..
1e9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9d0 74 72 79 43 6f 70 79 42 75 69 6c 64 46 69 6c 65  tryCopyBuildFile
1e9e0 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20   $fileName..    
1e9f0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1ea00 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
1ea10 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
1ea20 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
1ea30 28 63 6f 70 79 53 71 6c 69 74 65 45 78 74 65 72  (copySqliteExter
1ea40 6e 61 6c 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  nalFiles)]} then
1ea50 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1ea60 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1ea70 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 70 79 20     # NOTE: Copy 
1ea80 74 68 65 20 4d 61 6e 61 67 65 64 20 44 65 62 75  the Managed Debu
1ea90 67 67 69 6e 67 20 41 73 73 69 73 74 61 6e 74 73  gging Assistants
1eaa0 20 28 4d 44 41 29 20 63 6f 6e 66 69 67 75 72 61   (MDA) configura
1eab0 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  tion..          
1eac0 20 20 20 20 23 20 20 20 20 20 20 20 66 69 6c 65      #       file
1ead0 20 66 6f 72 20 74 68 65 20 45 61 67 6c 65 20 73   for the Eagle s
1eae0 68 65 6c 6c 20 74 6f 20 74 68 65 20 62 75 69 6c  hell to the buil
1eaf0 64 20 6f 75 74 70 75 74 20 64 69 72 65 63 74 6f  d output directo
1eb00 72 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ry,..           
1eb10 20 20 20 23 20 20 20 20 20 20 20 77 68 69 6c 65     #       while
1eb20 20 75 73 69 6e 67 20 65 61 63 68 20 6f 66 20 74   using each of t
1eb30 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20  he names of the 
1eb40 76 61 72 69 6f 75 73 20 6c 65 67 61 63 79 20 74  various legacy t
1eb50 65 73 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20  est..           
1eb60 20 20 20 23 20 20 20 20 20 20 20 65 78 65 63 75     #       execu
1eb70 74 61 62 6c 65 73 2e 20 20 54 68 69 73 20 77 69  tables.  This wi
1eb80 6c 6c 20 68 65 6c 70 20 74 6f 20 6d 61 6b 65 20  ll help to make 
1eb90 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20 74 68  sure that all th
1eba0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
1ebb0 20 23 20 20 20 20 20 20 20 6c 65 67 61 63 79 20   #       legacy 
1ebc0 74 65 73 74 73 20 72 75 6e 20 77 69 74 68 20 65  tests run with e
1ebd0 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20  xactly the same 
1ebe0 73 65 74 20 6f 66 20 4d 61 6e 61 67 65 64 0d 0a  set of Managed..
1ebf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
1ec00 20 20 20 20 20 20 44 65 62 75 67 67 69 6e 67 20        Debugging 
1ec10 41 73 73 69 73 74 61 6e 74 73 20 63 6f 6e 66 69  Assistants confi
1ec20 67 75 72 65 64 2e 0d 0a 20 20 20 20 20 20 20 20  gured...        
1ec30 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1ec40 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
1ec50 69 6c 65 4e 61 6d 65 20 24 6d 64 61 43 6f 6e 66  ileName $mdaConf
1ec60 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  igFileNames {.. 
1ec70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
1ec80 72 79 43 6f 70 79 42 69 6e 61 72 79 46 69 6c 65  ryCopyBinaryFile
1ec90 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 2e   EagleShell.exe.
1eca0 6d 64 61 2e 63 6f 6e 66 69 67 20 22 22 20 24 66  mda.config "" $f
1ecb0 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20  ileName..       
1ecc0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1ecd0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1ece0 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
1ecf0 45 3a 20 43 6f 70 79 20 74 68 65 20 65 78 74 65  E: Copy the exte
1ed00 72 6e 61 6c 20 62 69 6e 61 72 69 65 73 2c 20 69  rnal binaries, i
1ed10 66 20 61 6e 79 2c 20 74 6f 20 74 68 65 20 64 69  f any, to the di
1ed20 72 65 63 74 6f 72 79 20 74 68 61 74 0d 0a 20 20  rectory that..  
1ed30 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
1ed40 20 20 20 20 63 6f 6e 74 61 69 6e 73 20 74 68 65      contains the
1ed50 20 45 61 67 6c 65 20 73 68 65 6c 6c 2e 20 20 54   Eagle shell.  T
1ed60 68 69 73 20 69 73 20 74 79 70 69 63 61 6c 6c 79  his is typically
1ed70 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 0d 0a 20   used to make.. 
1ed80 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
1ed90 20 20 20 20 20 73 75 72 65 20 61 73 73 65 6d 62       sure assemb
1eda0 6c 69 65 73 20 72 65 66 65 72 65 6e 63 65 64 20  lies referenced 
1edb0 62 79 20 74 68 65 20 6f 6e 65 73 20 62 65 69 6e  by the ones bein
1edc0 67 20 74 65 73 74 65 64 20 61 72 65 0d 0a 20 20  g tested are..  
1edd0 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
1ede0 20 20 20 20 61 76 61 69 6c 61 62 6c 65 20 64 75      available du
1edf0 72 69 6e 67 20 74 68 65 20 74 65 73 74 69 6e 67  ring the testing
1ee00 20 70 72 6f 63 65 73 73 2e 0d 0a 20 20 20 20 20   process...     
1ee10 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1ee20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
1ee30 68 20 66 69 6c 65 4e 61 6d 65 20 24 65 78 74 65  h fileName $exte
1ee40 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  rnalFileNames {.
1ee50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ee60 20 74 72 79 43 6f 70 79 45 78 74 65 72 6e 61 6c   tryCopyExternal
1ee70 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a  File $fileName..
1ee80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
1ee90 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
1eea0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
1eeb0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
1eec0 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 4e  ::no(copySqliteN
1eed0 61 74 69 76 65 46 69 6c 65 73 29 5d 7d 20 74 68  ativeFiles)]} th
1eee0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1eef0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1ef00 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
1ef10 74 68 65 20 74 65 73 74 20 70 6c 61 74 66 6f 72  the test platfor
1ef20 6d 20 69 73 20 6c 69 6b 65 6c 79 20 74 68 65 20  m is likely the 
1ef30 64 65 66 61 75 6c 74 20 66 6f 72 20 74 68 69 73  default for this
1ef40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1ef50 23 20 20 20 20 20 20 20 6d 61 63 68 69 6e 65 2c  #       machine,
1ef60 20 61 6c 73 6f 20 74 72 79 20 74 6f 20 63 6f 70   also try to cop
1ef70 79 20 74 68 65 20 6e 61 74 69 76 65 20 66 69 6c  y the native fil
1ef80 65 73 20 74 6f 20 74 68 65 0d 0a 20 20 20 20 20  es to the..     
1ef90 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
1efa0 20 62 69 6e 61 72 79 20 6c 6f 63 61 74 69 6f 6e   binary location
1efb0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
1efc0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
1efd0 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
1efe0 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c  sts ::no(copySql
1eff0 69 74 65 49 6d 70 6c 69 63 69 74 46 69 6c 65 73  iteImplicitFiles
1f000 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  )] && \..       
1f010 20 20 20 20 20 20 20 20 20 20 20 5b 69 73 44 65             [isDe
1f020 66 61 75 6c 74 42 75 69 6c 64 50 6c 61 74 66 6f  faultBuildPlatfo
1f030 72 6d 20 74 72 75 65 5d 7d 20 74 68 65 6e 20 7b  rm true]} then {
1f040 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1f050 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
1f060 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61  me $nativeFileNa
1f070 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
1f080 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79           tryCopy
1f090 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61  Assembly $fileNa
1f0a0 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  me..            
1f0b0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1f0c0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1f0d0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
1f0e0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63  fo exists ::no(c
1f0f0 6f 70 79 53 71 6c 69 74 65 4e 6f 6e 49 6d 70 6c  opySqliteNonImpl
1f100 69 63 69 74 46 69 6c 65 73 29 5d 7d 20 74 68 65  icitFiles)]} the
1f110 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1f120 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
1f130 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79  exists ::no(copy
1f140 53 71 6c 69 74 65 50 6c 61 74 66 6f 72 6d 46 69  SqlitePlatformFi
1f150 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20  les)] && \..    
1f160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f170 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
1f180 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74  platform] > 0} t
1f190 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1f1a0 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
1f1b0 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76   fileName $nativ
1f1c0 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  eFileNames {..  
1f1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1e0 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c    tryCopyAssembl
1f1f0 79 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61  y $fileName $pla
1f200 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20 20  tform..         
1f210 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1f220 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
1f230 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f240 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
1f250 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69  ts ::no(copySqli
1f260 74 65 41 72 63 68 69 74 65 63 74 75 72 65 46 69  teArchitectureFi
1f270 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20  les)] && \..    
1f280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f290 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
1f2a0 61 72 63 68 69 74 65 63 74 75 72 65 5d 20 3e 20  architecture] > 
1f2b0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
1f2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
1f2d0 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e  each fileName $n
1f2e0 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b  ativeFileNames {
1f2f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1f300 20 20 20 20 20 20 74 72 79 43 6f 70 79 41 73 73        tryCopyAss
1f310 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20  embly $fileName 
1f320 24 61 72 63 68 69 74 65 63 74 75 72 65 0d 0a 20  $architecture.. 
1f330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f340 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
1f350 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1f360 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1f370 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1f380 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
1f390 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79  exists ::no(copy
1f3a0 53 71 6c 69 74 65 4d 61 6e 61 67 65 64 46 69 6c  SqliteManagedFil
1f3b0 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
1f3c0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
1f3d0 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 61  ach fileName $ma
1f3e0 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b  nagedFileNames {
1f3f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1f400 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c    tryCopyAssembl
1f410 79 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  y $fileName..   
1f420 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
1f430 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1f440 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1f450 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1f460 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20     # NOTE: Skip 
1f470 74 72 79 69 6e 67 20 74 6f 20 6c 6f 61 64 20 61  trying to load a
1f480 6e 79 20 66 69 6c 65 73 20 69 66 20 69 6e 73 74  ny files if inst
1f490 72 75 63 74 65 64 2e 0d 0a 20 20 20 20 20 20 20  ructed...       
1f4a0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1f4b0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
1f4c0 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74  s ::no(loadSqlit
1f4d0 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  eFiles)]} then {
1f4e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
1f4f0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
1f500 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 49  ::no(loadSqliteI
1f510 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d 20  mplicitFiles)]} 
1f520 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1f530 20 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73        tryLoadAss
1f540 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74  embly System.Dat
1f550 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 0d 0a 20 20  a.SQLite.dll..  
1f560 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
1f570 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
1f580 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
1f590 6f 28 6c 6f 61 64 53 71 6c 69 74 65 4c 69 6e 71  o(loadSqliteLinq
1f5a0 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
1f5b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
1f5c0 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20 53  ryLoadAssembly S
1f5d0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
1f5e0 65 2e 4c 69 6e 71 2e 64 6c 6c 0d 0a 20 20 20 20  e.Linq.dll..    
1f5f0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1f600 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
1f610 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
1f620 6c 6f 61 64 53 71 6c 69 74 65 45 66 36 46 69 6c  loadSqliteEf6Fil
1f630 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
1f640 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 4c              tryL
1f650 6f 61 64 41 73 73 65 6d 62 6c 79 20 53 79 73 74  oadAssembly Syst
1f660 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 45  em.Data.SQLite.E
1f670 46 36 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20  F6.dll..        
1f680 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1f690 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
1f6a0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64  exists ::no(load
1f6b0 53 71 6c 69 74 65 4e 6f 6e 49 6d 70 6c 69 63 69  SqliteNonImplici
1f6c0 74 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  tFiles)]} then {
1f6d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1f6e0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
1f6f0 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74  s ::no(loadSqlit
1f700 65 50 6c 61 74 66 6f 72 6d 46 69 6c 65 73 29 5d  ePlatformFiles)]
1f710 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
1f720 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
1f730 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72   length $platfor
1f740 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  m] > 0} then {..
1f750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f760 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20  tryLoadAssembly 
1f770 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
1f780 74 65 2e 64 6c 6c 20 24 70 6c 61 74 66 6f 72 6d  te.dll $platform
1f790 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1f7a0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
1f7b0 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
1f7c0 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71  ists ::no(loadSq
1f7d0 6c 69 74 65 41 72 63 68 69 74 65 63 74 75 72 65  liteArchitecture
1f7e0 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20  Files)] && \..  
1f7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f800 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
1f810 61 72 63 68 69 74 65 63 74 75 72 65 5d 20 3e 20  architecture] > 
1f820 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
1f830 20 20 20 20 20 20 20 20 20 20 20 74 72 79 4c 6f             tryLo
1f840 61 64 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65  adAssembly Syste
1f850 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
1f860 6c 20 24 61 72 63 68 69 74 65 63 74 75 72 65 0d  l $architecture.
1f870 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
1f880 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
1f890 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
1f8a0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1f8b0 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
1f8c0 61 6d 65 4f 6e 6c 79 20 5b 67 65 74 43 6f 72 65  ameOnly [getCore
1f8d0 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 73 4f  BinaryFileNamesO
1f8e0 6e 6c 79 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20  nly] {..        
1f8f0 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20    catch {..     
1f900 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
1f910 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
1f920 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
1f930 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
1f940 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f  - file version o
1f950 66 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 4f  f \"" $fileNameO
1f960 6e 6c 79 20 22 5c 22 2e 2e 2e 20 22 20 5c 0d 0a  nly "\"... " \..
1f970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f980 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67  [file version [g
1f990 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  etBinaryFileName
1f9a0 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d   $fileNameOnly]]
1f9b0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
1f9c0 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
1f9d0 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d          catch {.
1f9e0 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
1f9f0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1fa00 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1fa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
1fa20 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e  --- file version
1fa30 20 6f 66 20 5c 22 53 51 4c 69 74 65 2e 49 6e 74   of \"SQLite.Int
1fa40 65 72 6f 70 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20  erop.dll\"... " 
1fa50 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1fa60 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b   [file version [
1fa70 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
1fa80 65 20 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70  e SQLite.Interop
1fa90 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20  .dll]] \n]..    
1faa0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1fab0 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20   catch {..      
1fac0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
1fad0 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
1fae0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1faf0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c         "---- fil
1fb00 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53  e version of \"S
1fb10 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
1fb20 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5c 0d 0a  e.dll\"... " \..
1fb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66                [f
1fb40 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67 65 74  ile version [get
1fb50 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 53  BinaryFileName S
1fb60 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
1fb70 65 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20 20  e.dll]] \n]..   
1fb80 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1fb90 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20    catch {..     
1fba0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
1fbb0 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
1fbc0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1fbd0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69          "---- fi
1fbe0 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22  le version of \"
1fbf0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
1fc00 74 65 2e 4c 69 6e 71 2e 64 6c 6c 5c 22 2e 2e 2e  te.Linq.dll\"...
1fc10 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
1fc20 20 20 20 20 5b 66 69 6c 65 20 76 65 72 73 69 6f      [file versio
1fc30 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65  n [getBinaryFile
1fc40 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74 61  Name System.Data
1fc50 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c  .SQLite.Linq.dll
1fc60 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ]] \n]..        
1fc70 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74  }....        cat
1fc80 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
1fc90 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
1fca0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1fcb0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1fcc0 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65     "---- file ve
1fcd0 72 73 69 6f 6e 20 6f 66 20 5c 22 53 79 73 74 65  rsion of \"Syste
1fce0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 45 46  m.Data.SQLite.EF
1fcf0 36 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5c 0d 0a  6.dll\"... " \..
1fd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66                [f
1fd10 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67 65 74  ile version [get
1fd20 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 53  BinaryFileName S
1fd30 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
1fd40 65 2e 45 46 36 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d  e.EF6.dll]] \n].
1fd50 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
1fd60 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
1fd70 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f  g length $platfo
1fd80 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  rm] > 0} then {.
1fd90 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61  .          forea
1fda0 63 68 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20  ch fileNameOnly 
1fdb0 5b 67 65 74 43 6f 72 65 42 69 6e 61 72 79 46 69  [getCoreBinaryFi
1fdc0 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 7b 0d 0a  leNamesOnly] {..
1fdd0 20 20 20 20 20 20 20 20 20 20 20 20 63 61 74 63              catc
1fde0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
1fdf0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
1fe00 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
1fe10 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1fe20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
1fe30 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20  file version of 
1fe40 5c 22 22 20 24 70 6c 61 74 66 6f 72 6d 20 5c 0d  \"" $platform \.
1fe50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fe60 20 20 20 2f 20 24 66 69 6c 65 4e 61 6d 65 4f 6e     / $fileNameOn
1fe70 6c 79 20 22 5c 22 2e 2e 2e 20 22 20 5b 66 69 6c  ly "\"... " [fil
1fe80 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20  e version \..   
1fe90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
1fea0 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
1feb0 65 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20  e $fileNameOnly 
1fec0 24 70 6c 61 74 66 6f 72 6d 5d 5d 20 5c 6e 5d 0d  $platform]] \n].
1fed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
1fee0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
1fef0 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b           catch {
1ff00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
1ff10 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
1ff20 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1ff30 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1ff40 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65     "---- file ve
1ff50 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24 70 6c  rsion of \"" $pl
1ff60 61 74 66 6f 72 6d 20 5c 0d 0a 20 20 20 20 20 20  atform \..      
1ff70 20 20 20 20 20 20 20 20 20 20 22 2f 53 51 4c 69            "/SQLi
1ff80 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 5c 22  te.Interop.dll\"
1ff90 2e 2e 2e 20 22 20 5b 66 69 6c 65 20 76 65 72 73  ... " [file vers
1ffa0 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ion \..         
1ffb0 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61 72         [getBinar
1ffc0 79 46 69 6c 65 4e 61 6d 65 20 53 51 4c 69 74 65  yFileName SQLite
1ffd0 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 20 24 70 6c  .Interop.dll $pl
1ffe0 61 74 66 6f 72 6d 5d 5d 20 5c 6e 5d 0d 0a 20 20  atform]] \n]..  
1fff0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
20000 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a         catch {..
20010 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
20020 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
20030 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
20040 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20050 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73   "---- file vers
20060 69 6f 6e 20 6f 66 20 5c 22 22 20 24 70 6c 61 74  ion of \"" $plat
20070 66 6f 72 6d 20 5c 0d 0a 20 20 20 20 20 20 20 20  form \..        
20080 20 20 20 20 20 20 20 20 22 2f 53 79 73 74 65 6d          "/System
20090 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
200a0 5c 22 2e 2e 2e 20 22 20 5b 66 69 6c 65 20 76 65  \"... " [file ve
200b0 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20  rsion \..       
200c0 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e           [getBin
200d0 61 72 79 46 69 6c 65 4e 61 6d 65 20 53 79 73 74  aryFileName Syst
200e0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
200f0 6c 6c 20 24 70 6c 61 74 66 6f 72 6d 5d 5d 20 5c  ll $platform]] \
20100 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
20110 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
20120 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
20130 67 20 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74  g length $archit
20140 65 63 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65  ecture] > 0} the
20150 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66  n {..          f
20160 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 4f  oreach fileNameO
20170 6e 6c 79 20 5b 67 65 74 43 6f 72 65 42 69 6e 61  nly [getCoreBina
20180 72 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d  ryFileNamesOnly]
20190 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
201a0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
201b0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
201c0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
201d0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
201e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
201f0 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e  --- file version
20200 20 6f 66 20 5c 22 22 20 24 61 72 63 68 69 74 65   of \"" $archite
20210 63 74 75 72 65 20 5c 0d 0a 20 20 20 20 20 20 20  cture \..       
20220 20 20 20 20 20 20 20 20 20 20 20 2f 20 24 66 69             / $fi
20230 6c 65 4e 61 6d 65 4f 6e 6c 79 20 22 5c 22 2e 2e  leNameOnly "\"..
20240 2e 20 22 20 5b 66 69 6c 65 20 76 65 72 73 69 6f  . " [file versio
20250 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
20260 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61 72         [getBinar
20270 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e  yFileName $fileN
20280 61 6d 65 4f 6e 6c 79 20 24 61 72 63 68 69 74 65  ameOnly $archite
20290 63 74 75 72 65 5d 5d 20 5c 6e 5d 0d 0a 20 20 20  cture]] \n]..   
202a0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
202b0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
202c0 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
202d0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
202e0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
202f0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
20300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
20310 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f  ---- file versio
20320 6e 20 6f 66 20 5c 22 22 20 24 61 72 63 68 69 74  n of \"" $archit
20330 65 63 74 75 72 65 20 5c 0d 0a 20 20 20 20 20 20  ecture \..      
20340 20 20 20 20 20 20 20 20 20 20 22 2f 53 51 4c 69            "/SQLi
20350 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 5c 22  te.Interop.dll\"
20360 2e 2e 2e 20 22 20 5b 66 69 6c 65 20 76 65 72 73  ... " [file vers
20370 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ion \..         
20380 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61 72         [getBinar
20390 79 46 69 6c 65 4e 61 6d 65 20 53 51 4c 69 74 65  yFileName SQLite
203a0 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 20 24 61 72  .Interop.dll $ar
203b0 63 68 69 74 65 63 74 75 72 65 5d 5d 20 5c 6e 5d  chitecture]] \n]
203c0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
203d0 0a 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68  .          catch
203e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
203f0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
20400 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
20410 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
20420 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20       "---- file 
20430 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24  version of \"" $
20440 61 72 63 68 69 74 65 63 74 75 72 65 20 5c 0d 0a  architecture \..
20450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20460 22 2f 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  "/System.Data.SQ
20470 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20  Lite.dll\"... " 
20480 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d  [file version \.
20490 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
204a0 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
204b0 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  ame System.Data.
204c0 53 51 4c 69 74 65 2e 64 6c 6c 20 24 61 72 63 68  SQLite.dll $arch
204d0 69 74 65 63 74 75 72 65 5d 5d 20 5c 6e 5d 0d 0a  itecture]] \n]..
204e0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
204f0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
20500 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
20510 4f 54 45 3a 20 47 72 61 62 20 74 68 65 20 6c 69  OTE: Grab the li
20520 73 74 20 6f 66 20 6d 61 6e 61 67 65 64 20 61 73  st of managed as
20530 73 65 6d 62 6c 69 65 73 20 66 6f 72 20 74 68 65  semblies for the
20540 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73   current process
20550 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
20560 20 20 61 6e 64 20 72 65 70 6f 72 74 20 6f 6e 20    and report on 
20570 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  the System.Data.
20580 53 51 4c 69 74 65 20 72 65 6c 61 74 65 64 20 6f  SQLite related o
20590 6e 65 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  nes...        #.
205a0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61  .        if {[ha
205b0 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f  veSQLiteObjectCo
205c0 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a  mmand]} then {..
205d0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 61 73            set as
205e0 73 65 6d 62 6c 69 65 73 20 5b 6f 62 6a 65 63 74  semblies [object
205f0 20 69 6e 76 6f 6b 65 20 41 70 70 44 6f 6d 61 69   invoke AppDomai
20600 6e 2e 43 75 72 72 65 6e 74 44 6f 6d 61 69 6e 20  n.CurrentDomain 
20610 47 65 74 41 73 73 65 6d 62 6c 69 65 73 5d 0d 0a  GetAssemblies]..
20620 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65  ..          obje
20630 63 74 20 66 6f 72 65 61 63 68 20 61 73 73 65 6d  ct foreach assem
20640 62 6c 79 20 24 61 73 73 65 6d 62 6c 69 65 73 20  bly $assemblies 
20650 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
20660 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68  f {[string match
20670 20 5c 7b 53 79 73 74 65 6d 2e 44 61 74 61 2e 53   \{System.Data.S
20680 51 4c 69 74 65 2a 20 24 61 73 73 65 6d 62 6c 79  QLite* $assembly
20690 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
206a0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
206b0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
206c0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
206d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206e0 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c 6f 61 64  "---- found load
206f0 65 64 20 61 73 73 65 6d 62 6c 79 3a 20 22 20 24  ed assembly: " $
20700 61 73 73 65 6d 62 6c 79 20 5c 6e 5d 0d 0a 20 20  assembly \n]..  
20710 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
20720 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
20730 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63    }....        c
20740 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
20750 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
20760 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20  channel \..     
20770 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 64           "---- d
20780 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74 73 20  efine constants 
20790 66 6f 72 20 5c 22 53 79 73 74 65 6d 2e 44 61 74  for \"System.Dat
207a0 61 2e 53 51 4c 69 74 65 5c 22 2e 2e 2e 20 22 0d  a.SQLite\"... ".
207b0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
207c0 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
207d0 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
207e0 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
207f0 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
20800 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
20810 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
20820 69 74 65 33 20 44 65 66 69 6e 65 43 6f 6e 73 74  ite3 DefineConst
20830 61 6e 74 73 0d 0a 20 20 20 20 20 20 20 20 20 20  ants..          
20840 7d 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74  } defineConstant
20850 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  s] == 0} then {.
20860 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
20870 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
20880 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b  el [appendArgs [
20890 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73 6f 72  formatList [lsor
208a0 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
208b0 20 20 20 20 20 24 64 65 66 69 6e 65 43 6f 6e 73       $defineCons
208c0 74 61 6e 74 73 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c  tants] <none>] \
208d0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  n]..          } 
208e0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
208f0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
20900 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77  t_channel unknow
20910 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  n\n..          }
20920 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
20930 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a         catch {..
20940 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
20950 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
20960 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
20970 20 22 2d 2d 2d 2d 20 73 6f 75 72 63 65 20 76 65   "---- source ve
20980 72 73 69 6f 6e 20 6f 66 20 5c 22 53 79 73 74 65  rsion of \"Syste
20990 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
209a0 6c 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  l\"... "....    
209b0 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
209c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
209d0 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
209e0 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
209f0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
20a00 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
20a10 51 4c 69 74 65 2e 53 51 4c 69 74 65 43 6f 6e 6e  QLite.SQLiteConn
20a20 65 63 74 69 6f 6e 20 50 72 6f 76 69 64 65 72 56  ection ProviderV
20a30 65 72 73 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20  ersion..        
20a40 20 20 7d 20 76 65 72 73 69 6f 6e 5d 20 3d 3d 20    } version] == 
20a50 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
20a60 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
20a70 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72 73 69  ng length $versi
20a80 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  on] == 0} then {
20a90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
20aa0 73 65 74 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c  set version null
20ab0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
20ac0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
20ad0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
20ae0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  el [appendArgs $
20af0 76 65 72 73 69 6f 6e 20 5c 6e 5d 0d 0a 20 20 20  version \n]..   
20b00 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
20b10 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
20b20 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
20b30 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20  el unknown\n..  
20b40 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
20b50 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
20b60 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
20b70 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
20b80 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20  _channel \..    
20b90 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
20ba0 73 6f 75 72 63 65 20 63 68 65 63 6b 6f 75 74 20  source checkout 
20bb0 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61  of \"System.Data
20bc0 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e  .SQLite.dll\"...
20bd0 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   "....          
20be0 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
20bf0 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
20c00 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
20c10 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
20c20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
20c30 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
20c40 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
20c50 20 50 72 6f 76 69 64 65 72 53 6f 75 72 63 65 49   ProviderSourceI
20c60 64 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 73  d..          } s
20c70 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74  ourceId] == 0} t
20c80 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
20c90 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
20ca0 65 6e 67 74 68 20 24 73 6f 75 72 63 65 49 64 5d  ength $sourceId]
20cb0 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
20cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
20cd0 20 73 6f 75 72 63 65 49 64 20 6e 75 6c 6c 0d 0a   sourceId null..
20ce0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
20cf0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
20d00 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
20d10 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 73 6f   [appendArgs $so
20d20 75 72 63 65 49 64 20 5c 6e 5d 0d 0a 20 20 20 20  urceId \n]..    
20d30 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
20d40 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
20d50 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
20d60 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20  l unknown\n..   
20d70 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
20d80 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
20d90 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
20da0 3a 20 43 68 65 63 6b 20 74 68 65 20 61 76 61 69  : Check the avai
20db0 6c 61 62 6c 65 20 62 75 69 6c 64 73 20 28 61 6e  lable builds (an
20dc0 64 20 22 72 65 6c 65 61 73 65 73 22 29 20 6f 66  d "releases") of
20dd0 20 53 51 4c 69 74 65 20 61 6e 64 0d 0a 20 20 20   SQLite and..   
20de0 20 20 20 20 20 23 20 20 20 20 20 20 20 53 79 73       #       Sys
20df0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
20e00 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
20e10 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c       checkForSQL
20e20 69 74 65 42 75 69 6c 64 73 20 24 3a 3a 74 65 73  iteBuilds $::tes
20e30 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20  t_channel..     
20e40 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74     checkForSQLit
20e50 65 52 65 6c 65 61 73 65 73 20 24 3a 3a 74 65 73  eReleases $::tes
20e60 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20  t_channel....   
20e70 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
20e80 23 20 4e 4f 54 45 3a 20 4e 6f 77 2c 20 77 65 20  # NOTE: Now, we 
20e90 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 66 20  need to know if 
20ea0 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20  the SQLite core 
20eb0 6c 69 62 72 61 72 79 20 69 73 20 61 76 61 69 6c  library is avail
20ec0 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20  able..        # 
20ed0 20 20 20 20 20 20 28 69 2e 65 2e 20 62 65 63 61        (i.e. beca
20ee0 75 73 65 20 74 68 65 20 6d 61 6e 61 67 65 64 2d  use the managed-
20ef0 6f 6e 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61  only System.Data
20f00 2e 53 51 4c 69 74 65 20 61 73 73 65 6d 62 6c 79  .SQLite assembly
20f10 20 63 61 6e 0d 0a 20 20 20 20 20 20 20 20 23 20   can..        # 
20f20 20 20 20 20 20 20 6c 6f 61 64 20 77 69 74 68 6f        load witho
20f30 75 74 20 69 74 3b 20 68 6f 77 65 76 65 72 2c 20  ut it; however, 
20f40 69 74 20 63 61 6e 6e 6f 74 20 64 6f 20 61 6e 79  it cannot do any
20f50 74 68 69 6e 67 20 75 73 65 66 75 6c 20 77 69 74  thing useful wit
20f60 68 6f 75 74 0d 0a 20 20 20 20 20 20 20 20 23 20  hout..        # 
20f70 20 20 20 20 20 20 69 74 29 2e 20 20 49 66 20 77        it).  If w
20f80 65 20 61 72 65 20 75 73 69 6e 67 20 74 68 65 20  e are using the 
20f90 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d  mixed-mode assem
20fa0 62 6c 79 20 61 6e 64 20 77 65 20 61 6c 72 65 61  bly and we alrea
20fb0 64 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  dy..        #   
20fc0 20 20 20 20 66 6f 75 6e 64 20 69 74 20 28 61 62      found it (ab
20fd0 6f 76 65 29 2c 20 74 68 69 73 20 73 68 6f 75 6c  ove), this shoul
20fe0 64 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64  d always succeed
20ff0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
21000 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51        checkForSQ
21010 4c 69 74 65 4c 69 62 72 61 72 79 20 24 3a 3a 74  LiteLibrary $::t
21020 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20  est_channel.... 
21030 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
21040 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
21050 69 66 20 74 68 65 20 53 51 4c 69 74 65 20 69 6e  if the SQLite in
21060 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 69  terop assembly i
21070 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20  s available...  
21080 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
21090 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 49   checkForSQLiteI
210a0 6e 74 65 72 6f 70 20 24 3a 3a 74 65 73 74 5f 63  nterop $::test_c
210b0 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20  hannel....      
210c0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
210d0 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20 53  OTE: Check the S
210e0 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 61  QLite database a
210f0 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72  nd temporary dir
21100 65 63 74 6f 72 69 65 73 2e 0d 0a 20 20 20 20 20  ectories...     
21110 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68     #..        ch
21120 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 69 72 65  eckForSQLiteDire
21130 63 74 6f 72 69 65 73 20 24 3a 3a 74 65 73 74 5f  ctories $::test_
21140 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20  channel....     
21150 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
21160 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
21170 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 76 61   determine if va
21180 72 69 6f 75 73 20 63 6f 6d 70 69 6c 65 2d 74 69  rious compile-ti
21190 6d 65 20 6f 70 74 69 6f 6e 73 20 6e 65 65 64 65  me options neede
211a0 64 20 66 6f 72 0d 0a 20 20 20 20 20 20 20 20 23  d for..        #
211b0 20 20 20 20 20 20 20 74 65 73 74 20 63 6f 6e 73         test cons
211c0 74 72 61 69 6e 74 73 20 77 65 72 65 20 65 6e 61  traints were ena
211d0 62 6c 65 64 20 66 6f 72 20 74 68 65 20 6d 61 6e  bled for the man
211e0 61 67 65 64 20 61 73 73 65 6d 62 6c 79 2e 20 20  aged assembly.  
211f0 54 68 65 72 65 0d 0a 20 20 20 20 20 20 20 20 23  There..        #
21200 20 20 20 20 20 20 20 61 72 65 20 73 6f 6d 65 20         are some 
21210 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
21220 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20 61  ions that must a
21230 6c 73 6f 20 68 61 76 65 20 62 65 65 6e 20 65 6e  lso have been en
21240 61 62 6c 65 64 0d 0a 20 20 20 20 20 20 20 20 23  abled..        #
21250 20 20 20 20 20 20 20 66 6f 72 20 74 68 65 20 69         for the i
21260 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20  nterop assembly 
21270 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 65  in order to be e
21280 66 66 65 63 74 69 76 65 2e 20 20 46 6f 72 20 74  ffective.  For t
21290 68 6f 73 65 0d 0a 20 20 20 20 20 20 20 20 23 20  hose..        # 
212a0 20 20 20 20 20 20 6f 70 74 69 6f 6e 73 2c 20 69        options, i
212b0 74 20 77 69 6c 6c 20 62 65 20 61 73 73 75 6d 65  t will be assume
212c0 64 20 74 68 61 74 20 69 74 20 77 61 73 20 65 6e  d that it was en
212d0 61 62 6c 65 64 20 66 6f 72 20 74 68 65 20 69 6e  abled for the in
212e0 74 65 72 6f 70 0d 0a 20 20 20 20 20 20 20 20 23  terop..        #
212f0 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 20         assembly 
21300 69 66 20 69 74 20 77 61 73 20 65 6e 61 62 6c 65  if it was enable
21310 64 20 66 6f 72 20 74 68 65 20 6d 61 6e 61 67 65  d for the manage
21320 64 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20  d assembly...   
21330 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
21340 66 6f 72 65 61 63 68 20 64 65 66 69 6e 65 43 6f  foreach defineCo
21350 6e 73 74 61 6e 74 20 5b 6c 69 73 74 20 5c 0d 0a  nstant [list \..
21360 20 20 20 20 20 20 20 20 20 20 20 20 43 48 45 43              CHEC
21370 4b 5f 53 54 41 54 45 20 43 4f 55 4e 54 5f 48 41  K_STATE COUNT_HA
21380 4e 44 4c 45 20 44 45 42 55 47 20 49 4e 54 45 52  NDLE DEBUG INTER
21390 4f 50 5f 43 4f 44 45 43 20 49 4e 54 45 52 4f 50  OP_CODEC INTEROP
213a0 5f 44 45 42 55 47 20 5c 0d 0a 20 20 20 20 20 20  _DEBUG \..      
213b0 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 45 58        INTEROP_EX
213c0 54 45 4e 53 49 4f 4e 5f 46 55 4e 43 54 49 4f 4e  TENSION_FUNCTION
213d0 53 20 49 4e 54 45 52 4f 50 5f 46 54 53 35 5f 45  S INTEROP_FTS5_E
213e0 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20  XTENSION \..    
213f0 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f          INTEROP_
21400 49 4e 43 4c 55 44 45 5f 43 45 52 4f 44 20 49 4e  INCLUDE_CEROD IN
21410 54 45 52 4f 50 5f 49 4e 43 4c 55 44 45 5f 45 58  TEROP_INCLUDE_EX
21420 54 52 41 20 49 4e 54 45 52 4f 50 5f 49 4e 43 4c  TRA INTEROP_INCL
21430 55 44 45 5f 53 45 45 20 5c 0d 0a 20 20 20 20 20  UDE_SEE \..     
21440 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 49         INTEROP_I
21450 4e 43 4c 55 44 45 5f 5a 49 50 56 46 53 20 49 4e  NCLUDE_ZIPVFS IN
21460 54 45 52 4f 50 5f 4a 53 4f 4e 31 5f 45 58 54 45  TEROP_JSON1_EXTE
21470 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20  NSION \..       
21480 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 4c 45 47       INTEROP_LEG
21490 41 43 59 5f 43 4c 4f 53 45 20 49 4e 54 45 52 4f  ACY_CLOSE INTERO
214a0 50 5f 4c 4f 47 20 49 4e 54 45 52 4f 50 5f 50 45  P_LOG INTEROP_PE
214b0 52 43 45 4e 54 49 4c 45 5f 45 58 54 45 4e 53 49  RCENTILE_EXTENSI
214c0 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ON \..          
214d0 20 20 49 4e 54 45 52 4f 50 5f 52 45 47 45 58 50    INTEROP_REGEXP
214e0 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54 45 52  _EXTENSION INTER
214f0 4f 50 5f 54 45 53 54 5f 45 58 54 45 4e 53 49 4f  OP_TEST_EXTENSIO
21500 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  N \..           
21510 20 49 4e 54 45 52 4f 50 5f 54 4f 54 59 50 45 5f   INTEROP_TOTYPE_
21520 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54 45 52 4f  EXTENSION INTERO
21530 50 5f 56 49 52 54 55 41 4c 5f 54 41 42 4c 45 20  P_VIRTUAL_TABLE 
21540 4e 45 54 5f 32 30 20 4e 45 54 5f 33 35 20 5c 0d  NET_20 NET_35 \.
21550 0a 20 20 20 20 20 20 20 20 20 20 20 20 4e 45 54  .            NET
21560 5f 34 30 20 4e 45 54 5f 34 35 20 4e 45 54 5f 34  _40 NET_45 NET_4
21570 35 31 20 4e 45 54 5f 34 35 32 20 4e 45 54 5f 34  51 NET_452 NET_4
21580 36 20 4e 45 54 5f 34 36 31 20 4e 45 54 5f 43 4f  6 NET_461 NET_CO
21590 4d 50 41 43 54 5f 32 30 20 5c 0d 0a 20 20 20 20  MPACT_20 \..    
215a0 20 20 20 20 20 20 20 20 50 4c 41 54 46 4f 52 4d          PLATFORM
215b0 5f 43 4f 4d 50 41 43 54 46 52 41 4d 45 57 4f 52  _COMPACTFRAMEWOR
215c0 4b 20 50 52 45 4c 4f 41 44 5f 4e 41 54 49 56 45  K PRELOAD_NATIVE
215d0 5f 4c 49 42 52 41 52 59 20 52 45 54 41 52 47 45  _LIBRARY RETARGE
215e0 54 41 42 4c 45 20 5c 0d 0a 20 20 20 20 20 20 20  TABLE \..       
215f0 20 20 20 20 20 53 51 4c 49 54 45 5f 53 54 41 4e       SQLITE_STAN
21600 44 41 52 44 20 54 48 52 4f 57 5f 4f 4e 5f 44 49  DARD THROW_ON_DI
21610 53 50 4f 53 45 44 20 54 52 41 43 45 20 54 52 41  SPOSED TRACE TRA
21620 43 45 5f 43 4f 4e 4e 45 43 54 49 4f 4e 20 5c 0d  CE_CONNECTION \.
21630 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 52 41  .            TRA
21640 43 45 5f 44 45 54 45 43 54 49 4f 4e 20 54 52 41  CE_DETECTION TRA
21650 43 45 5f 48 41 4e 44 4c 45 20 54 52 41 43 45 5f  CE_HANDLE TRACE_
21660 50 52 45 4c 4f 41 44 20 54 52 41 43 45 5f 53 48  PRELOAD TRACE_SH
21670 41 52 45 44 20 5c 0d 0a 20 20 20 20 20 20 20 20  ARED \..        
21680 20 20 20 20 54 52 41 43 45 5f 53 54 41 54 45 4d      TRACE_STATEM
21690 45 4e 54 20 54 52 41 43 45 5f 57 41 52 4e 49 4e  ENT TRACE_WARNIN
216a0 47 20 54 52 41 43 4b 5f 4d 45 4d 4f 52 59 5f 42  G TRACK_MEMORY_B
216b0 59 54 45 53 20 5c 0d 0a 20 20 20 20 20 20 20 20  YTES \..        
216c0 20 20 20 20 55 53 45 5f 45 4e 54 49 54 59 5f 46      USE_ENTITY_F
216d0 52 41 4d 45 57 4f 52 4b 5f 36 20 55 53 45 5f 49  RAMEWORK_6 USE_I
216e0 4e 54 45 52 4f 50 5f 44 4c 4c 20 55 53 45 5f 50  NTEROP_DLL USE_P
216f0 52 45 50 41 52 45 5f 56 32 20 57 49 4e 44 4f 57  REPARE_V2 WINDOW
21700 53 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  S] {..          
21710 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
21720 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68  OTE: Check if th
21730 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  e compile-time o
21740 70 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64 20  ption is listed 
21750 69 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 0d 0a  in the list of..
21760 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
21770 20 20 22 64 65 66 69 6e 65 20 63 6f 6e 73 74 61    "define consta
21780 6e 74 73 22 20 6b 65 70 74 20 74 72 61 63 6b 20  nts" kept track 
21790 6f 66 20 62 79 20 74 68 65 20 6d 61 6e 61 67 65  of by the manage
217a0 64 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20  d assembly...   
217b0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
217c0 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69      checkForSQLi
217d0 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74  teDefineConstant
217e0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
217f0 20 24 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74   $defineConstant
21800 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
21810 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
21820 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
21830 69 66 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61  if the System.Da
21840 74 61 2e 53 51 4c 69 74 65 20 70 72 6f 76 69 64  ta.SQLite provid
21850 65 72 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 20  er was compiled 
21860 77 69 74 68 0d 0a 20 20 20 20 20 20 20 20 23 20  with..        # 
21870 20 20 20 20 20 20 73 75 70 70 6f 72 74 20 66 6f        support fo
21880 72 20 61 6e 79 20 65 6e 63 72 79 70 74 65 64 20  r any encrypted 
21890 64 61 74 61 62 61 73 65 73 2e 0d 0a 20 20 20 20  databases...    
218a0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
218b0 66 20 7b 5b 68 61 76 65 43 6f 6e 73 74 72 61 69  f {[haveConstrai
218c0 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  nt \..          
218d0 20 20 20 20 20 20 64 65 66 69 6e 65 43 6f 6e 73        defineCons
218e0 74 61 6e 74 2e 53 79 73 74 65 6d 2e 44 61 74 61  tant.System.Data
218f0 2e 53 51 4c 69 74 65 2e 49 4e 54 45 52 4f 50 5f  .SQLite.INTEROP_
21900 43 4f 44 45 43 5d 20 7c 7c 20 5c 0d 0a 20 20 20  CODEC] || \..   
21910 20 20 20 20 20 20 20 20 20 5b 68 61 76 65 43 6f           [haveCo
21920 6e 73 74 72 61 69 6e 74 20 5c 0d 0a 20 20 20 20  nstraint \..    
21930 20 20 20 20 20 20 20 20 20 20 20 20 64 65 66 69              defi
21940 6e 65 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74 65  neConstant.Syste
21950 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 49 4e  m.Data.SQLite.IN
21960 54 45 52 4f 50 5f 49 4e 43 4c 55 44 45 5f 53 45  TEROP_INCLUDE_SE
21970 45 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  E]} then {..    
21980 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
21990 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20     # NOTE: Yes, 
219a0 61 64 64 20 67 65 6e 65 72 69 63 20 63 6f 6e 73  add generic cons
219b0 74 72 61 69 6e 74 20 66 6f 72 20 75 73 65 20 62  traint for use b
219c0 79 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  y the test suite
219d0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
219e0 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
219f0 73 74 72 61 69 6e 74 20 53 79 73 74 65 6d 2e 44  straint System.D
21a00 61 74 61 2e 53 51 4c 69 74 65 2e 45 6e 63 72 79  ata.SQLite.Encry
21a10 70 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 7d  ption..        }
21a20 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
21a30 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
21a40 68 65 63 6b 20 74 68 65 20 63 75 72 72 65 6e 74  heck the current
21a50 20 62 75 69 6c 64 20 79 65 61 72 2e 20 20 42 61   build year.  Ba
21a60 73 69 63 61 6c 6c 79 2c 20 74 68 69 73 20 69 6e  sically, this in
21a70 64 69 63 61 74 65 73 0d 0a 20 20 20 20 20 20 20  dicates..       
21a80 20 23 20 20 20 20 20 20 20 77 68 69 63 68 20 76   #       which v
21a90 65 72 73 69 6f 6e 20 6f 66 20 4d 53 42 75 69 6c  ersion of MSBuil
21aa0 64 20 61 6e 64 2f 6f 72 20 56 69 73 75 61 6c 20  d and/or Visual 
21ab0 53 74 75 64 69 6f 20 77 61 73 20 75 73 65 64 20  Studio was used 
21ac0 74 6f 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  to..        #   
21ad0 20 20 20 20 63 6f 6d 70 69 6c 65 20 74 68 65 20      compile the 
21ae0 61 73 73 65 6d 62 6c 79 20 62 69 6e 61 72 69 65  assembly binarie
21af0 73 20 75 6e 64 65 72 20 74 65 73 74 2e 0d 0a 20  s under test... 
21b00 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
21b10 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
21b20 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20  channel \..     
21b30 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65         "---- che
21b40 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d  cking for System
21b50 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75 69  .Data.SQLite bui
21b60 6c 64 20 79 65 61 72 2e 2e 2e 20 22 0d 0a 0d 0a  ld year... "....
21b70 20 20 20 20 20 20 20 20 73 65 74 20 79 65 61 72          set year
21b80 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72 5d 0d   [getBuildYear].
21b90 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73  .        addCons
21ba0 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
21bb0 67 73 20 62 75 69 6c 64 59 65 61 72 2e 20 24 79  gs buildYear. $y
21bc0 65 61 72 5d 0d 0a 20 20 20 20 20 20 20 20 74 70  ear]..        tp
21bd0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
21be0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
21bf0 5c 22 20 24 79 65 61 72 20 5c 22 5c 6e 5d 0d 0a  \" $year \"\n]..
21c00 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
21c10 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
21c20 63 6b 20 74 68 65 20 63 75 72 72 65 6e 74 20 62  ck the current b
21c30 75 69 6c 64 20 2e 4e 45 54 20 46 72 61 6d 65 77  uild .NET Framew
21c40 6f 72 6b 2e 20 20 42 61 73 69 63 61 6c 6c 79 2c  ork.  Basically,
21c50 20 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20 23   this..        #
21c60 20 20 20 20 20 20 20 69 6e 64 69 63 61 74 65 73         indicates
21c70 20 77 68 69 63 68 20 76 65 72 73 69 6f 6e 20 6f   which version o
21c80 66 20 74 68 65 20 2e 4e 45 54 20 46 72 61 6d 65  f the .NET Frame
21c90 77 6f 72 6b 20 69 73 20 62 65 69 6e 67 0d 0a 20  work is being.. 
21ca0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75         #       u
21cb0 73 65 64 20 62 79 20 74 68 65 20 61 73 73 65 6d  sed by the assem
21cc0 62 6c 79 20 62 69 6e 61 72 69 65 73 20 75 6e 64  bly binaries und
21cd0 65 72 20 74 65 73 74 2e 0d 0a 20 20 20 20 20 20  er test...      
21ce0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75    #..        tpu
21cf0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
21d00 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  el \..          
21d10 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67    "---- checking
21d20 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61   for System.Data
21d30 2e 53 51 4c 69 74 65 20 62 75 69 6c 64 20 2e 4e  .SQLite build .N
21d40 45 54 20 46 72 61 6d 65 77 6f 72 6b 2e 2e 2e 20  ET Framework... 
21d50 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74  "....        set
21d60 20 6e 65 74 46 78 20 5b 67 65 74 42 75 69 6c 64   netFx [getBuild
21d70 4e 65 74 46 78 5d 0d 0a 20 20 20 20 20 20 20 20  NetFx]..        
21d80 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  addConstraint [a
21d90 70 70 65 6e 64 41 72 67 73 20 62 75 69 6c 64 46  ppendArgs buildF
21da0 72 61 6d 65 77 6f 72 6b 2e 20 24 6e 65 74 46 78  ramework. $netFx
21db0 5d 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  ]..        tputs
21dc0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
21dd0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20   [appendArgs \" 
21de0 24 6e 65 74 46 78 20 5c 22 5c 6e 5d 0d 0a 0d 0a  $netFx \"\n]....
21df0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
21e00 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
21e10 20 74 68 65 20 63 75 72 72 65 6e 74 20 62 75 69   the current bui
21e20 6c 64 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ld configuration
21e30 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e  .  This should n
21e40 6f 72 6d 61 6c 6c 79 0d 0a 20 20 20 20 20 20 20  ormally..       
21e50 20 23 20 20 20 20 20 20 20 62 65 20 65 69 74 68   #       be eith
21e60 65 72 20 22 44 65 62 75 67 22 20 6f 72 20 22 52  er "Debug" or "R
21e70 65 6c 65 61 73 65 22 2e 0d 0a 20 20 20 20 20 20  elease"...      
21e80 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75    #..        tpu
21e90 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
21ea0 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  el \..          
21eb0 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67    "---- checking
21ec0 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61   for System.Data
21ed0 2e 53 51 4c 69 74 65 20 62 75 69 6c 64 20 63 6f  .SQLite build co
21ee0 6e 66 69 67 75 72 61 74 69 6f 6e 2e 2e 2e 20 22  nfiguration... "
21ef0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
21f00 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 5b 67  configuration [g
21f10 65 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72 61  etBuildConfigura
21f20 74 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 20 20 61  tion]..        a
21f30 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  ddConstraint [ap
21f40 70 65 6e 64 41 72 67 73 20 62 75 69 6c 64 43 6f  pendArgs buildCo
21f50 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 24 63 6f  nfiguration. $co
21f60 6e 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 20 20  nfiguration]..  
21f70 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
21f80 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
21f90 65 6e 64 41 72 67 73 20 5c 22 20 24 63 6f 6e 66  endArgs \" $conf
21fa0 69 67 75 72 61 74 69 6f 6e 20 5c 22 5c 6e 5d 0d  iguration \"\n].
21fb0 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
21fc0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 72        # NOTE: Tr
21fd0 79 20 74 6f 20 73 65 74 75 70 20 61 6e 20 69 6e  y to setup an in
21fe0 74 65 72 72 75 70 74 20 63 61 6c 6c 62 61 63 6b  terrupt callback
21ff0 20 75 73 69 6e 67 20 74 68 65 20 73 63 72 69 70   using the scrip
22000 74 20 64 65 62 75 67 67 65 72 0d 0a 20 20 20 20  t debugger..    
22010 20 20 20 20 23 20 20 20 20 20 20 20 74 68 61 74      #       that
22020 20 77 69 6c 6c 20 63 61 6e 63 65 6c 20 61 6c 6c   will cancel all
22030 20 53 51 4c 20 71 75 65 72 69 65 73 20 69 6e 20   SQL queries in 
22040 70 72 6f 67 72 65 73 73 20 66 6f 72 20 61 6c 6c  progress for all
22050 20 64 61 74 61 62 61 73 65 0d 0a 20 20 20 20 20   database..     
22060 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 6e 65     #       conne
22070 63 74 69 6f 6e 73 20 6b 6e 6f 77 6e 20 74 6f 20  ctions known to 
22080 74 68 69 73 20 69 6e 74 65 72 70 72 65 74 65 72  this interpreter
22090 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
220a0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
220b0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c   exists ::no(sql
220c0 69 74 65 49 6e 74 65 72 72 75 70 74 43 61 6c 6c  iteInterruptCall
220d0 62 61 63 6b 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  back)]} then {..
220e0 20 20 20 20 20 20 20 20 20 20 73 65 74 75 70 44            setupD
220f0 62 49 6e 74 65 72 72 75 70 74 43 61 6c 6c 62 61  bInterruptCallba
22100 63 6b 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ck $::test_chann
22110 65 6c 20 24 3a 3a 74 65 73 74 5f 6c 6f 67 0d 0a  el $::test_log..
22120 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
22130 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
22140 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f  # NOTE: Check fo
22150 72 20 74 68 65 20 6e 61 74 69 76 65 20 72 75 6e  r the native run
22160 74 69 6d 65 20 6f 70 74 69 6f 6e 2c 20 77 68 69  time option, whi
22170 63 68 20 77 6f 75 6c 64 20 6d 65 61 6e 20 77 65  ch would mean we
22180 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20   are..        # 
22190 20 20 20 20 20 20 75 73 69 6e 67 20 74 68 65 20        using the 
221a0 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d  mixed-mode assem
221b0 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  bly...        #.
221c0 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f  .        checkFo
221d0 72 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 24  rRuntimeOption $
221e0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 6e  ::test_channel n
221f0 61 74 69 76 65 0d 0a 0d 0a 20 20 20 20 20 20 20  ative....       
22200 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
22210 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65  TE: Check if the
22220 20 74 65 73 74 20 73 75 69 74 65 20 73 68 6f 75   test suite shou
22230 6c 64 20 63 6f 75 6e 74 20 74 68 65 20 6e 75 6d  ld count the num
22240 62 65 72 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f  ber of connectio
22250 6e 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ns..        #   
22260 20 20 20 20 22 6f 70 65 6e 65 64 22 20 61 6e 64      "opened" and
22270 20 22 63 6c 6f 73 65 64 22 20 66 72 6f 6d 20 74   "closed" from t
22280 68 65 20 70 6f 6f 6c 20 77 68 65 6e 20 64 65 74  he pool when det
22290 65 72 6d 69 6e 69 6e 67 20 69 66 20 61 20 74 65  ermining if a te
222a0 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  st..        #   
222b0 20 20 20 20 70 61 73 73 65 64 2e 20 20 44 69 73      passed.  Dis
222c0 61 62 6c 69 6e 67 20 74 68 69 73 20 62 65 68 61  abling this beha
222d0 76 69 6f 72 20 69 73 20 73 6f 6d 65 74 69 6d 65  vior is sometime
222e0 73 20 6e 65 63 65 73 73 61 72 79 20 28 65 2e 67  s necessary (e.g
222f0 2e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ...        #    
22300 20 20 20 64 75 72 69 6e 67 20 74 68 65 20 72 65     during the re
22310 6c 65 61 73 65 20 74 65 73 74 69 6e 67 20 70 72  lease testing pr
22320 6f 63 65 73 73 29 20 62 65 63 61 75 73 65 20 74  ocess) because t
22330 68 65 72 65 20 61 72 65 20 73 65 76 65 72 61 6c  here are several
22340 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
22350 20 20 74 65 73 74 73 20 74 68 61 74 20 72 65 6c    tests that rel
22360 79 20 6f 6e 20 74 68 65 20 22 6f 70 65 6e 65 64  y on the "opened
22370 20 66 72 6f 6d 20 70 6f 6f 6c 22 20 63 6f 75 6e   from pool" coun
22380 74 20 62 65 69 6e 67 20 67 72 65 61 74 65 72 0d  t being greater.
22390 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
223a0 20 74 68 61 6e 20 7a 65 72 6f 2e 20 20 54 68 65   than zero.  The
223b0 73 65 20 74 65 73 74 73 20 6d 61 79 20 66 61 69  se tests may fai
223c0 6c 20 64 75 65 20 74 6f 20 74 68 65 20 6e 6f 6e  l due to the non
223d0 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 0d 0a  -deterministic..
223e0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
223f0 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20  behavior of the 
22400 43 4c 52 20 47 43 2c 20 65 76 65 6e 20 77 68 65  CLR GC, even whe
22410 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 62 75  n there is no bu
22420 67 20 69 6e 20 74 68 65 20 63 6f 64 65 0d 0a 20  g in the code.. 
22430 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62         #       b
22440 65 69 6e 67 20 74 65 73 74 65 64 2e 0d 0a 20 20  eing tested...  
22450 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
22460 20 63 68 65 63 6b 46 6f 72 52 75 6e 74 69 6d 65   checkForRuntime
22470 4f 70 74 69 6f 6e 20 24 3a 3a 74 65 73 74 5f 63  Option $::test_c
22480 68 61 6e 6e 65 6c 20 6e 6f 50 6f 6f 6c 43 6f 75  hannel noPoolCou
22490 6e 74 73 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  nts....        #
224a0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
224b0 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 74  : Check if the t
224c0 65 73 74 20 73 75 69 74 65 20 73 68 6f 75 6c 64  est suite should
224d0 20 75 73 65 20 73 68 61 72 65 64 2d 63 61 63 68   use shared-cach
224e0 65 20 6d 6f 64 65 2e 0d 0a 20 20 20 20 20 20 20  e mode...       
224f0 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63   #..        chec
22500 6b 46 6f 72 52 75 6e 74 69 6d 65 4f 70 74 69 6f  kForRuntimeOptio
22510 6e 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  n $::test_channe
22520 6c 20 73 68 61 72 65 64 43 61 63 68 65 0d 0a 0d  l sharedCache...
22530 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
22540 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 70 6f      # NOTE: Repo
22550 72 74 20 74 68 65 20 72 65 73 6f 75 72 63 65 20  rt the resource 
22560 75 73 61 67 65 20 70 72 69 6f 72 20 74 6f 20 72  usage prior to r
22570 75 6e 6e 69 6e 67 20 61 6e 79 20 74 65 73 74 73  unning any tests
22580 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
22590 20 20 20 20 20 20 72 65 70 6f 72 74 53 51 4c 69        reportSQLi
225a0 74 65 52 65 73 6f 75 72 63 65 73 20 24 3a 3a 74  teResources $::t
225b0 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20  est_channel.... 
225c0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
225d0 20 20 23 20 4e 4f 54 45 3a 20 47 72 61 62 20 74    # NOTE: Grab t
225e0 68 65 20 6c 69 73 74 20 6f 66 20 6e 61 74 69 76  he list of nativ
225f0 65 20 6d 6f 64 75 6c 65 73 20 66 6f 72 20 74 68  e modules for th
22600 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73  e current proces
22610 73 20 61 6e 64 0d 0a 20 20 20 20 20 20 20 20 23  s and..        #
22620 20 20 20 20 20 20 20 72 65 70 6f 72 74 20 6f 6e         report on
22630 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61   the System.Data
22640 2e 53 51 4c 69 74 65 20 72 65 6c 61 74 65 64 20  .SQLite related 
22650 6f 6e 65 73 2e 0d 0a 20 20 20 20 20 20 20 20 23  ones...        #
22660 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68  ..        if {[h
22670 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43  aveSQLiteObjectC
22680 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d  ommand]} then {.
22690 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6d  .          set m
226a0 6f 64 75 6c 65 73 20 5b 6f 62 6a 65 63 74 20 69  odules [object i
226b0 6e 76 6f 6b 65 20 5c 0d 0a 20 20 20 20 20 20 20  nvoke \..       
226c0 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 69         System.Di
226d0 61 67 6e 6f 73 74 69 63 73 2e 50 72 6f 63 65 73  agnostics.Proces
226e0 73 2e 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  s.GetCurrentProc
226f0 65 73 73 20 4d 6f 64 75 6c 65 73 5d 0d 0a 0d 0a  ess Modules]....
22700 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
22710 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20   foreach -alias 
22720 6d 6f 64 75 6c 65 20 24 6d 6f 64 75 6c 65 73 20  module $modules 
22730 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  {..            #
22740 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
22750 4e 4f 54 45 3a 20 54 68 65 20 6d 6f 64 75 6c 65  NOTE: The module
22760 20 66 69 6c 65 20 6e 61 6d 65 20 68 65 72 65 20   file name here 
22770 6d 75 73 74 20 62 65 20 6e 6f 72 6d 61 6c 69 7a  must be normaliz
22780 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ed...           
22790 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
227a0 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69  set fileName [fi
227b0 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65 20 5b 24 6d  le normalize [$m
227c0 6f 64 75 6c 65 20 46 69 6c 65 4e 61 6d 65 5d 5d  odule FileName]]
227d0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
227e0 69 66 20 7b 5b 6c 73 65 61 72 63 68 20 2d 65 78  if {[lsearch -ex
227f0 61 63 74 20 2d 6e 6f 63 61 73 65 20 2d 2d 20 5b  act -nocase -- [
22800 67 65 74 43 6f 72 65 42 69 6e 61 72 79 46 69 6c  getCoreBinaryFil
22810 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 5c 0d 0a 20  eNamesOnly] \.. 
22820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
22830 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e  file tail $fileN
22840 61 6d 65 5d 5d 20 21 3d 20 2d 31 7d 20 74 68 65  ame]] != -1} the
22850 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
22860 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
22870 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
22880 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
22890 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
228a0 66 6f 75 6e 64 20 6c 6f 61 64 65 64 20 53 51 4c  found loaded SQL
228b0 69 74 65 20 6e 61 74 69 76 65 20 6c 69 62 72 61  ite native libra
228c0 72 79 20 6d 6f 64 75 6c 65 3a 20 22 20 5c 0d 0a  ry module: " \..
228d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228e0 20 20 24 66 69 6c 65 4e 61 6d 65 20 5c 6e 5d 0d    $fileName \n].
228f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65  .            } e
22900 6c 73 65 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d  lseif {[string m
22910 61 74 63 68 20 5c 0d 0a 20 20 20 20 20 20 20 20  atch \..        
22920 20 20 20 20 20 20 20 20 2d 6e 6f 63 61 73 65 20          -nocase 
22930 2a 2f 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70  */SQLite.Interop
22940 2e 64 6c 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 7d  .dll $fileName]}
22950 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
22960 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
22970 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
22980 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
22990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
229a0 2d 2d 2d 20 66 6f 75 6e 64 20 6c 6f 61 64 65 64  --- found loaded
229b0 20 53 51 4c 69 74 65 20 69 6e 74 65 72 6f 70 20   SQLite interop 
229c0 61 73 73 65 6d 62 6c 79 20 6d 6f 64 75 6c 65 3a  assembly module:
229d0 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
229e0 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d          $fileNam
229f0 65 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  e \n]..         
22a00 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
22a10 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
22a20 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d          catch {.
22a30 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
22a40 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
22a50 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
22a60 20 20 22 2d 2d 2d 2d 20 63 6f 6d 70 69 6c 65 2d    "---- compile-
22a70 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 66 6f 72  time options for
22a80 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62   SQLite core lib
22a90 72 61 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  rary... "....   
22aa0 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
22ab0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
22ac0 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
22ad0 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
22ae0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
22af0 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
22b00 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 53  SQLite.SQLite3 S
22b10 51 4c 69 74 65 43 6f 6d 70 69 6c 65 4f 70 74 69  QLiteCompileOpti
22b20 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  ons..          }
22b30 20 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 5d   compileOptions]
22b40 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
22b50 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
22b60 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
22b70 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 66 6f   [appendArgs [fo
22b80 72 6d 61 74 4c 69 73 74 20 5b 6c 73 6f 72 74 20  rmatList [lsort 
22b90 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
22ba0 20 20 20 24 63 6f 6d 70 69 6c 65 4f 70 74 69 6f     $compileOptio
22bb0 6e 73 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d  ns] <none>] \n].
22bc0 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
22bd0 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
22be0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
22bf0 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e  hannel unknown\n
22c00 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
22c10 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
22c20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
22c30 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
22c40 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a  test_channel \..
22c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
22c60 2d 2d 2d 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  --- compile-time
22c70 20 6f 70 74 69 6f 6e 73 20 66 6f 72 20 53 51 4c   options for SQL
22c80 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65  ite interop asse
22c90 6d 62 6c 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  mbly... "....   
22ca0 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
22cb0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
22cc0 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
22cd0 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
22ce0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
22cf0 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
22d00 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 49  SQLite.SQLite3 I
22d10 6e 74 65 72 6f 70 43 6f 6d 70 69 6c 65 4f 70 74  nteropCompileOpt
22d20 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20 20 20  ions..          
22d30 7d 20 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73  } compileOptions
22d40 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
22d50 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
22d60 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
22d70 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 66  l [appendArgs [f
22d80 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73 6f 72 74  ormatList [lsort
22d90 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
22da0 20 20 20 20 24 63 6f 6d 70 69 6c 65 4f 70 74 69      $compileOpti
22db0 6f 6e 73 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d  ons] <none>] \n]
22dc0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
22dd0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
22de0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
22df0 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c  channel unknown\
22e00 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  n..          }..
22e10 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
22e20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
22e30 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68 65  # NOTE: Show the
22e40 20 61 63 74 69 76 65 20 74 65 73 74 20 63 6f 6e   active test con
22e50 73 74 72 61 69 6e 74 73 2e 0d 0a 20 20 20 20 20  straints...     
22e60 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70     #..        tp
22e70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
22e80 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
22e90 22 2d 2d 2d 2d 20 63 6f 6e 73 74 72 61 69 6e 74  "---- constraint
22ea0 73 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  s: " \..        
22eb0 20 20 20 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20      [formatList 
22ec0 5b 6c 73 6f 72 74 20 5b 67 65 74 43 6f 6e 73 74  [lsort [getConst
22ed0 72 61 69 6e 74 73 5d 5d 20 3c 6e 6f 6e 65 3e 5d  raints]] <none>]
22ee0 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20   \n]....        
22ef0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
22f00 45 3a 20 53 61 76 65 20 74 68 65 20 74 65 73 74  E: Save the test
22f10 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f 72   constraints for
22f20 20 75 73 65 20 62 79 20 74 68 72 65 61 64 73 20   use by threads 
22f30 63 72 65 61 74 65 64 20 69 6e 20 74 68 69 73 0d  created in this.
22f40 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
22f50 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 6f 6d   application dom
22f60 61 69 6e 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ain.  This is ne
22f70 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65 20  cessary because 
22f80 61 6c 6c 20 74 68 65 20 45 61 67 6c 65 0d 0a 20  all the Eagle.. 
22f90 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22         #       "
22fa0 74 65 73 74 20 63 6f 6e 74 65 78 74 22 20 69 6e  test context" in
22fb0 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 70 65 72  formation is per
22fc0 2d 74 68 72 65 61 64 2e 0d 0a 20 20 20 20 20 20  -thread...      
22fd0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
22fe0 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
22ff0 3a 74 65 73 74 5f 63 6f 6e 73 74 72 61 69 6e 74  :test_constraint
23000 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  s]} then {..    
23010 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74        set ::test
23020 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 24 3a 3a  _constraints $::
23030 65 61 67 6c 65 5f 74 65 73 74 73 28 63 6f 6e 73  eagle_tests(cons
23040 74 72 61 69 6e 74 73 29 0d 0a 20 20 20 20 20 20  traints)..      
23050 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
23060 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
23070 3a 20 4c 6f 61 64 20 74 68 65 20 22 61 66 74 65  : Load the "afte
23080 72 2d 63 6f 6e 73 74 72 61 69 6e 74 73 22 20 63  r-constraints" c
23090 75 73 74 6f 6d 20 70 65 72 2d 75 73 65 72 20 61  ustom per-user a
230a0 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74 0d 0a  nd/or per-host..
230b0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
230c0 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 6e 6f  test settings no
230d0 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  w...        #.. 
230e0 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31         uplevel 1
230f0 20 5b 6c 69 73 74 20 6c 6f 61 64 53 51 4c 69 74   [list loadSQLit
23100 65 54 65 73 74 53 65 74 74 69 6e 67 73 20 24 3a  eTestSettings $:
23110 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 2e 61  :test_channel .a
23120 66 74 65 72 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  fter]....       
23130 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
23140 54 45 3a 20 49 66 20 6e 65 63 65 73 73 61 72 79  TE: If necessary
23150 2c 20 65 6e 61 62 6c 65 20 73 68 61 72 65 64 2d  , enable shared-
23160 63 61 63 68 65 20 6d 6f 64 65 20 6e 6f 77 2e 0d  cache mode now..
23170 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
23180 20 20 20 20 69 66 20 7b 5b 68 61 73 52 75 6e 74      if {[hasRunt
23190 69 6d 65 4f 70 74 69 6f 6e 20 73 68 61 72 65 64  imeOption shared
231a0 43 61 63 68 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  Cache]} then {..
231b0 20 20 20 20 20 20 20 20 20 20 65 6e 61 62 6c 65            enable
231c0 53 68 61 72 65 64 43 61 63 68 65 20 24 3a 3a 74  SharedCache $::t
231d0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75 65  est_channel true
231e0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
231f0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
23200 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 77    # NOTE: Show w
23210 68 65 6e 20 6f 75 72 20 74 65 73 74 73 20 61 63  hen our tests ac
23220 74 75 61 6c 6c 79 20 62 65 67 61 6e 20 28 6e 6f  tually began (no
23230 77 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  w)...        #..
23240 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
23250 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
23260 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
23270 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 53           "---- S
23280 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
23290 65 20 74 65 73 74 73 20 62 65 67 61 6e 20 61 74  e tests began at
232a0 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
232b0 20 20 5b 63 6c 6f 63 6b 20 66 6f 72 6d 61 74 20    [clock format 
232c0 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 5d  [clock seconds]]
232d0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20   \n]..      }.. 
232e0 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
232f0 63 20 72 75 6e 53 51 4c 69 74 65 54 65 73 74 46  c runSQLiteTestF
23300 69 6c 65 73 50 72 6f 6c 6f 67 75 65 20 7b 7d 20  ilesPrologue {} 
23310 7b 0d 0a 20 20 20 20 20 20 75 70 6c 65 76 65 6c  {..      uplevel
23320 20 31 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d   1 {..        #.
23330 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
23340 20 53 65 74 75 70 20 74 68 65 20 76 61 72 69 61   Setup the varia
23350 62 6c 65 73 20 74 68 61 74 20 72 65 66 65 72 20  bles that refer 
23360 74 6f 20 74 68 65 20 76 61 72 69 6f 75 73 20 6e  to the various n
23370 6f 6e 2d 64 61 74 61 20 66 69 6c 65 73 0d 0a 20  on-data files.. 
23380 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72         #       r
23390 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 74  equired by the t
233a0 65 73 74 73 20 69 6e 20 74 68 69 73 20 66 69 6c  ests in this fil
233b0 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
233c0 20 20 20 20 20 20 20 73 65 74 20 65 6e 74 69 74         set entit
233d0 79 46 72 61 6d 65 77 6f 72 6b 44 6c 6c 46 69 6c  yFrameworkDllFil
233e0 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
233f0 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61   [getBuildFileNa
23400 6d 65 20 45 6e 74 69 74 79 46 72 61 6d 65 77 6f  me EntityFramewo
23410 72 6b 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20  rk.dll]....     
23420 20 20 20 73 65 74 20 69 6e 73 74 61 6c 6c 65 72     set installer
23430 45 78 65 46 69 6c 65 20 5b 67 65 74 42 75 69 6c  ExeFile [getBuil
23440 64 46 69 6c 65 4e 61 6d 65 20 49 6e 73 74 61 6c  dFileName Instal
23450 6c 65 72 2e 65 78 65 5d 0d 0a 20 20 20 20 20 20  ler.exe]..      
23460 20 20 73 65 74 20 73 71 6c 69 74 65 44 65 73 69    set sqliteDesi
23470 67 6e 65 72 44 6c 6c 46 69 6c 65 20 5b 67 65 74  gnerDllFile [get
23480 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 53 51  BuildFileName SQ
23490 4c 69 74 65 2e 44 65 73 69 67 6e 65 72 2e 64 6c  Lite.Designer.dl
234a0 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65  l]....        se
234b0 74 20 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69  t systemDataSQLi
234c0 74 65 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20 20  teDllFile \..   
234d0 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 75 69           [getBui
234e0 6c 64 46 69 6c 65 4e 61 6d 65 20 53 79 73 74 65  ldFileName Syste
234f0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
23500 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65  l]....        se
23510 74 20 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69  t systemDataSQLi
23520 74 65 4c 69 6e 71 44 6c 6c 46 69 6c 65 20 5c 0d  teLinqDllFile \.
23530 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65  .            [ge
23540 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 53  tBuildFileName S
23550 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
23560 65 2e 4c 69 6e 71 2e 64 6c 6c 5d 0d 0a 0d 0a 20  e.Linq.dll].... 
23570 20 20 20 20 20 20 20 73 65 74 20 73 79 73 74 65         set syste
23580 6d 44 61 74 61 53 51 4c 69 74 65 45 66 36 44 6c  mDataSQLiteEf6Dl
23590 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20  lFile \..       
235a0 20 20 20 20 20 5b 67 65 74 42 75 69 6c 64 46 69       [getBuildFi
235b0 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44 61  leName System.Da
235c0 74 61 2e 53 51 4c 69 74 65 2e 45 46 36 2e 64 6c  ta.SQLite.EF6.dl
235d0 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65  l]....        se
235e0 74 20 74 65 73 74 45 78 65 46 69 6c 65 20 5b 67  t testExeFile [g
235f0 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20  etBuildFileName 
23600 74 65 73 74 2e 65 78 65 5d 0d 0a 20 20 20 20 20  test.exe]..     
23610 20 20 20 73 65 74 20 74 65 73 74 4c 69 6e 71 45     set testLinqE
23620 78 65 46 69 6c 65 20 5b 67 65 74 42 75 69 6c 64  xeFile [getBuild
23630 46 69 6c 65 4e 61 6d 65 20 74 65 73 74 6c 69 6e  FileName testlin
23640 71 2e 65 78 65 5d 0d 0a 20 20 20 20 20 20 20 20  q.exe]..        
23650 73 65 74 20 74 65 73 74 45 66 36 45 78 65 46 69  set testEf6ExeFi
23660 6c 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65  le [getBuildFile
23670 4e 61 6d 65 20 74 65 73 74 65 66 36 2e 65 78 65  Name testef6.exe
23680 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
23690 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
236a0 53 65 74 75 70 20 74 68 65 20 76 61 72 69 61 62  Setup the variab
236b0 6c 65 73 20 74 68 61 74 20 72 65 66 65 72 20 74  les that refer t
236c0 6f 20 74 68 65 20 76 61 72 69 6f 75 73 20 64 61  o the various da
236d0 74 61 20 66 69 6c 65 73 0d 0a 20 20 20 20 20 20  ta files..      
236e0 20 20 23 20 20 20 20 20 20 20 72 65 71 75 69 72    #       requir
236f0 65 64 20 62 79 20 74 68 65 20 74 65 73 74 73 20  ed by the tests 
23700 69 6e 20 74 68 69 73 20 66 69 6c 65 2e 0d 0a 20  in this file... 
23710 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
23720 20 20 73 65 74 20 74 65 73 74 4c 69 6e 71 4f 75    set testLinqOu
23730 74 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69  tFile [file nati
23740 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  vename [file joi
23750 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
23760 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44   [getSQLiteTestD
23770 61 74 61 50 61 74 68 5d 20 74 65 73 74 6c 69 6e  ataPath] testlin
23780 71 2e 6f 75 74 5d 5d 0d 0a 0d 0a 20 20 20 20 20  q.out]]....     
23790 20 20 20 73 65 74 20 6e 6f 72 74 68 77 69 6e 64     set northwind
237a0 45 66 44 62 46 69 6c 65 20 5b 66 69 6c 65 20 6e  EfDbFile [file n
237b0 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
237c0 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  join \..        
237d0 20 20 20 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d      [file dirnam
237e0 65 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20  e [file dirname 
237f0 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61  [getSQLiteTestDa
23800 74 61 50 61 74 68 5d 5d 5d 20 5c 0d 0a 20 20 20  taPath]]] \..   
23810 20 20 20 20 20 20 20 20 20 74 65 73 74 6c 69 6e           testlin
23820 71 20 6e 6f 72 74 68 77 69 6e 64 45 46 2e 64 62  q northwindEF.db
23830 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65  ]]....        se
23840 74 20 6e 6f 6e 57 61 6c 44 62 46 69 6c 65 20 5b  t nonWalDbFile [
23850 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
23860 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20  [file join \..  
23870 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51            [getSQ
23880 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68  LiteTestDataPath
23890 5d 20 6e 6f 6e 57 61 6c 2e 64 62 5d 5d 0d 0a 0d  ] nonWal.db]]...
238a0 0a 20 20 20 20 20 20 20 20 73 65 74 20 77 61 6c  .        set wal
238b0 44 62 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74  DbFile [file nat
238c0 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
238d0 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  in \..          
238e0 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74    [getSQLiteTest
238f0 44 61 74 61 50 61 74 68 5d 20 77 61 6c 2e 64 62  DataPath] wal.db
23900 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  ]]....        #.
23910 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
23920 20 54 68 65 20 76 61 72 69 6f 75 73 20 69 6e 73   The various ins
23930 74 61 6c 6c 2f 75 6e 69 6e 73 74 61 6c 6c 20 6c  tall/uninstall l
23940 6f 67 20 66 69 6c 65 73 20 75 73 65 64 20 74 6f  og files used to
23950 20 74 65 73 74 20 74 68 65 0d 0a 20 20 20 20 20   test the..     
23960 20 20 20 23 20 20 20 20 20 20 20 64 65 73 69 67     #       desig
23970 6e 2d 74 69 6d 65 20 63 6f 6d 70 6f 6e 65 6e 74  n-time component
23980 20 69 6e 73 74 61 6c 6c 65 72 2e 0d 0a 20 20 20   installer...   
23990 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
239a0 73 65 74 20 74 65 73 74 49 6e 73 74 61 6c 6c 56  set testInstallV
239b0 73 32 30 30 35 4c 6f 67 46 69 6c 65 20 5b 66 69  s2005LogFile [fi
239c0 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
239d0 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20  ile join \..    
239e0 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69          [getSQLi
239f0 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20  teTestDataPath] 
23a00 49 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56  Installer_Test_V
23a10 73 32 30 30 35 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20  s2005.log]].... 
23a20 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74 49         set testI
23a30 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46  nstallVs2008LogF
23a40 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ile [file native
23a50 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
23a60 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
23a70 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74  getSQLiteTestDat
23a80 61 50 61 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72  aPath] Installer
23a90 5f 54 65 73 74 5f 56 73 32 30 30 38 2e 6c 6f 67  _Test_Vs2008.log
23aa0 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65  ]]....        se
23ab0 74 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32  t testInstallVs2
23ac0 30 31 30 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65  010LogFile [file
23ad0 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
23ae0 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20  e join \..      
23af0 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65        [getSQLite
23b00 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 49 6e  TestDataPath] In
23b10 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32  staller_Test_Vs2
23b20 30 31 30 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20  010.log]]....   
23b30 20 20 20 20 20 73 65 74 20 74 65 73 74 49 6e 73       set testIns
23b40 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c  tallVs2012LogFil
23b50 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
23b60 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d  me [file join \.
23b70 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65  .            [ge
23b80 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50  tSQLiteTestDataP
23b90 61 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54  ath] Installer_T
23ba0 65 73 74 5f 56 73 32 30 31 32 2e 6c 6f 67 5d 5d  est_Vs2012.log]]
23bb0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
23bc0 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31  testInstallVs201
23bd0 33 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e  3LogFile [file n
23be0 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
23bf0 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  join \..        
23c00 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65      [getSQLiteTe
23c10 73 74 44 61 74 61 50 61 74 68 5d 20 49 6e 73 74  stDataPath] Inst
23c20 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31  aller_Test_Vs201
23c30 33 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20  3.log]]....     
23c40 20 20 20 73 65 74 20 74 65 73 74 49 6e 73 74 61     set testInsta
23c50 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c 65 20  llVs2015LogFile 
23c60 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
23c70 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20   [file join \.. 
23c80 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53             [getS
23c90 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74  QLiteTestDataPat
23ca0 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54 65 73  h] Installer_Tes
23cb0 74 5f 56 73 32 30 31 35 2e 6c 6f 67 5d 5d 0d 0a  t_Vs2015.log]]..
23cc0 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 65  ..        set te
23cd0 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30  stUninstallVs200
23ce0 35 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e  5LogFile [file n
23cf0 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
23d00 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  join \..        
23d10 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65      [getSQLiteTe
23d20 73 74 44 61 74 61 50 61 74 68 5d 20 55 6e 69 6e  stDataPath] Unin
23d30 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32  staller_Test_Vs2
23d40 30 30 35 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20  005.log]]....   
23d50 20 20 20 20 20 73 65 74 20 74 65 73 74 55 6e 69       set testUni
23d60 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46  nstallVs2008LogF
23d70 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ile [file native
23d80 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
23d90 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
23da0 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74  getSQLiteTestDat
23db0 61 50 61 74 68 5d 20 55 6e 69 6e 73 74 61 6c 6c  aPath] Uninstall
23dc0 65 72 5f 54 65 73 74 5f 56 73 32 30 30 38 2e 6c  er_Test_Vs2008.l
23dd0 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  og]]....        
23de0 73 65 74 20 74 65 73 74 55 6e 69 6e 73 74 61 6c  set testUninstal
23df0 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65 20 5b  lVs2010LogFile [
23e00 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
23e10 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20  [file join \..  
23e20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51            [getSQ
23e30 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68  LiteTestDataPath
23e40 5d 20 55 6e 69 6e 73 74 61 6c 6c 65 72 5f 54 65  ] Uninstaller_Te
23e50 73 74 5f 56 73 32 30 31 30 2e 6c 6f 67 5d 5d 0d  st_Vs2010.log]].
23e60 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74  ...        set t
23e70 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30  estUninstallVs20
23e80 31 32 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20  12LogFile [file 
23e90 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
23ea0 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20   join \..       
23eb0 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54       [getSQLiteT
23ec0 65 73 74 44 61 74 61 50 61 74 68 5d 20 55 6e 69  estDataPath] Uni
23ed0 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73  nstaller_Test_Vs
23ee0 32 30 31 32 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20  2012.log]]....  
23ef0 20 20 20 20 20 20 73 65 74 20 74 65 73 74 55 6e        set testUn
23f00 69 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67  installVs2013Log
23f10 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  File [file nativ
23f20 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
23f30 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
23f40 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61  [getSQLiteTestDa
23f50 74 61 50 61 74 68 5d 20 55 6e 69 6e 73 74 61 6c  taPath] Uninstal
23f60 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31 33 2e  ler_Test_Vs2013.
23f70 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  log]]....       
23f80 20 73 65 74 20 74 65 73 74 55 6e 69 6e 73 74 61   set testUninsta
23f90 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c 65 20  llVs2015LogFile 
23fa0 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
23fb0 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20   [file join \.. 
23fc0 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53             [getS
23fd0 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74  QLiteTestDataPat
23fe0 68 5d 20 55 6e 69 6e 73 74 61 6c 6c 65 72 5f 54  h] Uninstaller_T
23ff0 65 73 74 5f 56 73 32 30 31 35 2e 6c 6f 67 5d 5d  est_Vs2015.log]]
24000 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 23 23 23  ....        ####
24010 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
24020 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
24030 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
24040 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
24050 23 23 23 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69  ###....        i
24060 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61  f {![haveConstra
24070 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
24080 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20  file_ \..       
24090 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20       [file tail 
240a0 24 65 6e 74 69 74 79 46 72 61 6d 65 77 6f 72 6b  $entityFramework
240b0 44 6c 6c 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  DllFile]]]} then
240c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   {..          ch
240d0 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74  eckForFile $test
240e0 5f 63 68 61 6e 6e 65 6c 20 24 65 6e 74 69 74 79  _channel $entity
240f0 46 72 61 6d 65 77 6f 72 6b 44 6c 6c 46 69 6c 65  FrameworkDllFile
24100 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
24110 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76         if {![hav
24120 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  eConstraint [app
24130 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d  endArgs file_ \.
24140 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69  .            [fi
24150 6c 65 20 74 61 69 6c 20 24 69 6e 73 74 61 6c 6c  le tail $install
24160 65 72 45 78 65 46 69 6c 65 5d 5d 5d 7d 20 74 68  erExeFile]]]} th
24170 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
24180 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
24190 73 74 5f 63 68 61 6e 6e 65 6c 20 24 69 6e 73 74  st_channel $inst
241a0 61 6c 6c 65 72 45 78 65 46 69 6c 65 20 49 6e 73  allerExeFile Ins
241b0 74 61 6c 6c 65 72 2e 65 78 65 0d 0a 20 20 20 20  taller.exe..    
241c0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
241d0 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74   if {![haveConst
241e0 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
241f0 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20  s file_ \..     
24200 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69         [file tai
24210 6c 20 24 73 71 6c 69 74 65 44 65 73 69 67 6e 65  l $sqliteDesigne
24220 72 44 6c 6c 46 69 6c 65 5d 5d 5d 7d 20 74 68 65  rDllFile]]]} the
24230 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  n {..          c
24240 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
24250 74 5f 63 68 61 6e 6e 65 6c 20 24 73 71 6c 69 74  t_channel $sqlit
24260 65 44 65 73 69 67 6e 65 72 44 6c 6c 46 69 6c 65  eDesignerDllFile
24270 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
24280 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76         if {![hav
24290 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  eConstraint [app
242a0 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d  endArgs file_ \.
242b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69  .            [fi
242c0 6c 65 20 74 61 69 6c 20 24 73 79 73 74 65 6d 44  le tail $systemD
242d0 61 74 61 53 51 4c 69 74 65 44 6c 6c 46 69 6c 65  ataSQLiteDllFile
242e0 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
242f0 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
24300 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
24310 6c 20 24 73 79 73 74 65 6d 44 61 74 61 53 51 4c  l $systemDataSQL
24320 69 74 65 44 6c 6c 46 69 6c 65 0d 0a 20 20 20 20  iteDllFile..    
24330 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
24340 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74   if {![haveConst
24350 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
24360 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20  s file_ \..     
24370 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69         [file tai
24380 6c 20 24 73 79 73 74 65 6d 44 61 74 61 53 51 4c  l $systemDataSQL
24390 69 74 65 4c 69 6e 71 44 6c 6c 46 69 6c 65 5d 5d  iteLinqDllFile]]
243a0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
243b0 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
243c0 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
243d0 24 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74  $systemDataSQLit
243e0 65 4c 69 6e 71 44 6c 6c 46 69 6c 65 0d 0a 20 20  eLinqDllFile..  
243f0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
24400 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e     if {![haveCon
24410 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
24420 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20  rgs file_ \..   
24430 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
24440 61 69 6c 20 24 73 79 73 74 65 6d 44 61 74 61 53  ail $systemDataS
24450 51 4c 69 74 65 45 66 36 44 6c 6c 46 69 6c 65 5d  QLiteEf6DllFile]
24460 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
24470 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69        checkForFi
24480 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c  le $test_channel
24490 20 24 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69   $systemDataSQLi
244a0 74 65 45 66 36 44 6c 6c 46 69 6c 65 0d 0a 20 20  teEf6DllFile..  
244b0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
244c0 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e     if {![haveCon
244d0 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
244e0 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20  rgs file_ \..   
244f0 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
24500 61 69 6c 20 24 74 65 73 74 45 78 65 46 69 6c 65  ail $testExeFile
24510 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
24520 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
24530 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
24540 6c 20 24 74 65 73 74 45 78 65 46 69 6c 65 20 74  l $testExeFile t
24550 65 73 74 2e 65 78 65 0d 0a 20 20 20 20 20 20 20  est.exe..       
24560 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
24570 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69   {![haveConstrai
24580 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
24590 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ile_ \..        
245a0 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
245b0 74 65 73 74 4c 69 6e 71 45 78 65 46 69 6c 65 5d  testLinqExeFile]
245c0 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
245d0 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69        checkForFi
245e0 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c  le $test_channel
245f0 20 24 74 65 73 74 4c 69 6e 71 45 78 65 46 69 6c   $testLinqExeFil
24600 65 20 74 65 73 74 6c 69 6e 71 2e 65 78 65 0d 0a  e testlinq.exe..
24610 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
24620 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43       if {![haveC
24630 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
24640 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20  dArgs file_ \.. 
24650 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
24660 20 74 61 69 6c 20 24 74 65 73 74 45 66 36 45 78   tail $testEf6Ex
24670 65 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b  eFile]]]} then {
24680 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63  ..          chec
24690 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63  kForFile $test_c
246a0 68 61 6e 6e 65 6c 20 24 74 65 73 74 45 66 36 45  hannel $testEf6E
246b0 78 65 46 69 6c 65 20 74 65 73 74 65 66 36 2e 65  xeFile testef6.e
246c0 78 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  xe..        }...
246d0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68  .        if {![h
246e0 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  aveConstraint [a
246f0 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
24700 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
24710 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74 4c  file tail $testL
24720 69 6e 71 4f 75 74 46 69 6c 65 5d 5d 5d 7d 20 74  inqOutFile]]]} t
24730 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
24740 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
24750 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73  est_channel $tes
24760 74 4c 69 6e 71 4f 75 74 46 69 6c 65 0d 0a 20 20  tLinqOutFile..  
24770 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
24780 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e     if {![haveCon
24790 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
247a0 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20  rgs file_ \..   
247b0 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
247c0 61 69 6c 20 24 6e 6f 72 74 68 77 69 6e 64 45 66  ail $northwindEf
247d0 44 62 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  DbFile]]]} then 
247e0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65  {..          che
247f0 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f  ckForFile $test_
24800 63 68 61 6e 6e 65 6c 20 24 6e 6f 72 74 68 77 69  channel $northwi
24810 6e 64 45 66 44 62 46 69 6c 65 0d 0a 20 20 20 20  ndEfDbFile..    
24820 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
24830 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74   if {![haveConst
24840 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
24850 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20  s file_ \..     
24860 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69         [file tai
24870 6c 20 24 6e 6f 6e 57 61 6c 44 62 46 69 6c 65 5d  l $nonWalDbFile]
24880 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
24890 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69        checkForFi
248a0 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c  le $test_channel
248b0 20 24 6e 6f 6e 57 61 6c 44 62 46 69 6c 65 0d 0a   $nonWalDbFile..
248c0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
248d0 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43       if {![haveC
248e0 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
248f0 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20  dArgs file_ \.. 
24900 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
24910 20 74 61 69 6c 20 24 77 61 6c 44 62 46 69 6c 65   tail $walDbFile
24920 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
24930 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
24940 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
24950 6c 20 24 77 61 6c 44 62 46 69 6c 65 0d 0a 20 20  l $walDbFile..  
24960 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
24970 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e     if {![haveCon
24980 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
24990 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20  rgs file_ \..   
249a0 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
249b0 61 69 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c  ail $testInstall
249c0 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 5d 5d 5d  Vs2005LogFile]]]
249d0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
249e0 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65      checkForFile
249f0 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24   $test_channel $
24a00 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 30  testInstallVs200
24a10 35 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20  5LogFile..      
24a20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69    }....        i
24a30 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61  f {![haveConstra
24a40 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
24a50 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20  file_ \..       
24a60 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20       [file tail 
24a70 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30  $testInstallVs20
24a80 30 38 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68  08LogFile]]]} th
24a90 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
24aa0 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
24ab0 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74  st_channel $test
24ac0 49 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f 67  InstallVs2008Log
24ad0 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d  File..        }.
24ae0 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
24af0 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
24b00 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
24b10 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  _ \..           
24b20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73   [file tail $tes
24b30 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f  tInstallVs2010Lo
24b40 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b  gFile]]]} then {
24b50 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63  ..          chec
24b60 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63  kForFile $test_c
24b70 68 61 6e 6e 65 6c 20 24 74 65 73 74 49 6e 73 74  hannel $testInst
24b80 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65  allVs2010LogFile
24b90 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
24ba0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76         if {![hav
24bb0 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  eConstraint [app
24bc0 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d  endArgs file_ \.
24bd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69  .            [fi
24be0 6c 65 20 74 61 69 6c 20 24 74 65 73 74 49 6e 73  le tail $testIns
24bf0 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c  tallVs2012LogFil
24c00 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e]]]} then {..  
24c10 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
24c20 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e  File $test_chann
24c30 65 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56  el $testInstallV
24c40 73 32 30 31 32 4c 6f 67 46 69 6c 65 0d 0a 20 20  s2012LogFile..  
24c50 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
24c60 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e     if {![haveCon
24c70 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
24c80 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20  rgs file_ \..   
24c90 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74           [file t
24ca0 61 69 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c  ail $testInstall
24cb0 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 5d 5d 5d  Vs2013LogFile]]]
24cc0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
24cd0 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65      checkForFile
24ce0 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24   $test_channel $
24cf0 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31  testInstallVs201
24d00 33 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20  3LogFile..      
24d10 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69    }....        i
24d20 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61  f {![haveConstra
24d30 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
24d40 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20  file_ \..       
24d50 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20       [file tail 
24d60 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30  $testInstallVs20
24d70 31 35 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68  15LogFile]]]} th
24d80 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
24d90 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
24da0 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74  st_channel $test
24db0 49 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f 67  InstallVs2015Log
24dc0 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d  File..        }.
24dd0 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
24de0 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
24df0 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
24e00 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  _ \..           
24e10 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73   [file tail $tes
24e20 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 35  tUninstallVs2005
24e30 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  LogFile]]]} then
24e40 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   {..          ch
24e50 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74  eckForFile $test
24e60 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55 6e  _channel $testUn
24e70 69 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67  installVs2005Log
24e80 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d  File..        }.
24e90 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
24ea0 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
24eb0 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
24ec0 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  _ \..           
24ed0 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73   [file tail $tes
24ee0 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 38  tUninstallVs2008
24ef0 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  LogFile]]]} then
24f00 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   {..          ch
24f10 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74  eckForFile $test
24f20 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55 6e  _channel $testUn
24f30 69 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f 67  installVs2008Log
24f40 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d  File..        }.
24f50 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
24f60 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
24f70 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
24f80 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  _ \..           
24f90 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73   [file tail $tes
24fa0 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 30  tUninstallVs2010
24fb0 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  LogFile]]]} then
24fc0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   {..          ch
24fd0 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74  eckForFile $test
24fe0 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55 6e  _channel $testUn
24ff0 69 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67  installVs2010Log
25000 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d  File..        }.
25010 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
25020 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
25030 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
25040 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  _ \..           
25050 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73   [file tail $tes
25060 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 32  tUninstallVs2012
25070 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  LogFile]]]} then
25080 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   {..          ch
25090 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74  eckForFile $test
250a0 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55 6e  _channel $testUn
250b0 69 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67  installVs2012Log
250c0 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d  File..        }.
250d0 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
250e0 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
250f0 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
25100 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  _ \..           
25110 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73   [file tail $tes
25120 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 33  tUninstallVs2013
25130 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  LogFile]]]} then
25140 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   {..          ch
25150 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74  eckForFile $test
25160 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55 6e  _channel $testUn
25170 69 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67  installVs2013Log
25180 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d  File..        }.
25190 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
251a0 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
251b0 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
251c0 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  _ \..           
251d0 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73   [file tail $tes
251e0 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 35  tUninstallVs2015
251f0 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  LogFile]]]} then
25200 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   {..          ch
25210 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74  eckForFile $test
25220 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55 6e  _channel $testUn
25230 69 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f 67  installVs2015Log
25240 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d  File..        }.
25250 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
25260 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 75 6e  ....    proc run
25270 53 51 4c 69 74 65 54 65 73 74 46 69 6c 65 73 45  SQLiteTestFilesE
25280 70 69 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20 20  pilogue {} {..  
25290 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 7b 0d      uplevel 1 {.
252a0 0a 20 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d  .        unset -
252b0 6e 6f 63 6f 6d 70 6c 61 69 6e 20 5c 0d 0a 20 20  nocomplain \..  
252c0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 55 6e            testUn
252d0 69 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f 67  installVs2015Log
252e0 46 69 6c 65 20 74 65 73 74 55 6e 69 6e 73 74 61  File testUninsta
252f0 6c 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 20  llVs2013LogFile 
25300 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  \..            t
25310 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30  estUninstallVs20
25320 31 32 4c 6f 67 46 69 6c 65 20 74 65 73 74 55 6e  12LogFile testUn
25330 69 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67  installVs2010Log
25340 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  File \..        
25350 20 20 20 20 74 65 73 74 55 6e 69 6e 73 74 61 6c      testUninstal
25360 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c 65 20 74  lVs2008LogFile t
25370 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30  estUninstallVs20
25380 30 35 4c 6f 67 46 69 6c 65 20 5c 0d 0a 20 20 20  05LogFile \..   
25390 20 20 20 20 20 20 20 20 20 74 65 73 74 49 6e 73           testIns
253a0 74 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c  tallVs2015LogFil
253b0 65 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32  e testInstallVs2
253c0 30 31 33 4c 6f 67 46 69 6c 65 20 5c 0d 0a 20 20  013LogFile \..  
253d0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 49 6e            testIn
253e0 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69  stallVs2012LogFi
253f0 6c 65 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73  le testInstallVs
25400 32 30 31 30 4c 6f 67 46 69 6c 65 20 5c 0d 0a 20  2010LogFile \.. 
25410 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 49             testI
25420 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46  nstallVs2008LogF
25430 69 6c 65 20 74 65 73 74 49 6e 73 74 61 6c 6c 56  ile testInstallV
25440 73 32 30 30 35 4c 6f 67 46 69 6c 65 0d 0a 0d 0a  s2005LogFile....
25450 20 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e          unset -n
25460 6f 63 6f 6d 70 6c 61 69 6e 20 5c 0d 0a 20 20 20  ocomplain \..   
25470 20 20 20 20 20 20 20 20 20 6e 6f 72 74 68 77 69           northwi
25480 6e 64 45 66 44 62 46 69 6c 65 20 74 65 73 74 4c  ndEfDbFile testL
25490 69 6e 71 4f 75 74 46 69 6c 65 20 5c 0d 0a 20 20  inqOutFile \..  
254a0 20 20 20 20 20 20 20 20 20 20 77 61 6c 44 62 46            walDbF
254b0 69 6c 65 20 6e 6f 6e 57 61 6c 44 62 46 69 6c 65  ile nonWalDbFile
254c0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 75 6e 73 65  ....        unse
254d0 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 5c 0d  t -nocomplain \.
254e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
254f0 74 45 66 36 45 78 65 46 69 6c 65 20 74 65 73 74  tEf6ExeFile test
25500 4c 69 6e 71 45 78 65 46 69 6c 65 20 5c 0d 0a 20  LinqExeFile \.. 
25510 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 45             testE
25520 78 65 46 69 6c 65 20 73 79 73 74 65 6d 44 61 74  xeFile systemDat
25530 61 53 51 4c 69 74 65 45 66 36 44 6c 6c 46 69 6c  aSQLiteEf6DllFil
25540 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
25550 20 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74   systemDataSQLit
25560 65 4c 69 6e 71 44 6c 6c 46 69 6c 65 20 73 79 73  eLinqDllFile sys
25570 74 65 6d 44 61 74 61 53 51 4c 69 74 65 44 6c 6c  temDataSQLiteDll
25580 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  File \..        
25590 20 20 20 20 73 71 6c 69 74 65 44 65 73 69 67 6e      sqliteDesign
255a0 65 72 44 6c 6c 46 69 6c 65 20 69 6e 73 74 61 6c  erDllFile instal
255b0 6c 65 72 45 78 65 46 69 6c 65 20 5c 0d 0a 20 20  lerExeFile \..  
255c0 20 20 20 20 20 20 20 20 20 20 65 6e 74 69 74 79            entity
255d0 46 72 61 6d 65 77 6f 72 6b 44 6c 6c 46 69 6c 65  FrameworkDllFile
255e0 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
255f0 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 75  .....    proc ru
25600 6e 53 51 4c 69 74 65 54 65 73 74 45 70 69 6c 6f  nSQLiteTestEpilo
25610 67 75 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  gue {} {..      
25620 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
25630 20 53 6b 69 70 20 72 75 6e 6e 69 6e 67 20 6f 75   Skip running ou
25640 72 20 63 75 73 74 6f 6d 20 65 70 69 6c 6f 67 75  r custom epilogu
25650 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20 6f 6e  e if the main on
25660 65 20 68 61 73 20 62 65 65 6e 0d 0a 20 20 20 20  e has been..    
25670 20 20 23 20 20 20 20 20 20 20 73 6b 69 70 70 65    #       skippe
25680 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  d...      #..   
25690 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
256a0 69 73 74 73 20 3a 3a 6e 6f 28 65 70 69 6c 6f 67  ists ::no(epilog
256b0 75 65 2e 65 61 67 6c 65 29 5d 7d 20 74 68 65 6e  ue.eagle)]} then
256c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
256d0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
256e0 68 6f 77 20 77 68 65 6e 20 6f 75 72 20 74 65 73  how when our tes
256f0 74 73 20 61 63 74 75 61 6c 6c 79 20 65 6e 64 65  ts actually ende
25700 64 20 28 6e 6f 77 29 2e 0d 0a 20 20 20 20 20 20  d (now)...      
25710 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75    #..        tpu
25720 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
25730 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
25740 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
25750 2d 2d 2d 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  --- System.Data.
25760 53 51 4c 69 74 65 20 74 65 73 74 73 20 65 6e 64  SQLite tests end
25770 65 64 20 61 74 20 22 20 5c 0d 0a 20 20 20 20 20  ed at " \..     
25780 20 20 20 20 20 20 20 5b 63 6c 6f 63 6b 20 66 6f         [clock fo
25790 72 6d 61 74 20 5b 63 6c 6f 63 6b 20 73 65 63 6f  rmat [clock seco
257a0 6e 64 73 5d 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20  nds]] \n]....   
257b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
257c0 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 74 68 65  # NOTE: Load the
257d0 20 22 65 70 69 6c 6f 67 75 65 22 20 63 75 73 74   "epilogue" cust
257e0 6f 6d 20 70 65 72 2d 75 73 65 72 20 61 6e 64 2f  om per-user and/
257f0 6f 72 20 70 65 72 2d 68 6f 73 74 20 74 65 73 74  or per-host test
25800 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
25810 20 20 73 65 74 74 69 6e 67 73 20 6e 6f 77 2e 0d    settings now..
25820 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
25830 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c      uplevel 1 [l
25840 69 73 74 20 6c 6f 61 64 53 51 4c 69 74 65 54 65  ist loadSQLiteTe
25850 73 74 53 65 74 74 69 6e 67 73 20 24 3a 3a 74 65  stSettings $::te
25860 73 74 5f 63 68 61 6e 6e 65 6c 20 2e 65 70 69 6c  st_channel .epil
25870 6f 67 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  ogue]....       
25880 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 42 55   #..        # BU
25890 47 46 49 58 3a 20 42 65 66 6f 72 65 20 63 68 65  GFIX: Before che
258a0 63 6b 69 6e 67 20 74 68 65 20 66 69 6e 61 6c 20  cking the final 
258b0 72 65 73 6f 75 72 63 65 73 20 69 6e 20 75 73 65  resources in use
258c0 20 62 79 20 53 51 4c 69 74 65 2c 20 6d 61 6b 65   by SQLite, make
258d0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
258e0 20 20 20 20 73 75 72 65 20 62 6f 74 68 20 6f 66      sure both of
258f0 20 74 68 65 20 50 52 41 47 4d 41 20 72 65 6c 61   the PRAGMA rela
25900 74 65 64 20 64 69 72 65 63 74 6f 72 79 20 6e 61  ted directory na
25910 6d 65 73 20 61 72 65 20 66 72 65 65 64 2e 0d 0a  mes are freed...
25920 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
25930 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74     checkForSQLit
25940 65 44 69 72 65 63 74 6f 72 69 65 73 20 24 3a 3a  eDirectories $::
25950 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75  test_channel tru
25960 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e....        #..
25970 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
25980 41 6c 73 6f 20 72 65 70 6f 72 74 20 74 68 65 20  Also report the 
25990 72 65 73 6f 75 72 63 65 20 75 73 61 67 65 20 61  resource usage a
259a0 66 74 65 72 20 72 75 6e 6e 69 6e 67 20 74 68 65  fter running the
259b0 20 74 65 73 74 73 2e 0d 0a 20 20 20 20 20 20 20   tests...       
259c0 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 70 6f   #..        repo
259d0 72 74 53 51 4c 69 74 65 52 65 73 6f 75 72 63 65  rtSQLiteResource
259e0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
259f0 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  l....        #..
25a00 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
25a10 52 65 70 6f 72 74 20 74 68 65 20 63 72 69 74 69  Report the criti
25a20 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74  cal handle count
25a30 73 20 61 66 74 65 72 20 72 75 6e 6e 69 6e 67 20  s after running 
25a40 74 68 65 20 74 65 73 74 73 2e 0d 0a 20 20 20 20  the tests...    
25a50 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 67      #..        g
25a60 65 74 53 51 4c 69 74 65 48 61 6e 64 6c 65 43 6f  etSQLiteHandleCo
25a70 75 6e 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  unts $::test_cha
25a80 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nnel....        
25a90 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
25aa0 45 3a 20 49 66 20 6e 65 63 65 73 73 61 72 79 2c  E: If necessary,
25ab0 20 64 69 73 61 62 6c 65 20 73 68 61 72 65 64 2d   disable shared-
25ac0 63 61 63 68 65 20 6d 6f 64 65 20 6e 6f 77 2e 0d  cache mode now..
25ad0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
25ae0 20 20 20 20 69 66 20 7b 5b 68 61 73 52 75 6e 74      if {[hasRunt
25af0 69 6d 65 4f 70 74 69 6f 6e 20 73 68 61 72 65 64  imeOption shared
25b00 43 61 63 68 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  Cache]} then {..
25b10 20 20 20 20 20 20 20 20 20 20 65 6e 61 62 6c 65            enable
25b20 53 68 61 72 65 64 43 61 63 68 65 20 24 3a 3a 74  SharedCache $::t
25b30 65 73 74 5f 63 68 61 6e 6e 65 6c 20 66 61 6c 73  est_channel fals
25b40 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  e..        }..  
25b50 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
25b60 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23  .    ###########
25b70 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
25b80 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
25b90 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
25ba0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
25bb0 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23  ..    ##########
25bc0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
25bd0 23 23 23 20 45 4e 44 20 45 61 67 6c 65 20 4f 4e  ### END Eagle ON
25be0 4c 59 20 23 23 23 23 23 23 23 23 23 23 23 23 23  LY #############
25bf0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
25c00 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23  #..    #########
25c10 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
25c20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
25c30 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
25c40 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
25c50 23 23 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 0d 0a  ##..  }....  #..
25c60 20 20 23 20 4e 4f 54 45 3a 20 53 61 76 65 20 74    # NOTE: Save t
25c70 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
25c80 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e  irectory contain
25c90 69 6e 67 20 74 68 69 73 20 66 69 6c 65 2e 0d 0a  ing this file...
25ca0 20 20 23 0d 0a 20 20 69 66 20 7b 21 5b 69 6e 66    #..  if {![inf
25cb0 6f 20 65 78 69 73 74 73 20 63 6f 6d 6d 6f 6e 5f  o exists common_
25cc0 64 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e  directory]} then
25cd0 20 7b 0d 0a 20 20 20 20 73 65 74 20 63 6f 6d 6d   {..    set comm
25ce0 6f 6e 5f 64 69 72 65 63 74 6f 72 79 20 5b 66 69  on_directory [fi
25cf0 6c 65 20 64 69 72 6e 61 6d 65 20 5b 69 6e 66 6f  le dirname [info
25d00 20 73 63 72 69 70 74 5d 5d 0d 0a 20 20 7d 0d 0a   script]]..  }..
25d10 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a  ..  #..  # NOTE:
25d20 20 50 72 6f 76 69 64 65 20 74 68 65 20 53 79 73   Provide the Sys
25d30 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
25d40 74 65 73 74 20 70 61 63 6b 61 67 65 20 74 6f 20  test package to 
25d50 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e  the interpreter.
25d60 0d 0a 20 20 23 0d 0a 20 20 70 61 63 6b 61 67 65  ..  #..  package
25d70 20 70 72 6f 76 69 64 65 20 53 79 73 74 65 6d 2e   provide System.
25d80 44 61 74 61 2e 53 51 4c 69 74 65 2e 54 65 73 74  Data.SQLite.Test
25d90 20 31 2e 30 0d 0a 7d 0d 0a                        1.0..}..