System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 98c153d386b4a13f9346c1e3e141d2c882e45fb2:


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 6f 72 20   2010, 2012, or 
0460: 32 30 31 33 20 62 75 69 6c 64 20 73 79 73 74 65  2013 build syste
0470: 6d 73 2e 20 20 54 6f 20 6f 76 65 72 72 69 64 65  ms.  To override
0480: 20 74 68 69 73 0d 0a 20 20 20 20 20 20 23 20 20   this..      #  
0490: 20 20 20 20 20 76 61 6c 75 65 20 76 69 61 20 74       value via t
04a0: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2c  he command line,
04b0: 20 65 6e 74 65 72 20 61 20 63 6f 6d 6d 61 6e 64   enter a command
04c0: 20 73 69 6d 69 6c 61 72 20 74 6f 20 6f 6e 65 20   similar to one 
04d0: 6f 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  of..      #     
04e0: 20 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    the following 
04f0: 28 61 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65  (all on one line
0500: 29 3a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ):..      #..   
0510: 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65     #       Eagle
0520: 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e  Shell.exe -anyIn
0530: 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65  itialize "set te
0540: 73 74 5f 79 65 61 72 20 32 30 30 35 22 0d 0a 20  st_year 2005".. 
0550: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 2d       #         -
0560: 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61  file .\path\to\a
0570: 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20  ll.eagle..      
0580: 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  #..      #      
0590: 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20   EagleShell.exe 
05a0: 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20 22  -anyInitialize "
05b0: 73 65 74 20 74 65 73 74 5f 79 65 61 72 20 32 30  set test_year 20
05c0: 30 38 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20  08"..      #    
05d0: 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74       -file .\pat
05e0: 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a  h\to\all.eagle..
05f0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
0600: 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c         EagleShel
0610: 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61  l.exe -anyInitia
0620: 6c 69 7a 65 20 22 73 65 74 20 74 65 73 74 5f 79  lize "set test_y
0630: 65 61 72 20 32 30 31 30 22 0d 0a 20 20 20 20 20  ear 2010"..     
0640: 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65   #         -file
0650: 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65   .\path\to\all.e
0660: 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20  agle..      #.. 
0670: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
0680: 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79  leShell.exe -any
0690: 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20  Initialize "set 
06a0: 74 65 73 74 5f 79 65 61 72 20 32 30 31 32 22 0d  test_year 2012".
06b0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20  .      #        
06c0: 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f   -file .\path\to
06d0: 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20  \all.eagle..    
06e0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20    #..      #    
06f0: 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78     EagleShell.ex
0700: 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65  e -anyInitialize
0710: 20 22 73 65 74 20 74 65 73 74 5f 79 65 61 72 20   "set test_year 
0720: 32 30 31 33 22 0d 0a 20 20 20 20 20 20 23 20 20  2013"..      #  
0730: 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70         -file .\p
0740: 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65  ath\to\all.eagle
0750: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
0760: 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68   #       EagleSh
0770: 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74  ell.exe -anyInit
0780: 69 61 6c 69 7a 65 20 22 75 6e 73 65 74 20 2d 6e  ialize "unset -n
0790: 6f 63 6f 6d 70 6c 61 69 6e 20 74 65 73 74 5f 79  ocomplain test_y
07a0: 65 61 72 22 0d 0a 20 20 20 20 20 20 23 20 20 20  ear"..      #   
07b0: 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61        -file .\pa
07c0: 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d  th\to\all.eagle.
07d0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
07e0: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
07f0: 20 3a 3a 74 65 73 74 5f 79 65 61 72 5d 20 26 26   ::test_year] &&
0800: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
0810: 24 3a 3a 74 65 73 74 5f 79 65 61 72 5d 20 3e 20  $::test_year] > 
0820: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
0830: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
0840: 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70  NOTE: Use the sp
0850: 65 63 69 66 69 65 64 20 74 65 73 74 20 79 65 61  ecified test yea
0860: 72 2e 20 20 49 66 20 74 68 69 73 20 76 61 72 69  r.  If this vari
0870: 61 62 6c 65 20 69 73 20 6e 6f 74 20 73 65 74 2c  able is not set,
0880: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
0890: 20 20 20 20 20 20 64 65 66 61 75 6c 74 20 76 61        default va
08a0: 6c 75 65 20 77 69 6c 6c 20 62 65 20 62 61 73 65  lue will be base
08b0: 64 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  d on whether or 
08c0: 6e 6f 74 20 45 61 67 6c 65 20 68 61 73 20 62 65  not Eagle has be
08d0: 65 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  en..        #   
08e0: 20 20 20 20 63 6f 6d 70 69 6c 65 64 20 61 67 61      compiled aga
08f0: 69 6e 73 74 20 74 68 65 20 43 4c 52 20 76 32 2e  inst the CLR v2.
0900: 30 20 6f 72 20 43 4c 52 20 76 34 2e 30 2e 0d 0a  0 or CLR v4.0...
0910: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
0920: 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73     return $::tes
0930: 74 5f 79 65 61 72 0d 0a 20 20 20 20 20 20 7d 20  t_year..      } 
0940: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
0950: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
0960: 45 3a 20 49 66 20 45 61 67 6c 65 20 68 61 73 20  E: If Eagle has 
0970: 62 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20 61 67  been compiled ag
0980: 61 69 6e 73 74 20 74 68 65 20 43 4c 52 20 76 34  ainst the CLR v4
0990: 2e 30 2c 20 75 73 65 20 22 32 30 31 30 22 20 62  .0, use "2010" b
09a0: 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
09b0: 20 20 20 64 65 66 61 75 6c 74 20 28 77 65 20 63     default (we c
09c0: 6f 75 6c 64 20 75 73 65 20 22 32 30 31 32 22 20  ould use "2012" 
09d0: 6f 72 20 22 32 30 31 33 22 20 69 6e 20 74 68 61  or "2013" in tha
09e0: 74 20 63 61 73 65 20 61 73 20 77 65 6c 6c 29 20  t case as well) 
09f0: 61 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  as..        #   
0a00: 20 20 20 20 74 68 65 20 74 65 73 74 20 79 65 61      the test yea
0a10: 72 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 75 73  r; otherwise, us
0a20: 65 20 22 32 30 30 38 22 20 62 79 20 64 65 66 61  e "2008" by defa
0a30: 75 6c 74 20 28 77 65 20 63 6f 75 6c 64 20 75 73  ult (we could us
0a40: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
0a50: 20 20 20 22 32 30 30 35 22 20 69 6e 20 74 68 61     "2005" in tha
0a60: 74 20 63 61 73 65 20 61 73 20 77 65 6c 6c 29 2e  t case as well).
0a70: 20 20 49 66 20 61 6e 6f 74 68 65 72 20 6d 61 6a    If another maj
0a80: 6f 72 20 5b 69 6e 63 6f 6d 70 61 74 69 62 6c 65  or [incompatible
0a90: 5d 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ]..        #    
0aa0: 20 20 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68     version of th
0ab0: 65 20 43 4c 52 20 69 73 20 72 65 6c 65 61 73 65  e CLR is release
0ac0: 64 2c 20 74 68 69 73 20 63 68 65 63 6b 20 77 69  d, this check wi
0ad0: 6c 6c 20 68 61 76 65 20 74 6f 20 62 65 0d 0a 20  ll have to be.. 
0ae0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
0af0: 68 61 6e 67 65 64 2e 20 20 54 68 65 20 64 65 66  hanged.  The def
0b00: 61 75 6c 74 20 74 65 73 74 20 79 65 61 72 20 74  ault test year t
0b10: 6f 20 75 73 65 20 66 6f 72 20 61 20 70 61 72 74  o use for a part
0b20: 69 63 75 6c 61 72 20 43 4c 52 0d 0a 20 20 20 20  icular CLR..    
0b30: 20 20 20 20 23 20 20 20 20 20 20 20 76 65 72 73      #       vers
0b40: 69 6f 6e 20 6d 61 79 20 62 65 20 6f 76 65 72 72  ion may be overr
0b50: 69 64 64 65 6e 20 62 79 20 73 65 74 74 69 6e 67  idden by setting
0b60: 20 74 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 69   the global vari
0b70: 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20  able..        # 
0b80: 20 20 20 20 20 20 22 74 65 73 74 5f 79 65 61 72        "test_year
0b90: 5f 63 6c 72 5f 76 24 58 22 2c 20 77 68 65 72 65  _clr_v$X", where
0ba0: 20 22 24 58 22 20 6d 61 79 20 5b 63 75 72 72 65   "$X" may [curre
0bb0: 6e 74 6c 79 5d 20 62 65 20 65 69 74 68 65 72 20  ntly] be either 
0bc0: 22 32 22 0d 0a 20 20 20 20 20 20 20 20 23 20 20  "2"..        #  
0bd0: 20 20 20 20 20 6f 72 20 22 34 22 2e 0d 0a 20 20       or "4"...  
0be0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
0bf0: 20 69 66 20 7b 5b 68 61 76 65 43 6f 6e 73 74 72   if {[haveConstr
0c00: 61 69 6e 74 20 69 6d 61 67 65 52 75 6e 74 69 6d  aint imageRuntim
0c10: 65 34 30 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e40]} then {..  
0c20: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66          if {[inf
0c30: 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f  o exists ::test_
0c40: 79 65 61 72 5f 63 6c 72 5f 76 34 5d 20 26 26 20  year_clr_v4] && 
0c50: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
0c60: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
0c70: 24 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c 72  $::test_year_clr
0c80: 5f 76 34 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  _v4] > 0} then {
0c90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
0ca0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
0cb0: 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65  OTE: Use the spe
0cc0: 63 69 66 69 65 64 20 74 65 73 74 20 79 65 61 72  cified test year
0cd0: 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76 34 2e   for the CLR v4.
0ce0: 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  0...            
0cf0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  #..            r
0d00: 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 79 65  eturn $::test_ye
0d10: 61 72 5f 63 6c 72 5f 76 34 0d 0a 20 20 20 20 20  ar_clr_v4..     
0d20: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
0d30: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
0d40: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
0d50: 3a 20 55 73 65 20 74 68 65 20 64 65 66 61 75 6c  : Use the defaul
0d60: 74 20 74 65 73 74 20 79 65 61 72 20 66 6f 72 20  t test year for 
0d70: 74 68 65 20 43 4c 52 20 76 34 2e 30 2e 0d 0a 20  the CLR v4.0... 
0d80: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
0d90: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
0da0: 20 32 30 31 30 3b 20 23 20 54 4f 44 4f 3a 20 47   2010; # TODO: G
0db0: 6f 6f 64 20 22 66 61 6c 6c 62 61 63 6b 22 20 64  ood "fallback" d
0dc0: 65 66 61 75 6c 74 3f 0d 0a 20 20 20 20 20 20 20  efault?..       
0dd0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
0de0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
0df0: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
0e00: 74 73 20 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63  ts ::test_year_c
0e10: 6c 72 5f 76 32 5d 20 26 26 20 5c 0d 0a 20 20 20  lr_v2] && \..   
0e20: 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69             [stri
0e30: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73  ng length $::tes
0e40: 74 5f 79 65 61 72 5f 63 6c 72 5f 76 32 5d 20 3e  t_year_clr_v2] >
0e50: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
0e60: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
0e70: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55         # NOTE: U
0e80: 73 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64  se the specified
0e90: 20 74 65 73 74 20 79 65 61 72 20 66 6f 72 20 74   test year for t
0ea0: 68 65 20 43 4c 52 20 76 32 2e 30 2e 0d 0a 20 20  he CLR v2.0...  
0eb0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
0ec0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
0ed0: 24 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c 72  $::test_year_clr
0ee0: 5f 76 32 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  _v2..          }
0ef0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
0f00: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
0f10: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
0f20: 74 68 65 20 64 65 66 61 75 6c 74 20 74 65 73 74  the default test
0f30: 20 79 65 61 72 20 66 6f 72 20 74 68 65 20 43 4c   year for the CL
0f40: 52 20 76 32 2e 30 2e 0d 0a 20 20 20 20 20 20 20  R v2.0...       
0f50: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
0f60: 20 20 20 20 72 65 74 75 72 6e 20 32 30 30 38 3b      return 2008;
0f70: 20 23 20 54 4f 44 4f 3a 20 47 6f 6f 64 20 22 66   # TODO: Good "f
0f80: 61 6c 6c 62 61 63 6b 22 20 64 65 66 61 75 6c 74  allback" default
0f90: 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ?..          }..
0fa0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
0fb0: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
0fc0: 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 59    proc getBuildY
0fd0: 65 61 72 73 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  ears {} {..     
0fe0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
0ff0: 3a 20 53 65 65 20 69 66 20 74 68 65 20 6c 69 73  : See if the lis
1000: 74 20 6f 66 20 74 65 73 74 20 79 65 61 72 73 20  t of test years 
1010: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64  has been overrid
1020: 64 65 6e 20 62 79 20 74 68 65 20 75 73 65 72 0d  den by the user.
1030: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 28  .      #       (
1040: 65 2e 67 2e 20 6f 6e 20 74 68 65 20 63 6f 6d 6d  e.g. on the comm
1050: 61 6e 64 20 6c 69 6e 65 29 2e 0d 0a 20 20 20 20  and line)...    
1060: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
1070: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65  info exists ::te
1080: 73 74 5f 79 65 61 72 73 5d 20 26 26 20 5b 6c 6c  st_years] && [ll
1090: 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 79 65  ength $::test_ye
10a0: 61 72 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ars] > 0} then {
10b0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
10c0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65       # NOTE: Use
10d0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c   the specified l
10e0: 69 73 74 20 6f 66 20 74 65 73 74 20 79 65 61 72  ist of test year
10f0: 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  s...        #.. 
1100: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
1110: 3a 74 65 73 74 5f 79 65 61 72 73 0d 0a 20 20 20  :test_years..   
1120: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1130: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1140: 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20  # NOTE: Use the 
1150: 64 65 66 61 75 6c 74 20 6c 69 73 74 20 6f 66 20  default list of 
1160: 74 65 73 74 20 79 65 61 72 73 2e 0d 0a 20 20 20  test years...   
1170: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1180: 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 32 30 30  return [list 200
1190: 35 20 32 30 30 38 20 32 30 31 30 20 32 30 31 32  5 2008 2010 2012
11a0: 20 32 30 31 33 5d 0d 0a 20 20 20 20 20 20 7d 0d   2013]..      }.
11b0: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
11c0: 72 6f 63 20 67 65 74 42 75 69 6c 64 4e 65 74 46  roc getBuildNetF
11d0: 78 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  x {} {..      #.
11e0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53  .      # NOTE: S
11f0: 65 65 20 69 66 20 74 68 65 20 74 65 73 74 20 2e  ee if the test .
1200: 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 20 73 65  NET Framework se
1210: 74 74 69 6e 67 20 68 61 73 20 62 65 65 6e 20 6f  tting has been o
1220: 76 65 72 72 69 64 64 65 6e 20 62 79 0d 0a 20 20  verridden by..  
1230: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
1240: 75 73 65 72 20 28 65 2e 67 2e 20 6f 6e 20 74 68  user (e.g. on th
1250: 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e  e command line).
1260: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1270: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
1280: 73 20 3a 3a 74 65 73 74 5f 6e 65 74 5f 66 78 5d  s ::test_net_fx]
1290: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
12a0: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
12b0: 24 3a 3a 74 65 73 74 5f 6e 65 74 5f 66 78 5d 20  $::test_net_fx] 
12c0: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
12d0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
12e0: 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20  # NOTE: Use the 
12f0: 73 70 65 63 69 66 69 65 64 20 74 65 73 74 20 2e  specified test .
1300: 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 2e 0d 0a  NET Framework...
1310: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1320: 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73     return $::tes
1330: 74 5f 6e 65 74 5f 66 78 0d 0a 20 20 20 20 20 20  t_net_fx..      
1340: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
1350: 20 20 73 65 74 20 79 65 61 72 20 5b 67 65 74 42    set year [getB
1360: 75 69 6c 64 59 65 61 72 5d 0d 0a 0d 0a 20 20 20  uildYear]....   
1370: 20 20 20 20 20 73 77 69 74 63 68 20 2d 65 78 61       switch -exa
1380: 63 74 20 2d 2d 20 24 79 65 61 72 20 7b 0d 0a 20  ct -- $year {.. 
1390: 20 20 20 20 20 20 20 20 20 32 30 30 35 20 7b 0d           2005 {.
13a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
13b0: 75 72 6e 20 6e 65 74 46 78 32 30 0d 0a 20 20 20  urn netFx20..   
13c0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
13d0: 20 20 20 20 32 30 30 38 20 7b 0d 0a 20 20 20 20      2008 {..    
13e0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e          return n
13f0: 65 74 46 78 33 35 0d 0a 20 20 20 20 20 20 20 20  etFx35..        
1400: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 32    }..          2
1410: 30 31 30 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  010 {..         
1420: 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78 34     return netFx4
1430: 30 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  0..          }..
1440: 20 20 20 20 20 20 20 20 20 20 32 30 31 32 20 7b            2012 {
1450: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
1460: 74 75 72 6e 20 6e 65 74 46 78 34 35 0d 0a 20 20  turn netFx45..  
1470: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1480: 20 20 20 20 20 32 30 31 33 20 7b 0d 0a 20 20 20       2013 {..   
1490: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
14a0: 6e 65 74 46 78 34 35 31 0d 0a 20 20 20 20 20 20  netFx451..      
14b0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
14c0: 20 64 65 66 61 75 6c 74 20 7b 0d 0a 20 20 20 20   default {..    
14d0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 22          return "
14e0: 22 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  "..          }..
14f0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1500: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
1510: 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 50    proc getBuildP
1520: 6c 61 74 66 6f 72 6d 20 7b 20 6e 61 74 69 76 65  latform { native
1530: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b   } {..      if {
1540: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
1550: 65 73 74 5f 70 6c 61 74 66 6f 72 6d 5d 20 26 26  est_platform] &&
1560: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
1570: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
1580: 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d 5d 20 3e  test_platform] >
1590: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
15a0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
15b0: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73   NOTE: Use the s
15c0: 70 65 63 69 66 69 65 64 20 74 65 73 74 20 70 6c  pecified test pl
15d0: 61 74 66 6f 72 6d 2e 20 20 49 66 20 74 68 69 73  atform.  If this
15e0: 20 76 61 72 69 61 62 6c 65 20 69 73 20 6e 6f 74   variable is not
15f0: 20 73 65 74 2c 0d 0a 20 20 20 20 20 20 20 20 23   set,..        #
1600: 20 20 20 20 20 20 20 74 68 65 20 64 65 66 61 75         the defau
1610: 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65  lt value will be
1620: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6d 61   based on the ma
1630: 63 68 69 6e 65 20 61 72 63 68 69 74 65 63 74 75  chine architectu
1640: 72 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  re...        #..
1650: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
1660: 65 78 70 72 20 7b 24 6e 61 74 69 76 65 20 3f 20  expr {$native ? 
1670: 24 3a 3a 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d  $::test_platform
1680: 20 3a 20 22 22 7d 5d 0d 0a 20 20 20 20 20 20 7d   : ""}]..      }
1690: 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65   elseif {[info e
16a0: 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 6d 61 63  xists ::test_mac
16b0: 68 69 6e 65 5d 20 26 26 20 5c 0d 0a 20 20 20 20  hine] && \..    
16c0: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
16d0: 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 6d 61 63  ngth $::test_mac
16e0: 68 69 6e 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  hine] > 0} then 
16f0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
1700: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f        # NOTE: Fo
1710: 72 20 6e 61 74 69 76 65 20 62 75 69 6c 64 73 2c  r native builds,
1720: 20 72 65 74 75 72 6e 20 74 68 65 20 70 6c 61 74   return the plat
1730: 66 6f 72 6d 20 6e 61 6d 65 20 63 6f 72 72 65 73  form name corres
1740: 70 6f 6e 64 69 6e 67 20 74 6f 0d 0a 20 20 20 20  ponding to..    
1750: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
1760: 74 65 73 74 20 6d 61 63 68 69 6e 65 20 61 72 63  test machine arc
1770: 68 69 74 65 63 74 75 72 65 3b 20 6f 74 68 65 72  hitecture; other
1780: 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20  wise, return an 
1790: 65 6d 70 74 79 0d 0a 20 20 20 20 20 20 20 20 23  empty..        #
17a0: 20 20 20 20 20 20 20 73 74 72 69 6e 67 2e 0d 0a         string...
17b0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
17c0: 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20     return [expr 
17d0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 24 6e 61  {..          $na
17e0: 74 69 76 65 20 3f 20 5b 6d 61 63 68 69 6e 65 54  tive ? [machineT
17f0: 6f 50 6c 61 74 66 6f 72 6d 20 24 3a 3a 74 65 73  oPlatform $::tes
1800: 74 5f 6d 61 63 68 69 6e 65 5d 20 3a 20 22 22 0d  t_machine] : "".
1810: 0a 20 20 20 20 20 20 20 20 7d 5d 0d 0a 20 20 20  .        }]..   
1820: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e     } elseif {[in
1830: 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f  fo exists ::tcl_
1840: 70 6c 61 74 66 6f 72 6d 28 6d 61 63 68 69 6e 65  platform(machine
1850: 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
1860: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1870: 20 4e 4f 54 45 3a 20 46 6f 72 20 6e 61 74 69 76   NOTE: For nativ
1880: 65 20 62 75 69 6c 64 73 2c 20 72 65 74 75 72 6e  e builds, return
1890: 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 20 6e 61   the platform na
18a0: 6d 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  me corresponding
18b0: 20 74 6f 0d 0a 20 20 20 20 20 20 20 20 23 20 20   to..        #  
18c0: 20 20 20 20 20 74 68 65 20 6d 61 63 68 69 6e 65       the machine
18d0: 20 61 72 63 68 69 74 65 63 74 75 72 65 3b 20 6f   architecture; o
18e0: 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
18f0: 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   an empty string
1900: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1910: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78        return [ex
1920: 70 72 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  pr {..          
1930: 24 6e 61 74 69 76 65 20 3f 20 5b 6d 61 63 68 69  $native ? [machi
1940: 6e 65 54 6f 50 6c 61 74 66 6f 72 6d 20 24 3a 3a  neToPlatform $::
1950: 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61 63  tcl_platform(mac
1960: 68 69 6e 65 29 5d 20 3a 20 22 22 0d 0a 20 20 20  hine)] : ""..   
1970: 20 20 20 20 20 7d 5d 0d 0a 20 20 20 20 20 20 7d       }]..      }
1980: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1990: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
19a0: 54 45 3a 20 4e 6f 20 6d 61 63 68 69 6e 65 20 61  TE: No machine a
19b0: 72 63 68 69 74 65 63 74 75 72 65 20 69 73 20 61  rchitecture is a
19c0: 76 61 69 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e  vailable, return
19d0: 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   an empty string
19e0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
19f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d        return "".
1a00: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
1a10: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
1a20: 42 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69  BuildConfigurati
1a30: 6f 6e 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  on {} {..      #
1a40: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
1a50: 53 65 65 20 69 66 20 74 68 65 20 22 63 6f 6e 66  See if the "conf
1a60: 69 67 75 72 61 74 69 6f 6e 22 20 73 65 74 74 69  iguration" setti
1a70: 6e 67 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  ng has been over
1a80: 72 69 64 64 65 6e 20 62 79 20 74 68 65 0d 0a 20  ridden by the.. 
1a90: 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73 65       #       use
1aa0: 72 20 28 65 2e 67 2e 20 6f 6e 20 74 68 65 20 63  r (e.g. on the c
1ab0: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 20 20 54  ommand line).  T
1ac0: 68 69 73 20 68 65 6c 70 73 20 63 6f 6e 74 72 6f  his helps contro
1ad0: 6c 20 65 78 61 63 74 6c 79 0d 0a 20 20 20 20 20  l exactly..     
1ae0: 20 23 20 20 20 20 20 20 20 77 68 69 63 68 20 73   #       which s
1af0: 65 74 20 6f 66 20 62 69 6e 61 72 69 65 73 20 77  et of binaries w
1b00: 65 20 61 72 65 20 74 65 73 74 69 6e 67 20 28 69  e are testing (i
1b10: 2e 65 2e 20 74 68 6f 73 65 20 62 75 69 6c 74 20  .e. those built 
1b20: 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  in the..      # 
1b30: 20 20 20 20 20 20 22 44 65 62 75 67 22 20 6f 72        "Debug" or
1b40: 20 22 52 65 6c 65 61 73 65 22 20 62 75 69 6c 64   "Release" build
1b50: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 29   configurations)
1b60: 2e 20 20 54 6f 20 6f 76 65 72 72 69 64 65 20 74  .  To override t
1b70: 68 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20  his..      #    
1b80: 20 20 20 76 61 6c 75 65 20 76 69 61 20 74 68 65     value via the
1b90: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2c 20 65   command line, e
1ba0: 6e 74 65 72 20 61 20 63 6f 6d 6d 61 6e 64 20 73  nter a command s
1bb0: 69 6d 69 6c 61 72 20 74 6f 20 6f 6e 65 20 6f 66  imilar to one of
1bc0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1bd0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 28 61  the following (a
1be0: 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65 29 3a  ll on one line):
1bf0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1c00: 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68   #       EagleSh
1c10: 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74  ell.exe -anyInit
1c20: 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65 73 74  ialize "set test
1c30: 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 44  _configuration D
1c40: 65 62 75 67 22 0d 0a 20 20 20 20 20 20 23 20 20  ebug"..      #  
1c50: 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70         -file .\p
1c60: 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65  ath\to\all.eagle
1c70: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1c80: 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68   #       EagleSh
1c90: 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74  ell.exe -anyInit
1ca0: 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65 73 74  ialize "set test
1cb0: 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 52  _configuration R
1cc0: 65 6c 65 61 73 65 22 0d 0a 20 20 20 20 20 20 23  elease"..      #
1cd0: 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e           -file .
1ce0: 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67  \path\to\all.eag
1cf0: 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  le..      #..   
1d00: 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65     #       Eagle
1d10: 53 68 65 6c 6c 2e 65 78 65 20 2d 66 69 6c 65 20  Shell.exe -file 
1d20: 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61  .\path\to\all.ea
1d30: 67 6c 65 20 2d 70 72 65 54 65 73 74 0d 0a 20 20  gle -preTest..  
1d40: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 22 75      #         "u
1d50: 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e  nset -nocomplain
1d60: 20 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74   test_configurat
1d70: 69 6f 6e 22 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ion"..      #.. 
1d80: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
1d90: 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 63 6f 6e  xists ::test_con
1da0: 66 69 67 75 72 61 74 69 6f 6e 5d 20 26 26 20 5c  figuration] && \
1db0: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
1dc0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65  ing length $::te
1dd0: 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  st_configuration
1de0: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
1df0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1e00: 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68    # NOTE: Use th
1e10: 65 20 73 70 65 63 69 66 69 65 64 20 74 65 73 74  e specified test
1e20: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20   configuration. 
1e30: 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   The default val
1e40: 75 65 20 75 73 65 64 0d 0a 20 20 20 20 20 20 20  ue used..       
1e50: 20 23 20 20 20 20 20 20 20 66 6f 72 20 74 68 69   #       for thi
1e60: 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 74 79  s variable is ty
1e70: 70 69 63 61 6c 6c 79 20 22 52 65 6c 65 61 73 65  pically "Release
1e80: 22 2c 20 61 73 20 73 65 74 20 62 79 20 74 68 65  ", as set by the
1e90: 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20 23   test..        #
1ea0: 20 20 20 20 20 20 20 73 75 69 74 65 20 69 74 73         suite its
1eb0: 65 6c 66 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  elf...        #.
1ec0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1ed0: 24 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72  $::test_configur
1ee0: 61 74 69 6f 6e 0d 0a 20 20 20 20 20 20 7d 20 65  ation..      } e
1ef0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
1f00: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1f10: 3a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 77 65 20 77  : Normally, we w
1f20: 69 6c 6c 20 6e 65 76 65 72 20 68 69 74 20 74 68  ill never hit th
1f30: 69 73 20 63 61 73 65 20 62 65 63 61 75 73 65 20  is case because 
1f40: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
1f50: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1f60: 20 20 74 65 73 74 20 63 6f 6e 66 69 67 75 72 61    test configura
1f70: 74 69 6f 6e 20 76 61 72 69 61 62 6c 65 20 69 73  tion variable is
1f80: 20 61 6c 77 61 79 73 20 73 65 74 20 62 79 20 74   always set by t
1f90: 68 65 20 74 65 73 74 20 73 75 69 74 65 0d 0a 20  he test suite.. 
1fa0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69         #       i
1fb0: 74 73 65 6c 66 3b 20 68 6f 77 65 76 65 72 2c 20  tself; however, 
1fc0: 69 74 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69  it can be overri
1fd0: 64 64 65 6e 20 75 73 69 6e 67 20 74 68 65 20 75  dden using the u
1fe0: 6e 73 65 74 20 63 6f 6d 6d 61 6e 64 0d 0a 20 20  nset command..  
1ff0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66 72        #       fr
2000: 6f 6d 20 74 68 65 20 2d 70 72 65 54 65 73 74 20  om the -preTest 
2010: 6f 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 74 65  option to the te
2020: 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20  st suite...     
2030: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
2040: 74 75 72 6e 20 24 3a 3a 65 61 67 6c 65 5f 70 6c  turn $::eagle_pl
2050: 61 74 66 6f 72 6d 28 63 6f 6e 66 69 67 75 72 61  atform(configura
2060: 74 69 6f 6e 29 0d 0a 20 20 20 20 20 20 7d 0d 0a  tion)..      }..
2070: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
2080: 6f 63 20 67 65 74 42 75 69 6c 64 43 6f 6e 66 69  oc getBuildConfi
2090: 67 75 72 61 74 69 6f 6e 73 20 7b 7d 20 7b 0d 0a  gurations {} {..
20a0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
20b0: 20 4e 4f 54 45 3a 20 53 65 65 20 69 66 20 74 68   NOTE: See if th
20c0: 65 20 6c 69 73 74 20 6f 66 20 74 65 73 74 20 63  e list of test c
20d0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 68 61  onfigurations ha
20e0: 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65  s been overridde
20f0: 6e 20 62 79 0d 0a 20 20 20 20 20 20 23 20 20 20  n by..      #   
2100: 20 20 20 20 74 68 65 20 75 73 65 72 20 28 65 2e      the user (e.
2110: 67 2e 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e  g. on the comman
2120: 64 20 6c 69 6e 65 29 2e 0d 0a 20 20 20 20 20 20  d line)...      
2130: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
2140: 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74  fo exists ::test
2150: 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 5d  _configurations]
2160: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
2170: 20 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73   [llength $::tes
2180: 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  t_configurations
2190: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
21a0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
21b0: 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68    # NOTE: Use th
21c0: 65 20 73 70 65 63 69 66 69 65 64 20 6c 69 73 74  e specified list
21d0: 20 6f 66 20 74 65 73 74 20 63 6f 6e 66 69 67 75   of test configu
21e0: 72 61 74 69 6f 6e 73 2e 0d 0a 20 20 20 20 20 20  rations...      
21f0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
2200: 75 72 6e 20 24 3a 3a 74 65 73 74 5f 63 6f 6e 66  urn $::test_conf
2210: 69 67 75 72 61 74 69 6f 6e 73 0d 0a 20 20 20 20  igurations..    
2220: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
2230: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
2240: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 64   NOTE: Use the d
2250: 65 66 61 75 6c 74 20 6c 69 73 74 20 6f 66 20 74  efault list of t
2260: 65 73 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  est configuratio
2270: 6e 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ns...        #..
2280: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
2290: 6c 69 73 74 20 44 65 62 75 67 20 52 65 6c 65 61  list Debug Relea
22a0: 73 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  se]..      }..  
22b0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
22c0: 20 67 65 74 42 75 69 6c 64 42 61 73 65 44 69 72   getBuildBaseDir
22d0: 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20  ectory {} {..   
22e0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
22f0: 54 45 3a 20 46 69 67 75 72 65 20 6f 75 74 20 74  TE: Figure out t
2300: 68 65 20 62 61 73 65 20 64 69 72 65 63 74 6f 72  he base director
2310: 79 20 77 68 65 72 65 20 61 6c 6c 20 74 68 65 20  y where all the 
2320: 62 75 69 6c 64 73 20 73 68 6f 75 6c 64 20 62 65  builds should be
2330: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
2340: 6c 6f 63 61 74 65 64 2e 20 20 54 68 69 73 20 77  located.  This w
2350: 69 6c 6c 20 62 65 20 74 68 65 20 64 69 72 65 63  ill be the direc
2360: 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69  tory that contai
2370: 6e 73 20 74 68 65 20 61 63 74 75 61 6c 0d 0a 20  ns the actual.. 
2380: 20 20 20 20 20 23 20 20 20 20 20 20 20 62 75 69       #       bui
2390: 6c 64 20 6f 75 74 70 75 74 20 64 69 72 65 63 74  ld output direct
23a0: 6f 72 79 20 28 65 2e 67 2e 20 70 61 72 65 6e 74  ory (e.g. parent
23b0: 20 6f 66 20 22 62 69 6e 22 29 2e 0d 0a 20 20 20   of "bin")...   
23c0: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
23d0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 62  [info exists ::b
23e0: 75 69 6c 64 5f 62 61 73 65 5f 64 69 72 65 63 74  uild_base_direct
23f0: 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ory] && \..     
2400: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
2410: 67 74 68 20 24 3a 3a 62 75 69 6c 64 5f 62 61 73  gth $::build_bas
2420: 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30  e_directory] > 0
2430: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2440: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
2450: 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f  OTE: The locatio
2460: 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 64 20 62  n of the build b
2470: 61 73 65 20 64 69 72 65 63 74 6f 72 79 20 68 61  ase directory ha
2480: 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65  s been overridde
2490: 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  n;..        #   
24a0: 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75      therefore, u
24b0: 73 65 20 69 74 20 76 65 72 62 61 74 69 6d 2e 0d  se it verbatim..
24c0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
24d0: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 62 75      return $::bu
24e0: 69 6c 64 5f 62 61 73 65 5f 64 69 72 65 63 74 6f  ild_base_directo
24f0: 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ry..      } else
2500: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
2510: 20 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74   ::common_direct
2520: 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ory] && \..     
2530: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
2540: 67 74 68 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69  gth $::common_di
2550: 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68  rectory] > 0} th
2560: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
2570: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
2580: 20 4e 65 78 74 2c 20 66 61 6c 6c 62 61 63 6b 20   Next, fallback 
2590: 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 64 69  to the parent di
25a0: 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20 6f  rectory of the o
25b0: 6e 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0d 0a 20  ne containing.. 
25c0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
25d0: 68 69 73 20 66 69 6c 65 20 28 69 2e 65 2e 20 22  his file (i.e. "
25e0: 63 6f 6d 6d 6f 6e 2e 65 61 67 6c 65 22 29 2c 20  common.eagle"), 
25f0: 69 66 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20  if available... 
2600: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2610: 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 64    return [file d
2620: 69 72 6e 61 6d 65 20 24 3a 3a 63 6f 6d 6d 6f 6e  irname $::common
2630: 5f 64 69 72 65 63 74 6f 72 79 5d 0d 0a 20 20 20  _directory]..   
2640: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e     } elseif {[in
2650: 66 6f 20 65 78 69 73 74 73 20 3a 3a 70 61 74 68  fo exists ::path
2660: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
2670: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
2680: 20 24 3a 3a 70 61 74 68 5d 20 3e 20 30 7d 20 74   $::path] > 0} t
2690: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
26a0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
26b0: 3a 20 46 69 6e 61 6c 6c 79 2c 20 66 61 6c 6c 62  : Finally, fallb
26c0: 61 63 6b 20 74 6f 20 74 68 65 20 70 61 72 65 6e  ack to the paren
26d0: 74 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74  t directory of t
26e0: 68 65 20 45 61 67 6c 65 54 65 73 74 0d 0a 20 20  he EagleTest..  
26f0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 61        #       pa
2700: 74 68 2e 20 20 54 68 65 20 45 61 67 6c 65 54 65  th.  The EagleTe
2710: 73 74 20 70 61 63 6b 61 67 65 20 67 75 61 72 61  st package guara
2720: 6e 74 65 65 73 20 74 68 61 74 20 74 68 69 73 20  ntees that this 
2730: 76 61 72 69 61 62 6c 65 0d 0a 20 20 20 20 20 20  variable..      
2740: 20 20 23 20 20 20 20 20 20 20 77 69 6c 6c 20 62    #       will b
2750: 65 20 73 65 74 20 74 6f 20 74 68 65 20 64 69 72  e set to the dir
2760: 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e  ectory containin
2770: 67 20 74 68 65 20 66 69 72 73 74 20 66 69 6c 65  g the first file
2780: 20 74 6f 0d 0a 20 20 20 20 20 20 20 20 23 20 20   to..        #  
2790: 20 20 20 20 20 65 78 65 63 75 74 65 20 74 68 65       execute the
27a0: 20 5b 72 75 6e 54 65 73 74 50 72 6f 6c 6f 67 75   [runTestPrologu
27b0: 65 5d 20 73 63 72 69 70 74 20 6c 69 62 72 61 72  e] script librar
27c0: 79 20 70 72 6f 63 65 64 75 72 65 2e 0d 0a 20 20  y procedure...  
27d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
27e0: 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 64 69   return [file di
27f0: 72 6e 61 6d 65 20 24 3a 3a 70 61 74 68 5d 0d 0a  rname $::path]..
2800: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
2810: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2820: 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 20 70 61     # NOTE: No pa
2830: 74 68 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  th is available,
2840: 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79   return an empty
2850: 20 73 74 72 69 6e 67 2e 20 20 54 68 69 73 20 70   string.  This p
2860: 6f 69 6e 74 0d 0a 20 20 20 20 20 20 20 20 23 20  oint..        # 
2870: 20 20 20 20 20 20 73 68 6f 75 6c 64 20 6e 6f 74        should not
2880: 20 62 65 20 72 65 61 63 68 65 64 2e 0d 0a 20 20   be reached...  
2890: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
28a0: 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20   return ""..    
28b0: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
28c0: 20 20 20 70 72 6f 63 20 69 73 4d 69 78 65 64 4d     proc isMixedM
28d0: 6f 64 65 41 73 73 65 6d 62 6c 79 20 7b 20 66 69  odeAssembly { fi
28e0: 6c 65 4e 61 6d 65 20 7b 76 61 72 4e 61 6d 65 20  leName {varName 
28f0: 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ""} } {..      #
2900: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
2910: 46 69 72 73 74 2c 20 6d 61 6b 65 20 73 75 72 65  First, make sure
2920: 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20   the test suite 
2930: 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 69  infrastructure i
2940: 73 20 61 6c 6c 6f 77 65 64 20 74 6f 0d 0a 20 20  s allowed to..  
2950: 20 20 20 20 23 20 20 20 20 20 20 20 75 73 65 20      #       use 
2960: 74 68 65 20 5b 65 78 65 63 5d 20 63 6f 6d 6d 61  the [exec] comma
2970: 6e 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  nd...      #..  
2980: 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
2990: 78 69 73 74 73 20 3a 3a 6e 6f 28 65 78 65 63 29  xists ::no(exec)
29a0: 5d 20 26 26 20 21 5b 69 6e 66 6f 20 65 78 69 73  ] && ![info exis
29b0: 74 73 20 3a 3a 6e 6f 28 63 6f 72 46 6c 61 67 73  ts ::no(corFlags
29c0: 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
29d0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
29e0: 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 6c 6f   NOTE: If the lo
29f0: 63 61 74 69 6f 6e 20 6f 66 20 43 6f 72 46 6c 61  cation of CorFla
2a00: 67 73 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e  gs is present in
2a10: 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74   the environment
2a20: 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ,..        #    
2a30: 20 20 20 75 73 65 20 69 74 3b 20 6f 74 68 65 72     use it; other
2a40: 77 69 73 65 20 61 73 73 75 6d 65 20 69 74 20 69  wise assume it i
2a50: 73 20 69 6e 20 74 68 65 20 50 41 54 48 2e 0d 0a  s in the PATH...
2a60: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2a70: 20 20 20 73 65 74 20 63 6f 72 46 6c 61 67 73 20     set corFlags 
2a80: 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20 20 20 20  [expr {..       
2a90: 20 20 20 5b 69 6e 66 6f 20 65 78 69 73 74 73 20     [info exists 
2aa0: 3a 3a 65 6e 76 28 43 6f 72 46 6c 61 67 73 29 5d  ::env(CorFlags)]
2ab0: 20 3f 20 24 3a 3a 65 6e 76 28 43 6f 72 46 6c 61   ? $::env(CorFla
2ac0: 67 73 29 20 3a 20 22 43 6f 72 46 6c 61 67 73 22  gs) : "CorFlags"
2ad0: 0d 0a 20 20 20 20 20 20 20 20 7d 5d 0d 0a 0d 0a  ..        }]....
2ae0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2af0: 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
2b00: 70 74 20 74 6f 20 65 78 65 63 75 74 65 20 43 6f  pt to execute Co
2b10: 72 46 6c 61 67 73 20 6f 6e 20 74 68 65 20 73 70  rFlags on the sp
2b20: 65 63 69 66 69 65 64 20 66 69 6c 65 2e 0d 0a 20  ecified file... 
2b30: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2b40: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
2b50: 20 20 20 20 20 20 20 20 20 20 65 78 65 63 20 2d            exec -
2b60: 2d 20 24 63 6f 72 46 6c 61 67 73 20 5b 66 69 6c  - $corFlags [fil
2b70: 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 24 66 69  e nativename $fi
2b80: 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20  leName]..       
2b90: 20 7d 20 65 78 65 63 5d 20 3d 3d 20 30 7d 20 74   } exec] == 0} t
2ba0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2bb0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
2bc0: 4e 4f 54 45 3a 20 49 66 20 72 65 71 75 65 73 74  NOTE: If request
2bd0: 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72  ed by our caller
2be0: 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 64 65 74  , attempt to det
2bf0: 65 72 6d 69 6e 65 20 74 68 65 0d 0a 20 20 20 20  ermine the..    
2c00: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 6c        #       pl
2c10: 61 74 66 6f 72 6d 20 66 6f 72 20 74 68 65 20 73  atform for the s
2c20: 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 61 73  pecified file as
2c30: 20 77 65 6c 6c 2e 0d 0a 20 20 20 20 20 20 20 20   well...        
2c40: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69    #..          i
2c50: 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
2c60: 68 20 24 76 61 72 4e 61 6d 65 5d 20 3e 20 30 7d  h $varName] > 0}
2c70: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2c80: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2c90: 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 74 6f 72      # NOTE: Stor
2ca0: 65 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 20 69  e the platform i
2cb0: 6e 20 74 68 65 20 6e 61 6d 65 64 20 76 61 72 69  n the named vari
2cc0: 61 62 6c 65 20 69 6e 20 74 68 65 0d 0a 20 20 20  able in the..   
2cd0: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
2ce0: 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 20   context of our 
2cf0: 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 20  caller...       
2d00: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2d10: 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72      upvar 1 $var
2d20: 4e 61 6d 65 20 70 6c 61 74 66 6f 72 6d 0d 0a 0d  Name platform...
2d30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
2d40: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
2d50: 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 65  TE: Attempt to e
2d60: 78 74 72 61 63 74 20 74 68 65 20 50 45 20 6c 69  xtract the PE li
2d70: 6e 65 20 66 72 6f 6d 20 74 68 65 20 63 61 70 74  ne from the capt
2d80: 75 72 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20  ured..          
2d90: 20 20 23 20 20 20 20 20 20 20 6f 75 74 70 75 74    #       output
2da0: 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65  .  If this value
2db0: 20 69 73 20 22 50 45 33 32 22 20 6f 72 20 22 50   is "PE32" or "P
2dc0: 45 33 32 2b 22 2c 20 74 68 65 0d 0a 20 20 20 20  E32+", the..    
2dd0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2de0: 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 20 69 73  assembly file is
2df0: 20 33 32 2d 62 69 74 20 6f 72 20 36 34 2d 62 69   32-bit or 64-bi
2e00: 74 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 3b  t, respectively;
2e10: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
2e20: 20 20 20 20 20 20 6f 74 68 65 72 77 69 73 65 2c        otherwise,
2e30: 20 69 74 73 20 74 79 70 65 20 69 73 20 75 6e 6b   its type is unk
2e40: 6e 6f 77 6e 2e 0d 0a 20 20 20 20 20 20 20 20 20  nown...         
2e50: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
2e60: 20 20 73 65 74 20 70 61 74 74 65 72 6e 20 7b 5e    set pattern {^
2e70: 50 45 20 20 20 20 20 20 20 20 3a 20 28 50 45 33  PE        : (PE3
2e80: 32 7c 50 45 33 32 5c 2b 29 5c 73 2b 24 7d 0d 0a  2|PE32\+)\s+$}..
2e90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
2ea0: 20 7b 5b 72 65 67 65 78 70 20 2d 6c 69 6e 65 20   {[regexp -line 
2eb0: 2d 2d 20 24 70 61 74 74 65 72 6e 20 24 65 78 65  -- $pattern $exe
2ec0: 63 20 64 75 6d 6d 79 20 70 65 33 32 5d 7d 20 74  c dummy pe32]} t
2ed0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2ee0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2ef0: 20 20 20 20 20 20 23 20 48 41 43 4b 3a 20 54 68        # HACK: Th
2f00: 69 73 20 5b 73 77 69 74 63 68 5d 20 61 73 73 75  is [switch] assu
2f10: 6d 65 73 20 74 68 61 74 20 33 32 2d 62 69 74 20  mes that 32-bit 
2f20: 65 78 65 63 75 74 61 62 6c 65 73 20 61 72 65 0d  executables are.
2f30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
2f40: 20 20 20 20 20 20 20 61 6c 77 61 79 73 20 78 38         always x8
2f50: 36 20 61 6e 64 20 74 68 61 74 20 36 34 2d 62 69  6 and that 64-bi
2f60: 74 20 65 78 65 63 75 74 61 62 6c 65 73 20 61 72  t executables ar
2f70: 65 20 61 6c 77 61 79 73 0d 0a 20 20 20 20 20 20  e always..      
2f80: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2f90: 78 36 34 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  x64...          
2fa0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
2fb0: 20 20 20 20 20 73 77 69 74 63 68 20 2d 65 78 61       switch -exa
2fc0: 63 74 20 2d 2d 20 24 70 65 33 32 20 7b 0d 0a 20  ct -- $pe32 {.. 
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
2fe0: 45 33 32 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  E32 {..         
2ff0: 20 20 20 20 20 20 20 20 20 73 65 74 20 70 6c 61           set pla
3000: 74 66 6f 72 6d 20 57 69 6e 33 32 0d 0a 20 20 20  tform Win32..   
3010: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
3020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3030: 50 45 33 32 2b 20 7b 0d 0a 20 20 20 20 20 20 20  PE32+ {..       
3040: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 70             set p
3050: 6c 61 74 66 6f 72 6d 20 78 36 34 0d 0a 20 20 20  latform x64..   
3060: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
3070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3080: 64 65 66 61 75 6c 74 20 7b 0d 0a 20 20 20 20 20  default {..     
3090: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
30a0: 20 70 6c 61 74 66 6f 72 6d 20 22 22 0d 0a 20 20   platform ""..  
30b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
30c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
30d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ..            } 
30e0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
30f0: 20 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f        set platfo
3100: 72 6d 20 22 22 0d 0a 20 20 20 20 20 20 20 20 20  rm ""..         
3110: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
3120: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23  }....          #
3130: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
3140: 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 65  TE: Attempt to e
3150: 78 74 72 61 63 74 20 74 68 65 20 49 4c 4f 4e 4c  xtract the ILONL
3160: 59 20 6c 69 6e 65 20 66 72 6f 6d 20 74 68 65 20  Y line from the 
3170: 63 61 70 74 75 72 65 64 0d 0a 20 20 20 20 20 20  captured..      
3180: 20 20 20 20 23 20 20 20 20 20 20 20 6f 75 74 70      #       outp
3190: 75 74 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c  ut.  If this val
31a0: 75 65 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 20  ue is zero, the 
31b0: 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 6d  specified file m
31c0: 75 73 74 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ust..          #
31d0: 20 20 20 20 20 20 20 62 65 20 61 20 6d 69 78 65         be a mixe
31e0: 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 3b  d-mode assembly;
31f0: 20 6f 74 68 65 72 77 69 73 65 2c 20 69 74 20 63   otherwise, it c
3200: 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 0d 0a 20 20  ontains only..  
3210: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
3220: 6d 61 6e 61 67 65 64 20 63 6f 6d 70 6f 6e 65 6e  managed componen
3230: 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ts...          #
3240: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
3250: 70 61 74 74 65 72 6e 20 7b 5e 49 4c 4f 4e 4c 59  pattern {^ILONLY
3260: 20 20 20 20 3a 20 28 30 7c 31 29 5c 73 2b 24 7d      : (0|1)\s+$}
3270: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
3280: 20 7b 21 5b 72 65 67 65 78 70 20 2d 6c 69 6e 65   {![regexp -line
3290: 20 2d 2d 20 24 70 61 74 74 65 72 6e 20 24 65 78   -- $pattern $ex
32a0: 65 63 20 64 75 6d 6d 79 20 69 6c 4f 6e 6c 79 5d  ec dummy ilOnly]
32b0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
32c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
32d0: 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  se..          }.
32e0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
32f0: 7b 21 24 69 6c 4f 6e 6c 79 7d 20 74 68 65 6e 20  {!$ilOnly} then 
3300: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  {..            r
3310: 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20  eturn true..    
3320: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
3330: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
3340: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
3350: 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 74 65 73  NOTE: If the tes
3360: 74 20 73 75 69 74 65 20 63 61 6e 6e 6f 74 20 75  t suite cannot u
3370: 73 65 20 5b 65 78 65 63 5d 20 6f 72 20 65 78 65  se [exec] or exe
3380: 63 75 74 69 6f 6e 20 6f 66 20 43 6f 72 46 6c 61  cution of CorFla
3390: 67 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  gs..      #     
33a0: 20 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e    failed, return
33b0: 20 66 61 6c 73 65 2e 0d 0a 20 20 20 20 20 20 23   false...      #
33c0: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 66  ..      return f
33d0: 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  alse..    }.....
33e0: 20 20 20 20 70 72 6f 63 20 69 73 42 75 69 6c 64      proc isBuild
33f0: 41 76 61 69 6c 61 62 6c 65 20 7b 20 6e 61 74 69  Available { nati
3400: 76 65 20 64 69 72 65 63 74 6f 72 79 20 7b 76 61  ve directory {va
3410: 72 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20  rName ""} } {.. 
3420: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
3430: 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20  NOTE: Build the 
3440: 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20  fully qualified 
3450: 66 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 74 68  file name for th
3460: 65 20 70 72 69 6d 61 72 79 20 61 73 73 65 6d 62  e primary assemb
3470: 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ly..      #     
3480: 20 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65    containing the
3490: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
34a0: 69 74 65 20 6d 61 6e 61 67 65 64 20 63 6f 6d 70  ite managed comp
34b0: 6f 6e 65 6e 74 73 2e 20 20 49 74 0d 0a 20 20 20  onents.  It..   
34c0: 20 20 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c     #       shoul
34d0: 64 20 62 65 20 6e 6f 74 65 64 20 74 68 61 74 20  d be noted that 
34e0: 74 68 69 73 20 61 73 73 65 6d 62 6c 79 20 66 69  this assembly fi
34f0: 6c 65 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74  le may also cont
3500: 61 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23  ain the..      #
3510: 20 20 20 20 20 20 20 6e 61 74 69 76 65 20 63 6f         native co
3520: 6d 70 6f 6e 65 6e 74 73 2c 20 69 66 20 61 20 6e  mponents, if a n
3530: 61 74 69 76 65 20 62 75 69 6c 64 20 69 73 20 69  ative build is i
3540: 6e 20 75 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d  n use...      #.
3550: 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e  .      set fileN
3560: 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ame [file native
3570: 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
3580: 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20  $directory \..  
3590: 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
35a0: 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d 5d  ata.SQLite.dll]]
35b0: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b  ....      if {![
35c0: 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c  file exists $fil
35d0: 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
35e0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
35f0: 61 6c 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  alse..      }...
3600: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
3610: 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
3620: 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  to automatically
3630: 20 64 65 74 65 63 74 20 69 66 20 74 68 65 20 70   detect if the p
3640: 72 69 6d 61 72 79 20 61 73 73 65 6d 62 6c 79 0d  rimary assembly.
3650: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
3660: 6f 6e 74 61 69 6e 73 20 61 6e 79 20 6e 61 74 69  ontains any nati
3670: 76 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 2c 20 69  ve components, i
3680: 66 20 6e 65 63 65 73 73 61 72 79 2e 0d 0a 20 20  f necessary...  
3690: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
36a0: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
36b0: 24 6e 61 74 69 76 65 5d 20 3d 3d 20 30 7d 20 74  $native] == 0} t
36c0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
36d0: 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
36e0: 68 20 24 76 61 72 4e 61 6d 65 5d 20 3e 20 30 7d  h $varName] > 0}
36f0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
3700: 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e     upvar 1 $varN
3710: 61 6d 65 20 24 76 61 72 4e 61 6d 65 0d 0a 20 20  ame $varName..  
3720: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
3730: 20 20 20 73 65 74 20 6e 61 74 69 76 65 20 5b 69     set native [i
3740: 73 4d 69 78 65 64 4d 6f 64 65 41 73 73 65 6d 62  sMixedModeAssemb
3750: 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 24 76 61  ly $fileName $va
3760: 72 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 0d  rName]..      }.
3770: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
3780: 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65    # NOTE: If the
3790: 20 70 72 69 6d 61 72 79 20 61 73 73 65 6d 62 6c   primary assembl
37a0: 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20  y also contains 
37b0: 74 68 65 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f  the native compo
37c0: 6e 65 6e 74 73 2c 0d 0a 20 20 20 20 20 20 23 20  nents,..      # 
37d0: 20 20 20 20 20 20 77 65 20 68 61 76 65 20 65 76        we have ev
37e0: 65 72 79 74 68 69 6e 67 20 77 65 20 6e 65 65 64  erything we need
37f0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
3800: 20 20 69 66 20 7b 24 6e 61 74 69 76 65 7d 20 74    if {$native} t
3810: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
3820: 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20  eturn true..    
3830: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
3840: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75        # NOTE: Bu
3850: 69 6c 64 20 74 68 65 20 66 75 6c 6c 79 20 71 75  ild the fully qu
3860: 61 6c 69 66 69 65 64 20 66 69 6c 65 20 6e 61 6d  alified file nam
3870: 65 20 66 6f 72 20 74 68 65 20 69 6e 74 65 72 6f  e for the intero
3880: 70 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20 20  p assembly..    
3890: 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74 61 69    #       contai
38a0: 6e 69 6e 67 20 74 68 65 20 53 79 73 74 65 6d 2e  ning the System.
38b0: 44 61 74 61 2e 53 51 4c 69 74 65 20 6e 61 74 69  Data.SQLite nati
38c0: 76 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e 20 20  ve components.  
38d0: 49 66 20 74 68 69 73 0d 0a 20 20 20 20 20 20 23  If this..      #
38e0: 20 20 20 20 20 20 20 66 69 6c 65 20 65 78 69 73         file exis
38f0: 74 73 2c 20 77 65 20 73 68 6f 75 6c 64 20 68 61  ts, we should ha
3900: 76 65 20 65 76 65 72 79 74 68 69 6e 67 20 77 65  ve everything we
3910: 20 6e 65 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d   need...      #.
3920: 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e  .      set fileN
3930: 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ame [file native
3940: 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
3950: 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20  $directory \..  
3960: 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 2e 49          SQLite.I
3970: 6e 74 65 72 6f 70 2e 64 6c 6c 5d 5d 0d 0a 0d 0a  nterop.dll]]....
3980: 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20        if {[file 
3990: 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65  exists $fileName
39a0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
39b0: 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a     return true..
39c0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
39d0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
39e0: 3a 20 42 75 69 6c 64 20 74 68 65 20 66 75 6c 6c  : Build the full
39f0: 79 20 71 75 61 6c 69 66 69 65 64 20 66 69 6c 65  y qualified file
3a00: 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 53 51   name for the SQ
3a10: 4c 69 74 65 20 63 6f 72 65 0d 0a 20 20 20 20 20  Lite core..     
3a20: 20 23 20 20 20 20 20 20 20 6c 69 62 72 61 72 79   #       library
3a30: 2e 20 20 49 66 20 74 68 69 73 20 66 69 6c 65 20  .  If this file 
3a40: 65 78 69 73 74 73 2c 20 77 65 20 73 68 6f 75 6c  exists, we shoul
3a50: 64 20 68 61 76 65 20 65 76 65 72 79 74 68 69 6e  d have everythin
3a60: 67 20 77 65 0d 0a 20 20 20 20 20 20 23 20 20 20  g we..      #   
3a70: 20 20 20 20 6e 65 65 64 2e 0d 0a 20 20 20 20 20      need...     
3a80: 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69   #..      set fi
3a90: 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74  leName [file nat
3aa0: 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
3ab0: 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d  in $directory \.
3ac0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
3ad0: 65 33 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20 20  e3.dll]]....    
3ae0: 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73    if {[file exis
3af0: 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74  ts $fileName]} t
3b00: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
3b10: 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20  eturn true..    
3b20: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
3b30: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4f 6e        # NOTE: On
3b40: 65 20 6f 72 20 6d 6f 72 65 20 6e 61 74 69 76 65  e or more native
3b50: 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 6e 65 65 64   components need
3b60: 65 64 20 62 79 20 53 79 73 74 65 6d 2e 44 61 74  ed by System.Dat
3b70: 61 2e 53 51 4c 69 74 65 0d 0a 20 20 20 20 20 20  a.SQLite..      
3b80: 23 20 20 20 20 20 20 20 61 72 65 20 6d 69 73 73  #       are miss
3b90: 69 6e 67 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ing...      #.. 
3ba0: 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73       return fals
3bb0: 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  e..    }.....   
3bc0: 20 70 72 6f 63 20 69 73 52 65 6c 65 61 73 65 41   proc isReleaseA
3bd0: 76 61 69 6c 61 62 6c 65 20 7b 20 64 69 72 65 63  vailable { direc
3be0: 74 6f 72 79 20 7b 76 61 72 4e 61 6d 65 20 22 22  tory {varName ""
3bf0: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20  } } {..      if 
3c00: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
3c10: 24 76 61 72 4e 61 6d 65 5d 20 3e 20 30 7d 20 74  $varName] > 0} t
3c20: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 75  hen {..        u
3c30: 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20  pvar 1 $varName 
3c40: 24 76 61 72 4e 61 6d 65 0d 0a 20 20 20 20 20 20  $varName..      
3c50: 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
3c60: 6e 20 5b 69 73 42 75 69 6c 64 41 76 61 69 6c 61  n [isBuildAvaila
3c70: 62 6c 65 20 22 22 20 24 64 69 72 65 63 74 6f 72  ble "" $director
3c80: 79 20 24 76 61 72 4e 61 6d 65 5d 0d 0a 20 20 20  y $varName]..   
3c90: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
3ca0: 6a 6f 69 6e 42 75 69 6c 64 44 69 72 65 63 74 6f  joinBuildDirecto
3cb0: 72 79 20 7b 20 6e 61 74 69 76 65 20 70 61 74 68  ry { native path
3cc0: 20 79 65 61 72 20 70 6c 61 74 66 6f 72 6d 20 63   year platform c
3cd0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 7d 20 7b  onfiguration } {
3ce0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
3cf0: 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20   # NOTE: Figure 
3d00: 6f 75 74 20 61 6e 64 20 74 68 65 6e 20 72 65 74  out and then ret
3d10: 75 72 6e 20 74 68 65 20 66 75 6c 6c 79 20 71 75  urn the fully qu
3d20: 61 6c 69 66 69 65 64 20 70 61 74 68 20 74 6f 20  alified path to 
3d30: 74 68 65 20 62 75 69 6c 64 0d 0a 20 20 20 20 20  the build..     
3d40: 20 23 20 20 20 20 20 20 20 64 69 72 65 63 74 6f   #       directo
3d50: 72 79 20 62 61 73 65 64 20 6f 6e 20 61 6c 6c 20  ry based on all 
3d60: 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 70 72  the arguments pr
3d70: 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20 63 61  ovided by our ca
3d80: 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ller...      #..
3d90: 20 20 20 20 20 20 69 66 20 7b 24 6e 61 74 69 76        if {$nativ
3da0: 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
3db0: 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20     return [file 
3dc0: 6a 6f 69 6e 20 24 70 61 74 68 20 62 69 6e 20 24  join $path bin $
3dd0: 79 65 61 72 20 24 70 6c 61 74 66 6f 72 6d 20 24  year $platform $
3de0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a  configuration]..
3df0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
3e00: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
3e10: 66 69 6c 65 20 6a 6f 69 6e 20 24 70 61 74 68 20  file join $path 
3e20: 62 69 6e 20 24 79 65 61 72 20 24 63 6f 6e 66 69  bin $year $confi
3e30: 67 75 72 61 74 69 6f 6e 20 62 69 6e 5d 0d 0a 20  guration bin].. 
3e40: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
3e50: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 75  ..    proc getBu
3e60: 69 6c 64 44 69 72 65 63 74 6f 72 79 20 7b 7d 20  ildDirectory {} 
3e70: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
3e80: 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66    # NOTE: See if
3e90: 20 74 68 65 20 22 6e 61 74 69 76 65 22 20 72 75   the "native" ru
3ea0: 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 20 68 61 73  ntime option has
3eb0: 20 62 65 65 6e 20 73 65 74 2e 20 20 49 66 20 73   been set.  If s
3ec0: 6f 2c 20 75 73 65 20 74 68 65 0d 0a 20 20 20 20  o, use the..    
3ed0: 20 20 23 20 20 20 20 20 20 20 64 69 72 65 63 74    #       direct
3ee0: 6f 72 79 20 66 6f 72 20 74 68 65 20 6d 69 78 65  ory for the mixe
3ef0: 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20  d-mode assembly 
3f00: 28 61 2e 6b 2e 61 2e 20 74 68 65 20 6e 61 74 69  (a.k.a. the nati
3f10: 76 65 20 69 6e 74 65 72 6f 70 0d 0a 20 20 20 20  ve interop..    
3f20: 20 20 23 20 20 20 20 20 20 20 61 73 73 65 6d 62    #       assemb
3f30: 6c 79 29 2e 20 20 54 6f 20 65 6e 61 62 6c 65 20  ly).  To enable 
3f40: 74 68 69 73 20 6f 70 74 69 6f 6e 20 76 69 61 20  this option via 
3f50: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
3f60: 2c 20 65 6e 74 65 72 20 61 0d 0a 20 20 20 20 20  , enter a..     
3f70: 20 23 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64   #       command
3f80: 20 73 69 6d 69 6c 61 72 20 74 6f 20 6f 6e 65 20   similar to one 
3f90: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
3fa0: 20 28 61 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e   (all on one lin
3fb0: 65 29 3a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  e):..      #..  
3fc0: 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c      #       Eagl
3fd0: 65 53 68 65 6c 6c 2e 65 78 65 20 2d 69 6e 69 74  eShell.exe -init
3fe0: 69 61 6c 69 7a 65 20 2d 72 75 6e 74 69 6d 65 4f  ialize -runtimeO
3ff0: 70 74 69 6f 6e 20 6e 61 74 69 76 65 0d 0a 20 20  ption native..  
4000: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 2d 66      #         -f
4010: 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c  ile .\path\to\al
4020: 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23  l.eagle..      #
4030: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
4040: 54 6f 20 65 6e 61 62 6c 65 20 74 68 69 73 20 6f  To enable this o
4050: 70 74 69 6f 6e 20 76 69 61 20 74 68 65 20 63 6f  ption via the co
4060: 6d 6d 61 6e 64 20 6c 69 6e 65 20 70 72 69 6f 72  mmand line prior
4070: 20 74 6f 20 74 68 65 20 22 62 65 74 61 20 31 36   to the "beta 16
4080: 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  "..      #      
4090: 20 72 65 6c 65 61 73 65 20 6f 66 20 45 61 67 6c   release of Eagl
40a0: 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e, the following
40b0: 20 63 6f 6d 6d 61 6e 64 20 6d 75 73 74 20 62 65   command must be
40c0: 20 75 73 65 64 20 69 6e 73 74 65 61 64 0d 0a 20   used instead.. 
40d0: 20 20 20 20 20 23 20 20 20 20 20 20 20 28 61 6c       #       (al
40e0: 73 6f 20 61 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69  so all on one li
40f0: 6e 65 29 3a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ne):..      #.. 
4100: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
4110: 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 69 6e 69  leShell.exe -ini
4120: 74 69 61 6c 69 7a 65 20 2d 70 6f 73 74 49 6e 69  tialize -postIni
4130: 74 69 61 6c 69 7a 65 0d 0a 20 20 20 20 20 20 23  tialize..      #
4140: 20 20 20 20 20 20 20 20 20 22 6f 62 6a 65 63 74           "object
4150: 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72 65   invoke Interpre
4160: 74 65 72 2e 47 65 74 41 63 74 69 76 65 20 41 64  ter.GetActive Ad
4170: 64 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e  dRuntimeOption n
4180: 61 74 69 76 65 22 0d 0a 20 20 20 20 20 20 23 20  ative"..      # 
4190: 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c          -file .\
41a0: 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c  path\to\all.eagl
41b0: 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  e..      #..    
41c0: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
41d0: 74 73 20 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63  ts ::build_direc
41e0: 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20  tory] && \..    
41f0: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
4200: 6e 67 74 68 20 24 3a 3a 62 75 69 6c 64 5f 64 69  ngth $::build_di
4210: 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68  rectory] > 0} th
4220: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
4230: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
4240: 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   The location of
4250: 20 74 68 65 20 62 75 69 6c 64 20 64 69 72 65 63   the build direc
4260: 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76  tory has been ov
4270: 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20  erridden;..     
4280: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 72 65     #       there
4290: 66 6f 72 65 2c 20 75 73 65 20 69 74 20 76 65 72  fore, use it ver
42a0: 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20  batim...        
42b0: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
42c0: 6e 20 24 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63  n $::build_direc
42d0: 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c  tory..      } el
42e0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
42f0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
4300: 20 49 66 20 74 68 65 20 22 6e 61 74 69 76 65 22   If the "native"
4310: 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 20   runtime option 
4320: 69 73 20 73 65 74 2c 20 74 68 65 20 6d 69 78 65  is set, the mixe
4330: 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 0d  d-mode assembly.
4340: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
4350: 20 69 73 20 62 65 69 6e 67 20 74 65 73 74 65 64   is being tested
4360: 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  .  In that case,
4370: 20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68 65   the path to the
4380: 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79   build directory
4390: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
43a0: 20 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 74    will contain t
43b0: 68 65 20 70 6c 61 74 66 6f 72 6d 20 6e 61 6d 65  he platform name
43c0: 20 61 6e 64 20 61 6c 6c 20 74 68 65 20 62 69 6e   and all the bin
43d0: 61 72 69 65 73 20 75 6e 64 65 72 20 74 65 73 74  aries under test
43e0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
43f0: 20 20 73 68 6f 75 6c 64 20 62 65 20 70 72 65 73    should be pres
4400: 65 6e 74 20 69 6e 20 74 68 61 74 20 64 69 72 65  ent in that dire
4410: 63 74 6f 72 79 2e 20 20 49 66 20 74 68 65 20 22  ctory.  If the "
4420: 6e 61 74 69 76 65 22 20 72 75 6e 74 69 6d 65 0d  native" runtime.
4430: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
4440: 20 6f 70 74 69 6f 6e 20 69 73 20 6e 6f 74 20 73   option is not s
4450: 65 74 2c 20 74 68 65 20 62 75 69 6c 64 20 64 69  et, the build di
4460: 72 65 63 74 6f 72 79 20 77 69 6c 6c 20 62 65 20  rectory will be 
4470: 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
4480: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
4490: 20 20 22 70 6c 61 74 66 6f 72 6d 2d 6e 65 75 74    "platform-neut
44a0: 72 61 6c 22 2c 20 77 69 74 68 20 74 68 65 20 6e  ral", with the n
44b0: 6f 74 61 62 6c 65 20 65 78 63 65 70 74 69 6f 6e  otable exception
44c0: 20 6f 66 20 61 6e 79 20 6e 61 74 69 76 65 0d 0a   of any native..
44d0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
44e0: 61 73 73 65 6d 62 6c 79 20 28 65 2e 67 2e 20 22  assembly (e.g. "
44f0: 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64  SQLite.Interop.d
4500: 6c 6c 22 29 20 63 6f 70 69 65 64 20 74 68 65 72  ll") copied ther
4510: 65 20 64 75 72 69 6e 67 20 74 68 65 0d 0a 20 20  e during the..  
4520: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 75        #       bu
4530: 69 6c 64 20 70 72 6f 63 65 73 73 20 69 74 73 65  ild process itse
4540: 6c 66 2e 20 20 49 66 20 74 68 65 20 62 75 69 6c  lf.  If the buil
4550: 64 20 70 72 6f 63 65 73 73 20 73 6f 6d 65 68 6f  d process someho
4560: 77 20 64 6f 65 73 20 6e 6f 74 0d 0a 20 20 20 20  w does not..    
4570: 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 70 79      #       copy
4580: 20 74 68 65 20 6e 61 74 69 76 65 20 61 73 73 65   the native asse
4590: 6d 62 6c 79 20 66 6f 72 20 74 68 69 73 20 70 6c  mbly for this pl
45a0: 61 74 66 6f 72 6d 2c 20 6d 6f 73 74 20 6f 66 20  atform, most of 
45b0: 74 68 65 20 74 65 73 74 73 0d 0a 20 20 20 20 20  the tests..     
45c0: 20 20 20 23 20 20 20 20 20 20 20 69 6e 20 74 68     #       in th
45d0: 65 20 73 75 69 74 65 20 77 69 6c 6c 20 73 69 6d  e suite will sim
45e0: 70 6c 79 20 62 65 20 73 6b 69 70 70 65 64 2e 20  ply be skipped. 
45f0: 20 47 65 6e 65 72 61 6c 6c 79 20 73 70 65 61 6b   Generally speak
4600: 69 6e 67 2c 20 74 68 65 72 65 0d 0a 20 20 20 20  ing, there..    
4610: 20 20 20 20 23 20 20 20 20 20 20 20 61 72 65 20      #       are 
4620: 74 77 6f 20 77 61 79 73 20 74 6f 20 62 75 69 6c  two ways to buil
4630: 64 20 74 68 65 20 62 69 6e 61 72 69 65 73 20 77  d the binaries w
4640: 68 65 6e 20 70 72 65 70 61 72 69 6e 67 20 74 6f  hen preparing to
4650: 20 72 75 6e 20 74 68 65 0d 0a 20 20 20 20 20 20   run the..      
4660: 20 20 23 20 20 20 20 20 20 20 74 65 73 74 20 73    #       test s
4670: 75 69 74 65 3a 0d 0a 20 20 20 20 20 20 20 20 23  uite:..        #
4680: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
4690: 20 20 31 2e 20 42 75 69 6c 64 20 74 68 65 20 73    1. Build the s
46a0: 65 70 61 72 61 74 65 20 6d 61 6e 61 67 65 64 20  eparate managed 
46b0: 61 6e 64 20 6e 61 74 69 76 65 20 61 73 73 65 6d  and native assem
46c0: 62 6c 69 65 73 20 75 73 69 6e 67 20 73 6f 6d 65  blies using some
46d0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
46e0: 20 20 20 20 20 63 6f 6d 6d 61 6e 64 73 20 73 69       commands si
46f0: 6d 69 6c 61 72 20 74 6f 3a 0d 0a 20 20 20 20 20  milar to:..     
4700: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
4710: 20 20 20 20 20 20 20 20 20 62 75 69 6c 64 2e 62           build.b
4720: 61 74 20 24 7b 43 6f 6e 66 69 67 75 72 61 74 69  at ${Configurati
4730: 6f 6e 7d 4d 61 6e 61 67 65 64 4f 6e 6c 79 20 24  on}ManagedOnly $
4740: 7b 50 6c 61 74 66 6f 72 6d 7d 0d 0a 20 20 20 20  {Platform}..    
4750: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 62      #          b
4760: 75 69 6c 64 2e 62 61 74 20 24 7b 43 6f 6e 66 69  uild.bat ${Confi
4770: 67 75 72 61 74 69 6f 6e 7d 4e 61 74 69 76 65 4f  guration}NativeO
4780: 6e 6c 79 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 0d  nly ${Platform}.
4790: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
47a0: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 57      #          W
47b0: 68 65 72 65 20 24 7b 43 6f 6e 66 69 67 75 72 61  here ${Configura
47c0: 74 69 6f 6e 7d 20 69 73 20 65 69 74 68 65 72 20  tion} is either 
47d0: 22 44 65 62 75 67 22 20 6f 72 20 22 52 65 6c 65  "Debug" or "Rele
47e0: 61 73 65 22 20 61 6e 64 0d 0a 20 20 20 20 20 20  ase" and..      
47f0: 20 20 23 20 20 20 20 20 20 20 20 20 20 24 7b 50    #          ${P
4800: 6c 61 74 66 6f 72 6d 7d 20 69 73 20 65 69 74 68  latform} is eith
4810: 65 72 20 22 57 69 6e 33 32 22 20 6f 72 20 22 78  er "Win32" or "x
4820: 36 34 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  64"...        #.
4830: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
4840: 20 32 2e 20 42 75 69 6c 64 20 74 68 65 20 6d 69   2. Build the mi
4850: 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c  xed-mode assembl
4860: 79 20 75 73 69 6e 67 20 61 20 63 6f 6d 6d 61 6e  y using a comman
4870: 64 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0d 0a 20  d similar to:.. 
4880: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4890: 20 20 23 20 20 20 20 20 20 20 20 20 20 62 75 69    #          bui
48a0: 6c 64 2e 62 61 74 20 24 7b 43 6f 6e 66 69 67 75  ld.bat ${Configu
48b0: 72 61 74 69 6f 6e 7d 20 24 7b 50 6c 61 74 66 6f  ration} ${Platfo
48c0: 72 6d 7d 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  rm}..        #..
48d0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
48e0: 20 20 20 57 68 65 72 65 20 24 7b 43 6f 6e 66 69     Where ${Confi
48f0: 67 75 72 61 74 69 6f 6e 7d 20 69 73 20 65 69 74  guration} is eit
4900: 68 65 72 20 22 44 65 62 75 67 22 20 6f 72 20 22  her "Debug" or "
4910: 52 65 6c 65 61 73 65 22 20 61 6e 64 0d 0a 20 20  Release" and..  
4920: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
4930: 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 20 69 73 20   ${Platform} is 
4940: 65 69 74 68 65 72 20 22 57 69 6e 33 32 22 20 6f  either "Win32" o
4950: 72 20 22 78 36 34 22 2e 20 20 49 66 20 74 68 69  r "x64".  If thi
4960: 73 20 63 6f 6d 6d 61 6e 64 20 69 73 0d 0a 20 20  s command is..  
4970: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
4980: 20 75 73 65 64 2c 20 76 61 72 69 6f 75 73 20 74   used, various t
4990: 65 73 74 73 20 74 68 61 74 20 72 65 71 75 69 72  ests that requir
49a0: 65 20 73 75 70 70 6c 65 6d 65 6e 74 61 72 79 20  e supplementary 
49b0: 6d 61 6e 61 67 65 64 0d 0a 20 20 20 20 20 20 20  managed..       
49c0: 20 23 20 20 20 20 20 20 20 20 20 20 61 73 73 65   #          asse
49d0: 6d 62 6c 69 65 73 20 28 65 2e 67 2e 20 4c 49 4e  mblies (e.g. LIN
49e0: 51 29 20 6d 61 79 20 62 65 20 73 6b 69 70 70 65  Q) may be skippe
49f0: 64 20 75 6e 6c 65 73 73 20 74 68 6f 73 65 20 62  d unless those b
4a00: 69 6e 61 72 69 65 73 0d 0a 20 20 20 20 20 20 20  inaries..       
4a10: 20 23 20 20 20 20 20 20 20 20 20 20 61 72 65 20   #          are 
4a20: 73 75 62 73 65 71 75 65 6e 74 6c 79 20 63 6f 70  subsequently cop
4a30: 69 65 64 20 69 6e 74 6f 20 74 68 65 20 63 6f 72  ied into the cor
4a40: 72 65 63 74 20 64 69 72 65 63 74 6f 72 79 20 28  rect directory (
4a50: 69 2e 65 2e 20 62 79 0d 0a 20 20 20 20 20 20 20  i.e. by..       
4a60: 20 23 20 20 20 20 20 20 20 20 20 20 22 74 65 73   #          "tes
4a70: 74 5f 61 6c 6c 2e 62 61 74 22 29 2e 0d 0a 20 20  t_all.bat")...  
4a80: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
4a90: 20 23 20 20 20 20 20 20 20 4e 6f 74 65 20 74 68   #       Note th
4aa0: 61 74 20 61 6c 6c 20 6f 66 20 74 68 65 20 62 75  at all of the bu
4ab0: 69 6c 64 20 63 6f 6d 6d 61 6e 64 73 20 61 62 6f  ild commands abo
4ac0: 76 65 20 77 69 6c 6c 20 64 65 66 61 75 6c 74 20  ve will default 
4ad0: 74 6f 20 75 73 69 6e 67 0d 0a 20 20 20 20 20 20  to using..      
4ae0: 20 20 23 20 20 20 20 20 20 20 74 68 65 20 6c 61    #       the la
4af0: 74 65 73 74 20 76 65 72 73 69 6f 6e 20 6f 66 20  test version of 
4b00: 4d 53 42 75 69 6c 64 20 61 76 61 69 6c 61 62 6c  MSBuild availabl
4b10: 65 20 61 6e 64 20 74 68 65 20 22 74 65 73 74 5f  e and the "test_
4b20: 79 65 61 72 22 20 6d 61 79 0d 0a 20 20 20 20 20  year" may..     
4b30: 20 20 20 23 20 20 20 20 20 20 20 6e 65 65 64 20     #       need 
4b40: 74 6f 20 62 65 20 61 64 6a 75 73 74 65 64 20 61  to be adjusted a
4b50: 63 63 6f 72 64 69 6e 67 6c 79 20 74 6f 20 61 63  ccordingly to ac
4b60: 74 75 61 6c 6c 79 20 72 75 6e 20 74 68 65 20 74  tually run the t
4b70: 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20  est suite...    
4b80: 20 20 20 20 23 20 20 20 20 20 20 20 52 65 66 65      #       Refe
4b90: 72 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74  r to the comment
4ba0: 73 20 69 6e 20 5b 67 65 74 42 75 69 6c 64 59 65  s in [getBuildYe
4bb0: 61 72 5d 20 66 6f 72 20 6d 6f 72 65 20 69 6e 66  ar] for more inf
4bc0: 6f 72 6d 61 74 69 6f 6e 20 6f 6e 0d 0a 20 20 20  ormation on..   
4bd0: 20 20 20 20 20 23 20 20 20 20 20 20 20 68 6f 77       #       how
4be0: 20 74 6f 20 73 65 74 20 74 68 69 73 20 76 61 72   to set this var
4bf0: 69 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  iable...        
4c00: 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e  #..        set n
4c10: 61 74 69 76 65 20 5b 68 61 73 52 75 6e 74 69 6d  ative [hasRuntim
4c20: 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65 5d 0d  eOption native].
4c30: 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ...        retur
4c40: 6e 20 5b 6a 6f 69 6e 42 75 69 6c 64 44 69 72 65  n [joinBuildDire
4c50: 63 74 6f 72 79 20 24 6e 61 74 69 76 65 20 5b 67  ctory $native [g
4c60: 65 74 42 75 69 6c 64 42 61 73 65 44 69 72 65 63  etBuildBaseDirec
4c70: 74 6f 72 79 5d 20 5c 0d 0a 20 20 20 20 20 20 20  tory] \..       
4c80: 20 20 20 20 20 5b 67 65 74 42 75 69 6c 64 59 65       [getBuildYe
4c90: 61 72 5d 20 5b 67 65 74 42 75 69 6c 64 50 6c 61  ar] [getBuildPla
4ca0: 74 66 6f 72 6d 20 24 6e 61 74 69 76 65 5d 20 5b  tform $native] [
4cb0: 67 65 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72  getBuildConfigur
4cc0: 61 74 69 6f 6e 5d 5d 0d 0a 20 20 20 20 20 20 7d  ation]]..      }
4cd0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
4ce0: 70 72 6f 63 20 67 65 74 52 65 6c 65 61 73 65 56  proc getReleaseV
4cf0: 65 72 73 69 6f 6e 20 7b 7d 20 7b 0d 0a 20 20 20  ersion {} {..   
4d00: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
4d10: 54 45 3a 20 46 69 67 75 72 65 20 6f 75 74 20 74  TE: Figure out t
4d20: 68 65 20 72 65 6c 65 61 73 65 20 76 65 72 73 69  he release versi
4d30: 6f 6e 20 66 6f 72 20 75 73 65 20 77 69 74 68 20  on for use with 
4d40: 74 68 65 20 62 75 69 6c 64 20 64 69 72 65 63 74  the build direct
4d50: 6f 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ory..      #    
4d60: 20 20 20 77 68 65 6e 20 63 68 65 63 6b 69 6e 67     when checking
4d70: 20 66 6f 72 20 61 76 61 69 6c 61 62 6c 65 20 72   for available r
4d80: 65 6c 65 61 73 65 73 2e 0d 0a 20 20 20 20 20 20  eleases...      
4d90: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
4da0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 72 65 6c 65  fo exists ::rele
4db0: 61 73 65 5f 76 65 72 73 69 6f 6e 5d 20 26 26 20  ase_version] && 
4dc0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
4dd0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 72  ring length $::r
4de0: 65 6c 65 61 73 65 5f 76 65 72 73 69 6f 6e 5d 20  elease_version] 
4df0: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
4e00: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4e10: 23 20 4e 4f 54 45 3a 20 54 68 65 20 72 65 6c 65  # NOTE: The rele
4e20: 61 73 65 20 76 65 72 73 69 6f 6e 20 68 61 73 20  ase version has 
4e30: 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b  been overridden;
4e40: 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   therefore, use 
4e50: 69 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  it..        #   
4e60: 20 20 20 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20      verbatim... 
4e70: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4e80: 20 20 72 65 74 75 72 6e 20 24 3a 3a 72 65 6c 65    return $::rele
4e90: 61 73 65 5f 76 65 72 73 69 6f 6e 0d 0a 20 20 20  ase_version..   
4ea0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
4eb0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4ec0: 23 20 4e 4f 54 45 3a 20 4e 6f 20 72 65 6c 65 61  # NOTE: No relea
4ed0: 73 65 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76  se version is av
4ee0: 61 69 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e 20  ailable, return 
4ef0: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e  an empty string.
4f00: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
4f10: 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a       return ""..
4f20: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
4f30: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42  ...    proc getB
4f40: 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 7b 20 66  uildFileName { f
4f50: 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72  ileName {platfor
4f60: 6d 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  m ""} } {..     
4f70: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
4f80: 3a 20 52 65 74 75 72 6e 73 20 74 68 65 20 73 70  : Returns the sp
4f90: 65 63 69 66 69 65 64 20 66 69 6c 65 20 6e 61 6d  ecified file nam
4fa0: 65 20 61 73 20 69 66 20 69 74 20 77 65 72 65 20  e as if it were 
4fb0: 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65 0d 0a  located in the..
4fc0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 75        #       bu
4fd0: 69 6c 64 20 64 69 72 65 63 74 6f 72 79 2c 20 64  ild directory, d
4fe0: 69 73 63 61 72 64 69 6e 67 20 61 6e 79 20 64 69  iscarding any di
4ff0: 72 65 63 74 6f 72 79 20 69 6e 66 6f 72 6d 61 74  rectory informat
5000: 69 6f 6e 20 70 72 65 73 65 6e 74 0d 0a 20 20 20  ion present..   
5010: 20 20 20 23 20 20 20 20 20 20 20 69 6e 20 74 68     #       in th
5020: 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 70  e file name as p
5030: 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20 63  rovided by our c
5040: 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d  aller...      #.
5050: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66  .      return [f
5060: 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c  ile nativename \
5070: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c  ..          [fil
5080: 65 20 6a 6f 69 6e 20 5b 67 65 74 42 75 69 6c 64  e join [getBuild
5090: 44 69 72 65 63 74 6f 72 79 5d 20 24 70 6c 61 74  Directory] $plat
50a0: 66 6f 72 6d 20 5b 66 69 6c 65 20 74 61 69 6c 20  form [file tail 
50b0: 24 66 69 6c 65 4e 61 6d 65 5d 5d 5d 0d 0a 20 20  $fileName]]]..  
50c0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
50d0: 20 67 65 74 45 78 74 65 72 6e 61 6c 44 69 72 65   getExternalDire
50e0: 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20  ctory {} {..    
50f0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
5100: 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72  E: This procedur
5110: 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 64 69  e returns the di
5120: 72 65 63 74 6f 72 79 20 77 68 65 72 65 20 74 68  rectory where th
5130: 65 20 65 78 74 65 72 6e 61 6c 20 62 69 6e 61 72  e external binar
5140: 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
5150: 20 66 69 6c 65 73 20 61 72 65 20 6c 6f 63 61 74   files are locat
5160: 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ed...      #..  
5170: 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65      return [file
5180: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
5190: 65 20 64 69 72 6e 61 6d 65 20 5b 66 69 6c 65 20  e dirname [file 
51a0: 64 69 72 6e 61 6d 65 20 5b 69 6e 66 6f 20 62 69  dirname [info bi
51b0: 6e 61 72 79 5d 5d 5d 5d 0d 0a 20 20 20 20 7d 0d  nary]]]]..    }.
51c0: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
51d0: 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79 20  BinaryDirectory 
51e0: 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
51f0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69       # NOTE: Thi
5200: 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75  s procedure retu
5210: 72 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f 72  rns the director
5220: 79 20 77 68 65 72 65 20 74 68 65 20 74 65 73 74  y where the test
5230: 20 61 70 70 6c 69 63 61 74 69 6f 6e 0d 0a 20 20   application..  
5240: 20 20 20 20 23 20 20 20 20 20 20 20 69 74 73 65      #       itse
5250: 6c 66 20 28 69 2e 65 2e 20 74 68 65 20 45 61 67  lf (i.e. the Eag
5260: 6c 65 20 73 68 65 6c 6c 29 20 69 73 20 6c 6f 63  le shell) is loc
5270: 61 74 65 64 2e 20 20 54 68 69 73 20 77 69 6c 6c  ated.  This will
5280: 20 62 65 20 75 73 65 64 20 61 73 0d 0a 20 20 20   be used as..   
5290: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 64     #       the d
52a0: 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 74  estination for t
52b0: 68 65 20 63 6f 70 69 65 64 20 53 79 73 74 65 6d  he copied System
52c0: 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 6e 61 74  .Data.SQLite nat
52d0: 69 76 65 20 61 6e 64 0d 0a 20 20 20 20 20 20 23  ive and..      #
52e0: 20 20 20 20 20 20 20 6d 61 6e 61 67 65 64 20 61         managed a
52f0: 73 73 65 6d 62 6c 69 65 73 20 28 69 2e 65 2e 20  ssemblies (i.e. 
5300: 62 65 63 61 75 73 65 20 74 68 69 73 20 69 73 20  because this is 
5310: 6f 6e 65 20 6f 66 20 74 68 65 20 66 65 77 20 70  one of the few p
5320: 6c 61 63 65 73 0d 0a 20 20 20 20 20 20 23 20 20  laces..      #  
5330: 20 20 20 20 20 77 68 65 72 65 20 74 68 65 20 43       where the C
5340: 4c 52 20 77 69 6c 6c 20 61 63 74 75 61 6c 6c 79  LR will actually
5350: 20 66 69 6e 64 20 61 6e 64 20 6c 6f 61 64 20 74   find and load t
5360: 68 65 6d 20 70 72 6f 70 65 72 6c 79 29 2e 0d 0a  hem properly)...
5370: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
5380: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
5390: 3a 3a 62 69 6e 61 72 79 5f 64 69 72 65 63 74 6f  ::binary_directo
53a0: 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  ry] && \..      
53b0: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
53c0: 74 68 20 24 3a 3a 62 69 6e 61 72 79 5f 64 69 72  th $::binary_dir
53d0: 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65  ectory] > 0} the
53e0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
53f0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
5400: 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  The location of 
5410: 74 68 65 20 62 69 6e 61 72 79 20 64 69 72 65 63  the binary direc
5420: 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76  tory has been ov
5430: 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20  erridden;..     
5440: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 72 65     #       there
5450: 66 6f 72 65 2c 20 75 73 65 20 69 74 20 76 65 72  fore, use it ver
5460: 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20  batim...        
5470: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
5480: 6e 20 24 3a 3a 62 69 6e 61 72 79 5f 64 69 72 65  n $::binary_dire
5490: 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65  ctory..      } e
54a0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  lse {..        r
54b0: 65 74 75 72 6e 20 5b 69 6e 66 6f 20 62 69 6e 61  eturn [info bina
54c0: 72 79 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  ry]..      }..  
54d0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
54e0: 20 67 65 74 45 78 74 65 72 6e 61 6c 46 69 6c 65   getExternalFile
54f0: 4e 61 6d 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20  Name { fileName 
5500: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
5510: 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75      # NOTE: Retu
5520: 72 6e 73 20 74 68 65 20 73 70 65 63 69 66 69 65  rns the specifie
5530: 64 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 69  d file name as i
5540: 66 20 69 74 20 77 65 72 65 20 6c 6f 63 61 74 65  f it were locate
5550: 64 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20  d in the..      
5560: 23 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72  #       director
5570: 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  y containing the
5580: 20 65 78 74 65 72 6e 61 6c 20 62 69 6e 61 72 69   external binari
5590: 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  es...      #..  
55a0: 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65      return [file
55b0: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
55c0: 65 20 6a 6f 69 6e 20 5b 67 65 74 45 78 74 65 72  e join [getExter
55d0: 6e 61 6c 44 69 72 65 63 74 6f 72 79 5d 20 24 66  nalDirectory] $f
55e0: 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 7d  ileName]]..    }
55f0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
5600: 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
5610: 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74  { fileName {plat
5620: 66 6f 72 6d 20 22 22 7d 20 7d 20 7b 0d 0a 20 20  form ""} } {..  
5630: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
5640: 4f 54 45 3a 20 52 65 74 75 72 6e 73 20 74 68 65  OTE: Returns the
5650: 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20   specified file 
5660: 6e 61 6d 65 20 61 73 20 69 66 20 69 74 20 77 65  name as if it we
5670: 72 65 20 6c 6f 63 61 74 65 64 20 69 6e 20 74 68  re located in th
5680: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
5690: 20 62 69 6e 61 72 79 20 64 69 72 65 63 74 6f 72   binary director
56a0: 79 2c 20 64 69 73 63 61 72 64 69 6e 67 20 61 6e  y, discarding an
56b0: 79 20 64 69 72 65 63 74 6f 72 79 20 69 6e 66 6f  y directory info
56c0: 72 6d 61 74 69 6f 6e 20 70 72 65 73 65 6e 74 0d  rmation present.
56d0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69  .      #       i
56e0: 6e 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20  n the file name 
56f0: 61 73 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f  as provided by o
5700: 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20  ur caller...    
5710: 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72    #..      retur
5720: 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  n [file nativena
5730: 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
5740: 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42  [file join [getB
5750: 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20  inaryDirectory] 
5760: 24 70 6c 61 74 66 6f 72 6d 20 5b 66 69 6c 65 20  $platform [file 
5770: 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d  tail $fileName]]
5780: 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  ]..    }.....   
5790: 20 70 72 6f 63 20 67 65 74 43 6f 72 65 42 69 6e   proc getCoreBin
57a0: 61 72 79 46 69 6c 65 4e 61 6d 65 20 7b 20 7b 70  aryFileName { {p
57b0: 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 73 74 61  latform ""} {sta
57c0: 6e 64 61 72 64 20 66 61 6c 73 65 7d 20 7d 20 7b  ndard false} } {
57d0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
57e0: 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 73   # NOTE: Returns
57f0: 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 20 66   the full path f
5800: 6f 72 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74  or the file cont
5810: 61 69 6e 69 6e 67 20 74 68 65 20 53 51 4c 69 74  aining the SQLit
5820: 65 20 63 6f 72 65 0d 0a 20 20 20 20 20 20 23 20  e core..      # 
5830: 20 20 20 20 20 20 6e 61 74 69 76 65 20 6c 69 62        native lib
5840: 72 61 72 79 20 63 6f 64 65 20 66 6f 72 20 74 68  rary code for th
5850: 69 73 20 70 6c 61 74 66 6f 72 6d 2e 20 20 46 69  is platform.  Fi
5860: 72 73 74 2c 20 63 68 65 63 6b 20 61 6e 64 20 73  rst, check and s
5870: 65 65 20 69 66 0d 0a 20 20 20 20 20 20 23 20 20  ee if..      #  
5880: 20 20 20 20 20 74 68 65 20 53 51 4c 69 74 65 20       the SQLite 
5890: 63 6f 72 65 20 6e 61 74 69 76 65 20 6c 69 62 72  core native libr
58a0: 61 72 79 20 68 61 73 20 61 6c 72 65 61 64 79 20  ary has already 
58b0: 62 65 65 6e 20 6c 6f 61 64 65 64 2e 20 20 4e 65  been loaded.  Ne
58c0: 78 74 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20  xt,..      #    
58d0: 20 20 20 66 61 6c 6c 62 61 63 6b 20 74 6f 20 77     fallback to w
58e0: 68 61 74 20 74 68 65 20 66 75 6c 6c 20 70 61 74  hat the full pat
58f0: 68 20 73 68 6f 75 6c 64 20 62 65 2c 20 62 61 73  h should be, bas
5900: 65 64 20 6f 6e 20 77 68 65 74 68 65 72 20 74 68  ed on whether th
5910: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
5920: 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65   mixed-mode asse
5930: 6d 62 6c 79 20 69 73 20 62 65 69 6e 67 20 75 73  mbly is being us
5940: 65 64 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20  ed and the name 
5950: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 0d 0a  of the current..
5960: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 6c        #       pl
5970: 61 74 66 6f 72 6d 2e 0d 0a 20 20 20 20 20 20 23  atform...      #
5980: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74  ..      if {[cat
5990: 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b  ch {object invok
59a0: 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
59b0: 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
59c0: 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
59d0: 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61  .SQLite.UnsafeNa
59e0: 74 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20  tiveMethods \.. 
59f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5f 53 51               _SQ
5a00: 4c 69 74 65 4e 61 74 69 76 65 4d 6f 64 75 6c 65  LiteNativeModule
5a10: 46 69 6c 65 4e 61 6d 65 7d 20 66 69 6c 65 4e 61  FileName} fileNa
5a20: 6d 65 5d 20 3d 3d 20 30 20 26 26 20 5c 0d 0a 20  me] == 0 && \.. 
5a30: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
5a40: 20 6c 65 6e 67 74 68 20 24 66 69 6c 65 4e 61 6d   length $fileNam
5a50: 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
5a60: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
5a70: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 53     # NOTE: The S
5a80: 51 4c 69 74 65 20 63 6f 72 65 20 6e 61 74 69 76  QLite core nativ
5a90: 65 20 6c 69 62 72 61 72 79 20 68 61 73 20 61 6c  e library has al
5aa0: 72 65 61 64 79 20 62 65 65 6e 20 6c 6f 61 64 65  ready been loade
5ab0: 64 20 76 69 61 0d 0a 20 20 20 20 20 20 20 20 23  d via..        #
5ac0: 20 20 20 20 20 20 20 74 68 65 20 6e 61 74 69 76         the nativ
5ad0: 65 20 6c 69 62 72 61 72 79 20 70 72 65 2d 6c 6f  e library pre-lo
5ae0: 61 64 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68  ader.  Return th
5af0: 61 74 20 66 69 6c 65 20 6e 61 6d 65 20 6e 6f 77  at file name now
5b00: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
5b10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 66 69        return $fi
5b20: 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 0d  leName..      }.
5b30: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61  ...      if {[ha
5b40: 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e  sRuntimeOption n
5b50: 61 74 69 76 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ative]} then {..
5b60: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
5b70: 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72     # NOTE: Retur
5b80: 6e 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65  n the mixed-mode
5b90: 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 20 6e   assembly file n
5ba0: 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ame...        #.
5bb0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
5bc0: 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
5bd0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
5be0: 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42  [file join [getB
5bf0: 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20  inaryDirectory] 
5c00: 24 70 6c 61 74 66 6f 72 6d 20 53 79 73 74 65 6d  $platform System
5c10: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
5c20: 5d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ]]..      } else
5c30: 69 66 20 7b 24 73 74 61 6e 64 61 72 64 7d 20 74  if {$standard} t
5c40: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
5c50: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
5c60: 3a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 74  : Return the nat
5c70: 69 76 65 2d 6f 6e 6c 79 20 73 74 61 6e 64 61 72  ive-only standar
5c80: 64 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79  d SQLite library
5c90: 20 66 69 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20 20   file name...   
5ca0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
5cb0: 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74  return [file nat
5cc0: 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20  ivename \..     
5cd0: 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69         [file joi
5ce0: 6e 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65  n [getBinaryDire
5cf0: 63 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d  ctory] $platform
5d00: 20 73 71 6c 69 74 65 33 2e 64 6c 6c 5d 5d 0d 0a   sqlite3.dll]]..
5d10: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
5d20: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
5d30: 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72     # NOTE: Retur
5d40: 6e 20 74 68 65 20 6e 61 74 69 76 65 2d 6f 6e 6c  n the native-onl
5d50: 79 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62  y interop assemb
5d60: 6c 79 20 66 69 6c 65 20 6e 61 6d 65 2e 0d 0a 20  ly file name... 
5d70: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
5d80: 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e    return [file n
5d90: 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20  ativename \..   
5da0: 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a           [file j
5db0: 6f 69 6e 20 5b 67 65 74 42 69 6e 61 72 79 44 69  oin [getBinaryDi
5dc0: 72 65 63 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f  rectory] $platfo
5dd0: 72 6d 20 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f  rm SQLite.Intero
5de0: 70 2e 64 6c 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d  p.dll]]..      }
5df0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
5e00: 70 72 6f 63 20 67 65 74 43 6f 6d 6d 6f 6e 44 69  proc getCommonDi
5e10: 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20  rectory {} {..  
5e20: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
5e30: 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64  OTE: This proced
5e40: 75 72 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ure returns the 
5e50: 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65 20  directory where 
5e60: 74 68 65 20 74 65 73 74 20 73 63 72 69 70 74 73  the test scripts
5e70: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
5e80: 73 68 6f 75 6c 64 20 62 65 20 6c 6f 63 61 74 65  should be locate
5e90: 64 2e 20 20 42 79 20 64 65 66 61 75 6c 74 2c 20  d.  By default, 
5ea0: 74 68 69 73 20 6a 75 73 74 20 72 65 74 75 72 6e  this just return
5eb0: 73 20 74 68 65 20 45 61 67 6c 65 0d 0a 20 20 20  s the Eagle..   
5ec0: 20 20 20 23 20 20 20 20 20 20 20 62 69 6e 61 72     #       binar
5ed0: 79 20 64 69 72 65 63 74 6f 72 79 2e 0d 0a 20 20  y directory...  
5ee0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
5ef0: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
5f00: 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79  common_directory
5f10: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
5f20: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
5f30: 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63   $::common_direc
5f40: 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20  tory] > 0} then 
5f50: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
5f60: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
5f70: 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  e location of th
5f80: 65 20 63 6f 6d 6d 6f 6e 20 64 69 72 65 63 74 6f  e common directo
5f90: 72 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 3b  ry has been set;
5fa0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
5fb0: 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65    therefore, use
5fc0: 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d   it...        #.
5fd0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
5fe0: 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74  $::common_direct
5ff0: 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  ory..      } els
6000: 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74  eif {[info exist
6010: 73 20 3a 3a 76 65 6e 64 6f 72 5f 64 69 72 65 63  s ::vendor_direc
6020: 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20  tory] && \..    
6030: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
6040: 6e 67 74 68 20 24 3a 3a 76 65 6e 64 6f 72 5f 64  ngth $::vendor_d
6050: 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74  irectory] > 0} t
6060: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
6070: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
6080: 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f  : The location o
6090: 66 20 74 68 65 20 76 65 6e 64 6f 72 20 64 69 72  f the vendor dir
60a0: 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
60b0: 73 65 74 3b 0d 0a 20 20 20 20 20 20 20 20 23 20  set;..        # 
60c0: 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c        therefore,
60d0: 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20   use it...      
60e0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
60f0: 75 72 6e 20 24 3a 3a 76 65 6e 64 6f 72 5f 64 69  urn $::vendor_di
6100: 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d  rectory..      }
6110: 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65   elseif {[info e
6120: 78 69 73 74 73 20 3a 3a 74 63 6c 5f 6c 69 62 72  xists ::tcl_libr
6130: 61 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ary] && \..     
6140: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
6150: 67 74 68 20 24 3a 3a 74 63 6c 5f 6c 69 62 72 61  gth $::tcl_libra
6160: 72 79 5d 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20  ry] > 0 && \..  
6170: 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 69 73          [file is
6180: 64 69 72 65 63 74 6f 72 79 20 24 3a 3a 74 63 6c  directory $::tcl
6190: 5f 6c 69 62 72 61 72 79 5d 7d 20 74 68 65 6e 20  _library]} then 
61a0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
61b0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
61c0: 65 20 76 61 72 69 61 62 6c 65 20 77 69 74 68 20  e variable with 
61d0: 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  the location of 
61e0: 74 68 65 20 73 63 72 69 70 74 20 6c 69 62 72 61  the script libra
61f0: 72 79 20 69 73 0d 0a 20 20 20 20 20 20 20 20 23  ry is..        #
6200: 20 20 20 20 20 20 20 73 65 74 20 61 6e 64 20 61         set and a
6210: 70 70 65 61 72 73 20 74 6f 20 62 65 20 61 20 72  ppears to be a r
6220: 65 61 6c 20 64 69 72 65 63 74 6f 72 79 20 28 69  eal directory (i
6230: 2e 65 2e 20 6e 6f 74 20 65 6d 62 65 64 64 65 64  .e. not embedded
6240: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
6250: 20 20 77 69 74 68 69 6e 20 61 20 66 69 6c 65 29    within a file)
6260: 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65  ; therefore, use
6270: 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d   it...        #.
6280: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
6290: 24 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79 0d 0a  $::tcl_library..
62a0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
62b0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
62c0: 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 6c 6c 62     # NOTE: Fallb
62d0: 61 63 6b 20 74 6f 20 74 68 65 20 64 69 72 65 63  ack to the direc
62e0: 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20  tory containing 
62f0: 74 68 65 20 65 78 65 63 75 74 61 62 6c 65 2e 0d  the executable..
6300: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
6310: 20 20 20 20 72 65 74 75 72 6e 20 5b 69 6e 66 6f      return [info
6320: 20 62 69 6e 61 72 79 5d 0d 0a 20 20 20 20 20 20   binary]..      
6330: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
6340: 20 70 72 6f 63 20 67 65 74 44 61 74 61 62 61 73   proc getDatabas
6350: 65 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d  eDirectory {} {.
6360: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
6370: 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f  # NOTE: This pro
6380: 63 65 64 75 72 65 20 72 65 74 75 72 6e 73 20 74  cedure returns t
6390: 68 65 20 64 69 72 65 63 74 6f 72 79 20 77 68 65  he directory whe
63a0: 72 65 20 74 68 65 20 74 65 73 74 20 64 61 74 61  re the test data
63b0: 62 61 73 65 73 0d 0a 20 20 20 20 20 20 23 20 20  bases..      #  
63c0: 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 6c       should be l
63d0: 6f 63 61 74 65 64 2e 20 20 42 79 20 64 65 66 61  ocated.  By defa
63e0: 75 6c 74 2c 20 74 68 69 73 20 6a 75 73 74 20 75  ult, this just u
63f0: 73 65 73 20 74 68 65 20 74 65 6d 70 6f 72 61 72  ses the temporar
6400: 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
6410: 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 66 69   directory confi
6420: 67 75 72 65 64 20 66 6f 72 20 74 68 69 73 20 73  gured for this s
6430: 79 73 74 65 6d 2e 0d 0a 20 20 20 20 20 20 23 0d  ystem...      #.
6440: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
6450: 20 65 78 69 73 74 73 20 3a 3a 64 61 74 61 62 61   exists ::databa
6460: 73 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26  se_directory] &&
6470: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
6480: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
6490: 64 61 74 61 62 61 73 65 5f 64 69 72 65 63 74 6f  database_directo
64a0: 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ry] > 0} then {.
64b0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
64c0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
64d0: 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  location of the 
64e0: 64 61 74 61 62 61 73 65 20 64 69 72 65 63 74 6f  database directo
64f0: 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  ry has been over
6500: 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20  ridden;..       
6510: 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f   #       therefo
6520: 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20  re, use it...   
6530: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
6540: 72 65 74 75 72 6e 20 24 3a 3a 64 61 74 61 62 61  return $::databa
6550: 73 65 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20  se_directory..  
6560: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69      } elseif {[i
6570: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 73 63 72  nfo exists ::scr
6580: 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79 5d 20  atch_directory] 
6590: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
65a0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
65b0: 3a 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63 74  ::scratch_direct
65c0: 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ory] > 0} then {
65d0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
65e0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
65f0: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
6600: 20 73 63 72 61 74 63 68 20 64 69 72 65 63 74 6f   scratch directo
6610: 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  ry has been over
6620: 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20  ridden;..       
6630: 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f   #       therefo
6640: 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20  re, use it...   
6650: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
6660: 72 65 74 75 72 6e 20 24 3a 3a 73 63 72 61 74 63  return $::scratc
6670: 68 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  h_directory..   
6680: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
6690: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 67 65 74       return [get
66a0: 54 65 6d 70 6f 72 61 72 79 50 61 74 68 5d 0d 0a  TemporaryPath]..
66b0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
66c0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 54  ...    proc getT
66d0: 65 6d 70 6f 72 61 72 79 44 69 72 65 63 74 6f 72  emporaryDirector
66e0: 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  y {} {..      #.
66f0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
6700: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65  his procedure re
6710: 74 75 72 6e 73 20 74 68 65 20 64 69 72 65 63 74  turns the direct
6720: 6f 72 79 20 77 68 65 72 65 20 74 68 65 20 74 65  ory where the te
6730: 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 0d 0a 20  mporary files.. 
6740: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 68 6f       #       sho
6750: 75 6c 64 20 62 65 20 6c 6f 63 61 74 65 64 2e 20  uld be located. 
6760: 20 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69   By default, thi
6770: 73 20 6a 75 73 74 20 75 73 65 73 20 74 68 65 20  s just uses the 
6780: 74 65 6d 70 6f 72 61 72 79 0d 0a 20 20 20 20 20  temporary..     
6790: 20 23 20 20 20 20 20 20 20 64 69 72 65 63 74 6f   #       directo
67a0: 72 79 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  ry configured fo
67b0: 72 20 74 68 69 73 20 73 79 73 74 65 6d 2e 0d 0a  r this system...
67c0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
67d0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
67e0: 3a 3a 74 65 6d 70 6f 72 61 72 79 5f 64 69 72 65  ::temporary_dire
67f0: 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20  ctory] && \..   
6800: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
6810: 65 6e 67 74 68 20 24 3a 3a 74 65 6d 70 6f 72 61  ength $::tempora
6820: 72 79 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20  ry_directory] > 
6830: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
6840: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
6850: 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69  NOTE: The locati
6860: 6f 6e 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72  on of the tempor
6870: 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 68 61  ary directory ha
6880: 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65  s been overridde
6890: 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  n;..        #   
68a0: 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75      therefore, u
68b0: 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20  se it...        
68c0: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
68d0: 6e 20 24 3a 3a 74 65 6d 70 6f 72 61 72 79 5f 64  n $::temporary_d
68e0: 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20  irectory..      
68f0: 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20  } elseif {[info 
6900: 65 78 69 73 74 73 20 3a 3a 73 63 72 61 74 63 68  exists ::scratch
6910: 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c  _directory] && \
6920: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
6930: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 73 63  ing length $::sc
6940: 72 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79 5d  ratch_directory]
6950: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
6960: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
6970: 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63   # NOTE: The loc
6980: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 63 72  ation of the scr
6990: 61 74 63 68 20 64 69 72 65 63 74 6f 72 79 20 68  atch directory h
69a0: 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64  as been overridd
69b0: 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20  en;..        #  
69c0: 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20       therefore, 
69d0: 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20  use it...       
69e0: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
69f0: 72 6e 20 24 3a 3a 73 63 72 61 74 63 68 5f 64 69  rn $::scratch_di
6a00: 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d  rectory..      }
6a10: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
6a20: 20 72 65 74 75 72 6e 20 5b 67 65 74 54 65 6d 70   return [getTemp
6a30: 6f 72 61 72 79 50 61 74 68 5d 0d 0a 20 20 20 20  oraryPath]..    
6a40: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
6a50: 20 20 20 70 72 6f 63 20 67 65 74 54 65 73 74 4f     proc getTestO
6a60: 76 65 72 72 69 64 65 73 50 72 65 61 6d 62 6c 65  verridesPreamble
6a70: 20 7b 20 7b 65 78 74 72 61 56 61 72 4e 61 6d 65   { {extraVarName
6a80: 73 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  s ""} } {..     
6a90: 20 73 65 74 20 76 61 72 4e 61 6d 65 73 20 5b 6c   set varNames [l
6aa0: 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  ist]....      #.
6ab0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
6ac0: 66 20 61 76 61 69 6c 61 62 6c 65 2c 20 73 74 61  f available, sta
6ad0: 72 74 20 77 69 74 68 20 74 68 65 20 6d 61 73 74  rt with the mast
6ae0: 65 72 20 6c 69 73 74 20 6f 66 20 74 65 73 74 20  er list of test 
6af0: 6f 76 65 72 72 69 64 65 0d 0a 20 20 20 20 20 20  override..      
6b00: 23 20 20 20 20 20 20 20 76 61 72 69 61 62 6c 65  #       variable
6b10: 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s...      #..   
6b20: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
6b30: 73 74 73 20 3a 3a 74 65 73 74 5f 6f 76 65 72 72  sts ::test_overr
6b40: 69 64 65 73 5d 20 26 26 20 5c 0d 0a 20 20 20 20  ides] && \..    
6b50: 20 20 20 20 20 20 5b 6c 6c 65 6e 67 74 68 20 24        [llength $
6b60: 3a 3a 74 65 73 74 5f 6f 76 65 72 72 69 64 65 73  ::test_overrides
6b70: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
6b80: 20 20 20 20 20 20 20 65 76 61 6c 20 6c 61 70 70         eval lapp
6b90: 65 6e 64 20 76 61 72 4e 61 6d 65 73 20 24 3a 3a  end varNames $::
6ba0: 74 65 73 74 5f 6f 76 65 72 72 69 64 65 73 0d 0a  test_overrides..
6bb0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
6bc0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
6bd0: 3a 20 49 66 20 72 65 71 75 65 73 74 65 64 20 62  : If requested b
6be0: 79 20 6f 75 72 20 63 61 6c 6c 65 72 2c 20 61 64  y our caller, ad
6bf0: 64 20 61 6e 79 20 61 64 64 69 74 69 6f 6e 61 6c  d any additional
6c00: 20 76 61 72 69 61 62 6c 65 0d 0a 20 20 20 20 20   variable..     
6c10: 20 23 20 20 20 20 20 20 20 6e 61 6d 65 73 20 74   #       names t
6c20: 6f 20 63 6f 70 79 20 6e 6f 77 2e 0d 0a 20 20 20  o copy now...   
6c30: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
6c40: 5b 6c 6c 65 6e 67 74 68 20 24 65 78 74 72 61 56  [llength $extraV
6c50: 61 72 4e 61 6d 65 73 5d 20 3e 20 30 7d 20 74 68  arNames] > 0} th
6c60: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 65 76  en {..        ev
6c70: 61 6c 20 6c 61 70 70 65 6e 64 20 76 61 72 4e 61  al lappend varNa
6c80: 6d 65 73 20 24 65 78 74 72 61 56 61 72 4e 61 6d  mes $extraVarNam
6c90: 65 73 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  es..      }.... 
6ca0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
6cb0: 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20  NOTE: Build the 
6cc0: 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20  script fragment 
6cd0: 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
6ce0: 79 20 70 72 6f 63 65 73 73 69 6e 67 20 65 61 63  y processing eac
6cf0: 68 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  h..      #      
6d00: 20 76 61 72 69 61 62 6c 65 20 6e 61 6d 65 20 61   variable name a
6d10: 6e 64 20 61 64 64 69 6e 67 20 74 68 65 20 6e 65  nd adding the ne
6d20: 63 65 63 65 73 73 61 72 79 20 73 63 72 69 70 74  cecessary script
6d30: 20 66 72 61 67 6d 65 6e 74 73 20 66 6f 72 0d 0a   fragments for..
6d40: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65 61        #       ea
6d50: 63 68 20 6f 6e 65 2e 0d 0a 20 20 20 20 20 20 23  ch one...      #
6d60: 0d 0a 20 20 20 20 20 20 73 65 74 20 72 65 73 75  ..      set resu
6d70: 6c 74 20 22 22 0d 0a 0d 0a 20 20 20 20 20 20 66  lt ""....      f
6d80: 6f 72 65 61 63 68 20 76 61 72 4e 61 6d 65 20 24  oreach varName $
6d90: 76 61 72 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  varNames {..    
6da0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
6db0: 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65   NOTE: Build the
6dc0: 20 71 75 61 6c 69 66 69 65 64 20 67 6c 6f 62 61   qualified globa
6dd0: 6c 20 76 61 72 69 61 62 6c 65 20 6e 61 6d 65 2e  l variable name.
6de0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
6df0: 20 20 20 20 20 73 65 74 20 66 75 6c 6c 56 61 72       set fullVar
6e00: 4e 61 6d 65 20 5b 61 70 70 65 6e 64 41 72 67 73  Name [appendArgs
6e10: 20 3a 3a 20 24 76 61 72 4e 61 6d 65 5d 0d 0a 0d   :: $varName]...
6e20: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
6e30: 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73      # NOTE: Does
6e40: 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 65 78   the variable ex
6e50: 69 73 74 20 69 6e 20 74 68 69 73 20 69 6e 74 65  ist in this inte
6e60: 72 70 72 65 74 65 72 20 63 6f 6e 74 65 78 74 3f  rpreter context?
6e70: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
6e80: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
6e90: 78 69 73 74 73 20 24 66 75 6c 6c 56 61 72 4e 61  xists $fullVarNa
6ea0: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
6eb0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
6ec0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 70 70 65      # NOTE: Appe
6ed0: 6e 64 20 61 20 73 63 72 69 70 74 20 66 72 61 67  nd a script frag
6ee0: 6d 65 6e 74 20 74 6f 20 74 68 65 20 72 65 73 75  ment to the resu
6ef0: 6c 74 20 74 68 61 74 20 77 69 6c 6c 20 63 6f 72  lt that will cor
6f00: 72 65 63 74 6c 79 0d 0a 20 20 20 20 20 20 20 20  rectly..        
6f10: 20 20 23 20 20 20 20 20 20 20 63 6f 70 79 20 61    #       copy a
6f20: 6e 79 20 63 6f 6e 74 61 69 6e 65 64 20 76 61 6c  ny contained val
6f30: 75 65 20 74 6f 20 61 6e 6f 74 68 65 72 20 69 6e  ue to another in
6f40: 74 65 72 70 72 65 74 65 72 20 63 6f 6e 74 65 78  terpreter contex
6f50: 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  t...          #.
6f60: 0a 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e  .          appen
6f70: 64 20 72 65 73 75 6c 74 20 5c 6e 20 22 73 65 74  d result \n "set
6f80: 20 22 20 24 66 75 6c 6c 56 61 72 4e 61 6d 65 20   " $fullVarName 
6f90: 22 20 5c 7b 22 20 5b 73 65 74 20 24 66 75 6c 6c  " \{" [set $full
6fa0: 56 61 72 4e 61 6d 65 5d 20 5c 7d 0d 0a 20 20 20  VarName] \}..   
6fb0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
6fc0: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
6fd0: 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65    # NOTE: If the
6fe0: 20 72 65 73 75 6c 74 20 63 6f 6e 74 61 69 6e 73   result contains
6ff0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 63 72   one or more scr
7000: 69 70 74 20 66 72 61 67 6d 65 6e 74 73 2c 20 61  ipt fragments, a
7010: 70 70 65 6e 64 20 61 0d 0a 20 20 20 20 20 20 23  ppend a..      #
7020: 20 20 20 20 20 20 20 6e 65 77 6c 69 6e 65 2e 0d         newline..
7030: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
7040: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
7050: 74 68 20 24 72 65 73 75 6c 74 5d 20 3e 20 30 7d  th $result] > 0}
7060: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
7070: 20 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 5c   append result \
7080: 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  n..      }....  
7090: 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73 75      return $resu
70a0: 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  lt..    }.....  
70b0: 20 20 70 72 6f 63 20 67 65 74 41 70 70 44 6f 6d    proc getAppDom
70c0: 61 69 6e 50 72 65 61 6d 62 6c 65 20 7b 20 7b 70  ainPreamble { {p
70d0: 72 65 66 69 78 20 22 22 7d 20 7b 73 75 66 66 69  refix ""} {suffi
70e0: 78 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  x ""} } {..     
70f0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
7100: 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  : This procedure
7110: 20 72 65 74 75 72 6e 73 20 61 20 74 65 73 74 20   returns a test 
7120: 73 65 74 75 70 20 73 63 72 69 70 74 20 66 72 61  setup script fra
7130: 67 6d 65 6e 74 20 73 75 69 74 61 62 6c 65 20 66  gment suitable f
7140: 6f 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  or..      #     
7150: 20 20 65 76 61 6c 75 61 74 69 6f 6e 20 62 79 20    evaluation by 
7160: 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72 20 63  an interpreter c
7170: 72 65 61 74 65 64 20 69 6e 20 61 6e 20 69 73 6f  reated in an iso
7180: 6c 61 74 65 64 20 61 70 70 6c 69 63 61 74 69 6f  lated applicatio
7190: 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  n..      #      
71a0: 20 64 6f 6d 61 69 6e 2e 20 20 54 68 65 20 73 63   domain.  The sc
71b0: 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20 62 65  ript fragment be
71c0: 69 6e 67 20 72 65 74 75 72 6e 65 64 20 77 69 6c  ing returned wil
71d0: 6c 20 62 65 20 73 75 72 72 6f 75 6e 64 65 64 20  l be surrounded 
71e0: 62 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  by..      #     
71f0: 20 20 74 68 65 20 70 72 65 66 69 78 20 61 6e 64    the prefix and
7200: 20 73 75 66 66 69 78 20 22 73 63 72 69 70 74 20   suffix "script 
7210: 66 72 61 67 6d 65 6e 74 73 22 20 73 70 65 63 69  fragments" speci
7220: 66 69 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c  fied by our call
7230: 65 72 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20  er,..      #    
7240: 20 20 20 69 66 20 61 6e 79 2e 20 20 54 68 65 20     if any.  The 
7250: 65 6e 74 69 72 65 20 73 63 72 69 70 74 20 62 65  entire script be
7260: 69 6e 67 20 72 65 74 75 72 6e 65 64 20 77 69 6c  ing returned wil
7270: 6c 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64  l be substituted
7280: 20 76 69 61 0d 0a 20 20 20 20 20 20 23 20 20 20   via..      #   
7290: 20 20 20 20 5b 73 75 62 73 74 5d 2c 20 69 6e 20      [subst], in 
72a0: 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f  the context of o
72b0: 75 72 20 63 61 6c 6c 65 72 2c 20 62 65 66 6f 72  ur caller, befor
72c0: 65 20 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64  e being returned
72d0: 2e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  ...      #      
72e0: 20 54 68 69 73 20 73 74 65 70 20 69 73 20 6e 65   This step is ne
72f0: 63 65 73 73 61 72 79 20 73 6f 20 74 68 61 74 20  cessary so that 
7300: 73 6f 6d 65 20 6c 69 6d 69 74 65 64 20 63 6f 6e  some limited con
7310: 74 65 78 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  text information
7320: 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  ,..      #      
7330: 20 70 72 69 6d 61 72 69 6c 79 20 72 65 6c 61 74   primarily relat
7340: 65 64 20 74 6f 20 74 68 65 20 74 65 73 74 69 6e  ed to the testin
7350: 67 20 64 69 72 65 63 74 6f 72 69 65 73 2c 20 63  g directories, c
7360: 61 6e 20 62 65 20 74 72 61 6e 73 66 65 72 72 65  an be transferre
7370: 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
7380: 20 74 6f 20 74 68 65 20 69 6e 74 65 72 70 72 65   to the interpre
7390: 74 65 72 20 69 6e 20 74 68 65 20 69 73 6f 6c 61  ter in the isola
73a0: 74 65 64 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  ted application 
73b0: 64 6f 6d 61 69 6e 2c 20 6d 61 6b 69 6e 67 20 69  domain, making i
73c0: 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  t..      #      
73d0: 20 61 62 6c 65 20 74 6f 20 73 75 63 63 65 73 73   able to success
73e0: 66 75 6c 6c 79 20 72 75 6e 20 74 65 73 74 73 20  fully run tests 
73f0: 74 68 61 74 20 72 65 71 75 69 72 65 20 6f 6e 65  that require one
7400: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 0d   or more of the.
7410: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66  .      #       f
7420: 69 6c 65 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74  iles in one of t
7430: 68 65 20 74 65 73 74 69 6e 67 20 64 69 72 65 63  he testing direc
7440: 74 6f 72 69 65 73 2e 20 20 43 61 6c 6c 65 72 73  tories.  Callers
7450: 20 73 68 6f 75 6c 64 20 6b 65 65 70 20 69 6e 0d   should keep in.
7460: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6d  .      #       m
7470: 69 6e 64 20 74 68 61 74 20 74 68 65 20 74 65 73  ind that the tes
7480: 74 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e  t script fragmen
7490: 74 20 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64  t being returned
74a0: 20 63 61 6e 6e 6f 74 20 72 65 6c 79 20 6f 6e 0d   cannot rely on.
74b0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
74c0: 6e 79 20 73 63 72 69 70 74 20 6c 69 62 72 61 72  ny script librar
74d0: 79 20 70 72 6f 63 65 64 75 72 65 73 20 74 68 61  y procedures tha
74e0: 74 20 61 72 65 20 6e 6f 74 20 70 72 6f 76 69 64  t are not provid
74f0: 65 64 20 62 79 20 74 68 65 20 45 61 67 6c 65 0d  ed by the Eagle.
7500: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6c  .      #       l
7510: 69 62 72 61 72 79 20 70 61 63 6b 61 67 65 20 28  ibrary package (
7520: 69 2e 65 2e 20 22 69 6e 69 74 2e 65 61 67 6c 65  i.e. "init.eagle
7530: 22 29 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  "), including th
7540: 6f 73 65 20 70 72 6f 76 69 64 65 64 20 62 79 0d  ose provided by.
7550: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
7560: 68 65 20 45 61 67 6c 65 20 74 65 73 74 20 70 61  he Eagle test pa
7570: 63 6b 61 67 65 2c 20 75 6e 6c 65 73 73 20 74 68  ckage, unless th
7580: 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e  e file containin
7590: 67 20 74 68 65 6d 20 69 73 20 6c 6f 61 64 65 64  g them is loaded
75a0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
75b0: 6d 61 6e 75 61 6c 6c 79 20 76 69 61 20 73 6f 6d  manually via som
75c0: 65 20 6f 74 68 65 72 20 6d 65 63 68 61 6e 69 73  e other mechanis
75d0: 6d 20 28 65 2e 67 2e 20 62 79 20 69 6e 63 6c 75  m (e.g. by inclu
75e0: 64 69 6e 67 20 61 70 70 72 6f 70 72 69 61 74 65  ding appropriate
75f0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
7600: 5b 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65  [package require
7610: 5d 20 6f 72 20 5b 73 6f 75 72 63 65 5d 20 63 6f  ] or [source] co
7620: 6d 6d 61 6e 64 73 20 69 6e 20 74 68 65 20 70 72  mmands in the pr
7630: 65 66 69 78 20 6f 72 20 73 75 66 66 69 78 0d 0a  efix or suffix..
7640: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 63        #       sc
7650: 72 69 70 74 20 66 72 61 67 6d 65 6e 74 73 29 2e  ript fragments).
7660: 20 20 41 6c 73 6f 2c 20 61 6c 6c 20 76 61 72 69    Also, all vari
7670: 61 62 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20  able references 
7680: 61 6e 64 20 61 6c 6c 20 6e 65 73 74 65 64 0d 0a  and all nested..
7690: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
76a0: 6d 6d 61 6e 64 73 20 28 69 2e 65 2e 20 74 68 6f  mmands (i.e. tho
76b0: 73 65 20 69 6e 20 73 71 75 61 72 65 20 62 72 61  se in square bra
76c0: 63 6b 65 74 73 29 20 63 6f 6e 74 61 69 6e 65 64  ckets) contained
76d0: 20 69 6e 20 74 68 65 20 66 69 6e 61 6c 0d 0a 20   in the final.. 
76e0: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 63 72       #       scr
76f0: 69 70 74 20 66 72 61 67 6d 65 6e 74 20 77 69 6c  ipt fragment wil
7700: 6c 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 65  l end up being e
7710: 76 61 6c 75 61 74 65 64 20 69 6e 20 74 68 65 20  valuated in the 
7720: 63 6f 6e 74 65 78 74 20 6f 66 20 74 68 65 0d 0a  context of the..
7730: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61        #       ca
7740: 6c 6c 69 6e 67 20 69 6e 74 65 72 70 72 65 74 65  lling interprete
7750: 72 20 61 6e 64 20 6e 6f 74 20 74 68 65 20 74 61  r and not the ta
7760: 72 67 65 74 20 69 6e 74 65 72 70 72 65 74 65 72  rget interpreter
7770: 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 0d   created in the.
7780: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69  .      #       i
7790: 73 6f 6c 61 74 65 64 20 61 70 70 6c 69 63 61 74  solated applicat
77a0: 69 6f 6e 20 64 6f 6d 61 69 6e 20 75 6e 6c 65 73  ion domain unles
77b0: 73 20 74 68 65 20 64 6f 6c 6c 61 72 20 73 69 67  s the dollar sig
77c0: 6e 73 20 61 6e 64 2f 6f 72 20 73 71 75 61 72 65  ns and/or square
77d0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
77e0: 62 72 61 63 6b 65 74 73 20 61 72 65 20 73 70 65  brackets are spe
77f0: 63 69 61 6c 6c 79 20 71 75 6f 74 65 64 20 77 69  cially quoted wi
7800: 74 68 20 62 61 63 6b 73 6c 61 73 68 65 73 2e 0d  th backslashes..
7810: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
7820: 72 65 74 75 72 6e 20 5b 75 70 6c 65 76 65 6c 20  return [uplevel 
7830: 31 20 5b 6c 69 73 74 20 73 75 62 73 74 20 5b 61  1 [list subst [a
7840: 70 70 65 6e 64 41 72 67 73 20 24 70 72 65 66 69  ppendArgs $prefi
7850: 78 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  x {..        if 
7860: 7b 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74 69  {[hasRuntimeOpti
7870: 6f 6e 20 6e 61 74 69 76 65 5d 7d 20 74 68 65 6e  on native]} then
7880: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62   {..          ob
7890: 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49 6e 74 65  ject invoke Inte
78a0: 72 70 72 65 74 65 72 2e 47 65 74 41 63 74 69 76  rpreter.GetActiv
78b0: 65 20 41 64 64 52 75 6e 74 69 6d 65 4f 70 74 69  e AddRuntimeOpti
78c0: 6f 6e 20 6e 61 74 69 76 65 0d 0a 20 20 20 20 20  on native..     
78d0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 5b 67     }..      } [g
78e0: 65 74 54 65 73 74 4f 76 65 72 72 69 64 65 73 50  etTestOverridesP
78f0: 72 65 61 6d 62 6c 65 20 5b 6c 69 73 74 20 70 61  reamble [list pa
7900: 74 68 20 74 65 73 74 5f 63 68 61 6e 6e 65 6c 5d  th test_channel]
7910: 5d 20 24 73 75 66 66 69 78 5d 5d 5d 0d 0a 20 20  ] $suffix]]]..  
7920: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
7930: 20 74 72 79 43 6f 70 79 45 78 74 65 72 6e 61 6c   tryCopyExternal
7940: 46 69 6c 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20  File { fileName 
7950: 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 6e  {platform ""} {n
7960: 65 77 46 69 6c 65 4e 61 6d 65 20 22 22 7d 20 7d  ewFileName ""} }
7970: 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 73 6f   {..      set so
7980: 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5b 67 65  urceFileName [ge
7990: 74 45 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d  tExternalFileNam
79a0: 65 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a  e $fileName]....
79b0: 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65        if {![file
79c0: 20 65 78 69 73 74 73 20 24 73 6f 75 72 63 65 46   exists $sourceF
79d0: 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
79e0: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
79f0: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
7a00: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
7a10: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
7a20: 20 73 6b 69 70 70 65 64 20 63 6f 70 79 69 6e 67   skipped copying
7a30: 20 65 78 74 65 72 6e 61 6c 20 66 69 6c 65 20 5c   external file \
7a40: 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61  "" $sourceFileNa
7a50: 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
7a60: 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e    "\", it does n
7a70: 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 0d 0a  ot exist\n"]....
7a80: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a          return..
7a90: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
7aa0: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
7ab0: 67 74 68 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65  gth $newFileName
7ac0: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
7ad0: 20 20 20 20 20 20 20 73 65 74 20 74 61 72 67 65         set targe
7ae0: 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69  tFileName [getBi
7af0: 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 6e 65  naryFileName $ne
7b00: 77 46 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66  wFileName $platf
7b10: 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  orm]..      } el
7b20: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  se {..        se
7b30: 74 20 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65  t targetFileName
7b40: 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
7b50: 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70  ame $fileName $p
7b60: 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20 20  latform]..      
7b70: 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 74  }....      set t
7b80: 61 72 67 65 74 44 69 72 65 63 74 6f 72 79 20 5b  argetDirectory [
7b90: 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 74 61  file dirname $ta
7ba0: 72 67 65 74 46 69 6c 65 4e 61 6d 65 5d 0d 0a 0d  rgetFileName]...
7bb0: 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63  .      if {[catc
7bc0: 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
7bd0: 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78     if {![file ex
7be0: 69 73 74 73 20 24 74 61 72 67 65 74 44 69 72 65  ists $targetDire
7bf0: 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ctory]} then {..
7c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c10: 66 69 6c 65 20 6d 6b 64 69 72 20 24 74 61 72 67  file mkdir $targ
7c20: 65 74 44 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  etDirectory..   
7c30: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
7c40: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
7c50: 20 63 6f 70 79 20 2d 66 6f 72 63 65 20 24 73 6f   copy -force $so
7c60: 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 24 74 61  urceFileName $ta
7c70: 72 67 65 74 46 69 6c 65 4e 61 6d 65 7d 5d 20 3d  rgetFileName}] =
7c80: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
7c90: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
7ca0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
7cb0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
7cc0: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 69        "---- copi
7cd0: 65 64 20 65 78 74 65 72 6e 61 6c 20 66 69 6c 65  ed external file
7ce0: 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63   from \"" $sourc
7cf0: 65 46 69 6c 65 4e 61 6d 65 20 22 5c 22 20 74 6f  eFileName "\" to
7d00: 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
7d10: 20 20 20 20 24 74 61 72 67 65 74 46 69 6c 65 4e      $targetFileN
7d20: 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  ame \"\n]..     
7d30: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
7d40: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
7d50: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
7d60: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
7d70: 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64      "---- failed
7d80: 20 74 6f 20 63 6f 70 79 20 65 78 74 65 72 6e 61   to copy externa
7d90: 6c 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20  l file from \"" 
7da0: 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20  $sourceFileName 
7db0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
7dc0: 5c 22 20 74 6f 20 5c 22 22 20 24 74 61 72 67 65  \" to \"" $targe
7dd0: 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d  tFileName \"\n].
7de0: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
7df0: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79  ....    proc try
7e00: 43 6f 70 79 42 69 6e 61 72 79 46 69 6c 65 20 7b  CopyBinaryFile {
7e10: 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66   fileName {platf
7e20: 6f 72 6d 20 22 22 7d 20 7b 6e 65 77 46 69 6c 65  orm ""} {newFile
7e30: 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20  Name ""} } {..  
7e40: 20 20 20 20 73 65 74 20 73 6f 75 72 63 65 46 69      set sourceFi
7e50: 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72  leName [getBinar
7e60: 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e  yFileName $fileN
7e70: 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a  ame $platform]..
7e80: 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69  ..      if {![fi
7e90: 6c 65 20 65 78 69 73 74 73 20 24 73 6f 75 72 63  le exists $sourc
7ea0: 65 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  eFileName]} then
7eb0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
7ec0: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
7ed0: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
7ee0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
7ef0: 2d 2d 20 73 6b 69 70 70 65 64 20 63 6f 70 79 69  -- skipped copyi
7f00: 6e 67 20 62 69 6e 61 72 79 20 66 69 6c 65 20 5c  ng binary file \
7f10: 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61  "" $sourceFileNa
7f20: 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
7f30: 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e    "\", it does n
7f40: 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 0d 0a  ot exist\n"]....
7f50: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a          return..
7f60: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
7f70: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
7f80: 67 74 68 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65  gth $newFileName
7f90: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
7fa0: 20 20 20 20 20 20 20 73 65 74 20 74 61 72 67 65         set targe
7fb0: 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 75  tFileName [getBu
7fc0: 69 6c 64 46 69 6c 65 4e 61 6d 65 20 24 6e 65 77  ildFileName $new
7fd0: 46 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f  FileName $platfo
7fe0: 72 6d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  rm]..      } els
7ff0: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  e {..        set
8000: 20 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20   targetFileName 
8010: 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d  [getBuildFileNam
8020: 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61  e $fileName $pla
8030: 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 7d 0d  tform]..      }.
8040: 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 74 61 72  ...      set tar
8050: 67 65 74 44 69 72 65 63 74 6f 72 79 20 5b 66 69  getDirectory [fi
8060: 6c 65 20 64 69 72 6e 61 6d 65 20 24 74 61 72 67  le dirname $targ
8070: 65 74 46 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20  etFileName].... 
8080: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
8090: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
80a0: 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73   if {![file exis
80b0: 74 73 20 24 74 61 72 67 65 74 44 69 72 65 63 74  ts $targetDirect
80c0: 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ory]} then {..  
80d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
80e0: 6c 65 20 6d 6b 64 69 72 20 24 74 61 72 67 65 74  le mkdir $target
80f0: 44 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20  Directory..     
8100: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
8110: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 63            file c
8120: 6f 70 79 20 2d 66 6f 72 63 65 20 24 73 6f 75 72  opy -force $sour
8130: 63 65 46 69 6c 65 4e 61 6d 65 20 24 74 61 72 67  ceFileName $targ
8140: 65 74 46 69 6c 65 4e 61 6d 65 7d 5d 20 3d 3d 20  etFileName}] == 
8150: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
8160: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
8170: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
8180: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
8190: 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 69 65 64      "---- copied
81a0: 20 62 69 6e 61 72 79 20 66 69 6c 65 20 66 72 6f   binary file fro
81b0: 6d 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c  m \"" $sourceFil
81c0: 65 4e 61 6d 65 20 22 5c 22 20 74 6f 20 5c 22 22  eName "\" to \""
81d0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
81e0: 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20  $targetFileName 
81f0: 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65  \"\n]..      } e
8200: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
8210: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
8220: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
8230: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
8240: 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20  "---- failed to 
8250: 63 6f 70 79 20 62 69 6e 61 72 79 20 66 69 6c 65  copy binary file
8260: 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63   from \"" $sourc
8270: 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20  eFileName \..   
8280: 20 20 20 20 20 20 20 20 20 22 5c 22 20 74 6f 20           "\" to 
8290: 5c 22 22 20 24 74 61 72 67 65 74 46 69 6c 65 4e  \"" $targetFileN
82a0: 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  ame \"\n]..     
82b0: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
82c0: 20 20 70 72 6f 63 20 74 72 79 43 6f 70 79 42 75    proc tryCopyBu
82d0: 69 6c 64 46 69 6c 65 20 7b 20 66 69 6c 65 4e 61  ildFile { fileNa
82e0: 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d  me {platform ""}
82f0: 20 7b 6e 65 77 46 69 6c 65 4e 61 6d 65 20 22 22   {newFileName ""
8300: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  } } {..      set
8310: 20 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20   sourceFileName 
8320: 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d  [getBuildFileNam
8330: 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61  e $fileName $pla
8340: 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20  tform]....      
8350: 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74  if {![file exist
8360: 73 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  s $sourceFileNam
8370: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
8380: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
8390: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
83a0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
83b0: 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70       "---- skipp
83c0: 65 64 20 63 6f 70 79 69 6e 67 20 62 75 69 6c 64  ed copying build
83d0: 20 66 69 6c 65 20 5c 22 22 20 24 73 6f 75 72 63   file \"" $sourc
83e0: 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20  eFileName \..   
83f0: 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69 74           "\", it
8400: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c   does not exist\
8410: 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72  n"]....        r
8420: 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a  eturn..      }..
8430: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
8440: 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e 65 77 46  ing length $newF
8450: 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68  ileName] > 0} th
8460: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  en {..        se
8470: 74 20 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65  t targetFileName
8480: 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
8490: 61 6d 65 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65  ame $newFileName
84a0: 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20   $platform]..   
84b0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
84c0: 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74 46       set targetF
84d0: 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61  ileName [getBina
84e0: 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  ryFileName $file
84f0: 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d  Name $platform].
8500: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
8510: 20 20 73 65 74 20 74 61 72 67 65 74 44 69 72 65    set targetDire
8520: 63 74 6f 72 79 20 5b 66 69 6c 65 20 64 69 72 6e  ctory [file dirn
8530: 61 6d 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e  ame $targetFileN
8540: 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  ame]....      if
8550: 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
8560: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
8570: 66 69 6c 65 20 65 78 69 73 74 73 20 24 74 61 72  file exists $tar
8580: 67 65 74 44 69 72 65 63 74 6f 72 79 5d 7d 20 74  getDirectory]} t
8590: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
85a0: 20 20 20 20 20 20 20 66 69 6c 65 20 6d 6b 64 69         file mkdi
85b0: 72 20 24 74 61 72 67 65 74 44 69 72 65 63 74 6f  r $targetDirecto
85c0: 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ry..            
85d0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
85e0: 20 20 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f     file copy -fo
85f0: 72 63 65 20 24 73 6f 75 72 63 65 46 69 6c 65 4e  rce $sourceFileN
8600: 61 6d 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e  ame $targetFileN
8610: 61 6d 65 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ame}] == 0} then
8620: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
8630: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
8640: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
8650: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
8660: 2d 2d 20 63 6f 70 69 65 64 20 62 75 69 6c 64 20  -- copied build 
8670: 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73  file from \"" $s
8680: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 22 5c  ourceFileName "\
8690: 22 20 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20  " to \"" \..    
86a0: 20 20 20 20 20 20 20 20 24 74 61 72 67 65 74 46          $targetF
86b0: 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20  ileName \"\n].. 
86c0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
86d0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
86e0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
86f0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
8700: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61          "---- fa
8710: 69 6c 65 64 20 74 6f 20 63 6f 70 79 20 62 75 69  iled to copy bui
8720: 6c 64 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22  ld file from \""
8730: 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65   $sourceFileName
8740: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
8750: 22 5c 22 20 74 6f 20 5c 22 22 20 24 74 61 72 67  "\" to \"" $targ
8760: 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d  etFileName \"\n]
8770: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
8780: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72  .....    proc tr
8790: 79 44 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c  yDeleteBinaryFil
87a0: 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c  e { fileName {pl
87b0: 61 74 66 6f 72 6d 20 22 22 7d 20 7d 20 7b 0d 0a  atform ""} } {..
87c0: 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61        set fileNa
87d0: 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c  me [getBinaryFil
87e0: 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20  eName $fileName 
87f0: 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20  $platform]....  
8800: 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65      if {![file e
8810: 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d  xists $fileName]
8820: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
8830: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
8840: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
8850: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
8860: 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64     "---- skipped
8870: 20 64 65 6c 65 74 69 6e 67 20 62 69 6e 61 72 79   deleting binary
8880: 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e   file \"" $fileN
8890: 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
88a0: 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20     "\", it does 
88b0: 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 0d  not exist\n"]...
88c0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d  .        return.
88d0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
88e0: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 66 69    if {[catch {fi
88f0: 6c 65 20 64 65 6c 65 74 65 20 24 66 69 6c 65 4e  le delete $fileN
8900: 61 6d 65 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ame}] == 0} then
8910: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
8920: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
8930: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
8940: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
8950: 2d 2d 20 64 65 6c 65 74 65 64 20 62 69 6e 61 72  -- deleted binar
8960: 79 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65  y file \"" $file
8970: 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20  Name \"\n]..    
8980: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
8990: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
89a0: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
89b0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
89c0: 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65       "---- faile
89d0: 64 20 74 6f 20 64 65 6c 65 74 65 20 62 69 6e 61  d to delete bina
89e0: 72 79 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c  ry file \"" $fil
89f0: 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  eName \"\n]..   
8a00: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
8a10: 20 20 20 20 70 72 6f 63 20 74 72 79 44 65 6c 65      proc tryDele
8a20: 74 65 42 75 69 6c 64 46 69 6c 65 20 7b 20 66 69  teBuildFile { fi
8a30: 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d  leName {platform
8a40: 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20   ""} } {..      
8a50: 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65  set fileName [ge
8a60: 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 24  tBuildFileName $
8a70: 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f  fileName $platfo
8a80: 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  rm]....      if 
8a90: 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24  {![file exists $
8aa0: 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  fileName]} then 
8ab0: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
8ac0: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
8ad0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
8ae0: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
8af0: 2d 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69  - skipped deleti
8b00: 6e 67 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22  ng build file \"
8b10: 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  " $fileName \.. 
8b20: 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20             "\", 
8b30: 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  it does not exis
8b40: 74 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  t\n"]....       
8b50: 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d   return..      }
8b60: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63  ....      if {[c
8b70: 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74  atch {file delet
8b80: 65 20 24 66 69 6c 65 4e 61 6d 65 7d 5d 20 3d 3d  e $fileName}] ==
8b90: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
8ba0: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
8bb0: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
8bc0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
8bd0: 20 20 20 20 20 22 2d 2d 2d 2d 20 64 65 6c 65 74       "---- delet
8be0: 65 64 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22  ed build file \"
8bf0: 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e  " $fileName \"\n
8c00: 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
8c10: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
8c20: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
8c30: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
8c40: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
8c50: 2d 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65  - failed to dele
8c60: 74 65 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22  te build file \"
8c70: 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e  " $fileName \"\n
8c80: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
8c90: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74  }.....    proc t
8ca0: 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 7b  ryCopyAssembly {
8cb0: 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66   fileName {platf
8cc0: 6f 72 6d 20 22 22 7d 20 7b 70 64 62 20 74 72 75  orm ""} {pdb tru
8cd0: 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 72  e} } {..      tr
8ce0: 79 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20 24  yCopyBuildFile $
8cf0: 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f  fileName $platfo
8d00: 72 6d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  rm....      if {
8d10: 24 70 64 62 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  $pdb} then {..  
8d20: 20 20 20 20 20 20 74 72 79 43 6f 70 79 42 75 69        tryCopyBui
8d30: 6c 64 46 69 6c 65 20 5b 61 70 70 65 6e 64 41 72  ldFile [appendAr
8d40: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
8d50: 20 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65    [file rootname
8d60: 20 24 66 69 6c 65 4e 61 6d 65 5d 20 2e 70 64 62   $fileName] .pdb
8d70: 5d 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20  ] $platform..   
8d80: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
8d90: 20 20 20 20 70 72 6f 63 20 74 72 79 44 65 6c 65      proc tryDele
8da0: 74 65 41 73 73 65 6d 62 6c 79 20 7b 20 66 69 6c  teAssembly { fil
8db0: 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20  eName {platform 
8dc0: 22 22 7d 20 7b 70 64 62 20 74 72 75 65 7d 20 7d  ""} {pdb true} }
8dd0: 20 7b 0d 0a 20 20 20 20 20 20 74 72 79 44 65 6c   {..      tryDel
8de0: 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20 24 66  eteBinaryFile $f
8df0: 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72  ileName $platfor
8e00: 6d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 24  m....      if {$
8e10: 70 64 62 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  pdb} then {..   
8e20: 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 42 69       tryDeleteBi
8e30: 6e 61 72 79 46 69 6c 65 20 5b 61 70 70 65 6e 64  naryFile [append
8e40: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
8e50: 20 20 20 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61      [file rootna
8e60: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 20 2e 70  me $fileName] .p
8e70: 64 62 5d 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 20  db] $platform.. 
8e80: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
8e90: 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79 4c 6f  ..    proc tryLo
8ea0: 61 64 41 73 73 65 6d 62 6c 79 20 7b 20 66 69 6c  adAssembly { fil
8eb0: 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20  eName {platform 
8ec0: 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73  ""} } {..      s
8ed0: 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65 74  et fileName [get
8ee0: 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24  BinaryFileName $
8ef0: 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f  fileName $platfo
8f00: 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  rm]....      if 
8f10: 7b 5b 63 61 74 63 68 20 7b 73 65 74 20 61 73 73  {[catch {set ass
8f20: 65 6d 62 6c 79 20 5c 0d 0a 20 20 20 20 20 20 20  embly \..       
8f30: 20 20 20 20 20 20 20 5b 6f 62 6a 65 63 74 20 6c         [object l
8f40: 6f 61 64 20 2d 6c 6f 61 64 74 79 70 65 20 46 69  oad -loadtype Fi
8f50: 6c 65 20 2d 61 6c 69 61 73 20 24 66 69 6c 65 4e  le -alias $fileN
8f60: 61 6d 65 5d 7d 5d 20 3d 3d 20 30 7d 20 74 68 65  ame]}] == 0} the
8f70: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
8f80: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
8f90: 4e 6f 77 2c 20 61 64 64 20 74 68 65 20 6e 65 63  Now, add the nec
8fa0: 65 73 73 61 72 79 20 74 65 73 74 20 63 6f 6e 73  essary test cons
8fb0: 74 72 61 69 6e 74 2e 0d 0a 20 20 20 20 20 20 20  traint...       
8fc0: 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43   #..        addC
8fd0: 6f 6e 73 74 72 61 69 6e 74 20 5b 66 69 6c 65 20  onstraint [file 
8fe0: 72 6f 6f 74 6e 61 6d 65 20 5b 66 69 6c 65 20 74  rootname [file t
8ff0: 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d  ail $fileName]].
9000: 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
9010: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 47 72        # NOTE: Gr
9020: 61 62 20 74 68 65 20 69 6d 61 67 65 20 72 75 6e  ab the image run
9030: 74 69 6d 65 20 76 65 72 73 69 6f 6e 20 66 72 6f  time version fro
9040: 6d 20 74 68 65 20 61 73 73 65 6d 62 6c 79 20 62  m the assembly b
9050: 65 63 61 75 73 65 0d 0a 20 20 20 20 20 20 20 20  ecause..        
9060: 23 20 20 20 20 20 20 20 73 65 76 65 72 61 6c 20  #       several 
9070: 74 65 73 74 73 20 72 65 6c 79 20 6f 6e 20 69 74  tests rely on it
9080: 20 68 61 76 69 6e 67 20 61 20 63 65 72 74 61 69   having a certai
9090: 6e 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20  n value...      
90a0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64    #..        add
90b0: 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
90c0: 6e 64 41 72 67 73 20 5b 66 69 6c 65 20 74 61 69  ndArgs [file tai
90d0: 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 20 5f 20 5c  l $fileName] _ \
90e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 24  ..            [$
90f0: 61 73 73 65 6d 62 6c 79 20 49 6d 61 67 65 52 75  assembly ImageRu
9100: 6e 74 69 6d 65 56 65 72 73 69 6f 6e 5d 5d 0d 0a  ntimeVersion]]..
9110: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
9120: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74       # NOTE: Ret
9130: 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74  urn the full pat
9140: 68 20 6f 66 20 74 68 65 20 6c 6f 61 64 65 64 20  h of the loaded 
9150: 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  file...        #
9160: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
9170: 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20   $fileName..    
9180: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74    }....      ret
9190: 75 72 6e 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 0c  urn ""..    }...
91a0: 0d 0a 20 20 20 20 70 72 6f 63 20 69 73 53 51 4c  ..    proc isSQL
91b0: 69 74 65 52 65 61 64 79 20 7b 7d 20 7b 0d 0a 20  iteReady {} {.. 
91c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
91d0: 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65  NOTE: This proce
91e0: 64 75 72 65 20 6d 75 73 74 20 72 65 74 75 72 6e  dure must return
91f0: 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 6c 79 20 69   non-zero only i
9200: 66 20 74 68 65 20 53 51 4c 69 74 65 20 6e 61 74  f the SQLite nat
9210: 69 76 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ive..      #    
9220: 20 20 20 6c 69 62 72 61 72 79 20 61 6e 64 20 74     library and t
9230: 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  he System.Data.S
9240: 51 4c 69 74 65 20 6d 61 6e 61 67 65 64 20 61 73  QLite managed as
9250: 73 65 6d 62 6c 79 20 61 72 65 20 6c 6f 61 64 65  sembly are loade
9260: 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
9270: 20 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20 75   and ready for u
9280: 73 65 20 62 79 20 74 68 65 20 74 65 73 74 20 73  se by the test s
9290: 75 69 74 65 2e 20 20 43 75 72 72 65 6e 74 6c 79  uite.  Currently
92a0: 2c 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  , this procedure
92b0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
92c0: 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
92d0: 20 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20   only after the 
92e0: 5b 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79  [tryLoadAssembly
92f0: 5d 20 70 72 6f 63 65 64 75 72 65 20 68 61 73 0d  ] procedure has.
9300: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62  .      #       b
9310: 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 70 72  een called to pr
9320: 6f 62 65 20 66 6f 72 20 74 68 65 20 53 79 73 74  obe for the Syst
9330: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 6d  em.Data.SQLite m
9340: 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 0d  anaged assembly.
9350: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
9360: 6e 64 20 74 68 65 20 5b 63 68 65 63 6b 46 6f 72  nd the [checkFor
9370: 53 51 4c 69 74 65 5d 20 70 72 6f 63 65 64 75 72  SQLite] procedur
9380: 65 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65  e has been calle
9390: 64 20 74 6f 20 70 72 6f 62 65 20 66 6f 72 0d 0a  d to probe for..
93a0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
93b0: 65 20 53 51 4c 69 74 65 20 6e 61 74 69 76 65 20  e SQLite native 
93c0: 6c 69 62 72 61 72 79 3b 20 6f 74 68 65 72 77 69  library; otherwi
93d0: 73 65 2c 20 74 68 69 73 20 70 72 6f 63 65 64 75  se, this procedu
93e0: 72 65 20 77 69 6c 6c 20 73 69 6d 70 6c 79 0d 0a  re will simply..
93f0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6c        #       al
9400: 77 61 79 73 20 72 65 74 75 72 6e 20 7a 65 72 6f  ways return zero
9410: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
9420: 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b    return [expr {
9430: 0d 0a 20 20 20 20 20 20 20 20 5b 68 61 76 65 43  ..        [haveC
9440: 6f 6e 73 74 72 61 69 6e 74 20 53 79 73 74 65 6d  onstraint System
9450: 2e 44 61 74 61 2e 53 51 4c 69 74 65 5d 20 26 26  .Data.SQLite] &&
9460: 20 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74   [haveConstraint
9470: 20 53 51 4c 69 74 65 5d 0d 0a 20 20 20 20 20 20   SQLite]..      
9480: 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  }]..    }.....  
9490: 20 20 70 72 6f 63 20 6d 61 74 63 68 4d 61 63 68    proc matchMach
94a0: 69 6e 65 20 7b 20 70 6c 61 74 66 6f 72 6d 20 7d  ine { platform }
94b0: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
94c0: 20 20 20 23 20 4e 4f 54 45 3a 20 41 6e 20 65 6d     # NOTE: An em
94d0: 70 74 79 20 73 74 72 69 6e 67 20 66 6f 72 20 74  pty string for t
94e0: 68 65 20 70 6c 61 74 66 6f 72 6d 20 6d 65 61 6e  he platform mean
94f0: 73 20 74 68 61 74 20 74 68 65 20 62 75 69 6c 64  s that the build
9500: 20 69 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 23   is not..      #
9510: 20 20 20 20 20 20 20 5b 70 72 69 6d 61 72 69 6c         [primaril
9520: 79 5d 20 61 20 6e 61 74 69 76 65 20 62 75 69 6c  y] a native buil
9530: 64 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 69 74  d; therefore, it
9540: 20 61 6c 77 61 79 73 20 6d 61 74 63 68 65 73 2e   always matches.
9550: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
9560: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
9570: 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3d  gth $platform] =
9580: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
9590: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
95a0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
95b0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
95c0: 54 45 3a 20 44 6f 65 73 20 74 68 65 20 73 70 65  TE: Does the spe
95d0: 63 69 66 69 65 64 20 70 6c 61 74 66 6f 72 6d 20  cified platform 
95e0: 6d 61 74 63 68 20 75 70 20 74 6f 20 74 68 65 20  match up to the 
95f0: 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 3f  current process?
9600: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
9610: 20 69 66 20 7b 24 70 6c 61 74 66 6f 72 6d 20 65   if {$platform e
9620: 71 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74  q [machineToPlat
9630: 66 6f 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74  form $::tcl_plat
9640: 66 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 7d 20  form(machine)]} 
9650: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
9660: 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20  return true..   
9670: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
9680: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
9690: 68 65 20 73 70 65 63 69 66 69 65 64 20 70 6c 61  he specified pla
96a0: 74 66 6f 72 6d 20 64 6f 65 73 20 6e 6f 74 20 6d  tform does not m
96b0: 61 74 63 68 20 75 70 20 77 69 74 68 20 74 68 65  atch up with the
96c0: 20 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20   platform..     
96d0: 20 23 20 20 20 20 20 20 20 66 6f 72 20 74 68 65   #       for the
96e0: 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73   current process
96f0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
9700: 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a    return false..
9710: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
9720: 6f 63 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74  oc checkForSQLit
9730: 65 42 75 69 6c 64 73 20 7b 20 63 68 61 6e 6e 65  eBuilds { channe
9740: 6c 20 7b 73 65 6c 65 63 74 20 66 61 6c 73 65 7d  l {select false}
9750: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
9760: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
9770: 63 6b 20 66 6f 72 20 65 76 65 72 79 20 70 6f 73  ck for every pos
9780: 73 69 62 6c 65 20 76 61 6c 69 64 20 63 6f 6d 62  sible valid comb
9790: 69 6e 61 74 69 6f 6e 20 6f 66 20 76 61 6c 75 65  ination of value
97a0: 73 20 75 73 65 64 20 77 68 65 6e 0d 0a 20 20 20  s used when..   
97b0: 20 20 20 23 20 20 20 20 20 20 20 6c 6f 63 61 74     #       locat
97c0: 69 6e 67 20 6f 75 74 20 74 68 65 20 62 75 69 6c  ing out the buil
97d0: 64 20 6f 75 74 70 75 74 20 64 69 72 65 63 74 6f  d output directo
97e0: 72 79 2c 20 73 68 6f 77 69 6e 67 20 65 61 63 68  ry, showing each
97f0: 20 61 76 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20   available..    
9800: 20 20 23 20 20 20 20 20 20 20 62 75 69 6c 64 20    #       build 
9810: 76 61 72 69 61 74 69 6f 6e 20 61 6c 6f 6e 67 20  variation along 
9820: 74 68 65 20 77 61 79 2e 0d 0a 20 20 20 20 20 20  the way...      
9830: 23 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68  #..      foreach
9840: 20 6e 61 74 69 76 65 20 5b 6c 69 73 74 20 66 61   native [list fa
9850: 6c 73 65 20 74 72 75 65 5d 20 7b 0d 0a 20 20 20  lse true] {..   
9860: 20 20 20 20 20 66 6f 72 65 61 63 68 20 79 65 61       foreach yea
9870: 72 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72 73  r [getBuildYears
9880: 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66  ] {..          f
9890: 6f 72 65 61 63 68 20 63 6f 6e 66 69 67 75 72 61  oreach configura
98a0: 74 69 6f 6e 20 5b 67 65 74 42 75 69 6c 64 43 6f  tion [getBuildCo
98b0: 6e 66 69 67 75 72 61 74 69 6f 6e 73 5d 20 7b 0d  nfigurations] {.
98c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
98d0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
98e0: 54 45 3a 20 46 69 67 75 72 65 20 6f 75 74 20 74  TE: Figure out t
98f0: 68 65 20 65 66 66 65 63 74 69 76 65 20 62 75 69  he effective bui
9900: 6c 64 20 70 6c 61 74 66 6f 72 6d 2e 20 20 54 68  ld platform.  Th
9910: 69 73 20 69 73 0d 0a 20 20 20 20 20 20 20 20 20  is is..         
9920: 20 20 20 23 20 20 20 20 20 20 20 62 61 73 65 64     #       based
9930: 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
9940: 6f 74 20 61 20 5b 70 72 69 6d 61 72 69 6c 79 5d  ot a [primarily]
9950: 20 6e 61 74 69 76 65 20 62 75 69 6c 64 0d 0a 20   native build.. 
9960: 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
9970: 20 20 20 69 73 20 62 65 69 6e 67 20 75 73 65 64     is being used
9980: 2e 20 20 46 6f 72 20 5b 70 72 69 6d 61 72 69 6c  .  For [primaril
9990: 79 5d 20 6e 6f 6e 2d 6e 61 74 69 76 65 20 62 75  y] non-native bu
99a0: 69 6c 64 73 2c 0d 0a 20 20 20 20 20 20 20 20 20  ilds,..         
99b0: 20 20 20 23 20 20 20 20 20 20 20 74 68 69 73 20     #       this 
99c0: 77 69 6c 6c 20 62 65 20 61 6e 20 65 6d 70 74 79  will be an empty
99d0: 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20   string...      
99e0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
99f0: 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72       set platfor
9a00: 6d 20 5b 67 65 74 42 75 69 6c 64 50 6c 61 74 66  m [getBuildPlatf
9a10: 6f 72 6d 20 24 6e 61 74 69 76 65 5d 0d 0a 0d 0a  orm $native]....
9a20: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
9a30: 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
9a40: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
9a50: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
9a60: 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73  checking for Sys
9a70: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
9a80: 62 75 69 6c 64 20 5c 22 22 20 5b 65 78 70 72 20  build \"" [expr 
9a90: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
9aa0: 20 20 20 7b 24 6e 61 74 69 76 65 20 3f 20 22 6e     {$native ? "n
9ab0: 61 74 69 76 65 2f 22 20 3a 20 22 22 7d 5d 20 5b  ative/" : ""}] [
9ac0: 65 78 70 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65  expr {[string le
9ad0: 6e 67 74 68 20 5c 0d 0a 20 20 20 20 20 20 20 20  ngth \..        
9ae0: 20 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72          $platfor
9af0: 6d 5d 20 3e 20 30 20 3f 20 5b 61 70 70 65 6e 64  m] > 0 ? [append
9b00: 41 72 67 73 20 24 70 6c 61 74 66 6f 72 6d 20 2f  Args $platform /
9b10: 5d 20 3a 20 22 22 7d 5d 20 24 79 65 61 72 20 5c  ] : ""}] $year \
9b20: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
9b30: 20 20 2f 20 24 63 6f 6e 66 69 67 75 72 61 74 69    / $configurati
9b40: 6f 6e 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a  on "\"... "]....
9b50: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
9b60: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
9b70: 45 3a 20 42 75 69 6c 64 20 74 68 65 20 66 75 6c  E: Build the ful
9b80: 6c 79 20 71 75 61 6c 69 66 69 65 64 20 64 69 72  ly qualified dir
9b90: 65 63 74 6f 72 79 20 77 68 65 72 65 20 74 68 65  ectory where the
9ba0: 20 6e 65 63 65 73 73 61 72 79 0d 0a 20 20 20 20   necessary..    
9bb0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
9bc0: 63 6f 6d 70 6f 6e 65 6e 74 73 20 66 6f 72 20 53  components for S
9bd0: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
9be0: 65 20 73 68 6f 75 6c 64 20 62 65 20 66 6f 75 6e  e should be foun
9bf0: 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  d...            
9c00: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  #..            s
9c10: 65 74 20 64 69 72 65 63 74 6f 72 79 20 5b 6a 6f  et directory [jo
9c20: 69 6e 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79  inBuildDirectory
9c30: 20 24 6e 61 74 69 76 65 20 5c 0d 0a 20 20 20 20   $native \..    
9c40: 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
9c50: 42 75 69 6c 64 42 61 73 65 44 69 72 65 63 74 6f  BuildBaseDirecto
9c60: 72 79 5d 20 24 79 65 61 72 20 24 70 6c 61 74 66  ry] $year $platf
9c70: 6f 72 6d 20 24 63 6f 6e 66 69 67 75 72 61 74 69  orm $configurati
9c80: 6f 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  on]....         
9c90: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
9ca0: 20 20 23 20 4e 4f 54 45 3a 20 44 6f 20 74 68 65    # NOTE: Do the
9cb0: 20 6e 65 63 65 73 73 61 72 79 20 66 69 6c 65 73   necessary files
9cc0: 20 65 78 69 73 74 3f 20 20 43 75 72 72 65 6e 74   exist?  Current
9cd0: 6c 79 2c 20 6e 6f 20 6f 74 68 65 72 20 73 74 65  ly, no other ste
9ce0: 70 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ps..            
9cf0: 23 20 20 20 20 20 20 20 61 72 65 20 74 61 6b 65  #       are take
9d00: 6e 20 74 6f 20 76 65 72 69 66 79 20 74 68 69 73  n to verify this
9d10: 20 62 75 69 6c 64 20 69 73 20 61 63 74 75 61 6c   build is actual
9d20: 6c 79 20 76 69 61 62 6c 65 2e 0d 0a 20 20 20 20  ly viable...    
9d30: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
9d40: 20 20 20 20 20 20 20 69 66 20 7b 5b 69 73 42 75         if {[isBu
9d50: 69 6c 64 41 76 61 69 6c 61 62 6c 65 20 24 6e 61  ildAvailable $na
9d60: 74 69 76 65 20 24 64 69 72 65 63 74 6f 72 79 5d  tive $directory]
9d70: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
9d80: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
9d90: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
9da0: 20 57 68 65 6e 20 69 6e 20 22 73 65 6c 65 63 74   When in "select
9db0: 22 20 6d 6f 64 65 2c 20 61 75 74 6f 6d 61 74 69  " mode, automati
9dc0: 63 61 6c 6c 79 20 73 65 6c 65 63 74 20 74 68 65  cally select the
9dd0: 20 66 69 72 73 74 0d 0a 20 20 20 20 20 20 20 20   first..        
9de0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 76        #       av
9df0: 61 69 6c 61 62 6c 65 20 62 75 69 6c 64 20 6f 66  ailable build of
9e00: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
9e10: 69 74 65 20 61 6e 64 20 74 68 65 6e 20 72 65 74  ite and then ret
9e20: 75 72 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  urn..           
9e30: 20 20 20 23 20 20 20 20 20 20 20 69 6d 6d 65 64     #       immed
9e40: 69 61 74 65 6c 79 2e 0d 0a 20 20 20 20 20 20 20  iately...       
9e50: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
9e60: 20 20 20 20 20 20 20 20 69 66 20 7b 24 73 65 6c          if {$sel
9e70: 65 63 74 20 26 26 20 5b 6d 61 74 63 68 4d 61 63  ect && [matchMac
9e80: 68 69 6e 65 20 24 70 6c 61 74 66 6f 72 6d 5d 7d  hine $platform]}
9e90: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
9ea0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
9eb0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
9ec0: 54 45 3a 20 4d 61 6e 75 61 6c 6c 79 20 6f 76 65  TE: Manually ove
9ed0: 72 72 69 64 65 20 61 6c 6c 20 74 68 65 20 62 75  rride all the bu
9ee0: 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20 73 65  ild directory se
9ef0: 6c 65 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20  lection..       
9f00: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
9f10: 20 72 65 6c 61 74 65 64 20 74 65 73 74 20 73 65   related test se
9f20: 74 74 69 6e 67 73 20 69 6e 20 6f 72 64 65 72 20  ttings in order 
9f30: 74 6f 20 66 6f 72 63 65 20 74 68 69 73 20 62 75  to force this bu
9f40: 69 6c 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ild..           
9f50: 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 66 20       #       of 
9f60: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
9f70: 74 65 20 74 6f 20 62 65 20 75 73 65 64 2e 0d 0a  te to be used...
9f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f90: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
9fa0: 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
9fb0: 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74   Interpreter.Get
9fc0: 41 63 74 69 76 65 20 5b 65 78 70 72 20 7b 24 6e  Active [expr {$n
9fd0: 61 74 69 76 65 20 3f 20 5c 0d 0a 20 20 20 20 20  ative ? \..     
9fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
9ff0: 41 64 64 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  AddRuntimeOption
a000: 22 20 3a 20 22 52 65 6d 6f 76 65 52 75 6e 74 69  " : "RemoveRunti
a010: 6d 65 4f 70 74 69 6f 6e 22 7d 5d 20 20 6e 61 74  meOption"}]  nat
a020: 69 76 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ive....         
a030: 20 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73         set ::tes
a040: 74 5f 79 65 61 72 20 24 79 65 61 72 0d 0a 20 20  t_year $year..  
a050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
a060: 74 20 3a 3a 74 65 73 74 5f 70 6c 61 74 66 6f 72  t ::test_platfor
a070: 6d 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20  m $platform..   
a080: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
a090: 20 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72   ::test_configur
a0a0: 61 74 69 6f 6e 20 24 63 6f 6e 66 69 67 75 72 61  ation $configura
a0b0: 74 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  tion....        
a0c0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
a0d0: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
a0e0: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
a0f0: 20 20 20 20 20 20 20 20 20 20 22 79 65 73 2c 20            "yes, 
a100: 73 65 6c 65 63 74 65 64 20 28 22 20 5b 65 78 70  selected (" [exp
a110: 72 20 7b 24 6e 61 74 69 76 65 20 3f 20 22 6e 61  r {$native ? "na
a120: 74 69 76 65 2f 22 20 3a 20 22 22 7d 5d 20 5c 0d  tive/" : ""}] \.
a130: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a140: 20 20 20 20 20 5b 65 78 70 72 20 7b 5b 73 74 72       [expr {[str
a150: 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74  ing length $plat
a160: 66 6f 72 6d 5d 20 3e 20 30 20 3f 20 5b 61 70 70  form] > 0 ? [app
a170: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
a180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
a190: 70 6c 61 74 66 6f 72 6d 20 2f 5d 20 3a 20 22 22  platform /] : ""
a1a0: 7d 5d 20 24 79 65 61 72 20 2f 20 24 63 6f 6e 66  }] $year / $conf
a1b0: 69 67 75 72 61 74 69 6f 6e 20 22 29 5c 6e 22 5d  iguration ")\n"]
a1c0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
a1d0: 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d      return true.
a1e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
a1f0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
a200: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
a210: 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20  channel yes\n.. 
a220: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
a230: 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
a240: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
a250: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
a260: 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 20  el no\n..       
a270: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
a280: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
a290: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
a2a0: 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20   return false.. 
a2b0: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
a2c0: 63 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65  c checkForSQLite
a2d0: 52 65 6c 65 61 73 65 73 20 7b 20 63 68 61 6e 6e  Releases { chann
a2e0: 65 6c 20 7b 73 65 6c 65 63 74 20 66 61 6c 73 65  el {select false
a2f0: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
a300: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
a310: 65 63 6b 20 66 6f 72 20 70 61 73 74 20 72 65 6c  eck for past rel
a320: 65 61 73 65 73 20 6f 66 20 53 79 73 74 65 6d 2e  eases of System.
a330: 44 61 74 61 2e 53 51 4c 69 74 65 20 69 6e 20 74  Data.SQLite in t
a340: 68 65 20 64 69 72 65 63 74 6f 72 79 0d 0a 20 20  he directory..  
a350: 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74      #       cont
a360: 61 69 6e 65 64 20 69 6e 20 74 68 65 20 22 53 79  ained in the "Sy
a370: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
a380: 22 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61  " environment va
a390: 72 69 61 62 6c 65 2c 20 69 66 0d 0a 20 20 20 20  riable, if..    
a3a0: 20 20 23 20 20 20 20 20 20 20 70 72 65 73 65 6e    #       presen
a3b0: 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  t...      #..   
a3c0: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
a3d0: 73 74 73 20 3a 3a 65 6e 76 28 53 79 73 74 65 6d  sts ::env(System
a3e0: 2e 44 61 74 61 2e 53 51 4c 69 74 65 29 5d 20 26  .Data.SQLite)] &
a3f0: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
a400: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
a410: 3a 65 6e 76 28 53 79 73 74 65 6d 2e 44 61 74 61  :env(System.Data
a420: 2e 53 51 4c 69 74 65 29 5d 20 3e 20 30 7d 20 74  .SQLite)] > 0} t
a430: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
a440: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
a450: 3a 20 42 75 69 6c 64 20 74 68 65 20 66 75 6c 6c  : Build the full
a460: 79 20 71 75 61 6c 69 66 69 65 64 20 64 69 72 65  y qualified dire
a470: 63 74 6f 72 79 20 77 68 65 72 65 20 74 68 65 20  ctory where the 
a480: 6e 65 63 65 73 73 61 72 79 0d 0a 20 20 20 20 20  necessary..     
a490: 20 20 20 23 20 20 20 20 20 20 20 63 6f 6d 70 6f     #       compo
a4a0: 6e 65 6e 74 73 20 66 6f 72 20 53 79 73 74 65 6d  nents for System
a4b0: 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 73 68 6f  .Data.SQLite sho
a4c0: 75 6c 64 20 62 65 20 66 6f 75 6e 64 2e 0d 0a 20  uld be found... 
a4d0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
a4e0: 20 20 73 65 74 20 64 69 72 65 63 74 6f 72 79 20    set directory 
a4f0: 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
a500: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20   [file join \.. 
a510: 20 20 20 20 20 20 20 20 20 20 20 24 3a 3a 65 6e             $::en
a520: 76 28 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  v(System.Data.SQ
a530: 4c 69 74 65 29 20 5b 67 65 74 52 65 6c 65 61 73  Lite) [getReleas
a540: 65 56 65 72 73 69 6f 6e 5d 5d 5d 0d 0a 0d 0a 20  eVersion]]].... 
a550: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
a560: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
a570: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
a580: 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20   "---- checking 
a590: 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  for System.Data.
a5a0: 53 51 4c 69 74 65 20 72 65 6c 65 61 73 65 20 5c  SQLite release \
a5b0: 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
a5c0: 20 20 24 64 69 72 65 63 74 6f 72 79 20 22 5c 22    $directory "\"
a5d0: 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20  ... "]....      
a5e0: 20 20 69 66 20 7b 5b 69 73 52 65 6c 65 61 73 65    if {[isRelease
a5f0: 41 76 61 69 6c 61 62 6c 65 20 24 64 69 72 65 63  Available $direc
a600: 74 6f 72 79 20 70 6c 61 74 66 6f 72 6d 5d 7d 20  tory platform]} 
a610: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
a620: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
a630: 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20  ngth $platform] 
a640: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
a650: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 70 6c            set pl
a660: 61 74 66 6f 72 6d 20 75 6e 6b 6e 6f 77 6e 0d 0a  atform unknown..
a670: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
a680: 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 73 65           if {$se
a690: 6c 65 63 74 20 26 26 20 5b 6d 61 74 63 68 4d 61  lect && [matchMa
a6a0: 63 68 69 6e 65 20 24 70 6c 61 74 66 6f 72 6d 5d  chine $platform]
a6b0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
a6c0: 20 20 20 20 20 20 73 65 74 20 3a 3a 62 75 69 6c        set ::buil
a6d0: 64 5f 64 69 72 65 63 74 6f 72 79 20 24 64 69 72  d_directory $dir
a6e0: 65 63 74 6f 72 79 0d 0a 0d 0a 20 20 20 20 20 20  ectory....      
a6f0: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
a700: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
a710: 20 22 79 65 73 2c 20 73 65 6c 65 63 74 65 64 20   "yes, selected 
a720: 28 22 20 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c  (" $platform ")\
a730: 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  n"]....         
a740: 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a     return true..
a750: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
a760: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
a770: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
a780: 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73 20  appendArgs "yes 
a790: 28 22 20 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c  (" $platform ")\
a7a0: 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  n"]..          }
a7b0: 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
a7c0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
a7d0: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c  uts $channel no\
a7e0: 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66  n....          f
a7f0: 6f 72 65 61 63 68 20 70 61 74 68 20 5b 6c 73 6f  oreach path [lso
a800: 72 74 20 2d 64 65 63 72 65 61 73 69 6e 67 20 5b  rt -decreasing [
a810: 66 69 6c 65 20 6c 69 73 74 20 24 64 69 72 65 63  file list $direc
a820: 74 6f 72 79 20 2a 5d 5d 20 7b 0d 0a 20 20 20 20  tory *]] {..    
a830: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c          if {[fil
a840: 65 20 65 78 69 73 74 73 20 24 70 61 74 68 5d 20  e exists $path] 
a850: 26 26 20 5b 66 69 6c 65 20 69 73 64 69 72 65 63  && [file isdirec
a860: 74 6f 72 79 20 24 70 61 74 68 5d 7d 20 74 68 65  tory $path]} the
a870: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
a880: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
a890: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
a8a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a8b0: 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e     "---- checkin
a8c0: 67 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74  g for System.Dat
a8d0: 61 2e 53 51 4c 69 74 65 20 72 65 6c 65 61 73 65  a.SQLite release
a8e0: 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
a8f0: 20 20 20 20 20 20 20 20 20 20 24 70 61 74 68 20            $path 
a900: 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20  "\"... "]....   
a910: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
a920: 69 73 52 65 6c 65 61 73 65 41 76 61 69 6c 61 62  isReleaseAvailab
a930: 6c 65 20 24 70 61 74 68 20 70 6c 61 74 66 6f 72  le $path platfor
a940: 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  m]} then {..    
a950: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
a960: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
a970: 70 6c 61 74 66 6f 72 6d 5d 20 3d 3d 20 30 7d 20  platform] == 0} 
a980: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
a990: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 70 6c            set pl
a9a0: 61 74 66 6f 72 6d 20 75 6e 6b 6e 6f 77 6e 0d 0a  atform unknown..
a9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9c0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
a9d0: 20 20 20 20 20 69 66 20 7b 24 73 65 6c 65 63 74       if {$select
a9e0: 20 26 26 20 5b 6d 61 74 63 68 4d 61 63 68 69 6e   && [matchMachin
a9f0: 65 20 24 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68  e $platform]} th
aa00: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
aa10: 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 62 75          set ::bu
aa20: 69 6c 64 5f 64 69 72 65 63 74 6f 72 79 20 24 70  ild_directory $p
aa30: 61 74 68 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ath....         
aa40: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
aa50: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
aa60: 72 67 73 20 22 79 65 73 2c 20 73 65 6c 65 63 74  rgs "yes, select
aa70: 65 64 20 28 22 20 24 70 6c 61 74 66 6f 72 6d 20  ed (" $platform 
aa80: 22 29 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20  ")\n"]....      
aa90: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
aaa0: 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20  rn true..       
aab0: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
aac0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
aad0: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
aae0: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
aaf0: 22 79 65 73 20 28 22 20 24 70 6c 61 74 66 6f 72  "yes (" $platfor
ab00: 6d 20 22 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  m ")\n"]..      
ab10: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
ab20: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
ab30: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
ab40: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
ab50: 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20  nel no\n..      
ab60: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
ab70: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
ab80: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
ab90: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
aba0: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
abb0: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
abc0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
abd0: 20 20 20 20 22 2d 2d 2d 2d 20 65 6e 76 69 72 6f      "---- enviro
abe0: 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 5c  nment variable \
abf0: 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  "System.Data.SQL
ac00: 69 74 65 5c 22 20 69 73 20 6e 6f 74 20 22 20 5c  ite\" is not " \
ac10: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 73  ..            "s
ac20: 65 74 2c 20 73 6b 69 70 70 69 6e 67 20 63 68 65  et, skipping che
ac30: 63 6b 20 66 6f 72 20 72 65 6c 65 61 73 65 73 2e  ck for releases.
ac40: 2e 2e 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 0d  ..\n"]..      }.
ac50: 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
ac60: 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  false..    }....
ac70: 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46  .    proc checkF
ac80: 6f 72 53 51 4c 69 74 65 4c 69 62 72 61 72 79 20  orSQLiteLibrary 
ac90: 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20  { channel } {.. 
aca0: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
acb0: 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69  nel "---- checki
acc0: 6e 67 20 66 6f 72 20 53 51 4c 69 74 65 20 63 6f  ng for SQLite co
acd0: 72 65 20 6c 69 62 72 61 72 79 2e 2e 2e 20 22 0d  re library... ".
ace0: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  ...      if {[ca
acf0: 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
ad00: 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
ad10: 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
ad20: 62 6c 69 63 20 53 79 73 74 65 6d 2e 44 61 74 61  blic System.Data
ad30: 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20  .SQLite.SQLite3 
ad40: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
ad50: 20 53 51 4c 69 74 65 56 65 72 73 69 6f 6e 7d 20   SQLiteVersion} 
ad60: 76 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74  version] == 0} t
ad70: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
ad80: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
ad90: 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 72  : Check if the r
ada0: 65 74 75 72 6e 65 64 20 76 65 72 73 69 6f 6e 20  eturned version 
adb0: 77 61 73 20 6e 75 6c 6c 2e 20 20 49 66 20 73 6f  was null.  If so
adc0: 2c 20 6d 61 6b 65 20 69 74 20 65 61 73 79 0d 0a  , make it easy..
add0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
ade0: 74 6f 20 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20  to spot...      
adf0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
ae00: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
ae10: 24 76 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20  $version] == 0} 
ae20: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
ae30: 20 20 73 65 74 20 76 65 72 73 69 6f 6e 20 6e 75    set version nu
ae40: 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ll..        }...
ae50: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
ae60: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
ae70: 6d 70 74 20 74 6f 20 71 75 65 72 79 20 74 68 65  mpt to query the
ae80: 20 46 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69   Fossil source i
ae90: 64 65 6e 74 69 66 69 65 72 20 66 6f 72 20 74 68  dentifier for th
aea0: 65 20 53 51 4c 69 74 65 0d 0a 20 20 20 20 20 20  e SQLite..      
aeb0: 20 20 23 20 20 20 20 20 20 20 63 6f 72 65 20 6c    #       core l
aec0: 69 62 72 61 72 79 2e 0d 0a 20 20 20 20 20 20 20  ibrary...       
aed0: 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
aee0: 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
aef0: 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
af00: 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
af10: 4e 6f 6e 50 75 62 6c 69 63 20 53 79 73 74 65 6d  NonPublic System
af20: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
af30: 69 74 65 33 20 5c 0d 0a 20 20 20 20 20 20 20 20  ite3 \..        
af40: 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 53 6f          SQLiteSo
af50: 75 72 63 65 49 64 7d 20 73 6f 75 72 63 65 49 64  urceId} sourceId
af60: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
af70: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
af80: 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 66 61 69    # NOTE: We fai
af90: 6c 65 64 20 74 6f 20 71 75 65 72 79 20 74 68 65  led to query the
afa0: 20 46 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69   Fossil source i
afb0: 64 65 6e 74 69 66 69 65 72 2e 0d 0a 20 20 20 20  dentifier...    
afc0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
afd0: 20 20 20 73 65 74 20 73 6f 75 72 63 65 49 64 20     set sourceId 
afe0: 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20  unknown..       
aff0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
b000: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
b010: 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 72 65   Check if the re
b020: 74 75 72 6e 65 64 20 46 6f 73 73 69 6c 20 73 6f  turned Fossil so
b030: 75 72 63 65 20 69 64 65 6e 74 69 66 69 65 72 20  urce identifier 
b040: 77 61 73 20 6e 75 6c 6c 2e 20 20 49 66 0d 0a 20  was null.  If.. 
b050: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73         #       s
b060: 6f 2c 20 6d 61 6b 65 20 69 74 20 65 61 73 79 20  o, make it easy 
b070: 74 6f 20 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20  to spot...      
b080: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
b090: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
b0a0: 24 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d  $sourceId] == 0}
b0b0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
b0c0: 20 20 20 73 65 74 20 73 6f 75 72 63 65 49 64 20     set sourceId 
b0d0: 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d  null..        }.
b0e0: 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
b0f0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65        # NOTE: Ye
b100: 73 2c 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f  s, the SQLite co
b110: 72 65 20 6c 69 62 72 61 72 79 20 61 70 70 65 61  re library appea
b120: 72 73 20 74 6f 20 62 65 20 61 76 61 69 6c 61 62  rs to be availab
b130: 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  le...        #..
b140: 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
b150: 72 61 69 6e 74 20 53 51 4c 69 74 65 0d 0a 0d 0a  raint SQLite....
b160: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
b170: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
b180: 67 73 20 22 79 65 73 20 28 22 20 24 76 65 72 73  gs "yes (" $vers
b190: 69 6f 6e 20 22 20 22 20 24 73 6f 75 72 63 65 49  ion " " $sourceI
b1a0: 64 20 22 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  d ")\n"]..      
b1b0: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
b1c0: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
b1d0: 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a   no\n..      }..
b1e0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
b1f0: 6f 63 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74  oc checkForSQLit
b200: 65 49 6e 74 65 72 6f 70 20 7b 20 63 68 61 6e 6e  eInterop { chann
b210: 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70  el } {..      tp
b220: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d  uts $channel "--
b230: 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
b240: 53 51 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61  SQLite interop a
b250: 73 73 65 6d 62 6c 79 2e 2e 2e 20 22 0d 0a 0d 0a  ssembly... "....
b260: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
b270: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
b280: 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
b290: 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
b2a0: 63 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  c System.Data.SQ
b2b0: 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 5c 0d 0a  Lite.SQLite3 \..
b2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49 6e                In
b2d0: 74 65 72 6f 70 56 65 72 73 69 6f 6e 7d 20 76 65  teropVersion} ve
b2e0: 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65  rsion] == 0} the
b2f0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
b300: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
b310: 43 68 65 63 6b 20 69 66 20 74 68 65 20 72 65 74  Check if the ret
b320: 75 72 6e 65 64 20 76 65 72 73 69 6f 6e 20 77 61  urned version wa
b330: 73 20 6e 75 6c 6c 2e 20 20 49 66 20 73 6f 2c 20  s null.  If so, 
b340: 6d 61 6b 65 20 69 74 20 65 61 73 79 0d 0a 20 20  make it easy..  
b350: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f        #       to
b360: 20 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20   spot...        
b370: 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  #..        if {[
b380: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76  string length $v
b390: 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68  ersion] == 0} th
b3a0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
b3b0: 73 65 74 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c  set version null
b3c0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
b3d0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
b3e0: 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
b3f0: 74 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 46  t to query the F
b400: 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65  ossil source ide
b410: 6e 74 69 66 69 65 72 20 66 6f 72 20 74 68 65 20  ntifier for the 
b420: 53 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 20 20  SQLite..        
b430: 23 20 20 20 20 20 20 20 63 6f 72 65 20 6c 69 62  #       core lib
b440: 72 61 72 79 2e 0d 0a 20 20 20 20 20 20 20 20 23  rary...        #
b450: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
b460: 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
b470: 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
b480: 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
b490: 6e 50 75 62 6c 69 63 20 53 79 73 74 65 6d 2e 44  nPublic System.D
b4a0: 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74  ata.SQLite.SQLit
b4b0: 65 33 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e3 \..          
b4c0: 20 20 20 20 20 20 49 6e 74 65 72 6f 70 53 6f 75        InteropSou
b4d0: 72 63 65 49 64 7d 20 73 6f 75 72 63 65 49 64 5d  rceId} sourceId]
b4e0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
b4f0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
b500: 20 23 20 4e 4f 54 45 3a 20 57 65 20 66 61 69 6c   # NOTE: We fail
b510: 65 64 20 74 6f 20 71 75 65 72 79 20 74 68 65 20  ed to query the 
b520: 46 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64  Fossil source id
b530: 65 6e 74 69 66 69 65 72 2e 0d 0a 20 20 20 20 20  entifier...     
b540: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
b550: 20 20 73 65 74 20 73 6f 75 72 63 65 49 64 20 75    set sourceId u
b560: 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20  nknown..        
b570: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  }....        #..
b580: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
b590: 43 68 65 63 6b 20 69 66 20 74 68 65 20 72 65 74  Check if the ret
b5a0: 75 72 6e 65 64 20 46 6f 73 73 69 6c 20 73 6f 75  urned Fossil sou
b5b0: 72 63 65 20 69 64 65 6e 74 69 66 69 65 72 20 77  rce identifier w
b5c0: 61 73 20 6e 75 6c 6c 2e 20 20 49 66 0d 0a 20 20  as null.  If..  
b5d0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6f        #       so
b5e0: 2c 20 6d 61 6b 65 20 69 74 20 65 61 73 79 20 74  , make it easy t
b5f0: 6f 20 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20  o spot...       
b600: 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
b610: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
b620: 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20  sourceId] == 0} 
b630: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
b640: 20 20 73 65 74 20 73 6f 75 72 63 65 49 64 20 6e    set sourceId n
b650: 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ull..        }..
b660: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
b670: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73       # NOTE: Yes
b680: 2c 20 74 68 65 20 53 51 4c 69 74 65 20 69 6e 74  , the SQLite int
b690: 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 61 70  erop assembly ap
b6a0: 70 65 61 72 73 20 74 6f 20 62 65 20 61 76 61 69  pears to be avai
b6b0: 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  lable...        
b6c0: 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  #..        addCo
b6d0: 6e 73 74 72 61 69 6e 74 20 53 51 4c 69 74 65 49  nstraint SQLiteI
b6e0: 6e 74 65 72 6f 70 0d 0a 0d 0a 20 20 20 20 20 20  nterop....      
b6f0: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
b700: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79 65   [appendArgs "ye
b710: 73 20 28 22 20 24 76 65 72 73 69 6f 6e 20 22 20  s (" $version " 
b720: 22 20 24 73 6f 75 72 63 65 49 64 20 22 29 5c 6e  " $sourceId ")\n
b730: 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  "]..      } else
b740: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
b750: 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d  s $channel no\n.
b760: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
b770: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65  ....    proc che
b780: 63 6b 46 6f 72 53 51 4c 69 74 65 44 65 66 69 6e  ckForSQLiteDefin
b790: 65 43 6f 6e 73 74 61 6e 74 20 7b 20 63 68 61 6e  eConstant { chan
b7a0: 6e 65 6c 20 6e 61 6d 65 20 7d 20 7b 0d 0a 20 20  nel name } {..  
b7b0: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
b7c0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
b7d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d  ..          "---
b7e0: 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53  - checking for S
b7f0: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
b800: 65 20 64 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e  e define constan
b810: 74 20 5c 22 22 20 24 6e 61 6d 65 20 5c 0d 0a 20  t \"" $name \.. 
b820: 20 20 20 20 20 20 20 20 20 22 5c 22 2e 2e 2e 20           "\"... 
b830: 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  "]....      if {
b840: 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
b850: 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
b860: 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
b870: 6e 50 75 62 6c 69 63 20 53 79 73 74 65 6d 2e 44  nPublic System.D
b880: 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74  ata.SQLite.SQLit
b890: 65 33 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e3 \..          
b8a0: 20 20 20 20 44 65 66 69 6e 65 43 6f 6e 73 74 61      DefineConsta
b8b0: 6e 74 73 7d 20 64 65 66 69 6e 65 43 6f 6e 73 74  nts} defineConst
b8c0: 61 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ants] == 0} then
b8d0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
b8e0: 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74 20  [lsearch -exact 
b8f0: 2d 6e 6f 63 61 73 65 20 24 64 65 66 69 6e 65 43  -nocase $defineC
b900: 6f 6e 73 74 61 6e 74 73 20 24 6e 61 6d 65 5d 20  onstants $name] 
b910: 21 3d 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a 20  != -1} then {.. 
b920: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
b930: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65        # NOTE: Ye
b940: 73 2c 20 74 68 69 73 20 64 65 66 69 6e 65 20 63  s, this define c
b950: 6f 6e 73 74 61 6e 74 20 77 61 73 20 65 6e 61 62  onstant was enab
b960: 6c 65 64 20 77 68 65 6e 20 74 68 65 20 6d 61 6e  led when the man
b970: 61 67 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20  aged..          
b980: 23 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79  #       assembly
b990: 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 2e 0d 0a   was compiled...
b9a0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
b9b0: 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
b9c0: 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
b9d0: 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 2e   defineConstant.
b9e0: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
b9f0: 74 65 2e 20 24 6e 61 6d 65 5d 0d 0a 0d 0a 20 20  te. $name]....  
ba00: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
ba10: 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20  hannel yes\n..  
ba20: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
ba30: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
ba40: 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20  $channel no\n.. 
ba50: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
ba60: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
ba70: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
ba80: 20 65 72 72 6f 72 5c 6e 0d 0a 20 20 20 20 20 20   error\n..      
ba90: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
baa0: 20 70 72 6f 63 20 67 65 74 44 61 74 65 54 69 6d   proc getDateTim
bab0: 65 46 6f 72 6d 61 74 20 7b 7d 20 7b 0d 0a 20 20  eFormat {} {..  
bac0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
bad0: 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64  OTE: This proced
bae0: 75 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72  ure simply retur
baf0: 6e 73 20 74 68 65 20 22 64 65 66 61 75 6c 74 22  ns the "default"
bb00: 20 44 61 74 65 54 69 6d 65 20 66 6f 72 6d 61 74   DateTime format
bb10: 20 75 73 65 64 0d 0a 20 20 20 20 20 20 23 20 20   used..      #  
bb20: 20 20 20 20 20 62 79 20 74 68 65 20 74 65 73 74       by the test
bb30: 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 23   suite...      #
bb40: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
bb50: 6f 20 65 78 69 73 74 73 20 3a 3a 64 61 74 65 74  o exists ::datet
bb60: 69 6d 65 5f 66 6f 72 6d 61 74 5d 20 26 26 20 5c  ime_format] && \
bb70: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
bb80: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 64 61  ing length $::da
bb90: 74 65 74 69 6d 65 5f 66 6f 72 6d 61 74 5d 20 3e  tetime_format] >
bba0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
bbb0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
bbc0: 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68   NOTE: Return th
bbd0: 65 20 6d 61 6e 75 61 6c 6c 79 20 6f 76 65 72 72  e manually overr
bbe0: 69 64 64 65 6e 20 76 61 6c 75 65 20 66 6f 72 20  idden value for 
bbf0: 74 68 65 20 44 61 74 65 54 69 6d 65 20 66 6f 72  the DateTime for
bc00: 6d 61 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  mat...        #.
bc10: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
bc20: 24 3a 3a 64 61 74 65 74 69 6d 65 5f 66 6f 72 6d  $::datetime_form
bc30: 61 74 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  at..      } else
bc40: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
bc50: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52         # NOTE: R
bc60: 65 74 75 72 6e 20 61 6e 20 49 53 4f 38 36 30 31  eturn an ISO8601
bc70: 20 44 61 74 65 54 69 6d 65 20 66 6f 72 6d 61 74   DateTime format
bc80: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
bc90: 20 53 51 4c 69 74 65 2c 0d 0a 20 20 20 20 20 20   SQLite,..      
bca0: 20 20 23 20 20 20 20 20 20 20 53 79 73 74 65 6d    #       System
bcb0: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2c 20 61 6e  .Data.SQLite, an
bcc0: 64 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 72  d suitable for r
bcd0: 6f 75 6e 64 2d 74 72 69 70 70 69 6e 67 20 77 69  ound-tripping wi
bce0: 74 68 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  th the..        
bcf0: 23 20 20 20 20 20 20 20 44 61 74 65 54 69 6d 65  #       DateTime
bd00: 20 63 6c 61 73 73 20 6f 66 20 74 68 65 20 66 72   class of the fr
bd10: 61 6d 65 77 6f 72 6b 2e 20 20 49 66 20 74 68 69  amework.  If thi
bd20: 73 20 76 61 6c 75 65 20 69 73 20 63 68 61 6e 67  s value is chang
bd30: 65 64 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ed,..        #  
bd40: 20 20 20 20 20 76 61 72 69 6f 75 73 20 74 65 73       various tes
bd50: 74 73 20 6d 61 79 20 66 61 69 6c 2e 0d 0a 20 20  ts may fail...  
bd60: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
bd70: 20 72 65 74 75 72 6e 20 22 79 79 79 79 2d 4d 4d   return "yyyy-MM
bd80: 2d 64 64 20 48 48 3a 6d 6d 3a 73 73 2e 46 46 46  -dd HH:mm:ss.FFF
bd90: 46 46 46 46 4b 22 0d 0a 20 20 20 20 20 20 7d 0d  FFFFK"..      }.
bda0: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
bdb0: 72 6f 63 20 65 6e 75 6d 65 72 61 62 6c 65 54 6f  roc enumerableTo
bdc0: 4c 69 73 74 20 7b 20 65 6e 75 6d 65 72 61 62 6c  List { enumerabl
bdd0: 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  e } {..      set
bde0: 20 72 65 73 75 6c 74 20 5b 6c 69 73 74 5d 0d 0a   result [list]..
bdf0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
be00: 69 6e 67 20 6c 65 6e 67 74 68 20 24 65 6e 75 6d  ing length $enum
be10: 65 72 61 62 6c 65 5d 20 3d 3d 20 30 20 7c 7c 20  erable] == 0 || 
be20: 24 65 6e 75 6d 65 72 61 62 6c 65 20 65 71 20 22  $enumerable eq "
be30: 6e 75 6c 6c 22 7d 20 74 68 65 6e 20 7b 0d 0a 20  null"} then {.. 
be40: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72         return $r
be50: 65 73 75 6c 74 0d 0a 20 20 20 20 20 20 7d 0d 0a  esult..      }..
be60: 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66  ..      object f
be70: 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20 69 74  oreach -alias it
be80: 65 6d 20 24 65 6e 75 6d 65 72 61 62 6c 65 20 7b  em $enumerable {
be90: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73  ..        if {[s
bea0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 69 74  tring length $it
beb0: 65 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  em] > 0} then {.
bec0: 0a 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65  .          lappe
bed0: 6e 64 20 72 65 73 75 6c 74 20 5b 24 69 74 65 6d  nd result [$item
bee0: 20 54 6f 53 74 72 69 6e 67 5d 0d 0a 20 20 20 20   ToString]..    
bef0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
bf00: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24  ..      return $
bf10: 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c  result..    }...
bf20: 0d 0a 20 20 20 20 70 72 6f 63 20 63 61 74 63 68  ..    proc catch
bf30: 41 6e 64 52 65 74 75 72 6e 20 7b 20 73 63 72 69  AndReturn { scri
bf40: 70 74 20 7b 73 74 61 63 6b 54 72 61 63 65 20 66  pt {stackTrace f
bf50: 61 6c 73 65 7d 20 7b 73 74 72 69 63 74 20 74 72  alse} {strict tr
bf60: 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ue} } {..      #
bf70: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
bf80: 45 76 61 6c 75 61 74 65 20 74 68 65 20 73 63 72  Evaluate the scr
bf90: 69 70 74 20 70 72 6f 76 69 64 65 64 20 62 79 20  ipt provided by 
bfa0: 6f 75 72 20 63 61 6c 6c 65 72 20 69 6e 20 74 68  our caller in th
bfb0: 65 69 72 20 63 6f 6e 74 65 78 74 2c 0d 0a 20 20  eir context,..  
bfc0: 20 20 20 20 23 20 20 20 20 20 20 20 63 61 70 74      #       capt
bfd0: 75 72 69 6e 67 20 62 6f 74 68 20 74 68 65 20 72  uring both the r
bfe0: 65 73 75 6c 74 20 61 6e 64 20 74 68 65 20 72 65  esult and the re
bff0: 74 75 72 6e 20 63 6f 64 65 2e 0d 0a 20 20 20 20  turn code...    
c000: 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 63    #..      set c
c010: 6f 64 65 20 5b 63 61 74 63 68 20 7b 75 70 6c 65  ode [catch {uple
c020: 76 65 6c 20 31 20 24 73 63 72 69 70 74 7d 20 72  vel 1 $script} r
c030: 65 73 75 6c 74 5d 0d 0a 0d 0a 20 20 20 20 20 20  esult]....      
c040: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
c050: 20 44 69 64 20 74 68 65 20 73 63 72 69 70 74 20   Did the script 
c060: 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20  provided by our 
c070: 63 61 6c 6c 65 72 20 4e 4f 54 20 72 61 69 73 65  caller NOT raise
c080: 20 61 6e 20 65 72 72 6f 72 3f 0d 0a 20 20 20 20   an error?..    
c090: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24    #..      if {$
c0a0: 73 74 72 69 63 74 20 26 26 20 24 63 6f 64 65 20  strict && $code 
c0b0: 3d 3d 20 30 20 7c 7c 20 21 24 73 74 72 69 63 74  == 0 || !$strict
c0c0: 20 26 26 20 24 63 6f 64 65 20 21 3d 20 31 7d 20   && $code != 1} 
c0d0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
c0e0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
c0f0: 45 3a 20 53 75 63 63 65 73 73 2e 20 20 52 65 74  E: Success.  Ret
c100: 75 72 6e 20 61 20 6c 69 73 74 20 77 69 74 68 20  urn a list with 
c110: 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
c120: 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 2e 0d  and the result..
c130: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
c140: 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74      return [list
c150: 20 24 63 6f 64 65 20 24 72 65 73 75 6c 74 5d 0d   $code $result].
c160: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20  .      } elseif 
c170: 7b 24 73 74 61 63 6b 54 72 61 63 65 7d 20 74 68  {$stackTrace} th
c180: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
c190: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
c1a0: 20 46 61 69 6c 75 72 65 2e 20 20 4f 75 72 20 63   Failure.  Our c
c1b0: 61 6c 6c 65 72 20 77 61 6e 74 73 20 61 20 66 75  aller wants a fu
c1c0: 6c 6c 20 73 74 61 63 6b 20 74 72 61 63 65 20 28  ll stack trace (
c1d0: 69 66 20 61 70 70 6c 69 63 61 62 6c 65 29 2c 0d  if applicable),.
c1e0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
c1f0: 20 72 65 74 75 72 6e 20 61 20 6c 69 73 74 20 77   return a list w
c200: 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 20 63  ith the return c
c210: 6f 64 65 20 61 6e 64 20 74 68 65 20 72 65 73 75  ode and the resu
c220: 6c 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20  lt verbatim...  
c230: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
c240: 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 24 63   return [list $c
c250: 6f 64 65 20 24 72 65 73 75 6c 74 5d 0d 0a 20 20  ode $result]..  
c260: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
c270: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
c280: 20 23 20 4e 4f 54 45 3a 20 46 61 69 6c 75 72 65   # NOTE: Failure
c290: 2e 20 20 4f 75 72 20 63 61 6c 6c 65 72 20 64 6f  .  Our caller do
c2a0: 65 73 20 6e 6f 74 20 77 61 6e 74 20 61 20 66 75  es not want a fu
c2b0: 6c 6c 20 73 74 61 63 6b 20 74 72 61 63 65 20 28  ll stack trace (
c2c0: 69 66 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  if..        #   
c2d0: 20 20 20 20 61 70 70 6c 69 63 61 62 6c 65 29 2c      applicable),
c2e0: 20 72 65 74 75 72 6e 20 61 20 6c 69 73 74 20 77   return a list w
c2f0: 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 20 63  ith the return c
c300: 6f 64 65 2c 20 74 68 65 20 65 72 72 6f 72 0d 0a  ode, the error..
c310: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
c320: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69 6e 74  code for the int
c330: 65 72 70 72 65 74 65 72 2c 20 61 6e 64 20 74 68  erpreter, and th
c340: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
c350: 75 70 20 74 6f 20 74 68 65 0d 0a 20 20 20 20 20  up to the..     
c360: 20 20 20 23 20 20 20 20 20 20 20 70 6f 69 6e 74     #       point
c370: 20 77 68 65 72 65 20 74 68 65 20 73 74 61 63 6b   where the stack
c380: 20 74 72 61 63 65 20 73 68 6f 75 6c 64 20 73 74   trace should st
c390: 61 72 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  art...        #.
c3a0: 0a 20 20 20 20 20 20 20 20 73 65 74 20 69 6e 64  .        set ind
c3b0: 65 78 20 5b 73 74 72 69 6e 67 20 66 69 72 73 74  ex [string first
c3c0: 20 22 20 20 20 61 74 20 22 20 24 72 65 73 75 6c   "   at " $resul
c3d0: 74 5d 3b 20 23 20 48 41 43 4b 3a 20 52 65 6c 69  t]; # HACK: Reli
c3e0: 61 62 6c 65 3f 0d 0a 0d 0a 20 20 20 20 20 20 20  able?....       
c3f0: 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 24 63   return [list $c
c400: 6f 64 65 20 24 3a 3a 65 72 72 6f 72 43 6f 64 65  ode $::errorCode
c410: 20 5b 65 78 70 72 20 7b 24 69 6e 64 65 78 20 21   [expr {$index !
c420: 3d 20 2d 31 20 3f 20 5c 0d 0a 20 20 20 20 20 20  = -1 ? \..      
c430: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 74 72        [string tr
c440: 69 6d 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65  im [string range
c450: 20 24 72 65 73 75 6c 74 20 30 20 24 69 6e 64 65   $result 0 $inde
c460: 78 5d 5d 20 3a 20 24 72 65 73 75 6c 74 7d 5d 5d  x]] : $result}]]
c470: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
c480: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 6f  .....    proc co
c490: 6d 70 69 6c 65 43 53 68 61 72 70 57 69 74 68 20  mpileCSharpWith 
c4a0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
c4b0: 65 78 74 20 6d 65 6d 6f 72 79 20 73 79 6d 62 6f  ext memory symbo
c4c0: 6c 73 20 73 74 72 69 63 74 20 72 65 73 75 6c 74  ls strict result
c4d0: 73 56 61 72 4e 61 6d 65 20 65 72 72 6f 72 73 56  sVarName errorsV
c4e0: 61 72 4e 61 6d 65 20 66 69 6c 65 4e 61 6d 65 73  arName fileNames
c4f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 72  ..            ar
c500: 67 73 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  gs } {..      #.
c510: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53  .      # NOTE: S
c520: 69 6e 63 65 20 77 65 20 61 72 65 20 67 6f 69 6e  ince we are goin
c530: 67 20 74 6f 20 75 73 65 20 74 68 69 73 20 6d 65  g to use this me
c540: 74 68 6f 64 20 6e 61 6d 65 20 61 20 6c 6f 74 2c  thod name a lot,
c550: 20 61 73 73 69 67 6e 20 69 74 20 74 6f 20 61 0d   assign it to a.
c560: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76  .      #       v
c570: 61 72 69 61 62 6c 65 20 66 69 72 73 74 2e 0d 0a  ariable first...
c580: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73        #..      s
c590: 65 74 20 61 64 64 20 52 65 66 65 72 65 6e 63 65  et add Reference
c5a0: 64 41 73 73 65 6d 62 6c 69 65 73 2e 41 64 64 0d  dAssemblies.Add.
c5b0: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
c5c0: 20 20 23 20 4e 4f 54 45 3a 20 43 72 65 61 74 65    # NOTE: Create
c5d0: 20 74 68 65 20 62 61 73 65 20 63 6f 6d 6d 61 6e   the base comman
c5e0: 64 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e  d to evaluate an
c5f0: 64 20 61 64 64 20 74 68 65 20 70 72 6f 70 65 72  d add the proper
c600: 74 79 20 73 65 74 74 69 6e 67 73 0d 0a 20 20 20  ty settings..   
c610: 20 20 20 23 20 20 20 20 20 20 20 74 68 61 74 20     #       that 
c620: 61 72 65 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79  are almost alway
c630: 73 20 6e 65 65 64 65 64 20 62 79 20 6f 75 72 20  s needed by our 
c640: 75 6e 69 74 20 74 65 73 74 73 20 28 69 2e 65 2e  unit tests (i.e.
c650: 20 74 68 65 20 53 79 73 74 65 6d 0d 0a 20 20 20   the System..   
c660: 20 20 20 23 20 20 20 20 20 20 20 61 6e 64 20 53     #       and S
c670: 79 73 74 65 6d 2e 44 61 74 61 20 61 73 73 65 6d  ystem.Data assem
c680: 62 6c 79 20 72 65 66 65 72 65 6e 63 65 73 29 2e  bly references).
c690: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
c6a0: 20 73 65 74 20 63 6f 6d 6d 61 6e 64 20 5b 6c 69   set command [li
c6b0: 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  st \..          
c6c0: 63 6f 6d 70 69 6c 65 43 53 68 61 72 70 20 24 74  compileCSharp $t
c6d0: 65 78 74 20 24 6d 65 6d 6f 72 79 20 24 73 79 6d  ext $memory $sym
c6e0: 62 6f 6c 73 20 24 73 74 72 69 63 74 20 72 65 73  bols $strict res
c6f0: 75 6c 74 73 20 65 72 72 6f 72 73 20 5c 0d 0a 20  ults errors \.. 
c700: 20 20 20 20 20 20 20 20 20 24 61 64 64 20 53 79           $add Sy
c710: 73 74 65 6d 2e 64 6c 6c 20 24 61 64 64 20 53 79  stem.dll $add Sy
c720: 73 74 65 6d 2e 44 61 74 61 2e 64 6c 6c 20 24 61  stem.Data.dll $a
c730: 64 64 20 53 79 73 74 65 6d 2e 54 72 61 6e 73 61  dd System.Transa
c740: 63 74 69 6f 6e 73 2e 64 6c 6c 20 5c 0d 0a 20 20  ctions.dll \..  
c750: 20 20 20 20 20 20 20 20 24 61 64 64 20 53 79 73          $add Sys
c760: 74 65 6d 2e 58 6d 6c 2e 64 6c 6c 5d 0d 0a 0d 0a  tem.Xml.dll]....
c770: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
c780: 20 4e 4f 54 45 3a 20 41 64 64 20 61 6c 6c 20 74   NOTE: Add all t
c790: 68 65 20 70 72 6f 76 69 64 65 64 20 66 69 6c 65  he provided file
c7a0: 20 6e 61 6d 65 73 20 61 73 20 61 73 73 65 6d 62   names as assemb
c7b0: 6c 79 20 72 65 66 65 72 65 6e 63 65 73 2e 0d 0a  ly references...
c7c0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 66        #..      f
c7d0: 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
c7e0: 24 66 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  $fileNames {..  
c7f0: 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 63 6f        lappend co
c800: 6d 6d 61 6e 64 20 24 61 64 64 20 5b 67 65 74 42  mmand $add [getB
c810: 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66  inaryFileName $f
c820: 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20  ileName]..      
c830: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
c840: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20      # NOTE: Add 
c850: 74 68 65 20 65 78 74 72 61 20 61 72 67 75 6d 65  the extra argume
c860: 6e 74 73 2c 20 69 66 20 61 6e 79 2c 20 74 6f 20  nts, if any, to 
c870: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65  the command to e
c880: 76 61 6c 75 61 74 65 2e 0d 0a 20 20 20 20 20 20  valuate...      
c890: 23 0d 0a 20 20 20 20 20 20 65 76 61 6c 20 6c 61  #..      eval la
c8a0: 70 70 65 6e 64 20 63 6f 6d 6d 61 6e 64 20 24 61  ppend command $a
c8b0: 72 67 73 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  rgs....      #..
c8c0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 6c        # NOTE: Al
c8d0: 69 61 73 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  ias the compiler
c8e0: 20 6c 6f 63 61 6c 20 72 65 73 75 6c 74 73 20 61   local results a
c8f0: 6e 64 20 65 72 72 6f 72 73 20 76 61 72 69 61 62  nd errors variab
c900: 6c 65 73 20 74 6f 20 74 68 65 0d 0a 20 20 20 20  les to the..    
c910: 20 20 23 20 20 20 20 20 20 20 76 61 72 69 61 62    #       variab
c920: 6c 65 20 6e 61 6d 65 73 20 70 72 6f 76 69 64 65  le names provide
c930: 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e  d by our caller.
c940: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
c950: 20 75 70 76 61 72 20 31 20 24 72 65 73 75 6c 74   upvar 1 $result
c960: 73 56 61 72 4e 61 6d 65 20 72 65 73 75 6c 74 73  sVarName results
c970: 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20  ..      upvar 1 
c980: 24 65 72 72 6f 72 73 56 61 72 4e 61 6d 65 20 65  $errorsVarName e
c990: 72 72 6f 72 73 0d 0a 0d 0a 20 20 20 20 20 20 23  rrors....      #
c9a0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
c9b0: 45 76 61 6c 75 61 74 65 20 74 68 65 20 63 6f 6e  Evaluate the con
c9c0: 73 74 72 75 63 74 65 64 20 5b 63 6f 6d 70 69 6c  structed [compil
c9d0: 65 43 53 68 61 72 70 5d 20 63 6f 6d 6d 61 6e 64  eCSharp] command
c9e0: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0d   and return the.
c9f0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72  .      #       r
ca00: 65 73 75 6c 74 2e 0d 0a 20 20 20 20 20 20 23 0d  esult...      #.
ca10: 0a 20 20 20 20 20 20 65 76 61 6c 20 24 63 6f 6d  .      eval $com
ca20: 6d 61 6e 64 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  mand..    }.....
ca30: 20 20 20 20 70 72 6f 63 20 69 73 4d 65 6d 6f 72      proc isMemor
ca40: 79 44 62 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d  yDb { fileName }
ca50: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
ca60: 20 20 20 23 20 4e 4f 54 45 3a 20 49 73 20 74 68     # NOTE: Is th
ca70: 65 20 73 70 65 63 69 66 69 65 64 20 64 61 74 61  e specified data
ca80: 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 72  base file name r
ca90: 65 61 6c 6c 79 20 61 6e 20 69 6e 2d 6d 65 6d 6f  eally an in-memo
caa0: 72 79 20 64 61 74 61 62 61 73 65 3f 0d 0a 20 20  ry database?..  
cab0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74      #..      ret
cac0: 75 72 6e 20 5b 65 78 70 72 20 7b 24 66 69 6c 65  urn [expr {$file
cad0: 4e 61 6d 65 20 65 71 20 22 3a 6d 65 6d 6f 72 79  Name eq ":memory
cae0: 3a 22 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20  :" || \..       
caf0: 20 20 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65     [string range
cb00: 20 24 66 69 6c 65 4e 61 6d 65 20 30 20 31 32 5d   $fileName 0 12]
cb10: 20 65 71 20 22 66 69 6c 65 3a 3a 6d 65 6d 6f 72   eq "file::memor
cb20: 79 3a 22 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  y:"}]..    }....
cb30: 0a 20 20 20 20 70 72 6f 63 20 69 73 54 61 62 6c  .    proc isTabl
cb40: 65 49 6e 44 62 20 7b 20 6e 61 6d 65 20 7b 76 61  eInDb { name {va
cb50: 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a 20  rName db} } {.. 
cb60: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
cb70: 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74  NOTE: Refer to t
cb80: 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72  he specified var
cb90: 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22  iable (e.g. "db"
cba0: 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74  ) in the context
cbb0: 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23   of our..      #
cbc0: 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20 20         caller.  
cbd0: 49 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  It contains the 
cbe0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
cbf0: 69 6f 6e 20 68 61 6e 64 6c 65 20 74 68 61 74 20  ion handle that 
cc00: 77 69 6c 6c 20 62 65 0d 0a 20 20 20 20 20 20 23  will be..      #
cc10: 20 20 20 20 20 20 20 75 73 65 64 20 74 6f 20 65         used to e
cc20: 78 65 63 75 74 65 20 74 68 65 20 71 75 65 72 79  xecute the query
cc30: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
cc40: 6e 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  ne if the named 
cc50: 74 61 62 6c 65 20 69 73 0d 0a 20 20 20 20 20 20  table is..      
cc60: 23 20 20 20 20 20 20 20 70 72 65 73 65 6e 74 20  #       present 
cc70: 69 6e 20 74 68 61 74 20 64 61 74 61 62 61 73 65  in that database
cc80: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
cc90: 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
cca0: 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23  me db....      #
ccb0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
ccc0: 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  Use the sqlite_m
ccd0: 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f 20 64  aster table to d
cce0: 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
ccf0: 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73 0d 0a  named table is..
cd00: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 72        #       pr
cd10: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74  esent in the dat
cd20: 61 62 61 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d  abase...      #.
cd30: 0a 20 20 20 20 20 20 73 65 74 20 73 71 6c 20 7b  .      set sql {
cd40: 0d 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  ..        SELECT
cd50: 20 43 4f 55 4e 54 28 2a 29 20 46 52 4f 4d 20 73   COUNT(*) FROM s
cd60: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45  qlite_master WHE
cd70: 52 45 20 74 79 70 65 20 3d 20 27 74 61 62 6c 65  RE type = 'table
cd80: 27 20 41 4e 44 20 6e 61 6d 65 20 3d 20 3f 3b 0d  ' AND name = ?;.
cd90: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
cda0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
cdb0: 45 3a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  E: Return non-ze
cdc0: 72 6f 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  ro if the named 
cdd0: 74 61 62 6c 65 20 69 73 20 70 72 65 73 65 6e 74  table is present
cde0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
cdf0: 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b    return [expr {
ce00: 0d 0a 20 20 20 20 20 20 20 20 5b 73 71 6c 20 65  ..        [sql e
ce10: 78 65 63 75 74 65 20 2d 65 78 65 63 75 74 65 20  xecute -execute 
ce20: 73 63 61 6c 61 72 20 24 64 62 20 24 73 71 6c 20  scalar $db $sql 
ce30: 5b 6c 69 73 74 20 70 61 72 61 6d 31 20 53 74 72  [list param1 Str
ce40: 69 6e 67 20 24 6e 61 6d 65 5d 5d 20 3e 20 30 0d  ing $name]] > 0.
ce50: 0a 20 20 20 20 20 20 7d 5d 0d 0a 20 20 20 20 7d  .      }]..    }
ce60: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72  .....    proc tr
ce70: 69 6d 53 71 6c 20 7b 20 73 71 6c 20 7d 20 7b 0d  imSql { sql } {.
ce80: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 72  .      return [r
ce90: 65 67 73 75 62 20 2d 61 6c 6c 20 2d 2d 20 7b 5c  egsub -all -- {\
cea0: 73 2b 7d 20 5b 73 74 72 69 6e 67 20 74 72 69 6d  s+} [string trim
ceb0: 20 24 73 71 6c 5d 20 22 20 22 5d 0d 0a 20 20 20   $sql] " "]..   
cec0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
ced0: 65 78 65 63 75 74 65 53 71 6c 20 7b 20 73 71 6c  executeSql { sql
cee0: 20 7b 65 78 65 63 75 74 65 20 6e 6f 6e 65 7d 20   {execute none} 
cef0: 7b 66 6f 72 6d 61 74 20 6e 6f 6e 65 7d 20 7b 66  {format none} {f
cf00: 69 6c 65 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d  ileName ""} } {.
cf10: 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
cf20: 6e 67 20 6c 65 6e 67 74 68 20 24 66 69 6c 65 4e  ng length $fileN
cf30: 61 6d 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ame] == 0} then 
cf40: 7b 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 3a 6d  {set fileName :m
cf50: 65 6d 6f 72 79 3a 7d 0d 0a 20 20 20 20 20 20 73  emory:}..      s
cf60: 65 74 75 70 44 62 20 24 66 69 6c 65 4e 61 6d 65  etupDb $fileName
cf70: 20 22 22 20 22 22 20 22 22 20 22 22 20 22 22 20   "" "" "" "" "" 
cf80: 66 61 6c 73 65 20 66 61 6c 73 65 20 66 61 6c 73  false false fals
cf90: 65 20 66 61 6c 73 65 20 64 62 20 74 72 75 65 0d  e false db true.
cfa0: 0a 0d 0a 20 20 20 20 20 20 74 72 79 20 7b 0d 0a  ...      try {..
cfb0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
cfc0: 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20  uplevel 1 [list 
cfd0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  \..            s
cfe0: 71 6c 20 65 78 65 63 75 74 65 20 2d 65 78 65 63  ql execute -exec
cff0: 75 74 65 20 24 65 78 65 63 75 74 65 20 2d 66 6f  ute $execute -fo
d000: 72 6d 61 74 20 24 66 6f 72 6d 61 74 20 24 64 62  rmat $format $db
d010: 20 24 73 71 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d   $sql]]..      }
d020: 20 66 69 6e 61 6c 6c 79 20 7b 0d 0a 20 20 20 20   finally {..    
d030: 20 20 20 20 63 6c 65 61 6e 75 70 44 62 20 24 66      cleanupDb $f
d040: 69 6c 65 4e 61 6d 65 20 64 62 20 66 61 6c 73 65  ileName db false
d050: 20 66 61 6c 73 65 20 66 61 6c 73 65 0d 0a 20 20   false false..  
d060: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
d070: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 43 6f 6e  .    proc getCon
d080: 6e 65 63 74 69 6f 6e 46 6c 61 67 73 20 7b 20 66  nectionFlags { f
d090: 69 6c 65 4e 61 6d 65 20 66 6c 61 67 73 20 7b 71  ileName flags {q
d0a0: 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  uiet false} } {.
d0b0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
d0c0: 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f  # NOTE: Figure o
d0d0: 75 74 20 77 68 69 63 68 20 64 61 74 61 62 61 73  ut which databas
d0e0: 65 20 66 69 6c 65 20 6e 61 6d 65 20 6f 72 20 63  e file name or c
d0f0: 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67  onnection string
d100: 20 74 68 65 73 65 0d 0a 20 20 20 20 20 20 23 20   these..      # 
d110: 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e        connection
d120: 20 66 6c 61 67 73 20 77 69 6c 6c 20 61 63 74 75   flags will actu
d130: 61 6c 6c 79 20 61 70 70 6c 79 20 74 6f 2e 20 20  ally apply to.  
d140: 54 68 69 73 20 69 73 20 6e 6f 74 20 6e 65 63 65  This is not nece
d150: 73 73 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20  ssary..      #  
d160: 20 20 20 20 20 69 6e 20 71 75 69 65 74 20 6d 6f       in quiet mo
d170: 64 65 20 62 65 63 61 75 73 65 20 74 68 69 73 20  de because this 
d180: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6f  information is o
d190: 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 67  nly used for log
d1a0: 67 69 6e 67 0d 0a 20 20 20 20 20 20 23 20 20 20  ging..      #   
d1b0: 20 20 20 20 61 6e 64 20 72 65 70 6f 72 74 69 6e      and reportin
d1c0: 67 20 70 75 72 70 6f 73 65 73 2e 0d 0a 20 20 20  g purposes...   
d1d0: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
d1e0: 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
d1f0: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74  .        if {[st
d200: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 69 6c  ring length $fil
d210: 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e  eName] > 0} then
d220: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
d230: 74 20 64 61 74 61 62 61 73 65 20 5b 61 70 70 65  t database [appe
d240: 6e 64 41 72 67 73 20 22 66 69 6c 65 20 6e 61 6d  ndArgs "file nam
d250: 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20  e \"" $fileName 
d260: 5c 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65  \"]..        } e
d270: 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69  lseif {[info exi
d280: 73 74 73 20 3a 3a 64 61 74 61 53 6f 75 72 63 65  sts ::dataSource
d290: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
d2a0: 20 20 20 20 21 5b 61 72 72 61 79 20 65 78 69 73      ![array exis
d2b0: 74 73 20 3a 3a 64 61 74 61 53 6f 75 72 63 65 5d  ts ::dataSource]
d2c0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
d2d0: 20 20 20 20 73 65 74 20 64 61 74 61 62 61 73 65      set database
d2e0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 64 61   [appendArgs "da
d2f0: 74 61 20 73 6f 75 72 63 65 20 5c 22 22 20 24 3a  ta source \"" $:
d300: 3a 64 61 74 61 53 6f 75 72 63 65 20 5c 22 5d 0d  :dataSource \"].
d310: 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
d320: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
d330: 20 64 61 74 61 62 61 73 65 20 3c 75 6e 6b 6e 6f   database <unkno
d340: 77 6e 3e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  wn>..        }..
d350: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
d360: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
d370: 3a 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f 67 29  : Show (and log)
d380: 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65   the local conne
d390: 63 74 69 6f 6e 20 66 6c 61 67 73 20 61 6e 64 20  ction flags and 
d3a0: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0d 0a  the associated..
d3b0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 61        #       da
d3c0: 74 61 20 73 6f 75 72 63 65 20 6f 72 20 66 69 6c  ta source or fil
d3d0: 65 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20 23  e name...      #
d3e0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71 75  ..      if {!$qu
d3f0: 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
d400: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
d410: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
d420: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
d430: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 6f 63 61        "---- loca
d440: 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61  l connection fla
d450: 67 73 20 66 6f 72 20 22 20 24 64 61 74 61 62 61  gs for " $databa
d460: 73 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  se \..          
d470: 20 20 22 20 61 72 65 3a 20 22 20 5b 65 78 70 72    " are: " [expr
d480: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
d490: 20 24 66 6c 61 67 73 5d 20 3e 20 30 20 3f 20 5c   $flags] > 0 ? \
d4a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 61  ..            [a
d4b0: 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24 66 6c  ppendArgs \" $fl
d4c0: 61 67 73 20 5c 22 5d 20 3a 20 22 3c 6e 6f 6e 65  ags \"] : "<none
d4d0: 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  >"}] \n]..      
d4e0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
d4f0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74      # NOTE: If t
d500: 68 65 72 65 20 61 72 65 20 61 6e 79 20 67 6c 6f  here are any glo
d510: 62 61 6c 20 28 70 65 72 20 74 65 73 74 20 72 75  bal (per test ru
d520: 6e 29 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c  n) connection fl
d530: 61 67 73 20 63 75 72 72 65 6e 74 6c 79 0d 0a 20  ags currently.. 
d540: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 65 74       #       set
d550: 2c 20 75 73 65 20 74 68 65 6d 20 6e 6f 77 20 28  , use them now (
d560: 69 2e 65 2e 20 62 79 20 63 6f 6d 62 69 6e 69 6e  i.e. by combinin
d570: 67 20 74 68 65 6d 20 77 69 74 68 20 74 68 65 20  g them with the 
d580: 6f 6e 65 73 20 66 6f 72 20 74 68 69 73 0d 0a 20  ones for this.. 
d590: 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e       #       con
d5a0: 6e 65 63 74 69 6f 6e 29 2e 0d 0a 20 20 20 20 20  nection)...     
d5b0: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
d5c0: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f 6e  nfo exists ::con
d5d0: 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73 5d 20 26  nection_flags] &
d5e0: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
d5f0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
d600: 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67  :connection_flag
d610: 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  s] > 0} then {..
d620: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
d630: 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20     # NOTE: Show 
d640: 28 61 6e 64 20 6c 6f 67 29 20 74 68 65 20 64 65  (and log) the de
d650: 74 65 63 74 65 64 20 67 6c 6f 62 61 6c 20 63 6f  tected global co
d660: 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 2e 0d  nnection flags..
d670: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
d680: 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
d690: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
d6a0: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
d6b0: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
d6c0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
d6d0: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 67 6c 6f 62        "---- glob
d6e0: 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c  al connection fl
d6f0: 61 67 73 20 64 65 74 65 63 74 65 64 3a 20 22 20  ags detected: " 
d700: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
d710: 20 5b 65 78 70 72 20 7b 5b 69 6e 66 6f 20 65 78   [expr {[info ex
d720: 69 73 74 73 20 3a 3a 63 6f 6e 6e 65 63 74 69 6f  ists ::connectio
d730: 6e 5f 66 6c 61 67 73 5d 20 26 26 20 5c 0d 0a 20  n_flags] && \.. 
d740: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74               [st
d750: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 63  ring length $::c
d760: 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73 5d  onnection_flags]
d770: 20 3e 20 30 20 3f 20 5c 0d 0a 20 20 20 20 20 20   > 0 ? \..      
d780: 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41          [appendA
d790: 72 67 73 20 5c 22 20 24 3a 3a 63 6f 6e 6e 65 63  rgs \" $::connec
d7a0: 74 69 6f 6e 5f 66 6c 61 67 73 20 5c 22 5d 20 3a  tion_flags \"] :
d7b0: 20 22 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d   "<none>"}] \n].
d7c0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
d7d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
d7e0: 20 23 20 4e 4f 54 45 3a 20 43 6f 6d 62 69 6e 65   # NOTE: Combine
d7f0: 20 61 6e 64 2f 6f 72 20 72 65 70 6c 61 63 65 20   and/or replace 
d800: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  the connection f
d810: 6c 61 67 73 20 61 6e 64 20 74 68 65 6e 20 73 68  lags and then sh
d820: 6f 77 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  ow the..        
d830: 23 20 20 20 20 20 20 20 6e 65 77 20 76 61 6c 75  #       new valu
d840: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
d850: 20 20 20 20 20 20 20 73 65 74 20 66 6c 61 67 73         set flags
d860: 20 5b 63 6f 6d 62 69 6e 65 46 6c 61 67 73 20 24   [combineFlags $
d870: 66 6c 61 67 73 20 24 3a 3a 63 6f 6e 6e 65 63 74  flags $::connect
d880: 69 6f 6e 5f 66 6c 61 67 73 5d 0d 0a 0d 0a 20 20  ion_flags]....  
d890: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
d8a0: 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 28 61   # NOTE: Show (a
d8b0: 6e 64 20 6c 6f 67 29 20 74 68 65 20 6e 65 77 20  nd log) the new 
d8c0: 65 66 66 65 63 74 69 76 65 20 63 6f 6e 6e 65 63  effective connec
d8d0: 74 69 6f 6e 20 66 6c 61 67 73 2e 0d 0a 20 20 20  tion flags...   
d8e0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
d8f0: 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
d900: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
d910: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
d920: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
d930: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
d940: 20 20 22 2d 2d 2d 2d 20 63 6f 6d 62 69 6e 65 64    "---- combined
d950: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67   connection flag
d960: 73 20 66 6f 72 20 22 20 24 64 61 74 61 62 61 73  s for " $databas
d970: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
d980: 20 20 20 22 20 61 72 65 3a 20 22 20 5b 65 78 70     " are: " [exp
d990: 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  r {[string lengt
d9a0: 68 20 24 66 6c 61 67 73 5d 20 3e 20 30 20 3f 20  h $flags] > 0 ? 
d9b0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
d9c0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20   [appendArgs \" 
d9d0: 24 66 6c 61 67 73 20 5c 22 5d 20 3a 20 22 3c 6e  $flags \"] : "<n
d9e0: 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20 20 20  one>"}] \n]..   
d9f0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
da00: 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
da10: 24 66 6c 61 67 73 0d 0a 20 20 20 20 7d 0d 0a 0c  $flags..    }...
da20: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 46 6c  ..    proc getFl
da30: 61 67 73 50 72 6f 70 65 72 74 79 20 7b 20 7b 66  agsProperty { {f
da40: 6c 61 67 73 20 22 22 7d 20 7b 71 75 69 65 74 20  lags ""} {quiet 
da50: 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20  false} } {..    
da60: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
da70: 45 3a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 61  E: Determine wha
da80: 74 20 74 68 65 20 63 6f 6d 62 69 6e 65 64 20 28  t the combined (
da90: 67 6c 6f 62 61 6c 20 61 6e 64 20 6c 6f 63 61 6c  global and local
daa0: 29 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20  ) connection..  
dab0: 20 20 20 20 23 20 20 20 20 20 20 20 66 6c 61 67      #       flag
dac0: 73 20 73 68 6f 75 6c 64 20 62 65 2c 20 70 6f 73  s should be, pos
dad0: 73 69 62 6c 79 20 71 75 69 65 74 6c 79 2e 0d 0a  sibly quietly...
dae0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73        #..      s
daf0: 65 74 20 66 6c 61 67 73 20 5b 67 65 74 43 6f 6e  et flags [getCon
db00: 6e 65 63 74 69 6f 6e 46 6c 61 67 73 20 22 22 20  nectionFlags "" 
db10: 24 66 6c 61 67 73 20 24 71 75 69 65 74 5d 0d 0a  $flags $quiet]..
db20: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
db30: 20 23 20 4e 4f 54 45 3a 20 49 66 20 6e 6f 20 67   # NOTE: If no g
db40: 6c 6f 62 61 6c 20 6f 72 20 6c 6f 63 61 6c 20 63  lobal or local c
db50: 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20  onnection flags 
db60: 77 65 72 65 20 73 70 65 63 69 66 69 65 64 2c 20  were specified, 
db70: 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
db80: 20 20 20 64 65 66 61 75 6c 74 20 63 6f 6e 6e 65     default conne
db90: 63 74 69 6f 6e 20 66 6c 61 67 73 20 73 68 6f 75  ction flags shou
dba0: 6c 64 20 62 65 20 75 73 65 64 3b 20 74 68 65 72  ld be used; ther
dbb0: 65 66 6f 72 65 2c 20 72 65 74 75 72 6e 0d 0a 20  efore, return.. 
dbc0: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6e 20       #       an 
dbd0: 65 6d 70 74 79 20 73 74 72 69 6e 67 20 69 6e 20  empty string in 
dbe0: 74 68 61 74 20 63 61 73 65 2e 0d 0a 20 20 20 20  that case...    
dbf0: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
dc00: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66  string length $f
dc10: 6c 61 67 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  lags] == 0} then
dc20: 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
dc30: 72 6e 20 22 22 0d 0a 20 20 20 20 20 20 7d 0d 0a  rn ""..      }..
dc40: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
dc50: 20 23 20 4e 4f 54 45 3a 20 49 6e 20 6f 72 64 65   # NOTE: In orde
dc60: 72 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68  r to check if th
dc70: 65 20 64 65 66 61 75 6c 74 20 63 6f 6e 6e 65 63  e default connec
dc80: 74 69 6f 6e 20 66 6c 61 67 73 20 61 72 65 20 62  tion flags are b
dc90: 65 69 6e 67 20 75 73 65 64 0d 0a 20 20 20 20 20  eing used..     
dca0: 20 23 20 20 20 20 20 20 20 69 74 20 69 73 20 6e   #       it is n
dcb0: 65 63 65 73 73 61 72 79 20 74 6f 20 61 74 74 65  ecessary to atte
dcc0: 6d 70 74 20 61 20 63 6f 6e 76 65 72 73 69 6f 6e  mpt a conversion
dcd0: 20 74 6f 20 74 68 65 20 61 63 74 75 61 6c 20 65   to the actual e
dce0: 6e 75 6d 65 72 61 74 65 64 0d 0a 20 20 20 20 20  numerated..     
dcf0: 20 23 20 20 20 20 20 20 20 74 79 70 65 2e 20 20   #       type.  
dd00: 46 61 69 6c 69 6e 67 20 74 68 61 74 2c 20 74 68  Failing that, th
dd10: 65 20 63 68 65 63 6b 20 61 67 61 69 6e 73 74 20  e check against 
dd20: 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  the default valu
dd30: 65 20 77 69 6c 6c 20 62 65 0d 0a 20 20 20 20 20  e will be..     
dd40: 20 23 20 20 20 20 20 20 20 73 6b 69 70 70 65 64   #       skipped
dd50: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
dd60: 20 20 73 65 74 20 65 72 72 6f 72 20 6e 75 6c 6c    set error null
dd70: 3b 20 23 20 49 47 4e 4f 52 45 44 0d 0a 20 20 20  ; # IGNORED..   
dd80: 20 20 20 73 65 74 20 76 61 6c 75 65 20 5b 6f 62     set value [ob
dd90: 6a 65 63 74 20 69 6e 76 6f 6b 65 20 55 74 69 6c  ject invoke Util
dda0: 69 74 79 20 54 72 79 50 61 72 73 65 46 6c 61 67  ity TryParseFlag
ddb0: 73 45 6e 75 6d 20 22 22 20 5c 0d 0a 20 20 20 20  sEnum "" \..    
ddc0: 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
ddd0: 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 43  a.SQLite.SQLiteC
dde0: 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 20 22  onnectionFlags "
ddf0: 22 20 24 66 6c 61 67 73 20 6e 75 6c 6c 20 74 72  " $flags null tr
de00: 75 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ue \..          
de10: 65 72 72 6f 72 5d 0d 0a 0d 0a 20 20 20 20 20 20  error]....      
de20: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
de30: 20 49 66 20 74 68 65 20 63 6f 6d 62 69 6e 65 64   If the combined
de40: 20 66 6c 61 67 73 20 73 74 72 69 6e 67 20 63 6f   flags string co
de50: 75 6c 64 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  uld not actually
de60: 20 62 65 20 63 6f 6e 76 65 72 74 65 64 0d 0a 20   be converted.. 
de70: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20       #       to 
de80: 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64 20 74  the enumerated t
de90: 79 70 65 20 69 74 20 69 73 20 74 68 65 20 64 65  ype it is the de
dea0: 66 61 75 6c 74 20 76 61 6c 75 65 2c 20 74 68 65  fault value, the
deb0: 6e 20 6a 75 73 74 20 75 73 65 0d 0a 20 20 20 20  n just use..    
dec0: 20 20 23 20 20 20 20 20 20 20 69 74 20 76 65 72    #       it ver
ded0: 62 61 74 69 6d 3b 20 6f 74 68 65 72 77 69 73 65  batim; otherwise
dee0: 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20 61 6e  , just return an
def0: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 20   empty string.  
df00: 49 6e 20 74 68 61 74 0d 0a 20 20 20 20 20 20 23  In that..      #
df10: 20 20 20 20 20 20 20 63 61 73 65 2c 20 74 68 65         case, the
df20: 20 64 65 66 61 75 6c 74 20 63 6f 6e 6e 65 63 74   default connect
df30: 69 6f 6e 20 66 6c 61 67 73 20 77 69 6c 6c 20 62  ion flags will b
df40: 65 20 75 73 65 64 2e 0d 0a 20 20 20 20 20 20 23  e used...      #
df50: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
df60: 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 6c 75  ing length $valu
df70: 65 5d 20 3d 3d 20 30 20 7c 7c 20 24 76 61 6c 75  e] == 0 || $valu
df80: 65 20 6e 65 20 22 44 65 66 61 75 6c 74 22 7d 20  e ne "Default"} 
df90: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
dfa0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 57 41 52  #..        # WAR
dfb0: 4e 49 4e 47 3a 20 54 68 69 73 20 72 65 74 75 72  NING: This retur
dfc0: 6e 73 20 74 68 65 20 73 74 72 69 6e 67 20 76 61  ns the string va
dfd0: 6c 75 65 20 6f 66 20 74 68 65 20 63 6f 6d 62 69  lue of the combi
dfe0: 6e 65 64 20 66 6c 61 67 73 2c 20 6e 6f 74 0d 0a  ned flags, not..
dff0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
e000: 20 20 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65     the enumerate
e010: 64 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20 69  d value.  This i
e020: 73 20 62 79 20 64 65 73 69 67 6e 20 61 6e 64 20  s by design and 
e030: 73 68 6f 75 6c 64 20 6e 6f 74 0d 0a 20 20 20 20  should not..    
e040: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 62      #          b
e050: 65 20 63 68 61 6e 67 65 64 20 77 69 74 68 6f 75  e changed withou
e060: 74 20 63 61 72 65 66 75 6c 20 63 6f 6e 73 69 64  t careful consid
e070: 65 72 61 74 69 6f 6e 20 28 65 2e 67 2e 20 69 74  eration (e.g. it
e080: 20 77 6f 75 6c 64 0d 0a 20 20 20 20 20 20 20 20   would..        
e090: 23 20 20 20 20 20 20 20 20 20 20 70 72 65 76 65  #          preve
e0a0: 6e 74 20 74 68 65 20 53 51 4c 69 74 65 43 6f 6e  nt the SQLiteCon
e0b0: 6e 65 63 74 69 6f 6e 20 63 6c 61 73 73 20 66 72  nection class fr
e0c0: 6f 6d 20 61 6c 6c 6f 77 69 6e 67 20 69 6e 76 61  om allowing inva
e0d0: 6c 69 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20  lid..        #  
e0e0: 20 20 20 20 20 20 20 20 5b 22 6d 61 67 69 63 61          ["magica
e0f0: 6c 22 5d 20 6d 65 74 61 2d 66 6c 61 67 73 29 2e  l"] meta-flags).
e100: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
e110: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 61 70 70       return [app
e120: 65 6e 64 41 72 67 73 20 22 46 6c 61 67 73 3d 22  endArgs "Flags="
e130: 20 24 66 6c 61 67 73 20 5c 3b 5d 0d 0a 20 20 20   $flags \;]..   
e140: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
e150: 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 7d 0d 0a  turn ""..    }..
e160: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 65 74 75  ...    proc setu
e170: 70 44 62 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  pDb {..         
e180: 20 20 20 66 69 6c 65 4e 61 6d 65 20 7b 6d 6f 64     fileName {mod
e190: 65 20 22 22 7d 20 7b 64 61 74 65 54 69 6d 65 46  e ""} {dateTimeF
e1a0: 6f 72 6d 61 74 20 22 22 7d 20 7b 64 61 74 65 54  ormat ""} {dateT
e1b0: 69 6d 65 4b 69 6e 64 20 22 22 7d 20 7b 66 6c 61  imeKind ""} {fla
e1c0: 67 73 20 22 22 7d 0d 0a 20 20 20 20 20 20 20 20  gs ""}..        
e1d0: 20 20 20 20 7b 65 78 74 72 61 20 22 22 7d 20 7b      {extra ""} {
e1e0: 71 75 61 6c 69 66 79 20 74 72 75 65 7d 20 7b 64  qualify true} {d
e1f0: 65 6c 65 74 65 20 74 72 75 65 7d 20 7b 75 72 69  elete true} {uri
e200: 20 66 61 6c 73 65 7d 0d 0a 20 20 20 20 20 20 20   false}..       
e210: 20 20 20 20 20 7b 74 65 6d 70 6f 72 61 72 79 20       {temporary 
e220: 74 72 75 65 7d 20 7b 76 61 72 4e 61 6d 65 20 64  true} {varName d
e230: 62 7d 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d  b} {quiet false}
e240: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
e250: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 72       # NOTE: Fir
e260: 73 74 2c 20 73 65 65 20 69 66 20 6f 75 72 20 63  st, see if our c
e270: 61 6c 6c 65 72 20 68 61 73 20 72 65 71 75 65 73  aller has reques
e280: 74 65 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ted an in-memory
e290: 20 64 61 74 61 62 61 73 65 2e 0d 0a 20 20 20 20   database...    
e2a0: 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 69    #..      set i
e2b0: 73 4d 65 6d 6f 72 79 20 5b 69 73 4d 65 6d 6f 72  sMemory [isMemor
e2c0: 79 44 62 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a  yDb $fileName]..
e2d0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
e2e0: 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 6e 6f 77   # NOTE: For now
e2f0: 2c 20 61 6c 6c 20 74 65 73 74 20 64 61 74 61 62  , all test datab
e300: 61 73 65 73 20 75 73 65 64 20 62 79 20 74 68 65  ases used by the
e310: 20 74 65 73 74 20 73 75 69 74 65 20 61 72 65 20   test suite are 
e320: 70 6c 61 63 65 64 0d 0a 20 20 20 20 20 20 23 20  placed..      # 
e330: 20 20 20 20 20 20 69 6e 74 6f 20 74 68 65 20 64        into the d
e340: 61 74 61 62 61 73 65 20 64 69 72 65 63 74 6f 72  atabase director
e350: 79 2e 20 20 45 61 63 68 20 64 61 74 61 62 61 73  y.  Each databas
e360: 65 20 61 6e 64 20 72 65 6c 61 74 65 64 20 66 69  e and related fi
e370: 6c 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20  les..      #    
e380: 20 20 20 75 73 65 64 20 62 79 20 61 20 74 65 73     used by a tes
e390: 74 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 65 61  t should be clea
e3a0: 6e 65 64 20 75 70 20 62 79 20 74 68 61 74 20 74  ned up by that t
e3b0: 65 73 74 20 75 73 69 6e 67 20 74 68 65 0d 0a 20  est using the.. 
e3c0: 20 20 20 20 20 23 20 20 20 20 20 20 20 22 63 6c       #       "cl
e3d0: 65 61 6e 75 70 44 62 22 20 70 72 6f 63 65 64 75  eanupDb" procedu
e3e0: 72 65 2c 20 62 65 6c 6f 77 2e 0d 0a 20 20 20 20  re, below...    
e3f0: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21    #..      if {!
e400: 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24 71 75  $isMemory && $qu
e410: 61 6c 69 66 79 7d 20 74 68 65 6e 20 7b 0d 0a 20  alify} then {.. 
e420: 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e         set fileN
e430: 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b  ame [file join [
e440: 67 65 74 44 61 74 61 62 61 73 65 44 69 72 65 63  getDatabaseDirec
e450: 74 6f 72 79 5d 20 5b 66 69 6c 65 20 74 61 69 6c  tory] [file tail
e460: 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20   $fileName]]..  
e470: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
e480: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
e490: 42 79 20 64 65 66 61 75 6c 74 2c 20 64 65 6c 65  By default, dele
e4a0: 74 65 20 61 6e 79 20 70 72 65 2d 65 78 69 73 74  te any pre-exist
e4b0: 69 6e 67 20 64 61 74 61 62 61 73 65 20 77 69 74  ing database wit
e4c0: 68 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 0d  h the same file.
e4d0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e  .      #       n
e4e0: 61 6d 65 20 69 66 20 69 74 20 63 75 72 72 65 6e  ame if it curren
e4f0: 74 6c 79 20 65 78 69 73 74 73 2e 0d 0a 20 20 20  tly exists...   
e500: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
e510: 21 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24 64  !$isMemory && $d
e520: 65 6c 65 74 65 20 26 26 20 5b 66 69 6c 65 20 65  elete && [file e
e530: 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d  xists $fileName]
e540: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
e550: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
e560: 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20  OTE: Attempt to 
e570: 64 65 6c 65 74 65 20 61 6e 79 20 70 72 65 2d 65  delete any pre-e
e580: 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65  xisting database
e590: 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 66   with the same f
e5a0: 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ile..        #  
e5b0: 20 20 20 20 20 6e 61 6d 65 2e 0d 0a 20 20 20 20       name...    
e5c0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
e5d0: 66 20 7b 5b 63 61 74 63 68 20 7b 66 69 6c 65 20  f {[catch {file 
e5e0: 64 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65  delete $fileName
e5f0: 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b  } error]} then {
e600: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
e610: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
e620: 20 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c   We somehow fail
e630: 65 64 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  ed to delete the
e640: 20 66 69 6c 65 2c 20 72 65 70 6f 72 74 20 77 68   file, report wh
e650: 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  y...          #.
e660: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
e670: 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
e680: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
e690: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
e6a0: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
e6b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e6c0: 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
e6d0: 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65  failed to delete
e6e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 5c   database file \
e6f0: 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a  "" $fileName \..
e700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e710: 22 5c 22 20 64 75 72 69 6e 67 20 73 65 74 75 70  "\" during setup
e720: 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  , error: " \n\t 
e730: 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20  $error \n]..    
e740: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
e750: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
e760: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
e770: 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74  NOTE: Refer to t
e780: 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72  he specified var
e790: 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22  iable (e.g. "db"
e7a0: 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74  ) in the context
e7b0: 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23   of our..      #
e7c0: 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20 20         caller.  
e7d0: 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 74 68  The handle to th
e7e0: 65 20 6f 70 65 6e 65 64 20 64 61 74 61 62 61 73  e opened databas
e7f0: 65 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64  e will be stored
e800: 20 74 68 65 72 65 2e 0d 0a 20 20 20 20 20 20 23   there...      #
e810: 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20  ..      upvar 1 
e820: 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20  $varName db.... 
e830: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
e840: 4e 4f 54 45 3a 20 53 74 61 72 74 20 62 75 69 6c  NOTE: Start buil
e850: 64 69 6e 67 20 74 68 65 20 63 6f 6e 6e 65 63 74  ding the connect
e860: 69 6f 6e 20 73 74 72 69 6e 67 2e 20 20 54 68 65  ion string.  The
e870: 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 64 20 70   only required p
e880: 6f 72 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20  ortion..      # 
e890: 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6e        of the con
e8a0: 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 69  nection string i
e8b0: 73 20 74 68 65 20 64 61 74 61 20 73 6f 75 72 63  s the data sourc
e8c0: 65 2c 20 77 68 69 63 68 20 63 6f 6e 74 61 69 6e  e, which contain
e8d0: 73 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  s the..      #  
e8e0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
e8f0: 6c 65 20 6e 61 6d 65 20 69 74 73 65 6c 66 2e 20  le name itself. 
e900: 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 77   If our caller w
e910: 61 6e 74 73 20 74 6f 20 75 73 65 20 61 20 55 52  ants to use a UR
e920: 49 20 61 73 0d 0a 20 20 20 20 20 20 23 20 20 20  I as..      #   
e930: 20 20 20 20 74 68 65 20 64 61 74 61 20 73 6f 75      the data sou
e940: 72 63 65 2c 20 75 73 65 20 74 68 65 20 46 75 6c  rce, use the Ful
e950: 6c 55 72 69 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  lUri connection 
e960: 73 74 72 69 6e 67 20 70 72 6f 70 65 72 74 79 20  string property 
e970: 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  to..      #     
e980: 20 20 70 72 65 76 65 6e 74 20 74 68 65 20 64 61    prevent the da
e990: 74 61 20 73 6f 75 72 63 65 20 73 74 72 69 6e 67  ta source string
e9a0: 20 66 72 6f 6d 20 62 65 69 6e 67 20 6d 61 6e 67   from being mang
e9b0: 6c 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  led...      #.. 
e9c0: 20 20 20 20 20 69 66 20 7b 24 75 72 69 7d 20 74       if {$uri} t
e9d0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  hen {..        s
e9e0: 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 46  et connection {F
e9f0: 75 6c 6c 55 72 69 3d 24 7b 66 69 6c 65 4e 61 6d  ullUri=${fileNam
ea00: 65 7d 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  e}}..      } els
ea10: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  e {..        set
ea20: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 44 61 74   connection {Dat
ea30: 61 20 53 6f 75 72 63 65 3d 24 7b 66 69 6c 65 4e  a Source=${fileN
ea40: 61 6d 65 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a  ame}}..      }..
ea50: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
ea60: 20 23 20 4e 4f 54 45 3a 20 53 69 6e 63 65 20 74   # NOTE: Since t
ea70: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 68 61  his procedure ha
ea80: 73 20 6e 6f 20 73 70 65 63 69 61 6c 20 6b 6e 6f  s no special kno
ea90: 77 6c 65 64 67 65 20 6f 66 20 77 68 61 74 20 74  wledge of what t
eaa0: 68 65 20 64 65 66 61 75 6c 74 0d 0a 20 20 20 20  he default..    
eab0: 20 20 23 20 20 20 20 20 20 20 73 65 74 74 69 6e    #       settin
eac0: 67 20 69 73 20 66 6f 72 20 74 68 65 20 54 6f 46  g is for the ToF
ead0: 75 6c 6c 50 61 74 68 20 63 6f 6e 6e 65 63 74 69  ullPath connecti
eae0: 6f 6e 20 73 74 72 69 6e 67 20 70 72 6f 70 65 72  on string proper
eaf0: 79 2c 20 61 6c 77 61 79 73 0d 0a 20 20 20 20 20  y, always..     
eb00: 20 23 20 20 20 20 20 20 20 61 64 64 20 74 68 65   #       add the
eb10: 20 76 61 6c 75 65 20 77 65 20 6b 6e 6f 77 20 61   value we know a
eb20: 62 6f 75 74 20 74 6f 20 74 68 65 20 63 6f 6e 6e  bout to the conn
eb30: 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 2e 0d 0a  ection string...
eb40: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 61        #..      a
eb50: 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e  ppend connection
eb60: 20 7b 3b 54 6f 46 75 6c 6c 50 61 74 68 3d 24 7b   {;ToFullPath=${
eb70: 71 75 61 6c 69 66 79 7d 7d 0d 0a 0d 0a 20 20 20  qualify}}....   
eb80: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
eb90: 54 45 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65  TE: If our calle
eba0: 72 20 73 70 65 63 69 66 69 65 64 20 61 20 6a 6f  r specified a jo
ebb0: 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 61 64 64 20  urnal mode, add 
ebc0: 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 70 6f  the necessary po
ebd0: 72 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20  rtion..      #  
ebe0: 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6e 6e       of the conn
ebf0: 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f  ection string no
ec00: 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  w...      #..   
ec10: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
ec20: 65 6e 67 74 68 20 24 6d 6f 64 65 5d 20 3e 20 30  ength $mode] > 0
ec30: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
ec40: 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74    append connect
ec50: 69 6f 6e 20 7b 3b 4a 6f 75 72 6e 61 6c 20 4d 6f  ion {;Journal Mo
ec60: 64 65 3d 24 7b 6d 6f 64 65 7d 7d 0d 0a 20 20 20  de=${mode}}..   
ec70: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
ec80: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
ec90: 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 73 70 65  f our caller spe
eca0: 63 69 66 69 65 64 20 61 20 44 61 74 65 54 69 6d  cified a DateTim
ecb0: 65 20 66 6f 72 6d 61 74 2c 20 61 64 64 20 74 68  e format, add th
ecc0: 65 20 6e 65 63 65 73 73 61 72 79 0d 0a 20 20 20  e necessary..   
ecd0: 20 20 20 23 20 20 20 20 20 20 20 70 6f 72 74 69     #       porti
ece0: 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63  on of the connec
ecf0: 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e  tion string now.
ed00: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
ed10: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
ed20: 67 74 68 20 24 64 61 74 65 54 69 6d 65 46 6f 72  gth $dateTimeFor
ed30: 6d 61 74 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  mat] > 0} then {
ed40: 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  ..        append
ed50: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 44 61   connection {;Da
ed60: 74 65 54 69 6d 65 46 6f 72 6d 61 74 3d 24 7b 64  teTimeFormat=${d
ed70: 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 7d 7d 0d  ateTimeFormat}}.
ed80: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
ed90: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
eda0: 45 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72  E: If our caller
edb0: 20 73 70 65 63 69 66 69 65 64 20 61 20 44 61 74   specified a Dat
edc0: 65 54 69 6d 65 4b 69 6e 64 2c 20 61 64 64 20 74  eTimeKind, add t
edd0: 68 65 20 6e 65 63 65 73 73 61 72 79 20 70 6f 72  he necessary por
ede0: 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  tion..      #   
edf0: 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65      of the conne
ee00: 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77  ction string now
ee10: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
ee20: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
ee30: 6e 67 74 68 20 24 64 61 74 65 54 69 6d 65 4b 69  ngth $dateTimeKi
ee40: 6e 64 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  nd] > 0} then {.
ee50: 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20  .        append 
ee60: 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 44 61 74  connection {;Dat
ee70: 65 54 69 6d 65 4b 69 6e 64 3d 24 7b 64 61 74 65  eTimeKind=${date
ee80: 54 69 6d 65 4b 69 6e 64 7d 7d 0d 0a 20 20 20 20  TimeKind}}..    
ee90: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
eea0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69        # NOTE: Fi
eeb0: 67 75 72 65 20 6f 75 74 20 77 68 61 74 20 74 68  gure out what th
eec0: 65 20 66 69 6e 61 6c 20 66 6c 61 67 73 20 66 6f  e final flags fo
eed0: 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  r this connectio
eee0: 6e 20 6e 65 65 64 20 74 6f 20 62 65 2e 0d 0a 20  n need to be... 
eef0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65       #..      se
ef00: 74 20 66 6c 61 67 73 20 5b 67 65 74 43 6f 6e 6e  t flags [getConn
ef10: 65 63 74 69 6f 6e 46 6c 61 67 73 20 24 66 69 6c  ectionFlags $fil
ef20: 65 4e 61 6d 65 20 24 66 6c 61 67 73 20 24 71 75  eName $flags $qu
ef30: 69 65 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  iet]....      #.
ef40: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
ef50: 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 73 70 65  f our caller spe
ef60: 63 69 66 69 65 64 20 73 6f 6d 65 20 53 51 4c 69  cified some SQLi
ef70: 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67  teConnectionFlag
ef80: 73 2c 20 61 64 64 20 74 68 65 0d 0a 20 20 20 20  s, add the..    
ef90: 20 20 23 20 20 20 20 20 20 20 6e 65 63 65 73 73    #       necess
efa0: 61 72 79 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  ary portion of t
efb0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74  he connection st
efc0: 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  ring now...     
efd0: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   #..      if {[s
efe0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 6c  tring length $fl
eff0: 61 67 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ags] > 0} then {
f000: 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  ..        append
f010: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 46 6c   connection {;Fl
f020: 61 67 73 3d 24 7b 66 6c 61 67 73 7d 7d 0d 0a 20  ags=${flags}}.. 
f030: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
f040: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
f050: 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 73   If our caller s
f060: 70 65 63 69 66 69 65 64 20 61 6e 20 65 78 74 72  pecified an extr
f070: 61 20 70 61 79 6c 6f 61 64 20 74 6f 20 74 68 65  a payload to the
f080: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20   connection..   
f090: 20 20 20 23 20 20 20 20 20 20 20 73 74 72 69 6e     #       strin
f0a0: 67 2c 20 61 70 70 65 6e 64 20 69 74 20 6e 6f 77  g, append it now
f0b0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
f0c0: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
f0d0: 6e 67 74 68 20 24 65 78 74 72 61 5d 20 3e 20 30  ngth $extra] > 0
f0e0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
f0f0: 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74    append connect
f100: 69 6f 6e 20 5c 3b 20 24 65 78 74 72 61 0d 0a 20  ion \; $extra.. 
f110: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
f120: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
f130: 20 4f 70 65 6e 20 74 68 65 20 64 61 74 61 62 61   Open the databa
f140: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f  se connection no
f150: 77 2c 20 70 6c 61 63 69 6e 67 20 74 68 65 20 6f  w, placing the o
f160: 70 61 71 75 65 20 68 61 6e 64 6c 65 20 76 61 6c  paque handle val
f170: 75 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ue..      #     
f180: 20 20 69 6e 74 6f 20 74 68 65 20 76 61 72 69 61    into the varia
f190: 62 6c 65 20 73 70 65 63 69 66 69 65 64 20 62 79  ble specified by
f1a0: 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20   our caller...  
f1b0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
f1c0: 20 64 62 20 5b 73 71 6c 20 6f 70 65 6e 20 2d 74   db [sql open -t
f1d0: 79 70 65 20 53 51 4c 69 74 65 20 5b 73 75 62 73  ype SQLite [subs
f1e0: 74 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 5d 5d 0d  t $connection]].
f1f0: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
f200: 20 20 23 20 4e 4f 54 45 3a 20 43 6f 6e 66 69 67    # NOTE: Config
f210: 75 72 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72  ure the temporar
f220: 79 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20  y directory for 
f230: 74 68 65 20 6e 65 77 6c 79 20 6f 70 65 6e 65 64  the newly opened
f240: 20 64 61 74 61 62 61 73 65 0d 0a 20 20 20 20 20   database..     
f250: 20 23 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74   #       connect
f260: 69 6f 6e 20 6e 6f 77 20 75 6e 6c 65 73 73 20 6f  ion now unless o
f270: 75 72 20 63 61 6c 6c 65 72 20 66 6f 72 62 69 64  ur caller forbid
f280: 73 20 69 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  s it...      #..
f290: 20 20 20 20 20 20 69 66 20 7b 24 74 65 6d 70 6f        if {$tempo
f2a0: 72 61 72 79 20 26 26 20 21 5b 69 6e 66 6f 20 65  rary && ![info e
f2b0: 78 69 73 74 73 20 3a 3a 6e 6f 28 73 65 74 54 65  xists ::no(setTe
f2c0: 6d 70 6f 72 61 72 79 44 69 72 65 63 74 6f 72 79  mporaryDirectory
f2d0: 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
f2e0: 20 20 20 20 73 71 6c 20 65 78 65 63 75 74 65 20      sql execute 
f2f0: 24 64 62 20 5b 61 70 70 65 6e 64 41 72 67 73 20  $db [appendArgs 
f300: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
f310: 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72  PRAGMA temp_stor
f320: 65 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 5c 22  e_directory = \"
f330: 22 20 5b 67 65 74 54 65 6d 70 6f 72 61 72 79 44  " [getTemporaryD
f340: 69 72 65 63 74 6f 72 79 5d 20 5c 22 5c 3b 5d 0d  irectory] \"\;].
f350: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
f360: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
f370: 45 3a 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e  E: Always return
f380: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
f390: 68 61 6e 64 6c 65 20 75 70 6f 6e 20 73 75 63 63  handle upon succ
f3a0: 65 73 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ess...      #.. 
f3b0: 20 20 20 20 20 72 65 74 75 72 6e 20 24 64 62 0d       return $db.
f3c0: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
f3d0: 72 6f 63 20 67 65 74 44 62 43 6f 6e 6e 65 63 74  roc getDbConnect
f3e0: 69 6f 6e 20 7b 20 7b 76 61 72 4e 61 6d 65 20 64  ion { {varName d
f3f0: 62 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  b} } {..      #.
f400: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
f410: 65 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63  efer to the spec
f420: 69 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28  ified variable (
f430: 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68  e.g. "db") in th
f440: 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72  e context of our
f450: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
f460: 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 68 61 6e  caller.  The han
f470: 64 6c 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  dle to the datab
f480: 61 73 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6f  ase previously o
f490: 70 65 6e 65 64 20 76 69 61 20 74 68 65 0d 0a 20  pened via the.. 
f4a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 5b 73 65       #       [se
f4b0: 74 75 70 44 62 5d 20 70 72 6f 63 65 64 75 72 65  tupDb] procedure
f4c0: 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65   should be store
f4d0: 64 20 74 68 65 72 65 2e 0d 0a 20 20 20 20 20 20  d there...      
f4e0: 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31  #..      upvar 1
f4f0: 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a   $varName db....
f500: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
f510: 20 4e 4f 54 45 3a 20 54 68 69 73 20 72 65 74 75   NOTE: This retu
f520: 72 6e 73 20 74 68 65 20 41 44 4f 2e 4e 45 54 20  rns the ADO.NET 
f530: 49 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62  IDbConnection ob
f540: 6a 65 63 74 20 69 6e 73 74 61 6e 63 65 20 66 6f  ject instance fo
f550: 72 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  r the..      #  
f560: 20 20 20 20 20 73 70 65 63 69 66 69 65 64 20 64       specified d
f570: 61 74 61 62 73 65 20 68 61 6e 64 6c 65 2e 20 20  atabse handle.  
f580: 53 69 6e 63 65 20 67 65 74 74 69 6e 67 20 74 68  Since getting th
f590: 69 73 20 6f 62 6a 65 63 74 20 72 65 6c 69 65 73  is object relies
f5a0: 20 75 70 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20   upon..      #  
f5b0: 20 20 20 20 20 45 61 67 6c 65 20 69 6e 74 65 72       Eagle inter
f5c0: 6e 61 6c 73 2c 20 67 72 65 61 74 20 63 61 72 65  nals, great care
f5d0: 20 73 68 6f 75 6c 64 20 62 65 20 74 61 6b 65 6e   should be taken
f5e0: 20 74 6f 20 61 76 6f 69 64 20 64 69 73 70 6f 73   to avoid dispos
f5f0: 69 6e 67 20 6f 66 0d 0a 20 20 20 20 20 20 23 20  ing of..      # 
f600: 20 20 20 20 20 20 74 68 69 73 20 6f 62 6a 65 63        this objec
f610: 74 20 6f 72 20 6f 74 68 65 72 77 69 73 65 20 70  t or otherwise p
f620: 75 74 74 69 6e 67 20 69 74 20 69 6e 74 6f 20 61  utting it into a
f630: 6e 20 69 6e 76 61 6c 69 64 20 73 74 61 74 65 2e  n invalid state.
f640: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
f650: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
f660: 73 20 64 62 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  s db]} then {.. 
f670: 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
f680: 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
f690: 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
f6a0: 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
f6b0: 62 6c 69 63 20 2d 6f 62 6a 65 63 74 66 6c 61 67  blic -objectflag
f6c0: 73 20 2b 4e 6f 44 69 73 70 6f 73 65 20 5c 0d 0a  s +NoDispose \..
f6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6e0: 2d 61 6c 69 61 73 20 49 6e 74 65 72 70 72 65 74  -alias Interpret
f6f0: 65 72 2e 47 65 74 41 63 74 69 76 65 2e 63 6f 6e  er.GetActive.con
f700: 6e 65 63 74 69 6f 6e 73 20 49 74 65 6d 20 24 64  nections Item $d
f710: 62 7d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  b} \..          
f720: 20 20 20 20 20 20 72 65 73 75 6c 74 5d 20 3d 3d        result] ==
f730: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
f740: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
f750: 20 20 20 23 20 4e 4f 54 45 3a 20 53 75 63 63 65     # NOTE: Succe
f760: 73 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6f  ss, return the o
f770: 70 61 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e  paque object han
f780: 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  dle...          
f790: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  #..          ret
f7a0: 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20  urn $result..   
f7b0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
f7c0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
f7d0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61        # NOTE: Fa
f7e0: 69 6c 75 72 65 2c 20 72 65 70 6f 72 74 20 77 68  ilure, report wh
f7f0: 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  y...          #.
f800: 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
f810: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
f820: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
f830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
f840: 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
f850: 6c 65 64 20 74 6f 20 67 65 74 20 63 6f 6e 6e 65  led to get conne
f860: 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 66 6f 72  ction handle for
f870: 20 64 61 74 61 62 61 73 65 20 5c 22 22 20 5c 0d   database \"" \.
f880: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24  .              $
f890: 64 62 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22  db "\", error: "
f8a0: 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e   \n\t $result \n
f8b0: 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
f8c0: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
f8d0: 0a 20 20 20 20 70 72 6f 63 20 66 72 65 65 44 62  .    proc freeDb
f8e0: 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20 7b 76 61  Connection { {va
f8f0: 72 4e 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  rName connection
f900: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
f910: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
f920: 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63 69  fer to the speci
f930: 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28 65  fied variable (e
f940: 2e 67 2e 20 22 63 6f 6e 6e 65 63 74 69 6f 6e 22  .g. "connection"
f950: 29 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20  ) in the..      
f960: 23 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 20  #       context 
f970: 6f 66 20 6f 75 72 20 63 61 6c 6c 65 72 2e 20 20  of our caller.  
f980: 54 68 65 20 6f 70 61 71 75 65 20 6f 62 6a 65 63  The opaque objec
f990: 74 20 68 61 6e 64 6c 65 20 66 6f 72 20 61 6e 20  t handle for an 
f9a0: 41 44 4f 2e 4e 45 54 0d 0a 20 20 20 20 20 20 23  ADO.NET..      #
f9b0: 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f         connectio
f9c0: 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 74  n previously ret
f9d0: 75 72 6e 65 64 20 62 79 20 5b 67 65 74 44 62 43  urned by [getDbC
f9e0: 6f 6e 6e 65 63 74 69 6f 6e 5d 20 73 68 6f 75 6c  onnection] shoul
f9f0: 64 20 62 65 0d 0a 20 20 20 20 20 20 23 20 20 20  d be..      #   
fa00: 20 20 20 20 73 74 6f 72 65 64 20 74 68 65 72 65      stored there
fa10: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
fa20: 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
fa30: 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 0d  me connection...
fa40: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
fa50: 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
fa60: 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 6f 70  to remove the op
fa70: 61 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64  aque object hand
fa80: 6c 65 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65  le from the inte
fa90: 72 70 72 65 74 65 72 0d 0a 20 20 20 20 20 20 23  rpreter..      #
faa0: 20 20 20 20 20 20 20 6e 6f 77 2e 20 20 54 68 69         now.  Thi
fab0: 73 20 5b 6f 62 6a 65 63 74 20 64 69 73 70 6f 73  s [object dispos
fac0: 65 5d 20 63 61 6c 6c 20 77 69 6c 6c 20 6e 6f 74  e] call will not
fad0: 20 61 63 74 75 61 6c 6c 79 20 64 69 73 70 6f 73   actually dispos
fae0: 65 20 6f 66 20 74 68 65 0d 0a 20 20 20 20 20 20  e of the..      
faf0: 23 20 20 20 20 20 20 20 75 6e 64 65 72 6c 79 69  #       underlyi
fb00: 6e 67 20 6f 62 6a 65 63 74 20 62 65 63 61 75 73  ng object becaus
fb10: 65 20 74 68 65 20 2b 4e 6f 44 69 73 70 6f 73 65  e the +NoDispose
fb20: 20 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e   flag was set on
fb30: 20 69 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20   it..      #    
fb40: 20 20 20 64 75 72 69 6e 67 20 63 72 65 61 74 69     during creati
fb50: 6f 6e 20 6f 66 20 74 68 65 20 6f 70 61 71 75 65  on of the opaque
fb60: 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 2e 0d   object handle..
fb70: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
fb80: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
fb90: 20 63 6f 6e 6e 65 63 74 69 6f 6e 5d 20 26 26 20   connection] && 
fba0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 63 61  \..          [ca
fbb0: 74 63 68 20 7b 6f 62 6a 65 63 74 20 64 69 73 70  tch {object disp
fbc0: 6f 73 65 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 7d  ose $connection}
fbd0: 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d   error]} then {.
fbe0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
fbf0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73      # NOTE: We s
fc00: 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f  omehow failed to
fc10: 20 72 65 6d 6f 76 65 20 74 68 65 20 68 61 6e 64   remove the hand
fc20: 6c 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d  le, report why..
fc30: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
fc40: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
fc50: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
fc60: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
fc70: 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
fc80: 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 72 65  NG: failed to re
fc90: 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  move connection 
fca0: 68 61 6e 64 6c 65 20 5c 22 22 20 24 63 6f 6e 6e  handle \"" $conn
fcb0: 65 63 74 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20  ection \..      
fcc0: 20 20 20 20 20 20 22 5c 22 2c 20 65 72 72 6f 72        "\", error
fcd0: 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20  : " \n\t $error 
fce0: 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  \n]..      }..  
fcf0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
fd00: 20 61 64 64 44 62 43 6f 6e 6e 65 63 74 69 6f 6e   addDbConnection
fd10: 20 7b 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 76   { connection {v
fd20: 61 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a  arName db} } {..
fd30: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
fd40: 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20   NOTE: Refer to 
fd50: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61  the specified va
fd60: 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62  riable (e.g. "db
fd70: 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78  ") in the contex
fd80: 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20  t of our..      
fd90: 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 0d  #       caller..
fda0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
fdb0: 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65  upvar 1 $varName
fdc0: 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a   db....      #..
fdd0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 72        # NOTE: Cr
fde0: 65 61 74 65 20 61 20 63 6f 72 72 65 63 74 6c 79  eate a correctly
fdf0: 20 66 6f 72 6d 61 74 74 65 64 20 6e 61 6d 65 20   formatted name 
fe00: 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
fe10: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 0d 0a   connection to..
fe20: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65        #       be
fe30: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c 69   added to the li
fe40: 73 74 20 6d 61 6e 61 67 65 64 20 62 79 20 74 68  st managed by th
fe50: 65 20 45 61 67 6c 65 20 69 6e 74 65 72 70 72 65  e Eagle interpre
fe60: 74 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ter...      #.. 
fe70: 20 20 20 20 20 73 65 74 20 64 62 20 5b 6f 62 6a       set db [obj
fe80: 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
fe90: 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
fea0: 20 20 20 20 20 20 20 20 20 20 45 61 67 6c 65 2e            Eagle.
feb0: 5f 43 6f 6d 70 6f 6e 65 6e 74 73 2e 50 72 69 76  _Components.Priv
fec0: 61 74 65 2e 46 6f 72 6d 61 74 4f 70 73 20 44 61  ate.FormatOps Da
fed0: 74 61 62 61 73 65 4f 62 6a 65 63 74 4e 61 6d 65  tabaseObjectName
fee0: 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 0d 0a   $connection \..
fef0: 20 20 20 20 20 20 20 20 20 20 53 51 4c 69 74 65            SQLite
ff00: 43 6f 6e 6e 65 63 74 69 6f 6e 20 5b 6f 62 6a 65  Connection [obje
ff10: 63 74 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70  ct invoke Interp
ff20: 72 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 20  reter.GetActive 
ff30: 4e 65 78 74 49 64 5d 5d 0d 0a 0d 0a 20 20 20 20  NextId]]....    
ff40: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
ff50: 45 3a 20 41 64 64 20 74 68 65 20 64 61 74 61 62  E: Add the datab
ff60: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  ase connection p
ff70: 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20 63  rovided by our c
ff80: 61 6c 6c 65 72 20 74 6f 20 74 68 65 20 6c 69 73  aller to the lis
ff90: 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  t..      #      
ffa0: 20 6f 66 20 74 68 6f 73 65 20 6b 6e 6f 77 6e 20   of those known 
ffb0: 74 6f 20 74 68 65 20 45 61 67 6c 65 20 69 6e 74  to the Eagle int
ffc0: 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20  erpreter...     
ffd0: 20 23 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63 74   #..      object
ffe0: 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
fff0: 4e 6f 6e 50 75 62 6c 69 63 20 49 6e 74 65 72 70  NonPublic Interp
10000 72 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 2e  reter.GetActive.
10010 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 41 64 64 20  connections Add 
10020 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 24 64 62  \..          $db
10030 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20   $connection..  
10040 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
10050 20 63 6c 65 61 6e 75 70 44 62 20 7b 20 66 69 6c   cleanupDb { fil
10060 65 4e 61 6d 65 20 7b 76 61 72 4e 61 6d 65 20 64  eName {varName d
10070 62 7d 20 7b 63 6f 6c 6c 65 63 74 20 74 72 75 65  b} {collect true
10080 7d 20 7b 71 75 61 6c 69 66 79 20 74 72 75 65 7d  } {qualify true}
10090 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
100a0 20 20 20 20 20 20 20 7b 64 65 6c 65 74 65 20 74         {delete t
100b0 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  rue} } {..      
100c0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
100d0 20 41 74 74 65 6d 70 74 20 74 6f 20 66 6f 72 63   Attempt to forc
100e0 65 20 61 6c 6c 20 70 65 6e 64 69 6e 67 20 22 67  e all pending "g
100f0 61 72 62 61 67 65 22 20 6f 62 6a 65 63 74 73 20  arbage" objects 
10100 74 6f 20 62 65 20 63 6f 6c 6c 65 63 74 65 64 2c  to be collected,
10110 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
10120 69 6e 63 6c 75 64 69 6e 67 20 53 51 4c 69 74 65  including SQLite
10130 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6e 64 20   statements and 
10140 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 3b 20  backup objects; 
10150 74 68 69 73 20 73 68 6f 75 6c 64 20 61 6c 6c 6f  this should allo
10160 77 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  w..      #      
10170 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
10180 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
10190 20 62 65 20 64 65 6c 65 74 65 64 2e 0d 0a 20 20   be deleted...  
101a0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
101b0 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65 6e 20  {$collect} then 
101c0 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c 6c 65  {..        colle
101d0 63 74 47 61 72 62 61 67 65 20 24 3a 3a 74 65 73  ctGarbage $::tes
101e0 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20  t_channel..     
101f0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
10200 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66       # NOTE: Ref
10210 65 72 20 74 6f 20 74 68 65 20 73 70 65 63 69 66  er to the specif
10220 69 65 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e  ied variable (e.
10230 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65 20  g. "db") in the 
10240 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a  context of our..
10250 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61        #       ca
10260 6c 6c 65 72 2e 20 20 54 68 65 20 68 61 6e 64 6c  ller.  The handl
10270 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
10280 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65  e previously ope
10290 6e 65 64 20 76 69 61 20 74 68 65 0d 0a 20 20 20  ned via the..   
102a0 20 20 20 23 20 20 20 20 20 20 20 5b 73 65 74 75     #       [setu
102b0 70 44 62 5d 20 70 72 6f 63 65 64 75 72 65 20 73  pDb] procedure s
102c0 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20  hould be stored 
102d0 74 68 65 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d  there...      #.
102e0 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24  .      upvar 1 $
102f0 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20  varName db....  
10300 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
10310 4f 54 45 3a 20 43 6c 6f 73 65 20 74 68 65 20 63  OTE: Close the c
10320 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65  onnection to the
10330 20 64 61 74 61 62 61 73 65 20 6e 6f 77 2e 20 20   database now.  
10340 54 68 69 73 20 73 68 6f 75 6c 64 20 61 6c 6c 6f  This should allo
10350 77 20 75 73 0d 0a 20 20 20 20 20 20 23 20 20 20  w us..      #   
10360 20 20 20 20 74 6f 20 64 65 6c 65 74 65 20 74 68      to delete th
10370 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
10380 61 62 61 73 65 20 66 69 6c 65 2e 0d 0a 20 20 20  abase file...   
10390 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
103a0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 64 62 5d  [info exists db]
103b0 20 26 26 20 5b 63 61 74 63 68 20 7b 73 71 6c 20   && [catch {sql 
103c0 63 6c 6f 73 65 20 24 64 62 7d 20 65 72 72 6f 72  close $db} error
103d0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
103e0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
103f0 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77  NOTE: We somehow
10400 20 66 61 69 6c 65 64 20 74 6f 20 63 6c 6f 73 65   failed to close
10410 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 72   the database, r
10420 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20  eport why...    
10430 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74      #..        t
10440 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
10450 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
10460 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
10470 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
10480 61 69 6c 65 64 20 74 6f 20 63 6c 6f 73 65 20 64  ailed to close d
10490 61 74 61 62 61 73 65 20 5c 22 22 20 24 64 62 20  atabase \"" $db 
104a0 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d  "\", error: " \.
104b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c  .            \n\
104c0 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20  t $error \n]..  
104d0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
104e0 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
104f0 46 69 72 73 74 2c 20 73 65 65 20 69 66 20 6f 75  First, see if ou
10500 72 20 63 61 6c 6c 65 72 20 68 61 73 20 72 65 71  r caller has req
10510 75 65 73 74 65 64 20 61 6e 20 69 6e 2d 6d 65 6d  uested an in-mem
10520 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0d 0a 20  ory database... 
10530 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65       #..      se
10540 74 20 69 73 4d 65 6d 6f 72 79 20 5b 69 73 4d 65  t isMemory [isMe
10550 6d 6f 72 79 44 62 20 24 66 69 6c 65 4e 61 6d 65  moryDb $fileName
10560 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ]....      #..  
10570 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c      # NOTE: Buil
10580 64 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 20  d the full path 
10590 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
105a0 66 69 6c 65 20 6e 61 6d 65 2e 20 20 46 6f 72 20  file name.  For 
105b0 6e 6f 77 2c 20 61 6c 6c 20 74 65 73 74 0d 0a 20  now, all test.. 
105c0 20 20 20 20 20 23 20 20 20 20 20 20 20 64 61 74       #       dat
105d0 61 62 61 73 65 20 66 69 6c 65 73 20 61 72 65 20  abase files are 
105e0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 74 65  stored in the te
105f0 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72  mporary director
10600 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  y...      #..   
10610 20 20 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72     if {!$isMemor
10620 79 20 26 26 20 24 71 75 61 6c 69 66 79 7d 20 74  y && $qualify} t
10630 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  hen {..        s
10640 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c  et fileName [fil
10650 65 20 6a 6f 69 6e 20 5b 67 65 74 44 61 74 61 62  e join [getDatab
10660 61 73 65 44 69 72 65 63 74 6f 72 79 5d 20 5b 66  aseDirectory] [f
10670 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61  ile tail $fileNa
10680 6d 65 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  me]]..      }...
10690 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
106a0 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66  # NOTE: Check if
106b0 20 74 68 65 20 66 69 6c 65 20 73 74 69 6c 6c 20   the file still 
106c0 65 78 69 73 74 73 2e 0d 0a 20 20 20 20 20 20 23  exists...      #
106d0 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 69 73  ..      if {!$is
106e0 4d 65 6d 6f 72 79 20 26 26 20 24 64 65 6c 65 74  Memory && $delet
106f0 65 20 26 26 20 5b 66 69 6c 65 20 65 78 69 73 74  e && [file exist
10700 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  s $fileName]} th
10710 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
10720 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
10730 20 53 6b 69 70 20 64 65 6c 65 74 69 6e 67 20 64   Skip deleting d
10740 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 69 66  atabase files if
10750 20 73 6f 6d 65 62 6f 64 79 20 73 65 74 73 20 74   somebody sets t
10760 68 65 20 67 6c 6f 62 61 6c 0d 0a 20 20 20 20 20  he global..     
10770 20 20 20 23 20 20 20 20 20 20 20 76 61 72 69 61     #       varia
10780 62 6c 65 20 74 6f 20 70 72 65 76 65 6e 74 20 69  ble to prevent i
10790 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
107a0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
107b0 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6c  o exists ::no(cl
107c0 65 61 6e 75 70 44 62 46 69 6c 65 29 5d 7d 20 74  eanupDbFile)]} t
107d0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
107e0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
107f0 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
10800 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 73 74   delete the test
10810 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
10820 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ow...          #
10830 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
10840 5b 73 65 74 20 63 6f 64 65 20 5b 63 61 74 63 68  [set code [catch
10850 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66   {file delete $f
10860 69 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72 5d 5d  ileName} error]]
10870 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
10880 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
10890 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20       # NOTE: We 
108a0 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74  somehow failed t
108b0 6f 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c  o delete the fil
108c0 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a  e, report why...
108d0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
108e0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
108f0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
10900 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
10910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10920 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
10930 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20  ailed to delete 
10940 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 5c 22  database file \"
10950 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  " $fileName \.. 
10960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
10970 5c 22 20 64 75 72 69 6e 67 20 63 6c 65 61 6e 75  \" during cleanu
10980 70 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  p, error: " \n\t
10990 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20   $error \n]..   
109a0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
109b0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
109c0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
109d0 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20     # NOTE: Show 
109e0 74 68 61 74 20 77 65 20 73 6b 69 70 70 65 64 20  that we skipped 
109f0 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c  deleting the fil
10a00 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  e...          #.
10a10 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 63  .          set c
10a20 6f 64 65 20 30 0d 0a 0d 0a 20 20 20 20 20 20 20  ode 0....       
10a30 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
10a40 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
10a50 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
10a60 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
10a70 49 4e 47 3a 20 73 6b 69 70 70 65 64 20 64 65 6c  ING: skipped del
10a80 65 74 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  eting database f
10a90 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d  ile \"" $fileNam
10aa0 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
10ab0 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c     "\" during cl
10ac0 65 61 6e 75 70 5c 6e 22 5d 0d 0a 20 20 20 20 20  eanup\n"]..     
10ad0 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
10ae0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
10af0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
10b00 20 54 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e   The file does n
10b10 6f 74 20 65 78 69 73 74 2c 20 73 75 63 63 65 73  ot exist, succes
10b20 73 21 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  s!..        #.. 
10b30 20 20 20 20 20 20 20 73 65 74 20 63 6f 64 65 20         set code 
10b40 30 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  0..      }....  
10b50 20 20 20 20 72 65 74 75 72 6e 20 24 63 6f 64 65      return $code
10b60 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
10b70 70 72 6f 63 20 73 65 74 75 70 44 62 49 6e 74 65  proc setupDbInte
10b80 72 72 75 70 74 43 61 6c 6c 62 61 63 6b 20 7b 20  rruptCallback { 
10b90 63 68 61 6e 6e 65 6c 20 6c 6f 67 20 7d 20 7b 0d  channel log } {.
10ba0 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68  .      tputs $ch
10bb0 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 73 65 74 74  annel "---- sett
10bc0 69 6e 67 20 75 70 20 64 65 62 75 67 67 65 72 20  ing up debugger 
10bd0 69 6e 74 65 72 72 75 70 74 20 63 61 6c 6c 62 61  interrupt callba
10be0 63 6b 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  ck... "....     
10bf0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
10c00 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
10c10 20 20 23 20 4e 4f 54 45 3a 20 4d 61 6b 65 20 73    # NOTE: Make s
10c20 75 72 65 20 74 68 65 20 73 63 72 69 70 74 20 64  ure the script d
10c30 65 62 75 67 67 65 72 20 61 6e 64 20 74 68 65 20  ebugger and the 
10c40 69 73 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72  isolated interpr
10c50 65 74 65 72 20 61 72 65 0d 0a 20 20 20 20 20 20  eter are..      
10c60 20 20 23 20 20 20 20 20 20 20 73 65 74 75 70 20    #       setup 
10c70 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20 75 73  and ready for us
10c80 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
10c90 20 20 20 20 20 20 20 64 65 62 75 67 20 73 65 74         debug set
10ca0 75 70 20 74 72 75 65 20 74 72 75 65 0d 0a 0d 0a  up true true....
10cb0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
10cc0 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20     # NOTE: Load 
10cd0 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 70 61  the necessary pa
10ce0 63 6b 61 67 65 73 20 69 6e 74 6f 20 74 68 65 20  ckages into the 
10cf0 69 73 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72  isolated interpr
10d00 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 23  eter...        #
10d10 0d 0a 20 20 20 20 20 20 20 20 64 65 62 75 67 20  ..        debug 
10d20 65 76 61 6c 20 7b 0d 0a 20 20 20 20 20 20 20 20  eval {..        
10d30 20 20 70 61 63 6b 61 67 65 20 72 65 71 75 69 72    package requir
10d40 65 20 45 61 67 6c 65 0d 0a 20 20 20 20 20 20 20  e Eagle..       
10d50 20 20 20 70 61 63 6b 61 67 65 20 72 65 71 75 69     package requi
10d60 72 65 20 45 61 67 6c 65 2e 4c 69 62 72 61 72 79  re Eagle.Library
10d70 0d 0a 20 20 20 20 20 20 20 20 20 20 70 61 63 6b  ..          pack
10d80 61 67 65 20 72 65 71 75 69 72 65 20 45 61 67 6c  age require Eagl
10d90 65 2e 54 65 73 74 0d 0a 20 20 20 20 20 20 20 20  e.Test..        
10da0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  }....        #..
10db0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
10dc0 43 6f 70 79 20 74 68 65 20 6e 65 63 65 73 73 61  Copy the necessa
10dd0 72 79 20 76 61 72 69 61 62 6c 65 73 20 69 6e 74  ry variables int
10de0 6f 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20 69  o the isolated i
10df0 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20  nterpreter...   
10e00 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
10e10 64 65 62 75 67 20 69 6e 76 6f 6b 65 20 30 20 73  debug invoke 0 s
10e20 65 74 20 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  et ::test_channe
10e30 6c 20 24 63 68 61 6e 6e 65 6c 3b 20 23 20 4e 4f  l $channel; # NO
10e40 54 45 3a 20 46 6f 72 20 5b 74 70 75 74 73 5d 2e  TE: For [tputs].
10e50 0d 0a 20 20 20 20 20 20 20 20 64 65 62 75 67 20  ..        debug 
10e60 69 6e 76 6f 6b 65 20 30 20 73 65 74 20 3a 3a 74  invoke 0 set ::t
10e70 65 73 74 5f 6c 6f 67 20 24 6c 6f 67 3b 20 23 20  est_log $log; # 
10e80 4e 4f 54 45 3a 20 46 6f 72 20 5b 74 6c 6f 67 5d  NOTE: For [tlog]
10e90 2e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  .....        #..
10ea0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
10eb0 49 6e 73 74 61 6c 6c 20 74 68 65 20 63 61 6c 6c  Install the call
10ec0 62 61 63 6b 20 73 63 72 69 70 74 20 74 6f 20 62  back script to b
10ed0 65 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20 74  e evaluated in t
10ee0 68 65 20 69 73 6f 6c 61 74 65 64 0d 0a 20 20 20  he isolated..   
10ef0 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 74       #       int
10f00 65 72 70 72 65 74 65 72 20 77 68 65 6e 20 74 68  erpreter when th
10f10 69 73 20 69 6e 74 65 72 70 72 65 74 65 72 20 69  is interpreter i
10f20 73 20 69 6e 74 65 72 72 75 70 74 65 64 20 62 79  s interrupted by
10f30 20 73 63 72 69 70 74 0d 0a 20 20 20 20 20 20 20   script..       
10f40 20 23 20 20 20 20 20 20 20 63 61 6e 63 65 6c 6c   #       cancell
10f50 61 74 69 6f 6e 2c 20 65 74 63 2e 0d 0a 20 20 20  ation, etc...   
10f60 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
10f70 64 65 62 75 67 20 63 61 6c 6c 62 61 63 6b 20 61  debug callback a
10f80 70 70 6c 79 20 7b 7b 73 65 6e 64 65 72 20 65 7d  pply {{sender e}
10f90 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
10fa0 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
10fb0 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73  E: Check if this
10fc0 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 6f 6e 65   callback is one
10fd0 20 74 68 61 74 20 77 65 20 63 61 72 65 20 61 62   that we care ab
10fe0 6f 75 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  out...          
10ff0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  #..          if 
11000 7b 22 43 61 6e 63 65 6c 65 64 22 20 69 6e 20 5b  {"Canceled" in [
11010 73 70 6c 69 74 20 5b 24 65 20 49 6e 74 65 72 72  split [$e Interr
11020 75 70 74 54 79 70 65 5d 20 22 2c 20 22 5d 7d 20  uptType] ", "]} 
11030 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
11040 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
11050 20 20 20 23 20 4e 4f 54 45 3a 20 49 74 65 72 61     # NOTE: Itera
11060 74 65 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 64  te through all d
11070 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
11080 6f 6e 73 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 65  ons known to the
11090 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
110a0 20 20 20 20 20 20 70 61 72 65 6e 74 20 69 6e 74        parent int
110b0 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20  erpreter...     
110c0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
110d0 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72        object for
110e0 65 61 63 68 20 2d 61 6c 69 61 73 20 70 61 69 72  each -alias pair
110f0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
11100 20 20 20 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f      [object invo
11110 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
11120 62 6c 69 63 20 24 65 20 49 6e 74 65 72 70 72 65  blic $e Interpre
11130 74 65 72 2e 63 6f 6e 6e 65 63 74 69 6f 6e 73 5d  ter.connections]
11140 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
11150 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
11160 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
11170 70 74 20 74 6f 20 63 61 6e 63 65 6c 20 61 6e 79  pt to cancel any
11180 20 53 51 4c 20 71 75 65 72 69 65 73 20 69 6e 20   SQL queries in 
11190 70 72 6f 67 72 65 73 73 20 6f 6e 20 74 68 69 73  progress on this
111a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
111b0 23 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65  #       database
111c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0d 0a 20 20   connection...  
111d0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
111e0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
111f0 7b 5b 63 61 74 63 68 20 7b 24 70 61 69 72 20 56  {[catch {$pair V
11200 61 6c 75 65 2e 43 61 6e 63 65 6c 7d 20 65 72 72  alue.Cancel} err
11210 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
11220 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
11230 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
11240 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
11250 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
11260 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
11270 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
11280 6f 20 63 61 6e 63 65 6c 20 71 75 65 72 79 20 66  o cancel query f
11290 6f 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 22  or connection \"
112a0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
112b0 20 20 20 20 20 20 20 20 20 5b 24 70 61 69 72 20           [$pair 
112c0 4b 65 79 5d 20 22 5c 22 2c 20 65 72 72 6f 72 3a  Key] "\", error:
112d0 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c   " \n\t $error \
112e0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
112f0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
11300 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
11310 0a 20 20 20 20 20 20 20 20 7d 7d 0d 0a 20 20 20  .        }}..   
11320 20 20 20 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30     } error] == 0
11330 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
11340 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
11350 69 6e 74 65 72 72 75 70 74 43 61 6c 6c 62 61 63  interruptCallbac
11360 6b 2e 73 71 6c 69 74 65 33 0d 0a 0d 0a 20 20 20  k.sqlite3....   
11370 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
11380 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20  nel yes\n..     
11390 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
113a0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
113b0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 6e  l [appendArgs "n
113c0 6f 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  o, error: " \n\t
113d0 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20   $error \n]..   
113e0 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
113f0 20 20 20 20 70 72 6f 63 20 63 6c 65 61 6e 75 70      proc cleanup
11400 46 69 6c 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20  File { fileName 
11410 7b 63 6f 6c 6c 65 63 74 20 74 72 75 65 7d 20 7b  {collect true} {
11420 66 6f 72 63 65 20 66 61 6c 73 65 7d 20 7d 20 7b  force false} } {
11430 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
11440 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
11450 20 74 6f 20 66 6f 72 63 65 20 61 6c 6c 20 70 65   to force all pe
11460 6e 64 69 6e 67 20 22 67 61 72 62 61 67 65 22 20  nding "garbage" 
11470 6f 62 6a 65 63 74 73 20 74 6f 20 62 65 20 63 6f  objects to be co
11480 6c 6c 65 63 74 65 64 2c 0d 0a 20 20 20 20 20 20  llected,..      
11490 23 20 20 20 20 20 20 20 69 6e 63 6c 75 64 69 6e  #       includin
114a0 67 20 53 51 4c 69 74 65 20 73 74 61 74 65 6d 65  g SQLite stateme
114b0 6e 74 73 20 61 6e 64 20 62 61 63 6b 75 70 20 6f  nts and backup o
114c0 62 6a 65 63 74 73 3b 20 74 68 69 73 20 73 68 6f  bjects; this sho
114d0 75 6c 64 20 61 6c 6c 6f 77 0d 0a 20 20 20 20 20  uld allow..     
114e0 20 23 20 20 20 20 20 20 20 74 68 65 20 75 6e 64   #       the und
114f0 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
11500 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65   file to be dele
11510 74 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ted...      #.. 
11520 20 20 20 20 20 69 66 20 7b 24 63 6f 6c 6c 65 63       if {$collec
11530 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
11540 20 20 20 63 6f 6c 6c 65 63 74 47 61 72 62 61 67     collectGarbag
11550 65 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  e $::test_channe
11560 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  l..      }....  
11570 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
11580 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68  OTE: Check if th
11590 65 20 66 69 6c 65 20 73 74 69 6c 6c 20 65 78 69  e file still exi
115a0 73 74 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  sts...      #.. 
115b0 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65       if {[file e
115c0 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d  xists $fileName]
115d0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
115e0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
115f0 4f 54 45 3a 20 53 6b 69 70 20 64 65 6c 65 74 69  OTE: Skip deleti
11600 6e 67 20 74 65 73 74 20 66 69 6c 65 73 20 69 66  ng test files if
11610 20 73 6f 6d 65 62 6f 64 79 20 73 65 74 73 20 74   somebody sets t
11620 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  he global variab
11630 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  le..        #   
11640 20 20 20 20 74 6f 20 70 72 65 76 65 6e 74 20 69      to prevent i
11650 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
11660 20 20 20 20 20 20 20 69 66 20 7b 24 66 6f 72 63         if {$forc
11670 65 20 7c 7c 20 21 5b 69 6e 66 6f 20 65 78 69 73  e || ![info exis
11680 74 73 20 3a 3a 6e 6f 28 63 6c 65 61 6e 75 70 46  ts ::no(cleanupF
11690 69 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ile)]} then {.. 
116a0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
116b0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74        # NOTE: At
116c0 74 65 6d 70 74 20 74 6f 20 64 65 6c 65 74 65 20  tempt to delete 
116d0 74 68 65 20 74 65 73 74 20 66 69 6c 65 20 6e 6f  the test file no
116e0 77 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  w...          #.
116f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
11700 73 65 74 20 63 6f 64 65 20 5b 63 61 74 63 68 20  set code [catch 
11710 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66 69  {file delete $fi
11720 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72 5d 5d 7d  leName} error]]}
11730 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
11740 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
11750 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73      # NOTE: We s
11760 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f  omehow failed to
11770 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65   delete the file
11780 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20  , report why... 
11790 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
117a0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
117b0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
117c0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
117d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
117e0 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
117f0 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 74  iled to delete t
11800 65 73 74 20 66 69 6c 65 20 5c 22 22 20 24 66 69  est file \"" $fi
11810 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  leName \..      
11820 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 64 75            "\" du
11830 72 69 6e 67 20 63 6c 65 61 6e 75 70 2c 20 65 72  ring cleanup, er
11840 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72  ror: " \n\t $err
11850 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  or \n]..        
11860 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65    }..        } e
11870 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
11880 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
11890 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68 61 74 20  NOTE: Show that 
118a0 77 65 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74  we skipped delet
118b0 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0d 0a 20  ing the file... 
118c0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
118d0 20 20 20 20 20 20 73 65 74 20 63 6f 64 65 20 30        set code 0
118e0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70  ....          tp
118f0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
11900 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
11910 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
11920 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
11930 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67  skipped deleting
11940 20 74 65 73 74 20 66 69 6c 65 20 5c 22 22 20 24   test file \"" $
11950 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20  fileName \..    
11960 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 64 75            "\" du
11970 72 69 6e 67 20 63 6c 65 61 6e 75 70 5c 6e 22 5d  ring cleanup\n"]
11980 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
11990 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
119a0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
119b0 23 20 4e 4f 54 45 3a 20 54 68 65 20 66 69 6c 65  # NOTE: The file
119c0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
119d0 20 73 75 63 63 65 73 73 21 0d 0a 20 20 20 20 20   success!..     
119e0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65     #..        se
119f0 74 20 63 6f 64 65 20 30 0d 0a 20 20 20 20 20 20  t code 0..      
11a00 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
11a10 6e 20 24 63 6f 64 65 0d 0a 20 20 20 20 7d 0d 0a  n $code..    }..
11a20 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 6f 6c 6c  ...    proc coll
11a30 65 63 74 47 61 72 62 61 67 65 20 7b 20 63 68 61  ectGarbage { cha
11a40 6e 6e 65 6c 20 7b 6d 69 6c 6c 69 73 65 63 6f 6e  nnel {millisecon
11a50 64 73 20 31 30 30 30 7d 20 7b 71 75 69 65 74 20  ds 1000} {quiet 
11a60 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  true} } {..     
11a70 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a   if {[catch {obj
11a80 65 63 74 20 69 6e 76 6f 6b 65 20 47 43 20 47 65  ect invoke GC Ge
11a90 74 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 66 61 6c  tTotalMemory fal
11aa0 73 65 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30  se} result] == 0
11ab0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
11ac0 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
11ad0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
11ae0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
11af0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
11b00 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
11b10 2d 2d 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65  -- memory in use
11b20 20 62 79 20 74 68 65 20 43 4c 52 20 62 65 66 6f   by the CLR befo
11b30 72 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 2e 2e 2e  re collection...
11b40 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
11b50 20 20 20 20 24 72 65 73 75 6c 74 20 22 20 62 79      $result " by
11b60 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  tes\n"]..       
11b70 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65   }..      } else
11b80 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
11b90 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
11ba0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
11bb0 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
11bc0 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 67  ING: failed to g
11bd0 65 74 20 43 4c 52 20 6d 65 6d 6f 72 79 20 75 73  et CLR memory us
11be0 61 67 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d  age, error: " \.
11bf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c  .            \n\
11c00 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20  t $result \n].. 
11c10 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
11c20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11c30 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11c40 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11c50 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11c60 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20  #########....   
11c70 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
11c80 54 45 3a 20 52 65 70 65 61 74 65 64 6c 79 20 61  TE: Repeatedly a
11c90 74 74 65 6d 70 74 20 74 6f 20 63 6f 6c 6c 65 63  ttempt to collec
11ca0 74 20 67 61 72 62 61 67 65 20 75 6e 74 69 6c 20  t garbage until 
11cb0 74 68 65 20 61 6c 6c 6f 74 74 65 64 20 6e 75 6d  the allotted num
11cc0 62 65 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ber..      #    
11cd0 20 20 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e     of millisecon
11ce0 64 73 20 68 61 73 20 65 6c 61 70 73 65 64 2e 20  ds has elapsed. 
11cf0 20 41 6c 77 61 79 73 20 61 74 74 65 6d 70 74 20   Always attempt 
11d00 74 6f 20 63 6f 6c 6c 65 63 74 20 67 61 72 62 61  to collect garba
11d10 67 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ge..      #     
11d20 20 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e    at least once.
11d30 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
11d40 20 73 65 74 20 73 74 61 72 74 20 5b 63 6c 6f 63   set start [cloc
11d50 6b 20 73 65 63 6f 6e 64 73 5d 0d 0a 20 20 20 20  k seconds]..    
11d60 20 20 73 65 74 20 73 74 6f 70 20 5b 65 78 70 72    set stop [expr
11d70 20 7b 24 73 74 61 72 74 20 2b 20 28 24 6d 69 6c   {$start + ($mil
11d80 6c 69 73 65 63 6f 6e 64 73 20 2f 20 31 30 30 30  liseconds / 1000
11d90 29 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20 64 6f 20  )}]....      do 
11da0 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
11db0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74        # NOTE: At
11dc0 74 65 6d 70 74 20 74 6f 20 66 6f 72 63 65 20 61  tempt to force a
11dd0 20 66 75 6c 6c 20 67 61 72 62 61 67 65 20 63 6f   full garbage co
11de0 6c 6c 65 63 74 69 6f 6e 20 6e 6f 77 2e 20 20 52  llection now.  R
11df0 65 70 6f 72 74 20 61 6e 79 0d 0a 20 20 20 20 20  eport any..     
11e00 20 20 20 23 20 20 20 20 20 20 20 65 72 72 6f 72     #       error
11e10 20 74 68 61 74 20 69 73 20 65 6e 63 6f 75 6e 74   that is encount
11e20 65 72 65 64 20 69 66 20 77 65 20 66 61 69 6c 2e  ered if we fail.
11e30 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
11e40 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
11e50 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47  {object invoke G
11e60 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79  C GetTotalMemory
11e70 20 74 72 75 65 7d 20 65 72 72 6f 72 5d 7d 20 74   true} error]} t
11e80 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
11e90 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
11ea0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
11eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
11ec0 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
11ed0 65 64 20 66 75 6c 6c 20 67 61 72 62 61 67 65 20  ed full garbage 
11ee0 63 6f 6c 6c 65 63 74 69 6f 6e 2c 20 65 72 72 6f  collection, erro
11ef0 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  r: " \..        
11f00 20 20 20 20 20 20 5c 6e 5c 74 20 24 65 72 72 6f        \n\t $erro
11f10 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d  r \n]..        }
11f20 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
11f30 6e 6f 77 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e  now [clock secon
11f40 64 73 5d 0d 0a 20 20 20 20 20 20 7d 20 77 68 69  ds]..      } whi
11f50 6c 65 20 7b 24 73 74 61 72 74 20 3c 3d 20 24 6e  le {$start <= $n
11f60 6f 77 20 26 26 20 24 6e 6f 77 20 3c 20 24 73 74  ow && $now < $st
11f70 6f 70 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 23 23  op}....      ###
11f80 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11f90 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11fa0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11fb0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11fc0 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20 20  ######....      
11fd0 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65  if {[catch {obje
11fe0 63 74 20 69 6e 76 6f 6b 65 20 47 43 20 47 65 74  ct invoke GC Get
11ff0 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 66 61 6c 73  TotalMemory fals
12000 65 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d  e} result] == 0}
12010 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
12020 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
12030 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
12040 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
12050 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
12060 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
12070 2d 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20  - memory in use 
12080 62 79 20 74 68 65 20 43 4c 52 20 61 66 74 65 72  by the CLR after
12090 20 63 6f 6c 6c 65 63 74 69 6f 6e 2e 2e 2e 20 22   collection... "
120a0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
120b0 20 20 24 72 65 73 75 6c 74 20 22 20 62 79 74 65    $result " byte
120c0 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d  s\n"]..        }
120d0 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
120e0 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
120f0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
12100 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
12110 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
12120 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74  G: failed to get
12130 20 43 4c 52 20 6d 65 6d 6f 72 79 20 75 73 61 67   CLR memory usag
12140 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20  e, error: " \.. 
12150 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20             \n\t 
12160 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
12170 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
12180 20 20 20 20 70 72 6f 63 20 67 65 74 53 51 4c 69      proc getSQLi
12190 74 65 48 61 6e 64 6c 65 43 6f 75 6e 74 73 20 7b  teHandleCounts {
121a0 20 63 68 61 6e 6e 65 6c 20 7b 71 75 69 65 74 20   channel {quiet 
121b0 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20  false} } {..    
121c0 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 6c 69    set result [li
121d0 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  st]....      if 
121e0 7b 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  {[haveConstraint
121f0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
12200 20 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74    defineConstant
12210 2e 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  .System.Data.SQL
12220 69 74 65 2e 43 4f 55 4e 54 5f 48 41 4e 44 4c 45  ite.COUNT_HANDLE
12230 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
12240 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
12250 4e 4f 54 45 3a 20 41 64 64 20 65 61 63 68 20 63  NOTE: Add each c
12260 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65 20 63  ritical handle c
12270 6f 75 6e 74 20 74 6f 20 74 68 65 20 72 65 73 75  ount to the resu
12280 6c 74 69 6e 67 20 6c 69 73 74 2e 0d 0a 20 20 20  lting list...   
12290 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
122a0 66 6f 72 65 61 63 68 20 6e 61 6d 65 20 5b 6c 69  foreach name [li
122b0 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 43 6f 75  st connectionCou
122c0 6e 74 20 73 74 61 74 65 6d 65 6e 74 43 6f 75 6e  nt statementCoun
122d0 74 20 62 61 63 6b 75 70 43 6f 75 6e 74 5d 20 7b  t backupCount] {
122e0 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
122f0 76 61 6c 75 65 20 5b 6f 62 6a 65 63 74 20 69 6e  value [object in
12300 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
12310 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
12320 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
12330 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66  ata.SQLite.Unsaf
12340 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20 24  eNativeMethods $
12350 6e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  name]....       
12360 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
12370 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
12380 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
12390 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
123a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
123b0 20 20 22 2d 2d 2d 2d 20 63 72 69 74 69 63 61 6c    "---- critical
123c0 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 20 5c 22   handle count \"
123d0 22 20 24 6e 61 6d 65 20 22 5c 22 20 69 73 20 22  " $name "\" is "
123e0 20 24 76 61 6c 75 65 20 5c 6e 5d 0d 0a 20 20 20   $value \n]..   
123f0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
12400 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65        lappend re
12410 73 75 6c 74 20 24 76 61 6c 75 65 0d 0a 20 20 20  sult $value..   
12420 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20       }..      } 
12430 65 6c 73 65 69 66 20 7b 21 24 71 75 69 65 74 7d  elseif {!$quiet}
12440 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
12450 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
12460 54 45 3a 20 54 68 65 20 61 63 74 75 61 6c 20 68  TE: The actual h
12470 61 6e 64 6c 65 20 63 6f 75 6e 74 73 20 61 72 65  andle counts are
12480 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 3b 20   not available; 
12490 74 68 65 72 65 66 6f 72 65 2c 20 6a 75 73 74 0d  therefore, just.
124a0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
124b0 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79   return an empty
124c0 20 6c 69 73 74 2e 0d 0a 20 20 20 20 20 20 20 20   list...        
124d0 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  #..        tputs
124e0 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
124f0 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65 20  critical handle 
12500 63 6f 75 6e 74 73 20 75 6e 61 76 61 69 6c 61 62  counts unavailab
12510 6c 65 5c 6e 22 0d 0a 20 20 20 20 20 20 7d 0d 0a  le\n"..      }..
12520 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24  ..      return $
12530 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c  result..    }...
12540 0d 0a 20 20 20 20 70 72 6f 63 20 73 68 75 74 64  ..    proc shutd
12550 6f 77 6e 53 51 4c 69 74 65 20 7b 20 63 68 61 6e  ownSQLite { chan
12560 6e 65 6c 20 7b 66 6f 72 63 65 20 66 61 6c 73 65  nel {force false
12570 7d 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20  } {quiet false} 
12580 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
12590 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 6b 65      # NOTE: Make
125a0 20 73 75 72 65 20 74 68 61 74 20 53 51 4c 69 74   sure that SQLit
125b0 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20 69  e core library i
125c0 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 73 68 75  s completely shu
125d0 74 64 6f 77 6e 2e 20 20 54 68 69 73 0d 0a 20 20  tdown.  This..  
125e0 20 20 20 20 23 20 20 20 20 20 20 20 69 73 20 75      #       is u
125f0 73 65 64 20 62 79 20 74 65 73 74 73 20 74 68 61  sed by tests tha
12600 74 20 63 68 61 6e 67 65 20 63 6f 6e 66 69 67 75  t change configu
12610 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61  ration options a
12620 6e 64 2f 6f 72 20 74 68 6f 73 65 0d 0a 20 20 20  nd/or those..   
12630 20 20 20 23 20 20 20 20 20 20 20 74 68 61 74 20     #       that 
12640 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72  need to make sur
12650 65 20 6c 6f 67 67 69 6e 67 20 69 73 20 69 6e 69  e logging is ini
12660 74 69 61 6c 69 7a 65 64 20 28 69 2e 65 2e 20 6a  tialized (i.e. j
12670 75 73 74 20 69 6e 20 63 61 73 65 0d 0a 20 20 20  ust in case..   
12680 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 53     #       the S
12690 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61  QLite core libra
126a0 72 79 20 77 61 73 20 69 6e 69 74 69 61 6c 69 7a  ry was initializ
126b0 65 64 20 69 6e 20 74 68 65 20 70 72 6f 63 65 73  ed in the proces
126c0 73 20 70 72 69 6f 72 20 74 6f 0d 0a 20 20 20 20  s prior to..    
126d0 20 20 23 20 20 20 20 20 20 20 74 68 65 20 53 51    #       the SQ
126e0 4c 69 74 65 4c 6f 67 20 63 6c 61 73 73 20 62 65  LiteLog class be
126f0 69 6e 67 20 61 62 6c 65 20 74 6f 20 73 65 74 75  ing able to setu
12700 70 20 69 74 73 20 6c 6f 67 67 69 6e 67 20 63 61  p its logging ca
12710 6c 6c 62 61 63 6b 29 2e 0d 0a 20 20 20 20 20 20  llback)...      
12720 23 20 20 20 20 20 20 20 4e 6f 72 6d 61 6c 6c 79  #       Normally
12730 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6f 6e  , this should on
12740 6c 79 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20  ly be performed 
12750 69 66 20 53 51 4c 69 74 65 20 69 73 20 6c 6f 61  if SQLite is loa
12760 64 65 64 20 61 6e 64 0d 0a 20 20 20 20 20 20 23  ded and..      #
12770 20 20 20 20 20 20 20 72 65 61 64 79 20 66 6f 72         ready for
12780 20 75 73 65 20 62 79 20 74 68 65 20 74 65 73 74   use by the test
12790 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 23   suite...      #
127a0 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 66 6f 72  ..      if {$for
127b0 63 65 20 7c 7c 20 5b 69 73 53 51 4c 69 74 65 52  ce || [isSQLiteR
127c0 65 61 64 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  eady]} then {.. 
127d0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
127e0 20 20 23 20 42 55 47 46 49 58 3a 20 42 65 66 6f    # BUGFIX: Befo
127f0 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 6e  re calling the n
12800 61 74 69 76 65 20 73 68 75 74 64 6f 77 6e 20 66  ative shutdown f
12810 75 6e 63 74 69 6f 6e 2c 20 6d 61 6b 65 20 73 75  unction, make su
12820 72 65 20 62 6f 74 68 0d 0a 20 20 20 20 20 20 20  re both..       
12830 20 23 20 20 20 20 20 20 20 20 20 6f 66 20 74 68   #         of th
12840 65 20 50 52 41 47 4d 41 20 72 65 6c 61 74 65 64  e PRAGMA related
12850 20 64 69 72 65 63 74 6f 72 79 20 6e 61 6d 65 73   directory names
12860 20 61 72 65 20 66 72 65 65 64 2e 0d 0a 20 20 20   are freed...   
12870 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
12880 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 69  checkForSQLiteDi
12890 72 65 63 74 6f 72 69 65 73 20 24 63 68 61 6e 6e  rectories $chann
128a0 65 6c 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20  el true....     
128b0 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f     if {[catch {o
128c0 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
128d0 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
128e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
128f0 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
12900 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76  Lite.UnsafeNativ
12910 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20  eMethods \..    
12920 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
12930 74 65 33 5f 73 68 75 74 64 6f 77 6e 7d 20 72 65  te3_shutdown} re
12940 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sult] == 0} then
12950 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
12960 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
12970 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
12980 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
12990 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
129a0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
129b0 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f  -- call sqlite3_
129c0 73 68 75 74 64 6f 77 6e 28 29 2e 2e 2e 20 6f 6b  shutdown()... ok
129d0 3a 20 22 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d  : " $result \n].
129e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
129f0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
12a00 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
12a10 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
12a20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
12a30 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
12a40 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
12a50 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
12a60 61 6c 6c 20 73 71 6c 69 74 65 33 5f 73 68 75 74  all sqlite3_shut
12a70 64 6f 77 6e 28 29 2e 2e 2e 20 65 72 72 6f 72 3a  down()... error:
12a80 20 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20   " \n\t $result 
12a90 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
12aa0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
12ab0 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
12ac0 20 20 20 20 70 72 6f 63 20 72 65 70 6f 72 74 53      proc reportS
12ad0 51 4c 69 74 65 52 65 73 6f 75 72 63 65 73 20 7b  QLiteResources {
12ae0 20 63 68 61 6e 6e 65 6c 20 7b 71 75 69 65 74 20   channel {quiet 
12af0 66 61 6c 73 65 7d 20 7b 63 6f 6c 6c 65 63 74 20  false} {collect 
12b00 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  true} } {..     
12b10 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
12b20 3a 20 53 6b 69 70 20 61 6c 6c 20 6f 75 74 70 75  : Skip all outpu
12b30 74 20 69 66 20 77 65 20 61 72 65 20 72 75 6e 6e  t if we are runn
12b40 69 6e 67 20 69 6e 20 22 71 75 69 65 74 22 20 6d  ing in "quiet" m
12b50 6f 64 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ode...      #.. 
12b60 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 43 6f       if {[haveCo
12b70 6e 73 74 72 61 69 6e 74 20 5c 0d 0a 20 20 20 20  nstraint \..    
12b80 20 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65            define
12b90 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74 65 6d 2e  Constant.System.
12ba0 44 61 74 61 2e 53 51 4c 69 74 65 2e 49 4e 54 45  Data.SQLite.INTE
12bb0 52 4f 50 5f 56 49 52 54 55 41 4c 5f 54 41 42 4c  ROP_VIRTUAL_TABL
12bc0 45 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  E] && \..       
12bd0 20 20 20 5b 68 61 76 65 43 6f 6e 73 74 72 61 69     [haveConstrai
12be0 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  nt \..          
12bf0 20 20 20 20 64 65 66 69 6e 65 43 6f 6e 73 74 61      defineConsta
12c00 6e 74 2e 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  nt.System.Data.S
12c10 51 4c 69 74 65 2e 54 52 41 43 4b 5f 4d 45 4d 4f  QLite.TRACK_MEMO
12c20 52 59 5f 42 59 54 45 53 5d 7d 20 74 68 65 6e 20  RY_BYTES]} then 
12c30 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  {..        if {!
12c40 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
12c50 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
12c60 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63  $channel "---- c
12c70 75 72 72 65 6e 74 20 6d 65 6d 6f 72 79 20 69 6e  urrent memory in
12c80 20 75 73 65 20 62 79 20 53 51 4c 69 74 65 4d 65   use by SQLiteMe
12c90 6d 6f 72 79 2e 2e 2e 20 22 0d 0a 20 20 20 20 20  mory... "..     
12ca0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
12cb0 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65  if {[catch {obje
12cc0 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
12cd0 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
12ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
12cf0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
12d00 65 2e 53 51 4c 69 74 65 4d 65 6d 6f 72 79 20 5c  e.SQLiteMemory \
12d10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
12d20 20 20 62 79 74 65 73 41 6c 6c 6f 63 61 74 65 64    bytesAllocated
12d30 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20  } memory] == 0} 
12d40 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
12d50 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
12d60 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
12d70 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
12d80 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
12d90 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e 22  emory " bytes\n"
12da0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
12db0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
12dc0 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
12dd0 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a  memory unknown..
12de0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
12df0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
12e00 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
12e10 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
12e20 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20  endArgs $memory 
12e30 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
12e40 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
12e50 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
12e60 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
12e70 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
12e80 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 6d 61 78 69 6d  nnel "---- maxim
12e90 75 6d 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65  um memory in use
12ea0 20 62 79 20 53 51 4c 69 74 65 4d 65 6d 6f 72 79   by SQLiteMemory
12eb0 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 20 20 7d  ... "..        }
12ec0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
12ed0 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20 69  [catch {object i
12ee0 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
12ef0 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
12f00 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
12f10 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51  m.Data.SQLite.SQ
12f20 4c 69 74 65 4d 65 6d 6f 72 79 20 5c 0d 0a 20 20  LiteMemory \..  
12f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 61                ma
12f40 78 69 6d 75 6d 42 79 74 65 73 41 6c 6c 6f 63 61  ximumBytesAlloca
12f50 74 65 64 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20  ted} memory] == 
12f60 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
12f70 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
12f80 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
12f90 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
12fa0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
12fb0 20 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65 73   $memory " bytes
12fc0 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
12fd0 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  }..        } els
12fe0 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  e {..          s
12ff0 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77  et memory unknow
13000 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n....          i
13010 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
13020 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
13030 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
13040 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f  appendArgs $memo
13050 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ry \n]..        
13060 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
13070 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
13080 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
13090 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  en {..        tp
130a0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d  uts $channel "--
130b0 2d 2d 20 63 75 72 72 65 6e 74 20 6d 65 6d 6f 72  -- current memor
130c0 79 20 69 6e 20 75 73 65 20 62 79 20 53 51 4c 69  y in use by SQLi
130d0 74 65 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 7d  te... "..      }
130e0 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63  ....      if {[c
130f0 61 74 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76  atch {object inv
13100 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
13110 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
13120 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
13130 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65  ta.SQLite.Unsafe
13140 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d  NativeMethods \.
13150 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
13160 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73  qlite3_memory_us
13170 65 64 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30  ed} memory] == 0
13180 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
13190 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
131a0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
131b0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
131c0 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d  [appendArgs $mem
131d0 6f 72 79 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d  ory " bytes\n"].
131e0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
131f0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
13200 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
13210 20 4e 4f 54 45 3a 20 4d 61 79 62 65 20 74 68 65   NOTE: Maybe the
13220 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62   SQLite core lib
13230 72 61 72 79 20 69 73 20 75 6e 61 76 61 69 6c 61  rary is unavaila
13240 62 6c 65 3f 0d 0a 20 20 20 20 20 20 20 20 23 0d  ble?..        #.
13250 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d  .        set mem
13260 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20  ory unknown.... 
13270 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
13280 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
13290 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
132a0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
132b0 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20   $memory \n]..  
132c0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
132d0 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 72 65  ....      set re
132e0 73 75 6c 74 20 24 6d 65 6d 6f 72 79 3b 20 23 20  sult $memory; # 
132f0 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 6d 65 6d  NOTE: Return mem
13300 6f 72 79 20 69 6e 2d 75 73 65 20 74 6f 20 6f 75  ory in-use to ou
13310 72 20 63 61 6c 6c 65 72 2e 0d 0a 0d 0a 20 20 20  r caller.....   
13320 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
13330 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
13340 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
13350 2d 2d 2d 2d 20 6d 61 78 69 6d 75 6d 20 6d 65 6d  ---- maximum mem
13360 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 53 51  ory in use by SQ
13370 4c 69 74 65 2e 2e 2e 20 22 0d 0a 20 20 20 20 20  Lite... "..     
13380 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   }....      if {
13390 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20 69  [catch {object i
133a0 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
133b0 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
133c0 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
133d0 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61  Data.SQLite.Unsa
133e0 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20  feNativeMethods 
133f0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
13400 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f   sqlite3_memory_
13410 68 69 67 68 77 61 74 65 72 20 30 7d 20 6d 65 6d  highwater 0} mem
13420 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ory] == 0} then 
13430 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  {..        if {!
13440 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
13450 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
13460 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
13470 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20 62  Args $memory " b
13480 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  ytes\n"]..      
13490 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73    }..      } els
134a0 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e {..        #..
134b0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
134c0 4d 61 79 62 65 20 74 68 65 20 53 51 4c 69 74 65  Maybe the SQLite
134d0 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20 69 73   core library is
134e0 20 75 6e 61 76 61 69 6c 61 62 6c 65 3f 0d 0a 20   unavailable?.. 
134f0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
13500 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b    set memory unk
13510 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nown....        
13520 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
13530 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
13540 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
13550 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72  ppendArgs $memor
13560 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d  y \n]..        }
13570 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
13580 20 20 20 69 66 20 7b 24 63 6f 6c 6c 65 63 74 7d     if {$collect}
13590 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
135a0 20 63 6f 6c 6c 65 63 74 47 61 72 62 61 67 65 20   collectGarbage 
135b0 24 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20 20  $channel..      
135c0 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21  }....      if {!
135d0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
135e0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
135f0 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 75 72  hannel "---- cur
13600 72 65 6e 74 20 6d 65 6d 6f 72 79 20 69 6e 20 75  rent memory in u
13610 73 65 20 62 79 20 74 68 65 20 43 4c 52 2e 2e 2e  se by the CLR...
13620 20 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   "..      }.... 
13630 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
13640 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47  {object invoke G
13650 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79  C GetTotalMemory
13660 20 66 61 6c 73 65 7d 20 6d 65 6d 6f 72 79 5d 20   false} memory] 
13670 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
13680 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
13690 67 20 69 73 20 69 6e 74 65 67 65 72 20 2d 73 74  g is integer -st
136a0 72 69 63 74 20 24 6d 65 6d 6f 72 79 5d 7d 20 74  rict $memory]} t
136b0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
136c0 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
136d0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
136e0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
136f0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65   [appendArgs $me
13700 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e 22 5d  mory " bytes\n"]
13710 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
13720 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
13730 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6d  .          set m
13740 65 6d 6f 72 79 20 69 6e 76 61 6c 69 64 0d 0a 0d  emory invalid...
13750 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
13760 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
13770 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
13780 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
13790 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c  ndArgs $memory \
137a0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
137b0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
137c0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
137d0 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75      set memory u
137e0 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20  nknown....      
137f0 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
13800 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
13810 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
13820 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d  [appendArgs $mem
13830 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ory \n]..       
13840 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
13850 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73       return $res
13860 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  ult..    }..... 
13870 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72     proc checkFor
13880 53 51 4c 69 74 65 44 69 72 65 63 74 6f 72 69 65  SQLiteDirectorie
13890 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 72 65 73  s { channel {res
138a0 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  et false} } {.. 
138b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
138c0 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74  NOTE: Check if t
138d0 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  he sqlite3_win32
138e0 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66  _set_directory f
138f0 75 6e 63 74 69 6f 6e 20 69 73 20 61 76 61 69 6c  unction is avail
13900 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  able...      #..
13910 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
13920 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20  nnel \..        
13930 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67    "---- checking
13940 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 73 71   for function sq
13950 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f  lite3_win32_set_
13960 64 69 72 65 63 74 6f 72 79 2e 2e 2e 20 22 0d 0a  directory... "..
13970 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
13980 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 63 61   # NOTE: This ca
13990 6c 6c 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65  ll to the sqlite
139a0 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65  3_win32_set_dire
139b0 63 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20 75  ctory function u
139c0 73 65 73 20 74 68 65 0d 0a 20 20 20 20 20 20 23  ses the..      #
139d0 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 20 76         invalid v
139e0 61 6c 75 65 20 30 20 66 6f 72 20 74 68 65 20 66  alue 0 for the f
139f0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 20  irst argument.  
13a00 54 68 69 73 20 63 6f 64 65 20 69 73 20 64 65 73  This code is des
13a10 69 67 6e 65 64 0d 0a 20 20 20 20 20 20 23 20 20  igned..      #  
13a20 20 20 20 20 20 74 6f 20 63 68 65 63 6b 20 69 66       to check if
13a30 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 66 75 6e   calling the fun
13a40 63 74 69 6f 6e 20 77 69 6c 6c 20 72 61 69 73 65  ction will raise
13a50 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 28 69   an exception (i
13a60 2e 65 2e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  .e...      #    
13a70 20 20 20 74 68 65 20 61 63 74 75 61 6c 20 72 65     the actual re
13a80 73 75 6c 74 20 6f 66 20 74 68 65 20 66 75 6e 63  sult of the func
13a90 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6d 61  tion does not ma
13aa0 74 74 65 72 20 61 73 20 6c 6f 6e 67 20 61 73 20  tter as long as 
13ab0 6e 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  no..      #     
13ac0 20 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 63    directory is c
13ad0 68 61 6e 67 65 64 29 2e 0d 0a 20 20 20 20 20 20  hanged)...      
13ae0 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  #..      if {[ca
13af0 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
13b00 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
13b10 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
13b20 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
13b30 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
13b40 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e  a.SQLite.UnsafeN
13b50 61 74 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a  ativeMethods \..
13b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
13b70 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f  lite3_win32_set_
13b80 64 69 72 65 63 74 6f 72 79 20 30 20 6e 75 6c 6c  directory 0 null
13b90 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  }] == 0} then {.
13ba0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
13bb0 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 61 6c 6c      # NOTE: Call
13bc0 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ing the sqlite3_
13bd0 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
13be0 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  ory function doe
13bf0 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20 23  s not..        #
13c00 20 20 20 20 20 20 20 63 61 75 73 65 20 61 6e 20         cause an 
13c10 65 78 63 65 70 74 69 6f 6e 3b 20 74 68 65 72 65  exception; there
13c20 66 6f 72 65 2c 20 69 74 20 6d 75 73 74 20 62 65  fore, it must be
13c30 20 61 76 61 69 6c 61 62 6c 65 20 28 69 2e 65 2e   available (i.e.
13c40 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
13c50 20 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74    even though it
13c60 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 61   should return a
13c70 20 66 61 69 6c 75 72 65 20 72 65 74 75 72 6e 20   failure return 
13c80 63 6f 64 65 20 69 6e 20 74 68 69 73 0d 0a 20 20  code in this..  
13c90 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61        #       ca
13ca0 73 65 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  se)...        #.
13cb0 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73  .        addCons
13cc0 74 72 61 69 6e 74 20 73 71 6c 69 74 65 33 5f 77  traint sqlite3_w
13cd0 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
13ce0 72 79 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70  ry....        tp
13cf0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73  uts $channel yes
13d00 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  \n....        #.
13d10 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
13d20 20 44 6f 65 73 20 6f 75 72 20 63 61 6c 6c 65 72   Does our caller
13d30 20 77 61 6e 74 20 74 6f 20 72 65 73 65 74 20 74   want to reset t
13d40 68 65 20 64 69 72 65 63 74 6f 72 69 65 73 3f 0d  he directories?.
13d50 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
13d60 20 20 20 20 69 66 20 7b 24 72 65 73 65 74 7d 20      if {$reset} 
13d70 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
13d80 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
13d90 20 4e 4f 54 45 3a 20 4e 6f 77 20 6d 61 6b 65 20   NOTE: Now make 
13da0 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73  sure the databas
13db0 65 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 20  e and temporary 
13dc0 64 69 72 65 63 74 6f 72 69 65 73 20 61 72 65 0d  directories are.
13dd0 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
13de0 20 20 20 72 65 73 65 74 20 74 68 65 69 72 20 64     reset their d
13df0 65 66 61 75 6c 74 20 76 61 6c 75 65 73 2c 20 77  efault values, w
13e00 68 69 63 68 20 73 68 6f 75 6c 64 20 62 65 20 6e  hich should be n
13e10 75 6c 6c 20 66 6f 72 20 62 6f 74 68 2e 0d 0a 20  ull for both... 
13e20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
13e30 20 53 69 6e 63 65 20 74 68 65 20 73 71 6c 69 74   Since the sqlit
13e40 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72  e3_win32_set_dir
13e50 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20  ectory function 
13e60 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 0d 0a 20  is available,.. 
13e70 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
13e80 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20   use it...      
13e90 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
13ea0 20 66 6f 72 20 7b 73 65 74 20 69 6e 64 65 78 20   for {set index 
13eb0 31 7d 20 7b 24 69 6e 64 65 78 20 3c 20 33 7d 20  1} {$index < 3} 
13ec0 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a  {incr index} {..
13ed0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
13ee0 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
13ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 62                ob
13f00 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
13f10 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
13f20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13f30 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
13f40 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61  .SQLite.UnsafeNa
13f50 74 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20  tiveMethods \.. 
13f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f70 20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32     sqlite3_win32
13f80 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 24  _set_directory $
13f90 69 6e 64 65 78 20 6e 75 6c 6c 7d 20 5c 0d 0a 20  index null} \.. 
13fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fb0 20 20 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d     result] == 0}
13fc0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
13fd0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
13fe0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
13ff0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
14000 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c         "---- cal
14010 6c 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  l sqlite3_win32_
14020 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28 22 20  set_directory(" 
14030 24 69 6e 64 65 78 20 5c 0d 0a 20 20 20 20 20 20  $index \..      
14040 20 20 20 20 20 20 20 20 20 20 20 20 22 2c 20 6e              ", n
14050 75 6c 6c 29 2e 2e 2e 20 6f 6b 3a 20 22 20 24 72  ull)... ok: " $r
14060 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20  esult \n]..     
14070 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
14080 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
14090 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
140a0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
140b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
140c0 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65  ---- call sqlite
140d0 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65  3_win32_set_dire
140e0 63 74 6f 72 79 28 22 20 24 69 6e 64 65 78 20 5c  ctory(" $index \
140f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
14100 20 20 20 20 22 2c 20 6e 75 6c 6c 29 2e 2e 2e 20      ", null)... 
14110 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72  error: " \n\t $r
14120 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20  esult \n]..     
14130 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
14140 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
14150 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
14160 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
14170 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 0d  $channel no\n...
14180 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
14190 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73      # NOTE: Does
141a0 20 6f 75 72 20 63 61 6c 6c 65 72 20 77 61 6e 74   our caller want
141b0 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 64 69   to reset the di
141c0 72 65 63 74 6f 72 69 65 73 3f 20 20 54 68 69 73  rectories?  This
141d0 20 63 61 6e 20 6f 6e 6c 79 0d 0a 20 20 20 20 20   can only..     
141e0 20 20 20 23 20 20 20 20 20 20 20 62 65 20 70 65     #       be pe
141f0 72 66 6f 72 6d 65 64 20 69 66 20 53 51 4c 69 74  rformed if SQLit
14200 65 20 69 73 20 6c 6f 61 64 65 64 20 61 6e 64 20  e is loaded and 
14210 72 65 61 64 79 20 66 6f 72 20 75 73 65 20 62 79  ready for use by
14220 20 74 68 65 20 74 65 73 74 0d 0a 20 20 20 20 20   the test..     
14230 20 20 20 23 20 20 20 20 20 20 20 73 75 69 74 65     #       suite
14240 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
14250 20 20 20 20 20 20 69 66 20 7b 24 72 65 73 65 74        if {$reset
14260 20 26 26 20 5b 69 73 53 51 4c 69 74 65 52 65 61   && [isSQLiteRea
14270 64 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  dy]} then {..   
14280 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
14290 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 20      # NOTE: Now 
142a0 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 64 61  make sure the da
142b0 74 61 62 61 73 65 20 61 6e 64 20 74 65 6d 70 6f  tabase and tempo
142c0 72 61 72 79 20 64 69 72 65 63 74 6f 72 69 65 73  rary directories
142d0 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20   are..          
142e0 23 20 20 20 20 20 20 20 72 65 73 65 74 20 74 68  #       reset th
142f0 65 69 72 20 64 65 66 61 75 6c 74 20 76 61 6c 75  eir default valu
14300 65 73 2c 20 77 68 69 63 68 20 73 68 6f 75 6c 64  es, which should
14310 20 62 65 20 6e 75 6c 6c 20 66 6f 72 20 62 6f 74   be null for bot
14320 68 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  h...          # 
14330 20 20 20 20 20 20 53 69 6e 63 65 20 74 68 65 20        Since the 
14340 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
14350 74 5f 64 69 72 65 63 74 6f 72 79 20 66 75 6e 63  t_directory func
14360 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 0d 0a 20  tion does not.. 
14370 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
14380 20 61 70 70 65 61 72 20 74 6f 20 62 65 20 61 76   appear to be av
14390 61 69 6c 61 62 6c 65 2c 20 75 73 65 20 74 68 65  ailable, use the
143a0 20 61 73 73 6f 63 69 61 74 65 64 20 50 52 41 47   associated PRAG
143b0 4d 41 20 63 6f 6d 6d 61 6e 64 73 0d 0a 20 20 20  MA commands..   
143c0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69         #       i
143d0 6e 73 74 65 61 64 2e 0d 0a 20 20 20 20 20 20 20  nstead...       
143e0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
143f0 66 6f 72 65 61 63 68 20 64 69 72 65 63 74 6f 72  foreach director
14400 79 20 5b 6c 69 73 74 20 64 61 74 61 5f 73 74 6f  y [list data_sto
14410 72 65 5f 64 69 72 65 63 74 6f 72 79 20 74 65 6d  re_directory tem
14420 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72  p_store_director
14430 79 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  y] {..          
14440 20 20 73 65 74 20 73 71 6c 20 5b 61 70 70 65 6e    set sql [appen
14450 64 41 72 67 73 20 22 50 52 41 47 4d 41 20 22 20  dArgs "PRAGMA " 
14460 24 64 69 72 65 63 74 6f 72 79 20 22 20 3d 20 5c  $directory " = \
14470 22 5c 22 3b 22 5d 0d 0a 0d 0a 20 20 20 20 20 20  "\";"]....      
14480 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
14490 20 7b 65 78 65 63 75 74 65 53 71 6c 20 24 73 71   {executeSql $sq
144a0 6c 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d  l} result] == 0}
144b0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
144c0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
144d0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
144e0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
144f0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 65 78 65         "---- exe
14500 63 75 74 65 20 50 52 41 47 4d 41 20 22 20 24 64  cute PRAGMA " $d
14510 69 72 65 63 74 6f 72 79 20 22 2e 2e 2e 20 6f 6b  irectory "... ok
14520 3a 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  : \"" \..       
14530 20 20 20 20 20 20 20 20 20 20 20 24 72 65 73 75             $resu
14540 6c 74 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  lt \"\n]..      
14550 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
14560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
14570 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
14580 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
14590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
145a0 2d 2d 2d 20 65 78 65 63 75 74 65 20 50 52 41 47  --- execute PRAG
145b0 4d 41 20 22 20 24 64 69 72 65 63 74 6f 72 79 20  MA " $directory 
145c0 22 2e 2e 2e 20 65 72 72 6f 72 3a 20 22 20 5c 0d  "... error: " \.
145d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
145e0 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20     \n\t $result 
145f0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n]..           
14600 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
14610 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
14620 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
14630 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69        # NOTE: Fi
14640 6e 61 6c 6c 79 2c 20 73 68 6f 77 20 74 68 65 20  nally, show the 
14650 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  current value of
14660 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e   the database an
14670 64 20 74 65 6d 70 6f 72 61 72 79 0d 0a 20 20 20  d temporary..   
14680 20 20 20 23 20 20 20 20 20 20 20 64 69 72 65 63     #       direc
14690 74 6f 72 69 65 73 2e 20 20 54 68 69 73 20 63 61  tories.  This ca
146a0 6e 20 6f 6e 6c 79 20 62 65 20 70 65 72 66 6f 72  n only be perfor
146b0 6d 65 64 20 69 66 20 53 51 4c 69 74 65 20 69 73  med if SQLite is
146c0 20 6c 6f 61 64 65 64 0d 0a 20 20 20 20 20 20 23   loaded..      #
146d0 20 20 20 20 20 20 20 61 6e 64 20 72 65 61 64 79         and ready
146e0 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20   for use by the 
146f0 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20  test suite...   
14700 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
14710 5b 69 73 53 51 4c 69 74 65 52 65 61 64 79 5d 7d  [isSQLiteReady]}
14720 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
14730 20 66 6f 72 65 61 63 68 20 64 69 72 65 63 74 6f   foreach directo
14740 72 79 20 5b 6c 69 73 74 20 64 61 74 61 5f 73 74  ry [list data_st
14750 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20 74 65  ore_directory te
14760 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  mp_store_directo
14770 72 79 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  ry] {..         
14780 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
14790 5b 61 70 70 65 6e 64 41 72 67 73 20 22 2d 2d 2d  [appendArgs "---
147a0 2d 20 63 68 65 63 6b 69 6e 67 20 22 20 24 64 69  - checking " $di
147b0 72 65 63 74 6f 72 79 20 22 2e 2e 2e 20 22 5d 0d  rectory "... "].
147c0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  ...          set
147d0 20 73 71 6c 20 5b 61 70 70 65 6e 64 41 72 67 73   sql [appendArgs
147e0 20 22 50 52 41 47 4d 41 20 22 20 24 64 69 72 65   "PRAGMA " $dire
147f0 63 74 6f 72 79 20 5c 3b 5d 0d 0a 0d 0a 20 20 20  ctory \;]....   
14800 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
14810 68 20 7b 65 78 65 63 75 74 65 53 71 6c 20 24 73  h {executeSql $s
14820 71 6c 20 73 63 61 6c 61 72 7d 20 72 65 73 75 6c  ql scalar} resul
14830 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  t] == 0} then {.
14840 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
14850 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
14860 65 6e 64 41 72 67 73 20 22 6f 6b 3a 20 5c 22 22  endArgs "ok: \""
14870 20 24 72 65 73 75 6c 74 20 5c 22 5c 6e 5d 0d 0a   $result \"\n]..
14880 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
14890 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
148a0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
148b0 61 70 70 65 6e 64 41 72 67 73 20 22 65 72 72 6f  appendArgs "erro
148c0 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c  r: " \n\t $resul
148d0 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  t \n]..         
148e0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
148f0 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
14900 0d 0a 20 20 20 20 70 72 6f 63 20 6c 6f 61 64 53  ..    proc loadS
14910 51 4c 69 74 65 54 65 73 74 53 65 74 74 69 6e 67  QLiteTestSetting
14920 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 73 75 66  s { channel {suf
14930 66 69 78 20 22 22 7d 20 7b 71 75 69 65 74 20 66  fix ""} {quiet f
14940 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  alse} } {..     
14950 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
14960 3a 20 53 6b 69 70 20 6c 6f 61 64 69 6e 67 20 74  : Skip loading t
14970 68 65 20 73 65 74 74 69 6e 67 73 20 69 66 20 74  he settings if t
14980 68 65 69 72 20 75 73 61 67 65 20 68 61 73 20 62  heir usage has b
14990 65 65 6e 20 64 69 73 61 62 6c 65 64 2e 0d 0a 20  een disabled... 
149a0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
149b0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
149c0 3a 3a 6e 6f 28 73 71 6c 69 74 65 54 65 73 74 53  ::no(sqliteTestS
149d0 65 74 74 69 6e 67 73 29 5d 7d 20 74 68 65 6e 20  ettings)]} then 
149e0 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
149f0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f        # NOTE: Lo
14a00 61 64 20 63 75 73 74 6f 6d 20 70 65 72 2d 75 73  ad custom per-us
14a10 65 72 20 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f  er and/or per-ho
14a20 73 74 20 74 65 73 74 20 73 65 74 74 69 6e 67 73  st test settings
14a30 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23   now...        #
14a40 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69  ..        if {[i
14a50 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63 6c  nfo exists ::tcl
14a60 5f 70 6c 61 74 66 6f 72 6d 28 75 73 65 72 29 5d  _platform(user)]
14a70 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
14a80 20 20 20 20 73 65 74 20 75 73 65 72 53 65 74 74      set userSett
14a90 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 5b 66 69  ingsFileName [fi
14aa0 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 43 6f 6d 6d  le join [getComm
14ab0 6f 6e 44 69 72 65 63 74 6f 72 79 5d 20 5c 0d 0a  onDirectory] \..
14ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 61                [a
14ad0 70 70 65 6e 64 41 72 67 73 20 73 65 74 74 69 6e  ppendArgs settin
14ae0 67 73 20 24 73 75 66 66 69 78 20 2e 20 24 3a 3a  gs $suffix . $::
14af0 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 75 73 65  tcl_platform(use
14b00 72 29 20 2e 65 61 67 6c 65 5d 5d 0d 0a 0d 0a 20  r) .eagle]].... 
14b10 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69           if {[fi
14b20 6c 65 20 65 78 69 73 74 73 20 24 75 73 65 72 53  le exists $userS
14b30 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 5d  ettingsFileName]
14b40 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
14b50 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
14b60 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
14b70 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
14b80 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
14b90 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
14ba0 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c           "---- l
14bb0 6f 61 64 69 6e 67 20 70 65 72 2d 75 73 65 72 20  oading per-user 
14bc0 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 66 69  test settings fi
14bd0 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  le \"" \..      
14be0 20 20 20 20 20 20 20 20 20 20 20 20 24 75 73 65              $use
14bf0 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d  rSettingsFileNam
14c00 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 20 20 20 20  e \"...\n]..    
14c10 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
14c20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
14c30 74 63 68 20 7b 75 70 6c 65 76 65 6c 20 31 20 5b  tch {uplevel 1 [
14c40 6c 69 73 74 20 73 6f 75 72 63 65 20 24 75 73 65  list source $use
14c50 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d  rSettingsFileNam
14c60 65 5d 7d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  e]} \..         
14c70 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72             error
14c80 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
14c90 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
14ca0 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
14cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
14cc0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
14cd0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
14ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14cf0 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
14d00 61 69 6c 65 64 20 74 6f 20 6c 6f 61 64 20 70 65  ailed to load pe
14d10 72 2d 75 73 65 72 20 73 65 74 74 69 6e 67 73 20  r-user settings 
14d20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20  file \"" \..    
14d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d40 24 75 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c  $userSettingsFil
14d50 65 4e 61 6d 65 20 22 5c 22 2c 20 65 72 72 6f 72  eName "\", error
14d60 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20  : " \n\t $error 
14d70 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n]..           
14d80 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
14d90 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
14da0 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
14db0 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
14dc0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
14dd0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
14de0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
14df0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
14e00 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b          "---- sk
14e10 69 70 70 65 64 20 6c 6f 61 64 69 6e 67 20 70 65  ipped loading pe
14e20 72 2d 75 73 65 72 20 74 65 73 74 20 73 65 74 74  r-user test sett
14e30 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d  ings file \"" \.
14e40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14e50 20 20 20 24 75 73 65 72 53 65 74 74 69 6e 67 73     $userSettings
14e60 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 69 74  FileName "\", it
14e70 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c   does not exist\
14e80 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n"]..           
14e90 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
14ea0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
14eb0 20 20 20 20 20 20 23 23 23 23 23 23 23 23 23 23        ##########
14ec0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
14ed0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
14ee0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
14ef0 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d  #############...
14f00 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  .        if {[in
14f10 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f  fo exists ::tcl_
14f20 70 6c 61 74 66 6f 72 6d 28 68 6f 73 74 29 5d 7d  platform(host)]}
14f30 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
14f40 20 20 20 73 65 74 20 68 6f 73 74 53 65 74 74 69     set hostSetti
14f50 6e 67 73 46 69 6c 65 4e 61 6d 65 20 5b 66 69 6c  ngsFileName [fil
14f60 65 20 6a 6f 69 6e 20 5b 67 65 74 43 6f 6d 6d 6f  e join [getCommo
14f70 6e 44 69 72 65 63 74 6f 72 79 5d 20 5c 0d 0a 20  nDirectory] \.. 
14f80 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 61 70               [ap
14f90 70 65 6e 64 41 72 67 73 20 73 65 74 74 69 6e 67  pendArgs setting
14fa0 73 20 24 73 75 66 66 69 78 20 2e 20 24 3a 3a 74  s $suffix . $::t
14fb0 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 68 6f 73 74  cl_platform(host
14fc0 29 20 2e 65 61 67 6c 65 5d 5d 0d 0a 0d 0a 20 20  ) .eagle]]....  
14fd0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c          if {[fil
14fe0 65 20 65 78 69 73 74 73 20 24 68 6f 73 74 53 65  e exists $hostSe
14ff0 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 5d 7d  ttingsFileName]}
15000 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
15010 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
15020 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
15030 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
15040 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
15050 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
15060 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 6f          "---- lo
15070 61 64 69 6e 67 20 70 65 72 2d 68 6f 73 74 20 74  ading per-host t
15080 65 73 74 20 73 65 74 74 69 6e 67 73 20 66 69 6c  est settings fil
15090 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  e \"" \..       
150a0 20 20 20 20 20 20 20 20 20 20 20 24 68 6f 73 74             $host
150b0 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65  SettingsFileName
150c0 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 20 20 20 20 20   \"...\n]..     
150d0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
150e0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
150f0 63 68 20 7b 75 70 6c 65 76 65 6c 20 31 20 5b 6c  ch {uplevel 1 [l
15100 69 73 74 20 73 6f 75 72 63 65 20 24 68 6f 73 74  ist source $host
15110 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65  SettingsFileName
15120 5d 7d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ]} \..          
15130 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 5d            error]
15140 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
15150 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
15160 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
15170 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
15180 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
15190 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
151a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
151b0 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
151c0 69 6c 65 64 20 74 6f 20 6c 6f 61 64 20 70 65 72  iled to load per
151d0 2d 68 6f 73 74 20 73 65 74 74 69 6e 67 73 20 66  -host settings f
151e0 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ile \"" \..     
151f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
15200 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65  hostSettingsFile
15210 4e 61 6d 65 20 22 5c 22 2c 20 65 72 72 6f 72 3a  Name "\", error:
15220 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c   " \n\t $error \
15230 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
15240 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
15250 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20   }..          } 
15260 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
15270 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
15280 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
15290 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
152a0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
152b0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
152c0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69         "---- ski
152d0 70 70 65 64 20 6c 6f 61 64 69 6e 67 20 70 65 72  pped loading per
152e0 2d 68 6f 73 74 20 74 65 73 74 20 73 65 74 74 69  -host test setti
152f0 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a  ngs file \"" \..
15300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15310 20 20 24 68 6f 73 74 53 65 74 74 69 6e 67 73 46    $hostSettingsF
15320 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 69 74 20  ileName "\", it 
15330 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e  does not exist\n
15340 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  "]..            
15350 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
15360 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
15370 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
15380 20 20 70 72 6f 63 20 72 75 6e 53 51 4c 69 74 65    proc runSQLite
15390 54 65 73 74 50 72 6f 6c 6f 67 75 65 20 7b 7d 20  TestPrologue {} 
153a0 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
153b0 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 72    # NOTE: Skip r
153c0 75 6e 6e 69 6e 67 20 6f 75 72 20 63 75 73 74 6f  unning our custo
153d0 6d 20 70 72 6f 6c 6f 67 75 65 20 69 66 20 74 68  m prologue if th
153e0 65 20 6d 61 69 6e 20 6f 6e 65 20 68 61 73 20 62  e main one has b
153f0 65 65 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  een..      #    
15400 20 20 20 73 6b 69 70 70 65 64 2e 0d 0a 20 20 20     skipped...   
15410 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
15420 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
15430 6e 6f 28 70 72 6f 6c 6f 67 75 65 2e 65 61 67 6c  no(prologue.eagl
15440 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  e)]} then {..   
15450 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
15460 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 74 68 65  # NOTE: Load the
15470 20 22 62 65 66 6f 72 65 2d 63 6f 6e 73 74 72 61   "before-constra
15480 69 6e 74 73 22 20 63 75 73 74 6f 6d 20 70 65 72  ints" custom per
15490 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20 70 65 72  -user and/or per
154a0 2d 68 6f 73 74 0d 0a 20 20 20 20 20 20 20 20 23  -host..        #
154b0 20 20 20 20 20 20 20 74 65 73 74 20 73 65 74 74         test sett
154c0 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  ings now...     
154d0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 75 70     #..        up
154e0 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 6c 6f  level 1 [list lo
154f0 61 64 53 51 4c 69 74 65 54 65 73 74 53 65 74 74  adSQLiteTestSett
15500 69 6e 67 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  ings $::test_cha
15510 6e 6e 65 6c 20 2e 62 65 66 6f 72 65 5d 0d 0a 0d  nnel .before]...
15520 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
15530 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 65 74 65      # NOTE: Dete
15540 72 6d 69 6e 65 20 74 68 65 20 6e 61 6d 65 73 20  rmine the names 
15550 6f 66 20 74 68 65 20 6e 61 74 69 76 65 20 70 6c  of the native pl
15560 61 74 66 6f 72 6d 20 61 6e 64 20 61 72 63 68 69  atform and archi
15570 74 65 63 74 75 72 65 2e 0d 0a 20 20 20 20 20 20  tecture...      
15580 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74    #..        set
15590 20 70 6c 61 74 66 6f 72 6d 20 5b 67 65 74 42 75   platform [getBu
155a0 69 6c 64 50 6c 61 74 66 6f 72 6d 20 74 72 75 65  ildPlatform true
155b0 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 61  ]..        set a
155c0 72 63 68 69 74 65 63 74 75 72 65 20 5b 61 72 63  rchitecture [arc
155d0 68 69 74 65 63 74 75 72 65 46 6f 72 50 6c 61 74  hitectureForPlat
155e0 66 6f 72 6d 20 24 70 6c 61 74 66 6f 72 6d 5d 0d  form $platform].
155f0 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
15600 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68        # NOTE: Sh
15610 6f 77 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 20  ow the platform 
15620 61 6e 64 20 61 72 63 68 69 74 65 63 74 75 72 65  and architecture
15630 20 75 73 65 64 20 74 6f 20 68 65 6c 70 20 6c 6f   used to help lo
15640 63 61 74 65 20 74 68 65 0d 0a 20 20 20 20 20 20  cate the..      
15650 20 20 23 20 20 20 20 20 20 20 6e 61 74 69 76 65    #       native
15660 20 62 75 69 6c 64 20 66 69 6c 65 73 2e 0d 0a 20   build files... 
15670 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
15680 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
15690 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
156a0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
156b0 20 20 20 22 2d 2d 2d 2d 20 70 6c 61 74 66 6f 72     "---- platfor
156c0 6d 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67 20 6e  m for locating n
156d0 61 74 69 76 65 20 62 75 69 6c 64 20 66 69 6c 65  ative build file
156e0 73 20 69 73 20 5c 22 22 20 5c 0d 0a 20 20 20 20  s is \"" \..    
156f0 20 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72          $platfor
15700 6d 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20  m \"\n]....     
15710 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
15720 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
15730 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
15740 20 20 20 20 22 2d 2d 2d 2d 20 61 72 63 68 69 74      "---- archit
15750 65 63 74 75 72 65 20 66 6f 72 20 6c 6f 63 61 74  ecture for locat
15760 69 6e 67 20 6e 61 74 69 76 65 20 62 75 69 6c 64  ing native build
15770 20 66 69 6c 65 73 20 69 73 20 5c 22 22 20 5c 0d   files is \"" \.
15780 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 61 72  .            $ar
15790 63 68 69 74 65 63 74 75 72 65 20 5c 22 5c 6e 5d  chitecture \"\n]
157a0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
157b0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42         # NOTE: B
157c0 75 69 6c 64 20 61 20 6c 69 73 74 20 6f 66 20 63  uild a list of c
157d0 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 69 6c  onfiguration fil
157e0 65 73 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c  es that we handl
157f0 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
15800 20 20 20 20 20 20 20 73 65 74 20 63 6f 6e 66 69         set confi
15810 67 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74  gFileNames [list
15820 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
15830 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
15840 74 65 2e 64 6c 6c 2e 63 6f 6e 66 69 67 5d 0d 0a  te.dll.config]..
15850 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
15860 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69       # NOTE: Bui
15870 6c 64 20 61 20 6c 69 73 74 20 6f 66 20 61 75 78  ld a list of aux
15880 69 6c 69 61 72 79 20 4d 61 6e 61 67 65 64 20 44  iliary Managed D
15890 65 62 75 67 67 69 6e 67 20 41 73 73 69 73 74 61  ebugging Assista
158a0 6e 74 73 20 28 4d 44 41 29 0d 0a 20 20 20 20 20  nts (MDA)..     
158b0 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 66 69     #       confi
158c0 67 75 72 61 74 69 6f 6e 20 66 69 6c 65 73 20 74  guration files t
158d0 68 61 74 20 77 65 20 68 61 6e 64 6c 65 2e 0d 0a  hat we handle...
158e0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
158f0 20 20 20 73 65 74 20 6d 64 61 43 6f 6e 66 69 67     set mdaConfig
15900 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74 20  FileNames [list 
15910 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 49  \..            I
15920 6e 73 74 61 6c 6c 65 72 2e 65 78 65 2e 6d 64 61  nstaller.exe.mda
15930 2e 63 6f 6e 66 69 67 20 74 65 73 74 2e 65 78 65  .config test.exe
15940 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 5c 0d 0a 20  .mda.config \.. 
15950 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 6c             testl
15960 69 6e 71 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66  inq.exe.mda.conf
15970 69 67 20 74 65 73 74 65 66 36 2e 65 78 65 2e 6d  ig testef6.exe.m
15980 64 61 2e 63 6f 6e 66 69 67 5d 0d 0a 0d 0a 20 20  da.config]....  
15990 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
159a0 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74   # NOTE: Build t
159b0 68 65 20 6c 69 73 74 20 6f 66 20 65 78 74 65 72  he list of exter
159c0 6e 61 6c 20 66 69 6c 65 73 20 74 68 61 74 20 77  nal files that w
159d0 65 20 68 61 6e 64 6c 65 2e 20 20 53 6f 6d 65 20  e handle.  Some 
159e0 6f 66 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  of..        #   
159f0 20 20 20 20 74 68 65 73 65 20 66 69 6c 65 73 20      these files 
15a00 6d 61 79 20 62 65 20 6e 61 74 69 76 65 20 61 6e  may be native an
15a10 64 2f 6f 72 20 6d 61 6e 61 67 65 64 20 61 73 73  d/or managed ass
15a20 65 6d 62 6c 69 65 73 20 74 68 61 74 20 61 72 65  emblies that are
15a30 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
15a40 20 20 72 65 71 75 69 72 65 64 20 74 6f 20 70 65    required to pe
15a50 72 66 6f 72 6d 20 76 61 72 69 6f 75 73 20 74 65  rform various te
15a60 73 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  sts...        #.
15a70 0a 20 20 20 20 20 20 20 20 73 65 74 20 65 78 74  .        set ext
15a80 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 73 20 5b  ernalFileNames [
15a90 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  list \..        
15aa0 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 45      [file join E
15ab0 6e 74 69 74 79 46 72 61 6d 65 77 6f 72 6b 20 6c  ntityFramework l
15ac0 69 62 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b  ib [string map [
15ad0 6c 69 73 74 20 46 78 20 22 22 5d 20 5b 73 74 72  list Fx ""] [str
15ae0 69 6e 67 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ing \..         
15af0 20 20 20 6d 61 70 20 5b 6c 69 73 74 20 6e 65 74     map [list net
15b00 46 78 34 35 31 20 6e 65 74 46 78 34 35 5d 20 5b  Fx451 netFx45] [
15b10 67 65 74 42 75 69 6c 64 4e 65 74 46 78 5d 5d 5d  getBuildNetFx]]]
15b20 20 45 6e 74 69 74 79 46 72 61 6d 65 77 6f 72 6b   EntityFramework
15b30 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  .dll]]....      
15b40 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
15b50 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 6c  OTE: Build the l
15b60 69 73 74 20 6f 66 20 6e 61 74 69 76 65 20 61 73  ist of native as
15b70 73 65 6d 62 6c 79 20 66 69 6c 65 73 20 74 68 61  sembly files tha
15b80 74 20 77 65 20 68 61 6e 64 6c 65 2e 20 20 54 68  t we handle.  Th
15b90 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
15ba0 20 20 20 72 65 61 73 6f 6e 20 74 68 65 20 22 53     reason the "S
15bb0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
15bc0 65 2e 64 6c 6c 22 20 66 69 6c 65 20 69 73 20 69  e.dll" file is i
15bd0 6e 63 6c 75 64 65 64 20 68 65 72 65 20 69 73 0d  ncluded here is.
15be0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
15bf0 20 62 65 63 61 75 73 65 20 69 74 20 63 6f 75 6c   because it coul
15c00 64 20 62 65 20 74 68 65 20 6d 69 78 65 64 2d 6d  d be the mixed-m
15c10 6f 64 65 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20  ode assembly... 
15c20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
15c30 20 20 73 65 74 20 6e 61 74 69 76 65 46 69 6c 65    set nativeFile
15c40 4e 61 6d 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20  Names [list \.. 
15c50 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
15c60 65 33 2e 64 6c 6c 20 53 51 4c 69 74 65 2e 49 6e  e3.dll SQLite.In
15c70 74 65 72 6f 70 2e 64 6c 6c 20 53 79 73 74 65 6d  terop.dll System
15c80 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
15c90 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
15ca0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
15cb0 42 75 69 6c 64 20 74 68 65 20 6c 69 73 74 20 6f  Build the list o
15cc0 66 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62  f managed assemb
15cd0 6c 79 20 66 69 6c 65 73 20 74 68 61 74 20 77 65  ly files that we
15ce0 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20   handle...      
15cf0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74    #..        set
15d00 20 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65   managedFileName
15d10 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20  s [list \..     
15d20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
15d30 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 20 53 79  ta.SQLite.dll Sy
15d40 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
15d50 2e 4c 69 6e 71 2e 64 6c 6c 20 5c 0d 0a 20 20 20  .Linq.dll \..   
15d60 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
15d70 44 61 74 61 2e 53 51 4c 69 74 65 2e 45 46 36 2e  Data.SQLite.EF6.
15d80 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  dll]....        
15d90 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
15da0 45 3a 20 52 65 6d 6f 76 65 20 61 6e 79 20 74 65  E: Remove any te
15db0 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  st constraints t
15dc0 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65  hat refer to the
15dd0 20 6e 61 74 69 76 65 20 61 6e 64 2f 6f 72 0d 0a   native and/or..
15de0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
15df0 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79  managed assembly
15e00 20 66 69 6c 65 73 20 74 68 61 74 20 77 65 20 68   files that we h
15e10 61 6e 64 6c 65 20 75 6e 6c 65 73 73 20 66 6f 72  andle unless for
15e20 62 69 64 64 65 6e 20 66 72 6f 6d 0d 0a 20 20 20  bidden from..   
15e30 20 20 20 20 20 23 20 20 20 20 20 20 20 64 6f 69       #       doi
15e40 6e 67 20 73 6f 2e 0d 0a 20 20 20 20 20 20 20 20  ng so...        
15e50 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  #..        if {!
15e60 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
15e70 6f 28 73 71 6c 69 74 65 52 65 6d 6f 76 65 43 6f  o(sqliteRemoveCo
15e80 6e 73 74 72 61 69 6e 74 73 29 5d 7d 20 74 68 65  nstraints)]} the
15e90 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66  n {..          f
15ea0 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
15eb0 24 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73  $configFileNames
15ec0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
15ed0 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74  removeConstraint
15ee0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
15ef0 65 5f 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20  e_ $fileName].. 
15f00 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
15f10 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
15f20 66 69 6c 65 4e 61 6d 65 20 24 6d 64 61 43 6f 6e  fileName $mdaCon
15f30 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  figFileNames {..
15f40 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f              remo
15f50 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
15f60 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 24  pendArgs file_ $
15f70 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20  fileName]..     
15f80 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
15f90 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
15fa0 4e 61 6d 65 20 24 65 78 74 65 72 6e 61 6c 46 69  Name $externalFi
15fb0 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
15fc0 20 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e         removeCon
15fd0 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
15fe0 72 67 73 20 66 69 6c 65 5f 20 5b 66 69 6c 65 20  rgs file_ [file 
15ff0 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d  tail $fileName]]
16000 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
16010 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61  .          forea
16020 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74  ch fileName $nat
16030 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  iveFileNames {..
16040 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f              remo
16050 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
16060 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 24  pendArgs file_ $
16070 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20  fileName]..     
16080 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
16090 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
160a0 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64 46 69 6c  Name $managedFil
160b0 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
160c0 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73        removeCons
160d0 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
160e0 67 73 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61  gs file_ $fileNa
160f0 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  me]..          }
16100 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
16110 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
16120 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 61    # NOTE: Skip a
16130 6c 6c 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  ll System.Data.S
16140 51 4c 69 74 65 20 72 65 6c 61 74 65 64 20 66 69  QLite related fi
16150 6c 65 20 68 61 6e 64 6c 69 6e 67 20 28 64 65 6c  le handling (del
16160 65 74 69 6e 67 2c 0d 0a 20 20 20 20 20 20 20 20  eting,..        
16170 23 20 20 20 20 20 20 20 63 6f 70 79 69 6e 67 2c  #       copying,
16180 20 61 6e 64 20 6c 6f 61 64 69 6e 67 29 20 69 66   and loading) if
16190 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20   instructed...  
161a0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
161b0 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
161c0 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 46 69  ts ::no(sqliteFi
161d0 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
161e0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
161f0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b        # NOTE: Sk
16200 69 70 20 74 72 79 69 6e 67 20 74 6f 20 64 65 6c  ip trying to del
16210 65 74 65 20 61 6e 79 20 66 69 6c 65 73 20 69 66  ete any files if
16220 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20   instructed...  
16230 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
16240 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
16250 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65  exists ::no(dele
16260 74 65 53 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d  teSqliteFiles)]}
16270 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
16280 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
16290 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65  exists ::no(dele
162a0 74 65 53 71 6c 69 74 65 43 6f 6e 66 69 67 46 69  teSqliteConfigFi
162b0 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
162c0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
162d0 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 63  each fileName $c
162e0 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b  onfigFileNames {
162f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
16300 20 20 74 72 79 44 65 6c 65 74 65 42 69 6e 61 72    tryDeleteBinar
16310 79 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d  yFile $fileName.
16320 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
16330 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
16340 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
16350 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
16360 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69   ::no(deleteSqli
16370 74 65 45 78 74 65 72 6e 61 6c 46 69 6c 65 73 29  teExternalFiles)
16380 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
16390 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
163a0 20 66 69 6c 65 4e 61 6d 65 20 24 6d 64 61 43 6f   fileName $mdaCo
163b0 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  nfigFileNames {.
163c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
163d0 20 74 72 79 44 65 6c 65 74 65 42 75 69 6c 64 46   tryDeleteBuildF
163e0 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20  ile $fileName.. 
163f0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
16400 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
16410 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
16420 20 24 65 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61   $externalFileNa
16430 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
16440 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65         tryDelete
16450 42 69 6e 61 72 79 46 69 6c 65 20 24 66 69 6c 65  BinaryFile $file
16460 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Name..          
16470 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
16480 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
16490 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
164a0 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74  xists ::no(delet
164b0 65 53 71 6c 69 74 65 4e 61 74 69 76 65 46 69 6c  eSqliteNativeFil
164c0 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
164d0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
164e0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
164f0 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 49  no(deleteSqliteI
16500 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d 20  mplicitFiles)]} 
16510 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
16520 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
16530 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65  fileName $native
16540 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
16550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
16560 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79  ryDeleteAssembly
16570 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20   $fileName..    
16580 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
16590 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
165a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
165b0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
165c0 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c  s ::no(deleteSql
165d0 69 74 65 4e 6f 6e 49 6d 70 6c 69 63 69 74 46 69  iteNonImplicitFi
165e0 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
165f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
16600 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
16610 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69   ::no(deleteSqli
16620 74 65 50 6c 61 74 66 6f 72 6d 46 69 6c 65 73 29  tePlatformFiles)
16630 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
16640 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72              [str
16650 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74  ing length $plat
16660 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20  form] > 0} then 
16670 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
16680 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
16690 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c  eName $nativeFil
166a0 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
166b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
166c0 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79 20  yDeleteAssembly 
166d0 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66  $fileName $platf
166e0 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  orm..           
166f0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
16700 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
16710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
16720 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
16730 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69   ::no(deleteSqli
16740 74 65 41 72 63 68 69 74 65 63 74 75 72 65 46 69  teArchitectureFi
16750 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20  les)] && \..    
16760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16770 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
16780 61 72 63 68 69 74 65 63 74 75 72 65 5d 20 3e 20  architecture] > 
16790 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
167a0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
167b0 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e  each fileName $n
167c0 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b  ativeFileNames {
167d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
167e0 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 41        tryDeleteA
167f0 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d  ssembly $fileNam
16800 65 20 24 61 72 63 68 69 74 65 63 74 75 72 65 0d  e $architecture.
16810 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16820 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
16830 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
16840 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
16850 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
16860 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
16870 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65  o exists ::no(de
16880 6c 65 74 65 53 71 6c 69 74 65 4d 61 6e 61 67 65  leteSqliteManage
16890 64 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  dFiles)]} then {
168a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
168b0 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
168c0 20 24 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d   $managedFileNam
168d0 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
168e0 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 41        tryDeleteA
168f0 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d  ssembly $fileNam
16900 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
16910 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
16920 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
16930 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
16940 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
16950 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20 22   Check for the "
16960 61 75 74 6f 53 65 6c 65 63 74 22 20 72 75 6e 74  autoSelect" runt
16970 69 6d 65 20 6f 70 74 69 6f 6e 2e 20 20 49 66 20  ime option.  If 
16980 70 72 65 73 65 6e 74 2c 0d 0a 20 20 20 20 20 20  present,..      
16990 20 20 20 20 23 20 20 20 20 20 20 20 61 74 74 65      #       atte
169a0 6d 70 74 20 74 6f 20 61 75 74 6f 6d 61 74 69 63  mpt to automatic
169b0 61 6c 6c 79 20 73 65 6c 65 63 74 20 74 68 65 20  ally select the 
169c0 66 69 72 73 74 20 61 76 61 69 6c 61 62 6c 65 0d  first available.
169d0 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
169e0 20 20 20 62 75 69 6c 64 20 28 6f 72 20 22 72 65     build (or "re
169f0 6c 65 61 73 65 22 29 20 6f 66 20 53 51 4c 69 74  lease") of SQLit
16a00 65 20 61 6e 64 20 53 79 73 74 65 6d 2e 44 61 74  e and System.Dat
16a10 61 2e 53 51 4c 69 74 65 0d 0a 20 20 20 20 20 20  a.SQLite..      
16a20 20 20 20 20 23 20 20 20 20 20 20 20 66 6f 72 20      #       for 
16a30 75 73 65 20 77 69 74 68 20 74 68 65 20 74 65 73  use with the tes
16a40 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20  t suite...      
16a50 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
16a60 20 69 66 20 7b 5b 68 61 73 52 75 6e 74 69 6d 65   if {[hasRuntime
16a70 4f 70 74 69 6f 6e 20 61 75 74 6f 53 65 6c 65 63  Option autoSelec
16a80 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  t]} then {..    
16a90 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 63 68          if {![ch
16aa0 65 63 6b 46 6f 72 53 51 4c 69 74 65 42 75 69 6c  eckForSQLiteBuil
16ab0 64 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ds $::test_chann
16ac0 65 6c 20 74 72 75 65 5d 7d 20 74 68 65 6e 20 7b  el true]} then {
16ad0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
16ae0 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 52 65  checkForSQLiteRe
16af0 6c 65 61 73 65 73 20 24 3a 3a 74 65 73 74 5f 63  leases $::test_c
16b00 68 61 6e 6e 65 6c 20 74 72 75 65 0d 0a 20 20 20  hannel true..   
16b10 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
16b20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
16b30 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
16b40 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74    # NOTE: Skip t
16b50 72 79 69 6e 67 20 74 6f 20 76 65 72 69 66 79 20  rying to verify 
16b60 74 68 65 20 62 75 69 6c 64 20 64 69 72 65 63 74  the build direct
16b70 6f 72 79 20 69 66 20 69 6e 73 74 72 75 63 74 65  ory if instructe
16b80 64 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  d;..          # 
16b90 20 20 20 20 20 20 6f 74 68 65 72 77 69 73 65 2c        otherwise,
16ba0 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20 61 63   make sure it ac
16bb0 74 75 61 6c 6c 79 20 65 78 69 73 74 73 20 6f 72  tually exists or
16bc0 20 68 61 6c 74 20 74 68 65 20 65 6e 74 69 72 65   halt the entire
16bd0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
16be0 20 20 20 20 74 65 73 74 69 6e 67 20 70 72 6f 63      testing proc
16bf0 65 73 73 20 69 66 20 69 74 20 64 6f 65 73 20 6e  ess if it does n
16c00 6f 74 20 65 78 69 73 74 2e 0d 0a 20 20 20 20 20  ot exist...     
16c10 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
16c20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
16c30 73 74 73 20 3a 3a 6e 6f 28 76 65 72 69 66 79 42  sts ::no(verifyB
16c40 75 69 6c 64 44 69 72 65 63 74 6f 72 79 29 5d 7d  uildDirectory)]}
16c50 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
16c60 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
16c70 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 20 74      # NOTE: At t
16c80 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 62  his point, the b
16c90 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20 4d  uild directory M
16ca0 55 53 54 20 65 78 69 73 74 20 61 73 20 61 0d 0a  UST exist as a..
16cb0 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
16cc0 20 20 20 20 76 61 6c 69 64 20 64 69 72 65 63 74      valid direct
16cd0 6f 72 79 20 66 6f 72 20 74 68 65 20 74 65 73 74  ory for the test
16ce0 69 6e 67 20 70 72 6f 63 65 73 73 20 74 6f 20 63  ing process to c
16cf0 6f 6e 74 69 6e 75 65 2e 0d 0a 20 20 20 20 20 20  ontinue...      
16d00 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
16d10 20 20 20 20 20 73 65 74 20 64 69 72 65 63 74 6f       set directo
16d20 72 79 20 5b 67 65 74 42 75 69 6c 64 44 69 72 65  ry [getBuildDire
16d30 63 74 6f 72 79 5d 0d 0a 0d 0a 20 20 20 20 20 20  ctory]....      
16d40 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65        if {![file
16d50 20 65 78 69 73 74 73 20 24 64 69 72 65 63 74 6f   exists $directo
16d60 72 79 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20  ry] || \..      
16d70 20 20 20 20 20 20 20 20 20 20 21 5b 66 69 6c 65            ![file
16d80 20 69 73 64 69 72 65 63 74 6f 72 79 20 24 64 69   isdirectory $di
16d90 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b  rectory]} then {
16da0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
16db0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
16dc0 20 23 20 4e 4f 54 45 3a 20 4a 75 73 74 20 70 72   # NOTE: Just pr
16dd0 69 6f 72 20 74 6f 20 61 63 74 75 61 6c 6c 79 20  ior to actually 
16de0 68 61 6c 74 69 6e 67 20 74 68 65 20 74 65 73 74  halting the test
16df0 69 6e 67 20 70 72 6f 63 65 73 73 2c 0d 0a 20 20  ing process,..  
16e00 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
16e10 20 20 20 20 61 64 64 20 61 6e 20 65 72 72 6f 72      add an error
16e20 20 74 6f 20 74 68 65 20 74 65 73 74 20 6c 6f 67   to the test log
16e30 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20   file...        
16e40 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
16e50 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
16e60 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
16e70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
16e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
16e90 2d 2d 2d 20 63 6f 75 6c 64 20 6e 6f 74 20 76 65  --- could not ve
16ea0 72 69 66 79 20 62 75 69 6c 64 20 64 69 72 65 63  rify build direc
16eb0 74 6f 72 79 20 5c 22 22 20 24 64 69 72 65 63 74  tory \"" $direct
16ec0 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ory \..         
16ed0 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 61 6c           "\", al
16ee0 6c 20 74 65 73 74 69 6e 67 20 68 61 6c 74 65 64  l testing halted
16ef0 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  \n"]....        
16f00 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
16f10 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52         # NOTE: R
16f20 61 69 73 69 6e 67 20 61 20 73 63 72 69 70 74 20  aising a script 
16f30 65 72 72 6f 72 20 66 72 6f 6d 20 74 68 69 73 20  error from this 
16f40 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 68 61 6c  point should hal
16f50 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t..             
16f60 20 23 20 20 20 20 20 20 20 74 68 65 20 74 65 73   #       the tes
16f70 74 69 6e 67 20 70 72 6f 63 65 73 73 2e 0d 0a 20  ting process... 
16f80 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
16f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72                er
16fa0 72 6f 72 20 5b 61 70 70 65 6e 64 41 72 67 73 20  ror [appendArgs 
16fb0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
16fc0 20 20 20 20 20 22 63 6f 75 6c 64 20 6e 6f 74 20       "could not 
16fd0 76 65 72 69 66 79 20 62 75 69 6c 64 20 64 69 72  verify build dir
16fe0 65 63 74 6f 72 79 20 5c 22 22 20 24 64 69 72 65  ectory \"" $dire
16ff0 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20  ctory \..       
17000 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20             "\", 
17010 61 6c 6c 20 74 65 73 74 69 6e 67 20 68 61 6c 74  all testing halt
17020 65 64 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  ed"]..          
17030 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
17040 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  ....          #.
17050 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
17060 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74  E: Skip trying t
17070 6f 20 63 6f 70 79 20 61 6e 79 20 66 69 6c 65 73  o copy any files
17080 20 69 66 20 69 6e 73 74 72 75 63 74 65 64 2e 0d   if instructed..
17090 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
170a0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
170b0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63  fo exists ::no(c
170c0 6f 70 79 53 71 6c 69 74 65 46 69 6c 65 73 29 5d  opySqliteFiles)]
170d0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
170e0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
170f0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70   exists ::no(cop
17100 79 53 71 6c 69 74 65 43 6f 6e 66 69 67 46 69 6c  ySqliteConfigFil
17110 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
17120 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
17130 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 63 6f  ach fileName $co
17140 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  nfigFileNames {.
17150 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17160 20 74 72 79 43 6f 70 79 42 75 69 6c 64 46 69 6c   tryCopyBuildFil
17170 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  e $fileName..   
17180 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
17190 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
171a0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
171b0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
171c0 6f 28 63 6f 70 79 53 71 6c 69 74 65 45 78 74 65  o(copySqliteExte
171d0 72 6e 61 6c 46 69 6c 65 73 29 5d 7d 20 74 68 65  rnalFiles)]} the
171e0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
171f0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
17200 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 70 79      # NOTE: Copy
17210 20 74 68 65 20 4d 61 6e 61 67 65 64 20 44 65 62   the Managed Deb
17220 75 67 67 69 6e 67 20 41 73 73 69 73 74 61 6e 74  ugging Assistant
17230 73 20 28 4d 44 41 29 20 63 6f 6e 66 69 67 75 72  s (MDA) configur
17240 61 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20  ation..         
17250 20 20 20 20 20 23 20 20 20 20 20 20 20 66 69 6c       #       fil
17260 65 20 66 6f 72 20 74 68 65 20 45 61 67 6c 65 20  e for the Eagle 
17270 73 68 65 6c 6c 20 74 6f 20 74 68 65 20 62 75 69  shell to the bui
17280 6c 64 20 6f 75 74 70 75 74 20 64 69 72 65 63 74  ld output direct
17290 6f 72 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ory,..          
172a0 20 20 20 20 23 20 20 20 20 20 20 20 77 68 69 6c      #       whil
172b0 65 20 75 73 69 6e 67 20 65 61 63 68 20 6f 66 20  e using each of 
172c0 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65  the names of the
172d0 20 76 61 72 69 6f 75 73 20 6c 65 67 61 63 79 20   various legacy 
172e0 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20 20 20  test..          
172f0 20 20 20 20 23 20 20 20 20 20 20 20 65 78 65 63      #       exec
17300 75 74 61 62 6c 65 73 2e 20 20 54 68 69 73 20 77  utables.  This w
17310 69 6c 6c 20 68 65 6c 70 20 74 6f 20 6d 61 6b 65  ill help to make
17320 20 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20 74   sure that all t
17330 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  he..            
17340 20 20 23 20 20 20 20 20 20 20 6c 65 67 61 63 79    #       legacy
17350 20 74 65 73 74 73 20 72 75 6e 20 77 69 74 68 20   tests run with 
17360 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65  exactly the same
17370 20 73 65 74 20 6f 66 20 4d 61 6e 61 67 65 64 0d   set of Managed.
17380 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
17390 20 20 20 20 20 20 20 44 65 62 75 67 67 69 6e 67         Debugging
173a0 20 41 73 73 69 73 74 61 6e 74 73 20 63 6f 6e 66   Assistants conf
173b0 69 67 75 72 65 64 2e 0d 0a 20 20 20 20 20 20 20  igured...       
173c0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
173d0 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
173e0 66 69 6c 65 4e 61 6d 65 20 24 6d 64 61 43 6f 6e  fileName $mdaCon
173f0 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  figFileNames {..
17400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17410 74 72 79 43 6f 70 79 42 69 6e 61 72 79 46 69 6c  tryCopyBinaryFil
17420 65 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65  e EagleShell.exe
17430 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 22 22 20 24  .mda.config "" $
17440 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20  fileName..      
17450 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
17460 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61             forea
17470 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 65 78 74  ch fileName $ext
17480 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 73 20 7b  ernalFileNames {
17490 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
174a0 20 20 74 72 79 43 6f 70 79 45 78 74 65 72 6e 61    tryCopyExterna
174b0 6c 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d  lFile $fileName.
174c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
174d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
174e0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
174f0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
17500 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65   ::no(copySqlite
17510 4e 61 74 69 76 65 46 69 6c 65 73 29 5d 7d 20 74  NativeFiles)]} t
17520 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
17530 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
17540 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79  exists ::no(copy
17550 53 71 6c 69 74 65 49 6d 70 6c 69 63 69 74 46 69  SqliteImplicitFi
17560 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
17570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
17580 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
17590 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73  $nativeFileNames
175a0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
175b0 20 20 20 20 20 20 74 72 79 43 6f 70 79 41 73 73        tryCopyAss
175c0 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 0d  embly $fileName.
175d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
175e0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
175f0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
17600 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
17610 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79  exists ::no(copy
17620 53 71 6c 69 74 65 4e 6f 6e 49 6d 70 6c 69 63 69  SqliteNonImplici
17630 74 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  tFiles)]} then {
17640 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17650 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
17660 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c  sts ::no(copySql
17670 69 74 65 50 6c 61 74 66 6f 72 6d 46 69 6c 65 73  itePlatformFiles
17680 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  )] && \..       
17690 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74               [st
176a0 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61  ring length $pla
176b0 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e  tform] > 0} then
176c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
176d0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
176e0 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69  leName $nativeFi
176f0 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
17700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
17710 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 24  ryCopyAssembly $
17720 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f  fileName $platfo
17730 72 6d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  rm..            
17740 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
17750 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
17760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
17770 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
17780 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 41  ::no(copySqliteA
17790 72 63 68 69 74 65 63 74 75 72 65 46 69 6c 65 73  rchitectureFiles
177a0 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  )] && \..       
177b0 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74               [st
177c0 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 61 72 63  ring length $arc
177d0 68 69 74 65 63 74 75 72 65 5d 20 3e 20 30 7d 20  hitecture] > 0} 
177e0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
177f0 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
17800 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69  h fileName $nati
17810 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  veFileNames {.. 
17820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17830 20 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62     tryCopyAssemb
17840 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 24 61 72  ly $fileName $ar
17850 63 68 69 74 65 63 74 75 72 65 0d 0a 20 20 20 20  chitecture..    
17860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
17870 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17880 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
17890 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
178a0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
178b0 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
178c0 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c  sts ::no(copySql
178d0 69 74 65 4d 61 6e 61 67 65 64 46 69 6c 65 73 29  iteManagedFiles)
178e0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
178f0 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
17900 20 66 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67   fileName $manag
17910 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  edFileNames {.. 
17920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
17930 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 24  ryCopyAssembly $
17940 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20  fileName..      
17950 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
17960 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
17970 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
17980 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
17990 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72 79  # NOTE: Skip try
179a0 69 6e 67 20 74 6f 20 6c 6f 61 64 20 61 6e 79 20  ing to load any 
179b0 66 69 6c 65 73 20 69 66 20 69 6e 73 74 72 75 63  files if instruc
179c0 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ted...          
179d0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  #..          if 
179e0 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
179f0 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 46 69  :no(loadSqliteFi
17a00 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
17a10 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
17a20 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
17a30 6f 28 6c 6f 61 64 53 71 6c 69 74 65 49 6d 70 6c  o(loadSqliteImpl
17a40 69 63 69 74 46 69 6c 65 73 29 5d 7d 20 74 68 65  icitFiles)]} the
17a50 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
17a60 20 20 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62     tryLoadAssemb
17a70 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  ly System.Data.S
17a80 51 4c 69 74 65 2e 64 6c 6c 0d 0a 20 20 20 20 20  QLite.dll..     
17a90 20 20 20 20 20 20 20 20 20 74 72 79 4c 6f 61 64           tryLoad
17aa0 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e  Assembly System.
17ab0 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71  Data.SQLite.Linq
17ac0 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20  .dll..          
17ad0 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73 65 6d      tryLoadAssem
17ae0 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  bly System.Data.
17af0 53 51 4c 69 74 65 2e 45 46 36 2e 64 6c 6c 0d 0a  SQLite.EF6.dll..
17b00 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
17b10 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
17b20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
17b30 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 4e 6f  :no(loadSqliteNo
17b40 6e 49 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d  nImplicitFiles)]
17b50 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
17b60 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
17b70 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c  fo exists ::no(l
17b80 6f 61 64 53 71 6c 69 74 65 50 6c 61 74 66 6f 72  oadSqlitePlatfor
17b90 6d 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20  mFiles)] && \.. 
17ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17bb0 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
17bc0 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20  $platform] > 0} 
17bd0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
17be0 20 20 20 20 20 20 20 20 74 72 79 4c 6f 61 64 41          tryLoadA
17bf0 73 73 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44  ssembly System.D
17c00 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 20 24  ata.SQLite.dll $
17c10 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20  platform..      
17c20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
17c30 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
17c40 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
17c50 6f 28 6c 6f 61 64 53 71 6c 69 74 65 41 72 63 68  o(loadSqliteArch
17c60 69 74 65 63 74 75 72 65 46 69 6c 65 73 29 5d 20  itectureFiles)] 
17c70 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
17c80 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
17c90 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74 65 63  length $architec
17ca0 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ture] > 0} then 
17cb0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
17cc0 20 20 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62     tryLoadAssemb
17cd0 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  ly System.Data.S
17ce0 51 4c 69 74 65 2e 64 6c 6c 20 24 61 72 63 68 69  QLite.dll $archi
17cf0 74 65 63 74 75 72 65 0d 0a 20 20 20 20 20 20 20  tecture..       
17d00 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
17d10 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
17d20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
17d30 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68  ...        catch
17d40 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
17d50 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
17d60 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
17d70 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
17d80 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73   "---- file vers
17d90 69 6f 6e 20 6f 66 20 5c 22 73 71 6c 69 74 65 33  ion of \"sqlite3
17da0 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5c 0d 0a 20  .dll\"... " \.. 
17db0 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69               [fi
17dc0 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67 65 74 42  le version [getB
17dd0 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 73 71  inaryFileName sq
17de0 6c 69 74 65 33 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d  lite3.dll]] \n].
17df0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
17e00 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20        catch {.. 
17e10 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
17e20 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
17e30 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
17e40 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
17e50 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f  - file version o
17e60 66 20 5c 22 53 51 4c 69 74 65 2e 49 6e 74 65 72  f \"SQLite.Inter
17e70 6f 70 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5c 0d  op.dll\"... " \.
17e80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
17e90 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67 65  file version [ge
17ea0 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
17eb0 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64  SQLite.Interop.d
17ec0 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  ll]] \n]..      
17ed0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63    }....        c
17ee0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
17ef0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
17f00 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
17f10 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
17f20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20       "---- file 
17f30 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53 79 73  version of \"Sys
17f40 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
17f50 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5c 0d 0a 20 20  dll\"... " \..  
17f60 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
17f70 65 20 76 65 72 73 69 6f 6e 20 5b 67 65 74 42 69  e version [getBi
17f80 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 53 79 73  naryFileName Sys
17f90 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
17fa0 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20  dll]] \n]..     
17fb0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
17fc0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
17fd0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
17fe0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
17ff0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
18000 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65        "---- file
18010 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53 79   version of \"Sy
18020 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
18030 2e 4c 69 6e 71 2e 64 6c 6c 5c 22 2e 2e 2e 20 22  .Linq.dll\"... "
18040 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
18050 20 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20    [file version 
18060 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61  [getBinaryFileNa
18070 6d 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  me System.Data.S
18080 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 5d 5d  QLite.Linq.dll]]
18090 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d   \n]..        }.
180a0 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68  ...        catch
180b0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
180c0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
180d0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
180e0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
180f0 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73   "---- file vers
18100 69 6f 6e 20 6f 66 20 5c 22 53 79 73 74 65 6d 2e  ion of \"System.
18110 44 61 74 61 2e 53 51 4c 69 74 65 2e 45 46 36 2e  Data.SQLite.EF6.
18120 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5c 0d 0a 20 20  dll\"... " \..  
18130 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
18140 65 20 76 65 72 73 69 6f 6e 20 5b 67 65 74 42 69  e version [getBi
18150 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 53 79 73  naryFileName Sys
18160 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
18170 45 46 36 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20  EF6.dll]] \n].. 
18180 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
18190 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
181a0 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d  length $platform
181b0 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
181c0 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b           catch {
181d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
181e0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
181f0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
18200 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
18210 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65     "---- file ve
18220 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24 70 6c  rsion of \"" $pl
18230 61 74 66 6f 72 6d 20 5c 0d 0a 20 20 20 20 20 20  atform \..      
18240 20 20 20 20 20 20 20 20 20 20 22 2f 73 71 6c 69            "/sqli
18250 74 65 33 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5b  te3.dll\"... " [
18260 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a  file version \..
18270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18280 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61  [getBinaryFileNa
18290 6d 65 20 73 71 6c 69 74 65 33 2e 64 6c 6c 20 24  me sqlite3.dll $
182a0 70 6c 61 74 66 6f 72 6d 5d 5d 20 5c 6e 5d 0d 0a  platform]] \n]..
182b0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
182c0 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b           catch {
182d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
182e0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
182f0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
18300 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
18310 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65     "---- file ve
18320 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24 70 6c  rsion of \"" $pl
18330 61 74 66 6f 72 6d 20 5c 0d 0a 20 20 20 20 20 20  atform \..      
18340 20 20 20 20 20 20 20 20 20 20 22 2f 53 51 4c 69            "/SQLi
18350 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 5c 22  te.Interop.dll\"
18360 2e 2e 2e 20 22 20 5b 66 69 6c 65 20 76 65 72 73  ... " [file vers
18370 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ion \..         
18380 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61 72         [getBinar
18390 79 46 69 6c 65 4e 61 6d 65 20 53 51 4c 69 74 65  yFileName SQLite
183a0 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 20 24 70 6c  .Interop.dll $pl
183b0 61 74 66 6f 72 6d 5d 5d 20 5c 6e 5d 0d 0a 20 20  atform]] \n]..  
183c0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
183d0 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a         catch {..
183e0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
183f0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
18400 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
18410 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18420 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73   "---- file vers
18430 69 6f 6e 20 6f 66 20 5c 22 22 20 24 70 6c 61 74  ion of \"" $plat
18440 66 6f 72 6d 20 5c 0d 0a 20 20 20 20 20 20 20 20  form \..        
18450 20 20 20 20 20 20 20 20 22 2f 53 79 73 74 65 6d          "/System
18460 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
18470 5c 22 2e 2e 2e 20 22 20 5b 66 69 6c 65 20 76 65  \"... " [file ve
18480 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20  rsion \..       
18490 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e           [getBin
184a0 61 72 79 46 69 6c 65 4e 61 6d 65 20 53 79 73 74  aryFileName Syst
184b0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
184c0 6c 6c 20 24 70 6c 61 74 66 6f 72 6d 5d 5d 20 5c  ll $platform]] \
184d0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
184e0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
184f0 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
18500 67 20 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74  g length $archit
18510 65 63 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65  ecture] > 0} the
18520 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  n {..          c
18530 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
18540 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
18550 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
18560 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
18570 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66           "---- f
18580 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c  ile version of \
18590 22 22 20 24 61 72 63 68 69 74 65 63 74 75 72 65  "" $architecture
185a0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
185b0 20 20 20 20 22 2f 73 71 6c 69 74 65 33 2e 64 6c      "/sqlite3.dl
185c0 6c 5c 22 2e 2e 2e 20 22 20 5b 66 69 6c 65 20 76  l\"... " [file v
185d0 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20  ersion \..      
185e0 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 69            [getBi
185f0 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 73 71 6c  naryFileName sql
18600 69 74 65 33 2e 64 6c 6c 20 24 61 72 63 68 69 74  ite3.dll $archit
18610 65 63 74 75 72 65 5d 5d 20 5c 6e 5d 0d 0a 20 20  ecture]] \n]..  
18620 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
18630 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a         catch {..
18640 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
18650 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
18660 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
18670 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18680 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73   "---- file vers
18690 69 6f 6e 20 6f 66 20 5c 22 22 20 24 61 72 63 68  ion of \"" $arch
186a0 69 74 65 63 74 75 72 65 20 5c 0d 0a 20 20 20 20  itecture \..    
186b0 20 20 20 20 20 20 20 20 20 20 20 20 22 2f 53 51              "/SQ
186c0 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c  Lite.Interop.dll
186d0 5c 22 2e 2e 2e 20 22 20 5b 66 69 6c 65 20 76 65  \"... " [file ve
186e0 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20  rsion \..       
186f0 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e           [getBin
18700 61 72 79 46 69 6c 65 4e 61 6d 65 20 53 51 4c 69  aryFileName SQLi
18710 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 20 24  te.Interop.dll $
18720 61 72 63 68 69 74 65 63 74 75 72 65 5d 5d 20 5c  architecture]] \
18730 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
18740 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61 74  ...          cat
18750 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
18760 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
18770 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
18780 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
18790 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c         "---- fil
187a0 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22  e version of \""
187b0 20 24 61 72 63 68 69 74 65 63 74 75 72 65 20 5c   $architecture \
187c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
187d0 20 20 22 2f 53 79 73 74 65 6d 2e 44 61 74 61 2e    "/System.Data.
187e0 53 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20  SQLite.dll\"... 
187f0 22 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20  " [file version 
18800 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
18810 20 20 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c     [getBinaryFil
18820 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74  eName System.Dat
18830 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 20 24 61 72  a.SQLite.dll $ar
18840 63 68 69 74 65 63 74 75 72 65 5d 5d 20 5c 6e 5d  chitecture]] \n]
18850 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
18860 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
18870 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
18880 20 4e 4f 54 45 3a 20 47 72 61 62 20 74 68 65 20   NOTE: Grab the 
18890 6c 69 73 74 20 6f 66 20 6d 61 6e 61 67 65 64 20  list of managed 
188a0 61 73 73 65 6d 62 6c 69 65 73 20 66 6f 72 20 74  assemblies for t
188b0 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65  he current proce
188c0 73 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ss..        #   
188d0 20 20 20 20 61 6e 64 20 72 65 70 6f 72 74 20 6f      and report o
188e0 6e 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74  n the System.Dat
188f0 61 2e 53 51 4c 69 74 65 20 72 65 6c 61 74 65 64  a.SQLite related
18900 20 6f 6e 65 73 2e 0d 0a 20 20 20 20 20 20 20 20   ones...        
18910 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 61  #..        set a
18920 73 73 65 6d 62 6c 69 65 73 20 5b 6f 62 6a 65 63  ssemblies [objec
18930 74 20 69 6e 76 6f 6b 65 20 41 70 70 44 6f 6d 61  t invoke AppDoma
18940 69 6e 2e 43 75 72 72 65 6e 74 44 6f 6d 61 69 6e  in.CurrentDomain
18950 20 47 65 74 41 73 73 65 6d 62 6c 69 65 73 5d 0d   GetAssemblies].
18960 0a 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63  ...        objec
18970 74 20 66 6f 72 65 61 63 68 20 61 73 73 65 6d 62  t foreach assemb
18980 6c 79 20 24 61 73 73 65 6d 62 6c 69 65 73 20 7b  ly $assemblies {
18990 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
189a0 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 5c 7b  [string match \{
189b0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
189c0 74 65 2a 20 24 61 73 73 65 6d 62 6c 79 5d 7d 20  te* $assembly]} 
189d0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
189e0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
189f0 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
18a00 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
18a10 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66           "---- f
18a20 6f 75 6e 64 20 6c 6f 61 64 65 64 20 61 73 73 65  ound loaded asse
18a30 6d 62 6c 79 3a 20 22 20 24 61 73 73 65 6d 62 6c  mbly: " $assembl
18a40 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  y \n]..         
18a50 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
18a60 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b  .        catch {
18a70 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
18a80 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
18a90 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l \..           
18aa0 20 20 20 22 2d 2d 2d 2d 20 64 65 66 69 6e 65 20     "---- define 
18ab0 63 6f 6e 73 74 61 6e 74 73 20 66 6f 72 20 5c 22  constants for \"
18ac0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
18ad0 74 65 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  te\"... "....   
18ae0 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
18af0 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65  h {object invoke
18b00 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
18b10 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
18b20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
18b30 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74  ata.SQLite.SQLit
18b40 65 33 20 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e  e3 DefineConstan
18b50 74 73 7d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ts} \..         
18b60 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 43           defineC
18b70 6f 6e 73 74 61 6e 74 73 5d 20 3d 3d 20 30 7d 20  onstants] == 0} 
18b80 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
18b90 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
18ba0 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
18bb0 64 41 72 67 73 20 5b 66 6f 72 6d 61 74 4c 69 73  dArgs [formatLis
18bc0 74 20 5b 6c 73 6f 72 74 20 5c 0d 0a 20 20 20 20  t [lsort \..    
18bd0 20 20 20 20 20 20 20 20 20 20 20 20 24 64 65 66              $def
18be0 69 6e 65 43 6f 6e 73 74 61 6e 74 73 5d 20 3c 6e  ineConstants] <n
18bf0 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20  one>] \n]..     
18c00 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
18c10 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
18c20 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
18c30 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20   unknown\n..    
18c40 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
18c50 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61   }....        ca
18c60 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
18c70 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
18c80 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20  hannel \..      
18c90 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6f          "---- so
18ca0 75 72 63 65 20 76 65 72 73 69 6f 6e 20 6f 66 20  urce version of 
18cb0 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  \"System.Data.SQ
18cc0 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 0d  Lite.dll\"... ".
18cd0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
18ce0 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20  {[catch {object 
18cf0 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
18d00 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
18d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
18d20 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
18d30 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f  .SQLiteConnectio
18d40 6e 20 50 72 6f 76 69 64 65 72 56 65 72 73 69 6f  n ProviderVersio
18d50 6e 7d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  n} \..          
18d60 20 20 20 20 20 20 20 20 76 65 72 73 69 6f 6e 5d          version]
18d70 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
18d80 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
18d90 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76  string length $v
18da0 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68  ersion] == 0} th
18db0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
18dc0 20 20 20 20 73 65 74 20 76 65 72 73 69 6f 6e 20      set version 
18dd0 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20  null..          
18de0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
18df0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
18e00 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
18e10 67 73 20 24 76 65 72 73 69 6f 6e 20 5c 6e 5d 0d  gs $version \n].
18e20 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
18e30 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
18e40 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
18e50 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e  hannel unknown\n
18e60 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
18e70 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
18e80 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
18e90 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
18ea0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a  test_channel \..
18eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
18ec0 2d 2d 2d 20 73 6f 75 72 63 65 20 63 68 65 63 6b  --- source check
18ed0 6f 75 74 20 6f 66 20 5c 22 53 79 73 74 65 6d 2e  out of \"System.
18ee0 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c  Data.SQLite.dll\
18ef0 22 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  "... "....      
18f00 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
18f10 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
18f20 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
18f30 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
18f40 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
18f50 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 43 6f  .SQLite.SQLiteCo
18f60 6e 6e 65 63 74 69 6f 6e 20 50 72 6f 76 69 64 65  nnection Provide
18f70 72 53 6f 75 72 63 65 49 64 7d 20 5c 0d 0a 20 20  rSourceId} \..  
18f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f90 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20  sourceId] == 0} 
18fa0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
18fb0 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
18fc0 6c 65 6e 67 74 68 20 24 73 6f 75 72 63 65 49 64  length $sourceId
18fd0 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
18fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
18ff0 74 20 73 6f 75 72 63 65 49 64 20 6e 75 6c 6c 0d  t sourceId null.
19000 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
19010 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
19020 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
19030 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 73  l [appendArgs $s
19040 6f 75 72 63 65 49 64 20 5c 6e 5d 0d 0a 20 20 20  ourceId \n]..   
19050 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
19060 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
19070 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
19080 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20  el unknown\n..  
19090 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
190a0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
190b0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
190c0 45 3a 20 43 68 65 63 6b 20 74 68 65 20 61 76 61  E: Check the ava
190d0 69 6c 61 62 6c 65 20 62 75 69 6c 64 73 20 28 61  ilable builds (a
190e0 6e 64 20 22 72 65 6c 65 61 73 65 73 22 29 20 6f  nd "releases") o
190f0 66 20 53 51 4c 69 74 65 20 61 6e 64 0d 0a 20 20  f SQLite and..  
19100 20 20 20 20 20 20 23 20 20 20 20 20 20 20 53 79        #       Sy
19110 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
19120 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
19130 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51        checkForSQ
19140 4c 69 74 65 42 75 69 6c 64 73 20 24 3a 3a 74 65  LiteBuilds $::te
19150 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20  st_channel..    
19160 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69      checkForSQLi
19170 74 65 52 65 6c 65 61 73 65 73 20 24 3a 3a 74 65  teReleases $::te
19180 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20  st_channel....  
19190 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
191a0 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 2c 20 77 65   # NOTE: Now, we
191b0 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 66   need to know if
191c0 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65   the SQLite core
191d0 20 6c 69 62 72 61 72 79 20 69 73 20 61 76 61 69   library is avai
191e0 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 23  lable..        #
191f0 20 20 20 20 20 20 20 28 69 2e 65 2e 20 62 65 63         (i.e. bec
19200 61 75 73 65 20 74 68 65 20 6d 61 6e 61 67 65 64  ause the managed
19210 2d 6f 6e 6c 79 20 53 79 73 74 65 6d 2e 44 61 74  -only System.Dat
19220 61 2e 53 51 4c 69 74 65 20 61 73 73 65 6d 62 6c  a.SQLite assembl
19230 79 20 63 61 6e 0d 0a 20 20 20 20 20 20 20 20 23  y can..        #
19240 20 20 20 20 20 20 20 6c 6f 61 64 20 77 69 74 68         load with
19250 6f 75 74 20 69 74 3b 20 68 6f 77 65 76 65 72 2c  out it; however,
19260 20 69 74 20 63 61 6e 6e 6f 74 20 64 6f 20 61 6e   it cannot do an
19270 79 74 68 69 6e 67 20 75 73 65 66 75 6c 20 77 69  ything useful wi
19280 74 68 6f 75 74 0d 0a 20 20 20 20 20 20 20 20 23  thout..        #
19290 20 20 20 20 20 20 20 69 74 29 2e 20 20 49 66 20         it).  If 
192a0 77 65 20 61 72 65 20 75 73 69 6e 67 20 74 68 65  we are using the
192b0 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65   mixed-mode asse
192c0 6d 62 6c 79 20 61 6e 64 20 77 65 20 61 6c 72 65  mbly and we alre
192d0 61 64 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ady..        #  
192e0 20 20 20 20 20 66 6f 75 6e 64 20 69 74 20 28 61       found it (a
192f0 62 6f 76 65 29 2c 20 74 68 69 73 20 73 68 6f 75  bove), this shou
19300 6c 64 20 61 6c 77 61 79 73 20 73 75 63 63 65 65  ld always succee
19310 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  d...        #.. 
19320 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53         checkForS
19330 51 4c 69 74 65 4c 69 62 72 61 72 79 20 24 3a 3a  QLiteLibrary $::
19340 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a  test_channel....
19350 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
19360 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
19370 20 69 66 20 74 68 65 20 53 51 4c 69 74 65 20 69   if the SQLite i
19380 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20  nterop assembly 
19390 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20  is available... 
193a0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
193b0 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65    checkForSQLite
193c0 49 6e 74 65 72 6f 70 20 24 3a 3a 74 65 73 74 5f  Interop $::test_
193d0 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20  channel....     
193e0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
193f0 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20  NOTE: Check the 
19400 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20  SQLite database 
19410 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 64 69  and temporary di
19420 72 65 63 74 6f 72 69 65 73 2e 0d 0a 20 20 20 20  rectories...    
19430 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63      #..        c
19440 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 69 72  heckForSQLiteDir
19450 65 63 74 6f 72 69 65 73 20 24 3a 3a 74 65 73 74  ectories $::test
19460 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20  _channel....    
19470 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
19480 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
19490 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 76  o determine if v
194a0 61 72 69 6f 75 73 20 63 6f 6d 70 69 6c 65 2d 74  arious compile-t
194b0 69 6d 65 20 6f 70 74 69 6f 6e 73 20 6e 65 65 64  ime options need
194c0 65 64 20 66 6f 72 0d 0a 20 20 20 20 20 20 20 20  ed for..        
194d0 23 20 20 20 20 20 20 20 74 65 73 74 20 63 6f 6e  #       test con
194e0 73 74 72 61 69 6e 74 73 20 77 65 72 65 20 65 6e  straints were en
194f0 61 62 6c 65 64 20 66 6f 72 20 74 68 65 20 6d 61  abled for the ma
19500 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 2e 20  naged assembly. 
19510 20 54 68 65 72 65 0d 0a 20 20 20 20 20 20 20 20   There..        
19520 23 20 20 20 20 20 20 20 61 72 65 20 73 6f 6d 65  #       are some
19530 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
19540 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20  tions that must 
19550 61 6c 73 6f 20 68 61 76 65 20 62 65 65 6e 20 65  also have been e
19560 6e 61 62 6c 65 64 0d 0a 20 20 20 20 20 20 20 20  nabled..        
19570 23 20 20 20 20 20 20 20 66 6f 72 20 74 68 65 20  #       for the 
19580 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79  interop assembly
19590 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20   in order to be 
195a0 65 66 66 65 63 74 69 76 65 2e 20 20 46 6f 72 20  effective.  For 
195b0 74 68 6f 73 65 0d 0a 20 20 20 20 20 20 20 20 23  those..        #
195c0 20 20 20 20 20 20 20 6f 70 74 69 6f 6e 73 2c 20         options, 
195d0 69 74 20 77 69 6c 6c 20 62 65 20 61 73 73 75 6d  it will be assum
195e0 65 64 20 74 68 61 74 20 69 74 20 77 61 73 20 65  ed that it was e
195f0 6e 61 62 6c 65 64 20 66 6f 72 20 74 68 65 20 69  nabled for the i
19600 6e 74 65 72 6f 70 0d 0a 20 20 20 20 20 20 20 20  nterop..        
19610 23 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79  #       assembly
19620 20 69 66 20 69 74 20 77 61 73 20 65 6e 61 62 6c   if it was enabl
19630 65 64 20 66 6f 72 20 74 68 65 20 6d 61 6e 61 67  ed for the manag
19640 65 64 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20  ed assembly...  
19650 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
19660 20 66 6f 72 65 61 63 68 20 64 65 66 69 6e 65 43   foreach defineC
19670 6f 6e 73 74 61 6e 74 20 5b 6c 69 73 74 20 5c 0d  onstant [list \.
19680 0a 20 20 20 20 20 20 20 20 20 20 20 20 43 48 45  .            CHE
19690 43 4b 5f 53 54 41 54 45 20 43 4f 55 4e 54 5f 48  CK_STATE COUNT_H
196a0 41 4e 44 4c 45 20 44 45 42 55 47 20 49 4e 54 45  ANDLE DEBUG INTE
196b0 52 4f 50 5f 43 4f 44 45 43 20 49 4e 54 45 52 4f  ROP_CODEC INTERO
196c0 50 5f 44 45 42 55 47 20 5c 0d 0a 20 20 20 20 20  P_DEBUG \..     
196d0 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 45         INTEROP_E
196e0 58 54 45 4e 53 49 4f 4e 5f 46 55 4e 43 54 49 4f  XTENSION_FUNCTIO
196f0 4e 53 20 49 4e 54 45 52 4f 50 5f 4c 45 47 41 43  NS INTEROP_LEGAC
19700 59 5f 43 4c 4f 53 45 20 49 4e 54 45 52 4f 50 5f  Y_CLOSE INTEROP_
19710 4c 4f 47 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  LOG \..         
19720 20 20 20 49 4e 54 45 52 4f 50 5f 54 45 53 54 5f     INTEROP_TEST_
19730 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54 45 52 4f  EXTENSION INTERO
19740 50 5f 56 49 52 54 55 41 4c 5f 54 41 42 4c 45 20  P_VIRTUAL_TABLE 
19750 4e 45 54 5f 32 30 20 4e 45 54 5f 33 35 20 5c 0d  NET_20 NET_35 \.
19760 0a 20 20 20 20 20 20 20 20 20 20 20 20 4e 45 54  .            NET
19770 5f 34 30 20 4e 45 54 5f 34 35 20 4e 45 54 5f 34  _40 NET_45 NET_4
19780 35 31 20 4e 45 54 5f 43 4f 4d 50 41 43 54 5f 32  51 NET_COMPACT_2
19790 30 20 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50 41  0 PLATFORM_COMPA
197a0 43 54 46 52 41 4d 45 57 4f 52 4b 20 5c 0d 0a 20  CTFRAMEWORK \.. 
197b0 20 20 20 20 20 20 20 20 20 20 20 50 52 45 4c 4f             PRELO
197c0 41 44 5f 4e 41 54 49 56 45 5f 4c 49 42 52 41 52  AD_NATIVE_LIBRAR
197d0 59 20 52 45 54 41 52 47 45 54 41 42 4c 45 20 53  Y RETARGETABLE S
197e0 51 4c 49 54 45 5f 53 54 41 4e 44 41 52 44 20 5c  QLITE_STANDARD \
197f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 48  ..            TH
19800 52 4f 57 5f 4f 4e 5f 44 49 53 50 4f 53 45 44 20  ROW_ON_DISPOSED 
19810 54 52 41 43 45 20 54 52 41 43 45 5f 43 4f 4e 4e  TRACE TRACE_CONN
19820 45 43 54 49 4f 4e 20 54 52 41 43 45 5f 48 41 4e  ECTION TRACE_HAN
19830 44 4c 45 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  DLE \..         
19840 20 20 20 54 52 41 43 45 5f 50 52 45 4c 4f 41 44     TRACE_PRELOAD
19850 20 54 52 41 43 45 5f 53 48 41 52 45 44 20 54 52   TRACE_SHARED TR
19860 41 43 45 5f 53 54 41 54 45 4d 45 4e 54 20 54 52  ACE_STATEMENT TR
19870 41 43 45 5f 57 41 52 4e 49 4e 47 20 5c 0d 0a 20  ACE_WARNING \.. 
19880 20 20 20 20 20 20 20 20 20 20 20 54 52 41 43 4b             TRACK
19890 5f 4d 45 4d 4f 52 59 5f 42 59 54 45 53 20 55 53  _MEMORY_BYTES US
198a0 45 5f 45 4e 54 49 54 59 5f 46 52 41 4d 45 57 4f  E_ENTITY_FRAMEWO
198b0 52 4b 5f 36 20 55 53 45 5f 49 4e 54 45 52 4f 50  RK_6 USE_INTEROP
198c0 5f 44 4c 4c 20 5c 0d 0a 20 20 20 20 20 20 20 20  _DLL \..        
198d0 20 20 20 20 55 53 45 5f 50 52 45 50 41 52 45 5f      USE_PREPARE_
198e0 56 32 20 57 49 4e 44 4f 57 53 5d 20 7b 0d 0a 20  V2 WINDOWS] {.. 
198f0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
19900 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
19910 65 63 6b 20 69 66 20 74 68 65 20 63 6f 6d 70 69  eck if the compi
19920 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69  le-time option i
19930 73 20 6c 69 73 74 65 64 20 69 6e 20 74 68 65 20  s listed in the 
19940 6c 69 73 74 20 6f 66 0d 0a 20 20 20 20 20 20 20  list of..       
19950 20 20 20 23 20 20 20 20 20 20 20 22 64 65 66 69     #       "defi
19960 6e 65 20 63 6f 6e 73 74 61 6e 74 73 22 20 6b 65  ne constants" ke
19970 70 74 20 74 72 61 63 6b 20 6f 66 20 62 79 20 74  pt track of by t
19980 68 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d  he managed assem
19990 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  bly...          
199a0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65  #..          che
199b0 63 6b 46 6f 72 53 51 4c 69 74 65 44 65 66 69 6e  ckForSQLiteDefin
199c0 65 43 6f 6e 73 74 61 6e 74 20 24 3a 3a 74 65 73  eConstant $::tes
199d0 74 5f 63 68 61 6e 6e 65 6c 20 24 64 65 66 69 6e  t_channel $defin
199e0 65 43 6f 6e 73 74 61 6e 74 0d 0a 20 20 20 20 20  eConstant..     
199f0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
19a00 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
19a10 45 3a 20 43 68 65 63 6b 20 74 68 65 20 63 75 72  E: Check the cur
19a20 72 65 6e 74 20 62 75 69 6c 64 20 79 65 61 72 2e  rent build year.
19a30 20 20 42 61 73 69 63 61 6c 6c 79 2c 20 74 68 69    Basically, thi
19a40 73 20 69 6e 64 69 63 61 74 65 73 0d 0a 20 20 20  s indicates..   
19a50 20 20 20 20 20 23 20 20 20 20 20 20 20 77 68 69       #       whi
19a60 63 68 20 76 65 72 73 69 6f 6e 20 6f 66 20 4d 53  ch version of MS
19a70 42 75 69 6c 64 20 61 6e 64 2f 6f 72 20 56 69 73  Build and/or Vis
19a80 75 61 6c 20 53 74 75 64 69 6f 20 77 61 73 20 75  ual Studio was u
19a90 73 65 64 20 74 6f 0d 0a 20 20 20 20 20 20 20 20  sed to..        
19aa0 23 20 20 20 20 20 20 20 63 6f 6d 70 69 6c 65 20  #       compile 
19ab0 74 68 65 20 61 73 73 65 6d 62 6c 79 20 62 69 6e  the assembly bin
19ac0 61 72 69 65 73 20 75 6e 64 65 72 20 74 65 73 74  aries under test
19ad0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
19ae0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
19af0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20  est_channel \.. 
19b00 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
19b10 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79   checking for Sy
19b20 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
19b30 20 62 75 69 6c 64 20 79 65 61 72 2e 2e 2e 20 22   build year... "
19b40 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
19b50 79 65 61 72 20 5b 67 65 74 42 75 69 6c 64 59 65  year [getBuildYe
19b60 61 72 5d 0d 0a 20 20 20 20 20 20 20 20 61 64 64  ar]..        add
19b70 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
19b80 6e 64 41 72 67 73 20 62 75 69 6c 64 59 65 61 72  ndArgs buildYear
19b90 2e 20 24 79 65 61 72 5d 0d 0a 20 20 20 20 20 20  . $year]..      
19ba0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
19bb0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
19bc0 72 67 73 20 5c 22 20 24 79 65 61 72 20 5c 22 5c  rgs \" $year \"\
19bd0 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  n]....        #.
19be0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
19bf0 20 43 68 65 63 6b 20 74 68 65 20 63 75 72 72 65   Check the curre
19c00 6e 74 20 62 75 69 6c 64 20 63 6f 6e 66 69 67 75  nt build configu
19c10 72 61 74 69 6f 6e 2e 20 20 54 68 69 73 20 73 68  ration.  This sh
19c20 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 0d 0a 20  ould normally.. 
19c30 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62         #       b
19c40 65 20 65 69 74 68 65 72 20 22 44 65 62 75 67 22  e either "Debug"
19c50 20 6f 72 20 22 52 65 6c 65 61 73 65 22 2e 0d 0a   or "Release"...
19c60 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
19c70 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
19c80 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20  _channel \..    
19c90 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68          "---- ch
19ca0 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65  ecking for Syste
19cb0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75  m.Data.SQLite bu
19cc0 69 6c 64 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ild configuratio
19cd0 6e 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  n... "....      
19ce0 20 20 73 65 74 20 63 6f 6e 66 69 67 75 72 61 74    set configurat
19cf0 69 6f 6e 20 5b 67 65 74 42 75 69 6c 64 43 6f 6e  ion [getBuildCon
19d00 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 20 20 20  figuration]..   
19d10 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
19d20 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 62  nt [appendArgs b
19d30 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f  uildConfiguratio
19d40 6e 2e 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f  n. $configuratio
19d50 6e 5d 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74  n]..        tput
19d60 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
19d70 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22  l [appendArgs \"
19d80 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20   $configuration 
19d90 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  \"\n]....       
19da0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
19db0 54 45 3a 20 54 72 79 20 74 6f 20 73 65 74 75 70  TE: Try to setup
19dc0 20 61 6e 20 69 6e 74 65 72 72 75 70 74 20 63 61   an interrupt ca
19dd0 6c 6c 62 61 63 6b 20 75 73 69 6e 67 20 74 68 65  llback using the
19de0 20 73 63 72 69 70 74 20 64 65 62 75 67 67 65 72   script debugger
19df0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
19e00 20 20 74 68 61 74 20 77 69 6c 6c 20 63 61 6e 63    that will canc
19e10 65 6c 20 61 6c 6c 20 53 51 4c 20 71 75 65 72 69  el all SQL queri
19e20 65 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 66  es in progress f
19e30 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0d  or all database.
19e40 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
19e50 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6b 6e 6f   connections kno
19e60 77 6e 20 74 6f 20 74 68 69 73 20 69 6e 74 65 72  wn to this inter
19e70 70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 20  preter...       
19e80 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
19e90 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
19ea0 6e 6f 28 73 71 6c 69 74 65 49 6e 74 65 72 72 75  no(sqliteInterru
19eb0 70 74 43 61 6c 6c 62 61 63 6b 29 5d 7d 20 74 68  ptCallback)]} th
19ec0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
19ed0 73 65 74 75 70 44 62 49 6e 74 65 72 72 75 70 74  setupDbInterrupt
19ee0 43 61 6c 6c 62 61 63 6b 20 24 3a 3a 74 65 73 74  Callback $::test
19ef0 5f 63 68 61 6e 6e 65 6c 20 24 3a 3a 74 65 73 74  _channel $::test
19f00 5f 6c 6f 67 0d 0a 20 20 20 20 20 20 20 20 7d 0d  _log..        }.
19f10 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
19f20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
19f30 65 63 6b 20 66 6f 72 20 74 68 65 20 6e 61 74 69  eck for the nati
19f40 76 65 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f  ve runtime optio
19f50 6e 2c 20 77 68 69 63 68 20 77 6f 75 6c 64 20 6d  n, which would m
19f60 65 61 6e 20 77 65 20 61 72 65 0d 0a 20 20 20 20  ean we are..    
19f70 20 20 20 20 23 20 20 20 20 20 20 20 75 73 69 6e      #       usin
19f80 67 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65  g the mixed-mode
19f90 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20   assembly...    
19fa0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63      #..        c
19fb0 68 65 63 6b 46 6f 72 52 75 6e 74 69 6d 65 4f 70  heckForRuntimeOp
19fc0 74 69 6f 6e 20 24 3a 3a 74 65 73 74 5f 63 68 61  tion $::test_cha
19fd0 6e 6e 65 6c 20 6e 61 74 69 76 65 0d 0a 0d 0a 20  nnel native.... 
19fe0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
19ff0 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
1a000 69 66 20 74 68 65 20 74 65 73 74 20 73 75 69 74  if the test suit
1a010 65 20 73 68 6f 75 6c 64 20 63 6f 75 6e 74 20 74  e should count t
1a020 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6e  he number of con
1a030 6e 65 63 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20  nections..      
1a040 20 20 23 20 20 20 20 20 20 20 22 6f 70 65 6e 65    #       "opene
1a050 64 22 20 61 6e 64 20 22 63 6c 6f 73 65 64 22 20  d" and "closed" 
1a060 66 72 6f 6d 20 74 68 65 20 70 6f 6f 6c 20 77 68  from the pool wh
1a070 65 6e 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 69  en determining i
1a080 66 20 61 20 74 65 73 74 0d 0a 20 20 20 20 20 20  f a test..      
1a090 20 20 23 20 20 20 20 20 20 20 70 61 73 73 65 64    #       passed
1a0a0 2e 20 20 44 69 73 61 62 6c 69 6e 67 20 74 68 69  .  Disabling thi
1a0b0 73 20 62 65 68 61 76 69 6f 72 20 69 73 20 73 6f  s behavior is so
1a0c0 6d 65 74 69 6d 65 73 20 6e 65 63 65 73 73 61 72  metimes necessar
1a0d0 79 20 28 65 2e 67 2e 0d 0a 20 20 20 20 20 20 20  y (e.g...       
1a0e0 20 23 20 20 20 20 20 20 20 64 75 72 69 6e 67 20   #       during 
1a0f0 74 68 65 20 72 65 6c 65 61 73 65 20 74 65 73 74  the release test
1a100 69 6e 67 20 70 72 6f 63 65 73 73 29 20 62 65 63  ing process) bec
1a110 61 75 73 65 20 74 68 65 72 65 20 61 72 65 20 73  ause there are s
1a120 65 76 65 72 61 6c 0d 0a 20 20 20 20 20 20 20 20  everal..        
1a130 23 20 20 20 20 20 20 20 74 65 73 74 73 20 74 68  #       tests th
1a140 61 74 20 72 65 6c 79 20 6f 6e 20 74 68 65 20 22  at rely on the "
1a150 6f 70 65 6e 65 64 20 66 72 6f 6d 20 70 6f 6f 6c  opened from pool
1a160 22 20 63 6f 75 6e 74 20 62 65 69 6e 67 20 67 72  " count being gr
1a170 65 61 74 65 72 0d 0a 20 20 20 20 20 20 20 20 23  eater..        #
1a180 20 20 20 20 20 20 20 74 68 61 6e 20 7a 65 72 6f         than zero
1a190 2e 20 20 54 68 65 73 65 20 74 65 73 74 73 20 6d  .  These tests m
1a1a0 61 79 20 66 61 69 6c 20 64 75 65 20 74 6f 20 74  ay fail due to t
1a1b0 68 65 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69  he non-determini
1a1c0 73 74 69 63 0d 0a 20 20 20 20 20 20 20 20 23 20  stic..        # 
1a1d0 20 20 20 20 20 20 62 65 68 61 76 69 6f 72 20 6f        behavior o
1a1e0 66 20 74 68 65 20 43 4c 52 20 47 43 2c 20 65 76  f the CLR GC, ev
1a1f0 65 6e 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  en when there is
1a200 20 6e 6f 20 62 75 67 20 69 6e 20 74 68 65 20 63   no bug in the c
1a210 6f 64 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ode..        #  
1a220 20 20 20 20 20 62 65 69 6e 67 20 74 65 73 74 65       being teste
1a230 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  d...        #.. 
1a240 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 52         checkForR
1a250 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 24 3a 3a  untimeOption $::
1a260 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 6e 6f 50  test_channel noP
1a270 6f 6f 6c 43 6f 75 6e 74 73 0d 0a 0d 0a 20 20 20  oolCounts....   
1a280 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1a290 23 20 4e 4f 54 45 3a 20 52 65 70 6f 72 74 20 74  # NOTE: Report t
1a2a0 68 65 20 72 65 73 6f 75 72 63 65 20 75 73 61 67  he resource usag
1a2b0 65 20 70 72 69 6f 72 20 74 6f 20 72 75 6e 6e 69  e prior to runni
1a2c0 6e 67 20 61 6e 79 20 74 65 73 74 73 2e 0d 0a 20  ng any tests... 
1a2d0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1a2e0 20 20 72 65 70 6f 72 74 53 51 4c 69 74 65 52 65    reportSQLiteRe
1a2f0 73 6f 75 72 63 65 73 20 24 3a 3a 74 65 73 74 5f  sources $::test_
1a300 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20  channel....     
1a310 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1a320 4e 4f 54 45 3a 20 47 72 61 62 20 74 68 65 20 6c  NOTE: Grab the l
1a330 69 73 74 20 6f 66 20 6e 61 74 69 76 65 20 6d 6f  ist of native mo
1a340 64 75 6c 65 73 20 66 6f 72 20 74 68 65 20 63 75  dules for the cu
1a350 72 72 65 6e 74 20 70 72 6f 63 65 73 73 20 61 6e  rrent process an
1a360 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  d..        #    
1a370 20 20 20 72 65 70 6f 72 74 20 6f 6e 20 74 68 65     report on the
1a380 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
1a390 69 74 65 20 72 65 6c 61 74 65 64 20 6f 6e 65 73  ite related ones
1a3a0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1a3b0 20 20 20 20 20 20 73 65 74 20 6d 6f 64 75 6c 65        set module
1a3c0 73 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65  s [object invoke
1a3d0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1a3e0 53 79 73 74 65 6d 2e 44 69 61 67 6e 6f 73 74 69  System.Diagnosti
1a3f0 63 73 2e 50 72 6f 63 65 73 73 2e 47 65 74 43 75  cs.Process.GetCu
1a400 72 72 65 6e 74 50 72 6f 63 65 73 73 20 4d 6f 64  rrentProcess Mod
1a410 75 6c 65 73 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  ules]....       
1a420 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20   object foreach 
1a430 2d 61 6c 69 61 73 20 6d 6f 64 75 6c 65 20 24 6d  -alias module $m
1a440 6f 64 75 6c 65 73 20 7b 0d 0a 20 20 20 20 20 20  odules {..      
1a450 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1a460 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6d 6f 64   # NOTE: The mod
1a470 75 6c 65 20 66 69 6c 65 20 6e 61 6d 65 20 68 65  ule file name he
1a480 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 72 6d 61  re must be norma
1a490 6c 69 7a 65 64 2e 0d 0a 20 20 20 20 20 20 20 20  lized...        
1a4a0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73    #..          s
1a4b0 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c  et fileName [fil
1a4c0 65 20 6e 6f 72 6d 61 6c 69 7a 65 20 5b 24 6d 6f  e normalize [$mo
1a4d0 64 75 6c 65 20 46 69 6c 65 4e 61 6d 65 5d 5d 0d  dule FileName]].
1a4e0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
1a4f0 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2d  {[string match -
1a500 6e 6f 63 61 73 65 20 2a 2f 73 71 6c 69 74 65 33  nocase */sqlite3
1a510 2e 64 6c 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 7d  .dll $fileName]}
1a520 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1a530 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
1a540 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
1a550 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1a560 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
1a570 66 6f 75 6e 64 20 6c 6f 61 64 65 64 20 53 51 4c  found loaded SQL
1a580 69 74 65 20 6e 61 74 69 76 65 20 6c 69 62 72 61  ite native libra
1a590 72 79 20 6d 6f 64 75 6c 65 3a 20 22 20 5c 0d 0a  ry module: " \..
1a5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5b0 24 66 69 6c 65 4e 61 6d 65 20 5c 6e 5d 0d 0a 20  $fileName \n].. 
1a5c0 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69           } elsei
1a5d0 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68  f {[string match
1a5e0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1a5f0 20 20 2d 6e 6f 63 61 73 65 20 2a 2f 53 51 4c 69    -nocase */SQLi
1a600 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 20 24  te.Interop.dll $
1a610 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  fileName]} then 
1a620 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
1a630 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
1a640 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1a650 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1a660 20 20 20 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20      "---- found 
1a670 6c 6f 61 64 65 64 20 53 51 4c 69 74 65 20 69 6e  loaded SQLite in
1a680 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 6d  terop assembly m
1a690 6f 64 75 6c 65 3a 20 22 20 5c 0d 0a 20 20 20 20  odule: " \..    
1a6a0 20 20 20 20 20 20 20 20 20 20 20 20 24 66 69 6c              $fil
1a6b0 65 4e 61 6d 65 20 5c 6e 5d 0d 0a 20 20 20 20 20  eName \n]..     
1a6c0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1a6d0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74  }....        cat
1a6e0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
1a6f0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
1a700 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20  annel \..       
1a710 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 6d         "---- com
1a720 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
1a730 73 20 66 6f 72 20 53 51 4c 69 74 65 20 63 6f 72  s for SQLite cor
1a740 65 20 6c 69 62 72 61 72 79 2e 2e 2e 20 22 0d 0a  e library... "..
1a750 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
1a760 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20 69  [catch {object i
1a770 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
1a780 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
1a790 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
1a7a0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
1a7b0 53 51 4c 69 74 65 33 20 53 51 4c 69 74 65 43 6f  SQLite3 SQLiteCo
1a7c0 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 7d 20 5c 0d  mpileOptions} \.
1a7d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a7e0 20 20 20 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e     compileOption
1a7f0 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  s] == 0} then {.
1a800 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
1a810 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
1a820 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b  el [appendArgs [
1a830 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73 6f 72  formatList [lsor
1a840 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
1a850 20 20 20 20 20 24 63 6f 6d 70 69 6c 65 4f 70 74       $compileOpt
1a860 69 6f 6e 73 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e  ions] <none>] \n
1a870 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  ]..          } e
1a880 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
1a890 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
1a8a0 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e  _channel unknown
1a8b0 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  \n..          }.
1a8c0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
1a8d0 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20        catch {.. 
1a8e0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1a8f0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c  ::test_channel \
1a900 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1a910 22 2d 2d 2d 2d 20 63 6f 6d 70 69 6c 65 2d 74 69  "---- compile-ti
1a920 6d 65 20 6f 70 74 69 6f 6e 73 20 66 6f 72 20 53  me options for S
1a930 51 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73  QLite interop as
1a940 73 65 6d 62 6c 79 2e 2e 2e 20 22 0d 0a 0d 0a 20  sembly... ".... 
1a950 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
1a960 74 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f  tch {object invo
1a970 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
1a980 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
1a990 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
1a9a0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
1a9b0 69 74 65 33 20 49 6e 74 65 72 6f 70 43 6f 6d 70  ite3 InteropComp
1a9c0 69 6c 65 4f 70 74 69 6f 6e 73 7d 20 5c 0d 0a 20  ileOptions} \.. 
1a9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9e0 20 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 5d   compileOptions]
1a9f0 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
1aa00 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1aa10 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1aa20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 66 6f   [appendArgs [fo
1aa30 72 6d 61 74 4c 69 73 74 20 5b 6c 73 6f 72 74 20  rmatList [lsort 
1aa40 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1aa50 20 20 20 24 63 6f 6d 70 69 6c 65 4f 70 74 69 6f     $compileOptio
1aa60 6e 73 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d  ns] <none>] \n].
1aa70 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
1aa80 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
1aa90 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
1aaa0 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e  hannel unknown\n
1aab0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1aac0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1aad0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1aae0 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68 65 20   NOTE: Show the 
1aaf0 61 63 74 69 76 65 20 74 65 73 74 20 63 6f 6e 73  active test cons
1ab00 74 72 61 69 6e 74 73 2e 0d 0a 20 20 20 20 20 20  traints...      
1ab10 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75    #..        tpu
1ab20 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
1ab30 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  el [appendArgs "
1ab40 2d 2d 2d 2d 20 63 6f 6e 73 74 72 61 69 6e 74 73  ---- constraints
1ab50 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  : " \..         
1ab60 20 20 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b     [formatList [
1ab70 6c 73 6f 72 74 20 5b 67 65 74 43 6f 6e 73 74 72  lsort [getConstr
1ab80 61 69 6e 74 73 5d 5d 20 3c 6e 6f 6e 65 3e 5d 20  aints]] <none>] 
1ab90 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  \n]....        #
1aba0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1abb0 3a 20 53 61 76 65 20 74 68 65 20 74 65 73 74 20  : Save the test 
1abc0 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20  constraints for 
1abd0 75 73 65 20 62 79 20 74 68 72 65 61 64 73 20 63  use by threads c
1abe0 72 65 61 74 65 64 20 69 6e 20 74 68 69 73 0d 0a  reated in this..
1abf0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1ac00 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 6f 6d 61  application doma
1ac10 69 6e 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63  in.  This is nec
1ac20 65 73 73 61 72 79 20 62 65 63 61 75 73 65 20 61  essary because a
1ac30 6c 6c 20 74 68 65 20 45 61 67 6c 65 0d 0a 20 20  ll the Eagle..  
1ac40 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22 74        #       "t
1ac50 65 73 74 20 63 6f 6e 74 65 78 74 22 20 69 6e 66  est context" inf
1ac60 6f 72 6d 61 74 69 6f 6e 20 69 73 20 70 65 72 2d  ormation is per-
1ac70 74 68 72 65 61 64 2e 0d 0a 20 20 20 20 20 20 20  thread...       
1ac80 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
1ac90 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
1aca0 74 65 73 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  test_constraints
1acb0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1acc0 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74 5f       set ::test_
1acd0 63 6f 6e 73 74 72 61 69 6e 74 73 20 24 3a 3a 65  constraints $::e
1ace0 61 67 6c 65 5f 74 65 73 74 73 28 63 6f 6e 73 74  agle_tests(const
1acf0 72 61 69 6e 74 73 29 0d 0a 20 20 20 20 20 20 20  raints)..       
1ad00 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
1ad10 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
1ad20 20 4c 6f 61 64 20 74 68 65 20 22 61 66 74 65 72   Load the "after
1ad30 2d 63 6f 6e 73 74 72 61 69 6e 74 73 22 20 63 75  -constraints" cu
1ad40 73 74 6f 6d 20 70 65 72 2d 75 73 65 72 20 61 6e  stom per-user an
1ad50 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74 0d 0a 20  d/or per-host.. 
1ad60 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
1ad70 65 73 74 20 73 65 74 74 69 6e 67 73 20 6e 6f 77  est settings now
1ad80 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1ad90 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20        uplevel 1 
1ada0 5b 6c 69 73 74 20 6c 6f 61 64 53 51 4c 69 74 65  [list loadSQLite
1adb0 54 65 73 74 53 65 74 74 69 6e 67 73 20 24 3a 3a  TestSettings $::
1adc0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 2e 61 66  test_channel .af
1add0 74 65 72 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ter]....        
1ade0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
1adf0 45 3a 20 53 68 6f 77 20 77 68 65 6e 20 6f 75 72  E: Show when our
1ae00 20 74 65 73 74 73 20 61 63 74 75 61 6c 6c 79 20   tests actually 
1ae10 62 65 67 61 6e 20 28 6e 6f 77 29 2e 0d 0a 20 20  began (now)...  
1ae20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1ae30 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
1ae40 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1ae50 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1ae60 20 20 22 2d 2d 2d 2d 20 53 79 73 74 65 6d 2e 44    "---- System.D
1ae70 61 74 61 2e 53 51 4c 69 74 65 20 74 65 73 74 73  ata.SQLite tests
1ae80 20 62 65 67 61 6e 20 61 74 20 22 20 5c 0d 0a 20   began at " \.. 
1ae90 20 20 20 20 20 20 20 20 20 20 20 5b 63 6c 6f 63             [cloc
1aea0 6b 20 66 6f 72 6d 61 74 20 5b 63 6c 6f 63 6b 20  k format [clock 
1aeb0 73 65 63 6f 6e 64 73 5d 5d 20 5c 6e 5d 0d 0a 20  seconds]] \n].. 
1aec0 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
1aed0 0d 0a 20 20 20 20 70 72 6f 63 20 72 75 6e 53 51  ..    proc runSQ
1aee0 4c 69 74 65 54 65 73 74 45 70 69 6c 6f 67 75 65  LiteTestEpilogue
1aef0 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
1af00 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b        # NOTE: Sk
1af10 69 70 20 72 75 6e 6e 69 6e 67 20 6f 75 72 20 63  ip running our c
1af20 75 73 74 6f 6d 20 65 70 69 6c 6f 67 75 65 20 69  ustom epilogue i
1af30 66 20 74 68 65 20 6d 61 69 6e 20 6f 6e 65 20 68  f the main one h
1af40 61 73 20 62 65 65 6e 0d 0a 20 20 20 20 20 20 23  as been..      #
1af50 20 20 20 20 20 20 20 73 6b 69 70 70 65 64 2e 0d         skipped..
1af60 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1af70 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
1af80 73 20 3a 3a 6e 6f 28 65 70 69 6c 6f 67 75 65 2e  s ::no(epilogue.
1af90 65 61 67 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d  eagle)]} then {.
1afa0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1afb0 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77      # NOTE: Show
1afc0 20 77 68 65 6e 20 6f 75 72 20 74 65 73 74 73 20   when our tests 
1afd0 61 63 74 75 61 6c 6c 79 20 65 6e 64 65 64 20 28  actually ended (
1afe0 6e 6f 77 29 2e 0d 0a 20 20 20 20 20 20 20 20 23  now)...        #
1aff0 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
1b000 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
1b010 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1b020 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
1b030 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
1b040 69 74 65 20 74 65 73 74 73 20 65 6e 64 65 64 20  ite tests ended 
1b050 61 74 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  at " \..        
1b060 20 20 20 20 5b 63 6c 6f 63 6b 20 66 6f 72 6d 61      [clock forma
1b070 74 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73  t [clock seconds
1b080 5d 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20  ]] \n]....      
1b090 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 42    #..        # B
1b0a0 55 47 46 49 58 3a 20 42 65 66 6f 72 65 20 63 68  UGFIX: Before ch
1b0b0 65 63 6b 69 6e 67 20 74 68 65 20 66 69 6e 61 6c  ecking the final
1b0c0 20 72 65 73 6f 75 72 63 65 73 20 69 6e 20 75 73   resources in us
1b0d0 65 20 62 79 20 53 51 4c 69 74 65 2c 20 6d 61 6b  e by SQLite, mak
1b0e0 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
1b0f0 20 20 20 20 20 73 75 72 65 20 62 6f 74 68 20 6f       sure both o
1b100 66 20 74 68 65 20 50 52 41 47 4d 41 20 72 65 6c  f the PRAGMA rel
1b110 61 74 65 64 20 64 69 72 65 63 74 6f 72 79 20 6e  ated directory n
1b120 61 6d 65 73 20 61 72 65 20 66 72 65 65 64 2e 0d  ames are freed..
1b130 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1b140 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69      checkForSQLi
1b150 74 65 44 69 72 65 63 74 6f 72 69 65 73 20 24 3a  teDirectories $:
1b160 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72  :test_channel tr
1b170 75 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  ue....        #.
1b180 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
1b190 20 41 6c 73 6f 20 72 65 70 6f 72 74 20 74 68 65   Also report the
1b1a0 20 72 65 73 6f 75 72 63 65 20 75 73 61 67 65 20   resource usage 
1b1b0 61 66 74 65 72 20 72 75 6e 6e 69 6e 67 20 74 68  after running th
1b1c0 65 20 74 65 73 74 73 2e 0d 0a 20 20 20 20 20 20  e tests...      
1b1d0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 70    #..        rep
1b1e0 6f 72 74 53 51 4c 69 74 65 52 65 73 6f 75 72 63  ortSQLiteResourc
1b1f0 65 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  es $::test_chann
1b200 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  el....        #.
1b210 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
1b220 20 52 65 70 6f 72 74 20 74 68 65 20 63 72 69 74   Report the crit
1b230 69 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e  ical handle coun
1b240 74 73 20 61 66 74 65 72 20 72 75 6e 6e 69 6e 67  ts after running
1b250 20 74 68 65 20 74 65 73 74 73 2e 0d 0a 20 20 20   the tests...   
1b260 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1b270 67 65 74 53 51 4c 69 74 65 48 61 6e 64 6c 65 43  getSQLiteHandleC
1b280 6f 75 6e 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  ounts $::test_ch
1b290 61 6e 6e 65 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a  annel..      }..
1b2a0 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 23 23      }.....    ##
1b2b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b2c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b2d0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b2e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b2f0 23 23 23 23 23 23 23 23 23 0d 0a 20 20 20 20 23  #########..    #
1b300 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b310 23 23 23 23 23 23 23 23 23 23 23 23 20 45 4e 44  ############ END
1b320 20 45 61 67 6c 65 20 4f 4e 4c 59 20 23 23 23 23   Eagle ONLY ####
1b330 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b340 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20 20 20  ##########..    
1b350 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b360 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b370 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b380 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b390 23 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20 7d  ###########..  }
1b3a0 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54  ....  #..  # NOT
1b3b0 45 3a 20 53 61 76 65 20 74 68 65 20 6e 61 6d 65  E: Save the name
1b3c0 20 6f 66 20 74 68 65 20 64 69 72 65 63 74 6f 72   of the director
1b3d0 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69  y containing thi
1b3e0 73 20 66 69 6c 65 2e 0d 0a 20 20 23 0d 0a 20 20  s file...  #..  
1b3f0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
1b400 73 20 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f  s common_directo
1b410 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ry]} then {..   
1b420 20 73 65 74 20 63 6f 6d 6d 6f 6e 5f 64 69 72 65   set common_dire
1b430 63 74 6f 72 79 20 5b 66 69 6c 65 20 64 69 72 6e  ctory [file dirn
1b440 61 6d 65 20 5b 69 6e 66 6f 20 73 63 72 69 70 74  ame [info script
1b450 5d 5d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 0d 0a  ]]..  }....  #..
1b460 20 20 23 20 4e 4f 54 45 3a 20 50 72 6f 76 69 64    # NOTE: Provid
1b470 65 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74  e the System.Dat
1b480 61 2e 53 51 4c 69 74 65 20 74 65 73 74 20 70 61  a.SQLite test pa
1b490 63 6b 61 67 65 20 74 6f 20 74 68 65 20 69 6e 74  ckage to the int
1b4a0 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 23 0d 0a  erpreter...  #..
1b4b0 20 20 70 61 63 6b 61 67 65 20 70 72 6f 76 69 64    package provid
1b4c0 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  e System.Data.SQ
1b4d0 4c 69 74 65 2e 54 65 73 74 20 31 2e 30 0d 0a 7d  Lite.Test 1.0..}
1b4e0 0d 0a                                            ..