System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact c729c9dd53cbb9b72c4efe85178bc2f7d0d54c2f:


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 20 28 69 2e 65 2e  test years (i.e.
1170: 20 61 6c 6c 29 2e 0d 0a 20 20 20 20 20 20 20 20   all)...        
1180: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
1190: 6e 20 5b 6c 69 73 74 20 32 30 30 35 20 32 30 30  n [list 2005 200
11a0: 38 20 32 30 31 30 20 32 30 31 32 20 32 30 31 33  8 2010 2012 2013
11b0: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
11c0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
11d0: 65 74 42 75 69 6c 64 4e 65 74 46 78 20 7b 7d 20  etBuildNetFx {} 
11e0: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
11f0: 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66    # NOTE: See if
1200: 20 74 68 65 20 74 65 73 74 20 2e 4e 45 54 20 46   the test .NET F
1210: 72 61 6d 65 77 6f 72 6b 20 73 65 74 74 69 6e 67  ramework setting
1220: 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69   has been overri
1230: 64 64 65 6e 20 62 79 0d 0a 20 20 20 20 20 20 23  dden by..      #
1240: 20 20 20 20 20 20 20 74 68 65 20 75 73 65 72 20         the user 
1250: 28 65 2e 67 2e 20 6f 6e 20 74 68 65 20 63 6f 6d  (e.g. on the com
1260: 6d 61 6e 64 20 6c 69 6e 65 29 2e 0d 0a 20 20 20  mand line)...   
1270: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
1280: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
1290: 65 73 74 5f 6e 65 74 5f 66 78 5d 20 26 26 20 5c  est_net_fx] && \
12a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
12b0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65  ing length $::te
12c0: 73 74 5f 6e 65 74 5f 66 78 5d 20 3e 20 30 7d 20  st_net_fx] > 0} 
12d0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
12e0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
12f0: 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63 69  E: Use the speci
1300: 66 69 65 64 20 74 65 73 74 20 2e 4e 45 54 20 46  fied test .NET F
1310: 72 61 6d 65 77 6f 72 6b 2e 0d 0a 20 20 20 20 20  ramework...     
1320: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
1330: 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 6e 65 74  turn $::test_net
1340: 5f 66 78 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  _fx..      } els
1350: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  e {..        set
1360: 20 79 65 61 72 20 5b 67 65 74 42 75 69 6c 64 59   year [getBuildY
1370: 65 61 72 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ear]....        
1380: 73 77 69 74 63 68 20 2d 65 78 61 63 74 20 2d 2d  switch -exact --
1390: 20 24 79 65 61 72 20 7b 0d 0a 20 20 20 20 20 20   $year {..      
13a0: 20 20 20 20 32 30 30 35 20 7b 0d 0a 20 20 20 20      2005 {..    
13b0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e          return n
13c0: 65 74 46 78 32 30 0d 0a 20 20 20 20 20 20 20 20  etFx20..        
13d0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 32    }..          2
13e0: 30 30 38 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  008 {..         
13f0: 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78 33     return netFx3
1400: 35 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  5..          }..
1410: 20 20 20 20 20 20 20 20 20 20 32 30 31 30 20 7b            2010 {
1420: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
1430: 74 75 72 6e 20 6e 65 74 46 78 34 30 0d 0a 20 20  turn netFx40..  
1440: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1450: 20 20 20 20 20 32 30 31 32 20 7b 0d 0a 20 20 20       2012 {..   
1460: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1470: 6e 65 74 46 78 34 35 0d 0a 20 20 20 20 20 20 20  netFx45..       
1480: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
1490: 32 30 31 33 20 7b 0d 0a 20 20 20 20 20 20 20 20  2013 {..        
14a0: 20 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78      return netFx
14b0: 34 35 31 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  451..          }
14c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 64 65 66 61  ..          defa
14d0: 75 6c 74 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  ult {..         
14e0: 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78 33     return netFx3
14f0: 35 3b 20 23 20 54 4f 44 4f 3a 20 47 6f 6f 64 20  5; # TODO: Good 
1500: 22 66 61 6c 6c 62 61 63 6b 22 20 64 65 66 61 75  "fallback" defau
1510: 6c 74 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  lt?..          }
1520: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
1530: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
1540: 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54      #..    # NOT
1550: 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72  E: This procedur
1560: 65 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20  e should return 
1570: 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
1580: 63 6f 6e 66 69 67 75 72 65 64 20 74 65 73 74 0d  configured test.
1590: 0a 20 20 20 20 23 20 20 20 20 20 20 20 70 6c 61  .    #       pla
15a0: 74 66 6f 72 6d 20 69 73 20 6d 6f 73 74 20 6c 69  tform is most li
15b0: 6b 65 6c 79 20 74 68 65 20 64 65 66 61 75 6c 74  kely the default
15c0: 20 66 6f 72 20 74 68 69 73 20 6d 61 63 68 69 6e   for this machin
15d0: 65 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 70  e...    #..    p
15e0: 72 6f 63 20 69 73 44 65 66 61 75 6c 74 42 75 69  roc isDefaultBui
15f0: 6c 64 50 6c 61 74 66 6f 72 6d 20 7b 20 7b 76 65  ldPlatform { {ve
1600: 72 62 6f 73 65 20 66 61 6c 73 65 7d 20 7d 20 7b  rbose false} } {
1610: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1620: 20 23 20 4e 4f 54 45 3a 20 52 75 6e 6e 69 6e 67   # NOTE: Running
1630: 20 6f 6e 20 57 6f 57 36 34 20 69 73 20 6e 65 76   on WoW64 is nev
1640: 65 72 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  er the default p
1650: 6c 61 74 66 6f 72 6d 2e 0d 0a 20 20 20 20 20 20  latform...      
1660: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 73  #..      if {[is
1670: 52 75 6e 6e 69 6e 67 57 6f 57 36 34 5d 7d 20 74  RunningWoW64]} t
1680: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
1690: 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65  f {$verbose} the
16a0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
16b0: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
16c0: 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20  nnel \..        
16d0: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 64 65 74 65        "---- dete
16e0: 63 74 65 64 20 6e 6f 6e 2d 64 65 66 61 75 6c 74  cted non-default
16f0: 20 70 6c 61 74 66 6f 72 6d 20 28 57 6f 57 36 34   platform (WoW64
1700: 29 5c 6e 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d  )\n"..        }.
1710: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1720: 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a  false..      }..
1730: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1740: 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 68 61   # NOTE: This ha
1750: 73 20 61 20 67 6f 6f 64 20 63 68 61 6e 63 65 20  s a good chance 
1760: 6f 66 20 62 65 69 6e 67 20 74 68 65 20 64 65 66  of being the def
1770: 61 75 6c 74 20 70 6c 61 74 66 6f 72 6d 2e 0d 0a  ault platform...
1780: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
1790: 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65  f {$verbose} the
17a0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  n {..        tpu
17b0: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
17c0: 65 6c 20 22 2d 2d 2d 2d 20 64 65 74 65 63 74 65  el "---- detecte
17d0: 64 20 64 65 66 61 75 6c 74 20 70 6c 61 74 66 6f  d default platfo
17e0: 72 6d 5c 6e 22 0d 0a 20 20 20 20 20 20 7d 0d 0a  rm\n"..      }..
17f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
1800: 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  e..    }.....   
1810: 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 50 6c   proc getBuildPl
1820: 61 74 66 6f 72 6d 20 7b 20 6e 61 74 69 76 65 20  atform { native 
1830: 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  } {..      if {[
1840: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65  info exists ::te
1850: 73 74 5f 70 6c 61 74 66 6f 72 6d 5d 20 26 26 20  st_platform] && 
1860: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
1870: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74  ring length $::t
1880: 65 73 74 5f 70 6c 61 74 66 6f 72 6d 5d 20 3e 20  est_platform] > 
1890: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
18a0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
18b0: 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70  NOTE: Use the sp
18c0: 65 63 69 66 69 65 64 20 74 65 73 74 20 70 6c 61  ecified test pla
18d0: 74 66 6f 72 6d 2e 20 20 49 66 20 74 68 69 73 20  tform.  If this 
18e0: 76 61 72 69 61 62 6c 65 20 69 73 20 6e 6f 74 20  variable is not 
18f0: 73 65 74 2c 0d 0a 20 20 20 20 20 20 20 20 23 20  set,..        # 
1900: 20 20 20 20 20 20 74 68 65 20 64 65 66 61 75 6c        the defaul
1910: 74 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 20  t value will be 
1920: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6d 61 63  based on the mac
1930: 68 69 6e 65 20 61 72 63 68 69 74 65 63 74 75 72  hine architectur
1940: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
1950: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65         return [e
1960: 78 70 72 20 7b 24 6e 61 74 69 76 65 20 3f 20 24  xpr {$native ? $
1970: 3a 3a 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d 20  ::test_platform 
1980: 3a 20 22 22 7d 5d 0d 0a 20 20 20 20 20 20 7d 20  : ""}]..      } 
1990: 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78  elseif {[info ex
19a0: 69 73 74 73 20 3a 3a 74 65 73 74 5f 6d 61 63 68  ists ::test_mach
19b0: 69 6e 65 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ine] && \..     
19c0: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
19d0: 67 74 68 20 24 3a 3a 74 65 73 74 5f 6d 61 63 68  gth $::test_mach
19e0: 69 6e 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ine] > 0} then {
19f0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1a00: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f 72       # NOTE: For
1a10: 20 6e 61 74 69 76 65 20 62 75 69 6c 64 73 2c 20   native builds, 
1a20: 72 65 74 75 72 6e 20 74 68 65 20 70 6c 61 74 66  return the platf
1a30: 6f 72 6d 20 6e 61 6d 65 20 63 6f 72 72 65 73 70  orm name corresp
1a40: 6f 6e 64 69 6e 67 20 74 6f 0d 0a 20 20 20 20 20  onding to..     
1a50: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 74     #       the t
1a60: 65 73 74 20 6d 61 63 68 69 6e 65 20 61 72 63 68  est machine arch
1a70: 69 74 65 63 74 75 72 65 3b 20 6f 74 68 65 72 77  itecture; otherw
1a80: 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65  ise, return an e
1a90: 6d 70 74 79 0d 0a 20 20 20 20 20 20 20 20 23 20  mpty..        # 
1aa0: 20 20 20 20 20 20 73 74 72 69 6e 67 2e 0d 0a 20        string... 
1ab0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1ac0: 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b    return [expr {
1ad0: 0d 0a 20 20 20 20 20 20 20 20 20 20 24 6e 61 74  ..          $nat
1ae0: 69 76 65 20 3f 20 5b 6d 61 63 68 69 6e 65 54 6f  ive ? [machineTo
1af0: 50 6c 61 74 66 6f 72 6d 20 24 3a 3a 74 65 73 74  Platform $::test
1b00: 5f 6d 61 63 68 69 6e 65 5d 20 3a 20 22 22 0d 0a  _machine] : ""..
1b10: 20 20 20 20 20 20 20 20 7d 5d 0d 0a 20 20 20 20          }]..    
1b20: 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66    } elseif {[inf
1b30: 6f 20 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f 70  o exists ::tcl_p
1b40: 6c 61 74 66 6f 72 6d 28 6d 61 63 68 69 6e 65 29  latform(machine)
1b50: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1b60: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1b70: 4e 4f 54 45 3a 20 46 6f 72 20 6e 61 74 69 76 65  NOTE: For native
1b80: 20 62 75 69 6c 64 73 2c 20 72 65 74 75 72 6e 20   builds, return 
1b90: 74 68 65 20 70 6c 61 74 66 6f 72 6d 20 6e 61 6d  the platform nam
1ba0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
1bb0: 74 6f 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  to..        #   
1bc0: 20 20 20 20 74 68 65 20 6d 61 63 68 69 6e 65 20      the machine 
1bd0: 61 72 63 68 69 74 65 63 74 75 72 65 3b 20 6f 74  architecture; ot
1be0: 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
1bf0: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e  an empty string.
1c00: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1c10: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70       return [exp
1c20: 72 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 24  r {..          $
1c30: 6e 61 74 69 76 65 20 3f 20 5b 6d 61 63 68 69 6e  native ? [machin
1c40: 65 54 6f 50 6c 61 74 66 6f 72 6d 20 24 3a 3a 74  eToPlatform $::t
1c50: 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61 63 68  cl_platform(mach
1c60: 69 6e 65 29 5d 20 3a 20 22 22 0d 0a 20 20 20 20  ine)] : ""..    
1c70: 20 20 20 20 7d 5d 0d 0a 20 20 20 20 20 20 7d 20      }]..      } 
1c80: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
1c90: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
1ca0: 45 3a 20 4e 6f 20 6d 61 63 68 69 6e 65 20 61 72  E: No machine ar
1cb0: 63 68 69 74 65 63 74 75 72 65 20 69 73 20 61 76  chitecture is av
1cc0: 61 69 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e 20  ailable, return 
1cd0: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e  an empty string.
1ce0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1cf0: 20 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e    It is importan
1d00: 74 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65  t to return an e
1d10: 6d 70 74 79 20 73 74 72 69 6e 67 20 68 65 72 65  mpty string here
1d20: 20 62 65 63 61 75 73 65 20 74 68 65 0d 0a 20 20   because the..  
1d30: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65        #       re
1d40: 73 75 6c 74 20 6f 66 20 74 68 69 73 20 70 72 6f  sult of this pro
1d50: 63 65 64 75 72 65 20 6d 61 79 20 62 65 20 75 73  cedure may be us
1d60: 65 64 20 77 69 74 68 20 5b 66 69 6c 65 20 6a 6f  ed with [file jo
1d70: 69 6e 5d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  in]...        #.
1d80: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1d90: 22 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  ""..      }..   
1da0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
1db0: 67 65 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72  getBuildConfigur
1dc0: 61 74 69 6f 6e 20 7b 7d 20 7b 0d 0a 20 20 20 20  ation {} {..    
1dd0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
1de0: 45 3a 20 53 65 65 20 69 66 20 74 68 65 20 22 63  E: See if the "c
1df0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 20 73 65  onfiguration" se
1e00: 74 74 69 6e 67 20 68 61 73 20 62 65 65 6e 20 6f  tting has been o
1e10: 76 65 72 72 69 64 64 65 6e 20 62 79 20 74 68 65  verridden by the
1e20: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1e30: 75 73 65 72 20 28 65 2e 67 2e 20 6f 6e 20 74 68  user (e.g. on th
1e40: 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e  e command line).
1e50: 20 20 54 68 69 73 20 68 65 6c 70 73 20 63 6f 6e    This helps con
1e60: 74 72 6f 6c 20 65 78 61 63 74 6c 79 0d 0a 20 20  trol exactly..  
1e70: 20 20 20 20 23 20 20 20 20 20 20 20 77 68 69 63      #       whic
1e80: 68 20 73 65 74 20 6f 66 20 62 69 6e 61 72 69 65  h set of binarie
1e90: 73 20 77 65 20 61 72 65 20 74 65 73 74 69 6e 67  s we are testing
1ea0: 20 28 69 2e 65 2e 20 74 68 6f 73 65 20 62 75 69   (i.e. those bui
1eb0: 6c 74 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20  lt in the..     
1ec0: 20 23 20 20 20 20 20 20 20 22 44 65 62 75 67 22   #       "Debug"
1ed0: 20 6f 72 20 22 52 65 6c 65 61 73 65 22 20 62 75   or "Release" bu
1ee0: 69 6c 64 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ild configuratio
1ef0: 6e 73 29 2e 20 20 54 6f 20 6f 76 65 72 72 69 64  ns).  To overrid
1f00: 65 20 74 68 69 73 0d 0a 20 20 20 20 20 20 23 20  e this..      # 
1f10: 20 20 20 20 20 20 76 61 6c 75 65 20 76 69 61 20        value via 
1f20: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
1f30: 2c 20 65 6e 74 65 72 20 61 20 63 6f 6d 6d 61 6e  , enter a comman
1f40: 64 20 73 69 6d 69 6c 61 72 20 74 6f 20 6f 6e 65  d similar to one
1f50: 20 6f 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20   of..      #    
1f60: 20 20 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67     the following
1f70: 20 28 61 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e   (all on one lin
1f80: 65 29 3a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  e):..      #..  
1f90: 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c      #       Eagl
1fa0: 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49  eShell.exe -anyI
1fb0: 6e 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20 74  nitialize "set t
1fc0: 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f  est_configuratio
1fd0: 6e 20 44 65 62 75 67 22 0d 0a 20 20 20 20 20 20  n Debug"..      
1fe0: 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20  #         -file 
1ff0: 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61  .\path\to\all.ea
2000: 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  gle..      #..  
2010: 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c      #       Eagl
2020: 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49  eShell.exe -anyI
2030: 6e 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20 74  nitialize "set t
2040: 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f  est_configuratio
2050: 6e 20 52 65 6c 65 61 73 65 22 0d 0a 20 20 20 20  n Release"..    
2060: 20 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c    #         -fil
2070: 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e  e .\path\to\all.
2080: 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a  eagle..      #..
2090: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61        #       Ea
20a0: 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 66 69  gleShell.exe -fi
20b0: 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c  le .\path\to\all
20c0: 2e 65 61 67 6c 65 20 2d 70 72 65 54 65 73 74 0d  .eagle -preTest.
20d0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20  .      #        
20e0: 20 22 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c   "unset -nocompl
20f0: 61 69 6e 20 74 65 73 74 5f 63 6f 6e 66 69 67 75  ain test_configu
2100: 72 61 74 69 6f 6e 22 0d 0a 20 20 20 20 20 20 23  ration"..      #
2110: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
2120: 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f  o exists ::test_
2130: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 20 26  configuration] &
2140: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
2150: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
2160: 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74  :test_configurat
2170: 69 6f 6e 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ion] > 0} then {
2180: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2190: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65       # NOTE: Use
21a0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74   the specified t
21b0: 65 73 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  est configuratio
21c0: 6e 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20  n.  The default 
21d0: 76 61 6c 75 65 20 75 73 65 64 0d 0a 20 20 20 20  value used..    
21e0: 20 20 20 20 23 20 20 20 20 20 20 20 66 6f 72 20      #       for 
21f0: 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  this variable is
2200: 20 74 79 70 69 63 61 6c 6c 79 20 22 52 65 6c 65   typically "Rele
2210: 61 73 65 22 2c 20 61 73 20 73 65 74 20 62 79 20  ase", as set by 
2220: 74 68 65 20 74 65 73 74 0d 0a 20 20 20 20 20 20  the test..      
2230: 20 20 23 20 20 20 20 20 20 20 73 75 69 74 65 20    #       suite 
2240: 69 74 73 65 6c 66 2e 0d 0a 20 20 20 20 20 20 20  itself...       
2250: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
2260: 72 6e 20 24 3a 3a 74 65 73 74 5f 63 6f 6e 66 69  rn $::test_confi
2270: 67 75 72 61 74 69 6f 6e 0d 0a 20 20 20 20 20 20  guration..      
2280: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
2290: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
22a0: 4f 54 45 3a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 77  OTE: Normally, w
22b0: 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 68 69 74  e will never hit
22c0: 20 74 68 69 73 20 63 61 73 65 20 62 65 63 61 75   this case becau
22d0: 73 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  se the value of 
22e0: 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  the..        #  
22f0: 20 20 20 20 20 74 65 73 74 20 63 6f 6e 66 69 67       test config
2300: 75 72 61 74 69 6f 6e 20 76 61 72 69 61 62 6c 65  uration variable
2310: 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 62   is always set b
2320: 79 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  y the test suite
2330: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
2340: 20 20 69 74 73 65 6c 66 3b 20 68 6f 77 65 76 65    itself; howeve
2350: 72 2c 20 69 74 20 63 61 6e 20 62 65 20 6f 76 65  r, it can be ove
2360: 72 72 69 64 64 65 6e 20 75 73 69 6e 67 20 74 68  rridden using th
2370: 65 20 75 6e 73 65 74 20 63 6f 6d 6d 61 6e 64 0d  e unset command.
2380: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
2390: 20 66 72 6f 6d 20 74 68 65 20 2d 70 72 65 54 65   from the -preTe
23a0: 73 74 20 6f 70 74 69 6f 6e 20 74 6f 20 74 68 65  st option to the
23b0: 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20   test suite...  
23c0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
23d0: 20 72 65 74 75 72 6e 20 24 3a 3a 65 61 67 6c 65   return $::eagle
23e0: 5f 70 6c 61 74 66 6f 72 6d 28 63 6f 6e 66 69 67  _platform(config
23f0: 75 72 61 74 69 6f 6e 29 0d 0a 20 20 20 20 20 20  uration)..      
2400: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
2410: 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 43 6f   proc getBuildCo
2420: 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 7b 7d 20  nfigurations {} 
2430: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
2440: 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66    # NOTE: See if
2450: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 74 65 73   the list of tes
2460: 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  t configurations
2470: 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69   has been overri
2480: 64 64 65 6e 20 62 79 0d 0a 20 20 20 20 20 20 23  dden by..      #
2490: 20 20 20 20 20 20 20 74 68 65 20 75 73 65 72 20         the user 
24a0: 28 65 2e 67 2e 20 6f 6e 20 74 68 65 20 63 6f 6d  (e.g. on the com
24b0: 6d 61 6e 64 20 6c 69 6e 65 29 2e 0d 0a 20 20 20  mand line)...   
24c0: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
24d0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
24e0: 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f  est_configuratio
24f0: 6e 73 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  ns] && \..      
2500: 20 20 20 20 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a      [llength $::
2510: 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69  test_configurati
2520: 6f 6e 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ons] > 0} then {
2530: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2540: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65       # NOTE: Use
2550: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c   the specified l
2560: 69 73 74 20 6f 66 20 74 65 73 74 20 63 6f 6e 66  ist of test conf
2570: 69 67 75 72 61 74 69 6f 6e 73 2e 0d 0a 20 20 20  igurations...   
2580: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2590: 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 63  return $::test_c
25a0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 0d 0a 20  onfigurations.. 
25b0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
25c0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
25d0: 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68    # NOTE: Use th
25e0: 65 20 64 65 66 61 75 6c 74 20 6c 69 73 74 20 6f  e default list o
25f0: 66 20 74 65 73 74 20 63 6f 6e 66 69 67 75 72 61  f test configura
2600: 74 69 6f 6e 73 2e 0d 0a 20 20 20 20 20 20 20 20  tions...        
2610: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
2620: 6e 20 5b 6c 69 73 74 20 44 65 62 75 67 20 52 65  n [list Debug Re
2630: 6c 65 61 73 65 5d 0d 0a 20 20 20 20 20 20 7d 0d  lease]..      }.
2640: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
2650: 72 6f 63 20 67 65 74 42 75 69 6c 64 42 61 73 65  roc getBuildBase
2660: 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a  Directory {} {..
2670: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
2680: 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f 75   NOTE: Figure ou
2690: 74 20 74 68 65 20 62 61 73 65 20 64 69 72 65 63  t the base direc
26a0: 74 6f 72 79 20 77 68 65 72 65 20 61 6c 6c 20 74  tory where all t
26b0: 68 65 20 62 75 69 6c 64 73 20 73 68 6f 75 6c 64  he builds should
26c0: 20 62 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20   be..      #    
26d0: 20 20 20 6c 6f 63 61 74 65 64 2e 20 20 54 68 69     located.  Thi
26e0: 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 64 69  s will be the di
26f0: 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e  rectory that con
2700: 74 61 69 6e 73 20 74 68 65 20 61 63 74 75 61 6c  tains the actual
2710: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
2720: 62 75 69 6c 64 20 6f 75 74 70 75 74 20 64 69 72  build output dir
2730: 65 63 74 6f 72 79 20 28 65 2e 67 2e 20 70 61 72  ectory (e.g. par
2740: 65 6e 74 20 6f 66 20 22 62 69 6e 22 29 2e 0d 0a  ent of "bin")...
2750: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
2760: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
2770: 3a 3a 62 75 69 6c 64 5f 62 61 73 65 5f 64 69 72  ::build_base_dir
2780: 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20  ectory] && \..  
2790: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
27a0: 6c 65 6e 67 74 68 20 24 3a 3a 62 75 69 6c 64 5f  length $::build_
27b0: 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79 5d 20  base_directory] 
27c0: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
27d0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
27e0: 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61  # NOTE: The loca
27f0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 69 6c  tion of the buil
2800: 64 20 62 61 73 65 20 64 69 72 65 63 74 6f 72 79  d base directory
2810: 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69   has been overri
2820: 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23  dden;..        #
2830: 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65         therefore
2840: 2c 20 75 73 65 20 69 74 20 76 65 72 62 61 74 69  , use it verbati
2850: 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  m...        #.. 
2860: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
2870: 3a 62 75 69 6c 64 5f 62 61 73 65 5f 64 69 72 65  :build_base_dire
2880: 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65  ctory..      } e
2890: 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69  lseif {[info exi
28a0: 73 74 73 20 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72  sts ::common_dir
28b0: 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20  ectory] && \..  
28c0: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
28d0: 6c 65 6e 67 74 68 20 24 3a 3a 63 6f 6d 6d 6f 6e  length $::common
28e0: 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d  _directory] > 0}
28f0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2900: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
2910: 54 45 3a 20 4e 65 78 74 2c 20 66 61 6c 6c 62 61  TE: Next, fallba
2920: 63 6b 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  ck to the parent
2930: 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68   directory of th
2940: 65 20 6f 6e 65 20 63 6f 6e 74 61 69 6e 69 6e 67  e one containing
2950: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
2960: 20 20 74 68 69 73 20 66 69 6c 65 20 28 69 2e 65    this file (i.e
2970: 2e 20 22 63 6f 6d 6d 6f 6e 2e 65 61 67 6c 65 22  . "common.eagle"
2980: 29 2c 20 69 66 20 61 76 61 69 6c 61 62 6c 65 2e  ), if available.
2990: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
29a0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c       return [fil
29b0: 65 20 64 69 72 6e 61 6d 65 20 24 3a 3a 63 6f 6d  e dirname $::com
29c0: 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 0d 0a  mon_directory]..
29d0: 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
29e0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 70  [info exists ::p
29f0: 61 74 68 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ath] && \..     
2a00: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
2a10: 67 74 68 20 24 3a 3a 70 61 74 68 5d 20 3e 20 30  gth $::path] > 0
2a20: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2a30: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
2a40: 4f 54 45 3a 20 46 69 6e 61 6c 6c 79 2c 20 66 61  OTE: Finally, fa
2a50: 6c 6c 62 61 63 6b 20 74 6f 20 74 68 65 20 70 61  llback to the pa
2a60: 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 20 6f  rent directory o
2a70: 66 20 74 68 65 20 45 61 67 6c 65 54 65 73 74 0d  f the EagleTest.
2a80: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
2a90: 20 70 61 74 68 2e 20 20 54 68 65 20 45 61 67 6c   path.  The Eagl
2aa0: 65 54 65 73 74 20 70 61 63 6b 61 67 65 20 67 75  eTest package gu
2ab0: 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68  arantees that th
2ac0: 69 73 20 76 61 72 69 61 62 6c 65 0d 0a 20 20 20  is variable..   
2ad0: 20 20 20 20 20 23 20 20 20 20 20 20 20 77 69 6c       #       wil
2ae0: 6c 20 62 65 20 73 65 74 20 74 6f 20 74 68 65 20  l be set to the 
2af0: 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69  directory contai
2b00: 6e 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 66  ning the first f
2b10: 69 6c 65 20 74 6f 0d 0a 20 20 20 20 20 20 20 20  ile to..        
2b20: 23 20 20 20 20 20 20 20 65 78 65 63 75 74 65 20  #       execute 
2b30: 74 68 65 20 5b 72 75 6e 54 65 73 74 50 72 6f 6c  the [runTestProl
2b40: 6f 67 75 65 5d 20 73 63 72 69 70 74 20 6c 69 62  ogue] script lib
2b50: 72 61 72 79 20 70 72 6f 63 65 64 75 72 65 2e 0d  rary procedure..
2b60: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
2b70: 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65      return [file
2b80: 20 64 69 72 6e 61 6d 65 20 24 3a 3a 70 61 74 68   dirname $::path
2b90: 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
2ba0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
2bb0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f        # NOTE: No
2bc0: 20 70 61 74 68 20 69 73 20 61 76 61 69 6c 61 62   path is availab
2bd0: 6c 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 6d  le, return an em
2be0: 70 74 79 20 73 74 72 69 6e 67 2e 20 20 54 68 69  pty string.  Thi
2bf0: 73 20 70 6f 69 6e 74 0d 0a 20 20 20 20 20 20 20  s point..       
2c00: 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20   #       should 
2c10: 6e 6f 74 20 62 65 20 72 65 61 63 68 65 64 2e 0d  not be reached..
2c20: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
2c30: 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20      return "".. 
2c40: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
2c50: 0d 0a 20 20 20 20 70 72 6f 63 20 69 73 52 75 6e  ..    proc isRun
2c60: 6e 69 6e 67 57 6f 57 36 34 20 7b 7d 20 7b 0d 0a  ningWoW64 {} {..
2c70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78        return [ex
2c80: 70 72 20 7b 0d 0a 20 20 20 20 20 20 20 20 5b 69  pr {..        [i
2c90: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65 61 67  nfo exists ::eag
2ca0: 6c 65 5f 70 6c 61 74 66 6f 72 6d 28 77 6f 77 36  le_platform(wow6
2cb0: 34 29 5d 20 26 26 20 24 3a 3a 65 61 67 6c 65 5f  4)] && $::eagle_
2cc0: 70 6c 61 74 66 6f 72 6d 28 77 6f 77 36 34 29 0d  platform(wow64).
2cd0: 0a 20 20 20 20 20 20 7d 5d 0d 0a 20 20 20 20 7d  .      }]..    }
2ce0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73  .....    proc is
2cf0: 4d 69 78 65 64 4d 6f 64 65 41 73 73 65 6d 62 6c  MixedModeAssembl
2d00: 79 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 76 61  y { fileName {va
2d10: 72 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20  rName ""} } {.. 
2d20: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
2d30: 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20 6d 61 6b  NOTE: First, mak
2d40: 65 20 73 75 72 65 20 74 68 65 20 74 65 73 74 20  e sure the test 
2d50: 73 75 69 74 65 20 69 6e 66 72 61 73 74 72 75 63  suite infrastruc
2d60: 74 75 72 65 20 69 73 20 61 6c 6c 6f 77 65 64 20  ture is allowed 
2d70: 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  to..      #     
2d80: 20 20 75 73 65 20 74 68 65 20 5b 65 78 65 63 5d    use the [exec]
2d90: 20 63 6f 6d 6d 61 6e 64 2e 0d 0a 20 20 20 20 20   command...     
2da0: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b   #..      if {![
2db0: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
2dc0: 28 65 78 65 63 29 5d 20 26 26 20 21 5b 69 6e 66  (exec)] && ![inf
2dd0: 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f  o exists ::no(co
2de0: 72 46 6c 61 67 73 29 5d 7d 20 74 68 65 6e 20 7b  rFlags)]} then {
2df0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2e00: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
2e10: 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  the location of 
2e20: 43 6f 72 46 6c 61 67 73 20 69 73 20 70 72 65 73  CorFlags is pres
2e30: 65 6e 74 20 69 6e 20 74 68 65 20 65 6e 76 69 72  ent in the envir
2e40: 6f 6e 6d 65 6e 74 2c 0d 0a 20 20 20 20 20 20 20  onment,..       
2e50: 20 23 20 20 20 20 20 20 20 75 73 65 20 69 74 3b   #       use it;
2e60: 20 6f 74 68 65 72 77 69 73 65 20 61 73 73 75 6d   otherwise assum
2e70: 65 20 69 74 20 69 73 20 69 6e 20 74 68 65 20 50  e it is in the P
2e80: 41 54 48 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ATH...        #.
2e90: 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 72  .        set cor
2ea0: 46 6c 61 67 73 20 5b 65 78 70 72 20 7b 0d 0a 20  Flags [expr {.. 
2eb0: 20 20 20 20 20 20 20 20 20 5b 69 6e 66 6f 20 65           [info e
2ec0: 78 69 73 74 73 20 3a 3a 65 6e 76 28 43 6f 72 46  xists ::env(CorF
2ed0: 6c 61 67 73 29 5d 20 3f 20 24 3a 3a 65 6e 76 28  lags)] ? $::env(
2ee0: 43 6f 72 46 6c 61 67 73 29 20 3a 20 22 43 6f 72  CorFlags) : "Cor
2ef0: 46 6c 61 67 73 22 0d 0a 20 20 20 20 20 20 20 20  Flags"..        
2f00: 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  }]....        #.
2f10: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
2f20: 20 41 74 74 65 6d 70 74 20 74 6f 20 65 78 65 63   Attempt to exec
2f30: 75 74 65 20 43 6f 72 46 6c 61 67 73 20 6f 6e 20  ute CorFlags on 
2f40: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
2f50: 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  le...        #..
2f60: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
2f70: 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
2f80: 65 78 65 63 20 2d 2d 20 24 63 6f 72 46 6c 61 67  exec -- $corFlag
2f90: 73 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  s [file nativena
2fa0: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20  me $fileName].. 
2fb0: 20 20 20 20 20 20 20 7d 20 65 78 65 63 5d 20 3d         } exec] =
2fc0: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
2fd0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2fe0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 72      # NOTE: If r
2ff0: 65 71 75 65 73 74 65 64 20 62 79 20 6f 75 72 20  equested by our 
3000: 63 61 6c 6c 65 72 2c 20 61 74 74 65 6d 70 74 20  caller, attempt 
3010: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
3020: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
3030: 20 20 20 20 70 6c 61 74 66 6f 72 6d 20 66 6f 72      platform for
3040: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
3050: 69 6c 65 20 61 73 20 77 65 6c 6c 2e 0d 0a 20 20  ile as well...  
3060: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
3070: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
3080: 20 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d 65   length $varName
3090: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
30a0: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
30b0: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
30c0: 3a 20 53 74 6f 72 65 20 74 68 65 20 70 6c 61 74  : Store the plat
30d0: 66 6f 72 6d 20 69 6e 20 74 68 65 20 6e 61 6d 65  form in the name
30e0: 64 20 76 61 72 69 61 62 6c 65 20 69 6e 20 74 68  d variable in th
30f0: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  e..            #
3100: 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 20 6f         context o
3110: 66 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20  f our caller... 
3120: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
3130: 20 20 20 20 20 20 20 20 20 20 75 70 76 61 72 20            upvar 
3140: 31 20 24 76 61 72 4e 61 6d 65 20 70 6c 61 74 66  1 $varName platf
3150: 6f 72 6d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  orm....         
3160: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
3170: 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
3180: 74 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65  t to extract the
3190: 20 50 45 20 6c 69 6e 65 20 66 72 6f 6d 20 74 68   PE line from th
31a0: 65 20 63 61 70 74 75 72 65 64 0d 0a 20 20 20 20  e captured..    
31b0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
31c0: 6f 75 74 70 75 74 2e 20 20 49 66 20 74 68 69 73  output.  If this
31d0: 20 76 61 6c 75 65 20 69 73 20 22 50 45 33 32 22   value is "PE32"
31e0: 20 6f 72 20 22 50 45 33 32 2b 22 2c 20 74 68 65   or "PE32+", the
31f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
3200: 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 20 66        assembly f
3210: 69 6c 65 20 69 73 20 33 32 2d 62 69 74 20 6f 72  ile is 32-bit or
3220: 20 36 34 2d 62 69 74 2c 20 72 65 73 70 65 63 74   64-bit, respect
3230: 69 76 65 6c 79 3b 0d 0a 20 20 20 20 20 20 20 20  ively;..        
3240: 20 20 20 20 23 20 20 20 20 20 20 20 6f 74 68 65      #       othe
3250: 72 77 69 73 65 2c 20 69 74 73 20 74 79 70 65 20  rwise, its type 
3260: 69 73 20 75 6e 6b 6e 6f 77 6e 2e 0d 0a 20 20 20  is unknown...   
3270: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
3280: 20 20 20 20 20 20 20 20 73 65 74 20 70 61 74 74          set patt
3290: 65 72 6e 20 7b 5e 50 45 20 20 20 20 20 20 20 20  ern {^PE        
32a0: 3a 20 28 50 45 33 32 7c 50 45 33 32 5c 2b 29 5c  : (PE32|PE32\+)\
32b0: 73 2b 24 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  s+$}....        
32c0: 20 20 20 20 69 66 20 7b 5b 72 65 67 65 78 70 20      if {[regexp 
32d0: 2d 6c 69 6e 65 20 2d 2d 20 24 70 61 74 74 65 72  -line -- $patter
32e0: 6e 20 24 65 78 65 63 20 64 75 6d 6d 79 20 70 65  n $exec dummy pe
32f0: 33 32 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  32]} then {..   
3300: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
3310: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 48 41              # HA
3320: 43 4b 3a 20 54 68 69 73 20 5b 73 77 69 74 63 68  CK: This [switch
3330: 5d 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 33  ] assumes that 3
3340: 32 2d 62 69 74 20 65 78 65 63 75 74 61 62 6c 65  2-bit executable
3350: 73 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20 20  s are..         
3360: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6c 77       #       alw
3370: 61 79 73 20 78 38 36 20 61 6e 64 20 74 68 61 74  ays x86 and that
3380: 20 36 34 2d 62 69 74 20 65 78 65 63 75 74 61 62   64-bit executab
3390: 6c 65 73 20 61 72 65 20 61 6c 77 61 79 73 0d 0a  les are always..
33a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
33b0: 20 20 20 20 20 20 78 36 34 2e 0d 0a 20 20 20 20        x64...    
33c0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
33d0: 20 20 20 20 20 20 20 20 20 20 20 73 77 69 74 63             switc
33e0: 68 20 2d 65 78 61 63 74 20 2d 2d 20 24 70 65 33  h -exact -- $pe3
33f0: 32 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  2 {..           
3400: 20 20 20 20 20 50 45 33 32 20 7b 0d 0a 20 20 20       PE32 {..   
3410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
3420: 65 74 20 70 6c 61 74 66 6f 72 6d 20 57 69 6e 33  et platform Win3
3430: 32 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2..             
3440: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
3450: 20 20 20 20 20 20 50 45 33 32 2b 20 7b 0d 0a 20        PE32+ {.. 
3460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3470: 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 78 36   set platform x6
3480: 34 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  4..             
3490: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
34a0: 20 20 20 20 20 20 64 65 66 61 75 6c 74 20 7b 0d        default {.
34b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
34c0: 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20     set platform 
34d0: 22 22 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ""..            
34e0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
34f0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
3500: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
3510: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
3520: 70 6c 61 74 66 6f 72 6d 20 22 22 0d 0a 20 20 20  platform ""..   
3530: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
3540: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
3550: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
3560: 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
3570: 74 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65  t to extract the
3580: 20 49 4c 4f 4e 4c 59 20 6c 69 6e 65 20 66 72 6f   ILONLY line fro
3590: 6d 20 74 68 65 20 63 61 70 74 75 72 65 64 0d 0a  m the captured..
35a0: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
35b0: 20 20 6f 75 74 70 75 74 2e 20 20 49 66 20 74 68    output.  If th
35c0: 69 73 20 76 61 6c 75 65 20 69 73 20 7a 65 72 6f  is value is zero
35d0: 2c 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  , the specified 
35e0: 66 69 6c 65 20 6d 75 73 74 0d 0a 20 20 20 20 20  file must..     
35f0: 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65 20       #       be 
3600: 61 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73  a mixed-mode ass
3610: 65 6d 62 6c 79 3b 20 6f 74 68 65 72 77 69 73 65  embly; otherwise
3620: 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  , it contains on
3630: 6c 79 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  ly..          # 
3640: 20 20 20 20 20 20 6d 61 6e 61 67 65 64 20 63 6f        managed co
3650: 6d 70 6f 6e 65 6e 74 73 2e 0d 0a 20 20 20 20 20  mponents...     
3660: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
3670: 20 20 73 65 74 20 70 61 74 74 65 72 6e 20 7b 5e    set pattern {^
3680: 49 4c 4f 4e 4c 59 20 20 20 20 3a 20 28 30 7c 31  ILONLY    : (0|1
3690: 29 5c 73 2b 24 7d 0d 0a 0d 0a 20 20 20 20 20 20  )\s+$}....      
36a0: 20 20 20 20 69 66 20 7b 21 5b 72 65 67 65 78 70      if {![regexp
36b0: 20 2d 6c 69 6e 65 20 2d 2d 20 24 70 61 74 74 65   -line -- $patte
36c0: 72 6e 20 24 65 78 65 63 20 64 75 6d 6d 79 20 69  rn $exec dummy i
36d0: 6c 4f 6e 6c 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  lOnly]} then {..
36e0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
36f0: 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20  rn false..      
3700: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
3710: 20 20 20 69 66 20 7b 21 24 69 6c 4f 6e 6c 79 7d     if {!$ilOnly}
3720: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
3730: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
3740: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
3750: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
3760: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
3770: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74      # NOTE: If t
3780: 68 65 20 74 65 73 74 20 73 75 69 74 65 20 63 61  he test suite ca
3790: 6e 6e 6f 74 20 75 73 65 20 5b 65 78 65 63 5d 20  nnot use [exec] 
37a0: 6f 72 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  or execution of 
37b0: 43 6f 72 46 6c 61 67 73 0d 0a 20 20 20 20 20 20  CorFlags..      
37c0: 23 20 20 20 20 20 20 20 66 61 69 6c 65 64 2c 20  #       failed, 
37d0: 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 0d 0a 20  return false... 
37e0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
37f0: 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20  turn false..    
3800: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69  }.....    proc i
3810: 73 42 75 69 6c 64 41 76 61 69 6c 61 62 6c 65 20  sBuildAvailable 
3820: 7b 20 6e 61 74 69 76 65 20 64 69 72 65 63 74 6f  { native directo
3830: 72 79 20 7b 76 61 72 4e 61 6d 65 20 22 22 7d 20  ry {varName ""} 
3840: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
3850: 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c      # NOTE: Buil
3860: 64 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c  d the fully qual
3870: 69 66 69 65 64 20 66 69 6c 65 20 6e 61 6d 65 20  ified file name 
3880: 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79 20  for the primary 
3890: 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20  assembly..      
38a0: 23 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 69  #       containi
38b0: 6e 67 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61  ng the System.Da
38c0: 74 61 2e 53 51 4c 69 74 65 20 6d 61 6e 61 67 65  ta.SQLite manage
38d0: 64 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e 20 20 49  d components.  I
38e0: 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  t..      #      
38f0: 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 74 65 64   should be noted
3900: 20 74 68 61 74 20 74 68 69 73 20 61 73 73 65 6d   that this assem
3910: 62 6c 79 20 66 69 6c 65 20 6d 61 79 20 61 6c 73  bly file may als
3920: 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 0d 0a 20  o contain the.. 
3930: 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 74       #       nat
3940: 69 76 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 2c 20  ive components, 
3950: 69 66 20 61 20 6e 61 74 69 76 65 20 62 75 69 6c  if a native buil
3960: 64 20 69 73 20 69 6e 20 75 73 65 2e 0d 0a 20 20  d is in use...  
3970: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
3980: 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20   fileName [file 
3990: 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
39a0: 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79   join $directory
39b0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 53 79   \..          Sy
39c0: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
39d0: 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  .dll]]....      
39e0: 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74  if {![file exist
39f0: 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  s $fileName]} th
3a00: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
3a10: 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20  turn false..    
3a20: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
3a30: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74        # NOTE: At
3a40: 74 65 6d 70 74 20 74 6f 20 61 75 74 6f 6d 61 74  tempt to automat
3a50: 69 63 61 6c 6c 79 20 64 65 74 65 63 74 20 69 66  ically detect if
3a60: 20 74 68 65 20 70 72 69 6d 61 72 79 20 61 73 73   the primary ass
3a70: 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 23 20 20  embly..      #  
3a80: 20 20 20 20 20 63 6f 6e 74 61 69 6e 73 20 61 6e       contains an
3a90: 79 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e 65  y native compone
3aa0: 6e 74 73 2c 20 69 66 20 6e 65 63 65 73 73 61 72  nts, if necessar
3ab0: 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  y...      #..   
3ac0: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
3ad0: 65 6e 67 74 68 20 24 6e 61 74 69 76 65 5d 20 3d  ength $native] =
3ae0: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
3af0: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
3b00: 20 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d 65   length $varName
3b10: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
3b20: 20 20 20 20 20 20 20 20 20 75 70 76 61 72 20 31           upvar 1
3b30: 20 24 76 61 72 4e 61 6d 65 20 24 76 61 72 4e 61   $varName $varNa
3b40: 6d 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  me..        }...
3b50: 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 61 74  .        set nat
3b60: 69 76 65 20 5b 69 73 4d 69 78 65 64 4d 6f 64 65  ive [isMixedMode
3b70: 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61  Assembly $fileNa
3b80: 6d 65 20 24 76 61 72 4e 61 6d 65 5d 0d 0a 20 20  me $varName]..  
3b90: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
3ba0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
3bb0: 49 66 20 74 68 65 20 70 72 69 6d 61 72 79 20 61  If the primary a
3bc0: 73 73 65 6d 62 6c 79 20 61 6c 73 6f 20 63 6f 6e  ssembly also con
3bd0: 74 61 69 6e 73 20 74 68 65 20 6e 61 74 69 76 65  tains the native
3be0: 20 63 6f 6d 70 6f 6e 65 6e 74 73 2c 0d 0a 20 20   components,..  
3bf0: 20 20 20 20 23 20 20 20 20 20 20 20 77 65 20 68      #       we h
3c00: 61 76 65 20 65 76 65 72 79 74 68 69 6e 67 20 77  ave everything w
3c10: 65 20 6e 65 65 64 2e 0d 0a 20 20 20 20 20 20 23  e need...      #
3c20: 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 6e 61 74  ..      if {$nat
3c30: 69 76 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ive} then {..   
3c40: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
3c50: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
3c60: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
3c70: 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 66 75  TE: Build the fu
3c80: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 66 69  lly qualified fi
3c90: 6c 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  le name for the 
3ca0: 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79  interop assembly
3cb0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
3cc0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 53  containing the S
3cd0: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
3ce0: 65 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e 65  e native compone
3cf0: 6e 74 73 2e 20 20 49 66 20 74 68 69 73 0d 0a 20  nts.  If this.. 
3d00: 20 20 20 20 20 23 20 20 20 20 20 20 20 66 69 6c       #       fil
3d10: 65 20 65 78 69 73 74 73 2c 20 77 65 20 73 68 6f  e exists, we sho
3d20: 75 6c 64 20 68 61 76 65 20 65 76 65 72 79 74 68  uld have everyth
3d30: 69 6e 67 20 77 65 20 6e 65 65 64 2e 0d 0a 20 20  ing we need...  
3d40: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
3d50: 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20   fileName [file 
3d60: 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
3d70: 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79   join $directory
3d80: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 53 51   \..          SQ
3d90: 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c  Lite.Interop.dll
3da0: 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  ]]....      if {
3db0: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69  [file exists $fi
3dc0: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
3dd0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
3de0: 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  true..      }...
3df0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
3e00: 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68  # NOTE: Build th
3e10: 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  e fully qualifie
3e20: 64 20 66 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20  d file name for 
3e30: 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 0d  the SQLite core.
3e40: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6c  .      #       l
3e50: 69 62 72 61 72 79 2e 20 20 49 66 20 74 68 69 73  ibrary.  If this
3e60: 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 77 65   file exists, we
3e70: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 65 76 65   should have eve
3e80: 72 79 74 68 69 6e 67 20 77 65 0d 0a 20 20 20 20  rything we..    
3e90: 20 20 23 20 20 20 20 20 20 20 6e 65 65 64 2e 0d    #       need..
3ea0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
3eb0: 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69  set fileName [fi
3ec0: 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
3ed0: 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74  ile join $direct
3ee0: 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ory \..         
3ef0: 20 73 71 6c 69 74 65 33 2e 64 6c 6c 5d 5d 0d 0a   sqlite3.dll]]..
3f00: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c  ..      if {[fil
3f10: 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61  e exists $fileNa
3f20: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
3f30: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
3f40: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
3f50: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
3f60: 54 45 3a 20 4f 6e 65 20 6f 72 20 6d 6f 72 65 20  TE: One or more 
3f70: 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e 65 6e 74  native component
3f80: 73 20 6e 65 65 64 65 64 20 62 79 20 53 79 73 74  s needed by Syst
3f90: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 0d 0a  em.Data.SQLite..
3fa0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 72        #       ar
3fb0: 65 20 6d 69 73 73 69 6e 67 2e 0d 0a 20 20 20 20  e missing...    
3fc0: 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72    #..      retur
3fd0: 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a  n false..    }..
3fe0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73 52 65  ...    proc isRe
3ff0: 6c 65 61 73 65 41 76 61 69 6c 61 62 6c 65 20 7b  leaseAvailable {
4000: 20 64 69 72 65 63 74 6f 72 79 20 7b 76 61 72 4e   directory {varN
4010: 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20  ame ""} } {..   
4020: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
4030: 65 6e 67 74 68 20 24 76 61 72 4e 61 6d 65 5d 20  ength $varName] 
4040: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
4050: 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61       upvar 1 $va
4060: 72 4e 61 6d 65 20 24 76 61 72 4e 61 6d 65 0d 0a  rName $varName..
4070: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
4080: 20 72 65 74 75 72 6e 20 5b 69 73 42 75 69 6c 64   return [isBuild
4090: 41 76 61 69 6c 61 62 6c 65 20 22 22 20 24 64 69  Available "" $di
40a0: 72 65 63 74 6f 72 79 20 24 76 61 72 4e 61 6d 65  rectory $varName
40b0: 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  ]..    }.....   
40c0: 20 70 72 6f 63 20 6a 6f 69 6e 42 75 69 6c 64 44   proc joinBuildD
40d0: 69 72 65 63 74 6f 72 79 20 7b 20 6e 61 74 69 76  irectory { nativ
40e0: 65 20 70 61 74 68 20 79 65 61 72 20 70 6c 61 74  e path year plat
40f0: 66 6f 72 6d 20 63 6f 6e 66 69 67 75 72 61 74 69  form configurati
4100: 6f 6e 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  on } {..      #.
4110: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46  .      # NOTE: F
4120: 69 67 75 72 65 20 6f 75 74 20 61 6e 64 20 74 68  igure out and th
4130: 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 66 75  en return the fu
4140: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 70 61  lly qualified pa
4150: 74 68 20 74 6f 20 74 68 65 20 62 75 69 6c 64 0d  th to the build.
4160: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64  .      #       d
4170: 69 72 65 63 74 6f 72 79 20 62 61 73 65 64 20 6f  irectory based o
4180: 6e 20 61 6c 6c 20 74 68 65 20 61 72 67 75 6d 65  n all the argume
4190: 6e 74 73 20 70 72 6f 76 69 64 65 64 20 62 79 20  nts provided by 
41a0: 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20  our caller...   
41b0: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
41c0: 24 6e 61 74 69 76 65 7d 20 74 68 65 6e 20 7b 0d  $native} then {.
41d0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
41e0: 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 70 61 74 68  [file join $path
41f0: 20 62 69 6e 20 24 79 65 61 72 20 24 70 6c 61 74   bin $year $plat
4200: 66 6f 72 6d 20 24 63 6f 6e 66 69 67 75 72 61 74  form $configurat
4210: 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  ion]..      } el
4220: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  se {..        re
4230: 74 75 72 6e 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  turn [file join 
4240: 24 70 61 74 68 20 62 69 6e 20 24 79 65 61 72 20  $path bin $year 
4250: 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 62  $configuration b
4260: 69 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  in]..      }..  
4270: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
4280: 20 67 65 74 42 75 69 6c 64 44 69 72 65 63 74 6f   getBuildDirecto
4290: 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ry {} {..      #
42a0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
42b0: 53 65 65 20 69 66 20 74 68 65 20 22 6e 61 74 69  See if the "nati
42c0: 76 65 22 20 72 75 6e 74 69 6d 65 20 6f 70 74 69  ve" runtime opti
42d0: 6f 6e 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  on has been set.
42e0: 20 20 49 66 20 73 6f 2c 20 75 73 65 20 74 68 65    If so, use the
42f0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
4300: 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20 74 68  directory for th
4310: 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73  e mixed-mode ass
4320: 65 6d 62 6c 79 20 28 61 2e 6b 2e 61 2e 20 74 68  embly (a.k.a. th
4330: 65 20 6e 61 74 69 76 65 20 69 6e 74 65 72 6f 70  e native interop
4340: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
4350: 61 73 73 65 6d 62 6c 79 29 2e 20 20 54 6f 20 65  assembly).  To e
4360: 6e 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6f  nable this optio
4370: 6e 20 76 69 61 20 74 68 65 20 63 6f 6d 6d 61 6e  n via the comman
4380: 64 20 6c 69 6e 65 2c 20 65 6e 74 65 72 20 61 0d  d line, enter a.
4390: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
43a0: 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c 61 72 20 74  ommand similar t
43b0: 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c  o one of the fol
43c0: 6c 6f 77 69 6e 67 20 28 61 6c 6c 20 6f 6e 20 6f  lowing (all on o
43d0: 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20 20 20  ne line):..     
43e0: 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20   #..      #     
43f0: 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65    EagleShell.exe
4400: 20 2d 69 6e 69 74 69 61 6c 69 7a 65 20 2d 72 75   -initialize -ru
4410: 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69  ntimeOption nati
4420: 76 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ve..      #     
4430: 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68      -file .\path
4440: 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20  \to\all.eagle.. 
4450: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
4460: 20 20 20 20 20 20 54 6f 20 65 6e 61 62 6c 65 20        To enable 
4470: 74 68 69 73 20 6f 70 74 69 6f 6e 20 76 69 61 20  this option via 
4480: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
4490: 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 22 62   prior to the "b
44a0: 65 74 61 20 31 36 22 0d 0a 20 20 20 20 20 20 23  eta 16"..      #
44b0: 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 20 6f         release o
44c0: 66 20 45 61 67 6c 65 2c 20 74 68 65 20 66 6f 6c  f Eagle, the fol
44d0: 6c 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e 64 20 6d  lowing command m
44e0: 75 73 74 20 62 65 20 75 73 65 64 20 69 6e 73 74  ust be used inst
44f0: 65 61 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ead..      #    
4500: 20 20 20 28 61 6c 73 6f 20 61 6c 6c 20 6f 6e 20     (also all on 
4510: 6f 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20 20  one line):..    
4520: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20    #..      #    
4530: 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78     EagleShell.ex
4540: 65 20 2d 69 6e 69 74 69 61 6c 69 7a 65 20 2d 70  e -initialize -p
4550: 6f 73 74 49 6e 69 74 69 61 6c 69 7a 65 0d 0a 20  ostInitialize.. 
4560: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 22       #         "
4570: 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49 6e  object invoke In
4580: 74 65 72 70 72 65 74 65 72 2e 47 65 74 41 63 74  terpreter.GetAct
4590: 69 76 65 20 41 64 64 52 75 6e 74 69 6d 65 4f 70  ive AddRuntimeOp
45a0: 74 69 6f 6e 20 6e 61 74 69 76 65 22 0d 0a 20 20  tion native"..  
45b0: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 2d 66      #         -f
45c0: 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c  ile .\path\to\al
45d0: 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23  l.eagle..      #
45e0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
45f0: 6f 20 65 78 69 73 74 73 20 3a 3a 62 75 69 6c 64  o exists ::build
4600: 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c  _directory] && \
4610: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
4620: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 62 75  ing length $::bu
4630: 69 6c 64 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e  ild_directory] >
4640: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
4650: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
4660: 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74   NOTE: The locat
4670: 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 64  ion of the build
4680: 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
4690: 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d  een overridden;.
46a0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
46b0: 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   therefore, use 
46c0: 69 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20  it verbatim...  
46d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
46e0: 20 72 65 74 75 72 6e 20 24 3a 3a 62 75 69 6c 64   return $::build
46f0: 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20  _directory..    
4700: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
4710: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
4720: 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 22 6e   NOTE: If the "n
4730: 61 74 69 76 65 22 20 72 75 6e 74 69 6d 65 20 6f  ative" runtime o
4740: 70 74 69 6f 6e 20 69 73 20 73 65 74 2c 20 74 68  ption is set, th
4750: 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73  e mixed-mode ass
4760: 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 20 20 23  embly..        #
4770: 20 20 20 20 20 20 20 69 73 20 62 65 69 6e 67 20         is being 
4780: 74 65 73 74 65 64 2e 20 20 49 6e 20 74 68 61 74  tested.  In that
4790: 20 63 61 73 65 2c 20 74 68 65 20 70 61 74 68 20   case, the path 
47a0: 74 6f 20 74 68 65 20 62 75 69 6c 64 20 64 69 72  to the build dir
47b0: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 20 20  ectory..        
47c0: 23 20 20 20 20 20 20 20 77 69 6c 6c 20 63 6f 6e  #       will con
47d0: 74 61 69 6e 20 74 68 65 20 70 6c 61 74 66 6f 72  tain the platfor
47e0: 6d 20 6e 61 6d 65 20 61 6e 64 20 61 6c 6c 20 74  m name and all t
47f0: 68 65 20 62 69 6e 61 72 69 65 73 20 75 6e 64 65  he binaries unde
4800: 72 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20  r test..        
4810: 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62  #       should b
4820: 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 61  e present in tha
4830: 74 20 64 69 72 65 63 74 6f 72 79 2e 20 20 49 66  t directory.  If
4840: 20 74 68 65 20 22 6e 61 74 69 76 65 22 20 72 75   the "native" ru
4850: 6e 74 69 6d 65 0d 0a 20 20 20 20 20 20 20 20 23  ntime..        #
4860: 20 20 20 20 20 20 20 6f 70 74 69 6f 6e 20 69 73         option is
4870: 20 6e 6f 74 20 73 65 74 2c 20 74 68 65 20 62 75   not set, the bu
4880: 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20 77 69  ild directory wi
4890: 6c 6c 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64  ll be considered
48a0: 20 74 6f 20 62 65 0d 0a 20 20 20 20 20 20 20 20   to be..        
48b0: 23 20 20 20 20 20 20 20 22 70 6c 61 74 66 6f 72  #       "platfor
48c0: 6d 2d 6e 65 75 74 72 61 6c 22 2c 20 77 69 74 68  m-neutral", with
48d0: 20 74 68 65 20 6e 6f 74 61 62 6c 65 20 65 78 63   the notable exc
48e0: 65 70 74 69 6f 6e 20 6f 66 20 61 6e 79 20 6e 61  eption of any na
48f0: 74 69 76 65 0d 0a 20 20 20 20 20 20 20 20 23 20  tive..        # 
4900: 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 20 28        assembly (
4910: 65 2e 67 2e 20 22 53 51 4c 69 74 65 2e 49 6e 74  e.g. "SQLite.Int
4920: 65 72 6f 70 2e 64 6c 6c 22 29 20 63 6f 70 69 65  erop.dll") copie
4930: 64 20 74 68 65 72 65 20 64 75 72 69 6e 67 20 74  d there during t
4940: 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  he..        #   
4950: 20 20 20 20 62 75 69 6c 64 20 70 72 6f 63 65 73      build proces
4960: 73 20 69 74 73 65 6c 66 2e 20 20 49 66 20 74 68  s itself.  If th
4970: 65 20 62 75 69 6c 64 20 70 72 6f 63 65 73 73 20  e build process 
4980: 73 6f 6d 65 68 6f 77 20 64 6f 65 73 20 6e 6f 74  somehow does not
4990: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
49a0: 20 20 63 6f 70 79 20 74 68 65 20 6e 61 74 69 76    copy the nativ
49b0: 65 20 61 73 73 65 6d 62 6c 79 20 66 6f 72 20 74  e assembly for t
49c0: 68 69 73 20 70 6c 61 74 66 6f 72 6d 2c 20 6d 6f  his platform, mo
49d0: 73 74 20 6f 66 20 74 68 65 20 74 65 73 74 73 0d  st of the tests.
49e0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
49f0: 20 69 6e 20 74 68 65 20 73 75 69 74 65 20 77 69   in the suite wi
4a00: 6c 6c 20 73 69 6d 70 6c 79 20 62 65 20 73 6b 69  ll simply be ski
4a10: 70 70 65 64 2e 20 20 47 65 6e 65 72 61 6c 6c 79  pped.  Generally
4a20: 20 73 70 65 61 6b 69 6e 67 2c 20 74 68 65 72 65   speaking, there
4a30: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
4a40: 20 20 61 72 65 20 74 77 6f 20 77 61 79 73 20 74    are two ways t
4a50: 6f 20 62 75 69 6c 64 20 74 68 65 20 62 69 6e 61  o build the bina
4a60: 72 69 65 73 20 77 68 65 6e 20 70 72 65 70 61 72  ries when prepar
4a70: 69 6e 67 20 74 6f 20 72 75 6e 20 74 68 65 0d 0a  ing to run the..
4a80: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
4a90: 74 65 73 74 20 73 75 69 74 65 3a 0d 0a 20 20 20  test suite:..   
4aa0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4ab0: 23 20 20 20 20 20 20 20 31 2e 20 42 75 69 6c 64  #       1. Build
4ac0: 20 74 68 65 20 73 65 70 61 72 61 74 65 20 6d 61   the separate ma
4ad0: 6e 61 67 65 64 20 61 6e 64 20 6e 61 74 69 76 65  naged and native
4ae0: 20 61 73 73 65 6d 62 6c 69 65 73 20 75 73 69 6e   assemblies usin
4af0: 67 20 73 6f 6d 65 0d 0a 20 20 20 20 20 20 20 20  g some..        
4b00: 23 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 61  #          comma
4b10: 6e 64 73 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0d  nds similar to:.
4b20: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
4b30: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 62      #          b
4b40: 75 69 6c 64 2e 62 61 74 20 24 7b 43 6f 6e 66 69  uild.bat ${Confi
4b50: 67 75 72 61 74 69 6f 6e 7d 4d 61 6e 61 67 65 64  guration}Managed
4b60: 4f 6e 6c 79 20 24 7b 50 6c 61 74 66 6f 72 6d 7d  Only ${Platform}
4b70: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
4b80: 20 20 20 20 20 62 75 69 6c 64 2e 62 61 74 20 24       build.bat $
4b90: 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 4e  {Configuration}N
4ba0: 61 74 69 76 65 4f 6e 6c 79 20 24 7b 50 6c 61 74  ativeOnly ${Plat
4bb0: 66 6f 72 6d 7d 0d 0a 20 20 20 20 20 20 20 20 23  form}..        #
4bc0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
4bd0: 20 20 20 20 20 57 68 65 72 65 20 24 7b 43 6f 6e       Where ${Con
4be0: 66 69 67 75 72 61 74 69 6f 6e 7d 20 69 73 20 65  figuration} is e
4bf0: 69 74 68 65 72 20 22 44 65 62 75 67 22 20 6f 72  ither "Debug" or
4c00: 20 22 52 65 6c 65 61 73 65 22 20 61 6e 64 0d 0a   "Release" and..
4c10: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
4c20: 20 20 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 20 69     ${Platform} i
4c30: 73 20 65 69 74 68 65 72 20 22 57 69 6e 33 32 22  s either "Win32"
4c40: 20 6f 72 20 22 78 36 34 22 2e 0d 0a 20 20 20 20   or "x64"...    
4c50: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
4c60: 20 20 20 20 20 20 20 32 2e 20 42 75 69 6c 64 20         2. Build 
4c70: 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61  the mixed-mode a
4c80: 73 73 65 6d 62 6c 79 20 75 73 69 6e 67 20 61 20  ssembly using a 
4c90: 63 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c 61 72 20  command similar 
4ca0: 74 6f 3a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  to:..        #..
4cb0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
4cc0: 20 20 20 62 75 69 6c 64 2e 62 61 74 20 24 7b 43     build.bat ${C
4cd0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 20 24 7b  onfiguration} ${
4ce0: 50 6c 61 74 66 6f 72 6d 7d 0d 0a 20 20 20 20 20  Platform}..     
4cf0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
4d00: 20 20 20 20 20 20 20 20 20 57 68 65 72 65 20 24           Where $
4d10: 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 20  {Configuration} 
4d20: 69 73 20 65 69 74 68 65 72 20 22 44 65 62 75 67  is either "Debug
4d30: 22 20 6f 72 20 22 52 65 6c 65 61 73 65 22 20 61  " or "Release" a
4d40: 6e 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  nd..        #   
4d50: 20 20 20 20 20 20 20 24 7b 50 6c 61 74 66 6f 72         ${Platfor
4d60: 6d 7d 20 69 73 20 65 69 74 68 65 72 20 22 57 69  m} is either "Wi
4d70: 6e 33 32 22 20 6f 72 20 22 78 36 34 22 2e 20 20  n32" or "x64".  
4d80: 49 66 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  If this command 
4d90: 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  is..        #   
4da0: 20 20 20 20 20 20 20 75 73 65 64 2c 20 76 61 72         used, var
4db0: 69 6f 75 73 20 74 65 73 74 73 20 74 68 61 74 20  ious tests that 
4dc0: 72 65 71 75 69 72 65 20 73 75 70 70 6c 65 6d 65  require suppleme
4dd0: 6e 74 61 72 79 20 6d 61 6e 61 67 65 64 0d 0a 20  ntary managed.. 
4de0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
4df0: 20 20 61 73 73 65 6d 62 6c 69 65 73 20 28 65 2e    assemblies (e.
4e00: 67 2e 20 4c 49 4e 51 29 20 6d 61 79 20 62 65 20  g. LINQ) may be 
4e10: 73 6b 69 70 70 65 64 20 75 6e 6c 65 73 73 20 74  skipped unless t
4e20: 68 6f 73 65 20 62 69 6e 61 72 69 65 73 0d 0a 20  hose binaries.. 
4e30: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
4e40: 20 20 61 72 65 20 73 75 62 73 65 71 75 65 6e 74    are subsequent
4e50: 6c 79 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74  ly copied into t
4e60: 68 65 20 63 6f 72 72 65 63 74 20 64 69 72 65 63  he correct direc
4e70: 74 6f 72 79 20 28 69 2e 65 2e 20 62 79 0d 0a 20  tory (i.e. by.. 
4e80: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
4e90: 20 20 22 74 65 73 74 5f 61 6c 6c 2e 62 61 74 22    "test_all.bat"
4ea0: 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  )...        #.. 
4eb0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 4e         #       N
4ec0: 6f 74 65 20 74 68 61 74 20 61 6c 6c 20 6f 66 20  ote that all of 
4ed0: 74 68 65 20 62 75 69 6c 64 20 63 6f 6d 6d 61 6e  the build comman
4ee0: 64 73 20 61 62 6f 76 65 20 77 69 6c 6c 20 64 65  ds above will de
4ef0: 66 61 75 6c 74 20 74 6f 20 75 73 69 6e 67 0d 0a  fault to using..
4f00: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
4f10: 74 68 65 20 6c 61 74 65 73 74 20 76 65 72 73 69  the latest versi
4f20: 6f 6e 20 6f 66 20 4d 53 42 75 69 6c 64 20 61 76  on of MSBuild av
4f30: 61 69 6c 61 62 6c 65 20 61 6e 64 20 74 68 65 20  ailable and the 
4f40: 22 74 65 73 74 5f 79 65 61 72 22 20 6d 61 79 0d  "test_year" may.
4f50: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
4f60: 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64 6a 75   need to be adju
4f70: 73 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79  sted accordingly
4f80: 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 72 75 6e   to actually run
4f90: 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e   the test suite.
4fa0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
4fb0: 20 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 63    Refer to the c
4fc0: 6f 6d 6d 65 6e 74 73 20 69 6e 20 5b 67 65 74 42  omments in [getB
4fd0: 75 69 6c 64 59 65 61 72 5d 20 66 6f 72 20 6d 6f  uildYear] for mo
4fe0: 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  re information o
4ff0: 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  n..        #    
5000: 20 20 20 68 6f 77 20 74 6f 20 73 65 74 20 74 68     how to set th
5010: 69 73 20 76 61 72 69 61 62 6c 65 2e 0d 0a 20 20  is variable...  
5020: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
5030: 20 73 65 74 20 6e 61 74 69 76 65 20 5b 68 61 73   set native [has
5040: 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61  RuntimeOption na
5050: 74 69 76 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  tive]....       
5060: 20 72 65 74 75 72 6e 20 5b 6a 6f 69 6e 42 75 69   return [joinBui
5070: 6c 64 44 69 72 65 63 74 6f 72 79 20 24 6e 61 74  ldDirectory $nat
5080: 69 76 65 20 5b 67 65 74 42 75 69 6c 64 42 61 73  ive [getBuildBas
5090: 65 44 69 72 65 63 74 6f 72 79 5d 20 5c 0d 0a 20  eDirectory] \.. 
50a0: 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42             [getB
50b0: 75 69 6c 64 59 65 61 72 5d 20 5b 67 65 74 42 75  uildYear] [getBu
50c0: 69 6c 64 50 6c 61 74 66 6f 72 6d 20 24 6e 61 74  ildPlatform $nat
50d0: 69 76 65 5d 20 5b 67 65 74 42 75 69 6c 64 43 6f  ive] [getBuildCo
50e0: 6e 66 69 67 75 72 61 74 69 6f 6e 5d 5d 0d 0a 20  nfiguration]].. 
50f0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
5100: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 52 65  ..    proc getRe
5110: 6c 65 61 73 65 56 65 72 73 69 6f 6e 20 7b 7d 20  leaseVersion {} 
5120: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
5130: 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65    # NOTE: Figure
5140: 20 6f 75 74 20 74 68 65 20 72 65 6c 65 61 73 65   out the release
5150: 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 75 73 65   version for use
5160: 20 77 69 74 68 20 74 68 65 20 62 75 69 6c 64 20   with the build 
5170: 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20  directory..     
5180: 20 23 20 20 20 20 20 20 20 77 68 65 6e 20 63 68   #       when ch
5190: 65 63 6b 69 6e 67 20 66 6f 72 20 61 76 61 69 6c  ecking for avail
51a0: 61 62 6c 65 20 72 65 6c 65 61 73 65 73 2e 0d 0a  able releases...
51b0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
51c0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
51d0: 3a 3a 72 65 6c 65 61 73 65 5f 76 65 72 73 69 6f  ::release_versio
51e0: 6e 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  n] && \..       
51f0: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
5200: 68 20 24 3a 3a 72 65 6c 65 61 73 65 5f 76 65 72  h $::release_ver
5210: 73 69 6f 6e 5d 20 3e 20 30 7d 20 74 68 65 6e 20  sion] > 0} then 
5220: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
5230: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
5240: 65 20 72 65 6c 65 61 73 65 20 76 65 72 73 69 6f  e release versio
5250: 6e 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  n has been overr
5260: 69 64 64 65 6e 3b 20 74 68 65 72 65 66 6f 72 65  idden; therefore
5270: 2c 20 75 73 65 20 69 74 0d 0a 20 20 20 20 20 20  , use it..      
5280: 20 20 23 20 20 20 20 20 20 20 76 65 72 62 61 74    #       verbat
5290: 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  im...        #..
52a0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
52b0: 3a 3a 72 65 6c 65 61 73 65 5f 76 65 72 73 69 6f  ::release_versio
52c0: 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  n..      } else 
52d0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
52e0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f        # NOTE: No
52f0: 20 72 65 6c 65 61 73 65 20 76 65 72 73 69 6f 6e   release version
5300: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72   is available, r
5310: 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73  eturn an empty s
5320: 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20  tring...        
5330: 23 20 20 20 20 20 20 20 49 74 20 69 73 20 69 6d  #       It is im
5340: 70 6f 72 74 61 6e 74 20 74 6f 20 72 65 74 75 72  portant to retur
5350: 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  n an empty strin
5360: 67 20 68 65 72 65 20 62 65 63 61 75 73 65 20 74  g here because t
5370: 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  he..        #   
5380: 20 20 20 20 72 65 73 75 6c 74 20 6f 66 20 74 68      result of th
5390: 69 73 20 70 72 6f 63 65 64 75 72 65 20 6d 61 79  is procedure may
53a0: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 5b 66   be used with [f
53b0: 69 6c 65 20 6a 6f 69 6e 5d 2e 0d 0a 20 20 20 20  ile join]...    
53c0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
53d0: 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 20 20  eturn ""..      
53e0: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
53f0: 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 46 69   proc getBuildFi
5400: 6c 65 4e 61 6d 65 20 7b 20 66 69 6c 65 4e 61 6d  leName { fileNam
5410: 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20  e {platform ""} 
5420: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
5430: 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75      # NOTE: Retu
5440: 72 6e 73 20 74 68 65 20 73 70 65 63 69 66 69 65  rns the specifie
5450: 64 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 69  d file name as i
5460: 66 20 69 74 20 77 65 72 65 20 6c 6f 63 61 74 65  f it were locate
5470: 64 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20  d in the..      
5480: 23 20 20 20 20 20 20 20 62 75 69 6c 64 20 64 69  #       build di
5490: 72 65 63 74 6f 72 79 2c 20 64 69 73 63 61 72 64  rectory, discard
54a0: 69 6e 67 20 61 6e 79 20 64 69 72 65 63 74 6f 72  ing any director
54b0: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 72  y information pr
54c0: 65 73 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20  esent..      #  
54d0: 20 20 20 20 20 69 6e 20 74 68 65 20 66 69 6c 65       in the file
54e0: 20 6e 61 6d 65 20 61 73 20 70 72 6f 76 69 64 65   name as provide
54f0: 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e  d by our caller.
5500: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
5510: 20 73 65 74 20 72 65 73 75 6c 74 20 5b 66 69 6c   set result [fil
5520: 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a  e nativename \..
5530: 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
5540: 6a 6f 69 6e 20 5b 67 65 74 42 75 69 6c 64 44 69  join [getBuildDi
5550: 72 65 63 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f  rectory] $platfo
5560: 72 6d 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66  rm [file tail $f
5570: 69 6c 65 4e 61 6d 65 5d 5d 5d 0d 0a 0d 0a 20 20  ileName]]]....  
5580: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 48      #..      # H
5590: 41 43 4b 3a 20 57 68 65 6e 20 72 75 6e 6e 69 6e  ACK: When runnin
55a0: 67 20 6f 6e 20 57 6f 57 36 34 2c 20 61 73 73 75  g on WoW64, assu
55b0: 6d 65 20 74 68 65 20 74 65 73 74 20 65 78 65 63  me the test exec
55c0: 75 74 61 62 6c 65 73 20 61 72 65 20 70 72 65 73  utables are pres
55d0: 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ent..      #    
55e0: 20 20 20 77 69 74 68 20 74 68 65 20 22 33 32 22     with the "32"
55f0: 20 73 75 66 66 69 78 20 6f 6e 20 74 68 65 6d 2e   suffix on them.
5600: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
5610: 20 69 66 20 7b 5b 69 73 52 75 6e 6e 69 6e 67 57   if {[isRunningW
5620: 6f 57 36 34 5d 20 26 26 20 5b 66 69 6c 65 20 65  oW64] && [file e
5630: 78 74 65 6e 73 69 6f 6e 20 24 72 65 73 75 6c 74  xtension $result
5640: 5d 20 65 71 20 22 2e 65 78 65 22 7d 20 74 68 65  ] eq ".exe"} the
5650: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  n {..        set
5660: 20 72 65 73 75 6c 74 20 5b 61 70 70 65 6e 64 41   result [appendA
5670: 72 67 73 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61  rgs [file rootna
5680: 6d 65 20 24 72 65 73 75 6c 74 5d 20 33 32 2e 65  me $result] 32.e
5690: 78 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  xe]..      }....
56a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65        return $re
56b0: 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  sult..    }.....
56c0: 20 20 20 20 70 72 6f 63 20 67 65 74 45 78 74 65      proc getExte
56d0: 72 6e 61 6c 44 69 72 65 63 74 6f 72 79 20 7b 7d  rnalDirectory {}
56e0: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
56f0: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20     # NOTE: This 
5700: 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72 6e  procedure return
5710: 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  s the directory 
5720: 77 68 65 72 65 20 74 68 65 20 65 78 74 65 72 6e  where the extern
5730: 61 6c 20 62 69 6e 61 72 79 0d 0a 20 20 20 20 20  al binary..     
5740: 20 23 20 20 20 20 20 20 20 66 69 6c 65 73 20 61   #       files a
5750: 72 65 20 6c 6f 63 61 74 65 64 2e 0d 0a 20 20 20  re located...   
5760: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
5770: 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  rn [file nativen
5780: 61 6d 65 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  ame [file dirnam
5790: 65 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20  e [file dirname 
57a0: 5b 69 6e 66 6f 20 62 69 6e 61 72 79 5d 5d 5d 5d  [info binary]]]]
57b0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
57c0: 70 72 6f 63 20 67 65 74 42 69 6e 61 72 79 44 69  proc getBinaryDi
57d0: 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20  rectory {} {..  
57e0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
57f0: 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64  OTE: This proced
5800: 75 72 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ure returns the 
5810: 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65 20  directory where 
5820: 74 68 65 20 74 65 73 74 20 61 70 70 6c 69 63 61  the test applica
5830: 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  tion..      #   
5840: 20 20 20 20 69 74 73 65 6c 66 20 28 69 2e 65 2e      itself (i.e.
5850: 20 74 68 65 20 45 61 67 6c 65 20 73 68 65 6c 6c   the Eagle shell
5860: 29 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 54  ) is located.  T
5870: 68 69 73 20 77 69 6c 6c 20 62 65 20 75 73 65 64  his will be used
5880: 20 61 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20   as..      #    
5890: 20 20 20 74 68 65 20 64 65 73 74 69 6e 61 74 69     the destinati
58a0: 6f 6e 20 66 6f 72 20 74 68 65 20 63 6f 70 69 65  on for the copie
58b0: 64 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  d System.Data.SQ
58c0: 4c 69 74 65 20 6e 61 74 69 76 65 20 61 6e 64 0d  Lite native and.
58d0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6d  .      #       m
58e0: 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 69 65  anaged assemblie
58f0: 73 20 28 69 2e 65 2e 20 62 65 63 61 75 73 65 20  s (i.e. because 
5900: 74 68 69 73 20 69 73 20 6f 6e 65 20 6f 66 20 74  this is one of t
5910: 68 65 20 66 65 77 20 70 6c 61 63 65 73 0d 0a 20  he few places.. 
5920: 20 20 20 20 20 23 20 20 20 20 20 20 20 77 68 65       #       whe
5930: 72 65 20 74 68 65 20 43 4c 52 20 77 69 6c 6c 20  re the CLR will 
5940: 61 63 74 75 61 6c 6c 79 20 66 69 6e 64 20 61 6e  actually find an
5950: 64 20 6c 6f 61 64 20 74 68 65 6d 20 70 72 6f 70  d load them prop
5960: 65 72 6c 79 29 2e 0d 0a 20 20 20 20 20 20 23 0d  erly)...      #.
5970: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
5980: 20 65 78 69 73 74 73 20 3a 3a 62 69 6e 61 72 79   exists ::binary
5990: 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c  _directory] && \
59a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
59b0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 62 69  ing length $::bi
59c0: 6e 61 72 79 5f 64 69 72 65 63 74 6f 72 79 5d 20  nary_directory] 
59d0: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
59e0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
59f0: 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61  # NOTE: The loca
5a00: 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 69 6e 61  tion of the bina
5a10: 72 79 20 64 69 72 65 63 74 6f 72 79 20 68 61 73  ry directory has
5a20: 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e   been overridden
5a30: 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ;..        #    
5a40: 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73     therefore, us
5a50: 65 20 69 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a  e it verbatim...
5a60: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
5a70: 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 62 69 6e     return $::bin
5a80: 61 72 79 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20  ary_directory.. 
5a90: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
5aa0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 69         return [i
5ab0: 6e 66 6f 20 62 69 6e 61 72 79 5d 0d 0a 20 20 20  nfo binary]..   
5ac0: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
5ad0: 20 20 20 20 70 72 6f 63 20 67 65 74 45 78 74 65      proc getExte
5ae0: 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 20 7b 20 66  rnalFileName { f
5af0: 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20  ileName } {..   
5b00: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
5b10: 54 45 3a 20 52 65 74 75 72 6e 73 20 74 68 65 20  TE: Returns the 
5b20: 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 6e  specified file n
5b30: 61 6d 65 20 61 73 20 69 66 20 69 74 20 77 65 72  ame as if it wer
5b40: 65 20 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65  e located in the
5b50: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
5b60: 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69  directory contai
5b70: 6e 69 6e 67 20 74 68 65 20 65 78 74 65 72 6e 61  ning the externa
5b80: 6c 20 62 69 6e 61 72 69 65 73 2e 0d 0a 20 20 20  l binaries...   
5b90: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
5ba0: 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  rn [file nativen
5bb0: 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b  ame [file join [
5bc0: 67 65 74 45 78 74 65 72 6e 61 6c 44 69 72 65 63  getExternalDirec
5bd0: 74 6f 72 79 5d 20 24 66 69 6c 65 4e 61 6d 65 5d  tory] $fileName]
5be0: 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  ]..    }.....   
5bf0: 20 70 72 6f 63 20 67 65 74 42 69 6e 61 72 79 46   proc getBinaryF
5c00: 69 6c 65 4e 61 6d 65 20 7b 20 66 69 6c 65 4e 61  ileName { fileNa
5c10: 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d  me {platform ""}
5c20: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
5c30: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74       # NOTE: Ret
5c40: 75 72 6e 73 20 74 68 65 20 73 70 65 63 69 66 69  urns the specifi
5c50: 65 64 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20  ed file name as 
5c60: 69 66 20 69 74 20 77 65 72 65 20 6c 6f 63 61 74  if it were locat
5c70: 65 64 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20  ed in the..     
5c80: 20 23 20 20 20 20 20 20 20 62 69 6e 61 72 79 20   #       binary 
5c90: 64 69 72 65 63 74 6f 72 79 2c 20 64 69 73 63 61  directory, disca
5ca0: 72 64 69 6e 67 20 61 6e 79 20 64 69 72 65 63 74  rding any direct
5cb0: 6f 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ory information 
5cc0: 70 72 65 73 65 6e 74 0d 0a 20 20 20 20 20 20 23  present..      #
5cd0: 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 66 69         in the fi
5ce0: 6c 65 20 6e 61 6d 65 20 61 73 20 70 72 6f 76 69  le name as provi
5cf0: 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65  ded by our calle
5d00: 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  r...      #..   
5d10: 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20     return [file 
5d20: 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20  nativename \..  
5d30: 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f          [file jo
5d40: 69 6e 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72  in [getBinaryDir
5d50: 65 63 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72  ectory] $platfor
5d60: 6d 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69  m [file tail $fi
5d70: 6c 65 4e 61 6d 65 5d 5d 5d 0d 0a 20 20 20 20 7d  leName]]]..    }
5d80: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
5d90: 74 43 6f 72 65 42 69 6e 61 72 79 46 69 6c 65 4e  tCoreBinaryFileN
5da0: 61 6d 65 20 7b 20 7b 70 6c 61 74 66 6f 72 6d 20  ame { {platform 
5db0: 22 22 7d 20 7b 73 74 61 6e 64 61 72 64 20 66 61  ""} {standard fa
5dc0: 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  lse} } {..      
5dd0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
5de0: 20 52 65 74 75 72 6e 73 20 74 68 65 20 66 75 6c   Returns the ful
5df0: 6c 20 70 61 74 68 20 66 6f 72 20 74 68 65 20 66  l path for the f
5e00: 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ile containing t
5e10: 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 0d 0a  he SQLite core..
5e20: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61        #       na
5e30: 74 69 76 65 20 6c 69 62 72 61 72 79 20 63 6f 64  tive library cod
5e40: 65 20 66 6f 72 20 74 68 69 73 20 70 6c 61 74 66  e for this platf
5e50: 6f 72 6d 2e 20 20 46 69 72 73 74 2c 20 63 68 65  orm.  First, che
5e60: 63 6b 20 61 6e 64 20 73 65 65 20 69 66 0d 0a 20  ck and see if.. 
5e70: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
5e80: 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6e 61 74   SQLite core nat
5e90: 69 76 65 20 6c 69 62 72 61 72 79 20 68 61 73 20  ive library has 
5ea0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6c 6f 61  already been loa
5eb0: 64 65 64 2e 20 20 4e 65 78 74 2c 0d 0a 20 20 20  ded.  Next,..   
5ec0: 20 20 20 23 20 20 20 20 20 20 20 66 61 6c 6c 62     #       fallb
5ed0: 61 63 6b 20 74 6f 20 77 68 61 74 20 74 68 65 20  ack to what the 
5ee0: 66 75 6c 6c 20 70 61 74 68 20 73 68 6f 75 6c 64  full path should
5ef0: 20 62 65 2c 20 62 61 73 65 64 20 6f 6e 20 77 68   be, based on wh
5f00: 65 74 68 65 72 20 74 68 65 0d 0a 20 20 20 20 20  ether the..     
5f10: 20 23 20 20 20 20 20 20 20 6d 69 78 65 64 2d 6d   #       mixed-m
5f20: 6f 64 65 20 61 73 73 65 6d 62 6c 79 20 69 73 20  ode assembly is 
5f30: 62 65 69 6e 67 20 75 73 65 64 20 61 6e 64 20 74  being used and t
5f40: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 63  he name of the c
5f50: 75 72 72 65 6e 74 0d 0a 20 20 20 20 20 20 23 20  urrent..      # 
5f60: 20 20 20 20 20 20 70 6c 61 74 66 6f 72 6d 2e 0d        platform..
5f70: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
5f80: 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
5f90: 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
5fa0: 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
5fb0: 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
5fc0: 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
5fd0: 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61  .SQLite.UnsafeNa
5fe0: 74 69 76 65 4d 65 74 68 6f 64 73 20 5f 53 51 4c  tiveMethods _SQL
5ff0: 69 74 65 4e 61 74 69 76 65 4d 6f 64 75 6c 65 46  iteNativeModuleF
6000: 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d  ileName..      }
6010: 20 66 69 6c 65 4e 61 6d 65 5d 20 3d 3d 20 30 20   fileName] == 0 
6020: 26 26 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  && [string lengt
6030: 68 20 24 66 69 6c 65 4e 61 6d 65 5d 20 3e 20 30  h $fileName] > 0
6040: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
6050: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
6060: 4f 54 45 3a 20 54 68 65 20 53 51 4c 69 74 65 20  OTE: The SQLite 
6070: 63 6f 72 65 20 6e 61 74 69 76 65 20 6c 69 62 72  core native libr
6080: 61 72 79 20 68 61 73 20 61 6c 72 65 61 64 79 20  ary has already 
6090: 62 65 65 6e 20 6c 6f 61 64 65 64 20 76 69 61 0d  been loaded via.
60a0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
60b0: 20 74 68 65 20 6e 61 74 69 76 65 20 6c 69 62 72   the native libr
60c0: 61 72 79 20 70 72 65 2d 6c 6f 61 64 65 72 2e 20  ary pre-loader. 
60d0: 20 52 65 74 75 72 6e 20 74 68 61 74 20 66 69 6c   Return that fil
60e0: 65 20 6e 61 6d 65 20 6e 6f 77 2e 0d 0a 20 20 20  e name now...   
60f0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
6100: 72 65 74 75 72 6e 20 24 66 69 6c 65 4e 61 6d 65  return $fileName
6110: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
6120: 20 20 20 69 66 20 7b 5b 68 61 73 52 75 6e 74 69     if {[hasRunti
6130: 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65 5d  meOption native]
6140: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
6150: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
6160: 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65 20  OTE: Return the 
6170: 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d  mixed-mode assem
6180: 62 6c 79 20 66 69 6c 65 20 6e 61 6d 65 2e 0d 0a  bly file name...
6190: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
61a0: 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20     return [file 
61b0: 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20  nativename \..  
61c0: 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
61d0: 6a 6f 69 6e 20 5b 67 65 74 42 69 6e 61 72 79 44  join [getBinaryD
61e0: 69 72 65 63 74 6f 72 79 5d 20 24 70 6c 61 74 66  irectory] $platf
61f0: 6f 72 6d 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  orm System.Data.
6200: 53 51 4c 69 74 65 2e 64 6c 6c 5d 5d 0d 0a 20 20  SQLite.dll]]..  
6210: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 73      } elseif {$s
6220: 74 61 6e 64 61 72 64 7d 20 74 68 65 6e 20 7b 0d  tandard} then {.
6230: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
6240: 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75      # NOTE: Retu
6250: 72 6e 20 74 68 65 20 6e 61 74 69 76 65 2d 6f 6e  rn the native-on
6260: 6c 79 20 73 74 61 6e 64 61 72 64 20 53 51 4c 69  ly standard SQLi
6270: 74 65 20 6c 69 62 72 61 72 79 20 66 69 6c 65 20  te library file 
6280: 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  name...        #
6290: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
62a0: 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
62b0: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
62c0: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74   [file join [get
62d0: 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d  BinaryDirectory]
62e0: 20 24 70 6c 61 74 66 6f 72 6d 20 73 71 6c 69 74   $platform sqlit
62f0: 65 33 2e 64 6c 6c 5d 5d 0d 0a 20 20 20 20 20 20  e3.dll]]..      
6300: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
6310: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
6320: 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65 20  OTE: Return the 
6330: 6e 61 74 69 76 65 2d 6f 6e 6c 79 20 69 6e 74 65  native-only inte
6340: 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 66 69 6c  rop assembly fil
6350: 65 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20  e name...       
6360: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
6370: 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  rn [file nativen
6380: 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
6390: 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67     [file join [g
63a0: 65 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72  etBinaryDirector
63b0: 79 5d 20 24 70 6c 61 74 66 6f 72 6d 20 53 51 4c  y] $platform SQL
63c0: 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 5d  ite.Interop.dll]
63d0: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
63e0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
63f0: 65 74 43 6f 6d 6d 6f 6e 44 69 72 65 63 74 6f 72  etCommonDirector
6400: 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  y {} {..      #.
6410: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
6420: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65  his procedure re
6430: 74 75 72 6e 73 20 74 68 65 20 64 69 72 65 63 74  turns the direct
6440: 6f 72 79 20 77 68 65 72 65 20 74 68 65 20 74 65  ory where the te
6450: 73 74 20 73 63 72 69 70 74 73 0d 0a 20 20 20 20  st scripts..    
6460: 20 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64    #       should
6470: 20 62 65 20 6c 6f 63 61 74 65 64 2e 20 20 42 79   be located.  By
6480: 20 64 65 66 61 75 6c 74 2c 20 74 68 69 73 20 6a   default, this j
6490: 75 73 74 20 72 65 74 75 72 6e 73 20 74 68 65 20  ust returns the 
64a0: 45 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 20 20  Eagle..      #  
64b0: 20 20 20 20 20 62 69 6e 61 72 79 20 64 69 72 65       binary dire
64c0: 63 74 6f 72 79 2e 0d 0a 20 20 20 20 20 20 23 0d  ctory...      #.
64d0: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
64e0: 20 65 78 69 73 74 73 20 3a 3a 63 6f 6d 6d 6f 6e   exists ::common
64f0: 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c  _directory] && \
6500: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
6510: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 63 6f  ing length $::co
6520: 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20  mmon_directory] 
6530: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
6540: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
6550: 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61  # NOTE: The loca
6560: 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6d 6d  tion of the comm
6570: 6f 6e 20 64 69 72 65 63 74 6f 72 79 20 68 61 73  on directory has
6580: 20 62 65 65 6e 20 73 65 74 3b 0d 0a 20 20 20 20   been set;..    
6590: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 72      #       ther
65a0: 65 66 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a  efore, use it...
65b0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
65c0: 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 63 6f 6d     return $::com
65d0: 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20  mon_directory.. 
65e0: 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b       } elseif {[
65f0: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 76 65  info exists ::ve
6600: 6e 64 6f 72 5f 64 69 72 65 63 74 6f 72 79 5d 20  ndor_directory] 
6610: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
6620: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
6630: 3a 3a 76 65 6e 64 6f 72 5f 64 69 72 65 63 74 6f  ::vendor_directo
6640: 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ry] > 0} then {.
6650: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
6660: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
6670: 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  location of the 
6680: 76 65 6e 64 6f 72 20 64 69 72 65 63 74 6f 72 79  vendor directory
6690: 20 68 61 73 20 62 65 65 6e 20 73 65 74 3b 0d 0a   has been set;..
66a0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
66b0: 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  therefore, use i
66c0: 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
66d0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
66e0: 3a 76 65 6e 64 6f 72 5f 64 69 72 65 63 74 6f 72  :vendor_director
66f0: 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69  y..      } elsei
6700: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
6710: 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79 5d 20 26  ::tcl_library] &
6720: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
6730: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
6740: 3a 74 63 6c 5f 6c 69 62 72 61 72 79 5d 20 3e 20  :tcl_library] > 
6750: 30 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  0 && \..        
6760: 20 20 5b 66 69 6c 65 20 69 73 64 69 72 65 63 74    [file isdirect
6770: 6f 72 79 20 24 3a 3a 74 63 6c 5f 6c 69 62 72 61  ory $::tcl_libra
6780: 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ry]} then {..   
6790: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
67a0: 23 20 4e 4f 54 45 3a 20 54 68 65 20 76 61 72 69  # NOTE: The vari
67b0: 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  able with the lo
67c0: 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 63  cation of the sc
67d0: 72 69 70 74 20 6c 69 62 72 61 72 79 20 69 73 0d  ript library is.
67e0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
67f0: 20 73 65 74 20 61 6e 64 20 61 70 70 65 61 72 73   set and appears
6800: 20 74 6f 20 62 65 20 61 20 72 65 61 6c 20 64 69   to be a real di
6810: 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 20 6e 6f  rectory (i.e. no
6820: 74 20 65 6d 62 65 64 64 65 64 0d 0a 20 20 20 20  t embedded..    
6830: 20 20 20 20 23 20 20 20 20 20 20 20 77 69 74 68      #       with
6840: 69 6e 20 61 20 66 69 6c 65 29 3b 20 74 68 65 72  in a file); ther
6850: 65 66 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a  efore, use it...
6860: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
6870: 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 63 6c     return $::tcl
6880: 5f 6c 69 62 72 61 72 79 0d 0a 20 20 20 20 20 20  _library..      
6890: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
68a0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
68b0: 4f 54 45 3a 20 46 61 6c 6c 62 61 63 6b 20 74 6f  OTE: Fallback to
68c0: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 63   the directory c
68d0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65 78  ontaining the ex
68e0: 65 63 75 74 61 62 6c 65 2e 0d 0a 20 20 20 20 20  ecutable...     
68f0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
6900: 74 75 72 6e 20 5b 69 6e 66 6f 20 62 69 6e 61 72  turn [info binar
6910: 79 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  y]..      }..   
6920: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
6930: 67 65 74 44 61 74 61 62 61 73 65 44 69 72 65 63  getDatabaseDirec
6940: 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  tory {} {..     
6950: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
6960: 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  : This procedure
6970: 20 72 65 74 75 72 6e 73 20 74 68 65 20 64 69 72   returns the dir
6980: 65 63 74 6f 72 79 20 77 68 65 72 65 20 74 68 65  ectory where the
6990: 20 74 65 73 74 20 64 61 74 61 62 61 73 65 73 0d   test databases.
69a0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
69b0: 68 6f 75 6c 64 20 62 65 20 6c 6f 63 61 74 65 64  hould be located
69c0: 2e 20 20 42 79 20 64 65 66 61 75 6c 74 2c 20 74  .  By default, t
69d0: 68 69 73 20 6a 75 73 74 20 75 73 65 73 20 74 68  his just uses th
69e0: 65 20 74 65 6d 70 6f 72 61 72 79 0d 0a 20 20 20  e temporary..   
69f0: 20 20 20 23 20 20 20 20 20 20 20 64 69 72 65 63     #       direc
6a00: 74 6f 72 79 20 63 6f 6e 66 69 67 75 72 65 64 20  tory configured 
6a10: 66 6f 72 20 74 68 69 73 20 73 79 73 74 65 6d 2e  for this system.
6a20: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
6a30: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
6a40: 73 20 3a 3a 64 61 74 61 62 61 73 65 5f 64 69 72  s ::database_dir
6a50: 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20  ectory] && \..  
6a60: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
6a70: 6c 65 6e 67 74 68 20 24 3a 3a 64 61 74 61 62 61  length $::databa
6a80: 73 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20  se_directory] > 
6a90: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
6aa0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
6ab0: 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69  NOTE: The locati
6ac0: 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  on of the databa
6ad0: 73 65 20 64 69 72 65 63 74 6f 72 79 20 68 61 73  se directory has
6ae0: 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e   been overridden
6af0: 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ;..        #    
6b00: 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73     therefore, us
6b10: 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  e it...        #
6b20: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
6b30: 20 24 3a 3a 64 61 74 61 62 61 73 65 5f 64 69 72   $::database_dir
6b40: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20  ectory..      } 
6b50: 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78  elseif {[info ex
6b60: 69 73 74 73 20 3a 3a 73 63 72 61 74 63 68 5f 64  ists ::scratch_d
6b70: 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a  irectory] && \..
6b80: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
6b90: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 73 63 72 61  g length $::scra
6ba0: 74 63 68 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e  tch_directory] >
6bb0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
6bc0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
6bd0: 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74   NOTE: The locat
6be0: 69 6f 6e 20 6f 66 20 74 68 65 20 73 63 72 61 74  ion of the scrat
6bf0: 63 68 20 64 69 72 65 63 74 6f 72 79 20 68 61 73  ch directory has
6c00: 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e   been overridden
6c10: 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ;..        #    
6c20: 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73     therefore, us
6c30: 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  e it...        #
6c40: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
6c50: 20 24 3a 3a 73 63 72 61 74 63 68 5f 64 69 72 65   $::scratch_dire
6c60: 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65  ctory..      } e
6c70: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  lse {..        r
6c80: 65 74 75 72 6e 20 5b 67 65 74 54 65 6d 70 6f 72  eturn [getTempor
6c90: 61 72 79 50 61 74 68 5d 0d 0a 20 20 20 20 20 20  aryPath]..      
6ca0: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
6cb0: 20 70 72 6f 63 20 67 65 74 54 65 6d 70 6f 72 61   proc getTempora
6cc0: 72 79 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b  ryDirectory {} {
6cd0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
6ce0: 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72   # NOTE: This pr
6cf0: 6f 63 65 64 75 72 65 20 72 65 74 75 72 6e 73 20  ocedure returns 
6d00: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 77 68  the directory wh
6d10: 65 72 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72  ere the temporar
6d20: 79 20 66 69 6c 65 73 0d 0a 20 20 20 20 20 20 23  y files..      #
6d30: 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65         should be
6d40: 20 6c 6f 63 61 74 65 64 2e 20 20 42 79 20 64 65   located.  By de
6d50: 66 61 75 6c 74 2c 20 74 68 69 73 20 6a 75 73 74  fault, this just
6d60: 20 75 73 65 73 20 74 68 65 20 74 65 6d 70 6f 72   uses the tempor
6d70: 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ary..      #    
6d80: 20 20 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e     directory con
6d90: 66 69 67 75 72 65 64 20 66 6f 72 20 74 68 69 73  figured for this
6da0: 20 73 79 73 74 65 6d 2e 0d 0a 20 20 20 20 20 20   system...      
6db0: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
6dc0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 6d 70  fo exists ::temp
6dd0: 6f 72 61 72 79 5f 64 69 72 65 63 74 6f 72 79 5d  orary_directory]
6de0: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
6df0: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
6e00: 24 3a 3a 74 65 6d 70 6f 72 61 72 79 5f 64 69 72  $::temporary_dir
6e10: 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65  ectory] > 0} the
6e20: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
6e30: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
6e40: 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  The location of 
6e50: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69  the temporary di
6e60: 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e  rectory has been
6e70: 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20   overridden;..  
6e80: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
6e90: 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 2e  erefore, use it.
6ea0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
6eb0: 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74       return $::t
6ec0: 65 6d 70 6f 72 61 72 79 5f 64 69 72 65 63 74 6f  emporary_directo
6ed0: 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ry..      } else
6ee0: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
6ef0: 20 3a 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63   ::scratch_direc
6f00: 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20  tory] && \..    
6f10: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
6f20: 6e 67 74 68 20 24 3a 3a 73 63 72 61 74 63 68 5f  ngth $::scratch_
6f30: 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20  directory] > 0} 
6f40: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
6f50: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
6f60: 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  E: The location 
6f70: 6f 66 20 74 68 65 20 73 63 72 61 74 63 68 20 64  of the scratch d
6f80: 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
6f90: 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20  n overridden;.. 
6fa0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
6fb0: 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
6fc0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
6fd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
6fe0: 73 63 72 61 74 63 68 5f 64 69 72 65 63 74 6f 72  scratch_director
6ff0: 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  y..      } else 
7000: 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
7010: 6e 20 5b 67 65 74 54 65 6d 70 6f 72 61 72 79 50  n [getTemporaryP
7020: 61 74 68 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  ath]..      }.. 
7030: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
7040: 63 20 67 65 74 54 65 73 74 4f 76 65 72 72 69 64  c getTestOverrid
7050: 65 73 50 72 65 61 6d 62 6c 65 20 7b 20 7b 65 78  esPreamble { {ex
7060: 74 72 61 56 61 72 4e 61 6d 65 73 20 22 22 7d 20  traVarNames ""} 
7070: 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 76  } {..      set v
7080: 61 72 4e 61 6d 65 73 20 5b 6c 69 73 74 5d 0d 0a  arNames [list]..
7090: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
70a0: 20 23 20 4e 4f 54 45 3a 20 49 66 20 61 76 61 69   # NOTE: If avai
70b0: 6c 61 62 6c 65 2c 20 73 74 61 72 74 20 77 69 74  lable, start wit
70c0: 68 20 74 68 65 20 6d 61 73 74 65 72 20 6c 69 73  h the master lis
70d0: 74 20 6f 66 20 74 65 73 74 20 6f 76 65 72 72 69  t of test overri
70e0: 64 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  de..      #     
70f0: 20 20 76 61 72 69 61 62 6c 65 73 2e 0d 0a 20 20    variables...  
7100: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
7110: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
7120: 74 65 73 74 5f 6f 76 65 72 72 69 64 65 73 5d 20  test_overrides] 
7130: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
7140: 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74  [llength $::test
7150: 5f 6f 76 65 72 72 69 64 65 73 5d 20 3e 20 30 7d  _overrides] > 0}
7160: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
7170: 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 76 61   eval lappend va
7180: 72 4e 61 6d 65 73 20 24 3a 3a 74 65 73 74 5f 6f  rNames $::test_o
7190: 76 65 72 72 69 64 65 73 0d 0a 20 20 20 20 20 20  verrides..      
71a0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
71b0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 72      # NOTE: If r
71c0: 65 71 75 65 73 74 65 64 20 62 79 20 6f 75 72 20  equested by our 
71d0: 63 61 6c 6c 65 72 2c 20 61 64 64 20 61 6e 79 20  caller, add any 
71e0: 61 64 64 69 74 69 6f 6e 61 6c 20 76 61 72 69 61  additional varia
71f0: 62 6c 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ble..      #    
7200: 20 20 20 6e 61 6d 65 73 20 74 6f 20 63 6f 70 79     names to copy
7210: 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a   now...      #..
7220: 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67        if {[lleng
7230: 74 68 20 24 65 78 74 72 61 56 61 72 4e 61 6d 65  th $extraVarName
7240: 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  s] > 0} then {..
7250: 20 20 20 20 20 20 20 20 65 76 61 6c 20 6c 61 70          eval lap
7260: 70 65 6e 64 20 76 61 72 4e 61 6d 65 73 20 24 65  pend varNames $e
7270: 78 74 72 61 56 61 72 4e 61 6d 65 73 0d 0a 20 20  xtraVarNames..  
7280: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
7290: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
72a0: 42 75 69 6c 64 20 74 68 65 20 73 63 72 69 70 74  Build the script
72b0: 20 66 72 61 67 6d 65 6e 74 20 74 6f 20 62 65 20   fragment to be 
72c0: 72 65 74 75 72 6e 65 64 20 62 79 20 70 72 6f 63  returned by proc
72d0: 65 73 73 69 6e 67 20 65 61 63 68 0d 0a 20 20 20  essing each..   
72e0: 20 20 20 23 20 20 20 20 20 20 20 76 61 72 69 61     #       varia
72f0: 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 61 64 64  ble name and add
7300: 69 6e 67 20 74 68 65 20 6e 65 63 65 63 65 73 73  ing the nececess
7310: 61 72 79 20 73 63 72 69 70 74 20 66 72 61 67 6d  ary script fragm
7320: 65 6e 74 73 20 66 6f 72 0d 0a 20 20 20 20 20 20  ents for..      
7330: 23 20 20 20 20 20 20 20 65 61 63 68 20 6f 6e 65  #       each one
7340: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
7350: 20 20 73 65 74 20 72 65 73 75 6c 74 20 22 22 0d    set result "".
7360: 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68  ...      foreach
7370: 20 76 61 72 4e 61 6d 65 20 24 76 61 72 4e 61 6d   varName $varNam
7380: 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  es {..        #.
7390: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
73a0: 20 42 75 69 6c 64 20 74 68 65 20 71 75 61 6c 69   Build the quali
73b0: 66 69 65 64 20 67 6c 6f 62 61 6c 20 76 61 72 69  fied global vari
73c0: 61 62 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20 20 20  able name...    
73d0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
73e0: 65 74 20 66 75 6c 6c 56 61 72 4e 61 6d 65 20 5b  et fullVarName [
73f0: 61 70 70 65 6e 64 41 72 67 73 20 3a 3a 20 24 76  appendArgs :: $v
7400: 61 72 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20  arName]....     
7410: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
7420: 4e 4f 54 45 3a 20 44 6f 65 73 20 74 68 65 20 76  NOTE: Does the v
7430: 61 72 69 61 62 6c 65 20 65 78 69 73 74 20 69 6e  ariable exist in
7440: 20 74 68 69 73 20 69 6e 74 65 72 70 72 65 74 65   this interprete
7450: 72 20 63 6f 6e 74 65 78 74 3f 0d 0a 20 20 20 20  r context?..    
7460: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
7470: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
7480: 24 66 75 6c 6c 56 61 72 4e 61 6d 65 5d 7d 20 74  $fullVarName]} t
7490: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
74a0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
74b0: 4e 4f 54 45 3a 20 41 70 70 65 6e 64 20 61 20 73  NOTE: Append a s
74c0: 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20 74  cript fragment t
74d0: 6f 20 74 68 65 20 72 65 73 75 6c 74 20 74 68 61  o the result tha
74e0: 74 20 77 69 6c 6c 20 63 6f 72 72 65 63 74 6c 79  t will correctly
74f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
7500: 20 20 20 20 63 6f 70 79 20 61 6e 79 20 63 6f 6e      copy any con
7510: 74 61 69 6e 65 64 20 76 61 6c 75 65 20 74 6f 20  tained value to 
7520: 61 6e 6f 74 68 65 72 20 69 6e 74 65 72 70 72 65  another interpre
7530: 74 65 72 20 63 6f 6e 74 65 78 74 2e 0d 0a 20 20  ter context...  
7540: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
7550: 20 20 20 20 20 61 70 70 65 6e 64 20 72 65 73 75       append resu
7560: 6c 74 20 5c 6e 20 22 73 65 74 20 22 20 24 66 75  lt \n "set " $fu
7570: 6c 6c 56 61 72 4e 61 6d 65 20 22 20 5c 7b 22 20  llVarName " \{" 
7580: 5b 73 65 74 20 24 66 75 6c 6c 56 61 72 4e 61 6d  [set $fullVarNam
7590: 65 5d 20 5c 7d 0d 0a 20 20 20 20 20 20 20 20 7d  e] \}..        }
75a0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
75b0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
75c0: 54 45 3a 20 49 66 20 74 68 65 20 72 65 73 75 6c  TE: If the resul
75d0: 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f  t contains one o
75e0: 72 20 6d 6f 72 65 20 73 63 72 69 70 74 20 66 72  r more script fr
75f0: 61 67 6d 65 6e 74 73 2c 20 61 70 70 65 6e 64 20  agments, append 
7600: 61 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  a..      #      
7610: 20 6e 65 77 6c 69 6e 65 2e 0d 0a 20 20 20 20 20   newline...     
7620: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   #..      if {[s
7630: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 72 65  tring length $re
7640: 73 75 6c 74 5d 20 3e 20 30 7d 20 74 68 65 6e 20  sult] > 0} then 
7650: 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  {..        appen
7660: 64 20 72 65 73 75 6c 74 20 5c 6e 0d 0a 20 20 20  d result \n..   
7670: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
7680: 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20  turn $result..  
7690: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
76a0: 20 67 65 74 41 70 70 44 6f 6d 61 69 6e 50 72 65   getAppDomainPre
76b0: 61 6d 62 6c 65 20 7b 20 7b 70 72 65 66 69 78 20  amble { {prefix 
76c0: 22 22 7d 20 7b 73 75 66 66 69 78 20 22 22 7d 20  ""} {suffix ""} 
76d0: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
76e0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73      # NOTE: This
76f0: 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72   procedure retur
7700: 6e 73 20 61 20 74 65 73 74 20 73 65 74 75 70 20  ns a test setup 
7710: 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20  script fragment 
7720: 73 75 69 74 61 62 6c 65 20 66 6f 72 0d 0a 20 20  suitable for..  
7730: 20 20 20 20 23 20 20 20 20 20 20 20 65 76 61 6c      #       eval
7740: 75 61 74 69 6f 6e 20 62 79 20 61 6e 20 69 6e 74  uation by an int
7750: 65 72 70 72 65 74 65 72 20 63 72 65 61 74 65 64  erpreter created
7760: 20 69 6e 20 61 6e 20 69 73 6f 6c 61 74 65 64 20   in an isolated 
7770: 61 70 70 6c 69 63 61 74 69 6f 6e 0d 0a 20 20 20  application..   
7780: 20 20 20 23 20 20 20 20 20 20 20 64 6f 6d 61 69     #       domai
7790: 6e 2e 20 20 54 68 65 20 73 63 72 69 70 74 20 66  n.  The script f
77a0: 72 61 67 6d 65 6e 74 20 62 65 69 6e 67 20 72 65  ragment being re
77b0: 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 73  turned will be s
77c0: 75 72 72 6f 75 6e 64 65 64 20 62 79 0d 0a 20 20  urrounded by..  
77d0: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
77e0: 70 72 65 66 69 78 20 61 6e 64 20 73 75 66 66 69  prefix and suffi
77f0: 78 20 22 73 63 72 69 70 74 20 66 72 61 67 6d 65  x "script fragme
7800: 6e 74 73 22 20 73 70 65 63 69 66 69 65 64 20 62  nts" specified b
7810: 79 20 6f 75 72 20 63 61 6c 6c 65 72 2c 0d 0a 20  y our caller,.. 
7820: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 66 20       #       if 
7830: 61 6e 79 2e 20 20 54 68 65 20 65 6e 74 69 72 65  any.  The entire
7840: 20 73 63 72 69 70 74 20 62 65 69 6e 67 20 72 65   script being re
7850: 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 73  turned will be s
7860: 75 62 73 74 69 74 75 74 65 64 20 76 69 61 0d 0a  ubstituted via..
7870: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 5b 73        #       [s
7880: 75 62 73 74 5d 2c 20 69 6e 20 74 68 65 20 63 6f  ubst], in the co
7890: 6e 74 65 78 74 20 6f 66 20 6f 75 72 20 63 61 6c  ntext of our cal
78a0: 6c 65 72 2c 20 62 65 66 6f 72 65 20 62 65 69 6e  ler, before bein
78b0: 67 20 72 65 74 75 72 6e 65 64 2e 0d 0a 20 20 20  g returned...   
78c0: 20 20 20 23 20 20 20 20 20 20 20 54 68 69 73 20     #       This 
78d0: 73 74 65 70 20 69 73 20 6e 65 63 65 73 73 61 72  step is necessar
78e0: 79 20 73 6f 20 74 68 61 74 20 73 6f 6d 65 20 6c  y so that some l
78f0: 69 6d 69 74 65 64 20 63 6f 6e 74 65 78 74 20 69  imited context i
7900: 6e 66 6f 72 6d 61 74 69 6f 6e 2c 0d 0a 20 20 20  nformation,..   
7910: 20 20 20 23 20 20 20 20 20 20 20 70 72 69 6d 61     #       prima
7920: 72 69 6c 79 20 72 65 6c 61 74 65 64 20 74 6f 20  rily related to 
7930: 74 68 65 20 74 65 73 74 69 6e 67 20 64 69 72 65  the testing dire
7940: 63 74 6f 72 69 65 73 2c 20 63 61 6e 20 62 65 20  ctories, can be 
7950: 74 72 61 6e 73 66 65 72 72 65 64 0d 0a 20 20 20  transferred..   
7960: 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 74 68     #       to th
7970: 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 69 6e  e interpreter in
7980: 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20 61 70   the isolated ap
7990: 70 6c 69 63 61 74 69 6f 6e 20 64 6f 6d 61 69 6e  plication domain
79a0: 2c 20 6d 61 6b 69 6e 67 20 69 74 0d 0a 20 20 20  , making it..   
79b0: 20 20 20 23 20 20 20 20 20 20 20 61 62 6c 65 20     #       able 
79c0: 74 6f 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  to successfully 
79d0: 72 75 6e 20 74 65 73 74 73 20 74 68 61 74 20 72  run tests that r
79e0: 65 71 75 69 72 65 20 6f 6e 65 20 6f 72 20 6d 6f  equire one or mo
79f0: 72 65 20 6f 66 20 74 68 65 0d 0a 20 20 20 20 20  re of the..     
7a00: 20 23 20 20 20 20 20 20 20 66 69 6c 65 73 20 69   #       files i
7a10: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 65 73  n one of the tes
7a20: 74 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65 73  ting directories
7a30: 2e 20 20 43 61 6c 6c 65 72 73 20 73 68 6f 75 6c  .  Callers shoul
7a40: 64 20 6b 65 65 70 20 69 6e 0d 0a 20 20 20 20 20  d keep in..     
7a50: 20 23 20 20 20 20 20 20 20 6d 69 6e 64 20 74 68   #       mind th
7a60: 61 74 20 74 68 65 20 74 65 73 74 20 73 63 72 69  at the test scri
7a70: 70 74 20 66 72 61 67 6d 65 6e 74 20 62 65 69 6e  pt fragment bein
7a80: 67 20 72 65 74 75 72 6e 65 64 20 63 61 6e 6e 6f  g returned canno
7a90: 74 20 72 65 6c 79 20 6f 6e 0d 0a 20 20 20 20 20  t rely on..     
7aa0: 20 23 20 20 20 20 20 20 20 61 6e 79 20 73 63 72   #       any scr
7ab0: 69 70 74 20 6c 69 62 72 61 72 79 20 70 72 6f 63  ipt library proc
7ac0: 65 64 75 72 65 73 20 74 68 61 74 20 61 72 65 20  edures that are 
7ad0: 6e 6f 74 20 70 72 6f 76 69 64 65 64 20 62 79 20  not provided by 
7ae0: 74 68 65 20 45 61 67 6c 65 0d 0a 20 20 20 20 20  the Eagle..     
7af0: 20 23 20 20 20 20 20 20 20 6c 69 62 72 61 72 79   #       library
7b00: 20 70 61 63 6b 61 67 65 20 28 69 2e 65 2e 20 22   package (i.e. "
7b10: 69 6e 69 74 2e 65 61 67 6c 65 22 29 2c 20 69 6e  init.eagle"), in
7b20: 63 6c 75 64 69 6e 67 20 74 68 6f 73 65 20 70 72  cluding those pr
7b30: 6f 76 69 64 65 64 20 62 79 0d 0a 20 20 20 20 20  ovided by..     
7b40: 20 23 20 20 20 20 20 20 20 74 68 65 20 45 61 67   #       the Eag
7b50: 6c 65 20 74 65 73 74 20 70 61 63 6b 61 67 65 2c  le test package,
7b60: 20 75 6e 6c 65 73 73 20 74 68 65 20 66 69 6c 65   unless the file
7b70: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 6d   containing them
7b80: 20 69 73 20 6c 6f 61 64 65 64 0d 0a 20 20 20 20   is loaded..    
7b90: 20 20 23 20 20 20 20 20 20 20 6d 61 6e 75 61 6c    #       manual
7ba0: 6c 79 20 76 69 61 20 73 6f 6d 65 20 6f 74 68 65  ly via some othe
7bb0: 72 20 6d 65 63 68 61 6e 69 73 6d 20 28 65 2e 67  r mechanism (e.g
7bc0: 2e 20 62 79 20 69 6e 63 6c 75 64 69 6e 67 20 61  . by including a
7bd0: 70 70 72 6f 70 72 69 61 74 65 0d 0a 20 20 20 20  ppropriate..    
7be0: 20 20 23 20 20 20 20 20 20 20 5b 70 61 63 6b 61    #       [packa
7bf0: 67 65 20 72 65 71 75 69 72 65 5d 20 6f 72 20 5b  ge require] or [
7c00: 73 6f 75 72 63 65 5d 20 63 6f 6d 6d 61 6e 64 73  source] commands
7c10: 20 69 6e 20 74 68 65 20 70 72 65 66 69 78 20 6f   in the prefix o
7c20: 72 20 73 75 66 66 69 78 0d 0a 20 20 20 20 20 20  r suffix..      
7c30: 23 20 20 20 20 20 20 20 73 63 72 69 70 74 20 66  #       script f
7c40: 72 61 67 6d 65 6e 74 73 29 2e 20 20 41 6c 73 6f  ragments).  Also
7c50: 2c 20 61 6c 6c 20 76 61 72 69 61 62 6c 65 20 72  , all variable r
7c60: 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 61 6c  eferences and al
7c70: 6c 20 6e 65 73 74 65 64 0d 0a 20 20 20 20 20 20  l nested..      
7c80: 23 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64 73  #       commands
7c90: 20 28 69 2e 65 2e 20 74 68 6f 73 65 20 69 6e 20   (i.e. those in 
7ca0: 73 71 75 61 72 65 20 62 72 61 63 6b 65 74 73 29  square brackets)
7cb0: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
7cc0: 65 20 66 69 6e 61 6c 0d 0a 20 20 20 20 20 20 23  e final..      #
7cd0: 20 20 20 20 20 20 20 73 63 72 69 70 74 20 66 72         script fr
7ce0: 61 67 6d 65 6e 74 20 77 69 6c 6c 20 65 6e 64 20  agment will end 
7cf0: 75 70 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74  up being evaluat
7d00: 65 64 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78  ed in the contex
7d10: 74 20 6f 66 20 74 68 65 0d 0a 20 20 20 20 20 20  t of the..      
7d20: 23 20 20 20 20 20 20 20 63 61 6c 6c 69 6e 67 20  #       calling 
7d30: 69 6e 74 65 72 70 72 65 74 65 72 20 61 6e 64 20  interpreter and 
7d40: 6e 6f 74 20 74 68 65 20 74 61 72 67 65 74 20 69  not the target i
7d50: 6e 74 65 72 70 72 65 74 65 72 20 63 72 65 61 74  nterpreter creat
7d60: 65 64 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20  ed in the..     
7d70: 20 23 20 20 20 20 20 20 20 69 73 6f 6c 61 74 65   #       isolate
7d80: 64 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 6f  d application do
7d90: 6d 61 69 6e 20 75 6e 6c 65 73 73 20 74 68 65 20  main unless the 
7da0: 64 6f 6c 6c 61 72 20 73 69 67 6e 73 20 61 6e 64  dollar signs and
7db0: 2f 6f 72 20 73 71 75 61 72 65 0d 0a 20 20 20 20  /or square..    
7dc0: 20 20 23 20 20 20 20 20 20 20 62 72 61 63 6b 65    #       bracke
7dd0: 74 73 20 61 72 65 20 73 70 65 63 69 61 6c 6c 79  ts are specially
7de0: 20 71 75 6f 74 65 64 20 77 69 74 68 20 62 61 63   quoted with bac
7df0: 6b 73 6c 61 73 68 65 73 2e 0d 0a 20 20 20 20 20  kslashes...     
7e00: 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   #..      return
7e10: 20 5b 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73   [uplevel 1 [lis
7e20: 74 20 73 75 62 73 74 20 5b 61 70 70 65 6e 64 41  t subst [appendA
7e30: 72 67 73 20 24 70 72 65 66 69 78 20 7b 0d 0a 20  rgs $prefix {.. 
7e40: 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61 73 52         if {[hasR
7e50: 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74  untimeOption nat
7e60: 69 76 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ive]} then {..  
7e70: 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
7e80: 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72 65 74 65  nvoke Interprete
7e90: 72 2e 47 65 74 41 63 74 69 76 65 20 41 64 64 52  r.GetActive AddR
7ea0: 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74  untimeOption nat
7eb0: 69 76 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ive..        }..
7ec0: 20 20 20 20 20 20 7d 20 5b 67 65 74 54 65 73 74        } [getTest
7ed0: 4f 76 65 72 72 69 64 65 73 50 72 65 61 6d 62 6c  OverridesPreambl
7ee0: 65 20 5b 6c 69 73 74 20 70 61 74 68 20 74 65 73  e [list path tes
7ef0: 74 5f 63 68 61 6e 6e 65 6c 5d 5d 20 24 73 75 66  t_channel]] $suf
7f00: 66 69 78 5d 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c  fix]]]..    }...
7f10: 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79 43 6f  ..    proc tryCo
7f20: 70 79 45 78 74 65 72 6e 61 6c 46 69 6c 65 20 7b  pyExternalFile {
7f30: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 69  ..            fi
7f40: 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d  leName {platform
7f50: 20 22 22 7d 20 7b 6e 65 77 46 69 6c 65 4e 61 6d   ""} {newFileNam
7f60: 65 20 22 22 7d 20 7b 76 65 72 62 6f 73 65 20 66  e ""} {verbose f
7f70: 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  alse} } {..     
7f80: 20 73 65 74 20 73 6f 75 72 63 65 46 69 6c 65 4e   set sourceFileN
7f90: 61 6d 65 20 5b 67 65 74 45 78 74 65 72 6e 61 6c  ame [getExternal
7fa0: 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61  FileName $fileNa
7fb0: 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  me]....      if 
7fc0: 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24  {![file exists $
7fd0: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 5d 7d  sourceFileName]}
7fe0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
7ff0: 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74   if {$verbose} t
8000: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
8010: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
8020: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
8030: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
8040: 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65      "---- skippe
8050: 64 20 63 6f 70 79 69 6e 67 20 65 78 74 65 72 6e  d copying extern
8060: 61 6c 20 66 69 6c 65 20 5c 22 22 20 24 73 6f 75  al file \"" $sou
8070: 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  rceFileName \.. 
8080: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22               "\"
8090: 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78  , it does not ex
80a0: 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  ist\n"]..       
80b0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   }..        retu
80c0: 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  rn..      }.... 
80d0: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
80e0: 20 6c 65 6e 67 74 68 20 24 6e 65 77 46 69 6c 65   length $newFile
80f0: 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  Name] > 0} then 
8100: 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74  {..        set t
8110: 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67  argetFileName [g
8120: 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  etBinaryFileName
8130: 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65 20 24 70   $newFileName $p
8140: 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20 20  latform]..      
8150: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
8160: 20 20 73 65 74 20 74 61 72 67 65 74 46 69 6c 65    set targetFile
8170: 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46  Name [getBinaryF
8180: 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d  ileName $fileNam
8190: 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20  e $platform]..  
81a0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73      }....      s
81b0: 65 74 20 74 61 72 67 65 74 44 69 72 65 63 74 6f  et targetDirecto
81c0: 72 79 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65  ry [file dirname
81d0: 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65   $targetFileName
81e0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  ]....      if {[
81f0: 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
8200: 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73   if {![file exis
8210: 74 73 20 24 74 61 72 67 65 74 44 69 72 65 63 74  ts $targetDirect
8220: 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ory]} then {..  
8230: 20 20 20 20 20 20 20 20 66 69 6c 65 20 6d 6b 64          file mkd
8240: 69 72 20 24 74 61 72 67 65 74 44 69 72 65 63 74  ir $targetDirect
8250: 6f 72 79 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ory..        }..
8260: 20 20 20 20 20 20 20 20 66 69 6c 65 20 63 6f 70          file cop
8270: 79 20 2d 66 6f 72 63 65 20 24 73 6f 75 72 63 65  y -force $source
8280: 46 69 6c 65 4e 61 6d 65 20 24 74 61 72 67 65 74  FileName $target
8290: 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20  FileName..      
82a0: 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  }] == 0} then {.
82b0: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
82c0: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
82d0: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
82e0: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
82f0: 63 6f 70 69 65 64 20 65 78 74 65 72 6e 61 6c 20  copied external 
8300: 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73  file from \"" $s
8310: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 22 5c  ourceFileName "\
8320: 22 20 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20  " to \"" \..    
8330: 20 20 20 20 20 20 20 20 24 74 61 72 67 65 74 46          $targetF
8340: 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20  ileName \"\n].. 
8350: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
8360: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
8370: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
8380: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
8390: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61          "---- fa
83a0: 69 6c 65 64 20 74 6f 20 63 6f 70 79 20 65 78 74  iled to copy ext
83b0: 65 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20  ernal file from 
83c0: 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e  \"" $sourceFileN
83d0: 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
83e0: 20 20 20 22 5c 22 20 74 6f 20 5c 22 22 20 24 74     "\" to \"" $t
83f0: 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22  argetFileName \"
8400: 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  \n]..      }..  
8410: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
8420: 20 74 72 79 43 6f 70 79 42 69 6e 61 72 79 46 69   tryCopyBinaryFi
8430: 6c 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  le {..          
8440: 20 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74    fileName {plat
8450: 66 6f 72 6d 20 22 22 7d 20 7b 6e 65 77 46 69 6c  form ""} {newFil
8460: 65 4e 61 6d 65 20 22 22 7d 20 7b 76 65 72 62 6f  eName ""} {verbo
8470: 73 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  se false} } {.. 
8480: 20 20 20 20 20 73 65 74 20 73 6f 75 72 63 65 46       set sourceF
8490: 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61  ileName [getBina
84a0: 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  ryFileName $file
84b0: 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d  Name $platform].
84c0: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 66  ...      if {![f
84d0: 69 6c 65 20 65 78 69 73 74 73 20 24 73 6f 75 72  ile exists $sour
84e0: 63 65 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65  ceFileName]} the
84f0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
8500: 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20  {$verbose} then 
8510: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
8520: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
8530: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
8540: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
8550: 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 63 6f  "---- skipped co
8560: 70 79 69 6e 67 20 62 69 6e 61 72 79 20 66 69 6c  pying binary fil
8570: 65 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c  e \"" $sourceFil
8580: 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  eName \..       
8590: 20 20 20 20 20 20 20 22 5c 22 2c 20 69 74 20 64         "\", it d
85a0: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22  oes not exist\n"
85b0: 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
85c0: 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20        return..  
85d0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69      }....      i
85e0: 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
85f0: 68 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65 5d 20  h $newFileName] 
8600: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
8610: 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74 46       set targetF
8620: 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c  ileName [getBuil
8630: 64 46 69 6c 65 4e 61 6d 65 20 24 6e 65 77 46 69  dFileName $newFi
8640: 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d  leName $platform
8650: 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
8660: 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74  {..        set t
8670: 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67  argetFileName [g
8680: 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20  etBuildFileName 
8690: 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66  $fileName $platf
86a0: 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  orm]..      }...
86b0: 0a 20 20 20 20 20 20 73 65 74 20 74 61 72 67 65  .      set targe
86c0: 74 44 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65  tDirectory [file
86d0: 20 64 69 72 6e 61 6d 65 20 24 74 61 72 67 65 74   dirname $target
86e0: 46 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20  FileName]....   
86f0: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
8700: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 66  .        if {![f
8710: 69 6c 65 20 65 78 69 73 74 73 20 24 74 61 72 67  ile exists $targ
8720: 65 74 44 69 72 65 63 74 6f 72 79 5d 7d 20 74 68  etDirectory]} th
8730: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
8740: 66 69 6c 65 20 6d 6b 64 69 72 20 24 74 61 72 67  file mkdir $targ
8750: 65 74 44 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  etDirectory..   
8760: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
8770: 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63 65  file copy -force
8780: 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65   $sourceFileName
8790: 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65   $targetFileName
87a0: 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d  ..      }] == 0}
87b0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
87c0: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
87d0: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
87e0: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
87f0: 20 20 22 2d 2d 2d 2d 20 63 6f 70 69 65 64 20 62    "---- copied b
8800: 69 6e 61 72 79 20 66 69 6c 65 20 66 72 6f 6d 20  inary file from 
8810: 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e  \"" $sourceFileN
8820: 61 6d 65 20 22 5c 22 20 74 6f 20 5c 22 22 20 5c  ame "\" to \"" \
8830: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 74  ..            $t
8840: 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22  argetFileName \"
8850: 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  \n]..      } els
8860: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e {..        tpu
8870: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
8880: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
8890: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
88a0: 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20 63 6f  --- failed to co
88b0: 70 79 20 62 69 6e 61 72 79 20 66 69 6c 65 20 66  py binary file f
88c0: 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63 65 46  rom \"" $sourceF
88d0: 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20  ileName \..     
88e0: 20 20 20 20 20 20 20 22 5c 22 20 74 6f 20 5c 22         "\" to \"
88f0: 22 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d  " $targetFileNam
8900: 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d  e \"\n]..      }
8910: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
8920: 70 72 6f 63 20 74 72 79 43 6f 70 79 42 75 69 6c  proc tryCopyBuil
8930: 64 46 69 6c 65 20 7b 0d 0a 20 20 20 20 20 20 20  dFile {..       
8940: 20 20 20 20 20 66 69 6c 65 4e 61 6d 65 20 7b 70       fileName {p
8950: 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 6e 65 77  latform ""} {new
8960: 46 69 6c 65 4e 61 6d 65 20 22 22 7d 20 7b 76 65  FileName ""} {ve
8970: 72 62 6f 73 65 20 66 61 6c 73 65 7d 20 7d 20 7b  rbose false} } {
8980: 0d 0a 20 20 20 20 20 20 73 65 74 20 73 6f 75 72  ..      set sour
8990: 63 65 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42  ceFileName [getB
89a0: 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 24 66 69  uildFileName $fi
89b0: 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d  leName $platform
89c0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21  ]....      if {!
89d0: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 73 6f  [file exists $so
89e0: 75 72 63 65 46 69 6c 65 4e 61 6d 65 5d 7d 20 74  urceFileName]} t
89f0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
8a00: 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65  f {$verbose} the
8a10: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
8a20: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
8a30: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
8a40: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
8a50: 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20    "---- skipped 
8a60: 63 6f 70 79 69 6e 67 20 62 75 69 6c 64 20 66 69  copying build fi
8a70: 6c 65 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69  le \"" $sourceFi
8a80: 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  leName \..      
8a90: 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69 74 20          "\", it 
8aa0: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e  does not exist\n
8ab0: 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  "]..        }.. 
8ac0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20         return.. 
8ad0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
8ae0: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
8af0: 74 68 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65 5d  th $newFileName]
8b00: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
8b10: 20 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74        set target
8b20: 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e  FileName [getBin
8b30: 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 6e 65 77  aryFileName $new
8b40: 46 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f  FileName $platfo
8b50: 72 6d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  rm]..      } els
8b60: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  e {..        set
8b70: 20 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20   targetFileName 
8b80: 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61  [getBinaryFileNa
8b90: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c  me $fileName $pl
8ba0: 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 7d  atform]..      }
8bb0: 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 74 61  ....      set ta
8bc0: 72 67 65 74 44 69 72 65 63 74 6f 72 79 20 5b 66  rgetDirectory [f
8bd0: 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 74 61 72  ile dirname $tar
8be0: 67 65 74 46 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a  getFileName]....
8bf0: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
8c00: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
8c10: 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 74  ![file exists $t
8c20: 61 72 67 65 74 44 69 72 65 63 74 6f 72 79 5d 7d  argetDirectory]}
8c30: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
8c40: 20 20 20 66 69 6c 65 20 6d 6b 64 69 72 20 24 74     file mkdir $t
8c50: 61 72 67 65 74 44 69 72 65 63 74 6f 72 79 0d 0a  argetDirectory..
8c60: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
8c70: 20 20 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f     file copy -fo
8c80: 72 63 65 20 24 73 6f 75 72 63 65 46 69 6c 65 4e  rce $sourceFileN
8c90: 61 6d 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e  ame $targetFileN
8ca0: 61 6d 65 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d  ame..      }] ==
8cb0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
8cc0: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
8cd0: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
8ce0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
8cf0: 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 69 65       "---- copie
8d00: 64 20 62 75 69 6c 64 20 66 69 6c 65 20 66 72 6f  d build file fro
8d10: 6d 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c  m \"" $sourceFil
8d20: 65 4e 61 6d 65 20 22 5c 22 20 74 6f 20 5c 22 22  eName "\" to \""
8d30: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
8d40: 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20  $targetFileName 
8d50: 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65  \"\n]..      } e
8d60: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
8d70: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
8d80: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
8d90: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
8da0: 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20  "---- failed to 
8db0: 63 6f 70 79 20 62 75 69 6c 64 20 66 69 6c 65 20  copy build file 
8dc0: 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63 65  from \"" $source
8dd0: 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20  FileName \..    
8de0: 20 20 20 20 20 20 20 20 22 5c 22 20 74 6f 20 5c          "\" to \
8df0: 22 22 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61  "" $targetFileNa
8e00: 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  me \"\n]..      
8e10: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
8e20: 20 70 72 6f 63 20 74 72 79 44 65 6c 65 74 65 42   proc tryDeleteB
8e30: 69 6e 61 72 79 46 69 6c 65 20 7b 20 66 69 6c 65  inaryFile { file
8e40: 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22  Name {platform "
8e50: 22 7d 20 7b 76 65 72 62 6f 73 65 20 66 61 6c 73  "} {verbose fals
8e60: 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  e} } {..      se
8e70: 74 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42  t fileName [getB
8e80: 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66  inaryFileName $f
8e90: 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72  ileName $platfor
8ea0: 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  m]....      if {
8eb0: 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66  ![file exists $f
8ec0: 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
8ed0: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 76  ..        if {$v
8ee0: 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a  erbose} then {..
8ef0: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
8f00: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
8f10: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
8f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
8f30: 2d 2d 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74  -- skipped delet
8f40: 69 6e 67 20 62 69 6e 61 72 79 20 66 69 6c 65 20  ing binary file 
8f50: 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d  \"" $fileName \.
8f60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
8f70: 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  \", it does not 
8f80: 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20  exist\n"]..     
8f90: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 72 65     }..        re
8fa0: 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  turn..      }...
8fb0: 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63  .      if {[catc
8fc0: 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24  h {file delete $
8fd0: 66 69 6c 65 4e 61 6d 65 7d 5d 20 3d 3d 20 30 7d  fileName}] == 0}
8fe0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
8ff0: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
9000: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
9010: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
9020: 20 20 22 2d 2d 2d 2d 20 64 65 6c 65 74 65 64 20    "---- deleted 
9030: 62 69 6e 61 72 79 20 66 69 6c 65 20 5c 22 22 20  binary file \"" 
9040: 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d  $fileName \"\n].
9050: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
9060: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
9070: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
9080: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
9090: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
90a0: 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65  failed to delete
90b0: 20 62 69 6e 61 72 79 20 66 69 6c 65 20 5c 22 22   binary file \""
90c0: 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d   $fileName \"\n]
90d0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
90e0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72  .....    proc tr
90f0: 79 44 65 6c 65 74 65 42 75 69 6c 64 46 69 6c 65  yDeleteBuildFile
9100: 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61   { fileName {pla
9110: 74 66 6f 72 6d 20 22 22 7d 20 7b 76 65 72 62 6f  tform ""} {verbo
9120: 73 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  se false} } {.. 
9130: 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d       set fileNam
9140: 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e  e [getBuildFileN
9150: 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70  ame $fileName $p
9160: 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20  latform]....    
9170: 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69    if {![file exi
9180: 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20  sts $fileName]} 
9190: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
91a0: 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68  if {$verbose} th
91b0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
91c0: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
91d0: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
91e0: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
91f0: 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64     "---- skipped
9200: 20 64 65 6c 65 74 69 6e 67 20 62 75 69 6c 64 20   deleting build 
9210: 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61  file \"" $fileNa
9220: 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
9230: 20 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73      "\", it does
9240: 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a   not exist\n"]..
9250: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
9260: 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20     return..     
9270: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   }....      if {
9280: 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c  [catch {file del
9290: 65 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d 5d 20  ete $fileName}] 
92a0: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
92b0: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
92c0: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
92d0: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
92e0: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 64 65 6c         "---- del
92f0: 65 74 65 64 20 62 75 69 6c 64 20 66 69 6c 65 20  eted build file 
9300: 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22  \"" $fileName \"
9310: 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  \n]..      } els
9320: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e {..        tpu
9330: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
9340: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
9350: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
9360: 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20 64 65  --- failed to de
9370: 6c 65 74 65 20 62 75 69 6c 64 20 66 69 6c 65 20  lete build file 
9380: 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22  \"" $fileName \"
9390: 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  \n]..      }..  
93a0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
93b0: 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79   tryCopyAssembly
93c0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
93d0: 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f  fileName {platfo
93e0: 72 6d 20 22 22 7d 20 7b 70 64 62 20 74 72 75 65  rm ""} {pdb true
93f0: 7d 20 7b 76 65 72 62 6f 73 65 20 66 61 6c 73 65  } {verbose false
9400: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 72 79  } } {..      try
9410: 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20 24 66  CopyBuildFile $f
9420: 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72  ileName $platfor
9430: 6d 20 22 22 20 24 76 65 72 62 6f 73 65 0d 0a 0d  m "" $verbose...
9440: 0a 20 20 20 20 20 20 69 66 20 7b 24 70 64 62 7d  .      if {$pdb}
9450: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
9460: 20 74 72 79 43 6f 70 79 42 75 69 6c 64 46 69 6c   tryCopyBuildFil
9470: 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  e [appendArgs \.
9480: 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69  .            [fi
9490: 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 24 66 69 6c  le rootname $fil
94a0: 65 4e 61 6d 65 5d 20 2e 70 64 62 5d 20 24 70 6c  eName] .pdb] $pl
94b0: 61 74 66 6f 72 6d 20 22 22 20 24 76 65 72 62 6f  atform "" $verbo
94c0: 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  se..      }..   
94d0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
94e0: 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c  tryDeleteAssembl
94f0: 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  y {..           
9500: 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66   fileName {platf
9510: 6f 72 6d 20 22 22 7d 20 7b 70 64 62 20 74 72 75  orm ""} {pdb tru
9520: 65 7d 20 7b 76 65 72 62 6f 73 65 20 66 61 6c 73  e} {verbose fals
9530: 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 72  e} } {..      tr
9540: 79 44 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c  yDeleteBinaryFil
9550: 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61  e $fileName $pla
9560: 74 66 6f 72 6d 20 24 76 65 72 62 6f 73 65 0d 0a  tform $verbose..
9570: 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 70 64 62  ..      if {$pdb
9580: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
9590: 20 20 74 72 79 44 65 6c 65 74 65 42 69 6e 61 72    tryDeleteBinar
95a0: 79 46 69 6c 65 20 5b 61 70 70 65 6e 64 41 72 67  yFile [appendArg
95b0: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
95c0: 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20   [file rootname 
95d0: 24 66 69 6c 65 4e 61 6d 65 5d 20 2e 70 64 62 5d  $fileName] .pdb]
95e0: 20 24 70 6c 61 74 66 6f 72 6d 20 24 76 65 72 62   $platform $verb
95f0: 6f 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  ose..      }..  
9600: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
9610: 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79   tryLoadAssembly
9620: 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61   { fileName {pla
9630: 74 66 6f 72 6d 20 22 22 7d 20 7d 20 7b 0d 0a 20  tform ""} } {.. 
9640: 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d       set fileNam
9650: 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65  e [getBinaryFile
9660: 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24  Name $fileName $
9670: 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20  platform]....   
9680: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
9690: 0a 20 20 20 20 20 20 20 20 73 65 74 20 61 73 73  .        set ass
96a0: 65 6d 62 6c 79 20 5b 6f 62 6a 65 63 74 20 6c 6f  embly [object lo
96b0: 61 64 20 2d 6c 6f 61 64 74 79 70 65 20 46 69 6c  ad -loadtype Fil
96c0: 65 20 2d 61 6c 69 61 73 20 24 66 69 6c 65 4e 61  e -alias $fileNa
96d0: 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d  me]..      }] ==
96e0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
96f0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
9700: 20 4e 4f 54 45 3a 20 4e 6f 77 2c 20 61 64 64 20   NOTE: Now, add 
9710: 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 74 65  the necessary te
9720: 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0d 0a  st constraint...
9730: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
9740: 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
9750: 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20   [file rootname 
9760: 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65  [file tail $file
9770: 4e 61 6d 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  Name]]....      
9780: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
9790: 4f 54 45 3a 20 47 72 61 62 20 74 68 65 20 69 6d  OTE: Grab the im
97a0: 61 67 65 20 72 75 6e 74 69 6d 65 20 76 65 72 73  age runtime vers
97b0: 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 61 73 73  ion from the ass
97c0: 65 6d 62 6c 79 20 62 65 63 61 75 73 65 0d 0a 20  embly because.. 
97d0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73         #       s
97e0: 65 76 65 72 61 6c 20 74 65 73 74 73 20 72 65 6c  everal tests rel
97f0: 79 20 6f 6e 20 69 74 20 68 61 76 69 6e 67 20 61  y on it having a
9800: 20 63 65 72 74 61 69 6e 20 76 61 6c 75 65 2e 0d   certain value..
9810: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
9820: 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
9830: 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 66  t [appendArgs [f
9840: 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61  ile tail $fileNa
9850: 6d 65 5d 20 5f 20 5c 0d 0a 20 20 20 20 20 20 20  me] _ \..       
9860: 20 20 20 20 20 5b 24 61 73 73 65 6d 62 6c 79 20       [$assembly 
9870: 49 6d 61 67 65 52 75 6e 74 69 6d 65 56 65 72 73  ImageRuntimeVers
9880: 69 6f 6e 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  ion]]....       
9890: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
98a0: 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65 20 66  TE: Return the f
98b0: 75 6c 6c 20 70 61 74 68 20 6f 66 20 74 68 65 20  ull path of the 
98c0: 6c 6f 61 64 65 64 20 66 69 6c 65 2e 0d 0a 20 20  loaded file...  
98d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
98e0: 20 72 65 74 75 72 6e 20 24 66 69 6c 65 4e 61 6d   return $fileNam
98f0: 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  e..      }....  
9900: 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20      return "".. 
9910: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
9920: 63 20 69 73 53 51 4c 69 74 65 52 65 61 64 79 20  c isSQLiteReady 
9930: 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
9940: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69       # NOTE: Thi
9950: 73 20 70 72 6f 63 65 64 75 72 65 20 6d 75 73 74  s procedure must
9960: 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   return non-zero
9970: 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 53 51 4c   only if the SQL
9980: 69 74 65 20 6e 61 74 69 76 65 0d 0a 20 20 20 20  ite native..    
9990: 20 20 23 20 20 20 20 20 20 20 6c 69 62 72 61 72    #       librar
99a0: 79 20 61 6e 64 20 74 68 65 20 53 79 73 74 65 6d  y and the System
99b0: 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 6d 61 6e  .Data.SQLite man
99c0: 61 67 65 64 20 61 73 73 65 6d 62 6c 79 20 61 72  aged assembly ar
99d0: 65 20 6c 6f 61 64 65 64 0d 0a 20 20 20 20 20 20  e loaded..      
99e0: 23 20 20 20 20 20 20 20 61 6e 64 20 72 65 61 64  #       and read
99f0: 79 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65  y for use by the
9a00: 20 74 65 73 74 20 73 75 69 74 65 2e 20 20 43 75   test suite.  Cu
9a10: 72 72 65 6e 74 6c 79 2c 20 74 68 69 73 20 70 72  rrently, this pr
9a20: 6f 63 65 64 75 72 65 0d 0a 20 20 20 20 20 20 23  ocedure..      #
9a30: 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65         should be
9a40: 20 63 61 6c 6c 65 64 20 6f 6e 6c 79 20 61 66 74   called only aft
9a50: 65 72 20 74 68 65 20 5b 74 72 79 4c 6f 61 64 41  er the [tryLoadA
9a60: 73 73 65 6d 62 6c 79 5d 20 70 72 6f 63 65 64 75  ssembly] procedu
9a70: 72 65 20 68 61 73 0d 0a 20 20 20 20 20 20 23 20  re has..      # 
9a80: 20 20 20 20 20 20 62 65 65 6e 20 63 61 6c 6c 65        been calle
9a90: 64 20 74 6f 20 70 72 6f 62 65 20 66 6f 72 20 74  d to probe for t
9aa0: 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  he System.Data.S
9ab0: 51 4c 69 74 65 20 6d 61 6e 61 67 65 64 20 61 73  QLite managed as
9ac0: 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 23 20  sembly..      # 
9ad0: 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 5b 63        and the [c
9ae0: 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 5d 20 70  heckForSQLite] p
9af0: 72 6f 63 65 64 75 72 65 20 68 61 73 20 62 65 65  rocedure has bee
9b00: 6e 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 62  n called to prob
9b10: 65 20 66 6f 72 0d 0a 20 20 20 20 20 20 23 20 20  e for..      #  
9b20: 20 20 20 20 20 74 68 65 20 53 51 4c 69 74 65 20       the SQLite 
9b30: 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79 3b 20  native library; 
9b40: 6f 74 68 65 72 77 69 73 65 2c 20 74 68 69 73 20  otherwise, this 
9b50: 70 72 6f 63 65 64 75 72 65 20 77 69 6c 6c 20 73  procedure will s
9b60: 69 6d 70 6c 79 0d 0a 20 20 20 20 20 20 23 20 20  imply..      #  
9b70: 20 20 20 20 20 61 6c 77 61 79 73 20 72 65 74 75       always retu
9b80: 72 6e 20 7a 65 72 6f 2e 0d 0a 20 20 20 20 20 20  rn zero...      
9b90: 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  #..      return 
9ba0: 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20 20 20 20  [expr {..       
9bb0: 20 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74   [haveConstraint
9bc0: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
9bd0: 69 74 65 5d 20 26 26 20 5b 68 61 76 65 43 6f 6e  ite] && [haveCon
9be0: 73 74 72 61 69 6e 74 20 53 51 4c 69 74 65 5d 0d  straint SQLite].
9bf0: 0a 20 20 20 20 20 20 7d 5d 0d 0a 20 20 20 20 7d  .      }]..    }
9c00: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 6d 61  .....    proc ma
9c10: 74 63 68 4d 61 63 68 69 6e 65 20 7b 20 70 6c 61  tchMachine { pla
9c20: 74 66 6f 72 6d 20 7d 20 7b 0d 0a 20 20 20 20 20  tform } {..     
9c30: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
9c40: 3a 20 41 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  : An empty strin
9c50: 67 20 66 6f 72 20 74 68 65 20 70 6c 61 74 66 6f  g for the platfo
9c60: 72 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  rm means that th
9c70: 65 20 62 75 69 6c 64 20 69 73 20 6e 6f 74 0d 0a  e build is not..
9c80: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 5b 70        #       [p
9c90: 72 69 6d 61 72 69 6c 79 5d 20 61 20 6e 61 74 69  rimarily] a nati
9ca0: 76 65 20 62 75 69 6c 64 3b 20 74 68 65 72 65 66  ve build; theref
9cb0: 6f 72 65 2c 20 69 74 20 61 6c 77 61 79 73 20 6d  ore, it always m
9cc0: 61 74 63 68 65 73 2e 0d 0a 20 20 20 20 20 20 23  atches...      #
9cd0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
9ce0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74  ing length $plat
9cf0: 66 6f 72 6d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  form] == 0} then
9d00: 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
9d10: 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 7d  rn true..      }
9d20: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
9d30: 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20     # NOTE: Does 
9d40: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 6c  the specified pl
9d50: 61 74 66 6f 72 6d 20 6d 61 74 63 68 20 75 70 20  atform match up 
9d60: 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  to the current p
9d70: 72 6f 63 65 73 73 3f 0d 0a 20 20 20 20 20 20 23  rocess?..      #
9d80: 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 70 6c 61  ..      if {$pla
9d90: 74 66 6f 72 6d 20 65 71 20 5b 6d 61 63 68 69 6e  tform eq [machin
9da0: 65 54 6f 50 6c 61 74 66 6f 72 6d 20 24 3a 3a 74  eToPlatform $::t
9db0: 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61 63 68  cl_platform(mach
9dc0: 69 6e 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ine)]} then {.. 
9dd0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
9de0: 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ue..      }.... 
9df0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
9e00: 4e 4f 54 45 3a 20 54 68 65 20 73 70 65 63 69 66  NOTE: The specif
9e10: 69 65 64 20 70 6c 61 74 66 6f 72 6d 20 64 6f 65  ied platform doe
9e20: 73 20 6e 6f 74 20 6d 61 74 63 68 20 75 70 20 77  s not match up w
9e30: 69 74 68 20 74 68 65 20 70 6c 61 74 66 6f 72 6d  ith the platform
9e40: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
9e50: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
9e60: 70 72 6f 63 65 73 73 2e 0d 0a 20 20 20 20 20 20  process...      
9e70: 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  #..      return 
9e80: 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  false..    }....
9e90: 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46  .    proc checkF
9ea0: 6f 72 53 51 4c 69 74 65 42 75 69 6c 64 73 20 7b  orSQLiteBuilds {
9eb0: 20 63 68 61 6e 6e 65 6c 20 7b 73 65 6c 65 63 74   channel {select
9ec0: 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20   false} } {..   
9ed0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
9ee0: 54 45 3a 20 43 68 65 63 6b 20 66 6f 72 20 65 76  TE: Check for ev
9ef0: 65 72 79 20 70 6f 73 73 69 62 6c 65 20 76 61 6c  ery possible val
9f00: 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f  id combination o
9f10: 66 20 76 61 6c 75 65 73 20 75 73 65 64 20 77 68  f values used wh
9f20: 65 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  en..      #     
9f30: 20 20 6c 6f 63 61 74 69 6e 67 20 6f 75 74 20 74    locating out t
9f40: 68 65 20 62 75 69 6c 64 20 6f 75 74 70 75 74 20  he build output 
9f50: 64 69 72 65 63 74 6f 72 79 2c 20 73 68 6f 77 69  directory, showi
9f60: 6e 67 20 65 61 63 68 20 61 76 61 69 6c 61 62 6c  ng each availabl
9f70: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
9f80: 20 62 75 69 6c 64 20 76 61 72 69 61 74 69 6f 6e   build variation
9f90: 20 61 6c 6f 6e 67 20 74 68 65 20 77 61 79 2e 0d   along the way..
9fa0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
9fb0: 66 6f 72 65 61 63 68 20 6e 61 74 69 76 65 20 5b  foreach native [
9fc0: 6c 69 73 74 20 66 61 6c 73 65 20 74 72 75 65 5d  list false true]
9fd0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65   {..        fore
9fe0: 61 63 68 20 79 65 61 72 20 5b 67 65 74 42 75 69  ach year [getBui
9ff0: 6c 64 59 65 61 72 73 5d 20 7b 0d 0a 20 20 20 20  ldYears] {..    
a000: 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 63 6f        foreach co
a010: 6e 66 69 67 75 72 61 74 69 6f 6e 20 5b 67 65 74  nfiguration [get
a020: 42 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69  BuildConfigurati
a030: 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20  ons] {..        
a040: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
a050: 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72     # NOTE: Figur
a060: 65 20 6f 75 74 20 74 68 65 20 65 66 66 65 63 74  e out the effect
a070: 69 76 65 20 62 75 69 6c 64 20 70 6c 61 74 66 6f  ive build platfo
a080: 72 6d 2e 20 20 54 68 69 73 20 69 73 0d 0a 20 20  rm.  This is..  
a090: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
a0a0: 20 20 62 61 73 65 64 20 6f 6e 20 77 68 65 74 68    based on wheth
a0b0: 65 72 20 6f 72 20 6e 6f 74 20 61 20 5b 70 72 69  er or not a [pri
a0c0: 6d 61 72 69 6c 79 5d 20 6e 61 74 69 76 65 20 62  marily] native b
a0d0: 75 69 6c 64 0d 0a 20 20 20 20 20 20 20 20 20 20  uild..          
a0e0: 20 20 23 20 20 20 20 20 20 20 69 73 20 62 65 69    #       is bei
a0f0: 6e 67 20 75 73 65 64 2e 20 20 46 6f 72 20 5b 70  ng used.  For [p
a100: 72 69 6d 61 72 69 6c 79 5d 20 6e 6f 6e 2d 6e 61  rimarily] non-na
a110: 74 69 76 65 20 62 75 69 6c 64 73 2c 0d 0a 20 20  tive builds,..  
a120: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
a130: 20 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 61    this will be a
a140: 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0d  n empty string..
a150: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
a160: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
a170: 70 6c 61 74 66 6f 72 6d 20 5b 67 65 74 42 75 69  platform [getBui
a180: 6c 64 50 6c 61 74 66 6f 72 6d 20 24 6e 61 74 69  ldPlatform $nati
a190: 76 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ve]....         
a1a0: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
a1b0: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
a1c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a1d0: 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20   "---- checking 
a1e0: 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  for System.Data.
a1f0: 53 51 4c 69 74 65 20 62 75 69 6c 64 20 5c 22 22  SQLite build \""
a200: 20 5b 65 78 70 72 20 5c 0d 0a 20 20 20 20 20 20   [expr \..      
a210: 20 20 20 20 20 20 20 20 20 20 7b 24 6e 61 74 69            {$nati
a220: 76 65 20 3f 20 22 6e 61 74 69 76 65 2f 22 20 3a  ve ? "native/" :
a230: 20 22 22 7d 5d 20 5b 65 78 70 72 20 7b 5b 73 74   ""}] [expr {[st
a240: 72 69 6e 67 20 6c 65 6e 67 74 68 20 5c 0d 0a 20  ring length \.. 
a250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
a260: 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 20 3f 20  platform] > 0 ? 
a270: 5b 61 70 70 65 6e 64 41 72 67 73 20 24 70 6c 61  [appendArgs $pla
a280: 74 66 6f 72 6d 20 2f 5d 20 3a 20 22 22 7d 5d 20  tform /] : ""}] 
a290: 24 79 65 61 72 20 5c 0d 0a 20 20 20 20 20 20 20  $year \..       
a2a0: 20 20 20 20 20 20 20 20 20 2f 20 24 63 6f 6e 66           / $conf
a2b0: 69 67 75 72 61 74 69 6f 6e 20 22 5c 22 2e 2e 2e  iguration "\"...
a2c0: 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20   "]....         
a2d0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
a2e0: 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20    # NOTE: Build 
a2f0: 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  the fully qualif
a300: 69 65 64 20 64 69 72 65 63 74 6f 72 79 20 77 68  ied directory wh
a310: 65 72 65 20 74 68 65 20 6e 65 63 65 73 73 61 72  ere the necessar
a320: 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  y..            #
a330: 20 20 20 20 20 20 20 63 6f 6d 70 6f 6e 65 6e 74         component
a340: 73 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74  s for System.Dat
a350: 61 2e 53 51 4c 69 74 65 20 73 68 6f 75 6c 64 20  a.SQLite should 
a360: 62 65 20 66 6f 75 6e 64 2e 0d 0a 20 20 20 20 20  be found...     
a370: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
a380: 20 20 20 20 20 20 73 65 74 20 64 69 72 65 63 74        set direct
a390: 6f 72 79 20 5b 6a 6f 69 6e 42 75 69 6c 64 44 69  ory [joinBuildDi
a3a0: 72 65 63 74 6f 72 79 20 24 6e 61 74 69 76 65 20  rectory $native 
a3b0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
a3c0: 20 20 20 5b 67 65 74 42 75 69 6c 64 42 61 73 65     [getBuildBase
a3d0: 44 69 72 65 63 74 6f 72 79 5d 20 24 79 65 61 72  Directory] $year
a3e0: 20 24 70 6c 61 74 66 6f 72 6d 20 24 63 6f 6e 66   $platform $conf
a3f0: 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 0d 0a 20 20  iguration]....  
a400: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
a410: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
a420: 20 44 6f 20 74 68 65 20 6e 65 63 65 73 73 61 72   Do the necessar
a430: 79 20 66 69 6c 65 73 20 65 78 69 73 74 3f 20 20  y files exist?  
a440: 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 6f 74  Currently, no ot
a450: 68 65 72 20 73 74 65 70 73 0d 0a 20 20 20 20 20  her steps..     
a460: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
a470: 72 65 20 74 61 6b 65 6e 20 74 6f 20 76 65 72 69  re taken to veri
a480: 66 79 20 74 68 69 73 20 62 75 69 6c 64 20 69 73  fy this build is
a490: 20 61 63 74 75 61 6c 6c 79 20 76 69 61 62 6c 65   actually viable
a4a0: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
a4b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
a4c0: 20 7b 5b 69 73 42 75 69 6c 64 41 76 61 69 6c 61   {[isBuildAvaila
a4d0: 62 6c 65 20 24 6e 61 74 69 76 65 20 24 64 69 72  ble $native $dir
a4e0: 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d  ectory]} then {.
a4f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
a500: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a510: 23 20 4e 4f 54 45 3a 20 57 68 65 6e 20 69 6e 20  # NOTE: When in 
a520: 22 73 65 6c 65 63 74 22 20 6d 6f 64 65 2c 20 61  "select" mode, a
a530: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65 6c  utomatically sel
a540: 65 63 74 20 74 68 65 20 66 69 72 73 74 0d 0a 20  ect the first.. 
a550: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
a560: 20 20 20 20 20 61 76 61 69 6c 61 62 6c 65 20 62       available b
a570: 75 69 6c 64 20 6f 66 20 53 79 73 74 65 6d 2e 44  uild of System.D
a580: 61 74 61 2e 53 51 4c 69 74 65 20 61 6e 64 20 74  ata.SQLite and t
a590: 68 65 6e 20 72 65 74 75 72 6e 0d 0a 20 20 20 20  hen return..    
a5a0: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
a5b0: 20 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0d 0a    immediately...
a5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
a5d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
a5e0: 66 20 7b 24 73 65 6c 65 63 74 20 26 26 20 5b 6d  f {$select && [m
a5f0: 61 74 63 68 4d 61 63 68 69 6e 65 20 24 70 6c 61  atchMachine $pla
a600: 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  tform]} then {..
a610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a620: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
a630: 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 6e 75 61     # NOTE: Manua
a640: 6c 6c 79 20 6f 76 65 72 72 69 64 65 20 61 6c 6c  lly override all
a650: 20 74 68 65 20 62 75 69 6c 64 20 64 69 72 65 63   the build direc
a660: 74 6f 72 79 20 73 65 6c 65 63 74 69 6f 6e 0d 0a  tory selection..
a670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a680: 23 20 20 20 20 20 20 20 72 65 6c 61 74 65 64 20  #       related 
a690: 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 69 6e  test settings in
a6a0: 20 6f 72 64 65 72 20 74 6f 20 66 6f 72 63 65 20   order to force 
a6b0: 74 68 69 73 20 62 75 69 6c 64 0d 0a 20 20 20 20  this build..    
a6c0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
a6d0: 20 20 20 20 6f 66 20 53 79 73 74 65 6d 2e 44 61      of System.Da
a6e0: 74 61 2e 53 51 4c 69 74 65 20 74 6f 20 62 65 20  ta.SQLite to be 
a6f0: 75 73 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20  used...         
a700: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
a710: 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
a720: 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72 65   invoke Interpre
a730: 74 65 72 2e 47 65 74 41 63 74 69 76 65 20 5b 65  ter.GetActive [e
a740: 78 70 72 20 7b 24 6e 61 74 69 76 65 20 3f 20 5c  xpr {$native ? \
a750: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a760: 20 20 20 20 20 20 22 41 64 64 52 75 6e 74 69 6d        "AddRuntim
a770: 65 4f 70 74 69 6f 6e 22 20 3a 20 22 52 65 6d 6f  eOption" : "Remo
a780: 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 22  veRuntimeOption"
a790: 7d 5d 20 20 6e 61 74 69 76 65 0d 0a 0d 0a 20 20  }]  native....  
a7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
a7b0: 74 20 3a 3a 74 65 73 74 5f 79 65 61 72 20 24 79  t ::test_year $y
a7c0: 65 61 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ear..           
a7d0: 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74 5f       set ::test_
a7e0: 70 6c 61 74 66 6f 72 6d 20 24 70 6c 61 74 66 6f  platform $platfo
a7f0: 72 6d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  rm..            
a800: 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74 5f 63      set ::test_c
a810: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 24 63 6f  onfiguration $co
a820: 6e 66 69 67 75 72 61 74 69 6f 6e 0d 0a 0d 0a 20  nfiguration.... 
a830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
a840: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
a850: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
a860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a870: 20 22 79 65 73 2c 20 73 65 6c 65 63 74 65 64 20   "yes, selected 
a880: 28 22 20 5b 65 78 70 72 20 7b 24 6e 61 74 69 76  (" [expr {$nativ
a890: 65 20 3f 20 22 6e 61 74 69 76 65 2f 22 20 3a 20  e ? "native/" : 
a8a0: 22 22 7d 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20  ""}] \..        
a8b0: 20 20 20 20 20 20 20 20 20 20 20 20 5b 65 78 70              [exp
a8c0: 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  r {[string lengt
a8d0: 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30  h $platform] > 0
a8e0: 20 3f 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c   ? [appendArgs \
a8f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a900: 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72 6d 20        $platform 
a910: 2f 5d 20 3a 20 22 22 7d 5d 20 24 79 65 61 72 20  /] : ""}] $year 
a920: 2f 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  / $configuration
a930: 20 22 29 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20   ")\n"]....     
a940: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
a950: 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20  n true..        
a960: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
a970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a980: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79  tputs $channel y
a990: 65 73 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  es\n..          
a9a0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
a9b0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
a9c0: 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
a9d0: 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a   $channel no\n..
a9e0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
a9f0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
aa00: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
aa10: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 66  ..      return f
aa20: 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  alse..    }.....
aa30: 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f      proc checkFo
aa40: 72 53 51 4c 69 74 65 52 65 6c 65 61 73 65 73 20  rSQLiteReleases 
aa50: 7b 20 63 68 61 6e 6e 65 6c 20 7b 73 65 6c 65 63  { channel {selec
aa60: 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20  t false} } {..  
aa70: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
aa80: 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f 72 20 70  OTE: Check for p
aa90: 61 73 74 20 72 65 6c 65 61 73 65 73 20 6f 66 20  ast releases of 
aaa0: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
aab0: 74 65 20 69 6e 20 74 68 65 20 64 69 72 65 63 74  te in the direct
aac0: 6f 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ory..      #    
aad0: 20 20 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20     contained in 
aae0: 74 68 65 20 22 53 79 73 74 65 6d 2e 44 61 74 61  the "System.Data
aaf0: 2e 53 51 4c 69 74 65 22 20 65 6e 76 69 72 6f 6e  .SQLite" environ
ab00: 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 2c 20 69  ment variable, i
ab10: 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  f..      #      
ab20: 20 70 72 65 73 65 6e 74 2e 0d 0a 20 20 20 20 20   present...     
ab30: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
ab40: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65 6e 76  nfo exists ::env
ab50: 28 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  (System.Data.SQL
ab60: 69 74 65 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20  ite)] && \..    
ab70: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
ab80: 6e 67 74 68 20 24 3a 3a 65 6e 76 28 53 79 73 74  ngth $::env(Syst
ab90: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 29 5d  em.Data.SQLite)]
aba0: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
abb0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
abc0: 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74   # NOTE: Build t
abd0: 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  he fully qualifi
abe0: 65 64 20 64 69 72 65 63 74 6f 72 79 20 77 68 65  ed directory whe
abf0: 72 65 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  re the necessary
ac00: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
ac10: 20 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 66 6f 72    components for
ac20: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
ac30: 69 74 65 20 73 68 6f 75 6c 64 20 62 65 20 66 6f  ite should be fo
ac40: 75 6e 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  und...        #.
ac50: 0a 20 20 20 20 20 20 20 20 73 65 74 20 64 69 72  .        set dir
ac60: 65 63 74 6f 72 79 20 5b 66 69 6c 65 20 6e 61 74  ectory [file nat
ac70: 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
ac80: 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  in \..          
ac90: 20 20 24 3a 3a 65 6e 76 28 53 79 73 74 65 6d 2e    $::env(System.
aca0: 44 61 74 61 2e 53 51 4c 69 74 65 29 20 5b 67 65  Data.SQLite) [ge
acb0: 74 52 65 6c 65 61 73 65 56 65 72 73 69 6f 6e 5d  tReleaseVersion]
acc0: 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70  ]]....        tp
acd0: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
ace0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
acf0: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68          "---- ch
ad00: 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65  ecking for Syste
ad10: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 72 65  m.Data.SQLite re
ad20: 6c 65 61 73 65 20 5c 22 22 20 5c 0d 0a 20 20 20  lease \"" \..   
ad30: 20 20 20 20 20 20 20 20 20 24 64 69 72 65 63 74           $direct
ad40: 6f 72 79 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d  ory "\"... "]...
ad50: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 73  .        if {[is
ad60: 52 65 6c 65 61 73 65 41 76 61 69 6c 61 62 6c 65  ReleaseAvailable
ad70: 20 24 64 69 72 65 63 74 6f 72 79 20 70 6c 61 74   $directory plat
ad80: 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  form]} then {.. 
ad90: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74           if {[st
ada0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61  ring length $pla
adb0: 74 66 6f 72 6d 5d 20 3d 3d 20 30 7d 20 74 68 65  tform] == 0} the
adc0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
add0: 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 75 6e   set platform un
ade0: 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20 20  known..         
adf0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
ae00: 69 66 20 7b 24 73 65 6c 65 63 74 20 26 26 20 5b  if {$select && [
ae10: 6d 61 74 63 68 4d 61 63 68 69 6e 65 20 24 70 6c  matchMachine $pl
ae20: 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d  atform]} then {.
ae30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
ae40: 20 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63 74 6f   ::build_directo
ae50: 72 79 20 24 64 69 72 65 63 74 6f 72 79 0d 0a 0d  ry $directory...
ae60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
ae70: 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
ae80: 65 6e 64 41 72 67 73 20 22 79 65 73 2c 20 73 65  endArgs "yes, se
ae90: 6c 65 63 74 65 64 20 28 22 20 24 70 6c 61 74 66  lected (" $platf
aea0: 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a 0d 0a 20 20  orm ")\n"]....  
aeb0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
aec0: 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 20   true..         
aed0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
aee0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
aef0: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
af00: 73 20 22 79 65 73 20 28 22 20 24 70 6c 61 74 66  s "yes (" $platf
af10: 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a 20 20 20 20  orm ")\n"]..    
af20: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
af30: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
af40: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
af50: 6e 65 6c 20 6e 6f 5c 6e 0d 0a 0d 0a 20 20 20 20  nel no\n....    
af60: 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 70 61        foreach pa
af70: 74 68 20 5b 6c 73 6f 72 74 20 2d 64 65 63 72 65  th [lsort -decre
af80: 61 73 69 6e 67 20 5b 66 69 6c 65 20 6c 69 73 74  asing [file list
af90: 20 24 64 69 72 65 63 74 6f 72 79 20 2a 5d 5d 20   $directory *]] 
afa0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
afb0: 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20  f {[file exists 
afc0: 24 70 61 74 68 5d 20 26 26 20 5b 66 69 6c 65 20  $path] && [file 
afd0: 69 73 64 69 72 65 63 74 6f 72 79 20 24 70 61 74  isdirectory $pat
afe0: 68 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  h]} then {..    
aff0: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
b000: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
b010: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
b020: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
b030: 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73  checking for Sys
b040: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
b050: 72 65 6c 65 61 73 65 20 5c 22 22 20 5c 0d 0a 20  release \"" \.. 
b060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b070: 20 24 70 61 74 68 20 22 5c 22 2e 2e 2e 20 22 5d   $path "\"... "]
b080: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
b090: 20 20 69 66 20 7b 5b 69 73 52 65 6c 65 61 73 65    if {[isRelease
b0a0: 41 76 61 69 6c 61 62 6c 65 20 24 70 61 74 68 20  Available $path 
b0b0: 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20  platform]} then 
b0c0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
b0d0: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
b0e0: 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d  ength $platform]
b0f0: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
b100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b110: 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 75 6e   set platform un
b120: 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20 20  known..         
b130: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
b140: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
b150: 24 73 65 6c 65 63 74 20 26 26 20 5b 6d 61 74 63  $select && [matc
b160: 68 4d 61 63 68 69 6e 65 20 24 70 6c 61 74 66 6f  hMachine $platfo
b170: 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  rm]} then {..   
b180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
b190: 65 74 20 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63  et ::build_direc
b1a0: 74 6f 72 79 20 24 70 61 74 68 0d 0a 0d 0a 20 20  tory $path....  
b1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1c0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
b1d0: 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73 2c  appendArgs "yes,
b1e0: 20 73 65 6c 65 63 74 65 64 20 28 22 20 24 70 6c   selected (" $pl
b1f0: 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a 0d  atform ")\n"]...
b200: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b210: 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a     return true..
b220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b230: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
b240: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
b250: 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
b260: 6e 64 41 72 67 73 20 22 79 65 73 20 28 22 20 24  ndArgs "yes (" $
b270: 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d  platform ")\n"].
b280: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b290: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
b2a0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
b2b0: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
b2c0: 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d  s $channel no\n.
b2d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
b2e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
b2f0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
b300: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
b310: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
b320: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
b330: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
b340: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
b350: 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72   environment var
b360: 69 61 62 6c 65 20 5c 22 53 79 73 74 65 6d 2e 44  iable \"System.D
b370: 61 74 61 2e 53 51 4c 69 74 65 5c 22 20 69 73 20  ata.SQLite\" is 
b380: 6e 6f 74 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  not " \..       
b390: 20 20 20 20 20 22 73 65 74 2c 20 73 6b 69 70 70       "set, skipp
b3a0: 69 6e 67 20 63 68 65 63 6b 20 66 6f 72 20 72 65  ing check for re
b3b0: 6c 65 61 73 65 73 2e 2e 2e 5c 6e 22 5d 0d 0a 20  leases...\n"].. 
b3c0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
b3d0: 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20  return false..  
b3e0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
b3f0: 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 4c   checkForSQLiteL
b400: 69 62 72 61 72 79 20 7b 20 63 68 61 6e 6e 65 6c  ibrary { channel
b410: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74   } {..      tput
b420: 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
b430: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 51   checking for SQ
b440: 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72  Lite core librar
b450: 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  y... "....      
b460: 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
b470: 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
b480: 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
b490: 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
b4a0: 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
b4b0: 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20  .SQLite.SQLite3 
b4c0: 53 51 4c 69 74 65 56 65 72 73 69 6f 6e 0d 0a 20  SQLiteVersion.. 
b4d0: 20 20 20 20 20 7d 20 76 65 72 73 69 6f 6e 5d 20       } version] 
b4e0: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
b4f0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
b500: 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
b510: 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 76  f the returned v
b520: 65 72 73 69 6f 6e 20 77 61 73 20 6e 75 6c 6c 2e  ersion was null.
b530: 20 20 49 66 20 73 6f 2c 20 6d 61 6b 65 20 69 74    If so, make it
b540: 20 65 61 73 79 0d 0a 20 20 20 20 20 20 20 20 23   easy..        #
b550: 20 20 20 20 20 20 20 74 6f 20 73 70 6f 74 2e 0d         to spot..
b560: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
b570: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
b580: 6c 65 6e 67 74 68 20 24 76 65 72 73 69 6f 6e 5d  length $version]
b590: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
b5a0: 20 20 20 20 20 20 20 20 20 73 65 74 20 76 65 72           set ver
b5b0: 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20 20 20 20 20  sion null..     
b5c0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
b5d0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
b5e0: 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 71 75  E: Attempt to qu
b5f0: 65 72 79 20 74 68 65 20 46 6f 73 73 69 6c 20 73  ery the Fossil s
b600: 6f 75 72 63 65 20 69 64 65 6e 74 69 66 69 65 72  ource identifier
b610: 20 66 6f 72 20 74 68 65 20 53 51 4c 69 74 65 0d   for the SQLite.
b620: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
b630: 20 63 6f 72 65 20 6c 69 62 72 61 72 79 2e 0d 0a   core library...
b640: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
b650: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
b660: 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
b670: 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
b680: 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
b690: 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
b6a0: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53  em.Data.SQLite.S
b6b0: 51 4c 69 74 65 33 20 53 51 4c 69 74 65 53 6f 75  QLite3 SQLiteSou
b6c0: 72 63 65 49 64 0d 0a 20 20 20 20 20 20 20 20 7d  rceId..        }
b6d0: 20 73 6f 75 72 63 65 49 64 5d 7d 20 74 68 65 6e   sourceId]} then
b6e0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
b6f0: 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
b700: 45 3a 20 57 65 20 66 61 69 6c 65 64 20 74 6f 20  E: We failed to 
b710: 71 75 65 72 79 20 74 68 65 20 46 6f 73 73 69 6c  query the Fossil
b720: 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69 66 69   source identifi
b730: 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  er...          #
b740: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
b750: 73 6f 75 72 63 65 49 64 20 75 6e 6b 6e 6f 77 6e  sourceId unknown
b760: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
b770: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
b780: 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
b790: 69 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  if the returned 
b7a0: 46 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64  Fossil source id
b7b0: 65 6e 74 69 66 69 65 72 20 77 61 73 20 6e 75 6c  entifier was nul
b7c0: 6c 2e 20 20 49 66 0d 0a 20 20 20 20 20 20 20 20  l.  If..        
b7d0: 23 20 20 20 20 20 20 20 73 6f 2c 20 6d 61 6b 65  #       so, make
b7e0: 20 69 74 20 65 61 73 79 20 74 6f 20 73 70 6f 74   it easy to spot
b7f0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
b800: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
b810: 67 20 6c 65 6e 67 74 68 20 24 73 6f 75 72 63 65  g length $source
b820: 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  Id] == 0} then {
b830: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
b840: 73 6f 75 72 63 65 49 64 20 6e 75 6c 6c 0d 0a 20  sourceId null.. 
b850: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
b860: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
b870: 20 4e 4f 54 45 3a 20 59 65 73 2c 20 74 68 65 20   NOTE: Yes, the 
b880: 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72  SQLite core libr
b890: 61 72 79 20 61 70 70 65 61 72 73 20 74 6f 20 62  ary appears to b
b8a0: 65 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20  e available...  
b8b0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
b8c0: 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 53   addConstraint S
b8d0: 51 4c 69 74 65 0d 0a 0d 0a 20 20 20 20 20 20 20  QLite....       
b8e0: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
b8f0: 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73  [appendArgs "yes
b900: 20 28 22 20 24 76 65 72 73 69 6f 6e 20 22 20 22   (" $version " "
b910: 20 24 73 6f 75 72 63 65 49 64 20 22 29 5c 6e 22   $sourceId ")\n"
b920: 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
b930: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
b940: 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a   $channel no\n..
b950: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
b960: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63  ...    proc chec
b970: 6b 46 6f 72 53 51 4c 69 74 65 49 6e 74 65 72 6f  kForSQLiteIntero
b980: 70 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d  p { channel } {.
b990: 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68  .      tputs $ch
b9a0: 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63  annel "---- chec
b9b0: 6b 69 6e 67 20 66 6f 72 20 53 51 4c 69 74 65 20  king for SQLite 
b9c0: 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79  interop assembly
b9d0: 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69  ... "....      i
b9e0: 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
b9f0: 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
ba00: 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
ba10: 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
ba20: 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
ba30: 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 49  SQLite.SQLite3 I
ba40: 6e 74 65 72 6f 70 56 65 72 73 69 6f 6e 0d 0a 20  nteropVersion.. 
ba50: 20 20 20 20 20 7d 20 76 65 72 73 69 6f 6e 5d 20       } version] 
ba60: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
ba70: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
ba80: 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
ba90: 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 76  f the returned v
baa0: 65 72 73 69 6f 6e 20 77 61 73 20 6e 75 6c 6c 2e  ersion was null.
bab0: 20 20 49 66 20 73 6f 2c 20 6d 61 6b 65 20 69 74    If so, make it
bac0: 20 65 61 73 79 0d 0a 20 20 20 20 20 20 20 20 23   easy..        #
bad0: 20 20 20 20 20 20 20 74 6f 20 73 70 6f 74 2e 0d         to spot..
bae0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
baf0: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
bb00: 6c 65 6e 67 74 68 20 24 76 65 72 73 69 6f 6e 5d  length $version]
bb10: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
bb20: 20 20 20 20 20 20 20 20 20 73 65 74 20 76 65 72           set ver
bb30: 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20 20 20 20 20  sion null..     
bb40: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
bb50: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
bb60: 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 71 75  E: Attempt to qu
bb70: 65 72 79 20 74 68 65 20 46 6f 73 73 69 6c 20 73  ery the Fossil s
bb80: 6f 75 72 63 65 20 69 64 65 6e 74 69 66 69 65 72  ource identifier
bb90: 20 66 6f 72 20 74 68 65 20 53 51 4c 69 74 65 0d   for the SQLite.
bba0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
bbb0: 20 63 6f 72 65 20 6c 69 62 72 61 72 79 2e 0d 0a   core library...
bbc0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
bbd0: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
bbe0: 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
bbf0: 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
bc00: 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
bc10: 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
bc20: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53  em.Data.SQLite.S
bc30: 51 4c 69 74 65 33 20 49 6e 74 65 72 6f 70 53 6f  QLite3 InteropSo
bc40: 75 72 63 65 49 64 0d 0a 20 20 20 20 20 20 20 20  urceId..        
bc50: 7d 20 73 6f 75 72 63 65 49 64 5d 7d 20 74 68 65  } sourceId]} the
bc60: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  n {..          #
bc70: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
bc80: 54 45 3a 20 57 65 20 66 61 69 6c 65 64 20 74 6f  TE: We failed to
bc90: 20 71 75 65 72 79 20 74 68 65 20 46 6f 73 73 69   query the Fossi
bca0: 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69 66  l source identif
bcb0: 69 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ier...          
bcc0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  #..          set
bcd0: 20 73 6f 75 72 63 65 49 64 20 75 6e 6b 6e 6f 77   sourceId unknow
bce0: 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  n..        }....
bcf0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
bd00: 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
bd10: 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 65 64   if the returned
bd20: 20 46 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69   Fossil source i
bd30: 64 65 6e 74 69 66 69 65 72 20 77 61 73 20 6e 75  dentifier was nu
bd40: 6c 6c 2e 20 20 49 66 0d 0a 20 20 20 20 20 20 20  ll.  If..       
bd50: 20 23 20 20 20 20 20 20 20 73 6f 2c 20 6d 61 6b   #       so, mak
bd60: 65 20 69 74 20 65 61 73 79 20 74 6f 20 73 70 6f  e it easy to spo
bd70: 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
bd80: 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
bd90: 6e 67 20 6c 65 6e 67 74 68 20 24 73 6f 75 72 63  ng length $sourc
bda0: 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  eId] == 0} then 
bdb0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
bdc0: 20 73 6f 75 72 63 65 49 64 20 6e 75 6c 6c 0d 0a   sourceId null..
bdd0: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
bde0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
bdf0: 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 74 68 65  # NOTE: Yes, the
be00: 20 53 51 4c 69 74 65 20 69 6e 74 65 72 6f 70 20   SQLite interop 
be10: 61 73 73 65 6d 62 6c 79 20 61 70 70 65 61 72 73  assembly appears
be20: 20 74 6f 20 62 65 20 61 76 61 69 6c 61 62 6c 65   to be available
be30: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
be40: 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
be50: 69 6e 74 20 53 51 4c 69 74 65 49 6e 74 65 72 6f  int SQLiteIntero
be60: 70 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75  p....        tpu
be70: 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
be80: 65 6e 64 41 72 67 73 20 22 79 65 73 20 28 22 20  endArgs "yes (" 
be90: 24 76 65 72 73 69 6f 6e 20 22 20 22 20 24 73 6f  $version " " $so
bea0: 75 72 63 65 49 64 20 22 29 5c 6e 22 5d 0d 0a 20  urceId ")\n"].. 
beb0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
bec0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
bed0: 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20  annel no\n..    
bee0: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
bef0: 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72     proc checkFor
bf00: 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73  SQLiteDefineCons
bf10: 74 61 6e 74 20 7b 20 63 68 61 6e 6e 65 6c 20 6e  tant { channel n
bf20: 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74  ame } {..      t
bf30: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
bf40: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
bf50: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65         "---- che
bf60: 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d  cking for System
bf70: 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 64 65 66  .Data.SQLite def
bf80: 69 6e 65 20 63 6f 6e 73 74 61 6e 74 20 5c 22 22  ine constant \""
bf90: 20 24 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20   $name \..      
bfa0: 20 20 20 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d      "\"... "]...
bfb0: 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63  .      if {[catc
bfc0: 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a  h {..        obj
bfd0: 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
bfe0: 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
bff0: 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
c000: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53  em.Data.SQLite.S
c010: 51 4c 69 74 65 33 20 44 65 66 69 6e 65 43 6f 6e  QLite3 DefineCon
c020: 73 74 61 6e 74 73 0d 0a 20 20 20 20 20 20 7d 20  stants..      } 
c030: 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73 5d  defineConstants]
c040: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
c050: 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 73 65 61         if {[lsea
c060: 72 63 68 20 2d 65 78 61 63 74 20 2d 6e 6f 63 61  rch -exact -noca
c070: 73 65 20 24 64 65 66 69 6e 65 43 6f 6e 73 74 61  se $defineConsta
c080: 6e 74 73 20 24 6e 61 6d 65 5d 20 21 3d 20 2d 31  nts $name] != -1
c090: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
c0a0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
c0b0: 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 74 68   # NOTE: Yes, th
c0c0: 69 73 20 64 65 66 69 6e 65 20 63 6f 6e 73 74 61  is define consta
c0d0: 6e 74 20 77 61 73 20 65 6e 61 62 6c 65 64 20 77  nt was enabled w
c0e0: 68 65 6e 20 74 68 65 20 6d 61 6e 61 67 65 64 0d  hen the managed.
c0f0: 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
c100: 20 20 20 61 73 73 65 6d 62 6c 79 20 77 61 73 20     assembly was 
c110: 63 6f 6d 70 69 6c 65 64 2e 0d 0a 20 20 20 20 20  compiled...     
c120: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
c130: 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
c140: 5b 61 70 70 65 6e 64 41 72 67 73 20 64 65 66 69  [appendArgs defi
c150: 6e 65 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74 65  neConstant.Syste
c160: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 20 24  m.Data.SQLite. $
c170: 6e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  name]....       
c180: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
c190: 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 20  l yes\n..       
c1a0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
c1b0: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
c1c0: 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20  nel no\n..      
c1d0: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73    }..      } els
c1e0: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e {..        tpu
c1f0: 74 73 20 24 63 68 61 6e 6e 65 6c 20 65 72 72 6f  ts $channel erro
c200: 72 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  r\n..      }..  
c210: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
c220: 20 67 65 74 44 61 74 65 54 69 6d 65 46 6f 72 6d   getDateTimeForm
c230: 61 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  at {} {..      #
c240: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
c250: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 73  This procedure s
c260: 69 6d 70 6c 79 20 72 65 74 75 72 6e 73 20 74 68  imply returns th
c270: 65 20 22 64 65 66 61 75 6c 74 22 20 44 61 74 65  e "default" Date
c280: 54 69 6d 65 20 66 6f 72 6d 61 74 20 75 73 65 64  Time format used
c290: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
c2a0: 62 79 20 74 68 65 20 74 65 73 74 20 73 75 69 74  by the test suit
c2b0: 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
c2c0: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
c2d0: 73 74 73 20 3a 3a 64 61 74 65 74 69 6d 65 5f 66  sts ::datetime_f
c2e0: 6f 72 6d 61 74 5d 20 26 26 20 5c 0d 0a 20 20 20  ormat] && \..   
c2f0: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
c300: 65 6e 67 74 68 20 24 3a 3a 64 61 74 65 74 69 6d  ength $::datetim
c310: 65 5f 66 6f 72 6d 61 74 5d 20 3e 20 30 7d 20 74  e_format] > 0} t
c320: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
c330: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
c340: 3a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 61 6e  : Return the man
c350: 75 61 6c 6c 79 20 6f 76 65 72 72 69 64 64 65 6e  ually overridden
c360: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 44   value for the D
c370: 61 74 65 54 69 6d 65 20 66 6f 72 6d 61 74 2e 0d  ateTime format..
c380: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
c390: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 64 61      return $::da
c3a0: 74 65 74 69 6d 65 5f 66 6f 72 6d 61 74 0d 0a 20  tetime_format.. 
c3b0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
c3c0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
c3d0: 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e    # NOTE: Return
c3e0: 20 61 6e 20 49 53 4f 38 36 30 31 20 44 61 74 65   an ISO8601 Date
c3f0: 54 69 6d 65 20 66 6f 72 6d 61 74 20 63 6f 6d 70  Time format comp
c400: 61 74 69 62 6c 65 20 77 69 74 68 20 53 51 4c 69  atible with SQLi
c410: 74 65 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20  te,..        #  
c420: 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
c430: 2e 53 51 4c 69 74 65 2c 20 61 6e 64 20 73 75 69  .SQLite, and sui
c440: 74 61 62 6c 65 20 66 6f 72 20 72 6f 75 6e 64 2d  table for round-
c450: 74 72 69 70 70 69 6e 67 20 77 69 74 68 20 74 68  tripping with th
c460: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
c470: 20 20 20 44 61 74 65 54 69 6d 65 20 63 6c 61 73     DateTime clas
c480: 73 20 6f 66 20 74 68 65 20 66 72 61 6d 65 77 6f  s of the framewo
c490: 72 6b 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c  rk.  If this val
c4a0: 75 65 20 69 73 20 63 68 61 6e 67 65 64 2c 0d 0a  ue is changed,..
c4b0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
c4c0: 76 61 72 69 6f 75 73 20 74 65 73 74 73 20 6d 61  various tests ma
c4d0: 79 20 66 61 69 6c 2e 0d 0a 20 20 20 20 20 20 20  y fail...       
c4e0: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
c4f0: 72 6e 20 22 79 79 79 79 2d 4d 4d 2d 64 64 20 48  rn "yyyy-MM-dd H
c500: 48 3a 6d 6d 3a 73 73 2e 46 46 46 46 46 46 46 4b  H:mm:ss.FFFFFFFK
c510: 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  "..      }..    
c520: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 65  }.....    proc e
c530: 6e 75 6d 65 72 61 62 6c 65 54 6f 4c 69 73 74 20  numerableToList 
c540: 7b 20 65 6e 75 6d 65 72 61 62 6c 65 20 7d 20 7b  { enumerable } {
c550: 0d 0a 20 20 20 20 20 20 73 65 74 20 72 65 73 75  ..      set resu
c560: 6c 74 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20  lt [list]....   
c570: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
c580: 65 6e 67 74 68 20 24 65 6e 75 6d 65 72 61 62 6c  ength $enumerabl
c590: 65 5d 20 3d 3d 20 30 20 7c 7c 20 24 65 6e 75 6d  e] == 0 || $enum
c5a0: 65 72 61 62 6c 65 20 65 71 20 22 6e 75 6c 6c 22  erable eq "null"
c5b0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
c5c0: 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74    return $result
c5d0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
c5e0: 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63     object foreac
c5f0: 68 20 2d 61 6c 69 61 73 20 69 74 65 6d 20 24 65  h -alias item $e
c600: 6e 75 6d 65 72 61 62 6c 65 20 7b 0d 0a 20 20 20  numerable {..   
c610: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
c620: 20 6c 65 6e 67 74 68 20 24 69 74 65 6d 5d 20 3e   length $item] >
c630: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
c640: 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65        lappend re
c650: 73 75 6c 74 20 5b 24 69 74 65 6d 20 54 6f 53 74  sult [$item ToSt
c660: 72 69 6e 67 5d 0d 0a 20 20 20 20 20 20 20 20 7d  ring]..        }
c670: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
c680: 20 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c     return $resul
c690: 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  t..    }.....   
c6a0: 20 70 72 6f 63 20 63 61 74 63 68 41 6e 64 52 65   proc catchAndRe
c6b0: 74 75 72 6e 20 7b 20 73 63 72 69 70 74 20 7b 73  turn { script {s
c6c0: 74 61 63 6b 54 72 61 63 65 20 66 61 6c 73 65 7d  tackTrace false}
c6d0: 20 7b 73 74 72 69 63 74 20 74 72 75 65 7d 20 7d   {strict true} }
c6e0: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
c6f0: 20 20 20 23 20 4e 4f 54 45 3a 20 45 76 61 6c 75     # NOTE: Evalu
c700: 61 74 65 20 74 68 65 20 73 63 72 69 70 74 20 70  ate the script p
c710: 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20 63  rovided by our c
c720: 61 6c 6c 65 72 20 69 6e 20 74 68 65 69 72 20 63  aller in their c
c730: 6f 6e 74 65 78 74 2c 0d 0a 20 20 20 20 20 20 23  ontext,..      #
c740: 20 20 20 20 20 20 20 63 61 70 74 75 72 69 6e 67         capturing
c750: 20 62 6f 74 68 20 74 68 65 20 72 65 73 75 6c 74   both the result
c760: 20 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e 20   and the return 
c770: 63 6f 64 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  code...      #..
c780: 20 20 20 20 20 20 73 65 74 20 63 6f 64 65 20 5b        set code [
c790: 63 61 74 63 68 20 7b 75 70 6c 65 76 65 6c 20 31  catch {uplevel 1
c7a0: 20 24 73 63 72 69 70 74 7d 20 72 65 73 75 6c 74   $script} result
c7b0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ]....      #..  
c7c0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 69 64 20      # NOTE: Did 
c7d0: 74 68 65 20 73 63 72 69 70 74 20 70 72 6f 76 69  the script provi
c7e0: 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65  ded by our calle
c7f0: 72 20 4e 4f 54 20 72 61 69 73 65 20 61 6e 20 65  r NOT raise an e
c800: 72 72 6f 72 3f 0d 0a 20 20 20 20 20 20 23 0d 0a  rror?..      #..
c810: 20 20 20 20 20 20 69 66 20 7b 24 73 74 72 69 63        if {$stric
c820: 74 20 26 26 20 24 63 6f 64 65 20 3d 3d 20 30 20  t && $code == 0 
c830: 7c 7c 20 21 24 73 74 72 69 63 74 20 26 26 20 24  || !$strict && $
c840: 63 6f 64 65 20 21 3d 20 31 7d 20 74 68 65 6e 20  code != 1} then 
c850: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
c860: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 75        # NOTE: Su
c870: 63 63 65 73 73 2e 20 20 52 65 74 75 72 6e 20 61  ccess.  Return a
c880: 20 6c 69 73 74 20 77 69 74 68 20 74 68 65 20 72   list with the r
c890: 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 74  eturn code and t
c8a0: 68 65 20 72 65 73 75 6c 74 2e 0d 0a 20 20 20 20  he result...    
c8b0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
c8c0: 65 74 75 72 6e 20 5b 6c 69 73 74 20 24 63 6f 64  eturn [list $cod
c8d0: 65 20 24 72 65 73 75 6c 74 5d 0d 0a 20 20 20 20  e $result]..    
c8e0: 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 73 74 61    } elseif {$sta
c8f0: 63 6b 54 72 61 63 65 7d 20 74 68 65 6e 20 7b 0d  ckTrace} then {.
c900: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
c910: 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 69 6c      # NOTE: Fail
c920: 75 72 65 2e 20 20 4f 75 72 20 63 61 6c 6c 65 72  ure.  Our caller
c930: 20 77 61 6e 74 73 20 61 20 66 75 6c 6c 20 73 74   wants a full st
c940: 61 63 6b 20 74 72 61 63 65 20 28 69 66 20 61 70  ack trace (if ap
c950: 70 6c 69 63 61 62 6c 65 29 2c 0d 0a 20 20 20 20  plicable),..    
c960: 20 20 20 20 23 20 20 20 20 20 20 20 72 65 74 75      #       retu
c970: 72 6e 20 61 20 6c 69 73 74 20 77 69 74 68 20 74  rn a list with t
c980: 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61  he return code a
c990: 6e 64 20 74 68 65 20 72 65 73 75 6c 74 20 76 65  nd the result ve
c9a0: 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20  rbatim...       
c9b0: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
c9c0: 72 6e 20 5b 6c 69 73 74 20 24 63 6f 64 65 20 24  rn [list $code $
c9d0: 72 65 73 75 6c 74 5d 0d 0a 20 20 20 20 20 20 7d  result]..      }
c9e0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
c9f0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
ca00: 54 45 3a 20 46 61 69 6c 75 72 65 2e 20 20 4f 75  TE: Failure.  Ou
ca10: 72 20 63 61 6c 6c 65 72 20 64 6f 65 73 20 6e 6f  r caller does no
ca20: 74 20 77 61 6e 74 20 61 20 66 75 6c 6c 20 73 74  t want a full st
ca30: 61 63 6b 20 74 72 61 63 65 20 28 69 66 0d 0a 20  ack trace (if.. 
ca40: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
ca50: 70 70 6c 69 63 61 62 6c 65 29 2c 20 72 65 74 75  pplicable), retu
ca60: 72 6e 20 61 20 6c 69 73 74 20 77 69 74 68 20 74  rn a list with t
ca70: 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 2c 20  he return code, 
ca80: 74 68 65 20 65 72 72 6f 72 0d 0a 20 20 20 20 20  the error..     
ca90: 20 20 20 23 20 20 20 20 20 20 20 63 6f 64 65 20     #       code 
caa0: 66 6f 72 20 74 68 65 20 69 6e 74 65 72 70 72 65  for the interpre
cab0: 74 65 72 2c 20 61 6e 64 20 74 68 65 20 65 72 72  ter, and the err
cac0: 6f 72 20 6d 65 73 73 61 67 65 20 75 70 20 74 6f  or message up to
cad0: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
cae0: 20 20 20 20 20 20 70 6f 69 6e 74 20 77 68 65 72        point wher
caf0: 65 20 74 68 65 20 73 74 61 63 6b 20 74 72 61 63  e the stack trac
cb00: 65 20 73 68 6f 75 6c 64 20 73 74 61 72 74 2e 0d  e should start..
cb10: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
cb20: 20 20 20 20 73 65 74 20 69 6e 64 65 78 20 5b 73      set index [s
cb30: 74 72 69 6e 67 20 66 69 72 73 74 20 22 20 20 20  tring first "   
cb40: 61 74 20 22 20 24 72 65 73 75 6c 74 5d 3b 20 23  at " $result]; #
cb50: 20 48 41 43 4b 3a 20 52 65 6c 69 61 62 6c 65 3f   HACK: Reliable?
cb60: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75  ....        retu
cb70: 72 6e 20 5b 6c 69 73 74 20 24 63 6f 64 65 20 24  rn [list $code $
cb80: 3a 3a 65 72 72 6f 72 43 6f 64 65 20 5b 65 78 70  ::errorCode [exp
cb90: 72 20 7b 24 69 6e 64 65 78 20 21 3d 20 2d 31 20  r {$index != -1 
cba0: 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ? \..           
cbb0: 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 5b 73   [string trim [s
cbc0: 74 72 69 6e 67 20 72 61 6e 67 65 20 24 72 65 73  tring range $res
cbd0: 75 6c 74 20 30 20 24 69 6e 64 65 78 5d 5d 20 3a  ult 0 $index]] :
cbe0: 20 24 72 65 73 75 6c 74 7d 5d 5d 0d 0a 20 20 20   $result}]]..   
cbf0: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
cc00: 20 20 20 20 70 72 6f 63 20 63 6f 6d 70 69 6c 65      proc compile
cc10: 43 53 68 61 72 70 57 69 74 68 20 7b 0d 0a 20 20  CSharpWith {..  
cc20: 20 20 20 20 20 20 20 20 20 20 74 65 78 74 20 6d            text m
cc30: 65 6d 6f 72 79 20 73 79 6d 62 6f 6c 73 20 73 74  emory symbols st
cc40: 72 69 63 74 20 72 65 73 75 6c 74 73 56 61 72 4e  rict resultsVarN
cc50: 61 6d 65 20 65 72 72 6f 72 73 56 61 72 4e 61 6d  ame errorsVarNam
cc60: 65 20 66 69 6c 65 4e 61 6d 65 73 0d 0a 20 20 20  e fileNames..   
cc70: 20 20 20 20 20 20 20 20 20 61 72 67 73 20 7d 20           args } 
cc80: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
cc90: 20 20 23 20 4e 4f 54 45 3a 20 53 69 6e 63 65 20    # NOTE: Since 
cca0: 77 65 20 61 72 65 20 67 6f 69 6e 67 20 74 6f 20  we are going to 
ccb0: 75 73 65 20 74 68 69 73 20 6d 65 74 68 6f 64 20  use this method 
ccc0: 6e 61 6d 65 20 61 20 6c 6f 74 2c 20 61 73 73 69  name a lot, assi
ccd0: 67 6e 20 69 74 20 74 6f 20 61 0d 0a 20 20 20 20  gn it to a..    
cce0: 20 20 23 20 20 20 20 20 20 20 76 61 72 69 61 62    #       variab
ccf0: 6c 65 20 66 69 72 73 74 2e 0d 0a 20 20 20 20 20  le first...     
cd00: 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 61 64   #..      set ad
cd10: 64 20 52 65 66 65 72 65 6e 63 65 64 41 73 73 65  d ReferencedAsse
cd20: 6d 62 6c 69 65 73 2e 41 64 64 0d 0a 0d 0a 20 20  mblies.Add....  
cd30: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
cd40: 4f 54 45 3a 20 43 72 65 61 74 65 20 74 68 65 20  OTE: Create the 
cd50: 62 61 73 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  base command to 
cd60: 65 76 61 6c 75 61 74 65 20 61 6e 64 20 61 64 64  evaluate and add
cd70: 20 74 68 65 20 70 72 6f 70 65 72 74 79 20 73 65   the property se
cd80: 74 74 69 6e 67 73 0d 0a 20 20 20 20 20 20 23 20  ttings..      # 
cd90: 20 20 20 20 20 20 74 68 61 74 20 61 72 65 20 61        that are a
cda0: 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 6e 65 65  lmost always nee
cdb0: 64 65 64 20 62 79 20 6f 75 72 20 75 6e 69 74 20  ded by our unit 
cdc0: 74 65 73 74 73 20 28 69 2e 65 2e 20 74 68 65 20  tests (i.e. the 
cdd0: 53 79 73 74 65 6d 0d 0a 20 20 20 20 20 20 23 20  System..      # 
cde0: 20 20 20 20 20 20 61 6e 64 20 53 79 73 74 65 6d        and System
cdf0: 2e 44 61 74 61 20 61 73 73 65 6d 62 6c 79 20 72  .Data assembly r
ce00: 65 66 65 72 65 6e 63 65 73 29 2e 0d 0a 20 20 20  eferences)...   
ce10: 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
ce20: 63 6f 6d 6d 61 6e 64 20 5b 6c 69 73 74 20 5c 0d  command [list \.
ce30: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6d 70 69  .          compi
ce40: 6c 65 43 53 68 61 72 70 20 24 74 65 78 74 20 24  leCSharp $text $
ce50: 6d 65 6d 6f 72 79 20 24 73 79 6d 62 6f 6c 73 20  memory $symbols 
ce60: 24 73 74 72 69 63 74 20 72 65 73 75 6c 74 73 20  $strict results 
ce70: 65 72 72 6f 72 73 20 5c 0d 0a 20 20 20 20 20 20  errors \..      
ce80: 20 20 20 20 24 61 64 64 20 53 79 73 74 65 6d 2e      $add System.
ce90: 64 6c 6c 20 24 61 64 64 20 53 79 73 74 65 6d 2e  dll $add System.
cea0: 44 61 74 61 2e 64 6c 6c 20 24 61 64 64 20 53 79  Data.dll $add Sy
ceb0: 73 74 65 6d 2e 54 72 61 6e 73 61 63 74 69 6f 6e  stem.Transaction
cec0: 73 2e 64 6c 6c 20 5c 0d 0a 20 20 20 20 20 20 20  s.dll \..       
ced0: 20 20 20 24 61 64 64 20 53 79 73 74 65 6d 2e 58     $add System.X
cee0: 6d 6c 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20  ml.dll]....     
cef0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
cf00: 3a 20 41 64 64 20 61 6c 6c 20 74 68 65 20 70 72  : Add all the pr
cf10: 6f 76 69 64 65 64 20 66 69 6c 65 20 6e 61 6d 65  ovided file name
cf20: 73 20 61 73 20 61 73 73 65 6d 62 6c 79 20 72 65  s as assembly re
cf30: 66 65 72 65 6e 63 65 73 2e 0d 0a 20 20 20 20 20  ferences...     
cf40: 20 23 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63   #..      foreac
cf50: 68 20 66 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  h fileName $file
cf60: 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
cf70: 20 6c 61 70 70 65 6e 64 20 63 6f 6d 6d 61 6e 64   lappend command
cf80: 20 24 61 64 64 20 5b 67 65 74 42 69 6e 61 72 79   $add [getBinary
cf90: 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61  FileName $fileNa
cfa0: 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  me]..      }....
cfb0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
cfc0: 20 4e 4f 54 45 3a 20 41 64 64 20 74 68 65 20 65   NOTE: Add the e
cfd0: 78 74 72 61 20 61 72 67 75 6d 65 6e 74 73 2c 20  xtra arguments, 
cfe0: 69 66 20 61 6e 79 2c 20 74 6f 20 74 68 65 20 63  if any, to the c
cff0: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 75 61  ommand to evalua
d000: 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  te...      #..  
d010: 20 20 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64      eval lappend
d020: 20 63 6f 6d 6d 61 6e 64 20 24 61 72 67 73 0d 0a   command $args..
d030: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
d040: 20 23 20 4e 4f 54 45 3a 20 41 6c 69 61 73 20 74   # NOTE: Alias t
d050: 68 65 20 63 6f 6d 70 69 6c 65 72 20 6c 6f 63 61  he compiler loca
d060: 6c 20 72 65 73 75 6c 74 73 20 61 6e 64 20 65 72  l results and er
d070: 72 6f 72 73 20 76 61 72 69 61 62 6c 65 73 20 74  rors variables t
d080: 6f 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  o the..      #  
d090: 20 20 20 20 20 76 61 72 69 61 62 6c 65 20 6e 61       variable na
d0a0: 6d 65 73 20 70 72 6f 76 69 64 65 64 20 62 79 20  mes provided by 
d0b0: 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20  our caller...   
d0c0: 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61     #..      upva
d0d0: 72 20 31 20 24 72 65 73 75 6c 74 73 56 61 72 4e  r 1 $resultsVarN
d0e0: 61 6d 65 20 72 65 73 75 6c 74 73 0d 0a 20 20 20  ame results..   
d0f0: 20 20 20 75 70 76 61 72 20 31 20 24 65 72 72 6f     upvar 1 $erro
d100: 72 73 56 61 72 4e 61 6d 65 20 65 72 72 6f 72 73  rsVarName errors
d110: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
d120: 20 20 20 23 20 4e 4f 54 45 3a 20 45 76 61 6c 75     # NOTE: Evalu
d130: 61 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63  ate the construc
d140: 74 65 64 20 5b 63 6f 6d 70 69 6c 65 43 53 68 61  ted [compileCSha
d150: 72 70 5d 20 63 6f 6d 6d 61 6e 64 20 61 6e 64 20  rp] command and 
d160: 72 65 74 75 72 6e 20 74 68 65 0d 0a 20 20 20 20  return the..    
d170: 20 20 23 20 20 20 20 20 20 20 72 65 73 75 6c 74    #       result
d180: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
d190: 20 20 65 76 61 6c 20 24 63 6f 6d 6d 61 6e 64 0d    eval $command.
d1a0: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
d1b0: 72 6f 63 20 69 73 4d 65 6d 6f 72 79 44 62 20 7b  roc isMemoryDb {
d1c0: 20 66 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d 0a 20   fileName } {.. 
d1d0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
d1e0: 4e 4f 54 45 3a 20 49 73 20 74 68 65 20 73 70 65  NOTE: Is the spe
d1f0: 63 69 66 69 65 64 20 64 61 74 61 62 61 73 65 20  cified database 
d200: 66 69 6c 65 20 6e 61 6d 65 20 72 65 61 6c 6c 79  file name really
d210: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
d220: 74 61 62 61 73 65 3f 0d 0a 20 20 20 20 20 20 23  tabase?..      #
d230: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b  ..      return [
d240: 65 78 70 72 20 7b 24 66 69 6c 65 4e 61 6d 65 20  expr {$fileName 
d250: 65 71 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 7c 7c  eq ":memory:" ||
d260: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
d270: 74 72 69 6e 67 20 72 61 6e 67 65 20 24 66 69 6c  tring range $fil
d280: 65 4e 61 6d 65 20 30 20 31 32 5d 20 65 71 20 22  eName 0 12] eq "
d290: 66 69 6c 65 3a 3a 6d 65 6d 6f 72 79 3a 22 7d 5d  file::memory:"}]
d2a0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
d2b0: 70 72 6f 63 20 69 73 54 61 62 6c 65 49 6e 44 62  proc isTableInDb
d2c0: 20 7b 20 6e 61 6d 65 20 7b 76 61 72 4e 61 6d 65   { name {varName
d2d0: 20 64 62 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20   db} } {..      
d2e0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
d2f0: 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 73 70   Refer to the sp
d300: 65 63 69 66 69 65 64 20 76 61 72 69 61 62 6c 65  ecified variable
d310: 20 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20   (e.g. "db") in 
d320: 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f  the context of o
d330: 75 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ur..      #     
d340: 20 20 63 61 6c 6c 65 72 2e 20 20 49 74 20 63 6f    caller.  It co
d350: 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62  ntains the datab
d360: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  ase connection h
d370: 61 6e 64 6c 65 20 74 68 61 74 20 77 69 6c 6c 20  andle that will 
d380: 62 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  be..      #     
d390: 20 20 75 73 65 64 20 74 6f 20 65 78 65 63 75 74    used to execut
d3a0: 65 20 74 68 65 20 71 75 65 72 79 20 75 73 65 64  e the query used
d3b0: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
d3c0: 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65   the named table
d3d0: 20 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20   is..      #    
d3e0: 20 20 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68     present in th
d3f0: 61 74 20 64 61 74 61 62 61 73 65 2e 0d 0a 20 20  at database...  
d400: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76      #..      upv
d410: 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 64 62  ar 1 $varName db
d420: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
d430: 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74     # NOTE: Use t
d440: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
d450: 20 74 61 62 6c 65 20 74 6f 20 64 65 74 65 72 6d   table to determ
d460: 69 6e 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64  ine if the named
d470: 20 74 61 62 6c 65 20 69 73 0d 0a 20 20 20 20 20   table is..     
d480: 20 23 20 20 20 20 20 20 20 70 72 65 73 65 6e 74   #       present
d490: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
d4a0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
d4b0: 20 20 73 65 74 20 73 71 6c 20 7b 0d 0a 20 20 20    set sql {..   
d4c0: 20 20 20 20 20 53 45 4c 45 43 54 20 43 4f 55 4e       SELECT COUN
d4d0: 54 28 2a 29 20 46 52 4f 4d 20 73 71 6c 69 74 65  T(*) FROM sqlite
d4e0: 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20 74 79  _master WHERE ty
d4f0: 70 65 20 3d 20 27 74 61 62 6c 65 27 20 41 4e 44  pe = 'table' AND
d500: 20 6e 61 6d 65 20 3d 20 3f 3b 0d 0a 20 20 20 20   name = ?;..    
d510: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
d520: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
d530: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
d540: 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65   the named table
d550: 20 69 73 20 70 72 65 73 65 6e 74 2e 0d 0a 20 20   is present...  
d560: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74      #..      ret
d570: 75 72 6e 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20  urn [expr {..   
d580: 20 20 20 20 20 5b 73 71 6c 20 65 78 65 63 75 74       [sql execut
d590: 65 20 2d 65 78 65 63 75 74 65 20 73 63 61 6c 61  e -execute scala
d5a0: 72 20 24 64 62 20 24 73 71 6c 20 5b 6c 69 73 74  r $db $sql [list
d5b0: 20 70 61 72 61 6d 31 20 53 74 72 69 6e 67 20 24   param1 String $
d5c0: 6e 61 6d 65 5d 5d 20 3e 20 30 0d 0a 20 20 20 20  name]] > 0..    
d5d0: 20 20 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a    }]..    }.....
d5e0: 20 20 20 20 70 72 6f 63 20 74 72 69 6d 53 71 6c      proc trimSql
d5f0: 20 7b 20 73 71 6c 20 7d 20 7b 0d 0a 20 20 20 20   { sql } {..    
d600: 20 20 72 65 74 75 72 6e 20 5b 72 65 67 73 75 62    return [regsub
d610: 20 2d 61 6c 6c 20 2d 2d 20 7b 5c 73 2b 7d 20 5b   -all -- {\s+} [
d620: 73 74 72 69 6e 67 20 74 72 69 6d 20 24 73 71 6c  string trim $sql
d630: 5d 20 22 20 22 5d 0d 0a 20 20 20 20 7d 0d 0a 0c  ] " "]..    }...
d640: 0d 0a 20 20 20 20 70 72 6f 63 20 65 78 65 63 75  ..    proc execu
d650: 74 65 53 71 6c 20 7b 20 73 71 6c 20 7b 65 78 65  teSql { sql {exe
d660: 63 75 74 65 20 6e 6f 6e 65 7d 20 7b 66 6f 72 6d  cute none} {form
d670: 61 74 20 6e 6f 6e 65 7d 20 7b 66 69 6c 65 4e 61  at none} {fileNa
d680: 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20  me ""} } {..    
d690: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
d6a0: 6e 67 74 68 20 24 66 69 6c 65 4e 61 6d 65 5d 20  ngth $fileName] 
d6b0: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 73 65 74 20  == 0} then {set 
d6c0: 66 69 6c 65 4e 61 6d 65 20 3a 6d 65 6d 6f 72 79  fileName :memory
d6d0: 3a 7d 0d 0a 20 20 20 20 20 20 73 65 74 75 70 44  :}..      setupD
d6e0: 62 20 24 66 69 6c 65 4e 61 6d 65 20 22 22 20 22  b $fileName "" "
d6f0: 22 20 22 22 20 22 22 20 22 22 20 66 61 6c 73 65  " "" "" "" false
d700: 20 66 61 6c 73 65 20 66 61 6c 73 65 20 66 61 6c   false false fal
d710: 73 65 20 64 62 20 74 72 75 65 0d 0a 0d 0a 20 20  se db true....  
d720: 20 20 20 20 74 72 79 20 7b 0d 0a 20 20 20 20 20      try {..     
d730: 20 20 20 72 65 74 75 72 6e 20 5b 75 70 6c 65 76     return [uplev
d740: 65 6c 20 31 20 5b 6c 69 73 74 20 5c 0d 0a 20 20  el 1 [list \..  
d750: 20 20 20 20 20 20 20 20 20 20 73 71 6c 20 65 78            sql ex
d760: 65 63 75 74 65 20 2d 65 78 65 63 75 74 65 20 24  ecute -execute $
d770: 65 78 65 63 75 74 65 20 2d 66 6f 72 6d 61 74 20  execute -format 
d780: 24 66 6f 72 6d 61 74 20 24 64 62 20 24 73 71 6c  $format $db $sql
d790: 5d 5d 0d 0a 20 20 20 20 20 20 7d 20 66 69 6e 61  ]]..      } fina
d7a0: 6c 6c 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 63  lly {..        c
d7b0: 6c 65 61 6e 75 70 44 62 20 24 66 69 6c 65 4e 61  leanupDb $fileNa
d7c0: 6d 65 20 64 62 20 66 61 6c 73 65 20 66 61 6c 73  me db false fals
d7d0: 65 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 7d  e false..      }
d7e0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
d7f0: 70 72 6f 63 20 67 65 74 43 6f 6e 6e 65 63 74 69  proc getConnecti
d800: 6f 6e 46 6c 61 67 73 20 7b 20 66 69 6c 65 4e 61  onFlags { fileNa
d810: 6d 65 20 66 6c 61 67 73 20 7b 71 75 69 65 74 20  me flags {quiet 
d820: 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20  false} } {..    
d830: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
d840: 45 3a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  E: Figure out wh
d850: 69 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c  ich database fil
d860: 65 20 6e 61 6d 65 20 6f 72 20 63 6f 6e 6e 65 63  e name or connec
d870: 74 69 6f 6e 20 73 74 72 69 6e 67 20 74 68 65 73  tion string thes
d880: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
d890: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67   connection flag
d8a0: 73 20 77 69 6c 6c 20 61 63 74 75 61 6c 6c 79 20  s will actually 
d8b0: 61 70 70 6c 79 20 74 6f 2e 20 20 54 68 69 73 20  apply to.  This 
d8c0: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
d8d0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
d8e0: 69 6e 20 71 75 69 65 74 20 6d 6f 64 65 20 62 65  in quiet mode be
d8f0: 63 61 75 73 65 20 74 68 69 73 20 69 6e 66 6f 72  cause this infor
d900: 6d 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75  mation is only u
d910: 73 65 64 20 66 6f 72 20 6c 6f 67 67 69 6e 67 0d  sed for logging.
d920: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
d930: 6e 64 20 72 65 70 6f 72 74 69 6e 67 20 70 75 72  nd reporting pur
d940: 70 6f 73 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d  poses...      #.
d950: 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69  .      if {!$qui
d960: 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
d970: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
d980: 6c 65 6e 67 74 68 20 24 66 69 6c 65 4e 61 6d 65  length $fileName
d990: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
d9a0: 20 20 20 20 20 20 20 20 20 73 65 74 20 64 61 74           set dat
d9b0: 61 62 61 73 65 20 5b 61 70 70 65 6e 64 41 72 67  abase [appendArg
d9c0: 73 20 22 66 69 6c 65 20 6e 61 6d 65 20 5c 22 22  s "file name \""
d9d0: 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5d 0d 0a   $fileName \"]..
d9e0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66          } elseif
d9f0: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
da00: 3a 64 61 74 61 53 6f 75 72 63 65 5d 20 26 26 20  :dataSource] && 
da10: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 21  \..            !
da20: 5b 61 72 72 61 79 20 65 78 69 73 74 73 20 3a 3a  [array exists ::
da30: 64 61 74 61 53 6f 75 72 63 65 5d 7d 20 74 68 65  dataSource]} the
da40: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
da50: 65 74 20 64 61 74 61 62 61 73 65 20 5b 61 70 70  et database [app
da60: 65 6e 64 41 72 67 73 20 22 64 61 74 61 20 73 6f  endArgs "data so
da70: 75 72 63 65 20 5c 22 22 20 24 3a 3a 64 61 74 61  urce \"" $::data
da80: 53 6f 75 72 63 65 20 5c 22 5d 0d 0a 20 20 20 20  Source \"]..    
da90: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
daa0: 20 20 20 20 20 20 20 20 73 65 74 20 64 61 74 61          set data
dab0: 62 61 73 65 20 3c 75 6e 6b 6e 6f 77 6e 3e 0d 0a  base <unknown>..
dac0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
dad0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
dae0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f       # NOTE: Sho
daf0: 77 20 28 61 6e 64 20 6c 6f 67 29 20 74 68 65 20  w (and log) the 
db00: 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e  local connection
db10: 20 66 6c 61 67 73 20 61 6e 64 20 74 68 65 20 61   flags and the a
db20: 73 73 6f 63 69 61 74 65 64 0d 0a 20 20 20 20 20  ssociated..     
db30: 20 23 20 20 20 20 20 20 20 64 61 74 61 20 73 6f   #       data so
db40: 75 72 63 65 20 6f 72 20 66 69 6c 65 20 6e 61 6d  urce or file nam
db50: 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
db60: 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
db70: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
db80: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
db90: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
dba0: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
dbb0: 20 22 2d 2d 2d 2d 20 6c 6f 63 61 6c 20 63 6f 6e   "---- local con
dbc0: 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 66 6f  nection flags fo
dbd0: 72 20 22 20 24 64 61 74 61 62 61 73 65 20 5c 0d  r " $database \.
dbe0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 20 61  .            " a
dbf0: 72 65 3a 20 22 20 5b 65 78 70 72 20 7b 5b 73 74  re: " [expr {[st
dc00: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 6c 61  ring length $fla
dc10: 67 73 5d 20 3e 20 30 20 3f 20 5c 0d 0a 20 20 20  gs] > 0 ? \..   
dc20: 20 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64           [append
dc30: 41 72 67 73 20 5c 22 20 24 66 6c 61 67 73 20 5c  Args \" $flags \
dc40: 22 5d 20 3a 20 22 3c 6e 6f 6e 65 3e 22 7d 5d 20  "] : "<none>"}] 
dc50: 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  \n]..      }....
dc60: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
dc70: 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 72 65 20   NOTE: If there 
dc80: 61 72 65 20 61 6e 79 20 67 6c 6f 62 61 6c 20 28  are any global (
dc90: 70 65 72 20 74 65 73 74 20 72 75 6e 29 20 63 6f  per test run) co
dca0: 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 63  nnection flags c
dcb0: 75 72 72 65 6e 74 6c 79 0d 0a 20 20 20 20 20 20  urrently..      
dcc0: 23 20 20 20 20 20 20 20 73 65 74 2c 20 75 73 65  #       set, use
dcd0: 20 74 68 65 6d 20 6e 6f 77 20 28 69 2e 65 2e 20   them now (i.e. 
dce0: 62 79 20 63 6f 6d 62 69 6e 69 6e 67 20 74 68 65  by combining the
dcf0: 6d 20 77 69 74 68 20 74 68 65 20 6f 6e 65 73 20  m with the ones 
dd00: 66 6f 72 20 74 68 69 73 0d 0a 20 20 20 20 20 20  for this..      
dd10: 23 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69  #       connecti
dd20: 6f 6e 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  on)...      #.. 
dd30: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
dd40: 78 69 73 74 73 20 3a 3a 63 6f 6e 6e 65 63 74 69  xists ::connecti
dd50: 6f 6e 5f 66 6c 61 67 73 5d 20 26 26 20 5c 0d 0a  on_flags] && \..
dd60: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
dd70: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 63 6f 6e 6e  g length $::conn
dd80: 65 63 74 69 6f 6e 5f 66 6c 61 67 73 5d 20 3e 20  ection_flags] > 
dd90: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
dda0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
ddb0: 4e 4f 54 45 3a 20 53 68 6f 77 20 28 61 6e 64 20  NOTE: Show (and 
ddc0: 6c 6f 67 29 20 74 68 65 20 64 65 74 65 63 74 65  log) the detecte
ddd0: 64 20 67 6c 6f 62 61 6c 20 63 6f 6e 6e 65 63 74  d global connect
dde0: 69 6f 6e 20 66 6c 61 67 73 2e 0d 0a 20 20 20 20  ion flags...    
ddf0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
de00: 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
de10: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
de20: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
de30: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
de40: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
de50: 20 22 2d 2d 2d 2d 20 67 6c 6f 62 61 6c 20 63 6f   "---- global co
de60: 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 64  nnection flags d
de70: 65 74 65 63 74 65 64 3a 20 22 20 5c 0d 0a 20 20  etected: " \..  
de80: 20 20 20 20 20 20 20 20 20 20 20 20 5b 65 78 70              [exp
de90: 72 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  r {[info exists 
dea0: 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61  ::connection_fla
deb0: 67 73 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  gs] && \..      
dec0: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
ded0: 6c 65 6e 67 74 68 20 24 3a 3a 63 6f 6e 6e 65 63  length $::connec
dee0: 74 69 6f 6e 5f 66 6c 61 67 73 5d 20 3e 20 30 20  tion_flags] > 0 
def0: 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ? \..           
df00: 20 20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c     [appendArgs \
df10: 22 20 24 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f  " $::connection_
df20: 66 6c 61 67 73 20 5c 22 5d 20 3a 20 22 3c 6e 6f  flags \"] : "<no
df30: 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20  ne>"}] \n]..    
df40: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
df50: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
df60: 54 45 3a 20 43 6f 6d 62 69 6e 65 20 61 6e 64 2f  TE: Combine and/
df70: 6f 72 20 72 65 70 6c 61 63 65 20 74 68 65 20 63  or replace the c
df80: 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20  onnection flags 
df90: 61 6e 64 20 74 68 65 6e 20 73 68 6f 77 20 74 68  and then show th
dfa0: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
dfb0: 20 20 20 6e 65 77 20 76 61 6c 75 65 2e 0d 0a 20     new value... 
dfc0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
dfd0: 20 20 73 65 74 20 66 6c 61 67 73 20 5b 63 6f 6d    set flags [com
dfe0: 62 69 6e 65 46 6c 61 67 73 20 24 66 6c 61 67 73  bineFlags $flags
dff0: 20 24 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66   $::connection_f
e000: 6c 61 67 73 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  lags]....       
e010: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
e020: 54 45 3a 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f  TE: Show (and lo
e030: 67 29 20 74 68 65 20 6e 65 77 20 65 66 66 65 63  g) the new effec
e040: 74 69 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  tive connection 
e050: 66 6c 61 67 73 2e 0d 0a 20 20 20 20 20 20 20 20  flags...        
e060: 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  #..        if {!
e070: 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
e080: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
e090: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
e0a0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
e0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
e0c0: 2d 2d 20 63 6f 6d 62 69 6e 65 64 20 63 6f 6e 6e  -- combined conn
e0d0: 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 66 6f 72  ection flags for
e0e0: 20 22 20 24 64 61 74 61 62 61 73 65 20 5c 0d 0a   " $database \..
e0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
e100: 61 72 65 3a 20 22 20 5b 65 78 70 72 20 7b 5b 73  are: " [expr {[s
e110: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 6c  tring length $fl
e120: 61 67 73 5d 20 3e 20 30 20 3f 20 5c 0d 0a 20 20  ags] > 0 ? \..  
e130: 20 20 20 20 20 20 20 20 20 20 20 20 5b 61 70 70              [app
e140: 65 6e 64 41 72 67 73 20 5c 22 20 24 66 6c 61 67  endArgs \" $flag
e150: 73 20 5c 22 5d 20 3a 20 22 3c 6e 6f 6e 65 3e 22  s \"] : "<none>"
e160: 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  }] \n]..        
e170: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
e180: 20 20 20 20 72 65 74 75 72 6e 20 24 66 6c 61 67      return $flag
e190: 73 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  s..    }.....   
e1a0: 20 70 72 6f 63 20 67 65 74 46 6c 61 67 73 50 72   proc getFlagsPr
e1b0: 6f 70 65 72 74 79 20 7b 20 7b 66 6c 61 67 73 20  operty { {flags 
e1c0: 22 22 7d 20 7b 71 75 69 65 74 20 66 61 6c 73 65  ""} {quiet false
e1d0: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
e1e0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 65        # NOTE: De
e1f0: 74 65 72 6d 69 6e 65 20 77 68 61 74 20 74 68 65  termine what the
e200: 20 63 6f 6d 62 69 6e 65 64 20 28 67 6c 6f 62 61   combined (globa
e210: 6c 20 61 6e 64 20 6c 6f 63 61 6c 29 20 63 6f 6e  l and local) con
e220: 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23  nection..      #
e230: 20 20 20 20 20 20 20 66 6c 61 67 73 20 73 68 6f         flags sho
e240: 75 6c 64 20 62 65 2c 20 70 6f 73 73 69 62 6c 79  uld be, possibly
e250: 20 71 75 69 65 74 6c 79 2e 0d 0a 20 20 20 20 20   quietly...     
e260: 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 66 6c   #..      set fl
e270: 61 67 73 20 5b 67 65 74 43 6f 6e 6e 65 63 74 69  ags [getConnecti
e280: 6f 6e 46 6c 61 67 73 20 22 22 20 24 66 6c 61 67  onFlags "" $flag
e290: 73 20 24 71 75 69 65 74 5d 0d 0a 0d 0a 20 20 20  s $quiet]....   
e2a0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
e2b0: 54 45 3a 20 49 66 20 6e 6f 20 67 6c 6f 62 61 6c  TE: If no global
e2c0: 20 6f 72 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63   or local connec
e2d0: 74 69 6f 6e 20 66 6c 61 67 73 20 77 65 72 65 20  tion flags were 
e2e0: 73 70 65 63 69 66 69 65 64 2c 20 74 68 65 0d 0a  specified, the..
e2f0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 65        #       de
e300: 66 61 75 6c 74 20 63 6f 6e 6e 65 63 74 69 6f 6e  fault connection
e310: 20 66 6c 61 67 73 20 73 68 6f 75 6c 64 20 62 65   flags should be
e320: 20 75 73 65 64 3b 20 74 68 65 72 65 66 6f 72 65   used; therefore
e330: 2c 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20  , return..      
e340: 23 20 20 20 20 20 20 20 61 6e 20 65 6d 70 74 79  #       an empty
e350: 20 73 74 72 69 6e 67 20 69 6e 20 74 68 61 74 20   string in that 
e360: 63 61 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  case...      #..
e370: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
e380: 67 20 6c 65 6e 67 74 68 20 24 66 6c 61 67 73 5d  g length $flags]
e390: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
e3a0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22         return ""
e3b0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
e3c0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
e3d0: 54 45 3a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20  TE: In order to 
e3e0: 63 68 65 63 6b 20 69 66 20 74 68 65 20 64 65 66  check if the def
e3f0: 61 75 6c 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ault connection 
e400: 66 6c 61 67 73 20 61 72 65 20 62 65 69 6e 67 20  flags are being 
e410: 75 73 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20  used..      #   
e420: 20 20 20 20 69 74 20 69 73 20 6e 65 63 65 73 73      it is necess
e430: 61 72 79 20 74 6f 20 61 74 74 65 6d 70 74 20 61  ary to attempt a
e440: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74 6f 20 74   conversion to t
e450: 68 65 20 61 63 74 75 61 6c 20 65 6e 75 6d 65 72  he actual enumer
e460: 61 74 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20  ated..      #   
e470: 20 20 20 20 74 79 70 65 2e 20 20 46 61 69 6c 69      type.  Faili
e480: 6e 67 20 74 68 61 74 2c 20 74 68 65 20 63 68 65  ng that, the che
e490: 63 6b 20 61 67 61 69 6e 73 74 20 74 68 65 20 64  ck against the d
e4a0: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 77 69 6c  efault value wil
e4b0: 6c 20 62 65 0d 0a 20 20 20 20 20 20 23 20 20 20  l be..      #   
e4c0: 20 20 20 20 73 6b 69 70 70 65 64 2e 0d 0a 20 20      skipped...  
e4d0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
e4e0: 20 65 72 72 6f 72 20 6e 75 6c 6c 3b 20 23 20 49   error null; # I
e4f0: 47 4e 4f 52 45 44 0d 0a 20 20 20 20 20 20 73 65  GNORED..      se
e500: 74 20 76 61 6c 75 65 20 5b 6f 62 6a 65 63 74 20  t value [object 
e510: 69 6e 76 6f 6b 65 20 55 74 69 6c 69 74 79 20 54  invoke Utility T
e520: 72 79 50 61 72 73 65 46 6c 61 67 73 45 6e 75 6d  ryParseFlagsEnum
e530: 20 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   "" \..         
e540: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
e550: 69 74 65 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63  ite.SQLiteConnec
e560: 74 69 6f 6e 46 6c 61 67 73 20 22 22 20 24 66 6c  tionFlags "" $fl
e570: 61 67 73 20 6e 75 6c 6c 20 74 72 75 65 20 5c 0d  ags null true \.
e580: 0a 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72  .          error
e590: 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ]....      #..  
e5a0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74      # NOTE: If t
e5b0: 68 65 20 63 6f 6d 62 69 6e 65 64 20 66 6c 61 67  he combined flag
e5c0: 73 20 73 74 72 69 6e 67 20 63 6f 75 6c 64 20 6e  s string could n
e5d0: 6f 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 63  ot actually be c
e5e0: 6f 6e 76 65 72 74 65 64 0d 0a 20 20 20 20 20 20  onverted..      
e5f0: 23 20 20 20 20 20 20 20 74 6f 20 74 68 65 20 65  #       to the e
e600: 6e 75 6d 65 72 61 74 65 64 20 74 79 70 65 20 69  numerated type i
e610: 74 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  t is the default
e620: 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 6a 75 73   value, then jus
e630: 74 20 75 73 65 0d 0a 20 20 20 20 20 20 23 20 20  t use..      #  
e640: 20 20 20 20 20 69 74 20 76 65 72 62 61 74 69 6d       it verbatim
e650: 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 6a 75 73  ; otherwise, jus
e660: 74 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74  t return an empt
e670: 79 20 73 74 72 69 6e 67 2e 20 20 49 6e 20 74 68  y string.  In th
e680: 61 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  at..      #     
e690: 20 20 63 61 73 65 2c 20 74 68 65 20 64 65 66 61    case, the defa
e6a0: 75 6c 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  ult connection f
e6b0: 6c 61 67 73 20 77 69 6c 6c 20 62 65 20 75 73 65  lags will be use
e6c0: 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  d...      #..   
e6d0: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
e6e0: 65 6e 67 74 68 20 24 76 61 6c 75 65 5d 20 3d 3d  ength $value] ==
e6f0: 20 30 20 7c 7c 20 24 76 61 6c 75 65 20 6e 65 20   0 || $value ne 
e700: 22 44 65 66 61 75 6c 74 22 7d 20 74 68 65 6e 20  "Default"} then 
e710: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
e720: 20 20 20 20 20 20 23 20 57 41 52 4e 49 4e 47 3a        # WARNING:
e730: 20 54 68 69 73 20 72 65 74 75 72 6e 73 20 74 68   This returns th
e740: 65 20 73 74 72 69 6e 67 20 76 61 6c 75 65 20 6f  e string value o
e750: 66 20 74 68 65 20 63 6f 6d 62 69 6e 65 64 20 66  f the combined f
e760: 6c 61 67 73 2c 20 6e 6f 74 0d 0a 20 20 20 20 20  lags, not..     
e770: 20 20 20 23 20 20 20 20 20 20 20 20 20 20 74 68     #          th
e780: 65 20 65 6e 75 6d 65 72 61 74 65 64 20 76 61 6c  e enumerated val
e790: 75 65 2e 20 20 54 68 69 73 20 69 73 20 62 79 20  ue.  This is by 
e7a0: 64 65 73 69 67 6e 20 61 6e 64 20 73 68 6f 75 6c  design and shoul
e7b0: 64 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20 23  d not..        #
e7c0: 20 20 20 20 20 20 20 20 20 20 62 65 20 63 68 61            be cha
e7d0: 6e 67 65 64 20 77 69 74 68 6f 75 74 20 63 61 72  nged without car
e7e0: 65 66 75 6c 20 63 6f 6e 73 69 64 65 72 61 74 69  eful considerati
e7f0: 6f 6e 20 28 65 2e 67 2e 20 69 74 20 77 6f 75 6c  on (e.g. it woul
e800: 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  d..        #    
e810: 20 20 20 20 20 20 70 72 65 76 65 6e 74 20 74 68        prevent th
e820: 65 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69  e SQLiteConnecti
e830: 6f 6e 20 63 6c 61 73 73 20 66 72 6f 6d 20 61 6c  on class from al
e840: 6c 6f 77 69 6e 67 20 69 6e 76 61 6c 69 64 0d 0a  lowing invalid..
e850: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
e860: 20 20 20 5b 22 6d 61 67 69 63 61 6c 22 5d 20 6d     ["magical"] m
e870: 65 74 61 2d 66 6c 61 67 73 29 2e 0d 0a 20 20 20  eta-flags)...   
e880: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
e890: 72 65 74 75 72 6e 20 5b 61 70 70 65 6e 64 41 72  return [appendAr
e8a0: 67 73 20 22 46 6c 61 67 73 3d 22 20 24 66 6c 61  gs "Flags=" $fla
e8b0: 67 73 20 5c 3b 5d 0d 0a 20 20 20 20 20 20 7d 0d  gs \;]..      }.
e8c0: 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
e8d0: 22 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  ""..    }.....  
e8e0: 20 20 70 72 6f 63 20 73 65 74 75 70 44 62 20 7b    proc setupDb {
e8f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 69  ..            fi
e900: 6c 65 4e 61 6d 65 20 7b 6d 6f 64 65 20 22 22 7d  leName {mode ""}
e910: 20 7b 64 61 74 65 54 69 6d 65 46 6f 72 6d 61 74   {dateTimeFormat
e920: 20 22 22 7d 20 7b 64 61 74 65 54 69 6d 65 4b 69   ""} {dateTimeKi
e930: 6e 64 20 22 22 7d 20 7b 66 6c 61 67 73 20 22 22  nd ""} {flags ""
e940: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  }..            {
e950: 65 78 74 72 61 20 22 22 7d 20 7b 71 75 61 6c 69  extra ""} {quali
e960: 66 79 20 74 72 75 65 7d 20 7b 64 65 6c 65 74 65  fy true} {delete
e970: 20 74 72 75 65 7d 20 7b 75 72 69 20 66 61 6c 73   true} {uri fals
e980: 65 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e}..            
e990: 7b 74 65 6d 70 6f 72 61 72 79 20 74 72 75 65 7d  {temporary true}
e9a0: 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20 7b 71   {varName db} {q
e9b0: 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  uiet false} } {.
e9c0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
e9d0: 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20 73  # NOTE: First, s
e9e0: 65 65 20 69 66 20 6f 75 72 20 63 61 6c 6c 65 72  ee if our caller
e9f0: 20 68 61 73 20 72 65 71 75 65 73 74 65 64 20 61   has requested a
ea00: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
ea10: 62 61 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  base...      #..
ea20: 20 20 20 20 20 20 73 65 74 20 69 73 4d 65 6d 6f        set isMemo
ea30: 72 79 20 5b 69 73 4d 65 6d 6f 72 79 44 62 20 24  ry [isMemoryDb $
ea40: 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20  fileName]....   
ea50: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
ea60: 54 45 3a 20 46 6f 72 20 6e 6f 77 2c 20 61 6c 6c  TE: For now, all
ea70: 20 74 65 73 74 20 64 61 74 61 62 61 73 65 73 20   test databases 
ea80: 75 73 65 64 20 62 79 20 74 68 65 20 74 65 73 74  used by the test
ea90: 20 73 75 69 74 65 20 61 72 65 20 70 6c 61 63 65   suite are place
eaa0: 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
eab0: 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
eac0: 73 65 20 64 69 72 65 63 74 6f 72 79 2e 20 20 45  se directory.  E
ead0: 61 63 68 20 64 61 74 61 62 61 73 65 20 61 6e 64  ach database and
eae0: 20 72 65 6c 61 74 65 64 20 66 69 6c 65 73 0d 0a   related files..
eaf0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73        #       us
eb00: 65 64 20 62 79 20 61 20 74 65 73 74 20 73 68 6f  ed by a test sho
eb10: 75 6c 64 20 62 65 20 63 6c 65 61 6e 65 64 20 75  uld be cleaned u
eb20: 70 20 62 79 20 74 68 61 74 20 74 65 73 74 20 75  p by that test u
eb30: 73 69 6e 67 20 74 68 65 0d 0a 20 20 20 20 20 20  sing the..      
eb40: 23 20 20 20 20 20 20 20 22 63 6c 65 61 6e 75 70  #       "cleanup
eb50: 44 62 22 20 70 72 6f 63 65 64 75 72 65 2c 20 62  Db" procedure, b
eb60: 65 6c 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  elow...      #..
eb70: 20 20 20 20 20 20 69 66 20 7b 21 24 69 73 4d 65        if {!$isMe
eb80: 6d 6f 72 79 20 26 26 20 24 71 75 61 6c 69 66 79  mory && $qualify
eb90: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
eba0: 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b    set fileName [
ebb0: 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 44 61  file join [getDa
ebc0: 74 61 62 61 73 65 44 69 72 65 63 74 6f 72 79 5d  tabaseDirectory]
ebd0: 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c   [file tail $fil
ebe0: 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 20 20 7d  eName]]..      }
ebf0: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
ec00: 20 20 20 23 20 4e 4f 54 45 3a 20 42 79 20 64 65     # NOTE: By de
ec10: 66 61 75 6c 74 2c 20 64 65 6c 65 74 65 20 61 6e  fault, delete an
ec20: 79 20 70 72 65 2d 65 78 69 73 74 69 6e 67 20 64  y pre-existing d
ec30: 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65  atabase with the
ec40: 20 73 61 6d 65 20 66 69 6c 65 0d 0a 20 20 20 20   same file..    
ec50: 20 20 23 20 20 20 20 20 20 20 6e 61 6d 65 20 69    #       name i
ec60: 66 20 69 74 20 63 75 72 72 65 6e 74 6c 79 20 65  f it currently e
ec70: 78 69 73 74 73 2e 0d 0a 20 20 20 20 20 20 23 0d  xists...      #.
ec80: 0a 20 20 20 20 20 20 69 66 20 7b 21 24 69 73 4d  .      if {!$isM
ec90: 65 6d 6f 72 79 20 26 26 20 24 64 65 6c 65 74 65  emory && $delete
eca0: 20 26 26 20 5b 66 69 6c 65 20 65 78 69 73 74 73   && [file exists
ecb0: 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65   $fileName]} the
ecc0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
ecd0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
ece0: 41 74 74 65 6d 70 74 20 74 6f 20 64 65 6c 65 74  Attempt to delet
ecf0: 65 20 61 6e 79 20 70 72 65 2d 65 78 69 73 74 69  e any pre-existi
ed00: 6e 67 20 64 61 74 61 62 61 73 65 20 77 69 74 68  ng database with
ed10: 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 0d 0a   the same file..
ed20: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
ed30: 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  name...        #
ed40: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
ed50: 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74  atch {file delet
ed60: 65 20 24 66 69 6c 65 4e 61 6d 65 7d 20 65 72 72  e $fileName} err
ed70: 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
ed80: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
ed90: 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73      # NOTE: We s
eda0: 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f  omehow failed to
edb0: 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65   delete the file
edc0: 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20  , report why... 
edd0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
ede0: 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
edf0: 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
ee00: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
ee10: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
ee20: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
ee30: 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
ee40: 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
ee50: 64 20 74 6f 20 64 65 6c 65 74 65 20 64 61 74 61  d to delete data
ee60: 62 61 73 65 20 66 69 6c 65 20 5c 22 22 20 24 66  base file \"" $f
ee70: 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20  ileName \..     
ee80: 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 64             "\" d
ee90: 75 72 69 6e 67 20 73 65 74 75 70 2c 20 65 72 72  uring setup, err
eea0: 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f  or: " \n\t $erro
eeb0: 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  r \n]..         
eec0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
eed0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
eee0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
eef0: 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 73 70   Refer to the sp
ef00: 65 63 69 66 69 65 64 20 76 61 72 69 61 62 6c 65  ecified variable
ef10: 20 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20   (e.g. "db") in 
ef20: 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f  the context of o
ef30: 75 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ur..      #     
ef40: 20 20 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 68    caller.  The h
ef50: 61 6e 64 6c 65 20 74 6f 20 74 68 65 20 6f 70 65  andle to the ope
ef60: 6e 65 64 20 64 61 74 61 62 61 73 65 20 77 69 6c  ned database wil
ef70: 6c 20 62 65 20 73 74 6f 72 65 64 20 74 68 65 72  l be stored ther
ef80: 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
ef90: 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e     upvar 1 $varN
efa0: 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20  ame db....      
efb0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
efc0: 20 53 74 61 72 74 20 62 75 69 6c 64 69 6e 67 20   Start building 
efd0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  the connection s
efe0: 74 72 69 6e 67 2e 20 20 54 68 65 20 6f 6e 6c 79  tring.  The only
eff0: 20 72 65 71 75 69 72 65 64 20 70 6f 72 74 69 6f   required portio
f000: 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  n..      #      
f010: 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   of the connecti
f020: 6f 6e 20 73 74 72 69 6e 67 20 69 73 20 74 68 65  on string is the
f030: 20 64 61 74 61 20 73 6f 75 72 63 65 2c 20 77 68   data source, wh
f040: 69 63 68 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ich contains the
f050: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
f060: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
f070: 6d 65 20 69 74 73 65 6c 66 2e 20 20 49 66 20 6f  me itself.  If o
f080: 75 72 20 63 61 6c 6c 65 72 20 77 61 6e 74 73 20  ur caller wants 
f090: 74 6f 20 75 73 65 20 61 20 55 52 49 20 61 73 0d  to use a URI as.
f0a0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
f0b0: 68 65 20 64 61 74 61 20 73 6f 75 72 63 65 2c 20  he data source, 
f0c0: 75 73 65 20 74 68 65 20 46 75 6c 6c 55 72 69 20  use the FullUri 
f0d0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e  connection strin
f0e0: 67 20 70 72 6f 70 65 72 74 79 20 74 6f 0d 0a 20  g property to.. 
f0f0: 20 20 20 20 20 23 20 20 20 20 20 20 20 70 72 65       #       pre
f100: 76 65 6e 74 20 74 68 65 20 64 61 74 61 20 73 6f  vent the data so
f110: 75 72 63 65 20 73 74 72 69 6e 67 20 66 72 6f 6d  urce string from
f120: 20 62 65 69 6e 67 20 6d 61 6e 67 6c 65 64 2e 0d   being mangled..
f130: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
f140: 69 66 20 7b 24 75 72 69 7d 20 74 68 65 6e 20 7b  if {$uri} then {
f150: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f  ..        set co
f160: 6e 6e 65 63 74 69 6f 6e 20 7b 46 75 6c 6c 55 72  nnection {FullUr
f170: 69 3d 24 7b 66 69 6c 65 4e 61 6d 65 7d 7d 0d 0a  i=${fileName}}..
f180: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
f190: 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 6e 6e          set conn
f1a0: 65 63 74 69 6f 6e 20 7b 44 61 74 61 20 53 6f 75  ection {Data Sou
f1b0: 72 63 65 3d 24 7b 66 69 6c 65 4e 61 6d 65 7d 7d  rce=${fileName}}
f1c0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
f1d0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
f1e0: 54 45 3a 20 53 69 6e 63 65 20 74 68 69 73 20 70  TE: Since this p
f1f0: 72 6f 63 65 64 75 72 65 20 68 61 73 20 6e 6f 20  rocedure has no 
f200: 73 70 65 63 69 61 6c 20 6b 6e 6f 77 6c 65 64 67  special knowledg
f210: 65 20 6f 66 20 77 68 61 74 20 74 68 65 20 64 65  e of what the de
f220: 66 61 75 6c 74 0d 0a 20 20 20 20 20 20 23 20 20  fault..      #  
f230: 20 20 20 20 20 73 65 74 74 69 6e 67 20 69 73 20       setting is 
f240: 66 6f 72 20 74 68 65 20 54 6f 46 75 6c 6c 50 61  for the ToFullPa
f250: 74 68 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74  th connection st
f260: 72 69 6e 67 20 70 72 6f 70 65 72 79 2c 20 61 6c  ring propery, al
f270: 77 61 79 73 0d 0a 20 20 20 20 20 20 23 20 20 20  ways..      #   
f280: 20 20 20 20 61 64 64 20 74 68 65 20 76 61 6c 75      add the valu
f290: 65 20 77 65 20 6b 6e 6f 77 20 61 62 6f 75 74 20  e we know about 
f2a0: 74 6f 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  to the connectio
f2b0: 6e 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20  n string...     
f2c0: 20 23 0d 0a 20 20 20 20 20 20 61 70 70 65 6e 64   #..      append
f2d0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 54 6f   connection {;To
f2e0: 46 75 6c 6c 50 61 74 68 3d 24 7b 71 75 61 6c 69  FullPath=${quali
f2f0: 66 79 7d 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  fy}}....      #.
f300: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
f310: 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 73 70 65  f our caller spe
f320: 63 69 66 69 65 64 20 61 20 6a 6f 75 72 6e 61 6c  cified a journal
f330: 20 6d 6f 64 65 2c 20 61 64 64 20 74 68 65 20 6e   mode, add the n
f340: 65 63 65 73 73 61 72 79 20 70 6f 72 74 69 6f 6e  ecessary portion
f350: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
f360: 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  of the connectio
f370: 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20  n string now... 
f380: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
f390: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
f3a0: 20 24 6d 6f 64 65 5d 20 3e 20 30 7d 20 74 68 65   $mode] > 0} the
f3b0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70  n {..        app
f3c0: 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b  end connection {
f3d0: 3b 4a 6f 75 72 6e 61 6c 20 4d 6f 64 65 3d 24 7b  ;Journal Mode=${
f3e0: 6d 6f 64 65 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d  mode}}..      }.
f3f0: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
f400: 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72    # NOTE: If our
f410: 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65   caller specifie
f420: 64 20 61 20 44 61 74 65 54 69 6d 65 20 66 6f 72  d a DateTime for
f430: 6d 61 74 2c 20 61 64 64 20 74 68 65 20 6e 65 63  mat, add the nec
f440: 65 73 73 61 72 79 0d 0a 20 20 20 20 20 20 23 20  essary..      # 
f450: 20 20 20 20 20 20 70 6f 72 74 69 6f 6e 20 6f 66        portion of
f460: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
f470: 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20  string now...   
f480: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
f490: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
f4a0: 64 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 5d 20  dateTimeFormat] 
f4b0: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
f4c0: 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e       append conn
f4d0: 65 63 74 69 6f 6e 20 7b 3b 44 61 74 65 54 69 6d  ection {;DateTim
f4e0: 65 46 6f 72 6d 61 74 3d 24 7b 64 61 74 65 54 69  eFormat=${dateTi
f4f0: 6d 65 46 6f 72 6d 61 74 7d 7d 0d 0a 20 20 20 20  meFormat}}..    
f500: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
f510: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
f520: 20 6f 75 72 20 63 61 6c 6c 65 72 20 73 70 65 63   our caller spec
f530: 69 66 69 65 64 20 61 20 44 61 74 65 54 69 6d 65  ified a DateTime
f540: 4b 69 6e 64 2c 20 61 64 64 20 74 68 65 20 6e 65  Kind, add the ne
f550: 63 65 73 73 61 72 79 20 70 6f 72 74 69 6f 6e 0d  cessary portion.
f560: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f  .      #       o
f570: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
f580: 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20   string now...  
f590: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
f5a0: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
f5b0: 24 64 61 74 65 54 69 6d 65 4b 69 6e 64 5d 20 3e  $dateTimeKind] >
f5c0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
f5d0: 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65      append conne
f5e0: 63 74 69 6f 6e 20 7b 3b 44 61 74 65 54 69 6d 65  ction {;DateTime
f5f0: 4b 69 6e 64 3d 24 7b 64 61 74 65 54 69 6d 65 4b  Kind=${dateTimeK
f600: 69 6e 64 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a  ind}}..      }..
f610: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
f620: 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20   # NOTE: Figure 
f630: 6f 75 74 20 77 68 61 74 20 74 68 65 20 66 69 6e  out what the fin
f640: 61 6c 20 66 6c 61 67 73 20 66 6f 72 20 74 68 69  al flags for thi
f650: 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 65 65  s connection nee
f660: 64 20 74 6f 20 62 65 2e 0d 0a 20 20 20 20 20 20  d to be...      
f670: 23 0d 0a 20 20 20 20 20 20 73 65 74 20 66 6c 61  #..      set fla
f680: 67 73 20 5b 67 65 74 43 6f 6e 6e 65 63 74 69 6f  gs [getConnectio
f690: 6e 46 6c 61 67 73 20 24 66 69 6c 65 4e 61 6d 65  nFlags $fileName
f6a0: 20 24 66 6c 61 67 73 20 24 71 75 69 65 74 5d 0d   $flags $quiet].
f6b0: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
f6c0: 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72    # NOTE: If our
f6d0: 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65   caller specifie
f6e0: 64 20 73 6f 6d 65 20 53 51 4c 69 74 65 43 6f 6e  d some SQLiteCon
f6f0: 6e 65 63 74 69 6f 6e 46 6c 61 67 73 2c 20 61 64  nectionFlags, ad
f700: 64 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  d the..      #  
f710: 20 20 20 20 20 6e 65 63 65 73 73 61 72 79 20 70       necessary p
f720: 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f  ortion of the co
f730: 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20  nnection string 
f740: 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  now...      #.. 
f750: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
f760: 20 6c 65 6e 67 74 68 20 24 66 6c 61 67 73 5d 20   length $flags] 
f770: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
f780: 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e       append conn
f790: 65 63 74 69 6f 6e 20 7b 3b 46 6c 61 67 73 3d 24  ection {;Flags=$
f7a0: 7b 66 6c 61 67 73 7d 7d 0d 0a 20 20 20 20 20 20  {flags}}..      
f7b0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
f7c0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f      # NOTE: If o
f7d0: 75 72 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66  ur caller specif
f7e0: 69 65 64 20 61 6e 20 65 78 74 72 61 20 70 61 79  ied an extra pay
f7f0: 6c 6f 61 64 20 74 6f 20 74 68 65 20 63 6f 6e 6e  load to the conn
f800: 65 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20  ection..      # 
f810: 20 20 20 20 20 20 73 74 72 69 6e 67 2c 20 61 70        string, ap
f820: 70 65 6e 64 20 69 74 20 6e 6f 77 2e 0d 0a 20 20  pend it now...  
f830: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
f840: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
f850: 24 65 78 74 72 61 5d 20 3e 20 30 7d 20 74 68 65  $extra] > 0} the
f860: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70  n {..        app
f870: 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c  end connection \
f880: 3b 20 24 65 78 74 72 61 0d 0a 20 20 20 20 20 20  ; $extra..      
f890: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
f8a0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 4f 70 65 6e      # NOTE: Open
f8b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
f8c0: 6e 6e 65 63 74 69 6f 6e 20 6e 6f 77 2c 20 70 6c  nnection now, pl
f8d0: 61 63 69 6e 67 20 74 68 65 20 6f 70 61 71 75 65  acing the opaque
f8e0: 20 68 61 6e 64 6c 65 20 76 61 6c 75 65 0d 0a 20   handle value.. 
f8f0: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 74       #       int
f900: 6f 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 73  o the variable s
f910: 70 65 63 69 66 69 65 64 20 62 79 20 6f 75 72 20  pecified by our 
f920: 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23  caller...      #
f930: 0d 0a 20 20 20 20 20 20 73 65 74 20 64 62 20 5b  ..      set db [
f940: 73 71 6c 20 6f 70 65 6e 20 2d 74 79 70 65 20 53  sql open -type S
f950: 51 4c 69 74 65 20 5b 73 75 62 73 74 20 24 63 6f  QLite [subst $co
f960: 6e 6e 65 63 74 69 6f 6e 5d 5d 0d 0a 0d 0a 20 20  nnection]]....  
f970: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
f980: 4f 54 45 3a 20 43 6f 6e 66 69 67 75 72 65 20 74  OTE: Configure t
f990: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72  he temporary dir
f9a0: 65 63 74 6f 72 79 20 66 6f 72 20 74 68 65 20 6e  ectory for the n
f9b0: 65 77 6c 79 20 6f 70 65 6e 65 64 20 64 61 74 61  ewly opened data
f9c0: 62 61 73 65 0d 0a 20 20 20 20 20 20 23 20 20 20  base..      #   
f9d0: 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e      connection n
f9e0: 6f 77 20 75 6e 6c 65 73 73 20 6f 75 72 20 63 61  ow unless our ca
f9f0: 6c 6c 65 72 20 66 6f 72 62 69 64 73 20 69 74 2e  ller forbids it.
fa00: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
fa10: 20 69 66 20 7b 24 74 65 6d 70 6f 72 61 72 79 20   if {$temporary 
fa20: 26 26 20 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  && ![info exists
fa30: 20 3a 3a 6e 6f 28 73 65 74 54 65 6d 70 6f 72 61   ::no(setTempora
fa40: 72 79 44 69 72 65 63 74 6f 72 79 29 5d 7d 20 74  ryDirectory)]} t
fa50: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  hen {..        s
fa60: 71 6c 20 65 78 65 63 75 74 65 20 24 64 62 20 5b  ql execute $db [
fa70: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
fa80: 20 20 20 20 20 20 20 20 20 20 22 50 52 41 47 4d            "PRAGM
fa90: 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72  A temp_store_dir
faa0: 65 63 74 6f 72 79 20 3d 20 5c 22 22 20 5b 67 65  ectory = \"" [ge
fab0: 74 54 65 6d 70 6f 72 61 72 79 44 69 72 65 63 74  tTemporaryDirect
fac0: 6f 72 79 5d 20 5c 22 5c 3b 5d 0d 0a 20 20 20 20  ory] \"\;]..    
fad0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
fae0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 6c        # NOTE: Al
faf0: 77 61 79 73 20 72 65 74 75 72 6e 20 74 68 65 20  ways return the 
fb00: 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c  connection handl
fb10: 65 20 75 70 6f 6e 20 73 75 63 63 65 73 73 2e 0d  e upon success..
fb20: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
fb30: 72 65 74 75 72 6e 20 24 64 62 0d 0a 20 20 20 20  return $db..    
fb40: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
fb50: 65 74 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b  etDbConnection {
fb60: 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20 7d 20   {varName db} } 
fb70: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
fb80: 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20    # NOTE: Refer 
fb90: 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65 64  to the specified
fba0: 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20   variable (e.g. 
fbb0: 22 64 62 22 29 20 69 6e 20 74 68 65 20 63 6f 6e  "db") in the con
fbc0: 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20  text of our..   
fbd0: 20 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c 65     #       calle
fbe0: 72 2e 20 20 54 68 65 20 68 61 6e 64 6c 65 20 74  r.  The handle t
fbf0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  o the database p
fc00: 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64  reviously opened
fc10: 20 76 69 61 20 74 68 65 0d 0a 20 20 20 20 20 20   via the..      
fc20: 23 20 20 20 20 20 20 20 5b 73 65 74 75 70 44 62  #       [setupDb
fc30: 5d 20 70 72 6f 63 65 64 75 72 65 20 73 68 6f 75  ] procedure shou
fc40: 6c 64 20 62 65 20 73 74 6f 72 65 64 20 74 68 65  ld be stored the
fc50: 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  re...      #..  
fc60: 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72      upvar 1 $var
fc70: 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20  Name db....     
fc80: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
fc90: 3a 20 54 68 69 73 20 72 65 74 75 72 6e 73 20 74  : This returns t
fca0: 68 65 20 41 44 4f 2e 4e 45 54 20 49 44 62 43 6f  he ADO.NET IDbCo
fcb0: 6e 6e 65 63 74 69 6f 6e 20 6f 62 6a 65 63 74 20  nnection object 
fcc0: 69 6e 73 74 61 6e 63 65 20 66 6f 72 20 74 68 65  instance for the
fcd0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
fce0: 73 70 65 63 69 66 69 65 64 20 64 61 74 61 62 73  specified databs
fcf0: 65 20 68 61 6e 64 6c 65 2e 20 20 53 69 6e 63 65  e handle.  Since
fd00: 20 67 65 74 74 69 6e 67 20 74 68 69 73 20 6f 62   getting this ob
fd10: 6a 65 63 74 20 72 65 6c 69 65 73 20 75 70 6f 6e  ject relies upon
fd20: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
fd30: 45 61 67 6c 65 20 69 6e 74 65 72 6e 61 6c 73 2c  Eagle internals,
fd40: 20 67 72 65 61 74 20 63 61 72 65 20 73 68 6f 75   great care shou
fd50: 6c 64 20 62 65 20 74 61 6b 65 6e 20 74 6f 20 61  ld be taken to a
fd60: 76 6f 69 64 20 64 69 73 70 6f 73 69 6e 67 20 6f  void disposing o
fd70: 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  f..      #      
fd80: 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20   this object or 
fd90: 6f 74 68 65 72 77 69 73 65 20 70 75 74 74 69 6e  otherwise puttin
fda0: 67 20 69 74 20 69 6e 74 6f 20 61 6e 20 69 6e 76  g it into an inv
fdb0: 61 6c 69 64 20 73 74 61 74 65 2e 0d 0a 20 20 20  alid state...   
fdc0: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
fdd0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 64 62 5d  [info exists db]
fde0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
fdf0: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
fe00: 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
fe10: 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
fe20: 4e 6f 6e 50 75 62 6c 69 63 20 2d 6f 62 6a 65 63  NonPublic -objec
fe30: 74 66 6c 61 67 73 20 2b 4e 6f 44 69 73 70 6f 73  tflags +NoDispos
fe40: 65 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20  e -alias \..    
fe50: 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 72 70            Interp
fe60: 72 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 2e  reter.GetActive.
fe70: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 49 74 65 6d  connections Item
fe80: 20 24 64 62 0d 0a 20 20 20 20 20 20 20 20 7d 20   $db..        } 
fe90: 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68  result] == 0} th
fea0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
feb0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
fec0: 4f 54 45 3a 20 53 75 63 63 65 73 73 2c 20 72 65  OTE: Success, re
fed0: 74 75 72 6e 20 74 68 65 20 6f 70 61 71 75 65 20  turn the opaque 
fee0: 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 2e 0d 0a  object handle...
fef0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
ff00: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72         return $r
ff10: 65 73 75 6c 74 0d 0a 20 20 20 20 20 20 20 20 7d  esult..        }
ff20: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
ff30: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
ff40: 23 20 4e 4f 54 45 3a 20 46 61 69 6c 75 72 65 2c  # NOTE: Failure,
ff50: 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20   report why...  
ff60: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
ff70: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
ff80: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
ff90: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
ffa0: 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
ffb0: 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
ffc0: 20 67 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   get connection 
ffd0: 68 61 6e 64 6c 65 20 66 6f 72 20 64 61 74 61 62  handle for datab
ffe0: 61 73 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ase \"" \..     
fff0: 20 20 20 20 20 20 20 20 20 24 64 62 20 22 5c 22           $db "\"
10000 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  , error: " \n\t 
10010 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
10020 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
10030 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
10040 72 6f 63 20 66 72 65 65 44 62 43 6f 6e 6e 65 63  roc freeDbConnec
10050 74 69 6f 6e 20 7b 20 7b 76 61 72 4e 61 6d 65 20  tion { {varName 
10060 63 6f 6e 6e 65 63 74 69 6f 6e 7d 20 7d 20 7b 0d  connection} } {.
10070 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
10080 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f  # NOTE: Refer to
10090 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76   the specified v
100a0 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 63  ariable (e.g. "c
100b0 6f 6e 6e 65 63 74 69 6f 6e 22 29 20 69 6e 20 74  onnection") in t
100c0 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
100d0 20 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72    context of our
100e0 20 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 6f 70   caller.  The op
100f0 61 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64  aque object hand
10100 6c 65 20 66 6f 72 20 61 6e 20 41 44 4f 2e 4e 45  le for an ADO.NE
10110 54 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  T..      #      
10120 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 65 76   connection prev
10130 69 6f 75 73 6c 79 20 72 65 74 75 72 6e 65 64 20  iously returned 
10140 62 79 20 5b 67 65 74 44 62 43 6f 6e 6e 65 63 74  by [getDbConnect
10150 69 6f 6e 5d 20 73 68 6f 75 6c 64 20 62 65 0d 0a  ion] should be..
10160 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 74        #       st
10170 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a 20 20 20  ored there...   
10180 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61     #..      upva
10190 72 20 31 20 24 76 61 72 4e 61 6d 65 20 63 6f 6e  r 1 $varName con
101a0 6e 65 63 74 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20  nection....     
101b0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
101c0 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 72 65 6d  : Attempt to rem
101d0 6f 76 65 20 74 68 65 20 6f 70 61 71 75 65 20 6f  ove the opaque o
101e0 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 66 72 6f  bject handle fro
101f0 6d 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65  m the interprete
10200 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  r..      #      
10210 20 6e 6f 77 2e 20 20 54 68 69 73 20 5b 6f 62 6a   now.  This [obj
10220 65 63 74 20 64 69 73 70 6f 73 65 5d 20 63 61 6c  ect dispose] cal
10230 6c 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61  l will not actua
10240 6c 6c 79 20 64 69 73 70 6f 73 65 20 6f 66 20 74  lly dispose of t
10250 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
10260 20 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 62 6a    underlying obj
10270 65 63 74 20 62 65 63 61 75 73 65 20 74 68 65 20  ect because the 
10280 2b 4e 6f 44 69 73 70 6f 73 65 20 66 6c 61 67 20  +NoDispose flag 
10290 77 61 73 20 73 65 74 20 6f 6e 20 69 74 0d 0a 20  was set on it.. 
102a0 20 20 20 20 20 23 20 20 20 20 20 20 20 64 75 72       #       dur
102b0 69 6e 67 20 63 72 65 61 74 69 6f 6e 20 6f 66 20  ing creation of 
102c0 74 68 65 20 6f 70 61 71 75 65 20 6f 62 6a 65 63  the opaque objec
102d0 74 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20  t handle...     
102e0 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
102f0 6e 66 6f 20 65 78 69 73 74 73 20 63 6f 6e 6e 65  nfo exists conne
10300 63 74 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20 20 20  ction] && \..   
10310 20 20 20 20 20 20 20 5b 63 61 74 63 68 20 7b 6f         [catch {o
10320 62 6a 65 63 74 20 64 69 73 70 6f 73 65 20 24 63  bject dispose $c
10330 6f 6e 6e 65 63 74 69 6f 6e 7d 20 65 72 72 6f 72  onnection} error
10340 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
10350 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
10360 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77  NOTE: We somehow
10370 20 66 61 69 6c 65 64 20 74 6f 20 72 65 6d 6f 76   failed to remov
10380 65 20 74 68 65 20 68 61 6e 64 6c 65 2c 20 72 65  e the handle, re
10390 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20  port why...     
103a0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70     #..        tp
103b0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
103c0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
103d0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
103e0 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
103f0 69 6c 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 63  iled to remove c
10400 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65  onnection handle
10410 20 5c 22 22 20 24 63 6f 6e 6e 65 63 74 69 6f 6e   \"" $connection
10420 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
10430 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e  "\", error: " \n
10440 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20  \t $error \n].. 
10450 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
10460 0d 0a 20 20 20 20 70 72 6f 63 20 61 64 64 44 62  ..    proc addDb
10470 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20 63 6f 6e  Connection { con
10480 6e 65 63 74 69 6f 6e 20 7b 76 61 72 4e 61 6d 65  nection {varName
10490 20 64 62 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20   db} } {..      
104a0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
104b0 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 73 70   Refer to the sp
104c0 65 63 69 66 69 65 64 20 76 61 72 69 61 62 6c 65  ecified variable
104d0 20 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20   (e.g. "db") in 
104e0 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f  the context of o
104f0 75 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ur..      #     
10500 20 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20    caller...     
10510 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20   #..      upvar 
10520 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d  1 $varName db...
10530 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
10540 23 20 4e 4f 54 45 3a 20 43 72 65 61 74 65 20 61  # NOTE: Create a
10550 20 63 6f 72 72 65 63 74 6c 79 20 66 6f 72 6d 61   correctly forma
10560 74 74 65 64 20 6e 61 6d 65 20 66 6f 72 20 74 68  tted name for th
10570 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
10580 63 74 69 6f 6e 20 74 6f 0d 0a 20 20 20 20 20 20  ction to..      
10590 23 20 20 20 20 20 20 20 62 65 20 61 64 64 65 64  #       be added
105a0 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6d 61 6e   to the list man
105b0 61 67 65 64 20 62 79 20 74 68 65 20 45 61 67 6c  aged by the Eagl
105c0 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a  e interpreter...
105d0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73        #..      s
105e0 65 74 20 64 62 20 5b 6f 62 6a 65 63 74 20 69 6e  et db [object in
105f0 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
10600 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
10610 20 20 20 20 45 61 67 6c 65 2e 5f 43 6f 6d 70 6f      Eagle._Compo
10620 6e 65 6e 74 73 2e 50 72 69 76 61 74 65 2e 46 6f  nents.Private.Fo
10630 72 6d 61 74 4f 70 73 20 44 61 74 61 62 61 73 65  rmatOps Database
10640 4f 62 6a 65 63 74 4e 61 6d 65 20 24 63 6f 6e 6e  ObjectName $conn
10650 65 63 74 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20  ection \..      
10660 20 20 20 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63      SQLiteConnec
10670 74 69 6f 6e 20 5b 6f 62 6a 65 63 74 20 69 6e 76  tion [object inv
10680 6f 6b 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e  oke Interpreter.
10690 47 65 74 41 63 74 69 76 65 20 4e 65 78 74 49 64  GetActive NextId
106a0 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ]]....      #.. 
106b0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64       # NOTE: Add
106c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
106d0 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 76 69 64 65  nnection provide
106e0 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 20  d by our caller 
106f0 74 6f 20 74 68 65 20 6c 69 73 74 0d 0a 20 20 20  to the list..   
10700 20 20 20 23 20 20 20 20 20 20 20 6f 66 20 74 68     #       of th
10710 6f 73 65 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 65  ose known to the
10720 20 45 61 67 6c 65 20 69 6e 74 65 72 70 72 65 74   Eagle interpret
10730 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  er...      #..  
10740 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
10750 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
10760 6c 69 63 20 49 6e 74 65 72 70 72 65 74 65 72 2e  lic Interpreter.
10770 47 65 74 41 63 74 69 76 65 2e 63 6f 6e 6e 65 63  GetActive.connec
10780 74 69 6f 6e 73 20 41 64 64 20 5c 0d 0a 20 20 20  tions Add \..   
10790 20 20 20 20 20 20 20 24 64 62 20 24 63 6f 6e 6e         $db $conn
107a0 65 63 74 69 6f 6e 0d 0a 20 20 20 20 7d 0d 0a 0c  ection..    }...
107b0 0d 0a 20 20 20 20 70 72 6f 63 20 63 6c 65 61 6e  ..    proc clean
107c0 75 70 44 62 20 7b 20 66 69 6c 65 4e 61 6d 65 20  upDb { fileName 
107d0 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20 7b 63 6f  {varName db} {co
107e0 6c 6c 65 63 74 20 74 72 75 65 7d 20 7b 71 75 61  llect true} {qua
107f0 6c 69 66 79 20 74 72 75 65 7d 0d 0a 20 20 20 20  lify true}..    
10800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10810 20 7b 64 65 6c 65 74 65 20 74 72 75 65 7d 20 7d   {delete true} }
10820 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
10830 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
10840 70 74 20 74 6f 20 66 6f 72 63 65 20 61 6c 6c 20  pt to force all 
10850 70 65 6e 64 69 6e 67 20 22 67 61 72 62 61 67 65  pending "garbage
10860 22 20 6f 62 6a 65 63 74 73 20 74 6f 20 62 65 20  " objects to be 
10870 63 6f 6c 6c 65 63 74 65 64 2c 0d 0a 20 20 20 20  collected,..    
10880 20 20 23 20 20 20 20 20 20 20 69 6e 63 6c 75 64    #       includ
10890 69 6e 67 20 53 51 4c 69 74 65 20 73 74 61 74 65  ing SQLite state
108a0 6d 65 6e 74 73 20 61 6e 64 20 62 61 63 6b 75 70  ments and backup
108b0 20 6f 62 6a 65 63 74 73 3b 20 74 68 69 73 20 73   objects; this s
108c0 68 6f 75 6c 64 20 61 6c 6c 6f 77 0d 0a 20 20 20  hould allow..   
108d0 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 75     #       the u
108e0 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
108f0 73 65 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65  se file to be de
10900 6c 65 74 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d  leted...      #.
10910 0a 20 20 20 20 20 20 69 66 20 7b 24 63 6f 6c 6c  .      if {$coll
10920 65 63 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ect} then {..   
10930 20 20 20 20 20 63 6f 6c 6c 65 63 74 47 61 72 62       collectGarb
10940 61 67 65 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  age $::test_chan
10950 6e 65 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  nel..      }....
10960 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
10970 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20   NOTE: Refer to 
10980 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61  the specified va
10990 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62  riable (e.g. "db
109a0 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78  ") in the contex
109b0 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20  t of our..      
109c0 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20  #       caller. 
109d0 20 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 74   The handle to t
109e0 68 65 20 64 61 74 61 62 61 73 65 20 70 72 65 76  he database prev
109f0 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 76 69  iously opened vi
10a00 61 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  a the..      #  
10a10 20 20 20 20 20 5b 73 65 74 75 70 44 62 5d 20 70       [setupDb] p
10a20 72 6f 63 65 64 75 72 65 20 73 68 6f 75 6c 64 20  rocedure should 
10a30 62 65 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e  be stored there.
10a40 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
10a50 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d   upvar 1 $varNam
10a60 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  e db....      #.
10a70 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43  .      # NOTE: C
10a80 6c 6f 73 65 20 74 68 65 20 63 6f 6e 6e 65 63 74  lose the connect
10a90 69 6f 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ion to the datab
10aa0 61 73 65 20 6e 6f 77 2e 20 20 54 68 69 73 20 73  ase now.  This s
10ab0 68 6f 75 6c 64 20 61 6c 6c 6f 77 20 75 73 0d 0a  hould allow us..
10ac0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f        #       to
10ad0 20 64 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65   delete the unde
10ae0 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
10af0 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  file...      #..
10b00 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
10b10 65 78 69 73 74 73 20 64 62 5d 20 26 26 20 5b 63  exists db] && [c
10b20 61 74 63 68 20 7b 73 71 6c 20 63 6c 6f 73 65 20  atch {sql close 
10b30 24 64 62 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65  $db} error]} the
10b40 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
10b50 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
10b60 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65  We somehow faile
10b70 64 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 64  d to close the d
10b80 61 74 61 62 61 73 65 2c 20 72 65 70 6f 72 74 20  atabase, report 
10b90 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  why...        #.
10ba0 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
10bb0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
10bc0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
10bd0 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
10be0 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
10bf0 74 6f 20 63 6c 6f 73 65 20 64 61 74 61 62 61 73  to close databas
10c00 65 20 5c 22 22 20 24 64 62 20 22 5c 22 2c 20 65  e \"" $db "\", e
10c10 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20  rror: " \..     
10c20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 65 72 72         \n\t $err
10c30 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d  or \n]..      }.
10c40 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
10c50 20 20 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c    # NOTE: First,
10c60 20 73 65 65 20 69 66 20 6f 75 72 20 63 61 6c 6c   see if our call
10c70 65 72 20 68 61 73 20 72 65 71 75 65 73 74 65 64  er has requested
10c80 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
10c90 74 61 62 61 73 65 2e 0d 0a 20 20 20 20 20 20 23  tabase...      #
10ca0 0d 0a 20 20 20 20 20 20 73 65 74 20 69 73 4d 65  ..      set isMe
10cb0 6d 6f 72 79 20 5b 69 73 4d 65 6d 6f 72 79 44 62  mory [isMemoryDb
10cc0 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20   $fileName].... 
10cd0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
10ce0 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20  NOTE: Build the 
10cf0 66 75 6c 6c 20 70 61 74 68 20 74 6f 20 74 68 65  full path to the
10d00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
10d10 61 6d 65 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 61  ame.  For now, a
10d20 6c 6c 20 74 65 73 74 0d 0a 20 20 20 20 20 20 23  ll test..      #
10d30 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
10d40 66 69 6c 65 73 20 61 72 65 20 73 74 6f 72 65 64  files are stored
10d50 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72   in the temporar
10d60 79 20 64 69 72 65 63 74 6f 72 79 2e 0d 0a 20 20  y directory...  
10d70 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
10d80 7b 21 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24  {!$isMemory && $
10d90 71 75 61 6c 69 66 79 7d 20 74 68 65 6e 20 7b 0d  qualify} then {.
10da0 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c  .        set fil
10db0 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  eName [file join
10dc0 20 5b 67 65 74 44 61 74 61 62 61 73 65 44 69 72   [getDatabaseDir
10dd0 65 63 74 6f 72 79 5d 20 5b 66 69 6c 65 20 74 61  ectory] [file ta
10de0 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a  il $fileName]]..
10df0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
10e00 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
10e10 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 66  : Check if the f
10e20 69 6c 65 20 73 74 69 6c 6c 20 65 78 69 73 74 73  ile still exists
10e30 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
10e40 20 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72 79    if {!$isMemory
10e50 20 26 26 20 24 64 65 6c 65 74 65 20 26 26 20 5b   && $delete && [
10e60 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c  file exists $fil
10e70 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
10e80 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
10e90 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20     # NOTE: Skip 
10ea0 64 65 6c 65 74 69 6e 67 20 64 61 74 61 62 61 73  deleting databas
10eb0 65 20 66 69 6c 65 73 20 69 66 20 73 6f 6d 65 62  e files if someb
10ec0 6f 64 79 20 73 65 74 73 20 74 68 65 20 67 6c 6f  ody sets the glo
10ed0 62 61 6c 0d 0a 20 20 20 20 20 20 20 20 23 20 20  bal..        #  
10ee0 20 20 20 20 20 76 61 72 69 61 62 6c 65 20 74 6f       variable to
10ef0 20 70 72 65 76 65 6e 74 20 69 74 2e 0d 0a 20 20   prevent it...  
10f00 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
10f10 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
10f20 74 73 20 3a 3a 6e 6f 28 63 6c 65 61 6e 75 70 44  ts ::no(cleanupD
10f30 62 46 69 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d  bFile)]} then {.
10f40 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
10f50 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
10f60 41 74 74 65 6d 70 74 20 74 6f 20 64 65 6c 65 74  Attempt to delet
10f70 65 20 74 68 65 20 74 65 73 74 20 64 61 74 61 62  e the test datab
10f80 61 73 65 20 66 69 6c 65 20 6e 6f 77 2e 0d 0a 20  ase file now... 
10f90 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
10fa0 20 20 20 20 20 20 69 66 20 7b 5b 73 65 74 20 63        if {[set c
10fb0 6f 64 65 20 5b 63 61 74 63 68 20 7b 66 69 6c 65  ode [catch {file
10fc0 20 64 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d   delete $fileNam
10fd0 65 7d 20 65 72 72 6f 72 5d 5d 7d 20 74 68 65 6e  e} error]]} then
10fe0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
10ff0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  #..            #
11000 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f   NOTE: We someho
11010 77 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65  w failed to dele
11020 74 65 20 74 68 65 20 66 69 6c 65 2c 20 72 65 70  te the file, rep
11030 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20  ort why...      
11040 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
11050 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
11060 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
11070 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
11080 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
11090 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
110a0 74 6f 20 64 65 6c 65 74 65 20 64 61 74 61 62 61  to delete databa
110b0 73 65 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c  se file \"" $fil
110c0 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  eName \..       
110d0 20 20 20 20 20 20 20 20 20 22 5c 22 20 64 75 72           "\" dur
110e0 69 6e 67 20 63 6c 65 61 6e 75 70 2c 20 65 72 72  ing cleanup, err
110f0 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f  or: " \n\t $erro
11100 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  r \n]..         
11110 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c   }..        } el
11120 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
11130 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
11140 4f 54 45 3a 20 53 68 6f 77 20 74 68 61 74 20 77  OTE: Show that w
11150 65 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69  e skipped deleti
11160 6e 67 20 74 68 65 20 66 69 6c 65 2e 0d 0a 20 20  ng the file...  
11170 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
11180 20 20 20 20 20 73 65 74 20 63 6f 64 65 20 30 0d       set code 0.
11190 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  ...          tpu
111a0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
111b0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
111c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
111d0 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 73  "==== WARNING: s
111e0 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20  kipped deleting 
111f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 5c 22  database file \"
11200 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  " $fileName \.. 
11210 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22               "\"
11220 20 64 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 5c   during cleanup\
11230 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  n"]..        }..
11240 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
11250 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
11260 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 66     # NOTE: The f
11270 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
11280 73 74 2c 20 73 75 63 63 65 73 73 21 0d 0a 20 20  st, success!..  
11290 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
112a0 20 73 65 74 20 63 6f 64 65 20 30 0d 0a 20 20 20   set code 0..   
112b0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
112c0 74 75 72 6e 20 24 63 6f 64 65 0d 0a 20 20 20 20  turn $code..    
112d0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73  }.....    proc s
112e0 65 74 75 70 44 62 49 6e 74 65 72 72 75 70 74 43  etupDbInterruptC
112f0 61 6c 6c 62 61 63 6b 20 7b 20 63 68 61 6e 6e 65  allback { channe
11300 6c 20 6c 6f 67 20 7d 20 7b 0d 0a 20 20 20 20 20  l log } {..     
11310 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
11320 22 2d 2d 2d 2d 20 73 65 74 74 69 6e 67 20 75 70  "---- setting up
11330 20 64 65 62 75 67 67 65 72 20 69 6e 74 65 72 72   debugger interr
11340 75 70 74 20 63 61 6c 6c 62 61 63 6b 2e 2e 2e 20  upt callback... 
11350 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  "....      if {[
11360 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
11370 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
11380 54 45 3a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  TE: Make sure th
11390 65 20 73 63 72 69 70 74 20 64 65 62 75 67 67 65  e script debugge
113a0 72 20 61 6e 64 20 74 68 65 20 69 73 6f 6c 61 74  r and the isolat
113b0 65 64 20 69 6e 74 65 72 70 72 65 74 65 72 20 61  ed interpreter a
113c0 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  re..        #   
113d0 20 20 20 20 73 65 74 75 70 20 61 6e 64 20 72 65      setup and re
113e0 61 64 79 20 66 6f 72 20 75 73 65 2e 0d 0a 20 20  ady for use...  
113f0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
11400 20 64 65 62 75 67 20 73 65 74 75 70 20 74 72 75   debug setup tru
11410 65 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20  e true....      
11420 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
11430 4f 54 45 3a 20 4c 6f 61 64 20 74 68 65 20 6e 65  OTE: Load the ne
11440 63 65 73 73 61 72 79 20 70 61 63 6b 61 67 65 73  cessary packages
11450 20 69 6e 74 6f 20 74 68 65 20 69 73 6f 6c 61 74   into the isolat
11460 65 64 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d  ed interpreter..
11470 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
11480 20 20 20 20 64 65 62 75 67 20 65 76 61 6c 20 7b      debug eval {
11490 0d 0a 20 20 20 20 20 20 20 20 20 20 70 61 63 6b  ..          pack
114a0 61 67 65 20 72 65 71 75 69 72 65 20 45 61 67 6c  age require Eagl
114b0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 70 61 63  e..          pac
114c0 6b 61 67 65 20 72 65 71 75 69 72 65 20 45 61 67  kage require Eag
114d0 6c 65 2e 4c 69 62 72 61 72 79 0d 0a 20 20 20 20  le.Library..    
114e0 20 20 20 20 20 20 70 61 63 6b 61 67 65 20 72 65        package re
114f0 71 75 69 72 65 20 45 61 67 6c 65 2e 54 65 73 74  quire Eagle.Test
11500 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
11510 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
11520 20 20 23 20 4e 4f 54 45 3a 20 43 6f 70 79 20 74    # NOTE: Copy t
11530 68 65 20 6e 65 63 65 73 73 61 72 79 20 76 61 72  he necessary var
11540 69 61 62 6c 65 73 20 69 6e 74 6f 20 74 68 65 20  iables into the 
11550 69 73 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72  isolated interpr
11560 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 23  eter...        #
11570 0d 0a 20 20 20 20 20 20 20 20 64 65 62 75 67 20  ..        debug 
11580 69 6e 76 6f 6b 65 20 30 20 73 65 74 20 3a 3a 74  invoke 0 set ::t
11590 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 63 68 61  est_channel $cha
115a0 6e 6e 65 6c 3b 20 23 20 4e 4f 54 45 3a 20 46 6f  nnel; # NOTE: Fo
115b0 72 20 5b 74 70 75 74 73 5d 2e 0d 0a 20 20 20 20  r [tputs]...    
115c0 20 20 20 20 64 65 62 75 67 20 69 6e 76 6f 6b 65      debug invoke
115d0 20 30 20 73 65 74 20 3a 3a 74 65 73 74 5f 6c 6f   0 set ::test_lo
115e0 67 20 24 6c 6f 67 3b 20 23 20 4e 4f 54 45 3a 20  g $log; # NOTE: 
115f0 46 6f 72 20 5b 74 6c 6f 67 5d 2e 0d 0a 0d 0a 20  For [tlog]..... 
11600 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
11610 20 20 23 20 4e 4f 54 45 3a 20 49 6e 73 74 61 6c    # NOTE: Instal
11620 6c 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 73  l the callback s
11630 63 72 69 70 74 20 74 6f 20 62 65 20 65 76 61 6c  cript to be eval
11640 75 61 74 65 64 20 69 6e 20 74 68 65 20 69 73 6f  uated in the iso
11650 6c 61 74 65 64 0d 0a 20 20 20 20 20 20 20 20 23  lated..        #
11660 20 20 20 20 20 20 20 69 6e 74 65 72 70 72 65 74         interpret
11670 65 72 20 77 68 65 6e 20 74 68 69 73 20 69 6e 74  er when this int
11680 65 72 70 72 65 74 65 72 20 69 73 20 69 6e 74 65  erpreter is inte
11690 72 72 75 70 74 65 64 20 62 79 20 73 63 72 69 70  rrupted by scrip
116a0 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
116b0 20 20 20 63 61 6e 63 65 6c 6c 61 74 69 6f 6e 2c     cancellation,
116c0 20 65 74 63 2e 0d 0a 20 20 20 20 20 20 20 20 23   etc...        #
116d0 0d 0a 20 20 20 20 20 20 20 20 64 65 62 75 67 20  ..        debug 
116e0 63 61 6c 6c 62 61 63 6b 20 61 70 70 6c 79 20 7b  callback apply {
116f0 7b 73 65 6e 64 65 72 20 65 7d 20 7b 0d 0a 20 20  {sender e} {..  
11700 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
11710 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
11720 63 6b 20 69 66 20 74 68 69 73 20 63 61 6c 6c 62  ck if this callb
11730 61 63 6b 20 69 73 20 6f 6e 65 20 74 68 61 74 20  ack is one that 
11740 77 65 20 63 61 72 65 20 61 62 6f 75 74 2e 0d 0a  we care about...
11750 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
11760 20 20 20 20 20 20 20 69 66 20 7b 22 43 61 6e 63         if {"Canc
11770 65 6c 65 64 22 20 69 6e 20 5b 73 70 6c 69 74 20  eled" in [split 
11780 5b 24 65 20 49 6e 74 65 72 72 75 70 74 54 79 70  [$e InterruptTyp
11790 65 5d 20 22 2c 20 22 5d 7d 20 74 68 65 6e 20 7b  e] ", "]} then {
117a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
117b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
117c0 4f 54 45 3a 20 49 74 65 72 61 74 65 20 74 68 72  OTE: Iterate thr
117d0 6f 75 67 68 20 61 6c 6c 20 64 61 74 61 62 61 73  ough all databas
117e0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6b 6e  e connections kn
117f0 6f 77 6e 20 74 6f 20 74 68 65 0d 0a 20 20 20 20  own to the..    
11800 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
11810 70 61 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74  parent interpret
11820 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  er...           
11830 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
11840 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20 2d  object foreach -
11850 61 6c 69 61 73 20 70 61 69 72 20 5c 0d 0a 20 20  alias pair \..  
11860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 6f                [o
11870 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
11880 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 24  ags +NonPublic $
11890 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e 63 6f  e Interpreter.co
118a0 6e 6e 65 63 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20  nnections] {..  
118b0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
118c0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
118d0 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20  OTE: Attempt to 
118e0 63 61 6e 63 65 6c 20 61 6e 79 20 53 51 4c 20 71  cancel any SQL q
118f0 75 65 72 69 65 73 20 69 6e 20 70 72 6f 67 72 65  ueries in progre
11900 73 73 20 6f 6e 20 74 68 69 73 0d 0a 20 20 20 20  ss on this..    
11910 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
11920 20 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65    database conne
11930 63 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20  ction...        
11940 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
11950 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
11960 68 20 7b 24 70 61 69 72 20 56 61 6c 75 65 2e 43  h {$pair Value.C
11970 61 6e 63 65 6c 7d 20 65 72 72 6f 72 5d 7d 20 74  ancel} error]} t
11980 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
11990 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
119a0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
119b0 70 65 6e 64 41 72 67 73 20 5c 6e 20 5c 0d 0a 20  pendArgs \n \.. 
119c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119d0 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
119e0 3a 20 66 61 69 6c 65 64 20 74 6f 20 63 61 6e 63  : failed to canc
119f0 65 6c 20 71 75 65 72 79 20 66 6f 72 20 63 6f 6e  el query for con
11a00 6e 65 63 74 69 6f 6e 20 5c 22 22 20 5c 0d 0a 20  nection \"" \.. 
11a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a20 20 20 20 5b 24 70 61 69 72 20 4b 65 79 5d 20 22     [$pair Key] "
11a30 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  \", error: " \n\
11a40 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20  t $error \n]..  
11a50 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
11a60 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
11a70 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
11a80 20 20 20 7d 7d 0d 0a 20 20 20 20 20 20 7d 20 65     }}..      } e
11a90 72 72 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  rror] == 0} then
11aa0 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43   {..        addC
11ab0 6f 6e 73 74 72 61 69 6e 74 20 69 6e 74 65 72 72  onstraint interr
11ac0 75 70 74 43 61 6c 6c 62 61 63 6b 2e 73 71 6c 69  uptCallback.sqli
11ad0 74 65 33 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74  te3....        t
11ae0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65  puts $channel ye
11af0 73 5c 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  s\n..      } els
11b00 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e {..        tpu
11b10 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
11b20 65 6e 64 41 72 67 73 20 22 6e 6f 2c 20 65 72 72  endArgs "no, err
11b30 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f  or: " \n\t $erro
11b40 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  r \n]..      }..
11b50 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
11b60 6f 63 20 63 6c 65 61 6e 75 70 46 69 6c 65 20 7b  oc cleanupFile {
11b70 20 66 69 6c 65 4e 61 6d 65 20 7b 63 6f 6c 6c 65   fileName {colle
11b80 63 74 20 74 72 75 65 7d 20 7b 66 6f 72 63 65 20  ct true} {force 
11b90 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20  false} } {..    
11ba0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
11bb0 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 66 6f  E: Attempt to fo
11bc0 72 63 65 20 61 6c 6c 20 70 65 6e 64 69 6e 67 20  rce all pending 
11bd0 22 67 61 72 62 61 67 65 22 20 6f 62 6a 65 63 74  "garbage" object
11be0 73 20 74 6f 20 62 65 20 63 6f 6c 6c 65 63 74 65  s to be collecte
11bf0 64 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  d,..      #     
11c00 20 20 69 6e 63 6c 75 64 69 6e 67 20 53 51 4c 69    including SQLi
11c10 74 65 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6e  te statements an
11c20 64 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73  d backup objects
11c30 3b 20 74 68 69 73 20 73 68 6f 75 6c 64 20 61 6c  ; this should al
11c40 6c 6f 77 0d 0a 20 20 20 20 20 20 23 20 20 20 20  low..      #    
11c50 20 20 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e     the underlyin
11c60 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
11c70 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 0d 0a  to be deleted...
11c80 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
11c90 66 20 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65  f {$collect} the
11ca0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c  n {..        col
11cb0 6c 65 63 74 47 61 72 62 61 67 65 20 24 3a 3a 74  lectGarbage $::t
11cc0 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20  est_channel..   
11cd0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
11ce0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43  .      # NOTE: C
11cf0 68 65 63 6b 20 69 66 20 74 68 65 20 66 69 6c 65  heck if the file
11d00 20 73 74 69 6c 6c 20 65 78 69 73 74 73 2e 0d 0a   still exists...
11d10 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
11d20 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20  f {[file exists 
11d30 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  $fileName]} then
11d40 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
11d50 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
11d60 6b 69 70 20 64 65 6c 65 74 69 6e 67 20 74 65 73  kip deleting tes
11d70 74 20 66 69 6c 65 73 20 69 66 20 73 6f 6d 65 62  t files if someb
11d80 6f 64 79 20 73 65 74 73 20 74 68 65 20 67 6c 6f  ody sets the glo
11d90 62 61 6c 20 76 61 72 69 61 62 6c 65 0d 0a 20 20  bal variable..  
11da0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f        #       to
11db0 20 70 72 65 76 65 6e 74 20 69 74 2e 0d 0a 20 20   prevent it...  
11dc0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
11dd0 20 69 66 20 7b 24 66 6f 72 63 65 20 7c 7c 20 21   if {$force || !
11de0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
11df0 6f 28 63 6c 65 61 6e 75 70 46 69 6c 65 29 5d 7d  o(cleanupFile)]}
11e00 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
11e10 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
11e20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
11e30 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  to delete the te
11e40 73 74 20 66 69 6c 65 20 6e 6f 77 2e 0d 0a 20 20  st file now...  
11e50 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
11e60 20 20 20 20 20 69 66 20 7b 5b 73 65 74 20 63 6f       if {[set co
11e70 64 65 20 5b 63 61 74 63 68 20 7b 66 69 6c 65 20  de [catch {file 
11e80 64 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65  delete $fileName
11e90 7d 20 65 72 72 6f 72 5d 5d 7d 20 74 68 65 6e 20  } error]]} then 
11ea0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  {..            #
11eb0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
11ec0 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77  NOTE: We somehow
11ed0 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74   failed to delet
11ee0 65 20 74 68 65 20 66 69 6c 65 2c 20 72 65 70 6f  e the file, repo
11ef0 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20  rt why...       
11f00 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
11f10 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
11f20 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
11f30 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
11f40 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
11f50 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
11f60 6f 20 64 65 6c 65 74 65 20 74 65 73 74 20 66 69  o delete test fi
11f70 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65  le \"" $fileName
11f80 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
11f90 20 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63      "\" during c
11fa0 6c 65 61 6e 75 70 2c 20 65 72 72 6f 72 3a 20 22  leanup, error: "
11fb0 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d   \n\t $error \n]
11fc0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
11fd0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
11fe0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
11ff0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
12000 53 68 6f 77 20 74 68 61 74 20 77 65 20 73 6b 69  Show that we ski
12010 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20 74 68  pped deleting th
12020 65 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20  e file...       
12030 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
12040 73 65 74 20 63 6f 64 65 20 30 0d 0a 0d 0a 20 20  set code 0....  
12050 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
12060 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
12070 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
12080 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
12090 20 57 41 52 4e 49 4e 47 3a 20 73 6b 69 70 70 65   WARNING: skippe
120a0 64 20 64 65 6c 65 74 69 6e 67 20 74 65 73 74 20  d deleting test 
120b0 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61  file \"" $fileNa
120c0 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
120d0 20 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63      "\" during c
120e0 6c 65 61 6e 75 70 5c 6e 22 5d 0d 0a 20 20 20 20  leanup\n"]..    
120f0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65      }..      } e
12100 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
12110 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
12120 3a 20 54 68 65 20 66 69 6c 65 20 64 6f 65 73 20  : The file does 
12130 6e 6f 74 20 65 78 69 73 74 2c 20 73 75 63 63 65  not exist, succe
12140 73 73 21 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ss!..        #..
12150 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 64 65          set code
12160 20 30 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   0..      }.... 
12170 20 20 20 20 20 72 65 74 75 72 6e 20 24 63 6f 64       return $cod
12180 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  e..    }.....   
12190 20 70 72 6f 63 20 63 6f 6c 6c 65 63 74 47 61 72   proc collectGar
121a0 62 61 67 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7b  bage { channel {
121b0 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 31 30 30  milliseconds 100
121c0 30 7d 20 7b 71 75 69 65 74 20 74 72 75 65 7d 20  0} {quiet true} 
121d0 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  } {..      if {[
121e0 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e  catch {object in
121f0 76 6f 6b 65 20 47 43 20 47 65 74 54 6f 74 61 6c  voke GC GetTotal
12200 4d 65 6d 6f 72 79 20 66 61 6c 73 65 7d 20 72 65  Memory false} re
12210 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sult] == 0} then
12220 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
12230 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
12240 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
12250 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
12260 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
12270 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6d 65 6d         "---- mem
12280 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 74 68  ory in use by th
12290 65 20 43 4c 52 20 62 65 66 6f 72 65 20 63 6f 6c  e CLR before col
122a0 6c 65 63 74 69 6f 6e 2e 2e 2e 20 22 20 5c 0d 0a  lection... " \..
122b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 72                $r
122c0 65 73 75 6c 74 20 22 20 62 79 74 65 73 5c 6e 22  esult " bytes\n"
122d0 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
122e0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
122f0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
12300 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
12310 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
12320 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
12330 61 69 6c 65 64 20 74 6f 20 67 65 74 20 43 4c 52  ailed to get CLR
12340 20 6d 65 6d 6f 72 79 20 75 73 61 67 65 2c 20 65   memory usage, e
12350 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20  rror: " \..     
12360 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73         \n\t $res
12370 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d  ult \n]..      }
12380 0d 0a 0d 0a 20 20 20 20 20 20 23 23 23 23 23 23  ....      ######
12390 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
123a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
123b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
123c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
123d0 23 23 23 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  ###....      #..
123e0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
123f0 70 65 61 74 65 64 6c 79 20 61 74 74 65 6d 70 74  peatedly attempt
12400 20 74 6f 20 63 6f 6c 6c 65 63 74 20 67 61 72 62   to collect garb
12410 61 67 65 20 75 6e 74 69 6c 20 74 68 65 20 61 6c  age until the al
12420 6c 6f 74 74 65 64 20 6e 75 6d 62 65 72 0d 0a 20  lotted number.. 
12430 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 66 20       #       of 
12440 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 68 61 73  milliseconds has
12450 20 65 6c 61 70 73 65 64 2e 20 20 41 6c 77 61 79   elapsed.  Alway
12460 73 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6f 6c  s attempt to col
12470 6c 65 63 74 20 67 61 72 62 61 67 65 0d 0a 20 20  lect garbage..  
12480 20 20 20 20 23 20 20 20 20 20 20 20 61 74 20 6c      #       at l
12490 65 61 73 74 20 6f 6e 63 65 2e 0d 0a 20 20 20 20  east once...    
124a0 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 73    #..      set s
124b0 74 61 72 74 20 5b 63 6c 6f 63 6b 20 73 65 63 6f  tart [clock seco
124c0 6e 64 73 5d 0d 0a 20 20 20 20 20 20 73 65 74 20  nds]..      set 
124d0 73 74 6f 70 20 5b 65 78 70 72 20 7b 24 73 74 61  stop [expr {$sta
124e0 72 74 20 2b 20 28 24 6d 69 6c 6c 69 73 65 63 6f  rt + ($milliseco
124f0 6e 64 73 20 2f 20 31 30 30 30 29 7d 5d 0d 0a 0d  nds / 1000)}]...
12500 0a 20 20 20 20 20 20 64 6f 20 7b 0d 0a 20 20 20  .      do {..   
12510 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
12520 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
12530 74 6f 20 66 6f 72 63 65 20 61 20 66 75 6c 6c 20  to force a full 
12540 67 61 72 62 61 67 65 20 63 6f 6c 6c 65 63 74 69  garbage collecti
12550 6f 6e 20 6e 6f 77 2e 20 20 52 65 70 6f 72 74 20  on now.  Report 
12560 61 6e 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20  any..        #  
12570 20 20 20 20 20 65 72 72 6f 72 20 74 68 61 74 20       error that 
12580 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69  is encountered i
12590 66 20 77 65 20 66 61 69 6c 2e 0d 0a 20 20 20 20  f we fail...    
125a0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
125b0 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63  f {[catch {objec
125c0 74 20 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54  t invoke GC GetT
125d0 6f 74 61 6c 4d 65 6d 6f 72 79 20 74 72 75 65 7d  otalMemory true}
125e0 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d   error]} then {.
125f0 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
12600 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
12610 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
12620 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
12630 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 66 75 6c  NING: failed ful
12640 6c 20 67 61 72 62 61 67 65 20 63 6f 6c 6c 65 63  l garbage collec
12650 74 69 6f 6e 2c 20 65 72 72 6f 72 3a 20 22 20 5c  tion, error: " \
12660 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
12670 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
12680 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
12690 20 20 20 20 20 20 73 65 74 20 6e 6f 77 20 5b 63        set now [c
126a0 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 0d 0a 20  lock seconds].. 
126b0 20 20 20 20 20 7d 20 77 68 69 6c 65 20 7b 24 73       } while {$s
126c0 74 61 72 74 20 3c 3d 20 24 6e 6f 77 20 26 26 20  tart <= $now && 
126d0 24 6e 6f 77 20 3c 20 24 73 74 6f 70 7d 0d 0a 0d  $now < $stop}...
126e0 0a 20 20 20 20 20 20 23 23 23 23 23 23 23 23 23  .      #########
126f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12700 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12710 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12720 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12730 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63  ....      if {[c
12740 61 74 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76  atch {object inv
12750 6f 6b 65 20 47 43 20 47 65 74 54 6f 74 61 6c 4d  oke GC GetTotalM
12760 65 6d 6f 72 79 20 66 61 6c 73 65 7d 20 72 65 73  emory false} res
12770 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ult] == 0} then 
12780 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  {..        if {!
12790 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
127a0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
127b0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
127c0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
127d0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6d 65 6d 6f        "---- memo
127e0 72 79 20 69 6e 20 75 73 65 20 62 79 20 74 68 65  ry in use by the
127f0 20 43 4c 52 20 61 66 74 65 72 20 63 6f 6c 6c 65   CLR after colle
12800 63 74 69 6f 6e 2e 2e 2e 20 22 20 5c 0d 0a 20 20  ction... " \..  
12810 20 20 20 20 20 20 20 20 20 20 20 20 24 72 65 73              $res
12820 75 6c 74 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d  ult " bytes\n"].
12830 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
12840 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
12850 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
12860 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
12870 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 3d  ..            "=
12880 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
12890 6c 65 64 20 74 6f 20 67 65 74 20 43 4c 52 20 6d  led to get CLR m
128a0 65 6d 6f 72 79 20 75 73 61 67 65 2c 20 65 72 72  emory usage, err
128b0 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  or: " \..       
128c0 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c       \n\t $resul
128d0 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  t \n]..      }..
128e0 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
128f0 6f 63 20 67 65 74 53 51 4c 69 74 65 48 61 6e 64  oc getSQLiteHand
12900 6c 65 43 6f 75 6e 74 73 20 7b 20 63 68 61 6e 6e  leCounts { chann
12910 65 6c 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d  el {quiet false}
12920 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20   } {..      set 
12930 72 65 73 75 6c 74 20 5b 6c 69 73 74 5d 0d 0a 0d  result [list]...
12940 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65  .      if {[have
12950 43 6f 6e 73 74 72 61 69 6e 74 20 5c 0d 0a 20 20  Constraint \..  
12960 20 20 20 20 20 20 20 20 20 20 20 20 64 65 66 69              defi
12970 6e 65 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74 65  neConstant.Syste
12980 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 43 4f  m.Data.SQLite.CO
12990 55 4e 54 5f 48 41 4e 44 4c 45 5d 7d 20 74 68 65  UNT_HANDLE]} the
129a0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
129b0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
129c0 41 64 64 20 65 61 63 68 20 63 72 69 74 69 63 61  Add each critica
129d0 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 20 74  l handle count t
129e0 6f 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20  o the resulting 
129f0 6c 69 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  list...        #
12a00 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  ..        foreac
12a10 68 20 6e 61 6d 65 20 5b 6c 69 73 74 20 63 6f 6e  h name [list con
12a20 6e 65 63 74 69 6f 6e 43 6f 75 6e 74 20 73 74 61  nectionCount sta
12a30 74 65 6d 65 6e 74 43 6f 75 6e 74 20 62 61 63 6b  tementCount back
12a40 75 70 43 6f 75 6e 74 5d 20 7b 0d 0a 20 20 20 20  upCount] {..    
12a50 20 20 20 20 20 20 73 65 74 20 76 61 6c 75 65 20        set value 
12a60 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d  [object invoke -
12a70 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
12a80 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
12a90 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
12aa0 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76  Lite.UnsafeNativ
12ab0 65 4d 65 74 68 6f 64 73 20 24 6e 61 6d 65 5d 0d  eMethods $name].
12ac0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
12ad0 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
12ae0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
12af0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
12b00 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
12b10 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
12b20 2d 20 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c  - critical handl
12b30 65 20 63 6f 75 6e 74 20 5c 22 22 20 24 6e 61 6d  e count \"" $nam
12b40 65 20 22 5c 22 20 69 73 20 22 20 24 76 61 6c 75  e "\" is " $valu
12b50 65 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  e \n]..         
12b60 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
12b70 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 24  lappend result $
12b80 76 61 6c 75 65 0d 0a 20 20 20 20 20 20 20 20 7d  value..        }
12b90 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66  ..      } elseif
12ba0 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
12bb0 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
12bc0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
12bd0 65 20 61 63 74 75 61 6c 20 68 61 6e 64 6c 65 20  e actual handle 
12be0 63 6f 75 6e 74 73 20 61 72 65 20 6e 6f 74 20 61  counts are not a
12bf0 76 61 69 6c 61 62 6c 65 3b 20 74 68 65 72 65 66  vailable; theref
12c00 6f 72 65 2c 20 6a 75 73 74 0d 0a 20 20 20 20 20  ore, just..     
12c10 20 20 20 23 20 20 20 20 20 20 20 72 65 74 75 72     #       retur
12c20 6e 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e  n an empty list.
12c30 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
12c40 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
12c50 6e 65 6c 20 22 2d 2d 2d 2d 20 63 72 69 74 69 63  nel "---- critic
12c60 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 73  al handle counts
12c70 20 75 6e 61 76 61 69 6c 61 62 6c 65 5c 6e 22 0d   unavailable\n".
12c80 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
12c90 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74    return $result
12ca0 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
12cb0 70 72 6f 63 20 73 68 75 74 64 6f 77 6e 53 51 4c  proc shutdownSQL
12cc0 69 74 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 66  ite { channel {f
12cd0 6f 72 63 65 20 66 61 6c 73 65 7d 20 7b 71 75 69  orce false} {qui
12ce0 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  et false} } {.. 
12cf0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
12d00 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75 72 65 20  NOTE: Make sure 
12d10 74 68 61 74 20 53 51 4c 69 74 65 20 63 6f 72 65  that SQLite core
12d20 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d 70   library is comp
12d30 6c 65 74 65 6c 79 20 73 68 75 74 64 6f 77 6e 2e  letely shutdown.
12d40 20 20 54 68 69 73 0d 0a 20 20 20 20 20 20 23 20    This..      # 
12d50 20 20 20 20 20 20 69 73 20 75 73 65 64 20 62 79        is used by
12d60 20 74 65 73 74 73 20 74 68 61 74 20 63 68 61 6e   tests that chan
12d70 67 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ge configuration
12d80 20 6f 70 74 69 6f 6e 73 20 61 6e 64 2f 6f 72 20   options and/or 
12d90 74 68 6f 73 65 0d 0a 20 20 20 20 20 20 23 20 20  those..      #  
12da0 20 20 20 20 20 74 68 61 74 20 6e 65 65 64 20 74       that need t
12db0 6f 20 6d 61 6b 65 20 73 75 72 65 20 6c 6f 67 67  o make sure logg
12dc0 69 6e 67 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ing is initializ
12dd0 65 64 20 28 69 2e 65 2e 20 6a 75 73 74 20 69 6e  ed (i.e. just in
12de0 20 63 61 73 65 0d 0a 20 20 20 20 20 20 23 20 20   case..      #  
12df0 20 20 20 20 20 74 68 65 20 53 51 4c 69 74 65 20       the SQLite 
12e00 63 6f 72 65 20 6c 69 62 72 61 72 79 20 77 61 73  core library was
12e10 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 69 6e 20   initialized in 
12e20 74 68 65 20 70 72 6f 63 65 73 73 20 70 72 69 6f  the process prio
12e30 72 20 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20  r to..      #   
12e40 20 20 20 20 74 68 65 20 53 51 4c 69 74 65 4c 6f      the SQLiteLo
12e50 67 20 63 6c 61 73 73 20 62 65 69 6e 67 20 61 62  g class being ab
12e60 6c 65 20 74 6f 20 73 65 74 75 70 20 69 74 73 20  le to setup its 
12e70 6c 6f 67 67 69 6e 67 20 63 61 6c 6c 62 61 63 6b  logging callback
12e80 29 2e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  )...      #     
12e90 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73    Normally, this
12ea0 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
12eb0 70 65 72 66 6f 72 6d 65 64 20 69 66 20 53 51 4c  performed if SQL
12ec0 69 74 65 20 69 73 20 6c 6f 61 64 65 64 20 61 6e  ite is loaded an
12ed0 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
12ee0 20 72 65 61 64 79 20 66 6f 72 20 75 73 65 20 62   ready for use b
12ef0 79 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  y the test suite
12f00 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
12f10 20 20 69 66 20 7b 24 66 6f 72 63 65 20 7c 7c 20    if {$force || 
12f20 5b 69 73 53 51 4c 69 74 65 52 65 61 64 79 5d 7d  [isSQLiteReady]}
12f30 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
12f40 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 42 55   #..        # BU
12f50 47 46 49 58 3a 20 42 65 66 6f 72 65 20 63 61 6c  GFIX: Before cal
12f60 6c 69 6e 67 20 74 68 65 20 6e 61 74 69 76 65 20  ling the native 
12f70 73 68 75 74 64 6f 77 6e 20 66 75 6e 63 74 69 6f  shutdown functio
12f80 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 62 6f 74  n, make sure bot
12f90 68 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  h..        #    
12fa0 20 20 20 20 20 6f 66 20 74 68 65 20 50 52 41 47       of the PRAG
12fb0 4d 41 20 72 65 6c 61 74 65 64 20 64 69 72 65 63  MA related direc
12fc0 74 6f 72 79 20 6e 61 6d 65 73 20 61 72 65 20 66  tory names are f
12fd0 72 65 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23  reed...        #
12fe0 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46  ..        checkF
12ff0 6f 72 53 51 4c 69 74 65 44 69 72 65 63 74 6f 72  orSQLiteDirector
13000 69 65 73 20 24 63 68 61 6e 6e 65 6c 20 74 72 75  ies $channel tru
13010 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  e....        if 
13020 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
13030 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
13040 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
13050 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
13060 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
13070 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e  a.SQLite.UnsafeN
13080 61 74 69 76 65 4d 65 74 68 6f 64 73 20 73 71 6c  ativeMethods sql
13090 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 0d 0a 20  ite3_shutdown.. 
130a0 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d         } result]
130b0 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
130c0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
130d0 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
130e0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
130f0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
13100 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
13110 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61          "---- ca
13120 6c 6c 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64  ll sqlite3_shutd
13130 6f 77 6e 28 29 2e 2e 2e 20 6f 6b 3a 20 22 20 24  own()... ok: " $
13140 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20  result \n]..    
13150 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
13160 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
13170 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
13180 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
13190 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
131a0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
131b0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
131c0 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73      "---- call s
131d0 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28  qlite3_shutdown(
131e0 29 2e 2e 2e 20 65 72 72 6f 72 3a 20 22 20 5c 6e  )... error: " \n
131f0 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a  \t $result \n]..
13200 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
13210 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
13220 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
13230 72 6f 63 20 72 65 70 6f 72 74 53 51 4c 69 74 65  roc reportSQLite
13240 52 65 73 6f 75 72 63 65 73 20 7b 20 63 68 61 6e  Resources { chan
13250 6e 65 6c 20 7b 71 75 69 65 74 20 66 61 6c 73 65  nel {quiet false
13260 7d 20 7b 63 6f 6c 6c 65 63 74 20 74 72 75 65 7d  } {collect true}
13270 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
13280 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69       # NOTE: Ski
13290 70 20 61 6c 6c 20 6f 75 74 70 75 74 20 69 66 20  p all output if 
132a0 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 69  we are running i
132b0 6e 20 22 71 75 69 65 74 22 20 6d 6f 64 65 2e 0d  n "quiet" mode..
132c0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
132d0 69 66 20 7b 5b 68 61 76 65 43 6f 6e 73 74 72 61  if {[haveConstra
132e0 69 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  int \..         
132f0 20 20 20 20 20 64 65 66 69 6e 65 43 6f 6e 73 74       defineConst
13300 61 6e 74 2e 53 79 73 74 65 6d 2e 44 61 74 61 2e  ant.System.Data.
13310 53 51 4c 69 74 65 2e 49 4e 54 45 52 4f 50 5f 56  SQLite.INTEROP_V
13320 49 52 54 55 41 4c 5f 54 41 42 4c 45 5d 20 26 26  IRTUAL_TABLE] &&
13330 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 68   \..          [h
13340 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5c 0d  aveConstraint \.
13350 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  .              d
13360 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 2e 53 79  efineConstant.Sy
13370 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
13380 2e 54 52 41 43 4b 5f 4d 45 4d 4f 52 59 5f 42 59  .TRACK_MEMORY_BY
13390 54 45 53 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  TES]} then {..  
133a0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
133b0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
133c0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
133d0 6e 65 6c 20 22 2d 2d 2d 2d 20 63 75 72 72 65 6e  nel "---- curren
133e0 74 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20  t memory in use 
133f0 62 79 20 53 51 4c 69 74 65 4d 65 6d 6f 72 79 2e  by SQLiteMemory.
13400 2e 2e 20 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d  .. "..        }.
13410 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  ...        if {[
13420 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
13430 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
13440 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
13450 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
13460 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
13470 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 4d 65 6d  SQLite.SQLiteMem
13480 6f 72 79 20 62 79 74 65 73 41 6c 6c 6f 63 61 74  ory bytesAllocat
13490 65 64 0d 0a 20 20 20 20 20 20 20 20 7d 20 6d 65  ed..        } me
134a0 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  mory] == 0} then
134b0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
134c0 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
134d0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
134e0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
134f0 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72  ppendArgs $memor
13500 79 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20  y " bytes\n"].. 
13510 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
13520 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
13530 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f          set memo
13540 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20  ry unknown....  
13550 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
13560 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
13570 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
13580 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
13590 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d  rgs $memory \n].
135a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
135b0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
135c0 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
135d0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
135e0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
135f0 20 22 2d 2d 2d 2d 20 6d 61 78 69 6d 75 6d 20 6d   "---- maximum m
13600 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20  emory in use by 
13610 53 51 4c 69 74 65 4d 65 6d 6f 72 79 2e 2e 2e 20  SQLiteMemory... 
13620 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  "..        }....
13630 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
13640 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
13650 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
13660 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
13670 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
13680 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
13690 69 74 65 2e 53 51 4c 69 74 65 4d 65 6d 6f 72 79  ite.SQLiteMemory
136a0 20 6d 61 78 69 6d 75 6d 42 79 74 65 73 41 6c 6c   maximumBytesAll
136b0 6f 63 61 74 65 64 0d 0a 20 20 20 20 20 20 20 20  ocated..        
136c0 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20  } memory] == 0} 
136d0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
136e0 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
136f0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
13700 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
13710 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
13720 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e 22  emory " bytes\n"
13730 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
13740 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
13750 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
13760 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a  memory unknown..
13770 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
13780 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
13790 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
137a0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
137b0 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20  endArgs $memory 
137c0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
137d0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
137e0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
137f0 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
13800 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
13810 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
13820 63 75 72 72 65 6e 74 20 6d 65 6d 6f 72 79 20 69  current memory i
13830 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74 65 2e  n use by SQLite.
13840 2e 2e 20 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  .. "..      }...
13850 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63  .      if {[catc
13860 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a  h {..        obj
13870 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
13880 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
13890 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
138a0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55  em.Data.SQLite.U
138b0 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
138c0 64 73 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72  ds sqlite3_memor
138d0 79 5f 75 73 65 64 0d 0a 20 20 20 20 20 20 7d 20  y_used..      } 
138e0 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68  memory] == 0} th
138f0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
13900 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
13910 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
13920 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
13930 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20  endArgs $memory 
13940 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20  " bytes\n"]..   
13950 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20       }..      } 
13960 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
13970 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
13980 45 3a 20 4d 61 79 62 65 20 74 68 65 20 53 51 4c  E: Maybe the SQL
13990 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79  ite core library
139a0 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 3f   is unavailable?
139b0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
139c0 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20       set memory 
139d0 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20  unknown....     
139e0 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
139f0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
13a00 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
13a10 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65   [appendArgs $me
13a20 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  mory \n]..      
13a30 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
13a40 20 20 20 20 20 20 73 65 74 20 72 65 73 75 6c 74        set result
13a50 20 24 6d 65 6d 6f 72 79 3b 20 23 20 4e 4f 54 45   $memory; # NOTE
13a60 3a 20 52 65 74 75 72 6e 20 6d 65 6d 6f 72 79 20  : Return memory 
13a70 69 6e 2d 75 73 65 20 74 6f 20 6f 75 72 20 63 61  in-use to our ca
13a80 6c 6c 65 72 2e 0d 0a 0d 0a 20 20 20 20 20 20 69  ller.....      i
13a90 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
13aa0 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
13ab0 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
13ac0 20 6d 61 78 69 6d 75 6d 20 6d 65 6d 6f 72 79 20   maximum memory 
13ad0 69 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74 65  in use by SQLite
13ae0 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 7d 0d 0a  ... "..      }..
13af0 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74  ..      if {[cat
13b00 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62  ch {..        ob
13b10 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
13b20 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
13b30 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73  .            Sys
13b40 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
13b50 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
13b60 6f 64 73 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f  ods sqlite3_memo
13b70 72 79 5f 68 69 67 68 77 61 74 65 72 20 30 0d 0a  ry_highwater 0..
13b80 20 20 20 20 20 20 7d 20 6d 65 6d 6f 72 79 5d 20        } memory] 
13b90 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
13ba0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
13bb0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
13bc0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
13bd0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
13be0 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c  $memory " bytes\
13bf0 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  n"]..        }..
13c00 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
13c10 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
13c20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 79 62 65     # NOTE: Maybe
13c30 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65   the SQLite core
13c40 20 6c 69 62 72 61 72 79 20 69 73 20 75 6e 61 76   library is unav
13c50 61 69 6c 61 62 6c 65 3f 0d 0a 20 20 20 20 20 20  ailable?..      
13c60 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74    #..        set
13c70 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d   memory unknown.
13c80 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
13c90 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
13ca0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
13cb0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
13cc0 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d  Args $memory \n]
13cd0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
13ce0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
13cf0 20 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65 6e   {$collect} then
13d00 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c 6c   {..        coll
13d10 65 63 74 47 61 72 62 61 67 65 20 24 63 68 61 6e  ectGarbage $chan
13d20 6e 65 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  nel..      }....
13d30 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
13d40 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
13d50 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
13d60 6c 20 22 2d 2d 2d 2d 20 63 75 72 72 65 6e 74 20  l "---- current 
13d70 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79  memory in use by
13d80 20 74 68 65 20 43 4c 52 2e 2e 2e 20 22 0d 0a 20   the CLR... ".. 
13d90 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
13da0 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65  if {[catch {obje
13db0 63 74 20 69 6e 76 6f 6b 65 20 47 43 20 47 65 74  ct invoke GC Get
13dc0 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 66 61 6c 73  TotalMemory fals
13dd0 65 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d  e} memory] == 0}
13de0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
13df0 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 69 73 20   if {[string is 
13e00 69 6e 74 65 67 65 72 20 2d 73 74 72 69 63 74 20  integer -strict 
13e10 24 6d 65 6d 6f 72 79 5d 7d 20 74 68 65 6e 20 7b  $memory]} then {
13e20 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
13e30 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
13e40 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
13e50 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
13e60 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20  endArgs $memory 
13e70 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20  " bytes\n"]..   
13e80 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
13e90 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
13ea0 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79        set memory
13eb0 20 69 6e 76 61 6c 69 64 0d 0a 0d 0a 20 20 20 20   invalid....    
13ec0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
13ed0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
13ee0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
13ef0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
13f00 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20  s $memory \n].. 
13f10 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
13f20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65      }..      } e
13f30 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  lse {..        s
13f40 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77  et memory unknow
13f50 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n....        if 
13f60 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
13f70 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
13f80 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
13f90 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c  ndArgs $memory \
13fa0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  n]..        }.. 
13fb0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
13fc0 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a  return $result..
13fd0 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
13fe0 6f 63 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74  oc checkForSQLit
13ff0 65 44 69 72 65 63 74 6f 72 69 65 73 20 7b 20 63  eDirectories { c
14000 68 61 6e 6e 65 6c 20 7b 72 65 73 65 74 20 66 61  hannel {reset fa
14010 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  lse} } {..      
14020 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
14030 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 73 71   Check if the sq
14040 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f  lite3_win32_set_
14050 64 69 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69  directory functi
14060 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e  on is available.
14070 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
14080 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
14090 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 22 2d 2d  \..          "--
140a0 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
140b0 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33  function sqlite3
140c0 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63  _win32_set_direc
140d0 74 6f 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  tory... "....   
140e0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
140f0 54 45 3a 20 54 68 69 73 20 63 61 6c 6c 20 74 6f  TE: This call to
14100 20 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e   the sqlite3_win
14110 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79  32_set_directory
14120 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 74   function uses t
14130 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
14140 20 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 20    invalid value 
14150 30 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  0 for the first 
14160 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 69 73 20  argument.  This 
14170 63 6f 64 65 20 69 73 20 64 65 73 69 67 6e 65 64  code is designed
14180 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
14190 74 6f 20 63 68 65 63 6b 20 69 66 20 63 61 6c 6c  to check if call
141a0 69 6e 67 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ing the function
141b0 20 77 69 6c 6c 20 72 61 69 73 65 20 61 6e 20 65   will raise an e
141c0 78 63 65 70 74 69 6f 6e 20 28 69 2e 65 2e 0d 0a  xception (i.e...
141d0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
141e0 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74 20  e actual result 
141f0 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  of the function 
14200 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 20  does not matter 
14210 61 73 20 6c 6f 6e 67 20 61 73 20 6e 6f 0d 0a 20  as long as no.. 
14220 20 20 20 20 20 23 20 20 20 20 20 20 20 64 69 72       #       dir
14230 65 63 74 6f 72 79 20 69 73 20 63 68 61 6e 67 65  ectory is change
14240 64 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  d)...      #..  
14250 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
14260 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74  ..        object
14270 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
14280 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
14290 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
142a0 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61  Data.SQLite.Unsa
142b0 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20  feNativeMethods 
142c0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  \..            s
142d0 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
142e0 5f 64 69 72 65 63 74 6f 72 79 20 30 20 6e 75 6c  _directory 0 nul
142f0 6c 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30  l..      }] == 0
14300 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
14310 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
14320 4f 54 45 3a 20 43 61 6c 6c 69 6e 67 20 74 68 65  OTE: Calling the
14330 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
14340 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66 75 6e  et_directory fun
14350 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 0d 0a  ction does not..
14360 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
14370 63 61 75 73 65 20 61 6e 20 65 78 63 65 70 74 69  cause an excepti
14380 6f 6e 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 69  on; therefore, i
14390 74 20 6d 75 73 74 20 62 65 20 61 76 61 69 6c 61  t must be availa
143a0 62 6c 65 20 28 69 2e 65 2e 0d 0a 20 20 20 20 20  ble (i.e...     
143b0 20 20 20 23 20 20 20 20 20 20 20 65 76 65 6e 20     #       even 
143c0 74 68 6f 75 67 68 20 69 74 20 73 68 6f 75 6c 64  though it should
143d0 20 72 65 74 75 72 6e 20 61 20 66 61 69 6c 75 72   return a failur
143e0 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 6e  e return code in
143f0 20 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20 23   this..        #
14400 20 20 20 20 20 20 20 63 61 73 65 29 2e 0d 0a 20         case)... 
14410 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
14420 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
14430 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
14440 74 5f 64 69 72 65 63 74 6f 72 79 0d 0a 0d 0a 20  t_directory.... 
14450 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
14460 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 0d 0a 20  annel yes\n.... 
14470 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
14480 20 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20 6f    # NOTE: Does o
14490 75 72 20 63 61 6c 6c 65 72 20 77 61 6e 74 20 74  ur caller want t
144a0 6f 20 72 65 73 65 74 20 74 68 65 20 64 69 72 65  o reset the dire
144b0 63 74 6f 72 69 65 73 3f 0d 0a 20 20 20 20 20 20  ctories?..      
144c0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
144d0 7b 24 72 65 73 65 74 7d 20 74 68 65 6e 20 7b 0d  {$reset} then {.
144e0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
144f0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
14500 4e 6f 77 20 6d 61 6b 65 20 73 75 72 65 20 74 68  Now make sure th
14510 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  e database and t
14520 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f  emporary directo
14530 72 69 65 73 20 61 72 65 0d 0a 20 20 20 20 20 20  ries are..      
14540 20 20 20 20 23 20 20 20 20 20 20 20 72 65 73 65      #       rese
14550 74 20 74 68 65 69 72 20 64 65 66 61 75 6c 74 20  t their default 
14560 76 61 6c 75 65 73 2c 20 77 68 69 63 68 20 73 68  values, which sh
14570 6f 75 6c 64 20 62 65 20 6e 75 6c 6c 20 66 6f 72  ould be null for
14580 20 62 6f 74 68 2e 0d 0a 20 20 20 20 20 20 20 20   both...        
14590 20 20 23 20 20 20 20 20 20 20 53 69 6e 63 65 20    #       Since 
145a0 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  the sqlite3_win3
145b0 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20  2_set_directory 
145c0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 76 61 69  function is avai
145d0 6c 61 62 6c 65 2c 0d 0a 20 20 20 20 20 20 20 20  lable,..        
145e0 20 20 23 20 20 20 20 20 20 20 75 73 65 20 69 74    #       use it
145f0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
14600 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 7b 73            for {s
14610 65 74 20 69 6e 64 65 78 20 31 7d 20 7b 24 69 6e  et index 1} {$in
14620 64 65 78 20 3c 20 33 7d 20 7b 69 6e 63 72 20 69  dex < 3} {incr i
14630 6e 64 65 78 7d 20 7b 0d 0a 20 20 20 20 20 20 20  ndex} {..       
14640 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
14650 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
14660 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
14670 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
14680 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
14690 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
146a0 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e  a.SQLite.UnsafeN
146b0 61 74 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a  ativeMethods \..
146c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146d0 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f    sqlite3_win32_
146e0 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 24 69  set_directory $i
146f0 6e 64 65 78 20 6e 75 6c 6c 0d 0a 20 20 20 20 20  ndex null..     
14700 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d         } result]
14710 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
14720 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
14730 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
14740 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
14750 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
14760 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f  -- call sqlite3_
14770 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
14780 6f 72 79 28 22 20 24 69 6e 64 65 78 20 5c 0d 0a  ory(" $index \..
14790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147a0 20 20 22 2c 20 6e 75 6c 6c 29 2e 2e 2e 20 6f 6b    ", null)... ok
147b0 3a 20 22 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d  : " $result \n].
147c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65  .            } e
147d0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
147e0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
147f0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
14800 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
14810 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20       "---- call 
14820 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
14830 74 5f 64 69 72 65 63 74 6f 72 79 28 22 20 24 69  t_directory(" $i
14840 6e 64 65 78 20 5c 0d 0a 20 20 20 20 20 20 20 20  ndex \..        
14850 20 20 20 20 20 20 20 20 20 20 22 2c 20 6e 75 6c            ", nul
14860 6c 29 2e 2e 2e 20 65 72 72 6f 72 3a 20 22 20 5c  l)... error: " \
14870 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d  n\t $result \n].
14880 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
14890 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
148a0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20       }..      } 
148b0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
148c0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e  tputs $channel n
148d0 6f 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  o\n....        #
148e0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
148f0 3a 20 44 6f 65 73 20 6f 75 72 20 63 61 6c 6c 65  : Does our calle
14900 72 20 77 61 6e 74 20 74 6f 20 72 65 73 65 74 20  r want to reset 
14910 74 68 65 20 64 69 72 65 63 74 6f 72 69 65 73 3f  the directories?
14920 20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 0d    This can only.
14930 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
14940 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66   be performed if
14950 20 53 51 4c 69 74 65 20 69 73 20 6c 6f 61 64 65   SQLite is loade
14960 64 20 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20  d and ready for 
14970 75 73 65 20 62 79 20 74 68 65 20 74 65 73 74 0d  use by the test.
14980 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
14990 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20   suite...       
149a0 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
149b0 24 72 65 73 65 74 20 26 26 20 5b 69 73 53 51 4c  $reset && [isSQL
149c0 69 74 65 52 65 61 64 79 5d 7d 20 74 68 65 6e 20  iteReady]} then 
149d0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
149e0 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
149f0 3a 20 4e 6f 77 20 6d 61 6b 65 20 73 75 72 65 20  : Now make sure 
14a00 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
14a10 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63   temporary direc
14a20 74 6f 72 69 65 73 20 61 72 65 0d 0a 20 20 20 20  tories are..    
14a30 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65        #       re
14a40 73 65 74 20 74 68 65 69 72 20 64 65 66 61 75 6c  set their defaul
14a50 74 20 76 61 6c 75 65 73 2c 20 77 68 69 63 68 20  t values, which 
14a60 73 68 6f 75 6c 64 20 62 65 20 6e 75 6c 6c 20 66  should be null f
14a70 6f 72 20 62 6f 74 68 2e 0d 0a 20 20 20 20 20 20  or both...      
14a80 20 20 20 20 23 20 20 20 20 20 20 20 53 69 6e 63      #       Sinc
14a90 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69  e the sqlite3_wi
14aa0 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
14ab0 79 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  y function does 
14ac0 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20 20 20 23  not..          #
14ad0 20 20 20 20 20 20 20 61 70 70 65 61 72 20 74 6f         appear to
14ae0 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 75   be available, u
14af0 73 65 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  se the associate
14b00 64 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64  d PRAGMA command
14b10 73 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  s..          #  
14b20 20 20 20 20 20 69 6e 73 74 65 61 64 2e 0d 0a 20       instead... 
14b30 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
14b40 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 64 69        foreach di
14b50 72 65 63 74 6f 72 79 20 5b 6c 69 73 74 20 64 61  rectory [list da
14b60 74 61 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  ta_store_directo
14b70 72 79 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69  ry temp_store_di
14b80 72 65 63 74 6f 72 79 5d 20 7b 0d 0a 20 20 20 20  rectory] {..    
14b90 20 20 20 20 20 20 20 20 73 65 74 20 73 71 6c 20          set sql 
14ba0 5b 61 70 70 65 6e 64 41 72 67 73 20 22 50 52 41  [appendArgs "PRA
14bb0 47 4d 41 20 22 20 24 64 69 72 65 63 74 6f 72 79  GMA " $directory
14bc0 20 22 20 3d 20 5c 22 5c 22 3b 22 5d 0d 0a 0d 0a   " = \"\";"]....
14bd0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
14be0 5b 63 61 74 63 68 20 7b 65 78 65 63 75 74 65 53  [catch {executeS
14bf0 71 6c 20 24 73 71 6c 7d 20 72 65 73 75 6c 74 5d  ql $sql} result]
14c00 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
14c10 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
14c20 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
14c30 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
14c40 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
14c50 2d 2d 20 65 78 65 63 75 74 65 20 50 52 41 47 4d  -- execute PRAGM
14c60 41 20 22 20 24 64 69 72 65 63 74 6f 72 79 20 22  A " $directory "
14c70 2e 2e 2e 20 6f 6b 3a 20 5c 22 22 20 5c 0d 0a 20  ... ok: \"" \.. 
14c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c90 20 24 72 65 73 75 6c 74 20 5c 22 5c 6e 5d 0d 0a   $result \"\n]..
14ca0 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
14cb0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
14cc0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
14cd0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
14ce0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
14cf0 20 20 20 20 22 2d 2d 2d 2d 20 65 78 65 63 75 74      "---- execut
14d00 65 20 50 52 41 47 4d 41 20 22 20 24 64 69 72 65  e PRAGMA " $dire
14d10 63 74 6f 72 79 20 22 2e 2e 2e 20 65 72 72 6f 72  ctory "... error
14d20 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  : " \..         
14d30 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72           \n\t $r
14d40 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20  esult \n]..     
14d50 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
14d60 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
14d70 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
14d80 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
14d90 54 45 3a 20 46 69 6e 61 6c 6c 79 2c 20 73 68 6f  TE: Finally, sho
14da0 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  w the current va
14db0 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  lue of the datab
14dc0 61 73 65 20 61 6e 64 20 74 65 6d 70 6f 72 61 72  ase and temporar
14dd0 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
14de0 20 64 69 72 65 63 74 6f 72 69 65 73 2e 20 20 54   directories.  T
14df0 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20  his can only be 
14e00 70 65 72 66 6f 72 6d 65 64 20 69 66 20 53 51 4c  performed if SQL
14e10 69 74 65 20 69 73 20 6c 6f 61 64 65 64 0d 0a 20  ite is loaded.. 
14e20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6e 64       #       and
14e30 20 72 65 61 64 79 20 66 6f 72 20 75 73 65 20 62   ready for use b
14e40 79 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  y the test suite
14e50 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
14e60 20 20 69 66 20 7b 5b 69 73 53 51 4c 69 74 65 52    if {[isSQLiteR
14e70 65 61 64 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  eady]} then {.. 
14e80 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 64         foreach d
14e90 69 72 65 63 74 6f 72 79 20 5b 6c 69 73 74 20 64  irectory [list d
14ea0 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65 63 74  ata_store_direct
14eb0 6f 72 79 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64  ory temp_store_d
14ec0 69 72 65 63 74 6f 72 79 5d 20 7b 0d 0a 20 20 20  irectory] {..   
14ed0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
14ee0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
14ef0 73 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67  s "---- checking
14f00 20 22 20 24 64 69 72 65 63 74 6f 72 79 20 22 2e   " $directory ".
14f10 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  .. "]....       
14f20 20 20 20 73 65 74 20 73 71 6c 20 5b 61 70 70 65     set sql [appe
14f30 6e 64 41 72 67 73 20 22 50 52 41 47 4d 41 20 22  ndArgs "PRAGMA "
14f40 20 24 64 69 72 65 63 74 6f 72 79 20 5c 3b 5d 0d   $directory \;].
14f50 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
14f60 7b 5b 63 61 74 63 68 20 7b 65 78 65 63 75 74 65  {[catch {execute
14f70 53 71 6c 20 24 73 71 6c 20 73 63 61 6c 61 72 7d  Sql $sql scalar}
14f80 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74   result] == 0} t
14f90 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
14fa0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
14fb0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 6f  l [appendArgs "o
14fc0 6b 3a 20 5c 22 22 20 24 72 65 73 75 6c 74 20 5c  k: \"" $result \
14fd0 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  "\n]..          
14fe0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
14ff0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
15000 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
15010 20 22 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20   "error: " \n\t 
15020 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
15030 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
15040 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
15050 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
15060 20 6c 6f 61 64 53 51 4c 69 74 65 54 65 73 74 53   loadSQLiteTestS
15070 65 74 74 69 6e 67 73 20 7b 20 63 68 61 6e 6e 65  ettings { channe
15080 6c 20 7b 73 75 66 66 69 78 20 22 22 7d 20 7b 71  l {suffix ""} {q
15090 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  uiet false} } {.
150a0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
150b0 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 6c 6f 61  # NOTE: Skip loa
150c0 64 69 6e 67 20 74 68 65 20 73 65 74 74 69 6e 67  ding the setting
150d0 73 20 69 66 20 74 68 65 69 72 20 75 73 61 67 65  s if their usage
150e0 20 68 61 73 20 62 65 65 6e 20 64 69 73 61 62 6c   has been disabl
150f0 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ed...      #..  
15100 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
15110 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74  xists ::no(sqlit
15120 65 54 65 73 74 53 65 74 74 69 6e 67 73 29 5d 7d  eTestSettings)]}
15130 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
15140 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
15150 54 45 3a 20 4c 6f 61 64 20 63 75 73 74 6f 6d 20  TE: Load custom 
15160 70 65 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20  per-user and/or 
15170 70 65 72 2d 68 6f 73 74 20 74 65 73 74 20 73 65  per-host test se
15180 74 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20 20  ttings now...   
15190 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
151a0 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
151b0 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28   ::tcl_platform(
151c0 75 73 65 72 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  user)]} then {..
151d0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 75 73            set us
151e0 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61  erSettingsFileNa
151f0 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67  me [file join [g
15200 65 74 43 6f 6d 6d 6f 6e 44 69 72 65 63 74 6f 72  etCommonDirector
15210 79 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  y] \..          
15220 20 20 20 20 5b 61 70 70 65 6e 64 41 72 67 73 20      [appendArgs 
15230 73 65 74 74 69 6e 67 73 20 24 73 75 66 66 69 78  settings $suffix
15240 20 2e 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f   . $::tcl_platfo
15250 72 6d 28 75 73 65 72 29 20 2e 65 61 67 6c 65 5d  rm(user) .eagle]
15260 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  ]....          i
15270 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20  f {[file exists 
15280 24 75 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c  $userSettingsFil
15290 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
152a0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
152b0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
152c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
152d0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
152e0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
152f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
15300 2d 2d 2d 2d 20 6c 6f 61 64 69 6e 67 20 70 65 72  ---- loading per
15310 2d 75 73 65 72 20 74 65 73 74 20 73 65 74 74 69  -user test setti
15320 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a  ngs file \"" \..
15330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15340 20 20 24 75 73 65 72 53 65 74 74 69 6e 67 73 46    $userSettingsF
15350 69 6c 65 4e 61 6d 65 20 5c 22 2e 2e 2e 5c 6e 5d  ileName \"...\n]
15360 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
15370 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
15380 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
15390 20 20 20 20 20 20 20 20 20 20 20 75 70 6c 65 76             uplev
153a0 65 6c 20 31 20 5b 6c 69 73 74 20 73 6f 75 72 63  el 1 [list sourc
153b0 65 20 24 75 73 65 72 53 65 74 74 69 6e 67 73 46  e $userSettingsF
153c0 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20  ileName]..      
153d0 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d 7d 20        } error]} 
153e0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
153f0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
15400 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
15410 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
15420 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
15430 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
15440 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
15450 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
15460 65 64 20 74 6f 20 6c 6f 61 64 20 70 65 72 2d 75  ed to load per-u
15470 73 65 72 20 73 65 74 74 69 6e 67 73 20 66 69 6c  ser settings fil
15480 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  e \"" \..       
15490 20 20 20 20 20 20 20 20 20 20 20 20 20 24 75 73               $us
154a0 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61  erSettingsFileNa
154b0 6d 65 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22  me "\", error: "
154c0 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d   \n\t $error \n]
154d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
154e0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
154f0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
15500 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
15510 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
15520 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
15530 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
15540 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
15550 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
15560 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70       "---- skipp
15570 65 64 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d 75  ed loading per-u
15580 73 65 72 20 74 65 73 74 20 73 65 74 74 69 6e 67  ser test setting
15590 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20  s file \"" \..  
155a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
155b0 24 75 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c  $userSettingsFil
155c0 65 4e 61 6d 65 20 22 5c 22 2c 20 69 74 20 64 6f  eName "\", it do
155d0 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d  es not exist\n"]
155e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
155f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
15600 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
15610 20 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23     #############
15620 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15630 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15640 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15650 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20  ##########....  
15660 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
15670 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61  exists ::tcl_pla
15680 74 66 6f 72 6d 28 68 6f 73 74 29 5d 7d 20 74 68  tform(host)]} th
15690 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
156a0 73 65 74 20 68 6f 73 74 53 65 74 74 69 6e 67 73  set hostSettings
156b0 46 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a  FileName [file j
156c0 6f 69 6e 20 5b 67 65 74 43 6f 6d 6d 6f 6e 44 69  oin [getCommonDi
156d0 72 65 63 74 6f 72 79 5d 20 5c 0d 0a 20 20 20 20  rectory] \..    
156e0 20 20 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e            [appen
156f0 64 41 72 67 73 20 73 65 74 74 69 6e 67 73 20 24  dArgs settings $
15700 73 75 66 66 69 78 20 2e 20 24 3a 3a 74 63 6c 5f  suffix . $::tcl_
15710 70 6c 61 74 66 6f 72 6d 28 68 6f 73 74 29 20 2e  platform(host) .
15720 65 61 67 6c 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20  eagle]]....     
15730 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65       if {[file e
15740 78 69 73 74 73 20 24 68 6f 73 74 53 65 74 74 69  xists $hostSetti
15750 6e 67 73 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  ngsFileName]} th
15760 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
15770 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
15780 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
15790 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
157a0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
157b0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
157c0 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 6f 61 64 69       "---- loadi
157d0 6e 67 20 70 65 72 2d 68 6f 73 74 20 74 65 73 74  ng per-host test
157e0 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c   settings file \
157f0 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
15800 20 20 20 20 20 20 20 20 24 68 6f 73 74 53 65 74          $hostSet
15810 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 5c 22  tingsFileName \"
15820 2e 2e 2e 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ...\n]..        
15830 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
15840 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
15850 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
15860 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74   uplevel 1 [list
15870 20 73 6f 75 72 63 65 20 24 68 6f 73 74 53 65 74   source $hostSet
15880 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 5d 0d 0a  tingsFileName]..
15890 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 72              } er
158a0 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ror]} then {..  
158b0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
158c0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
158d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
158e0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
158f0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
15900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15910 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
15920 3a 20 66 61 69 6c 65 64 20 74 6f 20 6c 6f 61 64  : failed to load
15930 20 70 65 72 2d 68 6f 73 74 20 73 65 74 74 69 6e   per-host settin
15940 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20  gs file \"" \.. 
15950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15960 20 20 20 24 68 6f 73 74 53 65 74 74 69 6e 67 73     $hostSettings
15970 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 65 72  FileName "\", er
15980 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72  ror: " \n\t $err
15990 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  or \n]..        
159a0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
159b0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
159c0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
159d0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
159e0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
159f0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
15a00 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
15a10 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
15a20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
15a30 20 73 6b 69 70 70 65 64 20 6c 6f 61 64 69 6e 67   skipped loading
15a40 20 70 65 72 2d 68 6f 73 74 20 74 65 73 74 20 73   per-host test s
15a50 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22  ettings file \""
15a60 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
15a70 20 20 20 20 20 20 24 68 6f 73 74 53 65 74 74 69        $hostSetti
15a80 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c  ngsFileName "\",
15a90 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
15aa0 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  st\n"]..        
15ab0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
15ac0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
15ad0 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
15ae0 0d 0a 20 20 20 20 70 72 6f 63 20 72 75 6e 53 51  ..    proc runSQ
15af0 4c 69 74 65 54 65 73 74 50 72 6f 6c 6f 67 75 65  LiteTestPrologue
15b00 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
15b10 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b        # NOTE: Sk
15b20 69 70 20 72 75 6e 6e 69 6e 67 20 6f 75 72 20 63  ip running our c
15b30 75 73 74 6f 6d 20 70 72 6f 6c 6f 67 75 65 20 69  ustom prologue i
15b40 66 20 74 68 65 20 6d 61 69 6e 20 6f 6e 65 20 68  f the main one h
15b50 61 73 20 62 65 65 6e 0d 0a 20 20 20 20 20 20 23  as been..      #
15b60 20 20 20 20 20 20 20 73 6b 69 70 70 65 64 2e 0d         skipped..
15b70 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
15b80 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
15b90 73 20 3a 3a 6e 6f 28 70 72 6f 6c 6f 67 75 65 2e  s ::no(prologue.
15ba0 65 61 67 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d  eagle)]} then {.
15bb0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
15bc0 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64      # NOTE: Load
15bd0 20 74 68 65 20 22 62 65 66 6f 72 65 2d 63 6f 6e   the "before-con
15be0 73 74 72 61 69 6e 74 73 22 20 63 75 73 74 6f 6d  straints" custom
15bf0 20 70 65 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72   per-user and/or
15c00 20 70 65 72 2d 68 6f 73 74 0d 0a 20 20 20 20 20   per-host..     
15c10 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74 20     #       test 
15c20 73 65 74 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20  settings now... 
15c30 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
15c40 20 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73    uplevel 1 [lis
15c50 74 20 6c 6f 61 64 53 51 4c 69 74 65 54 65 73 74  t loadSQLiteTest
15c60 53 65 74 74 69 6e 67 73 20 24 3a 3a 74 65 73 74  Settings $::test
15c70 5f 63 68 61 6e 6e 65 6c 20 2e 62 65 66 6f 72 65  _channel .before
15c80 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
15c90 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
15ca0 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 61  Determine the na
15cb0 6d 65 73 20 6f 66 20 74 68 65 20 6e 61 74 69 76  mes of the nativ
15cc0 65 20 70 6c 61 74 66 6f 72 6d 20 61 6e 64 20 61  e platform and a
15cd0 72 63 68 69 74 65 63 74 75 72 65 2e 0d 0a 20 20  rchitecture...  
15ce0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
15cf0 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 5b 67   set platform [g
15d00 65 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20  etBuildPlatform 
15d10 74 72 75 65 5d 0d 0a 20 20 20 20 20 20 20 20 73  true]..        s
15d20 65 74 20 61 72 63 68 69 74 65 63 74 75 72 65 20  et architecture 
15d30 5b 61 72 63 68 69 74 65 63 74 75 72 65 46 6f 72  [architectureFor
15d40 50 6c 61 74 66 6f 72 6d 20 24 70 6c 61 74 66 6f  Platform $platfo
15d50 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  rm]....        #
15d60 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
15d70 3a 20 53 68 6f 77 20 74 68 65 20 70 6c 61 74 66  : Show the platf
15d80 6f 72 6d 20 61 6e 64 20 61 72 63 68 69 74 65 63  orm and architec
15d90 74 75 72 65 20 75 73 65 64 20 74 6f 20 68 65 6c  ture used to hel
15da0 70 20 6c 6f 63 61 74 65 20 74 68 65 0d 0a 20 20  p locate the..  
15db0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61        #       na
15dc0 74 69 76 65 20 62 75 69 6c 64 20 66 69 6c 65 73  tive build files
15dd0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
15de0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
15df0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
15e00 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
15e10 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 70 6c 61         "---- pla
15e20 74 66 6f 72 6d 20 66 6f 72 20 6c 6f 63 61 74 69  tform for locati
15e30 6e 67 20 6e 61 74 69 76 65 20 62 75 69 6c 64 20  ng native build 
15e40 66 69 6c 65 73 20 69 73 20 5c 22 22 20 5c 0d 0a  files is \"" \..
15e50 20 20 20 20 20 20 20 20 20 20 20 20 24 70 6c 61              $pla
15e60 74 66 6f 72 6d 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20  tform \"\n].... 
15e70 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
15e80 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
15e90 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
15ea0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 61 72          "---- ar
15eb0 63 68 69 74 65 63 74 75 72 65 20 66 6f 72 20 6c  chitecture for l
15ec0 6f 63 61 74 69 6e 67 20 6e 61 74 69 76 65 20 62  ocating native b
15ed0 75 69 6c 64 20 66 69 6c 65 73 20 69 73 20 5c 22  uild files is \"
15ee0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
15ef0 20 24 61 72 63 68 69 74 65 63 74 75 72 65 20 5c   $architecture \
15f00 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  "\n]....        
15f10 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
15f20 45 3a 20 42 75 69 6c 64 20 61 20 6c 69 73 74 20  E: Build a list 
15f30 6f 66 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  of configuration
15f40 20 66 69 6c 65 73 20 74 68 61 74 20 77 65 20 68   files that we h
15f50 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  andle...        
15f60 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63  #..        set c
15f70 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 5b  onfigFileNames [
15f80 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  list \..        
15f90 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
15fa0 53 51 4c 69 74 65 2e 64 6c 6c 2e 63 6f 6e 66 69  SQLite.dll.confi
15fb0 67 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  g]....        #.
15fc0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
15fd0 20 42 75 69 6c 64 20 61 20 6c 69 73 74 20 6f 66   Build a list of
15fe0 20 61 75 78 69 6c 69 61 72 79 20 4d 61 6e 61 67   auxiliary Manag
15ff0 65 64 20 44 65 62 75 67 67 69 6e 67 20 41 73 73  ed Debugging Ass
16000 69 73 74 61 6e 74 73 20 28 4d 44 41 29 0d 0a 20  istants (MDA).. 
16010 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
16020 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 69 6c  onfiguration fil
16030 65 73 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c  es that we handl
16040 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
16050 20 20 20 20 20 20 20 73 65 74 20 6d 64 61 43 6f         set mdaCo
16060 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 5b 6c  nfigFileNames [l
16070 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ist \..         
16080 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 33 32 2e     EagleShell32.
16090 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 49  exe.mda.config I
160a0 6e 73 74 61 6c 6c 65 72 2e 65 78 65 2e 6d 64 61  nstaller.exe.mda
160b0 2e 63 6f 6e 66 69 67 20 5c 0d 0a 20 20 20 20 20  .config \..     
160c0 20 20 20 20 20 20 20 74 65 73 74 2e 65 78 65 2e         test.exe.
160d0 6d 64 61 2e 63 6f 6e 66 69 67 20 74 65 73 74 6c  mda.config testl
160e0 69 6e 71 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66  inq.exe.mda.conf
160f0 69 67 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ig \..          
16100 20 20 74 65 73 74 65 66 36 2e 65 78 65 2e 6d 64    testef6.exe.md
16110 61 2e 63 6f 6e 66 69 67 5d 0d 0a 0d 0a 20 20 20  a.config]....   
16120 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
16130 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68  # NOTE: Build th
16140 65 20 6c 69 73 74 20 6f 66 20 65 78 74 65 72 6e  e list of extern
16150 61 6c 20 66 69 6c 65 73 20 74 68 61 74 20 77 65  al files that we
16160 20 68 61 6e 64 6c 65 2e 20 20 53 6f 6d 65 20 6f   handle.  Some o
16170 66 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  f..        #    
16180 20 20 20 74 68 65 73 65 20 66 69 6c 65 73 20 6d     these files m
16190 61 79 20 62 65 20 6e 61 74 69 76 65 20 61 6e 64  ay be native and
161a0 2f 6f 72 20 6d 61 6e 61 67 65 64 20 61 73 73 65  /or managed asse
161b0 6d 62 6c 69 65 73 20 74 68 61 74 20 61 72 65 0d  mblies that are.
161c0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
161d0 20 72 65 71 75 69 72 65 64 20 74 6f 20 70 65 72   required to per
161e0 66 6f 72 6d 20 76 61 72 69 6f 75 73 20 74 65 73  form various tes
161f0 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ts...        #..
16200 20 20 20 20 20 20 20 20 73 65 74 20 65 78 74 65          set exte
16210 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 73 20 5b 6c  rnalFileNames [l
16220 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ist \..         
16230 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 45 6e     [file join En
16240 74 69 74 79 46 72 61 6d 65 77 6f 72 6b 20 6c 69  tityFramework li
16250 62 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c  b [string map [l
16260 69 73 74 20 46 78 20 22 22 5d 20 5b 73 74 72 69  ist Fx ""] [stri
16270 6e 67 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ng \..          
16280 20 20 6d 61 70 20 5b 6c 69 73 74 20 6e 65 74 46    map [list netF
16290 78 34 35 31 20 6e 65 74 46 78 34 35 5d 20 5b 67  x451 netFx45] [g
162a0 65 74 42 75 69 6c 64 4e 65 74 46 78 5d 5d 5d 20  etBuildNetFx]]] 
162b0 45 6e 74 69 74 79 46 72 61 6d 65 77 6f 72 6b 2e  EntityFramework.
162c0 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  dll]]....       
162d0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
162e0 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 6c 69  TE: Build the li
162f0 73 74 20 6f 66 20 6e 61 74 69 76 65 20 61 73 73  st of native ass
16300 65 6d 62 6c 79 20 66 69 6c 65 73 20 74 68 61 74  embly files that
16310 20 77 65 20 68 61 6e 64 6c 65 2e 20 20 54 68 65   we handle.  The
16320 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
16330 20 20 72 65 61 73 6f 6e 20 74 68 65 20 22 53 79    reason the "Sy
16340 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
16350 2e 64 6c 6c 22 20 66 69 6c 65 20 69 73 20 69 6e  .dll" file is in
16360 63 6c 75 64 65 64 20 68 65 72 65 20 69 73 0d 0a  cluded here is..
16370 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
16380 62 65 63 61 75 73 65 20 69 74 20 63 6f 75 6c 64  because it could
16390 20 62 65 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f   be the mixed-mo
163a0 64 65 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20  de assembly...  
163b0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
163c0 20 73 65 74 20 6e 61 74 69 76 65 46 69 6c 65 4e   set nativeFileN
163d0 61 6d 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20  ames [list \..  
163e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
163f0 33 2e 64 6c 6c 20 53 51 4c 69 74 65 2e 49 6e 74  3.dll SQLite.Int
16400 65 72 6f 70 2e 64 6c 6c 20 53 79 73 74 65 6d 2e  erop.dll System.
16410 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d  Data.SQLite.dll]
16420 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
16430 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42         # NOTE: B
16440 75 69 6c 64 20 74 68 65 20 6c 69 73 74 20 6f 66  uild the list of
16450 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c   managed assembl
16460 79 20 66 69 6c 65 73 20 74 68 61 74 20 77 65 20  y files that we 
16470 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20  handle...       
16480 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
16490 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73  managedFileNames
164a0 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20   [list \..      
164b0 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
164c0 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 20 53 79 73  a.SQLite.dll Sys
164d0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
164e0 4c 69 6e 71 2e 64 6c 6c 20 5c 0d 0a 20 20 20 20  Linq.dll \..    
164f0 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
16500 61 74 61 2e 53 51 4c 69 74 65 2e 45 46 36 2e 64  ata.SQLite.EF6.d
16510 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  ll]....        #
16520 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
16530 3a 20 52 65 6d 6f 76 65 20 61 6e 79 20 74 65 73  : Remove any tes
16540 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 68  t constraints th
16550 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 20  at refer to the 
16560 6e 61 74 69 76 65 20 61 6e 64 2f 6f 72 0d 0a 20  native and/or.. 
16570 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6d         #       m
16580 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 20  anaged assembly 
16590 66 69 6c 65 73 20 74 68 61 74 20 77 65 20 68 61  files that we ha
165a0 6e 64 6c 65 20 75 6e 6c 65 73 73 20 66 6f 72 62  ndle unless forb
165b0 69 64 64 65 6e 20 66 72 6f 6d 0d 0a 20 20 20 20  idden from..    
165c0 20 20 20 20 23 20 20 20 20 20 20 20 64 6f 69 6e      #       doin
165d0 67 20 73 6f 2e 0d 0a 20 20 20 20 20 20 20 20 23  g so...        #
165e0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
165f0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
16600 28 73 71 6c 69 74 65 52 65 6d 6f 76 65 43 6f 6e  (sqliteRemoveCon
16610 73 74 72 61 69 6e 74 73 29 5d 7d 20 74 68 65 6e  straints)]} then
16620 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f   {..          fo
16630 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
16640 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20  configFileNames 
16650 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  {..            r
16660 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  emoveConstraint 
16670 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
16680 5f 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20  _ $fileName]..  
16690 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
166a0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
166b0 69 6c 65 4e 61 6d 65 20 24 6d 64 61 43 6f 6e 66  ileName $mdaConf
166c0 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  igFileNames {.. 
166d0 20 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76             remov
166e0 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  eConstraint [app
166f0 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 24 66  endArgs file_ $f
16700 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20  ileName]..      
16710 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
16720 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
16730 61 6d 65 20 24 65 78 74 65 72 6e 61 6c 46 69 6c  ame $externalFil
16740 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
16750 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73        removeCons
16760 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
16770 67 73 20 66 69 6c 65 5f 20 5b 66 69 6c 65 20 74  gs file_ [file t
16780 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d  ail $fileName]].
16790 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
167a0 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
167b0 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69  h fileName $nati
167c0 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  veFileNames {.. 
167d0 20 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76             remov
167e0 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  eConstraint [app
167f0 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 24 66  endArgs file_ $f
16800 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20  ileName]..      
16810 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
16820 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
16830 61 6d 65 20 24 6d 61 6e 61 67 65 64 46 69 6c 65  ame $managedFile
16840 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
16850 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74       removeConst
16860 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
16870 73 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61 6d  s file_ $fileNam
16880 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  e]..          }.
16890 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
168a0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
168b0 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 61 6c   # NOTE: Skip al
168c0 6c 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  l System.Data.SQ
168d0 4c 69 74 65 20 72 65 6c 61 74 65 64 20 66 69 6c  Lite related fil
168e0 65 20 68 61 6e 64 6c 69 6e 67 20 28 64 65 6c 65  e handling (dele
168f0 74 69 6e 67 2c 0d 0a 20 20 20 20 20 20 20 20 23  ting,..        #
16900 20 20 20 20 20 20 20 63 6f 70 79 69 6e 67 2c 20         copying, 
16910 61 6e 64 20 6c 6f 61 64 69 6e 67 29 20 69 66 20  and loading) if 
16920 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20  instructed...   
16930 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
16940 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
16950 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 46 69 6c  s ::no(sqliteFil
16960 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
16970 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
16980 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69       # NOTE: Ski
16990 70 20 74 72 79 69 6e 67 20 74 6f 20 64 65 6c 65  p trying to dele
169a0 74 65 20 61 6e 79 20 66 69 6c 65 73 20 69 66 20  te any files if 
169b0 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20  instructed...   
169c0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
169d0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
169e0 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74  xists ::no(delet
169f0 65 53 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20  eSqliteFiles)]} 
16a00 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
16a10 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
16a20 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74  xists ::no(delet
16a30 65 53 71 6c 69 74 65 43 6f 6e 66 69 67 46 69 6c  eSqliteConfigFil
16a40 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
16a50 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
16a60 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 63 6f  ach fileName $co
16a70 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  nfigFileNames {.
16a80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16a90 20 74 72 79 44 65 6c 65 74 65 42 69 6e 61 72 79   tryDeleteBinary
16aa0 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a  File $fileName..
16ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
16ac0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
16ad0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
16ae0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
16af0 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74  ::no(deleteSqlit
16b00 65 45 78 74 65 72 6e 61 6c 46 69 6c 65 73 29 5d  eExternalFiles)]
16b10 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
16b20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
16b30 66 69 6c 65 4e 61 6d 65 20 24 6d 64 61 43 6f 6e  fileName $mdaCon
16b40 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  figFileNames {..
16b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b60 74 72 79 44 65 6c 65 74 65 42 75 69 6c 64 46 69  tryDeleteBuildFi
16b70 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20  le $fileName..  
16b80 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
16b90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .              f
16ba0 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
16bb0 24 65 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d  $externalFileNam
16bc0 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
16bd0 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 42        tryDeleteB
16be0 69 6e 61 72 79 46 69 6c 65 20 24 66 69 6c 65 4e  inaryFile $fileN
16bf0 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ame..           
16c00 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
16c10 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
16c20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
16c30 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65  ists ::no(delete
16c40 53 71 6c 69 74 65 4e 61 74 69 76 65 46 69 6c 65  SqliteNativeFile
16c50 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
16c60 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
16c70 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
16c80 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 49 6d  o(deleteSqliteIm
16c90 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d 20 74  plicitFiles)]} t
16ca0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
16cb0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
16cc0 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46  ileName $nativeF
16cd0 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
16ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
16cf0 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79 20  yDeleteAssembly 
16d00 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  $fileName..     
16d10 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
16d20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
16d30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
16d40 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
16d50 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69   ::no(deleteSqli
16d60 74 65 4e 6f 6e 49 6d 70 6c 69 63 69 74 46 69 6c  teNonImplicitFil
16d70 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
16d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
16d90 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
16da0 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74  ::no(deleteSqlit
16db0 65 50 6c 61 74 66 6f 72 6d 46 69 6c 65 73 29 5d  ePlatformFiles)]
16dc0 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
16dd0 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69             [stri
16de0 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66  ng length $platf
16df0 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  orm] > 0} then {
16e00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
16e10 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
16e20 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65  Name $nativeFile
16e30 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
16e40 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
16e50 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 24  DeleteAssembly $
16e60 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f  fileName $platfo
16e70 72 6d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  rm..            
16e80 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
16e90 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
16ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
16eb0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
16ec0 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74  ::no(deleteSqlit
16ed0 65 41 72 63 68 69 74 65 63 74 75 72 65 46 69 6c  eArchitectureFil
16ee0 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  es)] && \..     
16ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
16f00 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 61  string length $a
16f10 72 63 68 69 74 65 63 74 75 72 65 5d 20 3e 20 30  rchitecture] > 0
16f20 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
16f30 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
16f40 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61  ach fileName $na
16f50 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  tiveFileNames {.
16f60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16f70 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 41 73       tryDeleteAs
16f80 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65  sembly $fileName
16f90 20 24 61 72 63 68 69 74 65 63 74 75 72 65 0d 0a   $architecture..
16fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fb0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
16fc0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
16fd0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
16fe0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
16ff0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
17000 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c   exists ::no(del
17010 65 74 65 53 71 6c 69 74 65 4d 61 6e 61 67 65 64  eteSqliteManaged
17020 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
17030 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .              f
17040 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
17050 24 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65  $managedFileName
17060 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
17070 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 41 73       tryDeleteAs
17080 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65  sembly $fileName
17090 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
170a0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
170b0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
170c0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
170d0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
170e0 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20 22 61  Check for the "a
170f0 75 74 6f 53 65 6c 65 63 74 22 20 72 75 6e 74 69  utoSelect" runti
17100 6d 65 20 6f 70 74 69 6f 6e 2e 20 20 49 66 20 70  me option.  If p
17110 72 65 73 65 6e 74 2c 0d 0a 20 20 20 20 20 20 20  resent,..       
17120 20 20 20 23 20 20 20 20 20 20 20 61 74 74 65 6d     #       attem
17130 70 74 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61  pt to automatica
17140 6c 6c 79 20 73 65 6c 65 63 74 20 74 68 65 20 66  lly select the f
17150 69 72 73 74 20 61 76 61 69 6c 61 62 6c 65 0d 0a  irst available..
17160 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
17170 20 20 62 75 69 6c 64 20 28 6f 72 20 22 72 65 6c    build (or "rel
17180 65 61 73 65 22 29 20 6f 66 20 53 51 4c 69 74 65  ease") of SQLite
17190 20 61 6e 64 20 53 79 73 74 65 6d 2e 44 61 74 61   and System.Data
171a0 2e 53 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 20  .SQLite..       
171b0 20 20 20 23 20 20 20 20 20 20 20 66 6f 72 20 75     #       for u
171c0 73 65 20 77 69 74 68 20 74 68 65 20 74 65 73 74  se with the test
171d0 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20   suite...       
171e0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
171f0 69 66 20 7b 5b 68 61 73 52 75 6e 74 69 6d 65 4f  if {[hasRuntimeO
17200 70 74 69 6f 6e 20 61 75 74 6f 53 65 6c 65 63 74  ption autoSelect
17210 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
17220 20 20 20 20 20 20 20 69 66 20 7b 21 5b 63 68 65         if {![che
17230 63 6b 46 6f 72 53 51 4c 69 74 65 42 75 69 6c 64  ckForSQLiteBuild
17240 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
17250 6c 20 74 72 75 65 5d 7d 20 74 68 65 6e 20 7b 0d  l true]} then {.
17260 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
17270 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 52 65 6c  heckForSQLiteRel
17280 65 61 73 65 73 20 24 3a 3a 74 65 73 74 5f 63 68  eases $::test_ch
17290 61 6e 6e 65 6c 20 74 72 75 65 0d 0a 20 20 20 20  annel true..    
172a0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
172b0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
172c0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
172d0 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72   # NOTE: Skip tr
172e0 79 69 6e 67 20 74 6f 20 76 65 72 69 66 79 20 74  ying to verify t
172f0 68 65 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f  he build directo
17300 72 79 20 69 66 20 69 6e 73 74 72 75 63 74 65 64  ry if instructed
17310 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  ;..          #  
17320 20 20 20 20 20 6f 74 68 65 72 77 69 73 65 2c 20       otherwise, 
17330 6d 61 6b 65 20 73 75 72 65 20 69 74 20 61 63 74  make sure it act
17340 75 61 6c 6c 79 20 65 78 69 73 74 73 20 6f 72 20  ually exists or 
17350 68 61 6c 74 20 74 68 65 20 65 6e 74 69 72 65 0d  halt the entire.
17360 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
17370 20 20 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65     testing proce
17380 73 73 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  ss if it does no
17390 74 20 65 78 69 73 74 2e 0d 0a 20 20 20 20 20 20  t exist...      
173a0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
173b0 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
173c0 74 73 20 3a 3a 6e 6f 28 76 65 72 69 66 79 42 75  ts ::no(verifyBu
173d0 69 6c 64 44 69 72 65 63 74 6f 72 79 29 5d 7d 20  ildDirectory)]} 
173e0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
173f0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
17400 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 20 74 68     # NOTE: At th
17410 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 62 75  is point, the bu
17420 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20 4d 55  ild directory MU
17430 53 54 20 65 78 69 73 74 20 61 73 20 61 0d 0a 20  ST exist as a.. 
17440 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
17450 20 20 20 76 61 6c 69 64 20 64 69 72 65 63 74 6f     valid directo
17460 72 79 20 66 6f 72 20 74 68 65 20 74 65 73 74 69  ry for the testi
17470 6e 67 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f  ng process to co
17480 6e 74 69 6e 75 65 2e 0d 0a 20 20 20 20 20 20 20  ntinue...       
17490 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
174a0 20 20 20 20 73 65 74 20 64 69 72 65 63 74 6f 72      set director
174b0 79 20 5b 67 65 74 42 75 69 6c 64 44 69 72 65 63  y [getBuildDirec
174c0 74 6f 72 79 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  tory]....       
174d0 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20       if {![file 
174e0 65 78 69 73 74 73 20 24 64 69 72 65 63 74 6f 72  exists $director
174f0 79 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20  y] || \..       
17500 20 20 20 20 20 20 20 20 20 21 5b 66 69 6c 65 20           ![file 
17510 69 73 64 69 72 65 63 74 6f 72 79 20 24 64 69 72  isdirectory $dir
17520 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d  ectory]} then {.
17530 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
17540 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17550 23 20 4e 4f 54 45 3a 20 4a 75 73 74 20 70 72 69  # NOTE: Just pri
17560 6f 72 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 68  or to actually h
17570 61 6c 74 69 6e 67 20 74 68 65 20 74 65 73 74 69  alting the testi
17580 6e 67 20 70 72 6f 63 65 73 73 2c 0d 0a 20 20 20  ng process,..   
17590 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
175a0 20 20 20 61 64 64 20 61 6e 20 65 72 72 6f 72 20     add an error 
175b0 74 6f 20 74 68 65 20 74 65 73 74 20 6c 6f 67 20  to the test log 
175c0 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20  file...         
175d0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
175e0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
175f0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
17600 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
17610 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
17620 2d 2d 20 63 6f 75 6c 64 20 6e 6f 74 20 76 65 72  -- could not ver
17630 69 66 79 20 62 75 69 6c 64 20 64 69 72 65 63 74  ify build direct
17640 6f 72 79 20 5c 22 22 20 24 64 69 72 65 63 74 6f  ory \"" $directo
17650 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ry \..          
17660 20 20 20 20 20 20 20 20 22 5c 22 2c 20 61 6c 6c          "\", all
17670 20 74 65 73 74 69 6e 67 20 68 61 6c 74 65 64 5c   testing halted\
17680 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  n"]....         
17690 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
176a0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 61        # NOTE: Ra
176b0 69 73 69 6e 67 20 61 20 73 63 72 69 70 74 20 65  ising a script e
176c0 72 72 6f 72 20 66 72 6f 6d 20 74 68 69 73 20 70  rror from this p
176d0 6f 69 6e 74 20 73 68 6f 75 6c 64 20 68 61 6c 74  oint should halt
176e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
176f0 23 20 20 20 20 20 20 20 74 68 65 20 74 65 73 74  #       the test
17700 69 6e 67 20 70 72 6f 63 65 73 73 2e 0d 0a 20 20  ing process...  
17710 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
17720 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72               err
17730 6f 72 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  or [appendArgs \
17740 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17750 20 20 20 20 22 63 6f 75 6c 64 20 6e 6f 74 20 76      "could not v
17760 65 72 69 66 79 20 62 75 69 6c 64 20 64 69 72 65  erify build dire
17770 63 74 6f 72 79 20 5c 22 22 20 24 64 69 72 65 63  ctory \"" $direc
17780 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20  tory \..        
17790 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 61            "\", a
177a0 6c 6c 20 74 65 73 74 69 6e 67 20 68 61 6c 74 65  ll testing halte
177b0 64 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  d"]..           
177c0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
177d0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
177e0 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
177f0 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74 6f  : Skip trying to
17800 20 63 6f 70 79 20 61 6e 79 20 66 69 6c 65 73 20   copy any files 
17810 69 66 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a  if instructed...
17820 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
17830 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
17840 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f  o exists ::no(co
17850 70 79 53 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d  pySqliteFiles)]}
17860 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
17870 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
17880 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79  exists ::no(copy
17890 53 71 6c 69 74 65 43 6f 6e 66 69 67 46 69 6c 65  SqliteConfigFile
178a0 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
178b0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61             forea
178c0 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 63 6f 6e  ch fileName $con
178d0 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  figFileNames {..
178e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
178f0 74 72 79 43 6f 70 79 42 75 69 6c 64 46 69 6c 65  tryCopyBuildFile
17900 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20   $fileName..    
17910 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
17920 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
17930 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
17940 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
17950 28 63 6f 70 79 53 71 6c 69 74 65 45 78 74 65 72  (copySqliteExter
17960 6e 61 6c 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  nalFiles)]} then
17970 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
17980 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
17990 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 70 79 20     # NOTE: Copy 
179a0 74 68 65 20 4d 61 6e 61 67 65 64 20 44 65 62 75  the Managed Debu
179b0 67 67 69 6e 67 20 41 73 73 69 73 74 61 6e 74 73  gging Assistants
179c0 20 28 4d 44 41 29 20 63 6f 6e 66 69 67 75 72 61   (MDA) configura
179d0 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  tion..          
179e0 20 20 20 20 23 20 20 20 20 20 20 20 66 69 6c 65      #       file
179f0 20 66 6f 72 20 74 68 65 20 45 61 67 6c 65 20 73   for the Eagle s
17a00 68 65 6c 6c 20 74 6f 20 74 68 65 20 62 75 69 6c  hell to the buil
17a10 64 20 6f 75 74 70 75 74 20 64 69 72 65 63 74 6f  d output directo
17a20 72 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ry,..           
17a30 20 20 20 23 20 20 20 20 20 20 20 77 68 69 6c 65     #       while
17a40 20 75 73 69 6e 67 20 65 61 63 68 20 6f 66 20 74   using each of t
17a50 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20  he names of the 
17a60 76 61 72 69 6f 75 73 20 6c 65 67 61 63 79 20 74  various legacy t
17a70 65 73 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20  est..           
17a80 20 20 20 23 20 20 20 20 20 20 20 65 78 65 63 75     #       execu
17a90 74 61 62 6c 65 73 2e 20 20 54 68 69 73 20 77 69  tables.  This wi
17aa0 6c 6c 20 68 65 6c 70 20 74 6f 20 6d 61 6b 65 20  ll help to make 
17ab0 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20 74 68  sure that all th
17ac0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
17ad0 20 23 20 20 20 20 20 20 20 6c 65 67 61 63 79 20   #       legacy 
17ae0 74 65 73 74 73 20 72 75 6e 20 77 69 74 68 20 65  tests run with e
17af0 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20  xactly the same 
17b00 73 65 74 20 6f 66 20 4d 61 6e 61 67 65 64 0d 0a  set of Managed..
17b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
17b20 20 20 20 20 20 20 44 65 62 75 67 67 69 6e 67 20        Debugging 
17b30 41 73 73 69 73 74 61 6e 74 73 20 63 6f 6e 66 69  Assistants confi
17b40 67 75 72 65 64 2e 0d 0a 20 20 20 20 20 20 20 20  gured...        
17b50 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
17b60 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
17b70 69 6c 65 4e 61 6d 65 20 24 6d 64 61 43 6f 6e 66  ileName $mdaConf
17b80 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  igFileNames {.. 
17b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
17ba0 72 79 43 6f 70 79 42 69 6e 61 72 79 46 69 6c 65  ryCopyBinaryFile
17bb0 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 2e   EagleShell.exe.
17bc0 6d 64 61 2e 63 6f 6e 66 69 67 20 22 22 20 24 66  mda.config "" $f
17bd0 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20  ileName..       
17be0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
17bf0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
17c00 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
17c10 45 3a 20 43 6f 70 79 20 74 68 65 20 65 78 74 65  E: Copy the exte
17c20 72 6e 61 6c 20 62 69 6e 61 72 69 65 73 2c 20 69  rnal binaries, i
17c30 66 20 61 6e 79 2c 20 74 6f 20 74 68 65 20 64 69  f any, to the di
17c40 72 65 63 74 6f 72 79 20 74 68 61 74 0d 0a 20 20  rectory that..  
17c50 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
17c60 20 20 20 20 63 6f 6e 74 61 69 6e 73 20 74 68 65      contains the
17c70 20 45 61 67 6c 65 20 73 68 65 6c 6c 2e 20 20 54   Eagle shell.  T
17c80 68 69 73 20 69 73 20 74 79 70 69 63 61 6c 6c 79  his is typically
17c90 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 0d 0a 20   used to make.. 
17ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
17cb0 20 20 20 20 20 73 75 72 65 20 61 73 73 65 6d 62       sure assemb
17cc0 6c 69 65 73 20 72 65 66 65 72 65 6e 63 65 64 20  lies referenced 
17cd0 62 79 20 74 68 65 20 6f 6e 65 73 20 62 65 69 6e  by the ones bein
17ce0 67 20 74 65 73 74 65 64 20 61 72 65 0d 0a 20 20  g tested are..  
17cf0 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
17d00 20 20 20 20 61 76 61 69 6c 61 62 6c 65 20 64 75      available du
17d10 72 69 6e 67 20 74 68 65 20 74 65 73 74 69 6e 67  ring the testing
17d20 20 70 72 6f 63 65 73 73 2e 0d 0a 20 20 20 20 20   process...     
17d30 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
17d40 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
17d50 68 20 66 69 6c 65 4e 61 6d 65 20 24 65 78 74 65  h fileName $exte
17d60 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  rnalFileNames {.
17d70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17d80 20 74 72 79 43 6f 70 79 45 78 74 65 72 6e 61 6c   tryCopyExternal
17d90 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a  File $fileName..
17da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
17db0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
17dc0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
17dd0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
17de0 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 4e  ::no(copySqliteN
17df0 61 74 69 76 65 46 69 6c 65 73 29 5d 7d 20 74 68  ativeFiles)]} th
17e00 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
17e10 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
17e20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
17e30 74 68 65 20 74 65 73 74 20 70 6c 61 74 66 6f 72  the test platfor
17e40 6d 20 69 73 20 6c 69 6b 65 6c 79 20 74 68 65 20  m is likely the 
17e50 64 65 66 61 75 6c 74 20 66 6f 72 20 74 68 69 73  default for this
17e60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17e70 23 20 20 20 20 20 20 20 6d 61 63 68 69 6e 65 2c  #       machine,
17e80 20 61 6c 73 6f 20 74 72 79 20 74 6f 20 63 6f 70   also try to cop
17e90 79 20 74 68 65 20 6e 61 74 69 76 65 20 66 69 6c  y the native fil
17ea0 65 73 20 74 6f 20 74 68 65 0d 0a 20 20 20 20 20  es to the..     
17eb0 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
17ec0 20 62 69 6e 61 72 79 20 6c 6f 63 61 74 69 6f 6e   binary location
17ed0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
17ee0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
17ef0 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
17f00 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c  sts ::no(copySql
17f10 69 74 65 49 6d 70 6c 69 63 69 74 46 69 6c 65 73  iteImplicitFiles
17f20 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  )] && \..       
17f30 20 20 20 20 20 20 20 20 20 20 20 5b 69 73 44 65             [isDe
17f40 66 61 75 6c 74 42 75 69 6c 64 50 6c 61 74 66 6f  faultBuildPlatfo
17f50 72 6d 20 74 72 75 65 5d 7d 20 74 68 65 6e 20 7b  rm true]} then {
17f60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17f70 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
17f80 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61  me $nativeFileNa
17f90 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
17fa0 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79           tryCopy
17fb0 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61  Assembly $fileNa
17fc0 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  me..            
17fd0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
17fe0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
17ff0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
18000 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63  fo exists ::no(c
18010 6f 70 79 53 71 6c 69 74 65 4e 6f 6e 49 6d 70 6c  opySqliteNonImpl
18020 69 63 69 74 46 69 6c 65 73 29 5d 7d 20 74 68 65  icitFiles)]} the
18030 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
18040 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
18050 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79  exists ::no(copy
18060 53 71 6c 69 74 65 50 6c 61 74 66 6f 72 6d 46 69  SqlitePlatformFi
18070 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20  les)] && \..    
18080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18090 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
180a0 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74  platform] > 0} t
180b0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
180c0 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
180d0 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76   fileName $nativ
180e0 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  eFileNames {..  
180f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18100 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c    tryCopyAssembl
18110 79 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61  y $fileName $pla
18120 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20 20  tform..         
18130 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
18140 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
18150 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18160 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
18170 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69  ts ::no(copySqli
18180 74 65 41 72 63 68 69 74 65 63 74 75 72 65 46 69  teArchitectureFi
18190 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20  les)] && \..    
181a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181b0 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
181c0 61 72 63 68 69 74 65 63 74 75 72 65 5d 20 3e 20  architecture] > 
181d0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
181e0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
181f0 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e  each fileName $n
18200 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b  ativeFileNames {
18210 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18220 20 20 20 20 20 20 74 72 79 43 6f 70 79 41 73 73        tryCopyAss
18230 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20  embly $fileName 
18240 24 61 72 63 68 69 74 65 63 74 75 72 65 0d 0a 20  $architecture.. 
18250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18260 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
18270 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
18280 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
18290 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
182a0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
182b0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79  exists ::no(copy
182c0 53 71 6c 69 74 65 4d 61 6e 61 67 65 64 46 69 6c  SqliteManagedFil
182d0 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
182e0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
182f0 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 61  ach fileName $ma
18300 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b  nagedFileNames {
18310 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18320 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c    tryCopyAssembl
18330 79 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  y $fileName..   
18340 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
18350 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
18360 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
18370 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
18380 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20     # NOTE: Skip 
18390 74 72 79 69 6e 67 20 74 6f 20 6c 6f 61 64 20 61  trying to load a
183a0 6e 79 20 66 69 6c 65 73 20 69 66 20 69 6e 73 74  ny files if inst
183b0 72 75 63 74 65 64 2e 0d 0a 20 20 20 20 20 20 20  ructed...       
183c0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
183d0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
183e0 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74  s ::no(loadSqlit
183f0 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  eFiles)]} then {
18400 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
18410 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
18420 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 49  ::no(loadSqliteI
18430 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d 20  mplicitFiles)]} 
18440 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
18450 20 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73        tryLoadAss
18460 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74  embly System.Dat
18470 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 0d 0a 20 20  a.SQLite.dll..  
18480 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
18490 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
184a0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
184b0 6f 28 6c 6f 61 64 53 71 6c 69 74 65 4c 69 6e 71  o(loadSqliteLinq
184c0 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
184d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
184e0 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20 53  ryLoadAssembly S
184f0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
18500 65 2e 4c 69 6e 71 2e 64 6c 6c 0d 0a 20 20 20 20  e.Linq.dll..    
18510 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
18520 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
18530 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
18540 6c 6f 61 64 53 71 6c 69 74 65 45 66 36 46 69 6c  loadSqliteEf6Fil
18550 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
18560 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 4c              tryL
18570 6f 61 64 41 73 73 65 6d 62 6c 79 20 53 79 73 74  oadAssembly Syst
18580 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 45  em.Data.SQLite.E
18590 46 36 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20  F6.dll..        
185a0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
185b0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
185c0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64  exists ::no(load
185d0 53 71 6c 69 74 65 4e 6f 6e 49 6d 70 6c 69 63 69  SqliteNonImplici
185e0 74 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  tFiles)]} then {
185f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18600 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
18610 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74  s ::no(loadSqlit
18620 65 50 6c 61 74 66 6f 72 6d 46 69 6c 65 73 29 5d  ePlatformFiles)]
18630 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
18640 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
18650 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72   length $platfor
18660 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  m] > 0} then {..
18670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18680 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20  tryLoadAssembly 
18690 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
186a0 74 65 2e 64 6c 6c 20 24 70 6c 61 74 66 6f 72 6d  te.dll $platform
186b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
186c0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
186d0 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
186e0 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71  ists ::no(loadSq
186f0 6c 69 74 65 41 72 63 68 69 74 65 63 74 75 72 65  liteArchitecture
18700 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20  Files)] && \..  
18710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18720 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
18730 61 72 63 68 69 74 65 63 74 75 72 65 5d 20 3e 20  architecture] > 
18740 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
18750 20 20 20 20 20 20 20 20 20 20 20 74 72 79 4c 6f             tryLo
18760 61 64 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65  adAssembly Syste
18770 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
18780 6c 20 24 61 72 63 68 69 74 65 63 74 75 72 65 0d  l $architecture.
18790 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
187a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
187b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
187c0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
187d0 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20     catch {..    
187e0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
187f0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
18800 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
18810 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66           "---- f
18820 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c  ile version of \
18830 22 73 71 6c 69 74 65 33 2e 64 6c 6c 5c 22 2e 2e  "sqlite3.dll\"..
18840 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  . " \..         
18850 20 20 20 20 20 5b 66 69 6c 65 20 76 65 72 73 69       [file versi
18860 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c  on [getBinaryFil
18870 65 4e 61 6d 65 20 73 71 6c 69 74 65 33 2e 64 6c  eName sqlite3.dl
18880 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  l]] \n]..       
18890 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61   }....        ca
188a0 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
188b0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
188c0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
188d0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
188e0 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76      "---- file v
188f0 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53 51 4c 69  ersion of \"SQLi
18900 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 5c 22  te.Interop.dll\"
18910 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  ... " \..       
18920 20 20 20 20 20 20 20 5b 66 69 6c 65 20 76 65 72         [file ver
18930 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79 46  sion [getBinaryF
18940 69 6c 65 4e 61 6d 65 20 53 51 4c 69 74 65 2e 49  ileName SQLite.I
18950 6e 74 65 72 6f 70 2e 64 6c 6c 5d 5d 20 5c 6e 5d  nterop.dll]] \n]
18960 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
18970 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a         catch {..
18980 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
18990 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
189a0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
189b0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
189c0 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20  -- file version 
189d0 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61  of \"System.Data
189e0 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e  .SQLite.dll\"...
189f0 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
18a00 20 20 20 20 5b 66 69 6c 65 20 76 65 72 73 69 6f      [file versio
18a10 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65  n [getBinaryFile
18a20 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74 61  Name System.Data
18a30 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d 5d 20 5c 6e  .SQLite.dll]] \n
18a40 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  ]..        }....
18a50 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d          catch {.
18a60 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
18a70 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
18a80 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
18a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
18aa0 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e  --- file version
18ab0 20 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44 61 74   of \"System.Dat
18ac0 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c  a.SQLite.Linq.dl
18ad0 6c 5c 22 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20  l\"... " \..    
18ae0 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
18af0 76 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61  version [getBina
18b00 72 79 46 69 6c 65 4e 61 6d 65 20 53 79 73 74 65  ryFileName Syste
18b10 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69  m.Data.SQLite.Li
18b20 6e 71 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20  nq.dll]] \n]..  
18b30 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
18b40 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20     catch {..    
18b50 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
18b60 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
18b70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
18b80 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66           "---- f
18b90 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c  ile version of \
18ba0 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  "System.Data.SQL
18bb0 69 74 65 2e 45 46 36 2e 64 6c 6c 5c 22 2e 2e 2e  ite.EF6.dll\"...
18bc0 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
18bd0 20 20 20 20 5b 66 69 6c 65 20 76 65 72 73 69 6f      [file versio
18be0 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65  n [getBinaryFile
18bf0 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74 61  Name System.Data
18c00 2e 53 51 4c 69 74 65 2e 45 46 36 2e 64 6c 6c 5d  .SQLite.EF6.dll]
18c10 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d  ] \n]..        }
18c20 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
18c30 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
18c40 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74  platform] > 0} t
18c50 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
18c60 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20   catch {..      
18c70 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
18c80 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
18c90 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
18ca0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
18cb0 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66   file version of
18cc0 20 5c 22 22 20 24 70 6c 61 74 66 6f 72 6d 20 5c   \"" $platform \
18cd0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18ce0 20 20 22 2f 73 71 6c 69 74 65 33 2e 64 6c 6c 5c    "/sqlite3.dll\
18cf0 22 2e 2e 2e 20 22 20 5b 66 69 6c 65 20 76 65 72  "... " [file ver
18d00 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  sion \..        
18d10 20 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61          [getBina
18d20 72 79 46 69 6c 65 4e 61 6d 65 20 73 71 6c 69 74  ryFileName sqlit
18d30 65 33 2e 64 6c 6c 20 24 70 6c 61 74 66 6f 72 6d  e3.dll $platform
18d40 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ]] \n]..        
18d50 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
18d60 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20   catch {..      
18d70 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
18d80 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
18d90 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
18da0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
18db0 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66   file version of
18dc0 20 5c 22 22 20 24 70 6c 61 74 66 6f 72 6d 20 5c   \"" $platform \
18dd0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18de0 20 20 22 2f 53 51 4c 69 74 65 2e 49 6e 74 65 72    "/SQLite.Inter
18df0 6f 70 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5b 66  op.dll\"... " [f
18e00 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20  ile version \.. 
18e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
18e20 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
18e30 65 20 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70  e SQLite.Interop
18e40 2e 64 6c 6c 20 24 70 6c 61 74 66 6f 72 6d 5d 5d  .dll $platform]]
18e50 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
18e60 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 63  }....          c
18e70 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
18e80 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
18e90 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
18ea0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
18eb0 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66           "---- f
18ec0 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c  ile version of \
18ed0 22 22 20 24 70 6c 61 74 66 6f 72 6d 20 5c 0d 0a  "" $platform \..
18ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ef0 22 2f 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  "/System.Data.SQ
18f00 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20  Lite.dll\"... " 
18f10 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d  [file version \.
18f20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18f30 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
18f40 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  ame System.Data.
18f50 53 51 4c 69 74 65 2e 64 6c 6c 20 24 70 6c 61 74  SQLite.dll $plat
18f60 66 6f 72 6d 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20  form]] \n]..    
18f70 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
18f80 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
18f90 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
18fa0 20 24 61 72 63 68 69 74 65 63 74 75 72 65 5d 20   $architecture] 
18fb0 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
18fc0 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a         catch {..
18fd0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
18fe0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
18ff0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
19000 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19010 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73   "---- file vers
19020 69 6f 6e 20 6f 66 20 5c 22 22 20 24 61 72 63 68  ion of \"" $arch
19030 69 74 65 63 74 75 72 65 20 5c 0d 0a 20 20 20 20  itecture \..    
19040 20 20 20 20 20 20 20 20 20 20 20 20 22 2f 73 71              "/sq
19050 6c 69 74 65 33 2e 64 6c 6c 5c 22 2e 2e 2e 20 22  lite3.dll\"... "
19060 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c   [file version \
19070 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19080 20 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65    [getBinaryFile
19090 4e 61 6d 65 20 73 71 6c 69 74 65 33 2e 64 6c 6c  Name sqlite3.dll
190a0 20 24 61 72 63 68 69 74 65 63 74 75 72 65 5d 5d   $architecture]]
190b0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
190c0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 63  }....          c
190d0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
190e0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
190f0 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
19100 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
19110 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66           "---- f
19120 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c  ile version of \
19130 22 22 20 24 61 72 63 68 69 74 65 63 74 75 72 65  "" $architecture
19140 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
19150 20 20 20 20 22 2f 53 51 4c 69 74 65 2e 49 6e 74      "/SQLite.Int
19160 65 72 6f 70 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20  erop.dll\"... " 
19170 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d  [file version \.
19180 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19190 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
191a0 61 6d 65 20 53 51 4c 69 74 65 2e 49 6e 74 65 72  ame SQLite.Inter
191b0 6f 70 2e 64 6c 6c 20 24 61 72 63 68 69 74 65 63  op.dll $architec
191c0 74 75 72 65 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20  ture]] \n]..    
191d0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
191e0 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
191f0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
19200 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
19210 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
19220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
19230 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f  ---- file versio
19240 6e 20 6f 66 20 5c 22 22 20 24 61 72 63 68 69 74  n of \"" $archit
19250 65 63 74 75 72 65 20 5c 0d 0a 20 20 20 20 20 20  ecture \..      
19260 20 20 20 20 20 20 20 20 20 20 22 2f 53 79 73 74            "/Syst
19270 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
19280 6c 6c 5c 22 2e 2e 2e 20 22 20 5b 66 69 6c 65 20  ll\"... " [file 
19290 76 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20  version \..     
192a0 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42             [getB
192b0 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 53 79  inaryFileName Sy
192c0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
192d0 2e 64 6c 6c 20 24 61 72 63 68 69 74 65 63 74 75  .dll $architectu
192e0 72 65 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  re]] \n]..      
192f0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
19300 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
19310 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 47         # NOTE: G
19320 72 61 62 20 74 68 65 20 6c 69 73 74 20 6f 66 20  rab the list of 
19330 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 69  managed assembli
19340 65 73 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  es for the curre
19350 6e 74 20 70 72 6f 63 65 73 73 0d 0a 20 20 20 20  nt process..    
19360 20 20 20 20 23 20 20 20 20 20 20 20 61 6e 64 20      #       and 
19370 72 65 70 6f 72 74 20 6f 6e 20 74 68 65 20 53 79  report on the Sy
19380 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
19390 20 72 65 6c 61 74 65 64 20 6f 6e 65 73 2e 0d 0a   related ones...
193a0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
193b0 20 20 20 73 65 74 20 61 73 73 65 6d 62 6c 69 65     set assemblie
193c0 73 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65  s [object invoke
193d0 20 41 70 70 44 6f 6d 61 69 6e 2e 43 75 72 72 65   AppDomain.Curre
193e0 6e 74 44 6f 6d 61 69 6e 20 47 65 74 41 73 73 65  ntDomain GetAsse
193f0 6d 62 6c 69 65 73 5d 0d 0a 0d 0a 20 20 20 20 20  mblies]....     
19400 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63     object foreac
19410 68 20 61 73 73 65 6d 62 6c 79 20 24 61 73 73 65  h assembly $asse
19420 6d 62 6c 69 65 73 20 7b 0d 0a 20 20 20 20 20 20  mblies {..      
19430 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
19440 6d 61 74 63 68 20 5c 7b 53 79 73 74 65 6d 2e 44  match \{System.D
19450 61 74 61 2e 53 51 4c 69 74 65 2a 20 24 61 73 73  ata.SQLite* $ass
19460 65 6d 62 6c 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  embly]} then {..
19470 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
19480 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
19490 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
194a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
194b0 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c 6f 61   "---- found loa
194c0 64 65 64 20 61 73 73 65 6d 62 6c 79 3a 20 22 20  ded assembly: " 
194d0 24 61 73 73 65 6d 62 6c 79 20 5c 6e 5d 0d 0a 20  $assembly \n].. 
194e0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
194f0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
19500 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20   catch {..      
19510 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
19520 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20  t_channel \..   
19530 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
19540 20 64 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74   define constant
19550 73 20 66 6f 72 20 5c 22 53 79 73 74 65 6d 2e 44  s for \"System.D
19560 61 74 61 2e 53 51 4c 69 74 65 5c 22 2e 2e 2e 20  ata.SQLite\"... 
19570 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  "....          i
19580 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
19590 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
195a0 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
195b0 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
195c0 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
195d0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53  em.Data.SQLite.S
195e0 51 4c 69 74 65 33 20 44 65 66 69 6e 65 43 6f 6e  QLite3 DefineCon
195f0 73 74 61 6e 74 73 0d 0a 20 20 20 20 20 20 20 20  stants..        
19600 20 20 7d 20 64 65 66 69 6e 65 43 6f 6e 73 74 61    } defineConsta
19610 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  nts] == 0} then 
19620 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
19630 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
19640 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
19650 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73   [formatList [ls
19660 6f 72 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ort \..         
19670 20 20 20 20 20 20 20 24 64 65 66 69 6e 65 43 6f         $defineCo
19680 6e 73 74 61 6e 74 73 5d 20 3c 6e 6f 6e 65 3e 5d  nstants] <none>]
19690 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
196a0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
196b0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
196c0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e  est_channel unkn
196d0 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20  own\n..         
196e0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
196f0 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b  .        catch {
19700 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
19710 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
19720 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l \..           
19730 20 20 20 22 2d 2d 2d 2d 20 73 6f 75 72 63 65 20     "---- source 
19740 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53 79 73  version of \"Sys
19750 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
19760 64 6c 6c 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a 20 20  dll\"... "....  
19770 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
19780 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
19790 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
197a0 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
197b0 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
197c0 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
197d0 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 43 6f  .SQLite.SQLiteCo
197e0 6e 6e 65 63 74 69 6f 6e 20 50 72 6f 76 69 64 65  nnection Provide
197f0 72 56 65 72 73 69 6f 6e 0d 0a 20 20 20 20 20 20  rVersion..      
19800 20 20 20 20 7d 20 76 65 72 73 69 6f 6e 5d 20 3d      } version] =
19810 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
19820 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74           if {[st
19830 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72  ring length $ver
19840 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sion] == 0} then
19850 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
19860 20 20 73 65 74 20 76 65 72 73 69 6f 6e 20 6e 75    set version nu
19870 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll..            
19880 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  }..            t
19890 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
198a0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
198b0 20 24 76 65 72 73 69 6f 6e 20 5c 6e 5d 0d 0a 20   $version \n].. 
198c0 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
198d0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
198e0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
198f0 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a  nnel unknown\n..
19900 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
19910 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
19920 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20    catch {..     
19930 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
19940 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20  st_channel \..  
19950 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
19960 2d 20 73 6f 75 72 63 65 20 63 68 65 63 6b 6f 75  - source checkou
19970 74 20 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44 61  t of \"System.Da
19980 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e  ta.SQLite.dll\".
19990 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20  .. "....        
199a0 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
199b0 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65              obje
199c0 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
199d0 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
199e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
199f0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
19a00 65 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69  e.SQLiteConnecti
19a10 6f 6e 20 50 72 6f 76 69 64 65 72 53 6f 75 72 63  on ProviderSourc
19a20 65 49 64 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  eId..          }
19a30 20 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d   sourceId] == 0}
19a40 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
19a50 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
19a60 20 6c 65 6e 67 74 68 20 24 73 6f 75 72 63 65 49   length $sourceI
19a70 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  d] == 0} then {.
19a80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
19a90 65 74 20 73 6f 75 72 63 65 49 64 20 6e 75 6c 6c  et sourceId null
19aa0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
19ab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
19ac0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
19ad0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  el [appendArgs $
19ae0 73 6f 75 72 63 65 49 64 20 5c 6e 5d 0d 0a 20 20  sourceId \n]..  
19af0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
19b00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
19b10 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
19b20 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20  nel unknown\n.. 
19b30 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
19b40 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
19b50 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
19b60 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20 61 76  TE: Check the av
19b70 61 69 6c 61 62 6c 65 20 62 75 69 6c 64 73 20 28  ailable builds (
19b80 61 6e 64 20 22 72 65 6c 65 61 73 65 73 22 29 20  and "releases") 
19b90 6f 66 20 53 51 4c 69 74 65 20 61 6e 64 0d 0a 20  of SQLite and.. 
19ba0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 53         #       S
19bb0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
19bc0 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
19bd0 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53         checkForS
19be0 51 4c 69 74 65 42 75 69 6c 64 73 20 24 3a 3a 74  QLiteBuilds $::t
19bf0 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20  est_channel..   
19c00 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c       checkForSQL
19c10 69 74 65 52 65 6c 65 61 73 65 73 20 24 3a 3a 74  iteReleases $::t
19c20 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20  est_channel.... 
19c30 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
19c40 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 2c 20 77    # NOTE: Now, w
19c50 65 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69  e need to know i
19c60 66 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72  f the SQLite cor
19c70 65 20 6c 69 62 72 61 72 79 20 69 73 20 61 76 61  e library is ava
19c80 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20  ilable..        
19c90 23 20 20 20 20 20 20 20 28 69 2e 65 2e 20 62 65  #       (i.e. be
19ca0 63 61 75 73 65 20 74 68 65 20 6d 61 6e 61 67 65  cause the manage
19cb0 64 2d 6f 6e 6c 79 20 53 79 73 74 65 6d 2e 44 61  d-only System.Da
19cc0 74 61 2e 53 51 4c 69 74 65 20 61 73 73 65 6d 62  ta.SQLite assemb
19cd0 6c 79 20 63 61 6e 0d 0a 20 20 20 20 20 20 20 20  ly can..        
19ce0 23 20 20 20 20 20 20 20 6c 6f 61 64 20 77 69 74  #       load wit
19cf0 68 6f 75 74 20 69 74 3b 20 68 6f 77 65 76 65 72  hout it; however
19d00 2c 20 69 74 20 63 61 6e 6e 6f 74 20 64 6f 20 61  , it cannot do a
19d10 6e 79 74 68 69 6e 67 20 75 73 65 66 75 6c 20 77  nything useful w
19d20 69 74 68 6f 75 74 0d 0a 20 20 20 20 20 20 20 20  ithout..        
19d30 23 20 20 20 20 20 20 20 69 74 29 2e 20 20 49 66  #       it).  If
19d40 20 77 65 20 61 72 65 20 75 73 69 6e 67 20 74 68   we are using th
19d50 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73  e mixed-mode ass
19d60 65 6d 62 6c 79 20 61 6e 64 20 77 65 20 61 6c 72  embly and we alr
19d70 65 61 64 79 0d 0a 20 20 20 20 20 20 20 20 23 20  eady..        # 
19d80 20 20 20 20 20 20 66 6f 75 6e 64 20 69 74 20 28        found it (
19d90 61 62 6f 76 65 29 2c 20 74 68 69 73 20 73 68 6f  above), this sho
19da0 75 6c 64 20 61 6c 77 61 79 73 20 73 75 63 63 65  uld always succe
19db0 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ed...        #..
19dc0 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
19dd0 53 51 4c 69 74 65 4c 69 62 72 61 72 79 20 24 3a  SQLiteLibrary $:
19de0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d  :test_channel...
19df0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
19e00 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
19e10 6b 20 69 66 20 74 68 65 20 53 51 4c 69 74 65 20  k if the SQLite 
19e20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79  interop assembly
19e30 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a   is available...
19e40 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
19e50 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74     checkForSQLit
19e60 65 49 6e 74 65 72 6f 70 20 24 3a 3a 74 65 73 74  eInterop $::test
19e70 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20  _channel....    
19e80 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
19e90 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65   NOTE: Check the
19ea0 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
19eb0 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 64   and temporary d
19ec0 69 72 65 63 74 6f 72 69 65 73 2e 0d 0a 20 20 20  irectories...   
19ed0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
19ee0 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 69  checkForSQLiteDi
19ef0 72 65 63 74 6f 72 69 65 73 20 24 3a 3a 74 65 73  rectories $::tes
19f00 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20  t_channel....   
19f10 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
19f20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
19f30 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
19f40 76 61 72 69 6f 75 73 20 63 6f 6d 70 69 6c 65 2d  various compile-
19f50 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 6e 65 65  time options nee
19f60 64 65 64 20 66 6f 72 0d 0a 20 20 20 20 20 20 20  ded for..       
19f70 20 23 20 20 20 20 20 20 20 74 65 73 74 20 63 6f   #       test co
19f80 6e 73 74 72 61 69 6e 74 73 20 77 65 72 65 20 65  nstraints were e
19f90 6e 61 62 6c 65 64 20 66 6f 72 20 74 68 65 20 6d  nabled for the m
19fa0 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 2e  anaged assembly.
19fb0 20 20 54 68 65 72 65 0d 0a 20 20 20 20 20 20 20    There..       
19fc0 20 23 20 20 20 20 20 20 20 61 72 65 20 73 6f 6d   #       are som
19fd0 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  e compile-time o
19fe0 70 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74  ptions that must
19ff0 20 61 6c 73 6f 20 68 61 76 65 20 62 65 65 6e 20   also have been 
1a000 65 6e 61 62 6c 65 64 0d 0a 20 20 20 20 20 20 20  enabled..       
1a010 20 23 20 20 20 20 20 20 20 66 6f 72 20 74 68 65   #       for the
1a020 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c   interop assembl
1a030 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65  y in order to be
1a040 20 65 66 66 65 63 74 69 76 65 2e 20 20 46 6f 72   effective.  For
1a050 20 74 68 6f 73 65 0d 0a 20 20 20 20 20 20 20 20   those..        
1a060 23 20 20 20 20 20 20 20 6f 70 74 69 6f 6e 73 2c  #       options,
1a070 20 69 74 20 77 69 6c 6c 20 62 65 20 61 73 73 75   it will be assu
1a080 6d 65 64 20 74 68 61 74 20 69 74 20 77 61 73 20  med that it was 
1a090 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 68 65 20  enabled for the 
1a0a0 69 6e 74 65 72 6f 70 0d 0a 20 20 20 20 20 20 20  interop..       
1a0b0 20 23 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c   #       assembl
1a0c0 79 20 69 66 20 69 74 20 77 61 73 20 65 6e 61 62  y if it was enab
1a0d0 6c 65 64 20 66 6f 72 20 74 68 65 20 6d 61 6e 61  led for the mana
1a0e0 67 65 64 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20  ged assembly... 
1a0f0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1a100 20 20 66 6f 72 65 61 63 68 20 64 65 66 69 6e 65    foreach define
1a110 43 6f 6e 73 74 61 6e 74 20 5b 6c 69 73 74 20 5c  Constant [list \
1a120 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 43 48  ..            CH
1a130 45 43 4b 5f 53 54 41 54 45 20 43 4f 55 4e 54 5f  ECK_STATE COUNT_
1a140 48 41 4e 44 4c 45 20 44 45 42 55 47 20 49 4e 54  HANDLE DEBUG INT
1a150 45 52 4f 50 5f 43 4f 44 45 43 20 49 4e 54 45 52  EROP_CODEC INTER
1a160 4f 50 5f 44 45 42 55 47 20 5c 0d 0a 20 20 20 20  OP_DEBUG \..    
1a170 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f          INTEROP_
1a180 45 58 54 45 4e 53 49 4f 4e 5f 46 55 4e 43 54 49  EXTENSION_FUNCTI
1a190 4f 4e 53 20 49 4e 54 45 52 4f 50 5f 4c 45 47 41  ONS INTEROP_LEGA
1a1a0 43 59 5f 43 4c 4f 53 45 20 49 4e 54 45 52 4f 50  CY_CLOSE INTEROP
1a1b0 5f 4c 4f 47 20 5c 0d 0a 20 20 20 20 20 20 20 20  _LOG \..        
1a1c0 20 20 20 20 49 4e 54 45 52 4f 50 5f 54 45 53 54      INTEROP_TEST
1a1d0 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54 45 52  _EXTENSION INTER
1a1e0 4f 50 5f 56 49 52 54 55 41 4c 5f 54 41 42 4c 45  OP_VIRTUAL_TABLE
1a1f0 20 4e 45 54 5f 32 30 20 4e 45 54 5f 33 35 20 5c   NET_20 NET_35 \
1a200 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 4e 45  ..            NE
1a210 54 5f 34 30 20 4e 45 54 5f 34 35 20 4e 45 54 5f  T_40 NET_45 NET_
1a220 34 35 31 20 4e 45 54 5f 43 4f 4d 50 41 43 54 5f  451 NET_COMPACT_
1a230 32 30 20 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50  20 PLATFORM_COMP
1a240 41 43 54 46 52 41 4d 45 57 4f 52 4b 20 5c 0d 0a  ACTFRAMEWORK \..
1a250 20 20 20 20 20 20 20 20 20 20 20 20 50 52 45 4c              PREL
1a260 4f 41 44 5f 4e 41 54 49 56 45 5f 4c 49 42 52 41  OAD_NATIVE_LIBRA
1a270 52 59 20 52 45 54 41 52 47 45 54 41 42 4c 45 20  RY RETARGETABLE 
1a280 53 51 4c 49 54 45 5f 53 54 41 4e 44 41 52 44 20  SQLITE_STANDARD 
1a290 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 54  \..            T
1a2a0 48 52 4f 57 5f 4f 4e 5f 44 49 53 50 4f 53 45 44  HROW_ON_DISPOSED
1a2b0 20 54 52 41 43 45 20 54 52 41 43 45 5f 43 4f 4e   TRACE TRACE_CON
1a2c0 4e 45 43 54 49 4f 4e 20 54 52 41 43 45 5f 48 41  NECTION TRACE_HA
1a2d0 4e 44 4c 45 20 5c 0d 0a 20 20 20 20 20 20 20 20  NDLE \..        
1a2e0 20 20 20 20 54 52 41 43 45 5f 50 52 45 4c 4f 41      TRACE_PRELOA
1a2f0 44 20 54 52 41 43 45 5f 53 48 41 52 45 44 20 54  D TRACE_SHARED T
1a300 52 41 43 45 5f 53 54 41 54 45 4d 45 4e 54 20 54  RACE_STATEMENT T
1a310 52 41 43 45 5f 57 41 52 4e 49 4e 47 20 5c 0d 0a  RACE_WARNING \..
1a320 20 20 20 20 20 20 20 20 20 20 20 20 54 52 41 43              TRAC
1a330 4b 5f 4d 45 4d 4f 52 59 5f 42 59 54 45 53 20 55  K_MEMORY_BYTES U
1a340 53 45 5f 45 4e 54 49 54 59 5f 46 52 41 4d 45 57  SE_ENTITY_FRAMEW
1a350 4f 52 4b 5f 36 20 55 53 45 5f 49 4e 54 45 52 4f  ORK_6 USE_INTERO
1a360 50 5f 44 4c 4c 20 5c 0d 0a 20 20 20 20 20 20 20  P_DLL \..       
1a370 20 20 20 20 20 55 53 45 5f 50 52 45 50 41 52 45       USE_PREPARE
1a380 5f 56 32 20 57 49 4e 44 4f 57 53 5d 20 7b 0d 0a  _V2 WINDOWS] {..
1a390 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1a3a0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
1a3b0 68 65 63 6b 20 69 66 20 74 68 65 20 63 6f 6d 70  heck if the comp
1a3c0 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
1a3d0 69 73 20 6c 69 73 74 65 64 20 69 6e 20 74 68 65  is listed in the
1a3e0 20 6c 69 73 74 20 6f 66 0d 0a 20 20 20 20 20 20   list of..      
1a3f0 20 20 20 20 23 20 20 20 20 20 20 20 22 64 65 66      #       "def
1a400 69 6e 65 20 63 6f 6e 73 74 61 6e 74 73 22 20 6b  ine constants" k
1a410 65 70 74 20 74 72 61 63 6b 20 6f 66 20 62 79 20  ept track of by 
1a420 74 68 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65  the managed asse
1a430 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 20  mbly...         
1a440 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   #..          ch
1a450 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 65 66 69  eckForSQLiteDefi
1a460 6e 65 43 6f 6e 73 74 61 6e 74 20 24 3a 3a 74 65  neConstant $::te
1a470 73 74 5f 63 68 61 6e 6e 65 6c 20 24 64 65 66 69  st_channel $defi
1a480 6e 65 43 6f 6e 73 74 61 6e 74 0d 0a 20 20 20 20  neConstant..    
1a490 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1a4a0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1a4b0 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20 63 75  TE: Check the cu
1a4c0 72 72 65 6e 74 20 62 75 69 6c 64 20 79 65 61 72  rrent build year
1a4d0 2e 20 20 42 61 73 69 63 61 6c 6c 79 2c 20 74 68  .  Basically, th
1a4e0 69 73 20 69 6e 64 69 63 61 74 65 73 0d 0a 20 20  is indicates..  
1a4f0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77 68        #       wh
1a500 69 63 68 20 76 65 72 73 69 6f 6e 20 6f 66 20 4d  ich version of M
1a510 53 42 75 69 6c 64 20 61 6e 64 2f 6f 72 20 56 69  SBuild and/or Vi
1a520 73 75 61 6c 20 53 74 75 64 69 6f 20 77 61 73 20  sual Studio was 
1a530 75 73 65 64 20 74 6f 0d 0a 20 20 20 20 20 20 20  used to..       
1a540 20 23 20 20 20 20 20 20 20 63 6f 6d 70 69 6c 65   #       compile
1a550 20 74 68 65 20 61 73 73 65 6d 62 6c 79 20 62 69   the assembly bi
1a560 6e 61 72 69 65 73 20 75 6e 64 65 72 20 74 65 73  naries under tes
1a570 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
1a580 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
1a590 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a  test_channel \..
1a5a0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
1a5b0 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53  - checking for S
1a5c0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
1a5d0 65 20 62 75 69 6c 64 20 79 65 61 72 2e 2e 2e 20  e build year... 
1a5e0 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74  "....        set
1a5f0 20 79 65 61 72 20 5b 67 65 74 42 75 69 6c 64 59   year [getBuildY
1a600 65 61 72 5d 0d 0a 20 20 20 20 20 20 20 20 61 64  ear]..        ad
1a610 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  dConstraint [app
1a620 65 6e 64 41 72 67 73 20 62 75 69 6c 64 59 65 61  endArgs buildYea
1a630 72 2e 20 24 79 65 61 72 5d 0d 0a 20 20 20 20 20  r. $year]..     
1a640 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
1a650 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
1a660 41 72 67 73 20 5c 22 20 24 79 65 61 72 20 5c 22  Args \" $year \"
1a670 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  \n]....        #
1a680 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1a690 3a 20 43 68 65 63 6b 20 74 68 65 20 63 75 72 72  : Check the curr
1a6a0 65 6e 74 20 62 75 69 6c 64 20 2e 4e 45 54 20 46  ent build .NET F
1a6b0 72 61 6d 65 77 6f 72 6b 2e 20 20 42 61 73 69 63  ramework.  Basic
1a6c0 61 6c 6c 79 2c 20 74 68 69 73 0d 0a 20 20 20 20  ally, this..    
1a6d0 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 64 69      #       indi
1a6e0 63 61 74 65 73 20 77 68 69 63 68 20 76 65 72 73  cates which vers
1a6f0 69 6f 6e 20 6f 66 20 74 68 65 20 2e 4e 45 54 20  ion of the .NET 
1a700 46 72 61 6d 65 77 6f 72 6b 20 69 73 20 62 65 69  Framework is bei
1a710 6e 67 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ng..        #   
1a720 20 20 20 20 75 73 65 64 20 62 79 20 74 68 65 20      used by the 
1a730 61 73 73 65 6d 62 6c 79 20 62 69 6e 61 72 69 65  assembly binarie
1a740 73 20 75 6e 64 65 72 20 74 65 73 74 2e 0d 0a 20  s under test... 
1a750 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1a760 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
1a770 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20  channel \..     
1a780 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65         "---- che
1a790 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d  cking for System
1a7a0 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75 69  .Data.SQLite bui
1a7b0 6c 64 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72  ld .NET Framewor
1a7c0 6b 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  k... "....      
1a7d0 20 20 73 65 74 20 6e 65 74 46 78 20 5b 67 65 74    set netFx [get
1a7e0 42 75 69 6c 64 4e 65 74 46 78 5d 0d 0a 20 20 20  BuildNetFx]..   
1a7f0 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
1a800 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 62  nt [appendArgs b
1a810 75 69 6c 64 46 72 61 6d 65 77 6f 72 6b 2e 20 24  uildFramework. $
1a820 6e 65 74 46 78 5d 0d 0a 20 20 20 20 20 20 20 20  netFx]..        
1a830 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
1a840 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1a850 73 20 5c 22 20 24 6e 65 74 46 78 20 5c 22 5c 6e  s \" $netFx \"\n
1a860 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
1a870 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1a880 43 68 65 63 6b 20 74 68 65 20 63 75 72 72 65 6e  Check the curren
1a890 74 20 62 75 69 6c 64 20 63 6f 6e 66 69 67 75 72  t build configur
1a8a0 61 74 69 6f 6e 2e 20 20 54 68 69 73 20 73 68 6f  ation.  This sho
1a8b0 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 0d 0a 20 20  uld normally..  
1a8c0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65        #       be
1a8d0 20 65 69 74 68 65 72 20 22 44 65 62 75 67 22 20   either "Debug" 
1a8e0 6f 72 20 22 52 65 6c 65 61 73 65 22 2e 0d 0a 20  or "Release"... 
1a8f0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1a900 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
1a910 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20  channel \..     
1a920 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65         "---- che
1a930 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d  cking for System
1a940 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75 69  .Data.SQLite bui
1a950 6c 64 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ld configuration
1a960 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20  ... "....       
1a970 20 73 65 74 20 63 6f 6e 66 69 67 75 72 61 74 69   set configurati
1a980 6f 6e 20 5b 67 65 74 42 75 69 6c 64 43 6f 6e 66  on [getBuildConf
1a990 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 20 20 20 20  iguration]..    
1a9a0 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
1a9b0 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 62 75  t [appendArgs bu
1a9c0 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ildConfiguration
1a9d0 2e 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  . $configuration
1a9e0 5d 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  ]..        tputs
1a9f0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1aa00 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20   [appendArgs \" 
1aa10 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 5c  $configuration \
1aa20 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  "\n]....        
1aa30 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
1aa40 45 3a 20 54 72 79 20 74 6f 20 73 65 74 75 70 20  E: Try to setup 
1aa50 61 6e 20 69 6e 74 65 72 72 75 70 74 20 63 61 6c  an interrupt cal
1aa60 6c 62 61 63 6b 20 75 73 69 6e 67 20 74 68 65 20  lback using the 
1aa70 73 63 72 69 70 74 20 64 65 62 75 67 67 65 72 0d  script debugger.
1aa80 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
1aa90 20 74 68 61 74 20 77 69 6c 6c 20 63 61 6e 63 65   that will cance
1aaa0 6c 20 61 6c 6c 20 53 51 4c 20 71 75 65 72 69 65  l all SQL querie
1aab0 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 66 6f  s in progress fo
1aac0 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0d 0a  r all database..
1aad0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1aae0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6b 6e 6f 77  connections know
1aaf0 6e 20 74 6f 20 74 68 69 73 20 69 6e 74 65 72 70  n to this interp
1ab00 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20  reter...        
1ab10 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  #..        if {!
1ab20 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
1ab30 6f 28 73 71 6c 69 74 65 49 6e 74 65 72 72 75 70  o(sqliteInterrup
1ab40 74 43 61 6c 6c 62 61 63 6b 29 5d 7d 20 74 68 65  tCallback)]} the
1ab50 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
1ab60 65 74 75 70 44 62 49 6e 74 65 72 72 75 70 74 43  etupDbInterruptC
1ab70 61 6c 6c 62 61 63 6b 20 24 3a 3a 74 65 73 74 5f  allback $::test_
1ab80 63 68 61 6e 6e 65 6c 20 24 3a 3a 74 65 73 74 5f  channel $::test_
1ab90 6c 6f 67 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  log..        }..
1aba0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1abb0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
1abc0 63 6b 20 66 6f 72 20 74 68 65 20 6e 61 74 69 76  ck for the nativ
1abd0 65 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e  e runtime option
1abe0 2c 20 77 68 69 63 68 20 77 6f 75 6c 64 20 6d 65  , which would me
1abf0 61 6e 20 77 65 20 61 72 65 0d 0a 20 20 20 20 20  an we are..     
1ac00 20 20 20 23 20 20 20 20 20 20 20 75 73 69 6e 67     #       using
1ac10 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20   the mixed-mode 
1ac20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20  assembly...     
1ac30 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68     #..        ch
1ac40 65 63 6b 46 6f 72 52 75 6e 74 69 6d 65 4f 70 74  eckForRuntimeOpt
1ac50 69 6f 6e 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  ion $::test_chan
1ac60 6e 65 6c 20 6e 61 74 69 76 65 0d 0a 0d 0a 20 20  nel native....  
1ac70 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1ac80 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
1ac90 66 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  f the test suite
1aca0 20 73 68 6f 75 6c 64 20 63 6f 75 6e 74 20 74 68   should count th
1acb0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 6e  e number of conn
1acc0 65 63 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20  ections..       
1acd0 20 23 20 20 20 20 20 20 20 22 6f 70 65 6e 65 64   #       "opened
1ace0 22 20 61 6e 64 20 22 63 6c 6f 73 65 64 22 20 66  " and "closed" f
1acf0 72 6f 6d 20 74 68 65 20 70 6f 6f 6c 20 77 68 65  rom the pool whe
1ad00 6e 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 69 66  n determining if
1ad10 20 61 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20   a test..       
1ad20 20 23 20 20 20 20 20 20 20 70 61 73 73 65 64 2e   #       passed.
1ad30 20 20 44 69 73 61 62 6c 69 6e 67 20 74 68 69 73    Disabling this
1ad40 20 62 65 68 61 76 69 6f 72 20 69 73 20 73 6f 6d   behavior is som
1ad50 65 74 69 6d 65 73 20 6e 65 63 65 73 73 61 72 79  etimes necessary
1ad60 20 28 65 2e 67 2e 0d 0a 20 20 20 20 20 20 20 20   (e.g...        
1ad70 23 20 20 20 20 20 20 20 64 75 72 69 6e 67 20 74  #       during t
1ad80 68 65 20 72 65 6c 65 61 73 65 20 74 65 73 74 69  he release testi
1ad90 6e 67 20 70 72 6f 63 65 73 73 29 20 62 65 63 61  ng process) beca
1ada0 75 73 65 20 74 68 65 72 65 20 61 72 65 20 73 65  use there are se
1adb0 76 65 72 61 6c 0d 0a 20 20 20 20 20 20 20 20 23  veral..        #
1adc0 20 20 20 20 20 20 20 74 65 73 74 73 20 74 68 61         tests tha
1add0 74 20 72 65 6c 79 20 6f 6e 20 74 68 65 20 22 6f  t rely on the "o
1ade0 70 65 6e 65 64 20 66 72 6f 6d 20 70 6f 6f 6c 22  pened from pool"
1adf0 20 63 6f 75 6e 74 20 62 65 69 6e 67 20 67 72 65   count being gre
1ae00 61 74 65 72 0d 0a 20 20 20 20 20 20 20 20 23 20  ater..        # 
1ae10 20 20 20 20 20 20 74 68 61 6e 20 7a 65 72 6f 2e        than zero.
1ae20 20 20 54 68 65 73 65 20 74 65 73 74 73 20 6d 61    These tests ma
1ae30 79 20 66 61 69 6c 20 64 75 65 20 74 6f 20 74 68  y fail due to th
1ae40 65 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73  e non-determinis
1ae50 74 69 63 0d 0a 20 20 20 20 20 20 20 20 23 20 20  tic..        #  
1ae60 20 20 20 20 20 62 65 68 61 76 69 6f 72 20 6f 66       behavior of
1ae70 20 74 68 65 20 43 4c 52 20 47 43 2c 20 65 76 65   the CLR GC, eve
1ae80 6e 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  n when there is 
1ae90 6e 6f 20 62 75 67 20 69 6e 20 74 68 65 20 63 6f  no bug in the co
1aea0 64 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  de..        #   
1aeb0 20 20 20 20 62 65 69 6e 67 20 74 65 73 74 65 64      being tested
1aec0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1aed0 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 52 75        checkForRu
1aee0 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 24 3a 3a 74  ntimeOption $::t
1aef0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 6e 6f 50 6f  est_channel noPo
1af00 6f 6c 43 6f 75 6e 74 73 0d 0a 0d 0a 20 20 20 20  olCounts....    
1af10 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1af20 20 4e 4f 54 45 3a 20 52 65 70 6f 72 74 20 74 68   NOTE: Report th
1af30 65 20 72 65 73 6f 75 72 63 65 20 75 73 61 67 65  e resource usage
1af40 20 70 72 69 6f 72 20 74 6f 20 72 75 6e 6e 69 6e   prior to runnin
1af50 67 20 61 6e 79 20 74 65 73 74 73 2e 0d 0a 20 20  g any tests...  
1af60 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1af70 20 72 65 70 6f 72 74 53 51 4c 69 74 65 52 65 73   reportSQLiteRes
1af80 6f 75 72 63 65 73 20 24 3a 3a 74 65 73 74 5f 63  ources $::test_c
1af90 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20  hannel....      
1afa0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
1afb0 4f 54 45 3a 20 47 72 61 62 20 74 68 65 20 6c 69  OTE: Grab the li
1afc0 73 74 20 6f 66 20 6e 61 74 69 76 65 20 6d 6f 64  st of native mod
1afd0 75 6c 65 73 20 66 6f 72 20 74 68 65 20 63 75 72  ules for the cur
1afe0 72 65 6e 74 20 70 72 6f 63 65 73 73 20 61 6e 64  rent process and
1aff0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1b000 20 20 72 65 70 6f 72 74 20 6f 6e 20 74 68 65 20    report on the 
1b010 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
1b020 74 65 20 72 65 6c 61 74 65 64 20 6f 6e 65 73 2e  te related ones.
1b030 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1b040 20 20 20 20 20 73 65 74 20 6d 6f 64 75 6c 65 73       set modules
1b050 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   [object invoke 
1b060 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  \..            S
1b070 79 73 74 65 6d 2e 44 69 61 67 6e 6f 73 74 69 63  ystem.Diagnostic
1b080 73 2e 50 72 6f 63 65 73 73 2e 47 65 74 43 75 72  s.Process.GetCur
1b090 72 65 6e 74 50 72 6f 63 65 73 73 20 4d 6f 64 75  rentProcess Modu
1b0a0 6c 65 73 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  les]....        
1b0b0 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20 2d  object foreach -
1b0c0 61 6c 69 61 73 20 6d 6f 64 75 6c 65 20 24 6d 6f  alias module $mo
1b0d0 64 75 6c 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  dules {..       
1b0e0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1b0f0 23 20 4e 4f 54 45 3a 20 54 68 65 20 6d 6f 64 75  # NOTE: The modu
1b100 6c 65 20 66 69 6c 65 20 6e 61 6d 65 20 68 65 72  le file name her
1b110 65 20 6d 75 73 74 20 62 65 20 6e 6f 72 6d 61 6c  e must be normal
1b120 69 7a 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20  ized...         
1b130 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   #..          se
1b140 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65  t fileName [file
1b150 20 6e 6f 72 6d 61 6c 69 7a 65 20 5b 24 6d 6f 64   normalize [$mod
1b160 75 6c 65 20 46 69 6c 65 4e 61 6d 65 5d 5d 0d 0a  ule FileName]]..
1b170 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
1b180 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2d 6e  [string match -n
1b190 6f 63 61 73 65 20 2a 2f 73 71 6c 69 74 65 33 2e  ocase */sqlite3.
1b1a0 64 6c 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20  dll $fileName]} 
1b1b0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1b1c0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
1b1d0 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
1b1e0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1b1f0 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66           "---- f
1b200 6f 75 6e 64 20 6c 6f 61 64 65 64 20 53 51 4c 69  ound loaded SQLi
1b210 74 65 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72  te native librar
1b220 79 20 6d 6f 64 75 6c 65 3a 20 22 20 5c 0d 0a 20  y module: " \.. 
1b230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
1b240 66 69 6c 65 4e 61 6d 65 20 5c 6e 5d 0d 0a 20 20  fileName \n]..  
1b250 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66          } elseif
1b260 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20   {[string match 
1b270 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1b280 20 2d 6e 6f 63 61 73 65 20 2a 2f 53 51 4c 69 74   -nocase */SQLit
1b290 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 20 24 66  e.Interop.dll $f
1b2a0 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
1b2b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
1b2c0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
1b2d0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1b2e0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1b2f0 20 20 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c     "---- found l
1b300 6f 61 64 65 64 20 53 51 4c 69 74 65 20 69 6e 74  oaded SQLite int
1b310 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 6d 6f  erop assembly mo
1b320 64 75 6c 65 3a 20 22 20 5c 0d 0a 20 20 20 20 20  dule: " \..     
1b330 20 20 20 20 20 20 20 20 20 20 20 24 66 69 6c 65             $file
1b340 4e 61 6d 65 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  Name \n]..      
1b350 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1b360 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63  ....        catc
1b370 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  h {..          t
1b380 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
1b390 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20  nnel \..        
1b3a0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 6d 70        "---- comp
1b3b0 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73  ile-time options
1b3c0 20 66 6f 72 20 53 51 4c 69 74 65 20 63 6f 72 65   for SQLite core
1b3d0 20 6c 69 62 72 61 72 79 2e 2e 2e 20 22 0d 0a 0d   library... "...
1b3e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
1b3f0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
1b400 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
1b410 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
1b420 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
1b430 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
1b440 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74  ata.SQLite.SQLit
1b450 65 33 20 53 51 4c 69 74 65 43 6f 6d 70 69 6c 65  e3 SQLiteCompile
1b460 4f 70 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20  Options..       
1b470 20 20 20 7d 20 63 6f 6d 70 69 6c 65 4f 70 74 69     } compileOpti
1b480 6f 6e 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ons] == 0} then 
1b490 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
1b4a0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
1b4b0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1b4c0 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73   [formatList [ls
1b4d0 6f 72 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ort \..         
1b4e0 20 20 20 20 20 20 20 24 63 6f 6d 70 69 6c 65 4f         $compileO
1b4f0 70 74 69 6f 6e 73 5d 20 3c 6e 6f 6e 65 3e 5d 20  ptions] <none>] 
1b500 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
1b510 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1b520 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
1b530 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f  st_channel unkno
1b540 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  wn\n..          
1b550 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
1b560 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d          catch {.
1b570 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
1b580 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1b590 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1b5a0 20 20 22 2d 2d 2d 2d 20 63 6f 6d 70 69 6c 65 2d    "---- compile-
1b5b0 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 66 6f 72  time options for
1b5c0 20 53 51 4c 69 74 65 20 69 6e 74 65 72 6f 70 20   SQLite interop 
1b5d0 61 73 73 65 6d 62 6c 79 2e 2e 2e 20 22 0d 0a 0d  assembly... "...
1b5e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
1b5f0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
1b600 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
1b610 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
1b620 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
1b630 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
1b640 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74  ata.SQLite.SQLit
1b650 65 33 20 49 6e 74 65 72 6f 70 43 6f 6d 70 69 6c  e3 InteropCompil
1b660 65 4f 70 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20  eOptions..      
1b670 20 20 20 20 7d 20 63 6f 6d 70 69 6c 65 4f 70 74      } compileOpt
1b680 69 6f 6e 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ions] == 0} then
1b690 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1b6a0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
1b6b0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1b6c0 73 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c  s [formatList [l
1b6d0 73 6f 72 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  sort \..        
1b6e0 20 20 20 20 20 20 20 20 24 63 6f 6d 70 69 6c 65          $compile
1b6f0 4f 70 74 69 6f 6e 73 5d 20 3c 6e 6f 6e 65 3e 5d  Options] <none>]
1b700 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
1b710 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
1b720 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
1b730 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e  est_channel unkn
1b740 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20  own\n..         
1b750 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
1b760 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1b770 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77      # NOTE: Show
1b780 20 74 68 65 20 61 63 74 69 76 65 20 74 65 73 74   the active test
1b790 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0d 0a 20   constraints... 
1b7a0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1b7b0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
1b7c0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1b7d0 72 67 73 20 22 2d 2d 2d 2d 20 63 6f 6e 73 74 72  rgs "---- constr
1b7e0 61 69 6e 74 73 3a 20 22 20 5c 0d 0a 20 20 20 20  aints: " \..    
1b7f0 20 20 20 20 20 20 20 20 5b 66 6f 72 6d 61 74 4c          [formatL
1b800 69 73 74 20 5b 6c 73 6f 72 74 20 5b 67 65 74 43  ist [lsort [getC
1b810 6f 6e 73 74 72 61 69 6e 74 73 5d 5d 20 3c 6e 6f  onstraints]] <no
1b820 6e 65 3e 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  ne>] \n]....    
1b830 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1b840 20 4e 4f 54 45 3a 20 53 61 76 65 20 74 68 65 20   NOTE: Save the 
1b850 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 73  test constraints
1b860 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 72 65   for use by thre
1b870 61 64 73 20 63 72 65 61 74 65 64 20 69 6e 20 74  ads created in t
1b880 68 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20  his..        #  
1b890 20 20 20 20 20 61 70 70 6c 69 63 61 74 69 6f 6e       application
1b8a0 20 64 6f 6d 61 69 6e 2e 20 20 54 68 69 73 20 69   domain.  This i
1b8b0 73 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61  s necessary beca
1b8c0 75 73 65 20 61 6c 6c 20 74 68 65 20 45 61 67 6c  use all the Eagl
1b8d0 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
1b8e0 20 20 20 22 74 65 73 74 20 63 6f 6e 74 65 78 74     "test context
1b8f0 22 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  " information is
1b900 20 70 65 72 2d 74 68 72 65 61 64 2e 0d 0a 20 20   per-thread...  
1b910 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1b920 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
1b930 74 73 20 3a 3a 74 65 73 74 5f 63 6f 6e 73 74 72  ts ::test_constr
1b940 61 69 6e 74 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a  aints]} then {..
1b950 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a            set ::
1b960 74 65 73 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  test_constraints
1b970 20 24 3a 3a 65 61 67 6c 65 5f 74 65 73 74 73 28   $::eagle_tests(
1b980 63 6f 6e 73 74 72 61 69 6e 74 73 29 0d 0a 20 20  constraints)..  
1b990 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1b9a0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1b9b0 4e 4f 54 45 3a 20 4c 6f 61 64 20 74 68 65 20 22  NOTE: Load the "
1b9c0 61 66 74 65 72 2d 63 6f 6e 73 74 72 61 69 6e 74  after-constraint
1b9d0 73 22 20 63 75 73 74 6f 6d 20 70 65 72 2d 75 73  s" custom per-us
1b9e0 65 72 20 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f  er and/or per-ho
1b9f0 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  st..        #   
1ba00 20 20 20 20 74 65 73 74 20 73 65 74 74 69 6e 67      test setting
1ba10 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20  s now...        
1ba20 23 0d 0a 20 20 20 20 20 20 20 20 75 70 6c 65 76  #..        uplev
1ba30 65 6c 20 31 20 5b 6c 69 73 74 20 6c 6f 61 64 53  el 1 [list loadS
1ba40 51 4c 69 74 65 54 65 73 74 53 65 74 74 69 6e 67  QLiteTestSetting
1ba50 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1ba60 6c 20 2e 61 66 74 65 72 5d 0d 0a 0d 0a 20 20 20  l .after]....   
1ba70 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1ba80 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 77 68 65  # NOTE: Show whe
1ba90 6e 20 6f 75 72 20 74 65 73 74 73 20 61 63 74 75  n our tests actu
1baa0 61 6c 6c 79 20 62 65 67 61 6e 20 28 6e 6f 77 29  ally began (now)
1bab0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1bac0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
1bad0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
1bae0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1baf0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 53 79 73         "---- Sys
1bb00 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
1bb10 74 65 73 74 73 20 62 65 67 61 6e 20 61 74 20 22  tests began at "
1bb20 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1bb30 5b 63 6c 6f 63 6b 20 66 6f 72 6d 61 74 20 5b 63  [clock format [c
1bb40 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 5d 20 5c  lock seconds]] \
1bb50 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  n]..      }..   
1bb60 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
1bb70 72 75 6e 53 51 4c 69 74 65 54 65 73 74 45 70 69  runSQLiteTestEpi
1bb80 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20 20 20 20  logue {} {..    
1bb90 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
1bba0 45 3a 20 53 6b 69 70 20 72 75 6e 6e 69 6e 67 20  E: Skip running 
1bbb0 6f 75 72 20 63 75 73 74 6f 6d 20 65 70 69 6c 6f  our custom epilo
1bbc0 67 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20  gue if the main 
1bbd0 6f 6e 65 20 68 61 73 20 62 65 65 6e 0d 0a 20 20  one has been..  
1bbe0 20 20 20 20 23 20 20 20 20 20 20 20 73 6b 69 70      #       skip
1bbf0 70 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ped...      #.. 
1bc00 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
1bc10 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 70 69 6c  exists ::no(epil
1bc20 6f 67 75 65 2e 65 61 67 6c 65 29 5d 7d 20 74 68  ogue.eagle)]} th
1bc30 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
1bc40 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
1bc50 20 53 68 6f 77 20 77 68 65 6e 20 6f 75 72 20 74   Show when our t
1bc60 65 73 74 73 20 61 63 74 75 61 6c 6c 79 20 65 6e  ests actually en
1bc70 64 65 64 20 28 6e 6f 77 29 2e 0d 0a 20 20 20 20  ded (now)...    
1bc80 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74      #..        t
1bc90 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
1bca0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1bcb0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1bcc0 22 2d 2d 2d 2d 20 53 79 73 74 65 6d 2e 44 61 74  "---- System.Dat
1bcd0 61 2e 53 51 4c 69 74 65 20 74 65 73 74 73 20 65  a.SQLite tests e
1bce0 6e 64 65 64 20 61 74 20 22 20 5c 0d 0a 20 20 20  nded at " \..   
1bcf0 20 20 20 20 20 20 20 20 20 5b 63 6c 6f 63 6b 20           [clock 
1bd00 66 6f 72 6d 61 74 20 5b 63 6c 6f 63 6b 20 73 65  format [clock se
1bd10 63 6f 6e 64 73 5d 5d 20 5c 6e 5d 0d 0a 0d 0a 20  conds]] \n].... 
1bd20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1bd30 20 20 23 20 42 55 47 46 49 58 3a 20 42 65 66 6f    # BUGFIX: Befo
1bd40 72 65 20 63 68 65 63 6b 69 6e 67 20 74 68 65 20  re checking the 
1bd50 66 69 6e 61 6c 20 72 65 73 6f 75 72 63 65 73 20  final resources 
1bd60 69 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74 65  in use by SQLite
1bd70 2c 20 6d 61 6b 65 0d 0a 20 20 20 20 20 20 20 20  , make..        
1bd80 23 20 20 20 20 20 20 20 20 20 73 75 72 65 20 62  #         sure b
1bd90 6f 74 68 20 6f 66 20 74 68 65 20 50 52 41 47 4d  oth of the PRAGM
1bda0 41 20 72 65 6c 61 74 65 64 20 64 69 72 65 63 74  A related direct
1bdb0 6f 72 79 20 6e 61 6d 65 73 20 61 72 65 20 66 72  ory names are fr
1bdc0 65 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  eed...        #.
1bdd0 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f  .        checkFo
1bde0 72 53 51 4c 69 74 65 44 69 72 65 63 74 6f 72 69  rSQLiteDirectori
1bdf0 65 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  es $::test_chann
1be00 65 6c 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20  el true....     
1be10 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1be20 4e 4f 54 45 3a 20 41 6c 73 6f 20 72 65 70 6f 72  NOTE: Also repor
1be30 74 20 74 68 65 20 72 65 73 6f 75 72 63 65 20 75  t the resource u
1be40 73 61 67 65 20 61 66 74 65 72 20 72 75 6e 6e 69  sage after runni
1be50 6e 67 20 74 68 65 20 74 65 73 74 73 2e 0d 0a 20  ng the tests... 
1be60 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1be70 20 20 72 65 70 6f 72 74 53 51 4c 69 74 65 52 65    reportSQLiteRe
1be80 73 6f 75 72 63 65 73 20 24 3a 3a 74 65 73 74 5f  sources $::test_
1be90 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20  channel....     
1bea0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1beb0 4e 4f 54 45 3a 20 52 65 70 6f 72 74 20 74 68 65  NOTE: Report the
1bec0 20 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65   critical handle
1bed0 20 63 6f 75 6e 74 73 20 61 66 74 65 72 20 72 75   counts after ru
1bee0 6e 6e 69 6e 67 20 74 68 65 20 74 65 73 74 73 2e  nning the tests.
1bef0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1bf00 20 20 20 20 20 67 65 74 53 51 4c 69 74 65 48 61       getSQLiteHa
1bf10 6e 64 6c 65 43 6f 75 6e 74 73 20 24 3a 3a 74 65  ndleCounts $::te
1bf20 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20  st_channel..    
1bf30 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
1bf40 20 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23     #############
1bf50 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1bf60 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1bf70 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1bf80 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
1bf90 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23 23      ############
1bfa0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1bfb0 23 20 45 4e 44 20 45 61 67 6c 65 20 4f 4e 4c 59  # END Eagle ONLY
1bfc0 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
1bfd0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
1bfe0 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23  .    ###########
1bff0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1c000 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1c010 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1c020 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1c030 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 0d 0a 20 20  ..  }....  #..  
1c040 23 20 4e 4f 54 45 3a 20 53 61 76 65 20 74 68 65  # NOTE: Save the
1c050 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 69 72   name of the dir
1c060 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e  ectory containin
1c070 67 20 74 68 69 73 20 66 69 6c 65 2e 0d 0a 20 20  g this file...  
1c080 23 0d 0a 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20  #..  if {![info 
1c090 65 78 69 73 74 73 20 63 6f 6d 6d 6f 6e 5f 64 69  exists common_di
1c0a0 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b  rectory]} then {
1c0b0 0d 0a 20 20 20 20 73 65 74 20 63 6f 6d 6d 6f 6e  ..    set common
1c0c0 5f 64 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65  _directory [file
1c0d0 20 64 69 72 6e 61 6d 65 20 5b 69 6e 66 6f 20 73   dirname [info s
1c0e0 63 72 69 70 74 5d 5d 0d 0a 20 20 7d 0d 0a 0d 0a  cript]]..  }....
1c0f0 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 50    #..  # NOTE: P
1c100 72 6f 76 69 64 65 20 74 68 65 20 53 79 73 74 65  rovide the Syste
1c110 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 74 65  m.Data.SQLite te
1c120 73 74 20 70 61 63 6b 61 67 65 20 74 6f 20 74 68  st package to th
1c130 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a  e interpreter...
1c140 20 20 23 0d 0a 20 20 70 61 63 6b 61 67 65 20 70    #..  package p
1c150 72 6f 76 69 64 65 20 53 79 73 74 65 6d 2e 44 61  rovide System.Da
1c160 74 61 2e 53 51 4c 69 74 65 2e 54 65 73 74 20 31  ta.SQLite.Test 1
1c170 2e 30 0d 0a 7d 0d 0a                             .0..}..