System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact e4bca89b93814c5d79c3b1be1187480b24187a94:


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 23 0d 0a 20 20 20 20 20 20 23        #..      #
2c80: 20 4e 4f 54 45 3a 20 46 6f 72 20 6e 6f 77 2c 20   NOTE: For now, 
2c90: 6a 75 73 74 20 75 73 65 20 74 68 65 20 65 78 69  just use the exi
2ca0: 73 74 69 6e 67 20 74 65 73 74 20 63 6f 6e 73 74  sting test const
2cb0: 72 61 69 6e 74 20 66 6f 72 20 64 65 74 65 63 74  raint for detect
2cc0: 69 6e 67 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ing..      #    
2cd0: 20 20 20 61 20 57 6f 57 36 34 20 70 72 6f 63 65     a WoW64 proce
2ce0: 73 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ss...      #..  
2cf0: 20 20 20 20 72 65 74 75 72 6e 20 5b 68 61 76 65      return [have
2d00: 43 6f 6e 73 74 72 61 69 6e 74 20 77 6f 77 36 34  Constraint wow64
2d10: 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  ]..    }.....   
2d20: 20 70 72 6f 63 20 69 73 4d 69 78 65 64 4d 6f 64   proc isMixedMod
2d30: 65 41 73 73 65 6d 62 6c 79 20 7b 20 66 69 6c 65  eAssembly { file
2d40: 4e 61 6d 65 20 7b 76 61 72 4e 61 6d 65 20 22 22  Name {varName ""
2d50: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
2d60: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69        # NOTE: Fi
2d70: 72 73 74 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  rst, make sure t
2d80: 68 65 20 74 65 73 74 20 73 75 69 74 65 20 69 6e  he test suite in
2d90: 66 72 61 73 74 72 75 63 74 75 72 65 20 69 73 20  frastructure is 
2da0: 61 6c 6c 6f 77 65 64 20 74 6f 0d 0a 20 20 20 20  allowed to..    
2db0: 20 20 23 20 20 20 20 20 20 20 75 73 65 20 74 68    #       use th
2dc0: 65 20 5b 65 78 65 63 5d 20 63 6f 6d 6d 61 6e 64  e [exec] command
2dd0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
2de0: 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
2df0: 73 74 73 20 3a 3a 6e 6f 28 65 78 65 63 29 5d 20  sts ::no(exec)] 
2e00: 26 26 20 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  && ![info exists
2e10: 20 3a 3a 6e 6f 28 63 6f 72 46 6c 61 67 73 29 5d   ::no(corFlags)]
2e20: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2e30: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
2e40: 4f 54 45 3a 20 49 66 20 74 68 65 20 6c 6f 63 61  OTE: If the loca
2e50: 74 69 6f 6e 20 6f 66 20 43 6f 72 46 6c 61 67 73  tion of CorFlags
2e60: 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74   is present in t
2e70: 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 2c 0d  he environment,.
2e80: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
2e90: 20 75 73 65 20 69 74 3b 20 6f 74 68 65 72 77 69   use it; otherwi
2ea0: 73 65 20 61 73 73 75 6d 65 20 69 74 20 69 73 20  se assume it is 
2eb0: 69 6e 20 74 68 65 20 50 41 54 48 2e 0d 0a 20 20  in the PATH...  
2ec0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2ed0: 20 73 65 74 20 63 6f 72 46 6c 61 67 73 20 5b 65   set corFlags [e
2ee0: 78 70 72 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  xpr {..         
2ef0: 20 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a   [info exists ::
2f00: 65 6e 76 28 43 6f 72 46 6c 61 67 73 29 5d 20 3f  env(CorFlags)] ?
2f10: 20 24 3a 3a 65 6e 76 28 43 6f 72 46 6c 61 67 73   $::env(CorFlags
2f20: 29 20 3a 20 22 43 6f 72 46 6c 61 67 73 22 0d 0a  ) : "CorFlags"..
2f30: 20 20 20 20 20 20 20 20 7d 5d 0d 0a 0d 0a 20 20          }]....  
2f40: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2f50: 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
2f60: 20 74 6f 20 65 78 65 63 75 74 65 20 43 6f 72 46   to execute CorF
2f70: 6c 61 67 73 20 6f 6e 20 74 68 65 20 73 70 65 63  lags on the spec
2f80: 69 66 69 65 64 20 66 69 6c 65 2e 0d 0a 20 20 20  ified file...   
2f90: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2fa0: 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
2fb0: 20 20 20 20 20 20 20 20 65 78 65 63 20 2d 2d 20          exec -- 
2fc0: 24 63 6f 72 46 6c 61 67 73 20 5b 66 69 6c 65 20  $corFlags [file 
2fd0: 6e 61 74 69 76 65 6e 61 6d 65 20 24 66 69 6c 65  nativename $file
2fe0: 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 7d  Name]..        }
2ff0: 20 65 78 65 63 5d 20 3d 3d 20 30 7d 20 74 68 65   exec] == 0} the
3000: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  n {..          #
3010: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
3020: 54 45 3a 20 49 66 20 72 65 71 75 65 73 74 65 64  TE: If requested
3030: 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2c 20   by our caller, 
3040: 61 74 74 65 6d 70 74 20 74 6f 20 64 65 74 65 72  attempt to deter
3050: 6d 69 6e 65 20 74 68 65 0d 0a 20 20 20 20 20 20  mine the..      
3060: 20 20 20 20 23 20 20 20 20 20 20 20 70 6c 61 74      #       plat
3070: 66 6f 72 6d 20 66 6f 72 20 74 68 65 20 73 70 65  form for the spe
3080: 63 69 66 69 65 64 20 66 69 6c 65 20 61 73 20 77  cified file as w
3090: 65 6c 6c 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ell...          
30a0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  #..          if 
30b0: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
30c0: 24 76 61 72 4e 61 6d 65 5d 20 3e 20 30 7d 20 74  $varName] > 0} t
30d0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
30e0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
30f0: 20 20 23 20 4e 4f 54 45 3a 20 53 74 6f 72 65 20    # NOTE: Store 
3100: 74 68 65 20 70 6c 61 74 66 6f 72 6d 20 69 6e 20  the platform in 
3110: 74 68 65 20 6e 61 6d 65 64 20 76 61 72 69 61 62  the named variab
3120: 6c 65 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20  le in the..     
3130: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
3140: 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 20 63 61  ontext of our ca
3150: 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20  ller...         
3160: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
3170: 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
3180: 6d 65 20 70 6c 61 74 66 6f 72 6d 0d 0a 0d 0a 20  me platform.... 
3190: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
31a0: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
31b0: 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 65 78 74  : Attempt to ext
31c0: 72 61 63 74 20 74 68 65 20 50 45 20 6c 69 6e 65  ract the PE line
31d0: 20 66 72 6f 6d 20 74 68 65 20 63 61 70 74 75 72   from the captur
31e0: 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed..            
31f0: 23 20 20 20 20 20 20 20 6f 75 74 70 75 74 2e 20  #       output. 
3200: 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69   If this value i
3210: 73 20 22 50 45 33 32 22 20 6f 72 20 22 50 45 33  s "PE32" or "PE3
3220: 32 2b 22 2c 20 74 68 65 0d 0a 20 20 20 20 20 20  2+", the..      
3230: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 73        #       as
3240: 73 65 6d 62 6c 79 20 66 69 6c 65 20 69 73 20 33  sembly file is 3
3250: 32 2d 62 69 74 20 6f 72 20 36 34 2d 62 69 74 2c  2-bit or 64-bit,
3260: 20 72 65 73 70 65 63 74 69 76 65 6c 79 3b 0d 0a   respectively;..
3270: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
3280: 20 20 20 20 6f 74 68 65 72 77 69 73 65 2c 20 69      otherwise, i
3290: 74 73 20 74 79 70 65 20 69 73 20 75 6e 6b 6e 6f  ts type is unkno
32a0: 77 6e 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  wn...           
32b0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
32c0: 73 65 74 20 70 61 74 74 65 72 6e 20 7b 5e 50 45  set pattern {^PE
32d0: 20 20 20 20 20 20 20 20 3a 20 28 50 45 33 32 7c          : (PE32|
32e0: 50 45 33 32 5c 2b 29 5c 73 2b 24 7d 0d 0a 0d 0a  PE32\+)\s+$}....
32f0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
3300: 5b 72 65 67 65 78 70 20 2d 6c 69 6e 65 20 2d 2d  [regexp -line --
3310: 20 24 70 61 74 74 65 72 6e 20 24 65 78 65 63 20   $pattern $exec 
3320: 64 75 6d 6d 79 20 70 65 33 32 5d 7d 20 74 68 65  dummy pe32]} the
3330: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
3340: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
3350: 20 20 20 20 23 20 48 41 43 4b 3a 20 54 68 69 73      # HACK: This
3360: 20 5b 73 77 69 74 63 68 5d 20 61 73 73 75 6d 65   [switch] assume
3370: 73 20 74 68 61 74 20 33 32 2d 62 69 74 20 65 78  s that 32-bit ex
3380: 65 63 75 74 61 62 6c 65 73 20 61 72 65 0d 0a 20  ecutables are.. 
3390: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
33a0: 20 20 20 20 20 61 6c 77 61 79 73 20 78 38 36 20       always x86 
33b0: 61 6e 64 20 74 68 61 74 20 36 34 2d 62 69 74 20  and that 64-bit 
33c0: 65 78 65 63 75 74 61 62 6c 65 73 20 61 72 65 20  executables are 
33d0: 61 6c 77 61 79 73 0d 0a 20 20 20 20 20 20 20 20  always..        
33e0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 78 36        #       x6
33f0: 34 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  4...            
3400: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
3410: 20 20 20 73 77 69 74 63 68 20 2d 65 78 61 63 74     switch -exact
3420: 20 2d 2d 20 24 70 65 33 32 20 7b 0d 0a 20 20 20   -- $pe32 {..   
3430: 20 20 20 20 20 20 20 20 20 20 20 20 20 50 45 33               PE3
3440: 32 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  2 {..           
3450: 20 20 20 20 20 20 20 73 65 74 20 70 6c 61 74 66         set platf
3460: 6f 72 6d 20 57 69 6e 33 32 0d 0a 20 20 20 20 20  orm Win32..     
3470: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
3480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 45                PE
3490: 33 32 2b 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  32+ {..         
34a0: 20 20 20 20 20 20 20 20 20 73 65 74 20 70 6c 61           set pla
34b0: 74 66 6f 72 6d 20 78 36 34 0d 0a 20 20 20 20 20  tform x64..     
34c0: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
34d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65                de
34e0: 66 61 75 6c 74 20 7b 0d 0a 20 20 20 20 20 20 20  fault {..       
34f0: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 70             set p
3500: 6c 61 74 66 6f 72 6d 20 22 22 0d 0a 20 20 20 20  latform ""..    
3510: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
3520: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
3530: 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
3540: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
3550: 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d      set platform
3560: 20 22 22 0d 0a 20 20 20 20 20 20 20 20 20 20 20   ""..           
3570: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
3580: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
3590: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
35a0: 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 65 78 74  : Attempt to ext
35b0: 72 61 63 74 20 74 68 65 20 49 4c 4f 4e 4c 59 20  ract the ILONLY 
35c0: 6c 69 6e 65 20 66 72 6f 6d 20 74 68 65 20 63 61  line from the ca
35d0: 70 74 75 72 65 64 0d 0a 20 20 20 20 20 20 20 20  ptured..        
35e0: 20 20 23 20 20 20 20 20 20 20 6f 75 74 70 75 74    #       output
35f0: 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65  .  If this value
3600: 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 20 73 70   is zero, the sp
3610: 65 63 69 66 69 65 64 20 66 69 6c 65 20 6d 75 73  ecified file mus
3620: 74 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  t..          #  
3630: 20 20 20 20 20 62 65 20 61 20 6d 69 78 65 64 2d       be a mixed-
3640: 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 3b 20 6f  mode assembly; o
3650: 74 68 65 72 77 69 73 65 2c 20 69 74 20 63 6f 6e  therwise, it con
3660: 74 61 69 6e 73 20 6f 6e 6c 79 0d 0a 20 20 20 20  tains only..    
3670: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 61        #       ma
3680: 6e 61 67 65 64 20 63 6f 6d 70 6f 6e 65 6e 74 73  naged components
3690: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
36a0: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 70 61            set pa
36b0: 74 74 65 72 6e 20 7b 5e 49 4c 4f 4e 4c 59 20 20  ttern {^ILONLY  
36c0: 20 20 3a 20 28 30 7c 31 29 5c 73 2b 24 7d 0d 0a    : (0|1)\s+$}..
36d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
36e0: 21 5b 72 65 67 65 78 70 20 2d 6c 69 6e 65 20 2d  ![regexp -line -
36f0: 2d 20 24 70 61 74 74 65 72 6e 20 24 65 78 65 63  - $pattern $exec
3700: 20 64 75 6d 6d 79 20 69 6c 4f 6e 6c 79 5d 7d 20   dummy ilOnly]} 
3710: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
3720: 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
3730: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
3740: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
3750: 24 69 6c 4f 6e 6c 79 7d 20 74 68 65 6e 20 7b 0d  $ilOnly} then {.
3760: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
3770: 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
3780: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
3790: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
37a0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
37b0: 54 45 3a 20 49 66 20 74 68 65 20 74 65 73 74 20  TE: If the test 
37c0: 73 75 69 74 65 20 63 61 6e 6e 6f 74 20 75 73 65  suite cannot use
37d0: 20 5b 65 78 65 63 5d 20 6f 72 20 65 78 65 63 75   [exec] or execu
37e0: 74 69 6f 6e 20 6f 66 20 43 6f 72 46 6c 61 67 73  tion of CorFlags
37f0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
3800: 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 20 66  failed, return f
3810: 61 6c 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  alse...      #..
3820: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
3830: 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  se..    }.....  
3840: 20 20 70 72 6f 63 20 69 73 42 75 69 6c 64 41 76    proc isBuildAv
3850: 61 69 6c 61 62 6c 65 20 7b 20 6e 61 74 69 76 65  ailable { native
3860: 20 64 69 72 65 63 74 6f 72 79 20 7b 76 61 72 4e   directory {varN
3870: 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20  ame ""} } {..   
3880: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
3890: 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 66 75  TE: Build the fu
38a0: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 66 69  lly qualified fi
38b0: 6c 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  le name for the 
38c0: 70 72 69 6d 61 72 79 20 61 73 73 65 6d 62 6c 79  primary assembly
38d0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
38e0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 53  containing the S
38f0: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
3900: 65 20 6d 61 6e 61 67 65 64 20 63 6f 6d 70 6f 6e  e managed compon
3910: 65 6e 74 73 2e 20 20 49 74 0d 0a 20 20 20 20 20  ents.  It..     
3920: 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20   #       should 
3930: 62 65 20 6e 6f 74 65 64 20 74 68 61 74 20 74 68  be noted that th
3940: 69 73 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65  is assembly file
3950: 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69   may also contai
3960: 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  n the..      #  
3970: 20 20 20 20 20 6e 61 74 69 76 65 20 63 6f 6d 70       native comp
3980: 6f 6e 65 6e 74 73 2c 20 69 66 20 61 20 6e 61 74  onents, if a nat
3990: 69 76 65 20 62 75 69 6c 64 20 69 73 20 69 6e 20  ive build is in 
39a0: 75 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  use...      #.. 
39b0: 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d       set fileNam
39c0: 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
39d0: 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64  me [file join $d
39e0: 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20  irectory \..    
39f0: 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
3a00: 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d 5d 0d 0a  a.SQLite.dll]]..
3a10: 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69  ..      if {![fi
3a20: 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e  le exists $fileN
3a30: 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
3a40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
3a50: 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  se..      }.... 
3a60: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
3a70: 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
3a80: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
3a90: 65 74 65 63 74 20 69 66 20 74 68 65 20 70 72 69  etect if the pri
3aa0: 6d 61 72 79 20 61 73 73 65 6d 62 6c 79 0d 0a 20  mary assembly.. 
3ab0: 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e       #       con
3ac0: 74 61 69 6e 73 20 61 6e 79 20 6e 61 74 69 76 65  tains any native
3ad0: 20 63 6f 6d 70 6f 6e 65 6e 74 73 2c 20 69 66 20   components, if 
3ae0: 6e 65 63 65 73 73 61 72 79 2e 0d 0a 20 20 20 20  necessary...    
3af0: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
3b00: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e  string length $n
3b10: 61 74 69 76 65 5d 20 3d 3d 20 30 7d 20 74 68 65  ative] == 0} the
3b20: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
3b30: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
3b40: 24 76 61 72 4e 61 6d 65 5d 20 3e 20 30 7d 20 74  $varName] > 0} t
3b50: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
3b60: 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d   upvar 1 $varNam
3b70: 65 20 24 76 61 72 4e 61 6d 65 0d 0a 20 20 20 20  e $varName..    
3b80: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
3b90: 20 73 65 74 20 6e 61 74 69 76 65 20 5b 69 73 4d   set native [isM
3ba0: 69 78 65 64 4d 6f 64 65 41 73 73 65 6d 62 6c 79  ixedModeAssembly
3bb0: 20 24 66 69 6c 65 4e 61 6d 65 20 24 76 61 72 4e   $fileName $varN
3bc0: 61 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  ame]..      }...
3bd0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
3be0: 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 70  # NOTE: If the p
3bf0: 72 69 6d 61 72 79 20 61 73 73 65 6d 62 6c 79 20  rimary assembly 
3c00: 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20 74 68  also contains th
3c10: 65 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e 65  e native compone
3c20: 6e 74 73 2c 0d 0a 20 20 20 20 20 20 23 20 20 20  nts,..      #   
3c30: 20 20 20 20 77 65 20 68 61 76 65 20 65 76 65 72      we have ever
3c40: 79 74 68 69 6e 67 20 77 65 20 6e 65 65 64 2e 0d  ything we need..
3c50: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
3c60: 69 66 20 7b 24 6e 61 74 69 76 65 7d 20 74 68 65  if {$native} the
3c70: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  n {..        ret
3c80: 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
3c90: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
3ca0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c      # NOTE: Buil
3cb0: 64 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c  d the fully qual
3cc0: 69 66 69 65 64 20 66 69 6c 65 20 6e 61 6d 65 20  ified file name 
3cd0: 66 6f 72 20 74 68 65 20 69 6e 74 65 72 6f 70 20  for the interop 
3ce0: 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20  assembly..      
3cf0: 23 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 69  #       containi
3d00: 6e 67 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61  ng the System.Da
3d10: 74 61 2e 53 51 4c 69 74 65 20 6e 61 74 69 76 65  ta.SQLite native
3d20: 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e 20 20 49 66   components.  If
3d30: 20 74 68 69 73 0d 0a 20 20 20 20 20 20 23 20 20   this..      #  
3d40: 20 20 20 20 20 66 69 6c 65 20 65 78 69 73 74 73       file exists
3d50: 2c 20 77 65 20 73 68 6f 75 6c 64 20 68 61 76 65  , we should have
3d60: 20 65 76 65 72 79 74 68 69 6e 67 20 77 65 20 6e   everything we n
3d70: 65 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  eed...      #.. 
3d80: 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d       set fileNam
3d90: 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
3da0: 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64  me [file join $d
3db0: 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20  irectory \..    
3dc0: 20 20 20 20 20 20 53 51 4c 69 74 65 2e 49 6e 74        SQLite.Int
3dd0: 65 72 6f 70 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20  erop.dll]]....  
3de0: 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78      if {[file ex
3df0: 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d  ists $fileName]}
3e00: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
3e10: 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20   return true..  
3e20: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
3e30: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
3e40: 42 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 79 20  Build the fully 
3e50: 71 75 61 6c 69 66 69 65 64 20 66 69 6c 65 20 6e  qualified file n
3e60: 61 6d 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ame for the SQLi
3e70: 74 65 20 63 6f 72 65 0d 0a 20 20 20 20 20 20 23  te core..      #
3e80: 20 20 20 20 20 20 20 6c 69 62 72 61 72 79 2e 20         library. 
3e90: 20 49 66 20 74 68 69 73 20 66 69 6c 65 20 65 78   If this file ex
3ea0: 69 73 74 73 2c 20 77 65 20 73 68 6f 75 6c 64 20  ists, we should 
3eb0: 68 61 76 65 20 65 76 65 72 79 74 68 69 6e 67 20  have everything 
3ec0: 77 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  we..      #     
3ed0: 20 20 6e 65 65 64 2e 0d 0a 20 20 20 20 20 20 23    need...      #
3ee0: 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65  ..      set file
3ef0: 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  Name [file nativ
3f00: 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
3f10: 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20   $directory \.. 
3f20: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
3f30: 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  .dll]]....      
3f40: 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73  if {[file exists
3f50: 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65   $fileName]} the
3f60: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  n {..        ret
3f70: 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
3f80: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
3f90: 20 20 20 20 23 20 4e 4f 54 45 3a 20 4f 6e 65 20      # NOTE: One 
3fa0: 6f 72 20 6d 6f 72 65 20 6e 61 74 69 76 65 20 63  or more native c
3fb0: 6f 6d 70 6f 6e 65 6e 74 73 20 6e 65 65 64 65 64  omponents needed
3fc0: 20 62 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e   by System.Data.
3fd0: 53 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 23 20  SQLite..      # 
3fe0: 20 20 20 20 20 20 61 72 65 20 6d 69 73 73 69 6e        are missin
3ff0: 67 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  g...      #..   
4000: 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d     return false.
4010: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
4020: 72 6f 63 20 69 73 52 65 6c 65 61 73 65 41 76 61  roc isReleaseAva
4030: 69 6c 61 62 6c 65 20 7b 20 64 69 72 65 63 74 6f  ilable { directo
4040: 72 79 20 7b 76 61 72 4e 61 6d 65 20 22 22 7d 20  ry {varName ""} 
4050: 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  } {..      if {[
4060: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76  string length $v
4070: 61 72 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65  arName] > 0} the
4080: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 70 76  n {..        upv
4090: 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 24 76  ar 1 $varName $v
40a0: 61 72 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 0d  arName..      }.
40b0: 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
40c0: 5b 69 73 42 75 69 6c 64 41 76 61 69 6c 61 62 6c  [isBuildAvailabl
40d0: 65 20 22 22 20 24 64 69 72 65 63 74 6f 72 79 20  e "" $directory 
40e0: 24 76 61 72 4e 61 6d 65 5d 0d 0a 20 20 20 20 7d  $varName]..    }
40f0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 6a 6f  .....    proc jo
4100: 69 6e 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79  inBuildDirectory
4110: 20 7b 20 6e 61 74 69 76 65 20 70 61 74 68 20 79   { native path y
4120: 65 61 72 20 70 6c 61 74 66 6f 72 6d 20 63 6f 6e  ear platform con
4130: 66 69 67 75 72 61 74 69 6f 6e 20 7d 20 7b 0d 0a  figuration } {..
4140: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
4150: 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f 75   NOTE: Figure ou
4160: 74 20 61 6e 64 20 74 68 65 6e 20 72 65 74 75 72  t and then retur
4170: 6e 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c  n the fully qual
4180: 69 66 69 65 64 20 70 61 74 68 20 74 6f 20 74 68  ified path to th
4190: 65 20 62 75 69 6c 64 0d 0a 20 20 20 20 20 20 23  e build..      #
41a0: 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79         directory
41b0: 20 62 61 73 65 64 20 6f 6e 20 61 6c 6c 20 74 68   based on all th
41c0: 65 20 61 72 67 75 6d 65 6e 74 73 20 70 72 6f 76  e arguments prov
41d0: 69 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c  ided by our call
41e0: 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  er...      #..  
41f0: 20 20 20 20 69 66 20 7b 24 6e 61 74 69 76 65 7d      if {$native}
4200: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
4210: 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6a 6f   return [file jo
4220: 69 6e 20 24 70 61 74 68 20 62 69 6e 20 24 79 65  in $path bin $ye
4230: 61 72 20 24 70 6c 61 74 66 6f 72 6d 20 24 63 6f  ar $platform $co
4240: 6e 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 20 20  nfiguration]..  
4250: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
4260: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69        return [fi
4270: 6c 65 20 6a 6f 69 6e 20 24 70 61 74 68 20 62 69  le join $path bi
4280: 6e 20 24 79 65 61 72 20 24 63 6f 6e 66 69 67 75  n $year $configu
4290: 72 61 74 69 6f 6e 20 62 69 6e 5d 0d 0a 20 20 20  ration bin]..   
42a0: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
42b0: 20 20 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c      proc getBuil
42c0: 64 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d  dDirectory {} {.
42d0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
42e0: 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66 20 74  # NOTE: See if t
42f0: 68 65 20 22 6e 61 74 69 76 65 22 20 72 75 6e 74  he "native" runt
4300: 69 6d 65 20 6f 70 74 69 6f 6e 20 68 61 73 20 62  ime option has b
4310: 65 65 6e 20 73 65 74 2e 20 20 49 66 20 73 6f 2c  een set.  If so,
4320: 20 75 73 65 20 74 68 65 0d 0a 20 20 20 20 20 20   use the..      
4330: 23 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72  #       director
4340: 79 20 66 6f 72 20 74 68 65 20 6d 69 78 65 64 2d  y for the mixed-
4350: 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20 28 61  mode assembly (a
4360: 2e 6b 2e 61 2e 20 74 68 65 20 6e 61 74 69 76 65  .k.a. the native
4370: 20 69 6e 74 65 72 6f 70 0d 0a 20 20 20 20 20 20   interop..      
4380: 23 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79  #       assembly
4390: 29 2e 20 20 54 6f 20 65 6e 61 62 6c 65 20 74 68  ).  To enable th
43a0: 69 73 20 6f 70 74 69 6f 6e 20 76 69 61 20 74 68  is option via th
43b0: 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2c 20  e command line, 
43c0: 65 6e 74 65 72 20 61 0d 0a 20 20 20 20 20 20 23  enter a..      #
43d0: 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64 20 73         command s
43e0: 69 6d 69 6c 61 72 20 74 6f 20 6f 6e 65 20 6f 66  imilar to one of
43f0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 28   the following (
4400: 61 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65 29  all on one line)
4410: 3a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  :..      #..    
4420: 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53    #       EagleS
4430: 68 65 6c 6c 2e 65 78 65 20 2d 69 6e 69 74 69 61  hell.exe -initia
4440: 6c 69 7a 65 20 2d 72 75 6e 74 69 6d 65 4f 70 74  lize -runtimeOpt
4450: 69 6f 6e 20 6e 61 74 69 76 65 0d 0a 20 20 20 20  ion native..    
4460: 20 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c    #         -fil
4470: 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e  e .\path\to\all.
4480: 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a  eagle..      #..
4490: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 54 6f        #       To
44a0: 20 65 6e 61 62 6c 65 20 74 68 69 73 20 6f 70 74   enable this opt
44b0: 69 6f 6e 20 76 69 61 20 74 68 65 20 63 6f 6d 6d  ion via the comm
44c0: 61 6e 64 20 6c 69 6e 65 20 70 72 69 6f 72 20 74  and line prior t
44d0: 6f 20 74 68 65 20 22 62 65 74 61 20 31 36 22 0d  o the "beta 16".
44e0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72  .      #       r
44f0: 65 6c 65 61 73 65 20 6f 66 20 45 61 67 6c 65 2c  elease of Eagle,
4500: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
4510: 6f 6d 6d 61 6e 64 20 6d 75 73 74 20 62 65 20 75  ommand must be u
4520: 73 65 64 20 69 6e 73 74 65 61 64 0d 0a 20 20 20  sed instead..   
4530: 20 20 20 23 20 20 20 20 20 20 20 28 61 6c 73 6f     #       (also
4540: 20 61 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65   all on one line
4550: 29 3a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ):..      #..   
4560: 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65     #       Eagle
4570: 53 68 65 6c 6c 2e 65 78 65 20 2d 69 6e 69 74 69  Shell.exe -initi
4580: 61 6c 69 7a 65 20 2d 70 6f 73 74 49 6e 69 74 69  alize -postIniti
4590: 61 6c 69 7a 65 0d 0a 20 20 20 20 20 20 23 20 20  alize..      #  
45a0: 20 20 20 20 20 20 20 22 6f 62 6a 65 63 74 20 69         "object i
45b0: 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72 65 74 65  nvoke Interprete
45c0: 72 2e 47 65 74 41 63 74 69 76 65 20 41 64 64 52  r.GetActive AddR
45d0: 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74  untimeOption nat
45e0: 69 76 65 22 0d 0a 20 20 20 20 20 20 23 20 20 20  ive"..      #   
45f0: 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61        -file .\pa
4600: 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d  th\to\all.eagle.
4610: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
4620: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
4630: 20 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63 74 6f   ::build_directo
4640: 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  ry] && \..      
4650: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
4660: 74 68 20 24 3a 3a 62 75 69 6c 64 5f 64 69 72 65  th $::build_dire
4670: 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e  ctory] > 0} then
4680: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
4690: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54         # NOTE: T
46a0: 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74  he location of t
46b0: 68 65 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f  he build directo
46c0: 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  ry has been over
46d0: 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20  ridden;..       
46e0: 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f   #       therefo
46f0: 72 65 2c 20 75 73 65 20 69 74 20 76 65 72 62 61  re, use it verba
4700: 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  tim...        #.
4710: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
4720: 24 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63 74 6f  $::build_directo
4730: 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ry..      } else
4740: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
4750: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49         # NOTE: I
4760: 66 20 74 68 65 20 22 6e 61 74 69 76 65 22 20 72  f the "native" r
4770: 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  untime option is
4780: 20 73 65 74 2c 20 74 68 65 20 6d 69 78 65 64 2d   set, the mixed-
4790: 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 0d 0a 20  mode assembly.. 
47a0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69         #       i
47b0: 73 20 62 65 69 6e 67 20 74 65 73 74 65 64 2e 20  s being tested. 
47c0: 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74   In that case, t
47d0: 68 65 20 70 61 74 68 20 74 6f 20 74 68 65 20 62  he path to the b
47e0: 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 0d 0a  uild directory..
47f0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
4800: 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 74 68 65  will contain the
4810: 20 70 6c 61 74 66 6f 72 6d 20 6e 61 6d 65 20 61   platform name a
4820: 6e 64 20 61 6c 6c 20 74 68 65 20 62 69 6e 61 72  nd all the binar
4830: 69 65 73 20 75 6e 64 65 72 20 74 65 73 74 0d 0a  ies under test..
4840: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
4850: 73 68 6f 75 6c 64 20 62 65 20 70 72 65 73 65 6e  should be presen
4860: 74 20 69 6e 20 74 68 61 74 20 64 69 72 65 63 74  t in that direct
4870: 6f 72 79 2e 20 20 49 66 20 74 68 65 20 22 6e 61  ory.  If the "na
4880: 74 69 76 65 22 20 72 75 6e 74 69 6d 65 0d 0a 20  tive" runtime.. 
4890: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f         #       o
48a0: 70 74 69 6f 6e 20 69 73 20 6e 6f 74 20 73 65 74  ption is not set
48b0: 2c 20 74 68 65 20 62 75 69 6c 64 20 64 69 72 65  , the build dire
48c0: 63 74 6f 72 79 20 77 69 6c 6c 20 62 65 20 63 6f  ctory will be co
48d0: 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 0d 0a  nsidered to be..
48e0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
48f0: 22 70 6c 61 74 66 6f 72 6d 2d 6e 65 75 74 72 61  "platform-neutra
4900: 6c 22 2c 20 77 69 74 68 20 74 68 65 20 6e 6f 74  l", with the not
4910: 61 62 6c 65 20 65 78 63 65 70 74 69 6f 6e 20 6f  able exception o
4920: 66 20 61 6e 79 20 6e 61 74 69 76 65 0d 0a 20 20  f any native..  
4930: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 73        #       as
4940: 73 65 6d 62 6c 79 20 28 65 2e 67 2e 20 22 53 51  sembly (e.g. "SQ
4950: 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c  Lite.Interop.dll
4960: 22 29 20 63 6f 70 69 65 64 20 74 68 65 72 65 20  ") copied there 
4970: 64 75 72 69 6e 67 20 74 68 65 0d 0a 20 20 20 20  during the..    
4980: 20 20 20 20 23 20 20 20 20 20 20 20 62 75 69 6c      #       buil
4990: 64 20 70 72 6f 63 65 73 73 20 69 74 73 65 6c 66  d process itself
49a0: 2e 20 20 49 66 20 74 68 65 20 62 75 69 6c 64 20  .  If the build 
49b0: 70 72 6f 63 65 73 73 20 73 6f 6d 65 68 6f 77 20  process somehow 
49c0: 64 6f 65 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20  does not..      
49d0: 20 20 23 20 20 20 20 20 20 20 63 6f 70 79 20 74    #       copy t
49e0: 68 65 20 6e 61 74 69 76 65 20 61 73 73 65 6d 62  he native assemb
49f0: 6c 79 20 66 6f 72 20 74 68 69 73 20 70 6c 61 74  ly for this plat
4a00: 66 6f 72 6d 2c 20 6d 6f 73 74 20 6f 66 20 74 68  form, most of th
4a10: 65 20 74 65 73 74 73 0d 0a 20 20 20 20 20 20 20  e tests..       
4a20: 20 23 20 20 20 20 20 20 20 69 6e 20 74 68 65 20   #       in the 
4a30: 73 75 69 74 65 20 77 69 6c 6c 20 73 69 6d 70 6c  suite will simpl
4a40: 79 20 62 65 20 73 6b 69 70 70 65 64 2e 20 20 47  y be skipped.  G
4a50: 65 6e 65 72 61 6c 6c 79 20 73 70 65 61 6b 69 6e  enerally speakin
4a60: 67 2c 20 74 68 65 72 65 0d 0a 20 20 20 20 20 20  g, there..      
4a70: 20 20 23 20 20 20 20 20 20 20 61 72 65 20 74 77    #       are tw
4a80: 6f 20 77 61 79 73 20 74 6f 20 62 75 69 6c 64 20  o ways to build 
4a90: 74 68 65 20 62 69 6e 61 72 69 65 73 20 77 68 65  the binaries whe
4aa0: 6e 20 70 72 65 70 61 72 69 6e 67 20 74 6f 20 72  n preparing to r
4ab0: 75 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  un the..        
4ac0: 23 20 20 20 20 20 20 20 74 65 73 74 20 73 75 69  #       test sui
4ad0: 74 65 3a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  te:..        #..
4ae0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
4af0: 31 2e 20 42 75 69 6c 64 20 74 68 65 20 73 65 70  1. Build the sep
4b00: 61 72 61 74 65 20 6d 61 6e 61 67 65 64 20 61 6e  arate managed an
4b10: 64 20 6e 61 74 69 76 65 20 61 73 73 65 6d 62 6c  d native assembl
4b20: 69 65 73 20 75 73 69 6e 67 20 73 6f 6d 65 0d 0a  ies using some..
4b30: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
4b40: 20 20 20 63 6f 6d 6d 61 6e 64 73 20 73 69 6d 69     commands simi
4b50: 6c 61 72 20 74 6f 3a 0d 0a 20 20 20 20 20 20 20  lar to:..       
4b60: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20   #..        #   
4b70: 20 20 20 20 20 20 20 62 75 69 6c 64 2e 62 61 74         build.bat
4b80: 20 24 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e   ${Configuration
4b90: 7d 4d 61 6e 61 67 65 64 4f 6e 6c 79 20 24 7b 50  }ManagedOnly ${P
4ba0: 6c 61 74 66 6f 72 6d 7d 0d 0a 20 20 20 20 20 20  latform}..      
4bb0: 20 20 23 20 20 20 20 20 20 20 20 20 20 62 75 69    #          bui
4bc0: 6c 64 2e 62 61 74 20 24 7b 43 6f 6e 66 69 67 75  ld.bat ${Configu
4bd0: 72 61 74 69 6f 6e 7d 4e 61 74 69 76 65 4f 6e 6c  ration}NativeOnl
4be0: 79 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 0d 0a 20  y ${Platform}.. 
4bf0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4c00: 20 20 23 20 20 20 20 20 20 20 20 20 20 57 68 65    #          Whe
4c10: 72 65 20 24 7b 43 6f 6e 66 69 67 75 72 61 74 69  re ${Configurati
4c20: 6f 6e 7d 20 69 73 20 65 69 74 68 65 72 20 22 44  on} is either "D
4c30: 65 62 75 67 22 20 6f 72 20 22 52 65 6c 65 61 73  ebug" or "Releas
4c40: 65 22 20 61 6e 64 0d 0a 20 20 20 20 20 20 20 20  e" and..        
4c50: 23 20 20 20 20 20 20 20 20 20 20 24 7b 50 6c 61  #          ${Pla
4c60: 74 66 6f 72 6d 7d 20 69 73 20 65 69 74 68 65 72  tform} is either
4c70: 20 22 57 69 6e 33 32 22 20 6f 72 20 22 78 36 34   "Win32" or "x64
4c80: 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  "...        #.. 
4c90: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 32         #       2
4ca0: 2e 20 42 75 69 6c 64 20 74 68 65 20 6d 69 78 65  . Build the mixe
4cb0: 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20  d-mode assembly 
4cc0: 75 73 69 6e 67 20 61 20 63 6f 6d 6d 61 6e 64 20  using a command 
4cd0: 73 69 6d 69 6c 61 72 20 74 6f 3a 0d 0a 20 20 20  similar to:..   
4ce0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4cf0: 23 20 20 20 20 20 20 20 20 20 20 62 75 69 6c 64  #          build
4d00: 2e 62 61 74 20 24 7b 43 6f 6e 66 69 67 75 72 61  .bat ${Configura
4d10: 74 69 6f 6e 7d 20 24 7b 50 6c 61 74 66 6f 72 6d  tion} ${Platform
4d20: 7d 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  }..        #..  
4d30: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
4d40: 20 57 68 65 72 65 20 24 7b 43 6f 6e 66 69 67 75   Where ${Configu
4d50: 72 61 74 69 6f 6e 7d 20 69 73 20 65 69 74 68 65  ration} is eithe
4d60: 72 20 22 44 65 62 75 67 22 20 6f 72 20 22 52 65  r "Debug" or "Re
4d70: 6c 65 61 73 65 22 20 61 6e 64 0d 0a 20 20 20 20  lease" and..    
4d80: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 24      #          $
4d90: 7b 50 6c 61 74 66 6f 72 6d 7d 20 69 73 20 65 69  {Platform} is ei
4da0: 74 68 65 72 20 22 57 69 6e 33 32 22 20 6f 72 20  ther "Win32" or 
4db0: 22 78 36 34 22 2e 20 20 49 66 20 74 68 69 73 20  "x64".  If this 
4dc0: 63 6f 6d 6d 61 6e 64 20 69 73 0d 0a 20 20 20 20  command is..    
4dd0: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 75      #          u
4de0: 73 65 64 2c 20 76 61 72 69 6f 75 73 20 74 65 73  sed, various tes
4df0: 74 73 20 74 68 61 74 20 72 65 71 75 69 72 65 20  ts that require 
4e00: 73 75 70 70 6c 65 6d 65 6e 74 61 72 79 20 6d 61  supplementary ma
4e10: 6e 61 67 65 64 0d 0a 20 20 20 20 20 20 20 20 23  naged..        #
4e20: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 6d 62            assemb
4e30: 6c 69 65 73 20 28 65 2e 67 2e 20 4c 49 4e 51 29  lies (e.g. LINQ)
4e40: 20 6d 61 79 20 62 65 20 73 6b 69 70 70 65 64 20   may be skipped 
4e50: 75 6e 6c 65 73 73 20 74 68 6f 73 65 20 62 69 6e  unless those bin
4e60: 61 72 69 65 73 0d 0a 20 20 20 20 20 20 20 20 23  aries..        #
4e70: 20 20 20 20 20 20 20 20 20 20 61 72 65 20 73 75            are su
4e80: 62 73 65 71 75 65 6e 74 6c 79 20 63 6f 70 69 65  bsequently copie
4e90: 64 20 69 6e 74 6f 20 74 68 65 20 63 6f 72 72 65  d into the corre
4ea0: 63 74 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e  ct directory (i.
4eb0: 65 2e 20 62 79 0d 0a 20 20 20 20 20 20 20 20 23  e. by..        #
4ec0: 20 20 20 20 20 20 20 20 20 20 22 74 65 73 74 5f            "test_
4ed0: 61 6c 6c 2e 62 61 74 22 29 2e 0d 0a 20 20 20 20  all.bat")...    
4ee0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
4ef0: 20 20 20 20 20 20 20 4e 6f 74 65 20 74 68 61 74         Note that
4f00: 20 61 6c 6c 20 6f 66 20 74 68 65 20 62 75 69 6c   all of the buil
4f10: 64 20 63 6f 6d 6d 61 6e 64 73 20 61 62 6f 76 65  d commands above
4f20: 20 77 69 6c 6c 20 64 65 66 61 75 6c 74 20 74 6f   will default to
4f30: 20 75 73 69 6e 67 0d 0a 20 20 20 20 20 20 20 20   using..        
4f40: 23 20 20 20 20 20 20 20 74 68 65 20 6c 61 74 65  #       the late
4f50: 73 74 20 76 65 72 73 69 6f 6e 20 6f 66 20 4d 53  st version of MS
4f60: 42 75 69 6c 64 20 61 76 61 69 6c 61 62 6c 65 20  Build available 
4f70: 61 6e 64 20 74 68 65 20 22 74 65 73 74 5f 79 65  and the "test_ye
4f80: 61 72 22 20 6d 61 79 0d 0a 20 20 20 20 20 20 20  ar" may..       
4f90: 20 23 20 20 20 20 20 20 20 6e 65 65 64 20 74 6f   #       need to
4fa0: 20 62 65 20 61 64 6a 75 73 74 65 64 20 61 63 63   be adjusted acc
4fb0: 6f 72 64 69 6e 67 6c 79 20 74 6f 20 61 63 74 75  ordingly to actu
4fc0: 61 6c 6c 79 20 72 75 6e 20 74 68 65 20 74 65 73  ally run the tes
4fd0: 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20  t suite...      
4fe0: 20 20 23 20 20 20 20 20 20 20 52 65 66 65 72 20    #       Refer 
4ff0: 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 73 20  to the comments 
5000: 69 6e 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72  in [getBuildYear
5010: 5d 20 66 6f 72 20 6d 6f 72 65 20 69 6e 66 6f 72  ] for more infor
5020: 6d 61 74 69 6f 6e 20 6f 6e 0d 0a 20 20 20 20 20  mation on..     
5030: 20 20 20 23 20 20 20 20 20 20 20 68 6f 77 20 74     #       how t
5040: 6f 20 73 65 74 20 74 68 69 73 20 76 61 72 69 61  o set this varia
5050: 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ble...        #.
5060: 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 61 74  .        set nat
5070: 69 76 65 20 5b 68 61 73 52 75 6e 74 69 6d 65 4f  ive [hasRuntimeO
5080: 70 74 69 6f 6e 20 6e 61 74 69 76 65 5d 0d 0a 0d  ption native]...
5090: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
50a0: 5b 6a 6f 69 6e 42 75 69 6c 64 44 69 72 65 63 74  [joinBuildDirect
50b0: 6f 72 79 20 24 6e 61 74 69 76 65 20 5b 67 65 74  ory $native [get
50c0: 42 75 69 6c 64 42 61 73 65 44 69 72 65 63 74 6f  BuildBaseDirecto
50d0: 72 79 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ry] \..         
50e0: 20 20 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72     [getBuildYear
50f0: 5d 20 5b 67 65 74 42 75 69 6c 64 50 6c 61 74 66  ] [getBuildPlatf
5100: 6f 72 6d 20 24 6e 61 74 69 76 65 5d 20 5b 67 65  orm $native] [ge
5110: 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74  tBuildConfigurat
5120: 69 6f 6e 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  ion]]..      }..
5130: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
5140: 6f 63 20 67 65 74 52 65 6c 65 61 73 65 56 65 72  oc getReleaseVer
5150: 73 69 6f 6e 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  sion {} {..     
5160: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
5170: 3a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  : Figure out the
5180: 20 72 65 6c 65 61 73 65 20 76 65 72 73 69 6f 6e   release version
5190: 20 66 6f 72 20 75 73 65 20 77 69 74 68 20 74 68   for use with th
51a0: 65 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72  e build director
51b0: 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
51c0: 20 77 68 65 6e 20 63 68 65 63 6b 69 6e 67 20 66   when checking f
51d0: 6f 72 20 61 76 61 69 6c 61 62 6c 65 20 72 65 6c  or available rel
51e0: 65 61 73 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d  eases...      #.
51f0: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
5200: 20 65 78 69 73 74 73 20 3a 3a 72 65 6c 65 61 73   exists ::releas
5210: 65 5f 76 65 72 73 69 6f 6e 5d 20 26 26 20 5c 0d  e_version] && \.
5220: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
5230: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 72 65 6c  ng length $::rel
5240: 65 61 73 65 5f 76 65 72 73 69 6f 6e 5d 20 3e 20  ease_version] > 
5250: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
5260: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
5270: 4e 4f 54 45 3a 20 54 68 65 20 72 65 6c 65 61 73  NOTE: The releas
5280: 65 20 76 65 72 73 69 6f 6e 20 68 61 73 20 62 65  e version has be
5290: 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 20 74  en overridden; t
52a0: 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
52b0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
52c0: 20 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20    verbatim...   
52d0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
52e0: 72 65 74 75 72 6e 20 24 3a 3a 72 65 6c 65 61 73  return $::releas
52f0: 65 5f 76 65 72 73 69 6f 6e 0d 0a 20 20 20 20 20  e_version..     
5300: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
5310: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
5320: 4e 4f 54 45 3a 20 4e 6f 20 72 65 6c 65 61 73 65  NOTE: No release
5330: 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69   version is avai
5340: 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 6e  lable, return an
5350: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0d 0a   empty string...
5360: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
5370: 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  It is important 
5380: 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70  to return an emp
5390: 74 79 20 73 74 72 69 6e 67 20 68 65 72 65 20 62  ty string here b
53a0: 65 63 61 75 73 65 20 74 68 65 0d 0a 20 20 20 20  ecause the..    
53b0: 20 20 20 20 23 20 20 20 20 20 20 20 72 65 73 75      #       resu
53c0: 6c 74 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65  lt of this proce
53d0: 64 75 72 65 20 6d 61 79 20 62 65 20 75 73 65 64  dure may be used
53e0: 20 77 69 74 68 20 5b 66 69 6c 65 20 6a 6f 69 6e   with [file join
53f0: 5d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ]...        #.. 
5400: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22         return ""
5410: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
5420: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
5430: 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 7b  tBuildFileName {
5440: 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66   fileName {platf
5450: 6f 72 6d 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20  orm ""} } {..   
5460: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
5470: 54 45 3a 20 52 65 74 75 72 6e 73 20 74 68 65 20  TE: Returns the 
5480: 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 6e  specified file n
5490: 61 6d 65 20 61 73 20 69 66 20 69 74 20 77 65 72  ame as if it wer
54a0: 65 20 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65  e located in the
54b0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
54c0: 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 2c  build directory,
54d0: 20 64 69 73 63 61 72 64 69 6e 67 20 61 6e 79 20   discarding any 
54e0: 64 69 72 65 63 74 6f 72 79 20 69 6e 66 6f 72 6d  directory inform
54f0: 61 74 69 6f 6e 20 70 72 65 73 65 6e 74 0d 0a 20  ation present.. 
5500: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 20       #       in 
5510: 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 73  the file name as
5520: 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72   provided by our
5530: 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20   caller...      
5540: 23 0d 0a 20 20 20 20 20 20 73 65 74 20 72 65 73  #..      set res
5550: 75 6c 74 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ult [file native
5560: 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  name \..        
5570: 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65    [file join [ge
5580: 74 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79 5d  tBuildDirectory]
5590: 20 24 70 6c 61 74 66 6f 72 6d 20 5b 66 69 6c 65   $platform [file
55a0: 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d   tail $fileName]
55b0: 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ]]....      #.. 
55c0: 20 20 20 20 20 23 20 48 41 43 4b 3a 20 57 68 65       # HACK: Whe
55d0: 6e 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 57 6f 57  n running on WoW
55e0: 36 34 2c 20 61 73 73 75 6d 65 20 74 68 65 20 74  64, assume the t
55f0: 65 73 74 20 65 78 65 63 75 74 61 62 6c 65 73 20  est executables 
5600: 61 72 65 20 70 72 65 73 65 6e 74 0d 0a 20 20 20  are present..   
5610: 20 20 20 23 20 20 20 20 20 20 20 77 69 74 68 20     #       with 
5620: 74 68 65 20 22 33 32 22 20 73 75 66 66 69 78 20  the "32" suffix 
5630: 6f 6e 20 74 68 65 6d 2e 0d 0a 20 20 20 20 20 20  on them...      
5640: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 73  #..      if {[is
5650: 52 75 6e 6e 69 6e 67 57 6f 57 36 34 5d 20 26 26  RunningWoW64] &&
5660: 20 5b 66 69 6c 65 20 65 78 74 65 6e 73 69 6f 6e   [file extension
5670: 20 24 72 65 73 75 6c 74 5d 20 65 71 20 22 2e 65   $result] eq ".e
5680: 78 65 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  xe"} then {..   
5690: 20 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20       set result 
56a0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 66 69 6c  [appendArgs [fil
56b0: 65 20 72 6f 6f 74 6e 61 6d 65 20 24 72 65 73 75  e rootname $resu
56c0: 6c 74 5d 20 33 32 2e 65 78 65 5d 0d 0a 20 20 20  lt] 32.exe]..   
56d0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
56e0: 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20  turn $result..  
56f0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
5700: 20 67 65 74 45 78 74 65 72 6e 61 6c 44 69 72 65   getExternalDire
5710: 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20  ctory {} {..    
5720: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
5730: 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72  E: This procedur
5740: 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 64 69  e returns the di
5750: 72 65 63 74 6f 72 79 20 77 68 65 72 65 20 74 68  rectory where th
5760: 65 20 65 78 74 65 72 6e 61 6c 20 62 69 6e 61 72  e external binar
5770: 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
5780: 20 66 69 6c 65 73 20 61 72 65 20 6c 6f 63 61 74   files are locat
5790: 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ed...      #..  
57a0: 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65      return [file
57b0: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
57c0: 65 20 64 69 72 6e 61 6d 65 20 5b 66 69 6c 65 20  e dirname [file 
57d0: 64 69 72 6e 61 6d 65 20 5b 69 6e 66 6f 20 62 69  dirname [info bi
57e0: 6e 61 72 79 5d 5d 5d 5d 0d 0a 20 20 20 20 7d 0d  nary]]]]..    }.
57f0: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
5800: 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79 20  BinaryDirectory 
5810: 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
5820: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69       # NOTE: Thi
5830: 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75  s procedure retu
5840: 72 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f 72  rns the director
5850: 79 20 77 68 65 72 65 20 74 68 65 20 74 65 73 74  y where the test
5860: 20 61 70 70 6c 69 63 61 74 69 6f 6e 0d 0a 20 20   application..  
5870: 20 20 20 20 23 20 20 20 20 20 20 20 69 74 73 65      #       itse
5880: 6c 66 20 28 69 2e 65 2e 20 74 68 65 20 45 61 67  lf (i.e. the Eag
5890: 6c 65 20 73 68 65 6c 6c 29 20 69 73 20 6c 6f 63  le shell) is loc
58a0: 61 74 65 64 2e 20 20 54 68 69 73 20 77 69 6c 6c  ated.  This will
58b0: 20 62 65 20 75 73 65 64 20 61 73 0d 0a 20 20 20   be used as..   
58c0: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 64     #       the d
58d0: 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 74  estination for t
58e0: 68 65 20 63 6f 70 69 65 64 20 53 79 73 74 65 6d  he copied System
58f0: 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 6e 61 74  .Data.SQLite nat
5900: 69 76 65 20 61 6e 64 0d 0a 20 20 20 20 20 20 23  ive and..      #
5910: 20 20 20 20 20 20 20 6d 61 6e 61 67 65 64 20 61         managed a
5920: 73 73 65 6d 62 6c 69 65 73 20 28 69 2e 65 2e 20  ssemblies (i.e. 
5930: 62 65 63 61 75 73 65 20 74 68 69 73 20 69 73 20  because this is 
5940: 6f 6e 65 20 6f 66 20 74 68 65 20 66 65 77 20 70  one of the few p
5950: 6c 61 63 65 73 0d 0a 20 20 20 20 20 20 23 20 20  laces..      #  
5960: 20 20 20 20 20 77 68 65 72 65 20 74 68 65 20 43       where the C
5970: 4c 52 20 77 69 6c 6c 20 61 63 74 75 61 6c 6c 79  LR will actually
5980: 20 66 69 6e 64 20 61 6e 64 20 6c 6f 61 64 20 74   find and load t
5990: 68 65 6d 20 70 72 6f 70 65 72 6c 79 29 2e 0d 0a  hem properly)...
59a0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
59b0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
59c0: 3a 3a 62 69 6e 61 72 79 5f 64 69 72 65 63 74 6f  ::binary_directo
59d0: 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  ry] && \..      
59e0: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
59f0: 74 68 20 24 3a 3a 62 69 6e 61 72 79 5f 64 69 72  th $::binary_dir
5a00: 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65  ectory] > 0} the
5a10: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
5a20: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
5a30: 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  The location of 
5a40: 74 68 65 20 62 69 6e 61 72 79 20 64 69 72 65 63  the binary direc
5a50: 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76  tory has been ov
5a60: 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20  erridden;..     
5a70: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 72 65     #       there
5a80: 66 6f 72 65 2c 20 75 73 65 20 69 74 20 76 65 72  fore, use it ver
5a90: 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20  batim...        
5aa0: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
5ab0: 6e 20 24 3a 3a 62 69 6e 61 72 79 5f 64 69 72 65  n $::binary_dire
5ac0: 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65  ctory..      } e
5ad0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  lse {..        r
5ae0: 65 74 75 72 6e 20 5b 69 6e 66 6f 20 62 69 6e 61  eturn [info bina
5af0: 72 79 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  ry]..      }..  
5b00: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
5b10: 20 67 65 74 45 78 74 65 72 6e 61 6c 46 69 6c 65   getExternalFile
5b20: 4e 61 6d 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20  Name { fileName 
5b30: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
5b40: 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75      # NOTE: Retu
5b50: 72 6e 73 20 74 68 65 20 73 70 65 63 69 66 69 65  rns the specifie
5b60: 64 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 69  d file name as i
5b70: 66 20 69 74 20 77 65 72 65 20 6c 6f 63 61 74 65  f it were locate
5b80: 64 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20  d in the..      
5b90: 23 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72  #       director
5ba0: 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  y containing the
5bb0: 20 65 78 74 65 72 6e 61 6c 20 62 69 6e 61 72 69   external binari
5bc0: 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  es...      #..  
5bd0: 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65      return [file
5be0: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
5bf0: 65 20 6a 6f 69 6e 20 5b 67 65 74 45 78 74 65 72  e join [getExter
5c00: 6e 61 6c 44 69 72 65 63 74 6f 72 79 5d 20 24 66  nalDirectory] $f
5c10: 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 7d  ileName]]..    }
5c20: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
5c30: 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
5c40: 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74  { fileName {plat
5c50: 66 6f 72 6d 20 22 22 7d 20 7d 20 7b 0d 0a 20 20  form ""} } {..  
5c60: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
5c70: 4f 54 45 3a 20 52 65 74 75 72 6e 73 20 74 68 65  OTE: Returns the
5c80: 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20   specified file 
5c90: 6e 61 6d 65 20 61 73 20 69 66 20 69 74 20 77 65  name as if it we
5ca0: 72 65 20 6c 6f 63 61 74 65 64 20 69 6e 20 74 68  re located in th
5cb0: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
5cc0: 20 62 69 6e 61 72 79 20 64 69 72 65 63 74 6f 72   binary director
5cd0: 79 2c 20 64 69 73 63 61 72 64 69 6e 67 20 61 6e  y, discarding an
5ce0: 79 20 64 69 72 65 63 74 6f 72 79 20 69 6e 66 6f  y directory info
5cf0: 72 6d 61 74 69 6f 6e 20 70 72 65 73 65 6e 74 0d  rmation present.
5d00: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69  .      #       i
5d10: 6e 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20  n the file name 
5d20: 61 73 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f  as provided by o
5d30: 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20  ur caller...    
5d40: 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72    #..      retur
5d50: 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  n [file nativena
5d60: 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
5d70: 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42  [file join [getB
5d80: 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20  inaryDirectory] 
5d90: 24 70 6c 61 74 66 6f 72 6d 20 5b 66 69 6c 65 20  $platform [file 
5da0: 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d  tail $fileName]]
5db0: 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  ]..    }.....   
5dc0: 20 70 72 6f 63 20 67 65 74 43 6f 72 65 42 69 6e   proc getCoreBin
5dd0: 61 72 79 46 69 6c 65 4e 61 6d 65 20 7b 20 7b 70  aryFileName { {p
5de0: 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 73 74 61  latform ""} {sta
5df0: 6e 64 61 72 64 20 66 61 6c 73 65 7d 20 7d 20 7b  ndard false} } {
5e00: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
5e10: 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 73   # NOTE: Returns
5e20: 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 20 66   the full path f
5e30: 6f 72 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74  or the file cont
5e40: 61 69 6e 69 6e 67 20 74 68 65 20 53 51 4c 69 74  aining the SQLit
5e50: 65 20 63 6f 72 65 0d 0a 20 20 20 20 20 20 23 20  e core..      # 
5e60: 20 20 20 20 20 20 6e 61 74 69 76 65 20 6c 69 62        native lib
5e70: 72 61 72 79 20 63 6f 64 65 20 66 6f 72 20 74 68  rary code for th
5e80: 69 73 20 70 6c 61 74 66 6f 72 6d 2e 20 20 46 69  is platform.  Fi
5e90: 72 73 74 2c 20 63 68 65 63 6b 20 61 6e 64 20 73  rst, check and s
5ea0: 65 65 20 69 66 0d 0a 20 20 20 20 20 20 23 20 20  ee if..      #  
5eb0: 20 20 20 20 20 74 68 65 20 53 51 4c 69 74 65 20       the SQLite 
5ec0: 63 6f 72 65 20 6e 61 74 69 76 65 20 6c 69 62 72  core native libr
5ed0: 61 72 79 20 68 61 73 20 61 6c 72 65 61 64 79 20  ary has already 
5ee0: 62 65 65 6e 20 6c 6f 61 64 65 64 2e 20 20 4e 65  been loaded.  Ne
5ef0: 78 74 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20  xt,..      #    
5f00: 20 20 20 66 61 6c 6c 62 61 63 6b 20 74 6f 20 77     fallback to w
5f10: 68 61 74 20 74 68 65 20 66 75 6c 6c 20 70 61 74  hat the full pat
5f20: 68 20 73 68 6f 75 6c 64 20 62 65 2c 20 62 61 73  h should be, bas
5f30: 65 64 20 6f 6e 20 77 68 65 74 68 65 72 20 74 68  ed on whether th
5f40: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
5f50: 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65   mixed-mode asse
5f60: 6d 62 6c 79 20 69 73 20 62 65 69 6e 67 20 75 73  mbly is being us
5f70: 65 64 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20  ed and the name 
5f80: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 0d 0a  of the current..
5f90: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 6c        #       pl
5fa0: 61 74 66 6f 72 6d 2e 0d 0a 20 20 20 20 20 20 23  atform...      #
5fb0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74  ..      if {[cat
5fc0: 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62  ch {..        ob
5fd0: 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
5fe0: 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
5ff0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73  .            Sys
6000: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
6010: 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
6020: 6f 64 73 20 5f 53 51 4c 69 74 65 4e 61 74 69 76  ods _SQLiteNativ
6030: 65 4d 6f 64 75 6c 65 46 69 6c 65 4e 61 6d 65 0d  eModuleFileName.
6040: 0a 20 20 20 20 20 20 7d 20 66 69 6c 65 4e 61 6d  .      } fileNam
6050: 65 5d 20 3d 3d 20 30 20 26 26 20 5b 73 74 72 69  e] == 0 && [stri
6060: 6e 67 20 6c 65 6e 67 74 68 20 24 66 69 6c 65 4e  ng length $fileN
6070: 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ame] > 0} then {
6080: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
6090: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
60a0: 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6e 61 74   SQLite core nat
60b0: 69 76 65 20 6c 69 62 72 61 72 79 20 68 61 73 20  ive library has 
60c0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6c 6f 61  already been loa
60d0: 64 65 64 20 76 69 61 0d 0a 20 20 20 20 20 20 20  ded via..       
60e0: 20 23 20 20 20 20 20 20 20 74 68 65 20 6e 61 74   #       the nat
60f0: 69 76 65 20 6c 69 62 72 61 72 79 20 70 72 65 2d  ive library pre-
6100: 6c 6f 61 64 65 72 2e 20 20 52 65 74 75 72 6e 20  loader.  Return 
6110: 74 68 61 74 20 66 69 6c 65 20 6e 61 6d 65 20 6e  that file name n
6120: 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ow...        #..
6130: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
6140: 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20  fileName..      
6150: 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  }....      if {[
6160: 68 61 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  hasRuntimeOption
6170: 20 6e 61 74 69 76 65 5d 7d 20 74 68 65 6e 20 7b   native]} then {
6180: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
6190: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74       # NOTE: Ret
61a0: 75 72 6e 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f  urn the mixed-mo
61b0: 64 65 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65  de assembly file
61c0: 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20   name...        
61d0: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
61e0: 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  n [file nativena
61f0: 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
6200: 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65    [file join [ge
6210: 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79  tBinaryDirectory
6220: 5d 20 24 70 6c 61 74 66 6f 72 6d 20 53 79 73 74  ] $platform Syst
6230: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
6240: 6c 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  ll]]..      } el
6250: 73 65 69 66 20 7b 24 73 74 61 6e 64 61 72 64 7d  seif {$standard}
6260: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
6270: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
6280: 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  TE: Return the n
6290: 61 74 69 76 65 2d 6f 6e 6c 79 20 73 74 61 6e 64  ative-only stand
62a0: 61 72 64 20 53 51 4c 69 74 65 20 6c 69 62 72 61  ard SQLite libra
62b0: 72 79 20 66 69 6c 65 20 6e 61 6d 65 2e 0d 0a 20  ry file name... 
62c0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
62d0: 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e    return [file n
62e0: 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20  ativename \..   
62f0: 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a           [file j
6300: 6f 69 6e 20 5b 67 65 74 42 69 6e 61 72 79 44 69  oin [getBinaryDi
6310: 72 65 63 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f  rectory] $platfo
6320: 72 6d 20 73 71 6c 69 74 65 33 2e 64 6c 6c 5d 5d  rm sqlite3.dll]]
6330: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
6340: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
6350: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74       # NOTE: Ret
6360: 75 72 6e 20 74 68 65 20 6e 61 74 69 76 65 2d 6f  urn the native-o
6370: 6e 6c 79 20 69 6e 74 65 72 6f 70 20 61 73 73 65  nly interop asse
6380: 6d 62 6c 79 20 66 69 6c 65 20 6e 61 6d 65 2e 0d  mbly file name..
6390: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
63a0: 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65      return [file
63b0: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20   nativename \.. 
63c0: 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
63d0: 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e 61 72 79   join [getBinary
63e0: 44 69 72 65 63 74 6f 72 79 5d 20 24 70 6c 61 74  Directory] $plat
63f0: 66 6f 72 6d 20 53 51 4c 69 74 65 2e 49 6e 74 65  form SQLite.Inte
6400: 72 6f 70 2e 64 6c 6c 5d 5d 0d 0a 20 20 20 20 20  rop.dll]]..     
6410: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
6420: 20 20 70 72 6f 63 20 67 65 74 43 6f 6d 6d 6f 6e    proc getCommon
6430: 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a  Directory {} {..
6440: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
6450: 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63   NOTE: This proc
6460: 65 64 75 72 65 20 72 65 74 75 72 6e 73 20 74 68  edure returns th
6470: 65 20 64 69 72 65 63 74 6f 72 79 20 77 68 65 72  e directory wher
6480: 65 20 74 68 65 20 74 65 73 74 20 73 63 72 69 70  e the test scrip
6490: 74 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ts..      #     
64a0: 20 20 73 68 6f 75 6c 64 20 62 65 20 6c 6f 63 61    should be loca
64b0: 74 65 64 2e 20 20 42 79 20 64 65 66 61 75 6c 74  ted.  By default
64c0: 2c 20 74 68 69 73 20 6a 75 73 74 20 72 65 74 75  , this just retu
64d0: 72 6e 73 20 74 68 65 20 45 61 67 6c 65 0d 0a 20  rns the Eagle.. 
64e0: 20 20 20 20 20 23 20 20 20 20 20 20 20 62 69 6e       #       bin
64f0: 61 72 79 20 64 69 72 65 63 74 6f 72 79 2e 0d 0a  ary directory...
6500: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
6510: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
6520: 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f  ::common_directo
6530: 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  ry] && \..      
6540: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
6550: 74 68 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72  th $::common_dir
6560: 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65  ectory] > 0} the
6570: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
6580: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
6590: 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  The location of 
65a0: 74 68 65 20 63 6f 6d 6d 6f 6e 20 64 69 72 65 63  the common direc
65b0: 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73 65  tory has been se
65c0: 74 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  t;..        #   
65d0: 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75      therefore, u
65e0: 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20  se it...        
65f0: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
6600: 6e 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65  n $::common_dire
6610: 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65  ctory..      } e
6620: 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69  lseif {[info exi
6630: 73 74 73 20 3a 3a 76 65 6e 64 6f 72 5f 64 69 72  sts ::vendor_dir
6640: 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20  ectory] && \..  
6650: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
6660: 6c 65 6e 67 74 68 20 24 3a 3a 76 65 6e 64 6f 72  length $::vendor
6670: 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d  _directory] > 0}
6680: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
6690: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
66a0: 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e  TE: The location
66b0: 20 6f 66 20 74 68 65 20 76 65 6e 64 6f 72 20 64   of the vendor d
66c0: 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
66d0: 6e 20 73 65 74 3b 0d 0a 20 20 20 20 20 20 20 20  n set;..        
66e0: 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72  #       therefor
66f0: 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20  e, use it...    
6700: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
6710: 65 74 75 72 6e 20 24 3a 3a 76 65 6e 64 6f 72 5f  eturn $::vendor_
6720: 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20  directory..     
6730: 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f   } elseif {[info
6740: 20 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f 6c 69   exists ::tcl_li
6750: 62 72 61 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20  brary] && \..   
6760: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
6770: 65 6e 67 74 68 20 24 3a 3a 74 63 6c 5f 6c 69 62  ength $::tcl_lib
6780: 72 61 72 79 5d 20 3e 20 30 20 26 26 20 5c 0d 0a  rary] > 0 && \..
6790: 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
67a0: 69 73 64 69 72 65 63 74 6f 72 79 20 24 3a 3a 74  isdirectory $::t
67b0: 63 6c 5f 6c 69 62 72 61 72 79 5d 7d 20 74 68 65  cl_library]} the
67c0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
67d0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
67e0: 54 68 65 20 76 61 72 69 61 62 6c 65 20 77 69 74  The variable wit
67f0: 68 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f  h the location o
6800: 66 20 74 68 65 20 73 63 72 69 70 74 20 6c 69 62  f the script lib
6810: 72 61 72 79 20 69 73 0d 0a 20 20 20 20 20 20 20  rary is..       
6820: 20 23 20 20 20 20 20 20 20 73 65 74 20 61 6e 64   #       set and
6830: 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 61   appears to be a
6840: 20 72 65 61 6c 20 64 69 72 65 63 74 6f 72 79 20   real directory 
6850: 28 69 2e 65 2e 20 6e 6f 74 20 65 6d 62 65 64 64  (i.e. not embedd
6860: 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ed..        #   
6870: 20 20 20 20 77 69 74 68 69 6e 20 61 20 66 69 6c      within a fil
6880: 65 29 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 75  e); therefore, u
6890: 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20  se it...        
68a0: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
68b0: 6e 20 24 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79  n $::tcl_library
68c0: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
68d0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
68e0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 6c       # NOTE: Fal
68f0: 6c 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69 72  lback to the dir
6900: 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e  ectory containin
6910: 67 20 74 68 65 20 65 78 65 63 75 74 61 62 6c 65  g the executable
6920: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
6930: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 69 6e        return [in
6940: 66 6f 20 62 69 6e 61 72 79 5d 0d 0a 20 20 20 20  fo binary]..    
6950: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
6960: 20 20 20 70 72 6f 63 20 67 65 74 44 61 74 61 62     proc getDatab
6970: 61 73 65 44 69 72 65 63 74 6f 72 79 20 7b 7d 20  aseDirectory {} 
6980: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
6990: 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70    # NOTE: This p
69a0: 72 6f 63 65 64 75 72 65 20 72 65 74 75 72 6e 73  rocedure returns
69b0: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 77   the directory w
69c0: 68 65 72 65 20 74 68 65 20 74 65 73 74 20 64 61  here the test da
69d0: 74 61 62 61 73 65 73 0d 0a 20 20 20 20 20 20 23  tabases..      #
69e0: 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65         should be
69f0: 20 6c 6f 63 61 74 65 64 2e 20 20 42 79 20 64 65   located.  By de
6a00: 66 61 75 6c 74 2c 20 74 68 69 73 20 6a 75 73 74  fault, this just
6a10: 20 75 73 65 73 20 74 68 65 20 74 65 6d 70 6f 72   uses the tempor
6a20: 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ary..      #    
6a30: 20 20 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e     directory con
6a40: 66 69 67 75 72 65 64 20 66 6f 72 20 74 68 69 73  figured for this
6a50: 20 73 79 73 74 65 6d 2e 0d 0a 20 20 20 20 20 20   system...      
6a60: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
6a70: 66 6f 20 65 78 69 73 74 73 20 3a 3a 64 61 74 61  fo exists ::data
6a80: 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79 5d 20  base_directory] 
6a90: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
6aa0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
6ab0: 3a 3a 64 61 74 61 62 61 73 65 5f 64 69 72 65 63  ::database_direc
6ac0: 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20  tory] > 0} then 
6ad0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
6ae0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
6af0: 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  e location of th
6b00: 65 20 64 61 74 61 62 61 73 65 20 64 69 72 65 63  e database direc
6b10: 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76  tory has been ov
6b20: 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20  erridden;..     
6b30: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 72 65     #       there
6b40: 66 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20  fore, use it... 
6b50: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
6b60: 20 20 72 65 74 75 72 6e 20 24 3a 3a 64 61 74 61    return $::data
6b70: 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79 0d 0a  base_directory..
6b80: 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
6b90: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 73  [info exists ::s
6ba0: 63 72 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79  cratch_directory
6bb0: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
6bc0: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
6bd0: 20 24 3a 3a 73 63 72 61 74 63 68 5f 64 69 72 65   $::scratch_dire
6be0: 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e  ctory] > 0} then
6bf0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
6c00: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54         # NOTE: T
6c10: 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74  he location of t
6c20: 68 65 20 73 63 72 61 74 63 68 20 64 69 72 65 63  he scratch direc
6c30: 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76  tory has been ov
6c40: 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20  erridden;..     
6c50: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 72 65     #       there
6c60: 66 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20  fore, use it... 
6c70: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
6c80: 20 20 72 65 74 75 72 6e 20 24 3a 3a 73 63 72 61    return $::scra
6c90: 74 63 68 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20  tch_directory.. 
6ca0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
6cb0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 67         return [g
6cc0: 65 74 54 65 6d 70 6f 72 61 72 79 50 61 74 68 5d  etTemporaryPath]
6cd0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
6ce0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
6cf0: 74 54 65 6d 70 6f 72 61 72 79 44 69 72 65 63 74  tTemporaryDirect
6d00: 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  ory {} {..      
6d10: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
6d20: 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   This procedure 
6d30: 72 65 74 75 72 6e 73 20 74 68 65 20 64 69 72 65  returns the dire
6d40: 63 74 6f 72 79 20 77 68 65 72 65 20 74 68 65 20  ctory where the 
6d50: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 0d  temporary files.
6d60: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
6d70: 68 6f 75 6c 64 20 62 65 20 6c 6f 63 61 74 65 64  hould be located
6d80: 2e 20 20 42 79 20 64 65 66 61 75 6c 74 2c 20 74  .  By default, t
6d90: 68 69 73 20 6a 75 73 74 20 75 73 65 73 20 74 68  his just uses th
6da0: 65 20 74 65 6d 70 6f 72 61 72 79 0d 0a 20 20 20  e temporary..   
6db0: 20 20 20 23 20 20 20 20 20 20 20 64 69 72 65 63     #       direc
6dc0: 74 6f 72 79 20 63 6f 6e 66 69 67 75 72 65 64 20  tory configured 
6dd0: 66 6f 72 20 74 68 69 73 20 73 79 73 74 65 6d 2e  for this system.
6de0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
6df0: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
6e00: 73 20 3a 3a 74 65 6d 70 6f 72 61 72 79 5f 64 69  s ::temporary_di
6e10: 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20  rectory] && \.. 
6e20: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
6e30: 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 6d 70 6f   length $::tempo
6e40: 72 61 72 79 5f 64 69 72 65 63 74 6f 72 79 5d 20  rary_directory] 
6e50: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
6e60: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
6e70: 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61  # NOTE: The loca
6e80: 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 65 6d 70  tion of the temp
6e90: 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 20  orary directory 
6ea0: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64  has been overrid
6eb0: 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20  den;..        # 
6ec0: 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c        therefore,
6ed0: 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20   use it...      
6ee0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
6ef0: 75 72 6e 20 24 3a 3a 74 65 6d 70 6f 72 61 72 79  urn $::temporary
6f00: 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20  _directory..    
6f10: 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66    } elseif {[inf
6f20: 6f 20 65 78 69 73 74 73 20 3a 3a 73 63 72 61 74  o exists ::scrat
6f30: 63 68 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26  ch_directory] &&
6f40: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
6f50: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
6f60: 73 63 72 61 74 63 68 5f 64 69 72 65 63 74 6f 72  scratch_director
6f70: 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  y] > 0} then {..
6f80: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
6f90: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c     # NOTE: The l
6fa0: 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ocation of the s
6fb0: 63 72 61 74 63 68 20 64 69 72 65 63 74 6f 72 79  cratch directory
6fc0: 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69   has been overri
6fd0: 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23  dden;..        #
6fe0: 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65         therefore
6ff0: 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20  , use it...     
7000: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
7010: 74 75 72 6e 20 24 3a 3a 73 63 72 61 74 63 68 5f  turn $::scratch_
7020: 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20  directory..     
7030: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
7040: 20 20 20 72 65 74 75 72 6e 20 5b 67 65 74 54 65     return [getTe
7050: 6d 70 6f 72 61 72 79 50 61 74 68 5d 0d 0a 20 20  mporaryPath]..  
7060: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
7070: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 54 65 73  .    proc getTes
7080: 74 4f 76 65 72 72 69 64 65 73 50 72 65 61 6d 62  tOverridesPreamb
7090: 6c 65 20 7b 20 7b 65 78 74 72 61 56 61 72 4e 61  le { {extraVarNa
70a0: 6d 65 73 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20  mes ""} } {..   
70b0: 20 20 20 73 65 74 20 76 61 72 4e 61 6d 65 73 20     set varNames 
70c0: 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20  [list]....      
70d0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
70e0: 20 49 66 20 61 76 61 69 6c 61 62 6c 65 2c 20 73   If available, s
70f0: 74 61 72 74 20 77 69 74 68 20 74 68 65 20 6d 61  tart with the ma
7100: 73 74 65 72 20 6c 69 73 74 20 6f 66 20 74 65 73  ster list of tes
7110: 74 20 6f 76 65 72 72 69 64 65 0d 0a 20 20 20 20  t override..    
7120: 20 20 23 20 20 20 20 20 20 20 76 61 72 69 61 62    #       variab
7130: 6c 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  les...      #.. 
7140: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
7150: 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 6f 76 65  xists ::test_ove
7160: 72 72 69 64 65 73 5d 20 26 26 20 5c 0d 0a 20 20  rrides] && \..  
7170: 20 20 20 20 20 20 20 20 5b 6c 6c 65 6e 67 74 68          [llength
7180: 20 24 3a 3a 74 65 73 74 5f 6f 76 65 72 72 69 64   $::test_overrid
7190: 65 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  es] > 0} then {.
71a0: 0a 20 20 20 20 20 20 20 20 65 76 61 6c 20 6c 61  .        eval la
71b0: 70 70 65 6e 64 20 76 61 72 4e 61 6d 65 73 20 24  ppend varNames $
71c0: 3a 3a 74 65 73 74 5f 6f 76 65 72 72 69 64 65 73  ::test_overrides
71d0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
71e0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
71f0: 54 45 3a 20 49 66 20 72 65 71 75 65 73 74 65 64  TE: If requested
7200: 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2c 20   by our caller, 
7210: 61 64 64 20 61 6e 79 20 61 64 64 69 74 69 6f 6e  add any addition
7220: 61 6c 20 76 61 72 69 61 62 6c 65 0d 0a 20 20 20  al variable..   
7230: 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d 65 73     #       names
7240: 20 74 6f 20 63 6f 70 79 20 6e 6f 77 2e 0d 0a 20   to copy now... 
7250: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
7260: 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 65 78 74 72   {[llength $extr
7270: 61 56 61 72 4e 61 6d 65 73 5d 20 3e 20 30 7d 20  aVarNames] > 0} 
7280: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
7290: 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 76 61 72  eval lappend var
72a0: 4e 61 6d 65 73 20 24 65 78 74 72 61 56 61 72 4e  Names $extraVarN
72b0: 61 6d 65 73 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  ames..      }...
72c0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
72d0: 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68  # NOTE: Build th
72e0: 65 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e  e script fragmen
72f0: 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  t to be returned
7300: 20 62 79 20 70 72 6f 63 65 73 73 69 6e 67 20 65   by processing e
7310: 61 63 68 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ach..      #    
7320: 20 20 20 76 61 72 69 61 62 6c 65 20 6e 61 6d 65     variable name
7330: 20 61 6e 64 20 61 64 64 69 6e 67 20 74 68 65 20   and adding the 
7340: 6e 65 63 65 63 65 73 73 61 72 79 20 73 63 72 69  nececessary scri
7350: 70 74 20 66 72 61 67 6d 65 6e 74 73 20 66 6f 72  pt fragments for
7360: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
7370: 65 61 63 68 20 6f 6e 65 2e 0d 0a 20 20 20 20 20  each one...     
7380: 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 72 65   #..      set re
7390: 73 75 6c 74 20 22 22 0d 0a 0d 0a 20 20 20 20 20  sult ""....     
73a0: 20 66 6f 72 65 61 63 68 20 76 61 72 4e 61 6d 65   foreach varName
73b0: 20 24 76 61 72 4e 61 6d 65 73 20 7b 0d 0a 20 20   $varNames {..  
73c0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
73d0: 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74   # NOTE: Build t
73e0: 68 65 20 71 75 61 6c 69 66 69 65 64 20 67 6c 6f  he qualified glo
73f0: 62 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 61 6d  bal variable nam
7400: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
7410: 20 20 20 20 20 20 20 73 65 74 20 66 75 6c 6c 56         set fullV
7420: 61 72 4e 61 6d 65 20 5b 61 70 70 65 6e 64 41 72  arName [appendAr
7430: 67 73 20 3a 3a 20 24 76 61 72 4e 61 6d 65 5d 0d  gs :: $varName].
7440: 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
7450: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f        # NOTE: Do
7460: 65 73 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  es the variable 
7470: 65 78 69 73 74 20 69 6e 20 74 68 69 73 20 69 6e  exist in this in
7480: 74 65 72 70 72 65 74 65 72 20 63 6f 6e 74 65 78  terpreter contex
7490: 74 3f 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t?..        #.. 
74a0: 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f         if {[info
74b0: 20 65 78 69 73 74 73 20 24 66 75 6c 6c 56 61 72   exists $fullVar
74c0: 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
74d0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
74e0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 70        # NOTE: Ap
74f0: 70 65 6e 64 20 61 20 73 63 72 69 70 74 20 66 72  pend a script fr
7500: 61 67 6d 65 6e 74 20 74 6f 20 74 68 65 20 72 65  agment to the re
7510: 73 75 6c 74 20 74 68 61 74 20 77 69 6c 6c 20 63  sult that will c
7520: 6f 72 72 65 63 74 6c 79 0d 0a 20 20 20 20 20 20  orrectly..      
7530: 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 70 79      #       copy
7540: 20 61 6e 79 20 63 6f 6e 74 61 69 6e 65 64 20 76   any contained v
7550: 61 6c 75 65 20 74 6f 20 61 6e 6f 74 68 65 72 20  alue to another 
7560: 69 6e 74 65 72 70 72 65 74 65 72 20 63 6f 6e 74  interpreter cont
7570: 65 78 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ext...          
7580: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 61 70 70  #..          app
7590: 65 6e 64 20 72 65 73 75 6c 74 20 5c 6e 20 22 73  end result \n "s
75a0: 65 74 20 22 20 24 66 75 6c 6c 56 61 72 4e 61 6d  et " $fullVarNam
75b0: 65 20 22 20 5c 7b 22 20 5b 73 65 74 20 24 66 75  e " \{" [set $fu
75c0: 6c 6c 56 61 72 4e 61 6d 65 5d 20 5c 7d 0d 0a 20  llVarName] \}.. 
75d0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
75e0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
75f0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74      # NOTE: If t
7600: 68 65 20 72 65 73 75 6c 74 20 63 6f 6e 74 61 69  he result contai
7610: 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  ns one or more s
7620: 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 73 2c  cript fragments,
7630: 20 61 70 70 65 6e 64 20 61 0d 0a 20 20 20 20 20   append a..     
7640: 20 23 20 20 20 20 20 20 20 6e 65 77 6c 69 6e 65   #       newline
7650: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
7660: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
7670: 6e 67 74 68 20 24 72 65 73 75 6c 74 5d 20 3e 20  ngth $result] > 
7680: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
7690: 20 20 20 61 70 70 65 6e 64 20 72 65 73 75 6c 74     append result
76a0: 20 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a   \n..      }....
76b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65        return $re
76c0: 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  sult..    }.....
76d0: 20 20 20 20 70 72 6f 63 20 67 65 74 41 70 70 44      proc getAppD
76e0: 6f 6d 61 69 6e 50 72 65 61 6d 62 6c 65 20 7b 20  omainPreamble { 
76f0: 7b 70 72 65 66 69 78 20 22 22 7d 20 7b 73 75 66  {prefix ""} {suf
7700: 66 69 78 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20  fix ""} } {..   
7710: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
7720: 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75  TE: This procedu
7730: 72 65 20 72 65 74 75 72 6e 73 20 61 20 74 65 73  re returns a tes
7740: 74 20 73 65 74 75 70 20 73 63 72 69 70 74 20 66  t setup script f
7750: 72 61 67 6d 65 6e 74 20 73 75 69 74 61 62 6c 65  ragment suitable
7760: 20 66 6f 72 0d 0a 20 20 20 20 20 20 23 20 20 20   for..      #   
7770: 20 20 20 20 65 76 61 6c 75 61 74 69 6f 6e 20 62      evaluation b
7780: 79 20 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72  y an interpreter
7790: 20 63 72 65 61 74 65 64 20 69 6e 20 61 6e 20 69   created in an i
77a0: 73 6f 6c 61 74 65 64 20 61 70 70 6c 69 63 61 74  solated applicat
77b0: 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ion..      #    
77c0: 20 20 20 64 6f 6d 61 69 6e 2e 20 20 54 68 65 20     domain.  The 
77d0: 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20  script fragment 
77e0: 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64 20 77  being returned w
77f0: 69 6c 6c 20 62 65 20 73 75 72 72 6f 75 6e 64 65  ill be surrounde
7800: 64 20 62 79 0d 0a 20 20 20 20 20 20 23 20 20 20  d by..      #   
7810: 20 20 20 20 74 68 65 20 70 72 65 66 69 78 20 61      the prefix a
7820: 6e 64 20 73 75 66 66 69 78 20 22 73 63 72 69 70  nd suffix "scrip
7830: 74 20 66 72 61 67 6d 65 6e 74 73 22 20 73 70 65  t fragments" spe
7840: 63 69 66 69 65 64 20 62 79 20 6f 75 72 20 63 61  cified by our ca
7850: 6c 6c 65 72 2c 0d 0a 20 20 20 20 20 20 23 20 20  ller,..      #  
7860: 20 20 20 20 20 69 66 20 61 6e 79 2e 20 20 54 68       if any.  Th
7870: 65 20 65 6e 74 69 72 65 20 73 63 72 69 70 74 20  e entire script 
7880: 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64 20 77  being returned w
7890: 69 6c 6c 20 62 65 20 73 75 62 73 74 69 74 75 74  ill be substitut
78a0: 65 64 20 76 69 61 0d 0a 20 20 20 20 20 20 23 20  ed via..      # 
78b0: 20 20 20 20 20 20 5b 73 75 62 73 74 5d 2c 20 69        [subst], i
78c0: 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66  n the context of
78d0: 20 6f 75 72 20 63 61 6c 6c 65 72 2c 20 62 65 66   our caller, bef
78e0: 6f 72 65 20 62 65 69 6e 67 20 72 65 74 75 72 6e  ore being return
78f0: 65 64 2e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ed...      #    
7900: 20 20 20 54 68 69 73 20 73 74 65 70 20 69 73 20     This step is 
7910: 6e 65 63 65 73 73 61 72 79 20 73 6f 20 74 68 61  necessary so tha
7920: 74 20 73 6f 6d 65 20 6c 69 6d 69 74 65 64 20 63  t some limited c
7930: 6f 6e 74 65 78 74 20 69 6e 66 6f 72 6d 61 74 69  ontext informati
7940: 6f 6e 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20  on,..      #    
7950: 20 20 20 70 72 69 6d 61 72 69 6c 79 20 72 65 6c     primarily rel
7960: 61 74 65 64 20 74 6f 20 74 68 65 20 74 65 73 74  ated to the test
7970: 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65 73 2c  ing directories,
7980: 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66 65 72   can be transfer
7990: 72 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20  red..      #    
79a0: 20 20 20 74 6f 20 74 68 65 20 69 6e 74 65 72 70     to the interp
79b0: 72 65 74 65 72 20 69 6e 20 74 68 65 20 69 73 6f  reter in the iso
79c0: 6c 61 74 65 64 20 61 70 70 6c 69 63 61 74 69 6f  lated applicatio
79d0: 6e 20 64 6f 6d 61 69 6e 2c 20 6d 61 6b 69 6e 67  n domain, making
79e0: 20 69 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20   it..      #    
79f0: 20 20 20 61 62 6c 65 20 74 6f 20 73 75 63 63 65     able to succe
7a00: 73 73 66 75 6c 6c 79 20 72 75 6e 20 74 65 73 74  ssfully run test
7a10: 73 20 74 68 61 74 20 72 65 71 75 69 72 65 20 6f  s that require o
7a20: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
7a30: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
7a40: 20 66 69 6c 65 73 20 69 6e 20 6f 6e 65 20 6f 66   files in one of
7a50: 20 74 68 65 20 74 65 73 74 69 6e 67 20 64 69 72   the testing dir
7a60: 65 63 74 6f 72 69 65 73 2e 20 20 43 61 6c 6c 65  ectories.  Calle
7a70: 72 73 20 73 68 6f 75 6c 64 20 6b 65 65 70 20 69  rs should keep i
7a80: 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  n..      #      
7a90: 20 6d 69 6e 64 20 74 68 61 74 20 74 68 65 20 74   mind that the t
7aa0: 65 73 74 20 73 63 72 69 70 74 20 66 72 61 67 6d  est script fragm
7ab0: 65 6e 74 20 62 65 69 6e 67 20 72 65 74 75 72 6e  ent being return
7ac0: 65 64 20 63 61 6e 6e 6f 74 20 72 65 6c 79 20 6f  ed cannot rely o
7ad0: 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  n..      #      
7ae0: 20 61 6e 79 20 73 63 72 69 70 74 20 6c 69 62 72   any script libr
7af0: 61 72 79 20 70 72 6f 63 65 64 75 72 65 73 20 74  ary procedures t
7b00: 68 61 74 20 61 72 65 20 6e 6f 74 20 70 72 6f 76  hat are not prov
7b10: 69 64 65 64 20 62 79 20 74 68 65 20 45 61 67 6c  ided by the Eagl
7b20: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
7b30: 20 6c 69 62 72 61 72 79 20 70 61 63 6b 61 67 65   library package
7b40: 20 28 69 2e 65 2e 20 22 69 6e 69 74 2e 65 61 67   (i.e. "init.eag
7b50: 6c 65 22 29 2c 20 69 6e 63 6c 75 64 69 6e 67 20  le"), including 
7b60: 74 68 6f 73 65 20 70 72 6f 76 69 64 65 64 20 62  those provided b
7b70: 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
7b80: 20 74 68 65 20 45 61 67 6c 65 20 74 65 73 74 20   the Eagle test 
7b90: 70 61 63 6b 61 67 65 2c 20 75 6e 6c 65 73 73 20  package, unless 
7ba0: 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  the file contain
7bb0: 69 6e 67 20 74 68 65 6d 20 69 73 20 6c 6f 61 64  ing them is load
7bc0: 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ed..      #     
7bd0: 20 20 6d 61 6e 75 61 6c 6c 79 20 76 69 61 20 73    manually via s
7be0: 6f 6d 65 20 6f 74 68 65 72 20 6d 65 63 68 61 6e  ome other mechan
7bf0: 69 73 6d 20 28 65 2e 67 2e 20 62 79 20 69 6e 63  ism (e.g. by inc
7c00: 6c 75 64 69 6e 67 20 61 70 70 72 6f 70 72 69 61  luding appropria
7c10: 74 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  te..      #     
7c20: 20 20 5b 70 61 63 6b 61 67 65 20 72 65 71 75 69    [package requi
7c30: 72 65 5d 20 6f 72 20 5b 73 6f 75 72 63 65 5d 20  re] or [source] 
7c40: 63 6f 6d 6d 61 6e 64 73 20 69 6e 20 74 68 65 20  commands in the 
7c50: 70 72 65 66 69 78 20 6f 72 20 73 75 66 66 69 78  prefix or suffix
7c60: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
7c70: 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 73  script fragments
7c80: 29 2e 20 20 41 6c 73 6f 2c 20 61 6c 6c 20 76 61  ).  Also, all va
7c90: 72 69 61 62 6c 65 20 72 65 66 65 72 65 6e 63 65  riable reference
7ca0: 73 20 61 6e 64 20 61 6c 6c 20 6e 65 73 74 65 64  s and all nested
7cb0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
7cc0: 63 6f 6d 6d 61 6e 64 73 20 28 69 2e 65 2e 20 74  commands (i.e. t
7cd0: 68 6f 73 65 20 69 6e 20 73 71 75 61 72 65 20 62  hose in square b
7ce0: 72 61 63 6b 65 74 73 29 20 63 6f 6e 74 61 69 6e  rackets) contain
7cf0: 65 64 20 69 6e 20 74 68 65 20 66 69 6e 61 6c 0d  ed in the final.
7d00: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
7d10: 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20 77  cript fragment w
7d20: 69 6c 6c 20 65 6e 64 20 75 70 20 62 65 69 6e 67  ill end up being
7d30: 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20 74 68   evaluated in th
7d40: 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 74 68 65  e context of the
7d50: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
7d60: 63 61 6c 6c 69 6e 67 20 69 6e 74 65 72 70 72 65  calling interpre
7d70: 74 65 72 20 61 6e 64 20 6e 6f 74 20 74 68 65 20  ter and not the 
7d80: 74 61 72 67 65 74 20 69 6e 74 65 72 70 72 65 74  target interpret
7d90: 65 72 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  er created in th
7da0: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
7db0: 20 69 73 6f 6c 61 74 65 64 20 61 70 70 6c 69 63   isolated applic
7dc0: 61 74 69 6f 6e 20 64 6f 6d 61 69 6e 20 75 6e 6c  ation domain unl
7dd0: 65 73 73 20 74 68 65 20 64 6f 6c 6c 61 72 20 73  ess the dollar s
7de0: 69 67 6e 73 20 61 6e 64 2f 6f 72 20 73 71 75 61  igns and/or squa
7df0: 72 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  re..      #     
7e00: 20 20 62 72 61 63 6b 65 74 73 20 61 72 65 20 73    brackets are s
7e10: 70 65 63 69 61 6c 6c 79 20 71 75 6f 74 65 64 20  pecially quoted 
7e20: 77 69 74 68 20 62 61 63 6b 73 6c 61 73 68 65 73  with backslashes
7e30: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
7e40: 20 20 72 65 74 75 72 6e 20 5b 75 70 6c 65 76 65    return [upleve
7e50: 6c 20 31 20 5b 6c 69 73 74 20 73 75 62 73 74 20  l 1 [list subst 
7e60: 5b 61 70 70 65 6e 64 41 72 67 73 20 24 70 72 65  [appendArgs $pre
7e70: 66 69 78 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  fix {..        i
7e80: 66 20 7b 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70  f {[hasRuntimeOp
7e90: 74 69 6f 6e 20 6e 61 74 69 76 65 5d 7d 20 74 68  tion native]} th
7ea0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
7eb0: 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49 6e  object invoke In
7ec0: 74 65 72 70 72 65 74 65 72 2e 47 65 74 41 63 74  terpreter.GetAct
7ed0: 69 76 65 20 41 64 64 52 75 6e 74 69 6d 65 4f 70  ive AddRuntimeOp
7ee0: 74 69 6f 6e 20 6e 61 74 69 76 65 0d 0a 20 20 20  tion native..   
7ef0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20       }..      } 
7f00: 5b 67 65 74 54 65 73 74 4f 76 65 72 72 69 64 65  [getTestOverride
7f10: 73 50 72 65 61 6d 62 6c 65 20 5b 6c 69 73 74 20  sPreamble [list 
7f20: 70 61 74 68 20 74 65 73 74 5f 63 68 61 6e 6e 65  path test_channe
7f30: 6c 5d 5d 20 24 73 75 66 66 69 78 5d 5d 5d 0d 0a  l]] $suffix]]]..
7f40: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
7f50: 6f 63 20 74 72 79 43 6f 70 79 45 78 74 65 72 6e  oc tryCopyExtern
7f60: 61 6c 46 69 6c 65 20 7b 0d 0a 20 20 20 20 20 20  alFile {..      
7f70: 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65 20 7b        fileName {
7f80: 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 6e 65  platform ""} {ne
7f90: 77 46 69 6c 65 4e 61 6d 65 20 22 22 7d 20 7b 76  wFileName ""} {v
7fa0: 65 72 62 6f 73 65 20 66 61 6c 73 65 7d 20 7d 20  erbose false} } 
7fb0: 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 73 6f 75  {..      set sou
7fc0: 72 63 65 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74  rceFileName [get
7fd0: 45 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65  ExternalFileName
7fe0: 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20   $fileName].... 
7ff0: 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20       if {![file 
8000: 65 78 69 73 74 73 20 24 73 6f 75 72 63 65 46 69  exists $sourceFi
8010: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
8020: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65  .        if {$ve
8030: 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20  rbose} then {.. 
8040: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
8050: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
8060: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
8070: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
8080: 2d 20 73 6b 69 70 70 65 64 20 63 6f 70 79 69 6e  - skipped copyin
8090: 67 20 65 78 74 65 72 6e 61 6c 20 66 69 6c 65 20  g external file 
80a0: 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e  \"" $sourceFileN
80b0: 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
80c0: 20 20 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65       "\", it doe
80d0: 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d  s not exist\n"].
80e0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
80f0: 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20      return..    
8100: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
8110: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
8120: 24 6e 65 77 46 69 6c 65 4e 61 6d 65 5d 20 3e 20  $newFileName] > 
8130: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
8140: 20 20 20 73 65 74 20 74 61 72 67 65 74 46 69 6c     set targetFil
8150: 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79  eName [getBinary
8160: 46 69 6c 65 4e 61 6d 65 20 24 6e 65 77 46 69 6c  FileName $newFil
8170: 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d  eName $platform]
8180: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
8190: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 61  ..        set ta
81a0: 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65  rgetFileName [ge
81b0: 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
81c0: 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66  $fileName $platf
81d0: 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  orm]..      }...
81e0: 0a 20 20 20 20 20 20 73 65 74 20 74 61 72 67 65  .      set targe
81f0: 74 44 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65  tDirectory [file
8200: 20 64 69 72 6e 61 6d 65 20 24 74 61 72 67 65 74   dirname $target
8210: 46 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20  FileName]....   
8220: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
8230: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 66  .        if {![f
8240: 69 6c 65 20 65 78 69 73 74 73 20 24 74 61 72 67  ile exists $targ
8250: 65 74 44 69 72 65 63 74 6f 72 79 5d 7d 20 74 68  etDirectory]} th
8260: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
8270: 66 69 6c 65 20 6d 6b 64 69 72 20 24 74 61 72 67  file mkdir $targ
8280: 65 74 44 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  etDirectory..   
8290: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
82a0: 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63 65  file copy -force
82b0: 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65   $sourceFileName
82c0: 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65   $targetFileName
82d0: 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d  ..      }] == 0}
82e0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
82f0: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
8300: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
8310: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
8320: 20 20 22 2d 2d 2d 2d 20 63 6f 70 69 65 64 20 65    "---- copied e
8330: 78 74 65 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f  xternal file fro
8340: 6d 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c  m \"" $sourceFil
8350: 65 4e 61 6d 65 20 22 5c 22 20 74 6f 20 5c 22 22  eName "\" to \""
8360: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
8370: 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20  $targetFileName 
8380: 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65  \"\n]..      } e
8390: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
83a0: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
83b0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
83c0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
83d0: 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20  "---- failed to 
83e0: 63 6f 70 79 20 65 78 74 65 72 6e 61 6c 20 66 69  copy external fi
83f0: 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75  le from \"" $sou
8400: 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  rceFileName \.. 
8410: 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 74             "\" t
8420: 6f 20 5c 22 22 20 24 74 61 72 67 65 74 46 69 6c  o \"" $targetFil
8430: 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  eName \"\n]..   
8440: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
8450: 20 20 20 20 70 72 6f 63 20 74 72 79 43 6f 70 79      proc tryCopy
8460: 42 69 6e 61 72 79 46 69 6c 65 20 7b 0d 0a 20 20  BinaryFile {..  
8470: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61            fileNa
8480: 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d  me {platform ""}
8490: 20 7b 6e 65 77 46 69 6c 65 4e 61 6d 65 20 22 22   {newFileName ""
84a0: 7d 20 7b 76 65 72 62 6f 73 65 20 66 61 6c 73 65  } {verbose false
84b0: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  } } {..      set
84c0: 20 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20   sourceFileName 
84d0: 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61  [getBinaryFileNa
84e0: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c  me $fileName $pl
84f0: 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20  atform]....     
8500: 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73   if {![file exis
8510: 74 73 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61  ts $sourceFileNa
8520: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
8530: 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73       if {$verbos
8540: 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
8550: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
8560: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
8570: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
8580: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b          "---- sk
8590: 69 70 70 65 64 20 63 6f 70 79 69 6e 67 20 62 69  ipped copying bi
85a0: 6e 61 72 79 20 66 69 6c 65 20 5c 22 22 20 24 73  nary file \"" $s
85b0: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d  ourceFileName \.
85c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
85d0: 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  \", it does not 
85e0: 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20  exist\n"]..     
85f0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 72 65     }..        re
8600: 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  turn..      }...
8610: 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
8620: 6e 67 20 6c 65 6e 67 74 68 20 24 6e 65 77 46 69  ng length $newFi
8630: 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65  leName] > 0} the
8640: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  n {..        set
8650: 20 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20   targetFileName 
8660: 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d  [getBuildFileNam
8670: 65 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65 20 24  e $newFileName $
8680: 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20  platform]..     
8690: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
86a0: 20 20 20 73 65 74 20 74 61 72 67 65 74 46 69 6c     set targetFil
86b0: 65 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c 64 46  eName [getBuildF
86c0: 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d  ileName $fileNam
86d0: 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20  e $platform]..  
86e0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73      }....      s
86f0: 65 74 20 74 61 72 67 65 74 44 69 72 65 63 74 6f  et targetDirecto
8700: 72 79 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65  ry [file dirname
8710: 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65   $targetFileName
8720: 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  ]....      if {[
8730: 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
8740: 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73   if {![file exis
8750: 74 73 20 24 74 61 72 67 65 74 44 69 72 65 63 74  ts $targetDirect
8760: 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ory]} then {..  
8770: 20 20 20 20 20 20 20 20 66 69 6c 65 20 6d 6b 64          file mkd
8780: 69 72 20 24 74 61 72 67 65 74 44 69 72 65 63 74  ir $targetDirect
8790: 6f 72 79 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ory..        }..
87a0: 20 20 20 20 20 20 20 20 66 69 6c 65 20 63 6f 70          file cop
87b0: 79 20 2d 66 6f 72 63 65 20 24 73 6f 75 72 63 65  y -force $source
87c0: 46 69 6c 65 4e 61 6d 65 20 24 74 61 72 67 65 74  FileName $target
87d0: 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20  FileName..      
87e0: 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  }] == 0} then {.
87f0: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
8800: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
8810: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
8820: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
8830: 63 6f 70 69 65 64 20 62 69 6e 61 72 79 20 66 69  copied binary fi
8840: 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75  le from \"" $sou
8850: 72 63 65 46 69 6c 65 4e 61 6d 65 20 22 5c 22 20  rceFileName "\" 
8860: 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  to \"" \..      
8870: 20 20 20 20 20 20 24 74 61 72 67 65 74 46 69 6c        $targetFil
8880: 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  eName \"\n]..   
8890: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
88a0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
88b0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
88c0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
88d0: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c        "---- fail
88e0: 65 64 20 74 6f 20 63 6f 70 79 20 62 69 6e 61 72  ed to copy binar
88f0: 79 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20  y file from \"" 
8900: 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20  $sourceFileName 
8910: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
8920: 5c 22 20 74 6f 20 5c 22 22 20 24 74 61 72 67 65  \" to \"" $targe
8930: 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d  tFileName \"\n].
8940: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
8950: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79  ....    proc try
8960: 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20 7b 0d  CopyBuildFile {.
8970: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c  .            fil
8980: 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20  eName {platform 
8990: 22 22 7d 20 7b 6e 65 77 46 69 6c 65 4e 61 6d 65  ""} {newFileName
89a0: 20 22 22 7d 20 7b 76 65 72 62 6f 73 65 20 66 61   ""} {verbose fa
89b0: 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  lse} } {..      
89c0: 73 65 74 20 73 6f 75 72 63 65 46 69 6c 65 4e 61  set sourceFileNa
89d0: 6d 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65  me [getBuildFile
89e0: 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24  Name $fileName $
89f0: 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20  platform]....   
8a00: 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78     if {![file ex
8a10: 69 73 74 73 20 24 73 6f 75 72 63 65 46 69 6c 65  ists $sourceFile
8a20: 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
8a30: 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62         if {$verb
8a40: 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ose} then {..   
8a50: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
8a60: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
8a70: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
8a80: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
8a90: 73 6b 69 70 70 65 64 20 63 6f 70 79 69 6e 67 20  skipped copying 
8aa0: 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22 20 24  build file \"" $
8ab0: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c  sourceFileName \
8ac0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
8ad0: 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74  "\", it does not
8ae0: 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20   exist\n"]..    
8af0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 72      }..        r
8b00: 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a  eturn..      }..
8b10: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
8b20: 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e 65 77 46  ing length $newF
8b30: 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68  ileName] > 0} th
8b40: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  en {..        se
8b50: 74 20 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65  t targetFileName
8b60: 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
8b70: 61 6d 65 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65  ame $newFileName
8b80: 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20   $platform]..   
8b90: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
8ba0: 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74 46       set targetF
8bb0: 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61  ileName [getBina
8bc0: 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  ryFileName $file
8bd0: 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d  Name $platform].
8be0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
8bf0: 20 20 73 65 74 20 74 61 72 67 65 74 44 69 72 65    set targetDire
8c00: 63 74 6f 72 79 20 5b 66 69 6c 65 20 64 69 72 6e  ctory [file dirn
8c10: 61 6d 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e  ame $targetFileN
8c20: 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  ame]....      if
8c30: 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
8c40: 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65      if {![file e
8c50: 78 69 73 74 73 20 24 74 61 72 67 65 74 44 69 72  xists $targetDir
8c60: 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d  ectory]} then {.
8c70: 0a 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20  .          file 
8c80: 6d 6b 64 69 72 20 24 74 61 72 67 65 74 44 69 72  mkdir $targetDir
8c90: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 20 20  ectory..        
8ca0: 7d 0d 0a 20 20 20 20 20 20 20 20 66 69 6c 65 20  }..        file 
8cb0: 63 6f 70 79 20 2d 66 6f 72 63 65 20 24 73 6f 75  copy -force $sou
8cc0: 72 63 65 46 69 6c 65 4e 61 6d 65 20 24 74 61 72  rceFileName $tar
8cd0: 67 65 74 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  getFileName..   
8ce0: 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e     }] == 0} then
8cf0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
8d00: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
8d10: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
8d20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
8d30: 2d 2d 20 63 6f 70 69 65 64 20 62 75 69 6c 64 20  -- copied build 
8d40: 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73  file from \"" $s
8d50: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 22 5c  ourceFileName "\
8d60: 22 20 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20  " to \"" \..    
8d70: 20 20 20 20 20 20 20 20 24 74 61 72 67 65 74 46          $targetF
8d80: 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20  ileName \"\n].. 
8d90: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
8da0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
8db0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
8dc0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
8dd0: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61          "---- fa
8de0: 69 6c 65 64 20 74 6f 20 63 6f 70 79 20 62 75 69  iled to copy bui
8df0: 6c 64 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22  ld file from \""
8e00: 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65   $sourceFileName
8e10: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
8e20: 22 5c 22 20 74 6f 20 5c 22 22 20 24 74 61 72 67  "\" to \"" $targ
8e30: 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d  etFileName \"\n]
8e40: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
8e50: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72  .....    proc tr
8e60: 79 44 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c  yDeleteBinaryFil
8e70: 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c  e { fileName {pl
8e80: 61 74 66 6f 72 6d 20 22 22 7d 20 7b 76 65 72 62  atform ""} {verb
8e90: 6f 73 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  ose false} } {..
8ea0: 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61        set fileNa
8eb0: 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c  me [getBinaryFil
8ec0: 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20  eName $fileName 
8ed0: 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20  $platform]....  
8ee0: 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65      if {![file e
8ef0: 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d  xists $fileName]
8f00: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
8f10: 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20    if {$verbose} 
8f20: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
8f30: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
8f40: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
8f50: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
8f60: 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70       "---- skipp
8f70: 65 64 20 64 65 6c 65 74 69 6e 67 20 62 69 6e 61  ed deleting bina
8f80: 72 79 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c  ry file \"" $fil
8f90: 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  eName \..       
8fa0: 20 20 20 20 20 20 20 22 5c 22 2c 20 69 74 20 64         "\", it d
8fb0: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22  oes not exist\n"
8fc0: 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
8fd0: 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20        return..  
8fe0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69      }....      i
8ff0: 66 20 7b 5b 63 61 74 63 68 20 7b 66 69 6c 65 20  f {[catch {file 
9000: 64 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65  delete $fileName
9010: 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  }] == 0} then {.
9020: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
9030: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
9040: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
9050: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
9060: 64 65 6c 65 74 65 64 20 62 69 6e 61 72 79 20 66  deleted binary f
9070: 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d  ile \"" $fileNam
9080: 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d  e \"\n]..      }
9090: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
90a0: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
90b0: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
90c0: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
90d0: 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74    "---- failed t
90e0: 6f 20 64 65 6c 65 74 65 20 62 69 6e 61 72 79 20  o delete binary 
90f0: 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61  file \"" $fileNa
9100: 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  me \"\n]..      
9110: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
9120: 20 70 72 6f 63 20 74 72 79 44 65 6c 65 74 65 42   proc tryDeleteB
9130: 75 69 6c 64 46 69 6c 65 20 7b 20 66 69 6c 65 4e  uildFile { fileN
9140: 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22  ame {platform ""
9150: 7d 20 7b 76 65 72 62 6f 73 65 20 66 61 6c 73 65  } {verbose false
9160: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  } } {..      set
9170: 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 75   fileName [getBu
9180: 69 6c 64 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c  ildFileName $fil
9190: 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d  eName $platform]
91a0: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b  ....      if {![
91b0: 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c  file exists $fil
91c0: 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
91d0: 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72          if {$ver
91e0: 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  bose} then {..  
91f0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
9200: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
9210: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
9220: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
9230: 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e   skipped deletin
9240: 67 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22  g build file \""
9250: 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20   $fileName \..  
9260: 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c              "\",
9270: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
9280: 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  st\n"]..        
9290: 7d 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  }..        retur
92a0: 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  n..      }....  
92b0: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
92c0: 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66 69 6c  file delete $fil
92d0: 65 4e 61 6d 65 7d 5d 20 3d 3d 20 30 7d 20 74 68  eName}] == 0} th
92e0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  en {..        tp
92f0: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
9300: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
9310: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
9320: 2d 2d 2d 2d 20 64 65 6c 65 74 65 64 20 62 75 69  ---- deleted bui
9330: 6c 64 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c  ld file \"" $fil
9340: 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  eName \"\n]..   
9350: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
9360: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
9370: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
9380: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
9390: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c        "---- fail
93a0: 65 64 20 74 6f 20 64 65 6c 65 74 65 20 62 75 69  ed to delete bui
93b0: 6c 64 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c  ld file \"" $fil
93c0: 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  eName \"\n]..   
93d0: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
93e0: 20 20 20 20 70 72 6f 63 20 74 72 79 43 6f 70 79      proc tryCopy
93f0: 41 73 73 65 6d 62 6c 79 20 7b 0d 0a 20 20 20 20  Assembly {..    
9400: 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65          fileName
9410: 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b   {platform ""} {
9420: 70 64 62 20 74 72 75 65 7d 20 7b 76 65 72 62 6f  pdb true} {verbo
9430: 73 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  se false} } {.. 
9440: 20 20 20 20 20 74 72 79 43 6f 70 79 42 75 69 6c       tryCopyBuil
9450: 64 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 20  dFile $fileName 
9460: 24 70 6c 61 74 66 6f 72 6d 20 22 22 20 24 76 65  $platform "" $ve
9470: 72 62 6f 73 65 0d 0a 0d 0a 20 20 20 20 20 20 69  rbose....      i
9480: 66 20 7b 24 70 64 62 7d 20 74 68 65 6e 20 7b 0d  f {$pdb} then {.
9490: 0a 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79  .        tryCopy
94a0: 42 75 69 6c 64 46 69 6c 65 20 5b 61 70 70 65 6e  BuildFile [appen
94b0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
94c0: 20 20 20 20 20 5b 66 69 6c 65 20 72 6f 6f 74 6e       [file rootn
94d0: 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 20 2e  ame $fileName] .
94e0: 70 64 62 5d 20 24 70 6c 61 74 66 6f 72 6d 20 22  pdb] $platform "
94f0: 22 20 24 76 65 72 62 6f 73 65 0d 0a 20 20 20 20  " $verbose..    
9500: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
9510: 20 20 20 70 72 6f 63 20 74 72 79 44 65 6c 65 74     proc tryDelet
9520: 65 41 73 73 65 6d 62 6c 79 20 7b 0d 0a 20 20 20  eAssembly {..   
9530: 20 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d           fileNam
9540: 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20  e {platform ""} 
9550: 7b 70 64 62 20 74 72 75 65 7d 20 7b 76 65 72 62  {pdb true} {verb
9560: 6f 73 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  ose false} } {..
9570: 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 42        tryDeleteB
9580: 69 6e 61 72 79 46 69 6c 65 20 24 66 69 6c 65 4e  inaryFile $fileN
9590: 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 20 24 76  ame $platform $v
95a0: 65 72 62 6f 73 65 0d 0a 0d 0a 20 20 20 20 20 20  erbose....      
95b0: 69 66 20 7b 24 70 64 62 7d 20 74 68 65 6e 20 7b  if {$pdb} then {
95c0: 0d 0a 20 20 20 20 20 20 20 20 74 72 79 44 65 6c  ..        tryDel
95d0: 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20 5b 61  eteBinaryFile [a
95e0: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
95f0: 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 72           [file r
9600: 6f 6f 74 6e 61 6d 65 20 24 66 69 6c 65 4e 61 6d  ootname $fileNam
9610: 65 5d 20 2e 70 64 62 5d 20 24 70 6c 61 74 66 6f  e] .pdb] $platfo
9620: 72 6d 20 24 76 65 72 62 6f 73 65 0d 0a 20 20 20  rm $verbose..   
9630: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
9640: 20 20 20 20 70 72 6f 63 20 74 72 79 4c 6f 61 64      proc tryLoad
9650: 41 73 73 65 6d 62 6c 79 20 7b 20 66 69 6c 65 4e  Assembly { fileN
9660: 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22  ame {platform ""
9670: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  } } {..      set
9680: 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69   fileName [getBi
9690: 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69  naryFileName $fi
96a0: 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d  leName $platform
96b0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  ]....      if {[
96c0: 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
96d0: 20 73 65 74 20 61 73 73 65 6d 62 6c 79 20 5b 6f   set assembly [o
96e0: 62 6a 65 63 74 20 6c 6f 61 64 20 2d 6c 6f 61 64  bject load -load
96f0: 74 79 70 65 20 46 69 6c 65 20 2d 61 6c 69 61 73  type File -alias
9700: 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20   $fileName]..   
9710: 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e     }] == 0} then
9720: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
9730: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e         # NOTE: N
9740: 6f 77 2c 20 61 64 64 20 74 68 65 20 6e 65 63 65  ow, add the nece
9750: 73 73 61 72 79 20 74 65 73 74 20 63 6f 6e 73 74  ssary test const
9760: 72 61 69 6e 74 2e 0d 0a 20 20 20 20 20 20 20 20  raint...        
9770: 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  #..        addCo
9780: 6e 73 74 72 61 69 6e 74 20 5b 66 69 6c 65 20 72  nstraint [file r
9790: 6f 6f 74 6e 61 6d 65 20 5b 66 69 6c 65 20 74 61  ootname [file ta
97a0: 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a  il $fileName]]..
97b0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
97c0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 47 72 61       # NOTE: Gra
97d0: 62 20 74 68 65 20 69 6d 61 67 65 20 72 75 6e 74  b the image runt
97e0: 69 6d 65 20 76 65 72 73 69 6f 6e 20 66 72 6f 6d  ime version from
97f0: 20 74 68 65 20 61 73 73 65 6d 62 6c 79 20 62 65   the assembly be
9800: 63 61 75 73 65 0d 0a 20 20 20 20 20 20 20 20 23  cause..        #
9810: 20 20 20 20 20 20 20 73 65 76 65 72 61 6c 20 74         several t
9820: 65 73 74 73 20 72 65 6c 79 20 6f 6e 20 69 74 20  ests rely on it 
9830: 68 61 76 69 6e 67 20 61 20 63 65 72 74 61 69 6e  having a certain
9840: 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20   value...       
9850: 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43   #..        addC
9860: 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
9870: 64 41 72 67 73 20 5b 66 69 6c 65 20 74 61 69 6c  dArgs [file tail
9880: 20 24 66 69 6c 65 4e 61 6d 65 5d 20 5f 20 5c 0d   $fileName] _ \.
9890: 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 24 61  .            [$a
98a0: 73 73 65 6d 62 6c 79 20 49 6d 61 67 65 52 75 6e  ssembly ImageRun
98b0: 74 69 6d 65 56 65 72 73 69 6f 6e 5d 5d 0d 0a 0d  timeVersion]]...
98c0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
98d0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75      # NOTE: Retu
98e0: 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  rn the full path
98f0: 20 6f 66 20 74 68 65 20 6c 6f 61 64 65 64 20 66   of the loaded f
9900: 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ile...        #.
9910: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
9920: 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  $fileName..     
9930: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
9940: 72 6e 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  rn ""..    }....
9950: 0a 20 20 20 20 70 72 6f 63 20 69 73 53 51 4c 69  .    proc isSQLi
9960: 74 65 52 65 61 64 79 20 7b 7d 20 7b 0d 0a 20 20  teReady {} {..  
9970: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
9980: 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64  OTE: This proced
9990: 75 72 65 20 6d 75 73 74 20 72 65 74 75 72 6e 20  ure must return 
99a0: 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 6c 79 20 69 66  non-zero only if
99b0: 20 74 68 65 20 53 51 4c 69 74 65 20 6e 61 74 69   the SQLite nati
99c0: 76 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ve..      #     
99d0: 20 20 6c 69 62 72 61 72 79 20 61 6e 64 20 74 68    library and th
99e0: 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  e System.Data.SQ
99f0: 4c 69 74 65 20 6d 61 6e 61 67 65 64 20 61 73 73  Lite managed ass
9a00: 65 6d 62 6c 79 20 61 72 65 20 6c 6f 61 64 65 64  embly are loaded
9a10: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
9a20: 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20 75 73  and ready for us
9a30: 65 20 62 79 20 74 68 65 20 74 65 73 74 20 73 75  e by the test su
9a40: 69 74 65 2e 20 20 43 75 72 72 65 6e 74 6c 79 2c  ite.  Currently,
9a50: 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0d   this procedure.
9a60: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
9a70: 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
9a80: 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20 5b  only after the [
9a90: 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 5d  tryLoadAssembly]
9aa0: 20 70 72 6f 63 65 64 75 72 65 20 68 61 73 0d 0a   procedure has..
9ab0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65        #       be
9ac0: 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f  en called to pro
9ad0: 62 65 20 66 6f 72 20 74 68 65 20 53 79 73 74 65  be for the Syste
9ae0: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 6d 61  m.Data.SQLite ma
9af0: 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 0d 0a  naged assembly..
9b00: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6e        #       an
9b10: 64 20 74 68 65 20 5b 63 68 65 63 6b 46 6f 72 53  d the [checkForS
9b20: 51 4c 69 74 65 5d 20 70 72 6f 63 65 64 75 72 65  QLite] procedure
9b30: 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64   has been called
9b40: 20 74 6f 20 70 72 6f 62 65 20 66 6f 72 0d 0a 20   to probe for.. 
9b50: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
9b60: 20 53 51 4c 69 74 65 20 6e 61 74 69 76 65 20 6c   SQLite native l
9b70: 69 62 72 61 72 79 3b 20 6f 74 68 65 72 77 69 73  ibrary; otherwis
9b80: 65 2c 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  e, this procedur
9b90: 65 20 77 69 6c 6c 20 73 69 6d 70 6c 79 0d 0a 20  e will simply.. 
9ba0: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6c 77       #       alw
9bb0: 61 79 73 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e  ays return zero.
9bc0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
9bd0: 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 0d   return [expr {.
9be0: 0a 20 20 20 20 20 20 20 20 5b 68 61 76 65 43 6f  .        [haveCo
9bf0: 6e 73 74 72 61 69 6e 74 20 53 79 73 74 65 6d 2e  nstraint System.
9c00: 44 61 74 61 2e 53 51 4c 69 74 65 5d 20 26 26 20  Data.SQLite] && 
9c10: 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
9c20: 53 51 4c 69 74 65 5d 0d 0a 20 20 20 20 20 20 7d  SQLite]..      }
9c30: 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  ]..    }.....   
9c40: 20 70 72 6f 63 20 6d 61 74 63 68 4d 61 63 68 69   proc matchMachi
9c50: 6e 65 20 7b 20 70 6c 61 74 66 6f 72 6d 20 7d 20  ne { platform } 
9c60: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
9c70: 20 20 23 20 4e 4f 54 45 3a 20 41 6e 20 65 6d 70    # NOTE: An emp
9c80: 74 79 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68  ty string for th
9c90: 65 20 70 6c 61 74 66 6f 72 6d 20 6d 65 61 6e 73  e platform means
9ca0: 20 74 68 61 74 20 74 68 65 20 62 75 69 6c 64 20   that the build 
9cb0: 69 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 23 20  is not..      # 
9cc0: 20 20 20 20 20 20 5b 70 72 69 6d 61 72 69 6c 79        [primarily
9cd0: 5d 20 61 20 6e 61 74 69 76 65 20 62 75 69 6c 64  ] a native build
9ce0: 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 69 74 20  ; therefore, it 
9cf0: 61 6c 77 61 79 73 20 6d 61 74 63 68 65 73 2e 0d  always matches..
9d00: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
9d10: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
9d20: 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3d 3d  th $platform] ==
9d30: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
9d40: 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d      return true.
9d50: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
9d60: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
9d70: 45 3a 20 44 6f 65 73 20 74 68 65 20 73 70 65 63  E: Does the spec
9d80: 69 66 69 65 64 20 70 6c 61 74 66 6f 72 6d 20 6d  ified platform m
9d90: 61 74 63 68 20 75 70 20 74 6f 20 74 68 65 20 63  atch up to the c
9da0: 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 3f 0d  urrent process?.
9db0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
9dc0: 69 66 20 7b 24 70 6c 61 74 66 6f 72 6d 20 65 71  if {$platform eq
9dd0: 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74 66   [machineToPlatf
9de0: 6f 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66  orm $::tcl_platf
9df0: 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 7d 20 74  orm(machine)]} t
9e00: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
9e10: 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20  eturn true..    
9e20: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
9e30: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
9e40: 65 20 73 70 65 63 69 66 69 65 64 20 70 6c 61 74  e specified plat
9e50: 66 6f 72 6d 20 64 6f 65 73 20 6e 6f 74 20 6d 61  form does not ma
9e60: 74 63 68 20 75 70 20 77 69 74 68 20 74 68 65 20  tch up with the 
9e70: 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20  platform..      
9e80: 23 20 20 20 20 20 20 20 66 6f 72 20 74 68 65 20  #       for the 
9e90: 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 2e  current process.
9ea0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
9eb0: 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20   return false.. 
9ec0: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
9ed0: 63 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65  c checkForSQLite
9ee0: 42 75 69 6c 64 73 20 7b 20 63 68 61 6e 6e 65 6c  Builds { channel
9ef0: 20 7b 73 65 6c 65 63 74 20 66 61 6c 73 65 7d 20   {select false} 
9f00: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
9f10: 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
9f20: 6b 20 66 6f 72 20 65 76 65 72 79 20 70 6f 73 73  k for every poss
9f30: 69 62 6c 65 20 76 61 6c 69 64 20 63 6f 6d 62 69  ible valid combi
9f40: 6e 61 74 69 6f 6e 20 6f 66 20 76 61 6c 75 65 73  nation of values
9f50: 20 75 73 65 64 20 77 68 65 6e 0d 0a 20 20 20 20   used when..    
9f60: 20 20 23 20 20 20 20 20 20 20 6c 6f 63 61 74 69    #       locati
9f70: 6e 67 20 6f 75 74 20 74 68 65 20 62 75 69 6c 64  ng out the build
9f80: 20 6f 75 74 70 75 74 20 64 69 72 65 63 74 6f 72   output director
9f90: 79 2c 20 73 68 6f 77 69 6e 67 20 65 61 63 68 20  y, showing each 
9fa0: 61 76 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20  available..     
9fb0: 20 23 20 20 20 20 20 20 20 62 75 69 6c 64 20 76   #       build v
9fc0: 61 72 69 61 74 69 6f 6e 20 61 6c 6f 6e 67 20 74  ariation along t
9fd0: 68 65 20 77 61 79 2e 0d 0a 20 20 20 20 20 20 23  he way...      #
9fe0: 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  ..      foreach 
9ff0: 6e 61 74 69 76 65 20 5b 6c 69 73 74 20 66 61 6c  native [list fal
a000: 73 65 20 74 72 75 65 5d 20 7b 0d 0a 20 20 20 20  se true] {..    
a010: 20 20 20 20 66 6f 72 65 61 63 68 20 79 65 61 72      foreach year
a020: 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72 73 5d   [getBuildYears]
a030: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f   {..          fo
a040: 72 65 61 63 68 20 63 6f 6e 66 69 67 75 72 61 74  reach configurat
a050: 69 6f 6e 20 5b 67 65 74 42 75 69 6c 64 43 6f 6e  ion [getBuildCon
a060: 66 69 67 75 72 61 74 69 6f 6e 73 5d 20 7b 0d 0a  figurations] {..
a070: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
a080: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
a090: 45 3a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68  E: Figure out th
a0a0: 65 20 65 66 66 65 63 74 69 76 65 20 62 75 69 6c  e effective buil
a0b0: 64 20 70 6c 61 74 66 6f 72 6d 2e 20 20 54 68 69  d platform.  Thi
a0c0: 73 20 69 73 0d 0a 20 20 20 20 20 20 20 20 20 20  s is..          
a0d0: 20 20 23 20 20 20 20 20 20 20 62 61 73 65 64 20    #       based 
a0e0: 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
a0f0: 74 20 61 20 5b 70 72 69 6d 61 72 69 6c 79 5d 20  t a [primarily] 
a100: 6e 61 74 69 76 65 20 62 75 69 6c 64 0d 0a 20 20  native build..  
a110: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
a120: 20 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 2e    is being used.
a130: 20 20 46 6f 72 20 5b 70 72 69 6d 61 72 69 6c 79    For [primarily
a140: 5d 20 6e 6f 6e 2d 6e 61 74 69 76 65 20 62 75 69  ] non-native bui
a150: 6c 64 73 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  lds,..          
a160: 20 20 23 20 20 20 20 20 20 20 74 68 69 73 20 77    #       this w
a170: 69 6c 6c 20 62 65 20 61 6e 20 65 6d 70 74 79 20  ill be an empty 
a180: 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20  string...       
a190: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
a1a0: 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d      set platform
a1b0: 20 5b 67 65 74 42 75 69 6c 64 50 6c 61 74 66 6f   [getBuildPlatfo
a1c0: 72 6d 20 24 6e 61 74 69 76 65 5d 0d 0a 0d 0a 20  rm $native].... 
a1d0: 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
a1e0: 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
a1f0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
a200: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
a210: 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74  hecking for Syst
a220: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 62  em.Data.SQLite b
a230: 75 69 6c 64 20 5c 22 22 20 5b 65 78 70 72 20 5c  uild \"" [expr \
a240: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a250: 20 20 7b 24 6e 61 74 69 76 65 20 3f 20 22 6e 61    {$native ? "na
a260: 74 69 76 65 2f 22 20 3a 20 22 22 7d 5d 20 5b 65  tive/" : ""}] [e
a270: 78 70 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e  xpr {[string len
a280: 67 74 68 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  gth \..         
a290: 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72 6d         $platform
a2a0: 5d 20 3e 20 30 20 3f 20 5b 61 70 70 65 6e 64 41  ] > 0 ? [appendA
a2b0: 72 67 73 20 24 70 6c 61 74 66 6f 72 6d 20 2f 5d  rgs $platform /]
a2c0: 20 3a 20 22 22 7d 5d 20 24 79 65 61 72 20 5c 0d   : ""}] $year \.
a2d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a2e0: 20 2f 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f   / $configuratio
a2f0: 6e 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20  n "\"... "].... 
a300: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
a310: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
a320: 3a 20 42 75 69 6c 64 20 74 68 65 20 66 75 6c 6c  : Build the full
a330: 79 20 71 75 61 6c 69 66 69 65 64 20 64 69 72 65  y qualified dire
a340: 63 74 6f 72 79 20 77 68 65 72 65 20 74 68 65 20  ctory where the 
a350: 6e 65 63 65 73 73 61 72 79 0d 0a 20 20 20 20 20  necessary..     
a360: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
a370: 6f 6d 70 6f 6e 65 6e 74 73 20 66 6f 72 20 53 79  omponents for Sy
a380: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
a390: 20 73 68 6f 75 6c 64 20 62 65 20 66 6f 75 6e 64   should be found
a3a0: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
a3b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ..            se
a3c0: 74 20 64 69 72 65 63 74 6f 72 79 20 5b 6a 6f 69  t directory [joi
a3d0: 6e 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79 20  nBuildDirectory 
a3e0: 24 6e 61 74 69 76 65 20 5c 0d 0a 20 20 20 20 20  $native \..     
a3f0: 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42             [getB
a400: 75 69 6c 64 42 61 73 65 44 69 72 65 63 74 6f 72  uildBaseDirector
a410: 79 5d 20 24 79 65 61 72 20 24 70 6c 61 74 66 6f  y] $year $platfo
a420: 72 6d 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f  rm $configuratio
a430: 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  n]....          
a440: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
a450: 20 23 20 4e 4f 54 45 3a 20 44 6f 20 74 68 65 20   # NOTE: Do the 
a460: 6e 65 63 65 73 73 61 72 79 20 66 69 6c 65 73 20  necessary files 
a470: 65 78 69 73 74 3f 20 20 43 75 72 72 65 6e 74 6c  exist?  Currentl
a480: 79 2c 20 6e 6f 20 6f 74 68 65 72 20 73 74 65 70  y, no other step
a490: 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  s..            #
a4a0: 20 20 20 20 20 20 20 61 72 65 20 74 61 6b 65 6e         are taken
a4b0: 20 74 6f 20 76 65 72 69 66 79 20 74 68 69 73 20   to verify this 
a4c0: 62 75 69 6c 64 20 69 73 20 61 63 74 75 61 6c 6c  build is actuall
a4d0: 79 20 76 69 61 62 6c 65 2e 0d 0a 20 20 20 20 20  y viable...     
a4e0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
a4f0: 20 20 20 20 20 20 69 66 20 7b 5b 69 73 42 75 69        if {[isBui
a500: 6c 64 41 76 61 69 6c 61 62 6c 65 20 24 6e 61 74  ldAvailable $nat
a510: 69 76 65 20 24 64 69 72 65 63 74 6f 72 79 5d 7d  ive $directory]}
a520: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
a530: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
a540: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
a550: 57 68 65 6e 20 69 6e 20 22 73 65 6c 65 63 74 22  When in "select"
a560: 20 6d 6f 64 65 2c 20 61 75 74 6f 6d 61 74 69 63   mode, automatic
a570: 61 6c 6c 79 20 73 65 6c 65 63 74 20 74 68 65 20  ally select the 
a580: 66 69 72 73 74 0d 0a 20 20 20 20 20 20 20 20 20  first..         
a590: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 76 61       #       ava
a5a0: 69 6c 61 62 6c 65 20 62 75 69 6c 64 20 6f 66 20  ilable build of 
a5b0: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
a5c0: 74 65 20 61 6e 64 20 74 68 65 6e 20 72 65 74 75  te and then retu
a5d0: 72 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  rn..            
a5e0: 20 20 23 20 20 20 20 20 20 20 69 6d 6d 65 64 69    #       immedi
a5f0: 61 74 65 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20  ately...        
a600: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
a610: 20 20 20 20 20 20 20 69 66 20 7b 24 73 65 6c 65         if {$sele
a620: 63 74 20 26 26 20 5b 6d 61 74 63 68 4d 61 63 68  ct && [matchMach
a630: 69 6e 65 20 24 70 6c 61 74 66 6f 72 6d 5d 7d 20  ine $platform]} 
a640: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
a650: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
a660: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
a670: 45 3a 20 4d 61 6e 75 61 6c 6c 79 20 6f 76 65 72  E: Manually over
a680: 72 69 64 65 20 61 6c 6c 20 74 68 65 20 62 75 69  ride all the bui
a690: 6c 64 20 64 69 72 65 63 74 6f 72 79 20 73 65 6c  ld directory sel
a6a0: 65 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20  ection..        
a6b0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
a6c0: 72 65 6c 61 74 65 64 20 74 65 73 74 20 73 65 74  related test set
a6d0: 74 69 6e 67 73 20 69 6e 20 6f 72 64 65 72 20 74  tings in order t
a6e0: 6f 20 66 6f 72 63 65 20 74 68 69 73 20 62 75 69  o force this bui
a6f0: 6c 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ld..            
a700: 20 20 20 20 23 20 20 20 20 20 20 20 6f 66 20 53      #       of S
a710: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
a720: 65 20 74 6f 20 62 65 20 75 73 65 64 2e 0d 0a 20  e to be used... 
a730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
a740: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a750: 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
a760: 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74 41  Interpreter.GetA
a770: 63 74 69 76 65 20 5b 65 78 70 72 20 7b 24 6e 61  ctive [expr {$na
a780: 74 69 76 65 20 3f 20 5c 0d 0a 20 20 20 20 20 20  tive ? \..      
a790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 41                "A
a7a0: 64 64 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 22  ddRuntimeOption"
a7b0: 20 3a 20 22 52 65 6d 6f 76 65 52 75 6e 74 69 6d   : "RemoveRuntim
a7c0: 65 4f 70 74 69 6f 6e 22 7d 5d 20 6e 61 74 69 76  eOption"}] nativ
a7d0: 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e....           
a7e0: 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74 5f       set ::test_
a7f0: 79 65 61 72 20 24 79 65 61 72 0d 0a 20 20 20 20  year $year..    
a800: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
a810: 3a 3a 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d 20  ::test_platform 
a820: 24 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20  $platform..     
a830: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a             set :
a840: 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74  :test_configurat
a850: 69 6f 6e 20 24 63 6f 6e 66 69 67 75 72 61 74 69  ion $configurati
a860: 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  on....          
a870: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
a880: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
a890: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
a8a0: 20 20 20 20 20 20 20 20 22 79 65 73 2c 20 73 65          "yes, se
a8b0: 6c 65 63 74 65 64 20 28 22 20 5b 65 78 70 72 20  lected (" [expr 
a8c0: 7b 24 6e 61 74 69 76 65 20 3f 20 22 6e 61 74 69  {$native ? "nati
a8d0: 76 65 2f 22 20 3a 20 22 22 7d 5d 20 5c 0d 0a 20  ve/" : ""}] \.. 
a8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8f0: 20 20 20 5b 65 78 70 72 20 7b 5b 73 74 72 69 6e     [expr {[strin
a900: 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f  g length $platfo
a910: 72 6d 5d 20 3e 20 30 20 3f 20 5b 61 70 70 65 6e  rm] > 0 ? [appen
a920: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
a930: 20 20 20 20 20 20 20 20 20 20 20 20 20 24 70 6c               $pl
a940: 61 74 66 6f 72 6d 20 2f 5d 20 3a 20 22 22 7d 5d  atform /] : ""}]
a950: 20 24 79 65 61 72 20 2f 20 24 63 6f 6e 66 69 67   $year / $config
a960: 75 72 61 74 69 6f 6e 20 22 29 5c 6e 22 5d 0d 0a  uration ")\n"]..
a970: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a980: 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20    return true.. 
a990: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65               } e
a9a0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
a9b0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
a9c0: 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20  annel yes\n..   
a9d0: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
a9e0: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
a9f0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
aa00: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
aa10: 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20   no\n..         
aa20: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
aa30: 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
aa40: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72      }....      r
aa50: 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20  eturn false..   
aa60: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
aa70: 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 52 65  checkForSQLiteRe
aa80: 6c 65 61 73 65 73 20 7b 20 63 68 61 6e 6e 65 6c  leases { channel
aa90: 20 7b 73 65 6c 65 63 74 20 66 61 6c 73 65 7d 20   {select false} 
aaa0: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
aab0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
aac0: 6b 20 66 6f 72 20 70 61 73 74 20 72 65 6c 65 61  k for past relea
aad0: 73 65 73 20 6f 66 20 53 79 73 74 65 6d 2e 44 61  ses of System.Da
aae0: 74 61 2e 53 51 4c 69 74 65 20 69 6e 20 74 68 65  ta.SQLite in the
aaf0: 20 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20   directory..    
ab00: 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74 61 69    #       contai
ab10: 6e 65 64 20 69 6e 20 74 68 65 20 22 53 79 73 74  ned in the "Syst
ab20: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 22 20  em.Data.SQLite" 
ab30: 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69  environment vari
ab40: 61 62 6c 65 2c 20 69 66 0d 0a 20 20 20 20 20 20  able, if..      
ab50: 23 20 20 20 20 20 20 20 70 72 65 73 65 6e 74 2e  #       present.
ab60: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
ab70: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
ab80: 73 20 3a 3a 65 6e 76 28 53 79 73 74 65 6d 2e 44  s ::env(System.D
ab90: 61 74 61 2e 53 51 4c 69 74 65 29 5d 20 26 26 20  ata.SQLite)] && 
aba0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
abb0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 65  ring length $::e
abc0: 6e 76 28 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  nv(System.Data.S
abd0: 51 4c 69 74 65 29 5d 20 3e 20 30 7d 20 74 68 65  QLite)] > 0} the
abe0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
abf0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
ac00: 42 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 79 20  Build the fully 
ac10: 71 75 61 6c 69 66 69 65 64 20 64 69 72 65 63 74  qualified direct
ac20: 6f 72 79 20 77 68 65 72 65 20 74 68 65 20 6e 65  ory where the ne
ac30: 63 65 73 73 61 72 79 0d 0a 20 20 20 20 20 20 20  cessary..       
ac40: 20 23 20 20 20 20 20 20 20 63 6f 6d 70 6f 6e 65   #       compone
ac50: 6e 74 73 20 66 6f 72 20 53 79 73 74 65 6d 2e 44  nts for System.D
ac60: 61 74 61 2e 53 51 4c 69 74 65 20 73 68 6f 75 6c  ata.SQLite shoul
ac70: 64 20 62 65 20 66 6f 75 6e 64 2e 0d 0a 20 20 20  d be found...   
ac80: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
ac90: 73 65 74 20 64 69 72 65 63 74 6f 72 79 20 5b 66  set directory [f
aca0: 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b  ile nativename [
acb0: 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20  file join \..   
acc0: 20 20 20 20 20 20 20 20 20 24 3a 3a 65 6e 76 28           $::env(
acd0: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
ace0: 74 65 29 20 5b 67 65 74 52 65 6c 65 61 73 65 56  te) [getReleaseV
acf0: 65 72 73 69 6f 6e 5d 5d 5d 0d 0a 0d 0a 20 20 20  ersion]]]....   
ad00: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
ad10: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
ad20: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
ad30: 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
ad40: 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  r System.Data.SQ
ad50: 4c 69 74 65 20 72 65 6c 65 61 73 65 20 5c 22 22  Lite release \""
ad60: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
ad70: 24 64 69 72 65 63 74 6f 72 79 20 22 5c 22 2e 2e  $directory "\"..
ad80: 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  . "]....        
ad90: 69 66 20 7b 5b 69 73 52 65 6c 65 61 73 65 41 76  if {[isReleaseAv
ada0: 61 69 6c 61 62 6c 65 20 24 64 69 72 65 63 74 6f  ailable $directo
adb0: 72 79 20 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68  ry platform]} th
adc0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
add0: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
ade0: 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3d 3d  th $platform] ==
adf0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
ae00: 20 20 20 20 20 20 20 20 73 65 74 20 70 6c 61 74          set plat
ae10: 66 6f 72 6d 20 75 6e 6b 6e 6f 77 6e 0d 0a 20 20  form unknown..  
ae20: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
ae30: 20 20 20 20 20 20 20 69 66 20 7b 24 73 65 6c 65         if {$sele
ae40: 63 74 20 26 26 20 5b 6d 61 74 63 68 4d 61 63 68  ct && [matchMach
ae50: 69 6e 65 20 24 70 6c 61 74 66 6f 72 6d 5d 7d 20  ine $platform]} 
ae60: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
ae70: 20 20 20 20 73 65 74 20 3a 3a 62 75 69 6c 64 5f      set ::build_
ae80: 64 69 72 65 63 74 6f 72 79 20 24 64 69 72 65 63  directory $direc
ae90: 74 6f 72 79 0d 0a 0d 0a 20 20 20 20 20 20 20 20  tory....        
aea0: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
aeb0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  el [appendArgs "
aec0: 79 65 73 2c 20 73 65 6c 65 63 74 65 64 20 28 22  yes, selected ("
aed0: 20 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22   $platform ")\n"
aee0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
aef0: 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20   return true..  
af00: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
af10: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
af20: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
af30: 70 65 6e 64 41 72 67 73 20 22 79 65 73 20 28 22  pendArgs "yes ("
af40: 20 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22   $platform ")\n"
af50: 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
af60: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
af70: 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
af80: 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d  s $channel no\n.
af90: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ...          for
afa0: 65 61 63 68 20 70 61 74 68 20 5b 6c 73 6f 72 74  each path [lsort
afb0: 20 2d 64 65 63 72 65 61 73 69 6e 67 20 5b 66 69   -decreasing [fi
afc0: 6c 65 20 6c 69 73 74 20 24 64 69 72 65 63 74 6f  le list $directo
afd0: 72 79 20 2a 5d 5d 20 7b 0d 0a 20 20 20 20 20 20  ry *]] {..      
afe0: 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20        if {[file 
aff0: 65 78 69 73 74 73 20 24 70 61 74 68 5d 20 26 26  exists $path] &&
b000: 20 5b 66 69 6c 65 20 69 73 64 69 72 65 63 74 6f   [file isdirecto
b010: 72 79 20 24 70 61 74 68 5d 7d 20 74 68 65 6e 20  ry $path]} then 
b020: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
b030: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
b040: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
b050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b060: 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20   "---- checking 
b070: 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  for System.Data.
b080: 53 51 4c 69 74 65 20 72 65 6c 65 61 73 65 20 5c  SQLite release \
b090: 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
b0a0: 20 20 20 20 20 20 20 20 24 70 61 74 68 20 22 5c          $path "\
b0b0: 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20  "... "]....     
b0c0: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 73           if {[is
b0d0: 52 65 6c 65 61 73 65 41 76 61 69 6c 61 62 6c 65  ReleaseAvailable
b0e0: 20 24 70 61 74 68 20 70 6c 61 74 66 6f 72 6d 5d   $path platform]
b0f0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
b100: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73            if {[s
b110: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c  tring length $pl
b120: 61 74 66 6f 72 6d 5d 20 3d 3d 20 30 7d 20 74 68  atform] == 0} th
b130: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
b140: 20 20 20 20 20 20 20 20 73 65 74 20 70 6c 61 74          set plat
b150: 66 6f 72 6d 20 75 6e 6b 6e 6f 77 6e 0d 0a 20 20  form unknown..  
b160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
b170: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
b180: 20 20 20 69 66 20 7b 24 73 65 6c 65 63 74 20 26     if {$select &
b190: 26 20 5b 6d 61 74 63 68 4d 61 63 68 69 6e 65 20  & [matchMachine 
b1a0: 24 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e  $platform]} then
b1b0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
b1c0: 20 20 20 20 20 20 73 65 74 20 3a 3a 62 75 69 6c        set ::buil
b1d0: 64 5f 64 69 72 65 63 74 6f 72 79 20 24 70 61 74  d_directory $pat
b1e0: 68 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h....           
b1f0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
b200: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
b210: 73 20 22 79 65 73 2c 20 73 65 6c 65 63 74 65 64  s "yes, selected
b220: 20 28 22 20 24 70 6c 61 74 66 6f 72 6d 20 22 29   (" $platform ")
b230: 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  \n"]....        
b240: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
b250: 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 20   true..         
b260: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
b270: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b280: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
b290: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79  l [appendArgs "y
b2a0: 65 73 20 28 22 20 24 70 6c 61 74 66 6f 72 6d 20  es (" $platform 
b2b0: 22 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  ")\n"]..        
b2c0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
b2d0: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
b2e0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
b2f0: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
b300: 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20  l no\n..        
b310: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
b320: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
b330: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
b340: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
b350: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
b360: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
b370: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
b380: 20 20 22 2d 2d 2d 2d 20 65 6e 76 69 72 6f 6e 6d    "---- environm
b390: 65 6e 74 20 76 61 72 69 61 62 6c 65 20 5c 22 53  ent variable \"S
b3a0: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
b3b0: 65 5c 22 20 69 73 20 6e 6f 74 20 22 20 5c 0d 0a  e\" is not " \..
b3c0: 20 20 20 20 20 20 20 20 20 20 20 20 22 73 65 74              "set
b3d0: 2c 20 73 6b 69 70 70 69 6e 67 20 63 68 65 63 6b  , skipping check
b3e0: 20 66 6f 72 20 72 65 6c 65 61 73 65 73 2e 2e 2e   for releases...
b3f0: 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  \n"]..      }...
b400: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61  .      return fa
b410: 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  lse..    }..... 
b420: 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72     proc checkFor
b430: 53 51 4c 69 74 65 4c 69 62 72 61 72 79 20 7b 20  SQLiteLibrary { 
b440: 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20  channel } {..   
b450: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
b460: 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67  l "---- checking
b470: 20 66 6f 72 20 53 51 4c 69 74 65 20 63 6f 72 65   for SQLite core
b480: 20 6c 69 62 72 61 72 79 2e 2e 2e 20 22 0d 0a 0d   library... "...
b490: 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63  .      if {[catc
b4a0: 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a  h {..        obj
b4b0: 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
b4c0: 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
b4d0: 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
b4e0: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53  em.Data.SQLite.S
b4f0: 51 4c 69 74 65 33 20 53 51 4c 69 74 65 56 65 72  QLite3 SQLiteVer
b500: 73 69 6f 6e 0d 0a 20 20 20 20 20 20 7d 20 76 65  sion..      } ve
b510: 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65  rsion] == 0} the
b520: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
b530: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
b540: 43 68 65 63 6b 20 69 66 20 74 68 65 20 72 65 74  Check if the ret
b550: 75 72 6e 65 64 20 76 65 72 73 69 6f 6e 20 77 61  urned version wa
b560: 73 20 6e 75 6c 6c 2e 20 20 49 66 20 73 6f 2c 20  s null.  If so, 
b570: 6d 61 6b 65 20 69 74 20 65 61 73 79 0d 0a 20 20  make it easy..  
b580: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f        #       to
b590: 20 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20   spot...        
b5a0: 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  #..        if {[
b5b0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76  string length $v
b5c0: 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68  ersion] == 0} th
b5d0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
b5e0: 73 65 74 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c  set version null
b5f0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
b600: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
b610: 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
b620: 74 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 46  t to query the F
b630: 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65  ossil source ide
b640: 6e 74 69 66 69 65 72 20 66 6f 72 20 74 68 65 20  ntifier for the 
b650: 53 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 20 20  SQLite..        
b660: 23 20 20 20 20 20 20 20 63 6f 72 65 20 6c 69 62  #       core lib
b670: 72 61 72 79 2e 0d 0a 20 20 20 20 20 20 20 20 23  rary...        #
b680: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
b690: 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
b6a0: 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
b6b0: 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
b6c0: 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
b6d0: 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
b6e0: 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 53 51  QLite.SQLite3 SQ
b6f0: 4c 69 74 65 53 6f 75 72 63 65 49 64 0d 0a 20 20  LiteSourceId..  
b700: 20 20 20 20 20 20 7d 20 73 6f 75 72 63 65 49 64        } sourceId
b710: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
b720: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
b730: 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 66 61 69    # NOTE: We fai
b740: 6c 65 64 20 74 6f 20 71 75 65 72 79 20 74 68 65  led to query the
b750: 20 46 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69   Fossil source i
b760: 64 65 6e 74 69 66 69 65 72 2e 0d 0a 20 20 20 20  dentifier...    
b770: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
b780: 20 20 20 73 65 74 20 73 6f 75 72 63 65 49 64 20     set sourceId 
b790: 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20  unknown..       
b7a0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
b7b0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
b7c0: 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 72 65   Check if the re
b7d0: 74 75 72 6e 65 64 20 46 6f 73 73 69 6c 20 73 6f  turned Fossil so
b7e0: 75 72 63 65 20 69 64 65 6e 74 69 66 69 65 72 20  urce identifier 
b7f0: 77 61 73 20 6e 75 6c 6c 2e 20 20 49 66 0d 0a 20  was null.  If.. 
b800: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73         #       s
b810: 6f 2c 20 6d 61 6b 65 20 69 74 20 65 61 73 79 20  o, make it easy 
b820: 74 6f 20 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20  to spot...      
b830: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
b840: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
b850: 24 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d  $sourceId] == 0}
b860: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
b870: 20 20 20 73 65 74 20 73 6f 75 72 63 65 49 64 20     set sourceId 
b880: 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d  null..        }.
b890: 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
b8a0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65        # NOTE: Ye
b8b0: 73 2c 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f  s, the SQLite co
b8c0: 72 65 20 6c 69 62 72 61 72 79 20 61 70 70 65 61  re library appea
b8d0: 72 73 20 74 6f 20 62 65 20 61 76 61 69 6c 61 62  rs to be availab
b8e0: 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  le...        #..
b8f0: 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
b900: 72 61 69 6e 74 20 53 51 4c 69 74 65 0d 0a 0d 0a  raint SQLite....
b910: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
b920: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
b930: 67 73 20 22 79 65 73 20 28 22 20 24 76 65 72 73  gs "yes (" $vers
b940: 69 6f 6e 20 22 20 22 20 24 73 6f 75 72 63 65 49  ion " " $sourceI
b950: 64 20 22 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  d ")\n"]..      
b960: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
b970: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
b980: 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a   no\n..      }..
b990: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
b9a0: 6f 63 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74  oc checkForSQLit
b9b0: 65 49 6e 74 65 72 6f 70 20 7b 20 63 68 61 6e 6e  eInterop { chann
b9c0: 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70  el } {..      tp
b9d0: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d  uts $channel "--
b9e0: 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
b9f0: 53 51 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61  SQLite interop a
ba00: 73 73 65 6d 62 6c 79 2e 2e 2e 20 22 0d 0a 0d 0a  ssembly... "....
ba10: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
ba20: 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65   {..        obje
ba30: 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
ba40: 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
ba50: 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
ba60: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51  m.Data.SQLite.SQ
ba70: 4c 69 74 65 33 20 49 6e 74 65 72 6f 70 56 65 72  Lite3 InteropVer
ba80: 73 69 6f 6e 0d 0a 20 20 20 20 20 20 7d 20 76 65  sion..      } ve
ba90: 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65  rsion] == 0} the
baa0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
bab0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
bac0: 43 68 65 63 6b 20 69 66 20 74 68 65 20 72 65 74  Check if the ret
bad0: 75 72 6e 65 64 20 76 65 72 73 69 6f 6e 20 77 61  urned version wa
bae0: 73 20 6e 75 6c 6c 2e 20 20 49 66 20 73 6f 2c 20  s null.  If so, 
baf0: 6d 61 6b 65 20 69 74 20 65 61 73 79 0d 0a 20 20  make it easy..  
bb00: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f        #       to
bb10: 20 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20   spot...        
bb20: 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  #..        if {[
bb30: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76  string length $v
bb40: 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68  ersion] == 0} th
bb50: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
bb60: 73 65 74 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c  set version null
bb70: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
bb80: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
bb90: 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
bba0: 74 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 46  t to query the F
bbb0: 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65  ossil source ide
bbc0: 6e 74 69 66 69 65 72 20 66 6f 72 20 74 68 65 20  ntifier for the 
bbd0: 53 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 20 20  SQLite..        
bbe0: 23 20 20 20 20 20 20 20 63 6f 72 65 20 6c 69 62  #       core lib
bbf0: 72 61 72 79 2e 0d 0a 20 20 20 20 20 20 20 20 23  rary...        #
bc00: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
bc10: 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
bc20: 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
bc30: 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
bc40: 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
bc50: 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
bc60: 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 49 6e  QLite.SQLite3 In
bc70: 74 65 72 6f 70 53 6f 75 72 63 65 49 64 0d 0a 20  teropSourceId.. 
bc80: 20 20 20 20 20 20 20 7d 20 73 6f 75 72 63 65 49         } sourceI
bc90: 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  d]} then {..    
bca0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
bcb0: 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 66 61     # NOTE: We fa
bcc0: 69 6c 65 64 20 74 6f 20 71 75 65 72 79 20 74 68  iled to query th
bcd0: 65 20 46 6f 73 73 69 6c 20 73 6f 75 72 63 65 20  e Fossil source 
bce0: 69 64 65 6e 74 69 66 69 65 72 2e 0d 0a 20 20 20  identifier...   
bcf0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
bd00: 20 20 20 20 73 65 74 20 73 6f 75 72 63 65 49 64      set sourceId
bd10: 20 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20   unknown..      
bd20: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
bd30: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
bd40: 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 72  : Check if the r
bd50: 65 74 75 72 6e 65 64 20 46 6f 73 73 69 6c 20 73  eturned Fossil s
bd60: 6f 75 72 63 65 20 69 64 65 6e 74 69 66 69 65 72  ource identifier
bd70: 20 77 61 73 20 6e 75 6c 6c 2e 20 20 49 66 0d 0a   was null.  If..
bd80: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
bd90: 73 6f 2c 20 6d 61 6b 65 20 69 74 20 65 61 73 79  so, make it easy
bda0: 20 74 6f 20 73 70 6f 74 2e 0d 0a 20 20 20 20 20   to spot...     
bdb0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
bdc0: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
bdd0: 20 24 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30   $sourceId] == 0
bde0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
bdf0: 20 20 20 20 73 65 74 20 73 6f 75 72 63 65 49 64      set sourceId
be00: 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d   null..        }
be10: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
be20: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59         # NOTE: Y
be30: 65 73 2c 20 74 68 65 20 53 51 4c 69 74 65 20 69  es, the SQLite i
be40: 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20  nterop assembly 
be50: 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 61 76  appears to be av
be60: 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20  ailable...      
be70: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64    #..        add
be80: 43 6f 6e 73 74 72 61 69 6e 74 20 53 51 4c 69 74  Constraint SQLit
be90: 65 49 6e 74 65 72 6f 70 0d 0a 0d 0a 20 20 20 20  eInterop....    
bea0: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
beb0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  el [appendArgs "
bec0: 79 65 73 20 28 22 20 24 76 65 72 73 69 6f 6e 20  yes (" $version 
bed0: 22 20 22 20 24 73 6f 75 72 63 65 49 64 20 22 29  " " $sourceId ")
bee0: 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  \n"]..      } el
bef0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  se {..        tp
bf00: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c  uts $channel no\
bf10: 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  n..      }..    
bf20: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
bf30: 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 65 66  heckForSQLiteDef
bf40: 69 6e 65 43 6f 6e 73 74 61 6e 74 20 7b 20 63 68  ineConstant { ch
bf50: 61 6e 6e 65 6c 20 6e 61 6d 65 20 7d 20 7b 0d 0a  annel name } {..
bf60: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
bf70: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
bf80: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 22 2d   \..          "-
bf90: 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
bfa0: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
bfb0: 69 74 65 20 64 65 66 69 6e 65 20 63 6f 6e 73 74  ite define const
bfc0: 61 6e 74 20 5c 22 22 20 24 6e 61 6d 65 20 5c 0d  ant \"" $name \.
bfd0: 0a 20 20 20 20 20 20 20 20 20 20 22 5c 22 2e 2e  .          "\"..
bfe0: 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  . "]....      if
bff0: 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
c000: 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
c010: 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
c020: 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
c030: 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
c040: 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 44 65  QLite.SQLite3 De
c050: 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73 0d 0a 20  fineConstants.. 
c060: 20 20 20 20 20 7d 20 64 65 66 69 6e 65 43 6f 6e       } defineCon
c070: 73 74 61 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68  stants] == 0} th
c080: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
c090: 20 7b 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 63   {[lsearch -exac
c0a0: 74 20 2d 6e 6f 63 61 73 65 20 24 64 65 66 69 6e  t -nocase $defin
c0b0: 65 43 6f 6e 73 74 61 6e 74 73 20 24 6e 61 6d 65  eConstants $name
c0c0: 5d 20 21 3d 20 2d 31 7d 20 74 68 65 6e 20 7b 0d  ] != -1} then {.
c0d0: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
c0e0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
c0f0: 59 65 73 2c 20 74 68 69 73 20 64 65 66 69 6e 65  Yes, this define
c100: 20 63 6f 6e 73 74 61 6e 74 20 77 61 73 20 65 6e   constant was en
c110: 61 62 6c 65 64 20 77 68 65 6e 20 74 68 65 20 6d  abled when the m
c120: 61 6e 61 67 65 64 0d 0a 20 20 20 20 20 20 20 20  anaged..        
c130: 20 20 23 20 20 20 20 20 20 20 61 73 73 65 6d 62    #       assemb
c140: 6c 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 2e  ly was compiled.
c150: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
c160: 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73           addCons
c170: 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
c180: 67 73 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e  gs defineConstan
c190: 74 2e 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  t.System.Data.SQ
c1a0: 4c 69 74 65 2e 20 24 6e 61 6d 65 5d 0d 0a 0d 0a  Lite. $name]....
c1b0: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
c1c0: 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a  $channel yes\n..
c1d0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
c1e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
c1f0: 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d  s $channel no\n.
c200: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
c210: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
c220: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
c230: 65 6c 20 65 72 72 6f 72 5c 6e 0d 0a 20 20 20 20  el error\n..    
c240: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
c250: 20 20 20 70 72 6f 63 20 67 65 74 44 61 74 65 54     proc getDateT
c260: 69 6d 65 46 6f 72 6d 61 74 20 7b 7d 20 7b 0d 0a  imeFormat {} {..
c270: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
c280: 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63   NOTE: This proc
c290: 65 64 75 72 65 20 73 69 6d 70 6c 79 20 72 65 74  edure simply ret
c2a0: 75 72 6e 73 20 74 68 65 20 22 64 65 66 61 75 6c  urns the "defaul
c2b0: 74 22 20 44 61 74 65 54 69 6d 65 20 66 6f 72 6d  t" DateTime form
c2c0: 61 74 20 75 73 65 64 0d 0a 20 20 20 20 20 20 23  at used..      #
c2d0: 20 20 20 20 20 20 20 62 79 20 74 68 65 20 74 65         by the te
c2e0: 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20  st suite...     
c2f0: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
c300: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 64 61 74  nfo exists ::dat
c310: 65 74 69 6d 65 5f 66 6f 72 6d 61 74 5d 20 26 26  etime_format] &&
c320: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
c330: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
c340: 64 61 74 65 74 69 6d 65 5f 66 6f 72 6d 61 74 5d  datetime_format]
c350: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
c360: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
c370: 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20   # NOTE: Return 
c380: 74 68 65 20 6d 61 6e 75 61 6c 6c 79 20 6f 76 65  the manually ove
c390: 72 72 69 64 64 65 6e 20 76 61 6c 75 65 20 66 6f  rridden value fo
c3a0: 72 20 74 68 65 20 44 61 74 65 54 69 6d 65 20 66  r the DateTime f
c3b0: 6f 72 6d 61 74 2e 0d 0a 20 20 20 20 20 20 20 20  ormat...        
c3c0: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
c3d0: 6e 20 24 3a 3a 64 61 74 65 74 69 6d 65 5f 66 6f  n $::datetime_fo
c3e0: 72 6d 61 74 0d 0a 20 20 20 20 20 20 7d 20 65 6c  rmat..      } el
c3f0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
c400: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
c410: 20 52 65 74 75 72 6e 20 61 6e 20 49 53 4f 38 36   Return an ISO86
c420: 30 31 20 44 61 74 65 54 69 6d 65 20 66 6f 72 6d  01 DateTime form
c430: 61 74 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  at compatible wi
c440: 74 68 20 53 51 4c 69 74 65 2c 0d 0a 20 20 20 20  th SQLite,..    
c450: 20 20 20 20 23 20 20 20 20 20 20 20 53 79 73 74      #       Syst
c460: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2c 20  em.Data.SQLite, 
c470: 61 6e 64 20 73 75 69 74 61 62 6c 65 20 66 6f 72  and suitable for
c480: 20 72 6f 75 6e 64 2d 74 72 69 70 70 69 6e 67 20   round-tripping 
c490: 77 69 74 68 20 74 68 65 0d 0a 20 20 20 20 20 20  with the..      
c4a0: 20 20 23 20 20 20 20 20 20 20 44 61 74 65 54 69    #       DateTi
c4b0: 6d 65 20 63 6c 61 73 73 20 6f 66 20 74 68 65 20  me class of the 
c4c0: 66 72 61 6d 65 77 6f 72 6b 2e 20 20 49 66 20 74  framework.  If t
c4d0: 68 69 73 20 76 61 6c 75 65 20 69 73 20 63 68 61  his value is cha
c4e0: 6e 67 65 64 2c 0d 0a 20 20 20 20 20 20 20 20 23  nged,..        #
c4f0: 20 20 20 20 20 20 20 76 61 72 69 6f 75 73 20 74         various t
c500: 65 73 74 73 20 6d 61 79 20 66 61 69 6c 2e 0d 0a  ests may fail...
c510: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
c520: 20 20 20 72 65 74 75 72 6e 20 22 79 79 79 79 2d     return "yyyy-
c530: 4d 4d 2d 64 64 20 48 48 3a 6d 6d 3a 73 73 2e 46  MM-dd HH:mm:ss.F
c540: 46 46 46 46 46 46 4b 22 0d 0a 20 20 20 20 20 20  FFFFFFK"..      
c550: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
c560: 20 70 72 6f 63 20 65 6e 75 6d 65 72 61 62 6c 65   proc enumerable
c570: 54 6f 4c 69 73 74 20 7b 20 65 6e 75 6d 65 72 61  ToList { enumera
c580: 62 6c 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73  ble } {..      s
c590: 65 74 20 72 65 73 75 6c 74 20 5b 6c 69 73 74 5d  et result [list]
c5a0: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73  ....      if {[s
c5b0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 65 6e  tring length $en
c5c0: 75 6d 65 72 61 62 6c 65 5d 20 3d 3d 20 30 20 7c  umerable] == 0 |
c5d0: 7c 20 24 65 6e 75 6d 65 72 61 62 6c 65 20 65 71  | $enumerable eq
c5e0: 20 22 6e 75 6c 6c 22 7d 20 74 68 65 6e 20 7b 0d   "null"} then {.
c5f0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
c600: 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 20 20 7d  $result..      }
c610: 0d 0a 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63 74  ....      object
c620: 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20   foreach -alias 
c630: 69 74 65 6d 20 24 65 6e 75 6d 65 72 61 62 6c 65  item $enumerable
c640: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
c650: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
c660: 69 74 65 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20  item] > 0} then 
c670: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6c 61 70  {..          lap
c680: 70 65 6e 64 20 72 65 73 75 6c 74 20 5b 24 69 74  pend result [$it
c690: 65 6d 20 54 6f 53 74 72 69 6e 67 5d 0d 0a 20 20  em ToString]..  
c6a0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
c6b0: 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ....      return
c6c0: 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d   $result..    }.
c6d0: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 61 74  ....    proc cat
c6e0: 63 68 41 6e 64 52 65 74 75 72 6e 20 7b 20 73 63  chAndReturn { sc
c6f0: 72 69 70 74 20 7b 73 74 61 63 6b 54 72 61 63 65  ript {stackTrace
c700: 20 66 61 6c 73 65 7d 20 7b 73 74 72 69 63 74 20   false} {strict 
c710: 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  true} } {..     
c720: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
c730: 3a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 73  : Evaluate the s
c740: 63 72 69 70 74 20 70 72 6f 76 69 64 65 64 20 62  cript provided b
c750: 79 20 6f 75 72 20 63 61 6c 6c 65 72 20 69 6e 20  y our caller in 
c760: 74 68 65 69 72 20 63 6f 6e 74 65 78 74 2c 0d 0a  their context,..
c770: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61        #       ca
c780: 70 74 75 72 69 6e 67 20 62 6f 74 68 20 74 68 65  pturing both the
c790: 20 72 65 73 75 6c 74 20 61 6e 64 20 74 68 65 20   result and the 
c7a0: 72 65 74 75 72 6e 20 63 6f 64 65 2e 0d 0a 20 20  return code...  
c7b0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
c7c0: 20 63 6f 64 65 20 5b 63 61 74 63 68 20 7b 75 70   code [catch {up
c7d0: 6c 65 76 65 6c 20 31 20 24 73 63 72 69 70 74 7d  level 1 $script}
c7e0: 20 72 65 73 75 6c 74 5d 0d 0a 0d 0a 20 20 20 20   result]....    
c7f0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
c800: 45 3a 20 44 69 64 20 74 68 65 20 73 63 72 69 70  E: Did the scrip
c810: 74 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75  t provided by ou
c820: 72 20 63 61 6c 6c 65 72 20 4e 4f 54 20 72 61 69  r caller NOT rai
c830: 73 65 20 61 6e 20 65 72 72 6f 72 3f 0d 0a 20 20  se an error?..  
c840: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
c850: 7b 24 73 74 72 69 63 74 20 26 26 20 24 63 6f 64  {$strict && $cod
c860: 65 20 3d 3d 20 30 20 7c 7c 20 21 24 73 74 72 69  e == 0 || !$stri
c870: 63 74 20 26 26 20 24 63 6f 64 65 20 21 3d 20 31  ct && $code != 1
c880: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
c890: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
c8a0: 4f 54 45 3a 20 53 75 63 63 65 73 73 2e 20 20 52  OTE: Success.  R
c8b0: 65 74 75 72 6e 20 61 20 6c 69 73 74 20 77 69 74  eturn a list wit
c8c0: 68 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  h the return cod
c8d0: 65 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74  e and the result
c8e0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
c8f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69        return [li
c900: 73 74 20 24 63 6f 64 65 20 24 72 65 73 75 6c 74  st $code $result
c910: 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69  ]..      } elsei
c920: 66 20 7b 24 73 74 61 63 6b 54 72 61 63 65 7d 20  f {$stackTrace} 
c930: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
c940: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
c950: 45 3a 20 46 61 69 6c 75 72 65 2e 20 20 4f 75 72  E: Failure.  Our
c960: 20 63 61 6c 6c 65 72 20 77 61 6e 74 73 20 61 20   caller wants a 
c970: 66 75 6c 6c 20 73 74 61 63 6b 20 74 72 61 63 65  full stack trace
c980: 20 28 69 66 20 61 70 70 6c 69 63 61 62 6c 65 29   (if applicable)
c990: 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ,..        #    
c9a0: 20 20 20 72 65 74 75 72 6e 20 61 20 6c 69 73 74     return a list
c9b0: 20 77 69 74 68 20 74 68 65 20 72 65 74 75 72 6e   with the return
c9c0: 20 63 6f 64 65 20 61 6e 64 20 74 68 65 20 72 65   code and the re
c9d0: 73 75 6c 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a  sult verbatim...
c9e0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
c9f0: 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20     return [list 
ca00: 24 63 6f 64 65 20 24 72 65 73 75 6c 74 5d 0d 0a  $code $result]..
ca10: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
ca20: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
ca30: 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 69 6c 75     # NOTE: Failu
ca40: 72 65 2e 20 20 4f 75 72 20 63 61 6c 6c 65 72 20  re.  Our caller 
ca50: 64 6f 65 73 20 6e 6f 74 20 77 61 6e 74 20 61 20  does not want a 
ca60: 66 75 6c 6c 20 73 74 61 63 6b 20 74 72 61 63 65  full stack trace
ca70: 20 28 69 66 0d 0a 20 20 20 20 20 20 20 20 23 20   (if..        # 
ca80: 20 20 20 20 20 20 61 70 70 6c 69 63 61 62 6c 65        applicable
ca90: 29 2c 20 72 65 74 75 72 6e 20 61 20 6c 69 73 74  ), return a list
caa0: 20 77 69 74 68 20 74 68 65 20 72 65 74 75 72 6e   with the return
cab0: 20 63 6f 64 65 2c 20 74 68 65 20 65 72 72 6f 72   code, the error
cac0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
cad0: 20 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69    code for the i
cae0: 6e 74 65 72 70 72 65 74 65 72 2c 20 61 6e 64 20  nterpreter, and 
caf0: 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
cb00: 65 20 75 70 20 74 6f 20 74 68 65 0d 0a 20 20 20  e up to the..   
cb10: 20 20 20 20 20 23 20 20 20 20 20 20 20 70 6f 69       #       poi
cb20: 6e 74 20 77 68 65 72 65 20 74 68 65 20 73 74 61  nt where the sta
cb30: 63 6b 20 74 72 61 63 65 20 73 68 6f 75 6c 64 20  ck trace should 
cb40: 73 74 61 72 74 2e 0d 0a 20 20 20 20 20 20 20 20  start...        
cb50: 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 69  #..        set i
cb60: 6e 64 65 78 20 5b 73 74 72 69 6e 67 20 66 69 72  ndex [string fir
cb70: 73 74 20 22 20 20 20 61 74 20 22 20 24 72 65 73  st "   at " $res
cb80: 75 6c 74 5d 3b 20 23 20 48 41 43 4b 3a 20 52 65  ult]; # HACK: Re
cb90: 6c 69 61 62 6c 65 3f 0d 0a 0d 0a 20 20 20 20 20  liable?....     
cba0: 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20     return [list 
cbb0: 24 63 6f 64 65 20 24 3a 3a 65 72 72 6f 72 43 6f  $code $::errorCo
cbc0: 64 65 20 5b 65 78 70 72 20 7b 24 69 6e 64 65 78  de [expr {$index
cbd0: 20 21 3d 20 2d 31 20 3f 20 5c 0d 0a 20 20 20 20   != -1 ? \..    
cbe0: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
cbf0: 74 72 69 6d 20 5b 73 74 72 69 6e 67 20 72 61 6e  trim [string ran
cc00: 67 65 20 24 72 65 73 75 6c 74 20 30 20 24 69 6e  ge $result 0 $in
cc10: 64 65 78 5d 5d 20 3a 20 24 72 65 73 75 6c 74 7d  dex]] : $result}
cc20: 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  ]]..      }..   
cc30: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
cc40: 63 6f 6d 70 69 6c 65 43 53 68 61 72 70 57 69 74  compileCSharpWit
cc50: 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
cc60: 20 74 65 78 74 20 6d 65 6d 6f 72 79 20 73 79 6d   text memory sym
cc70: 62 6f 6c 73 20 73 74 72 69 63 74 20 72 65 73 75  bols strict resu
cc80: 6c 74 73 56 61 72 4e 61 6d 65 20 65 72 72 6f 72  ltsVarName error
cc90: 73 56 61 72 4e 61 6d 65 20 66 69 6c 65 4e 61 6d  sVarName fileNam
cca0: 65 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  es..            
ccb0: 61 72 67 73 20 7d 20 7b 0d 0a 20 20 20 20 20 20  args } {..      
ccc0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
ccd0: 20 53 69 6e 63 65 20 77 65 20 61 72 65 20 67 6f   Since we are go
cce0: 69 6e 67 20 74 6f 20 75 73 65 20 74 68 69 73 20  ing to use this 
ccf0: 6d 65 74 68 6f 64 20 6e 61 6d 65 20 61 20 6c 6f  method name a lo
cd00: 74 2c 20 61 73 73 69 67 6e 20 69 74 20 74 6f 20  t, assign it to 
cd10: 61 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  a..      #      
cd20: 20 76 61 72 69 61 62 6c 65 20 66 69 72 73 74 2e   variable first.
cd30: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
cd40: 20 73 65 74 20 61 64 64 20 52 65 66 65 72 65 6e   set add Referen
cd50: 63 65 64 41 73 73 65 6d 62 6c 69 65 73 2e 41 64  cedAssemblies.Ad
cd60: 64 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  d....      #..  
cd70: 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 72 65 61      # NOTE: Crea
cd80: 74 65 20 74 68 65 20 62 61 73 65 20 63 6f 6d 6d  te the base comm
cd90: 61 6e 64 20 74 6f 20 65 76 61 6c 75 61 74 65 20  and to evaluate 
cda0: 61 6e 64 20 61 64 64 20 74 68 65 20 70 72 6f 70  and add the prop
cdb0: 65 72 74 79 20 73 65 74 74 69 6e 67 73 0d 0a 20  erty settings.. 
cdc0: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 61       #       tha
cdd0: 74 20 61 72 65 20 61 6c 6d 6f 73 74 20 61 6c 77  t are almost alw
cde0: 61 79 73 20 6e 65 65 64 65 64 20 62 79 20 6f 75  ays needed by ou
cdf0: 72 20 75 6e 69 74 20 74 65 73 74 73 20 28 69 2e  r unit tests (i.
ce00: 65 2e 20 74 68 65 20 53 79 73 74 65 6d 0d 0a 20  e. the System.. 
ce10: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6e 64       #       and
ce20: 20 53 79 73 74 65 6d 2e 44 61 74 61 20 61 73 73   System.Data ass
ce30: 65 6d 62 6c 79 20 72 65 66 65 72 65 6e 63 65 73  embly references
ce40: 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  )...      #..   
ce50: 20 20 20 73 65 74 20 63 6f 6d 6d 61 6e 64 20 5b     set command [
ce60: 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  list \..        
ce70: 20 20 63 6f 6d 70 69 6c 65 43 53 68 61 72 70 20    compileCSharp 
ce80: 24 74 65 78 74 20 24 6d 65 6d 6f 72 79 20 24 73  $text $memory $s
ce90: 79 6d 62 6f 6c 73 20 24 73 74 72 69 63 74 20 72  ymbols $strict r
cea0: 65 73 75 6c 74 73 20 65 72 72 6f 72 73 20 5c 0d  esults errors \.
ceb0: 0a 20 20 20 20 20 20 20 20 20 20 24 61 64 64 20  .          $add 
cec0: 53 79 73 74 65 6d 2e 64 6c 6c 20 24 61 64 64 20  System.dll $add 
ced0: 53 79 73 74 65 6d 2e 44 61 74 61 2e 64 6c 6c 20  System.Data.dll 
cee0: 24 61 64 64 20 53 79 73 74 65 6d 2e 54 72 61 6e  $add System.Tran
cef0: 73 61 63 74 69 6f 6e 73 2e 64 6c 6c 20 5c 0d 0a  sactions.dll \..
cf00: 20 20 20 20 20 20 20 20 20 20 24 61 64 64 20 53            $add S
cf10: 79 73 74 65 6d 2e 58 6d 6c 2e 64 6c 6c 5d 0d 0a  ystem.Xml.dll]..
cf20: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
cf30: 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 61 6c 6c   # NOTE: Add all
cf40: 20 74 68 65 20 70 72 6f 76 69 64 65 64 20 66 69   the provided fi
cf50: 6c 65 20 6e 61 6d 65 73 20 61 73 20 61 73 73 65  le names as asse
cf60: 6d 62 6c 79 20 72 65 66 65 72 65 6e 63 65 73 2e  mbly references.
cf70: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
cf80: 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
cf90: 65 20 24 66 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  e $fileNames {..
cfa0: 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
cfb0: 63 6f 6d 6d 61 6e 64 20 24 61 64 64 20 5b 67 65  command $add [ge
cfc0: 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
cfd0: 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20  $fileName]..    
cfe0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
cff0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64        # NOTE: Ad
d000: 64 20 74 68 65 20 65 78 74 72 61 20 61 72 67 75  d the extra argu
d010: 6d 65 6e 74 73 2c 20 69 66 20 61 6e 79 2c 20 74  ments, if any, t
d020: 6f 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 74 6f  o the command to
d030: 20 65 76 61 6c 75 61 74 65 2e 0d 0a 20 20 20 20   evaluate...    
d040: 20 20 23 0d 0a 20 20 20 20 20 20 65 76 61 6c 20    #..      eval 
d050: 6c 61 70 70 65 6e 64 20 63 6f 6d 6d 61 6e 64 20  lappend command 
d060: 24 61 72 67 73 0d 0a 0d 0a 20 20 20 20 20 20 23  $args....      #
d070: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
d080: 41 6c 69 61 73 20 74 68 65 20 63 6f 6d 70 69 6c  Alias the compil
d090: 65 72 20 6c 6f 63 61 6c 20 72 65 73 75 6c 74 73  er local results
d0a0: 20 61 6e 64 20 65 72 72 6f 72 73 20 76 61 72 69   and errors vari
d0b0: 61 62 6c 65 73 20 74 6f 20 74 68 65 0d 0a 20 20  ables to the..  
d0c0: 20 20 20 20 23 20 20 20 20 20 20 20 76 61 72 69      #       vari
d0d0: 61 62 6c 65 20 6e 61 6d 65 73 20 70 72 6f 76 69  able names provi
d0e0: 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65  ded by our calle
d0f0: 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  r...      #..   
d100: 20 20 20 75 70 76 61 72 20 31 20 24 72 65 73 75     upvar 1 $resu
d110: 6c 74 73 56 61 72 4e 61 6d 65 20 72 65 73 75 6c  ltsVarName resul
d120: 74 73 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20  ts..      upvar 
d130: 31 20 24 65 72 72 6f 72 73 56 61 72 4e 61 6d 65  1 $errorsVarName
d140: 20 65 72 72 6f 72 73 0d 0a 0d 0a 20 20 20 20 20   errors....     
d150: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
d160: 3a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 63  : Evaluate the c
d170: 6f 6e 73 74 72 75 63 74 65 64 20 5b 63 6f 6d 70  onstructed [comp
d180: 69 6c 65 43 53 68 61 72 70 5d 20 63 6f 6d 6d 61  ileCSharp] comma
d190: 6e 64 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  nd and return th
d1a0: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
d1b0: 20 72 65 73 75 6c 74 2e 0d 0a 20 20 20 20 20 20   result...      
d1c0: 23 0d 0a 20 20 20 20 20 20 65 76 61 6c 20 24 63  #..      eval $c
d1d0: 6f 6d 6d 61 6e 64 0d 0a 20 20 20 20 7d 0d 0a 0c  ommand..    }...
d1e0: 0d 0a 20 20 20 20 70 72 6f 63 20 69 73 4d 65 6d  ..    proc isMem
d1f0: 6f 72 79 44 62 20 7b 20 66 69 6c 65 4e 61 6d 65  oryDb { fileName
d200: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
d210: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 73 20       # NOTE: Is 
d220: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 64 61  the specified da
d230: 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
d240: 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e 2d 6d 65   really an in-me
d250: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 3f 0d 0a  mory database?..
d260: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72        #..      r
d270: 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 24 66 69  eturn [expr {$fi
d280: 6c 65 4e 61 6d 65 20 65 71 20 22 3a 6d 65 6d 6f  leName eq ":memo
d290: 72 79 3a 22 20 7c 7c 20 5c 0d 0a 20 20 20 20 20  ry:" || \..     
d2a0: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 72 61 6e       [string ran
d2b0: 67 65 20 24 66 69 6c 65 4e 61 6d 65 20 30 20 31  ge $fileName 0 1
d2c0: 32 5d 20 65 71 20 22 66 69 6c 65 3a 3a 6d 65 6d  2] eq "file::mem
d2d0: 6f 72 79 3a 22 7d 5d 0d 0a 20 20 20 20 7d 0d 0a  ory:"}]..    }..
d2e0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73 54 61  ...    proc isTa
d2f0: 62 6c 65 49 6e 44 62 20 7b 20 6e 61 6d 65 20 7b  bleInDb { name {
d300: 76 61 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b 0d  varName db} } {.
d310: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
d320: 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f  # NOTE: Refer to
d330: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76   the specified v
d340: 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64  ariable (e.g. "d
d350: 62 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  b") in the conte
d360: 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20  xt of our..     
d370: 20 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e   #       caller.
d380: 20 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 74 68    It contains th
d390: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
d3a0: 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 74 68 61  ction handle tha
d3b0: 74 20 77 69 6c 6c 20 62 65 0d 0a 20 20 20 20 20  t will be..     
d3c0: 20 23 20 20 20 20 20 20 20 75 73 65 64 20 74 6f   #       used to
d3d0: 20 65 78 65 63 75 74 65 20 74 68 65 20 71 75 65   execute the que
d3e0: 72 79 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  ry used to deter
d3f0: 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 61 6d 65  mine if the name
d400: 64 20 74 61 62 6c 65 20 69 73 0d 0a 20 20 20 20  d table is..    
d410: 20 20 23 20 20 20 20 20 20 20 70 72 65 73 65 6e    #       presen
d420: 74 20 69 6e 20 74 68 61 74 20 64 61 74 61 62 61  t in that databa
d430: 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  se...      #..  
d440: 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72      upvar 1 $var
d450: 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20  Name db....     
d460: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
d470: 3a 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65  : Use the sqlite
d480: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f  _master table to
d490: 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
d4a0: 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73  e named table is
d4b0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
d4c0: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 64  present in the d
d4d0: 61 74 61 62 61 73 65 2e 0d 0a 20 20 20 20 20 20  atabase...      
d4e0: 23 0d 0a 20 20 20 20 20 20 73 65 74 20 73 71 6c  #..      set sql
d4f0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 53 45 4c 45   {..        SELE
d500: 43 54 20 43 4f 55 4e 54 28 2a 29 20 46 52 4f 4d  CT COUNT(*) FROM
d510: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57   sqlite_master W
d520: 48 45 52 45 20 74 79 70 65 20 3d 20 27 74 61 62  HERE type = 'tab
d530: 6c 65 27 20 41 4e 44 20 6e 61 6d 65 20 3d 20 3f  le' AND name = ?
d540: 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ;..      }....  
d550: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
d560: 4f 54 45 3a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  OTE: Return non-
d570: 7a 65 72 6f 20 69 66 20 74 68 65 20 6e 61 6d 65  zero if the name
d580: 64 20 74 61 62 6c 65 20 69 73 20 70 72 65 73 65  d table is prese
d590: 6e 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  nt...      #..  
d5a0: 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72      return [expr
d5b0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 5b 73 71 6c   {..        [sql
d5c0: 20 65 78 65 63 75 74 65 20 2d 65 78 65 63 75 74   execute -execut
d5d0: 65 20 73 63 61 6c 61 72 20 24 64 62 20 24 73 71  e scalar $db $sq
d5e0: 6c 20 5b 6c 69 73 74 20 70 61 72 61 6d 31 20 53  l [list param1 S
d5f0: 74 72 69 6e 67 20 24 6e 61 6d 65 5d 5d 20 3e 20  tring $name]] > 
d600: 30 0d 0a 20 20 20 20 20 20 7d 5d 0d 0a 20 20 20  0..      }]..   
d610: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
d620: 74 72 69 6d 53 71 6c 20 7b 20 73 71 6c 20 7d 20  trimSql { sql } 
d630: 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  {..      return 
d640: 5b 72 65 67 73 75 62 20 2d 61 6c 6c 20 2d 2d 20  [regsub -all -- 
d650: 7b 5c 73 2b 7d 20 5b 73 74 72 69 6e 67 20 74 72  {\s+} [string tr
d660: 69 6d 20 24 73 71 6c 5d 20 22 20 22 5d 0d 0a 20  im $sql] " "].. 
d670: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
d680: 63 20 65 78 65 63 75 74 65 53 71 6c 20 7b 20 73  c executeSql { s
d690: 71 6c 20 7b 65 78 65 63 75 74 65 20 6e 6f 6e 65  ql {execute none
d6a0: 7d 20 7b 66 6f 72 6d 61 74 20 6e 6f 6e 65 7d 20  } {format none} 
d6b0: 7b 66 69 6c 65 4e 61 6d 65 20 22 22 7d 20 7d 20  {fileName ""} } 
d6c0: 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  {..      if {[st
d6d0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 69 6c  ring length $fil
d6e0: 65 4e 61 6d 65 5d 20 3d 3d 20 30 7d 20 74 68 65  eName] == 0} the
d6f0: 6e 20 7b 73 65 74 20 66 69 6c 65 4e 61 6d 65 20  n {set fileName 
d700: 3a 6d 65 6d 6f 72 79 3a 7d 0d 0a 20 20 20 20 20  :memory:}..     
d710: 20 73 65 74 75 70 44 62 20 24 66 69 6c 65 4e 61   setupDb $fileNa
d720: 6d 65 20 22 22 20 22 22 20 22 22 20 22 22 20 22  me "" "" "" "" "
d730: 22 20 66 61 6c 73 65 20 66 61 6c 73 65 20 66 61  " false false fa
d740: 6c 73 65 20 66 61 6c 73 65 20 64 62 20 74 72 75  lse false db tru
d750: 65 0d 0a 0d 0a 20 20 20 20 20 20 74 72 79 20 7b  e....      try {
d760: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
d770: 20 5b 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73   [uplevel 1 [lis
d780: 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
d790: 20 73 71 6c 20 65 78 65 63 75 74 65 20 2d 65 78   sql execute -ex
d7a0: 65 63 75 74 65 20 24 65 78 65 63 75 74 65 20 2d  ecute $execute -
d7b0: 66 6f 72 6d 61 74 20 24 66 6f 72 6d 61 74 20 24  format $format $
d7c0: 64 62 20 24 73 71 6c 5d 5d 0d 0a 20 20 20 20 20  db $sql]]..     
d7d0: 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0d 0a 20 20   } finally {..  
d7e0: 20 20 20 20 20 20 63 6c 65 61 6e 75 70 44 62 20        cleanupDb 
d7f0: 24 66 69 6c 65 4e 61 6d 65 20 64 62 20 66 61 6c  $fileName db fal
d800: 73 65 20 66 61 6c 73 65 20 66 61 6c 73 65 0d 0a  se false false..
d810: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
d820: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 43  ...    proc getC
d830: 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 20 7b  onnectionFlags {
d840: 20 66 69 6c 65 4e 61 6d 65 20 66 6c 61 67 73 20   fileName flags 
d850: 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20  {quiet false} } 
d860: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
d870: 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65    # NOTE: Figure
d880: 20 6f 75 74 20 77 68 69 63 68 20 64 61 74 61 62   out which datab
d890: 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 6f 72  ase file name or
d8a0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69   connection stri
d8b0: 6e 67 20 74 68 65 73 65 0d 0a 20 20 20 20 20 20  ng these..      
d8c0: 23 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69  #       connecti
d8d0: 6f 6e 20 66 6c 61 67 73 20 77 69 6c 6c 20 61 63  on flags will ac
d8e0: 74 75 61 6c 6c 79 20 61 70 70 6c 79 20 74 6f 2e  tually apply to.
d8f0: 20 20 54 68 69 73 20 69 73 20 6e 6f 74 20 6e 65    This is not ne
d900: 63 65 73 73 61 72 79 0d 0a 20 20 20 20 20 20 23  cessary..      #
d910: 20 20 20 20 20 20 20 69 6e 20 71 75 69 65 74 20         in quiet 
d920: 6d 6f 64 65 20 62 65 63 61 75 73 65 20 74 68 69  mode because thi
d930: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
d940: 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 6c   only used for l
d950: 6f 67 67 69 6e 67 0d 0a 20 20 20 20 20 20 23 20  ogging..      # 
d960: 20 20 20 20 20 20 61 6e 64 20 72 65 70 6f 72 74        and report
d970: 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 0d 0a 20  ing purposes... 
d980: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
d990: 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
d9a0: 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  {..        if {[
d9b0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66  string length $f
d9c0: 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68  ileName] > 0} th
d9d0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
d9e0: 73 65 74 20 64 61 74 61 62 61 73 65 20 5b 61 70  set database [ap
d9f0: 70 65 6e 64 41 72 67 73 20 22 66 69 6c 65 20 6e  pendArgs "file n
da00: 61 6d 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d  ame \"" $fileNam
da10: 65 20 5c 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d  e \"]..        }
da20: 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65   elseif {[info e
da30: 78 69 73 74 73 20 3a 3a 64 61 74 61 53 6f 75 72  xists ::dataSour
da40: 63 65 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  ce] && \..      
da50: 20 20 20 20 20 20 21 5b 61 72 72 61 79 20 65 78        ![array ex
da60: 69 73 74 73 20 3a 3a 64 61 74 61 53 6f 75 72 63  ists ::dataSourc
da70: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
da80: 20 20 20 20 20 20 73 65 74 20 64 61 74 61 62 61        set databa
da90: 73 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  se [appendArgs "
daa0: 64 61 74 61 20 73 6f 75 72 63 65 20 5c 22 22 20  data source \"" 
dab0: 24 3a 3a 64 61 74 61 53 6f 75 72 63 65 20 5c 22  $::dataSource \"
dac0: 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  ]..        } els
dad0: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  e {..          s
dae0: 65 74 20 64 61 74 61 62 61 73 65 20 3c 75 6e 6b  et database <unk
daf0: 6e 6f 77 6e 3e 0d 0a 20 20 20 20 20 20 20 20 7d  nown>..        }
db00: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
db10: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
db20: 54 45 3a 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f  TE: Show (and lo
db30: 67 29 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e  g) the local con
db40: 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 61 6e  nection flags an
db50: 64 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  d the associated
db60: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
db70: 64 61 74 61 20 73 6f 75 72 63 65 20 6f 72 20 66  data source or f
db80: 69 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20  ile name...     
db90: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24   #..      if {!$
dba0: 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
dbb0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
dbc0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
dbd0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
dbe0: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 6f          "---- lo
dbf0: 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  cal connection f
dc00: 6c 61 67 73 20 66 6f 72 20 22 20 24 64 61 74 61  lags for " $data
dc10: 62 61 73 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  base \..        
dc20: 20 20 20 20 22 20 61 72 65 3a 20 22 20 5b 65 78      " are: " [ex
dc30: 70 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  pr {[string leng
dc40: 74 68 20 24 66 6c 61 67 73 5d 20 3e 20 30 20 3f  th $flags] > 0 ?
dc50: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
dc60: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24  [appendArgs \" $
dc70: 66 6c 61 67 73 20 5c 22 5d 20 3a 20 22 3c 6e 6f  flags \"] : "<no
dc80: 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20  ne>"}] \n]..    
dc90: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
dca0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68        # NOTE: Sh
dcb0: 6f 77 20 28 61 6e 64 20 6c 6f 67 29 20 74 68 65  ow (and log) the
dcc0: 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63 74 69   shared connecti
dcd0: 6f 6e 20 66 6c 61 67 73 2e 0d 0a 20 20 20 20 20  on flags...     
dce0: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24   #..      if {!$
dcf0: 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
dd00: 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
dd10: 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f  h {..          o
dd20: 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 53 79 73  bject invoke Sys
dd30: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
dd40: 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
dd50: 20 53 68 61 72 65 64 46 6c 61 67 73 0d 0a 20 20   SharedFlags..  
dd60: 20 20 20 20 20 20 7d 20 73 68 61 72 65 64 46 6c        } sharedFl
dd70: 61 67 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ags] == 0} then 
dd80: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
dd90: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
dda0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
ddb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
ddc0: 22 2d 2d 2d 2d 20 73 68 61 72 65 64 20 63 6f 6e  "---- shared con
ddd0: 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 66 6f  nection flags fo
dde0: 72 20 22 20 24 64 61 74 61 62 61 73 65 20 5c 0d  r " $database \.
ddf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
de00: 20 61 72 65 3a 20 22 20 5b 65 78 70 72 20 7b 5b   are: " [expr {[
de10: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73  string length $s
de20: 68 61 72 65 64 46 6c 61 67 73 5d 20 3e 20 30 20  haredFlags] > 0 
de30: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
de40: 20 20 20 20 24 73 68 61 72 65 64 46 6c 61 67 73      $sharedFlags
de50: 20 6e 65 20 22 4e 6f 6e 65 22 20 3f 20 5c 0d 0a   ne "None" ? \..
de60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 61                [a
de70: 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24 73 68  ppendArgs \" $sh
de80: 61 72 65 64 46 6c 61 67 73 20 5c 22 5d 20 3a 20  aredFlags \"] : 
de90: 22 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a  "<none>"}] \n]..
dea0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
deb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
dec0: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
ded0: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
dee0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
def0: 2d 2d 2d 2d 20 73 68 61 72 65 64 20 63 6f 6e 6e  ---- shared conn
df00: 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 66 6f 72  ection flags for
df10: 20 22 20 24 64 61 74 61 62 61 73 65 20 5c 0d 0a   " $database \..
df20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
df30: 61 72 65 3a 20 3c 75 6e 61 76 61 69 6c 61 62 6c  are: <unavailabl
df40: 65 3e 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  e>\n"]..        
df50: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
df60: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
df70: 4f 54 45 3a 20 49 66 20 74 68 65 72 65 20 61 72  OTE: If there ar
df80: 65 20 61 6e 79 20 67 6c 6f 62 61 6c 20 28 70 65  e any global (pe
df90: 72 20 74 65 73 74 20 72 75 6e 29 20 63 6f 6e 6e  r test run) conn
dfa0: 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 63 75 72  ection flags cur
dfb0: 72 65 6e 74 6c 79 0d 0a 20 20 20 20 20 20 23 20  rently..      # 
dfc0: 20 20 20 20 20 20 73 65 74 2c 20 75 73 65 20 74        set, use t
dfd0: 68 65 6d 20 6e 6f 77 20 28 69 2e 65 2e 20 62 79  hem now (i.e. by
dfe0: 20 63 6f 6d 62 69 6e 69 6e 67 20 74 68 65 6d 20   combining them 
dff0: 77 69 74 68 20 74 68 65 20 6f 6e 65 73 20 66 6f  with the ones fo
e000: 72 20 74 68 69 73 0d 0a 20 20 20 20 20 20 23 20  r this..      # 
e010: 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e        connection
e020: 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  )...      #..   
e030: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
e040: 73 74 73 20 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e  sts ::connection
e050: 5f 66 6c 61 67 73 5d 20 26 26 20 5c 0d 0a 20 20  _flags] && \..  
e060: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
e070: 6c 65 6e 67 74 68 20 24 3a 3a 63 6f 6e 6e 65 63  length $::connec
e080: 74 69 6f 6e 5f 66 6c 61 67 73 5d 20 3e 20 30 7d  tion_flags] > 0}
e090: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
e0a0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
e0b0: 54 45 3a 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f  TE: Show (and lo
e0c0: 67 29 20 74 68 65 20 64 65 74 65 63 74 65 64 20  g) the detected 
e0d0: 67 6c 6f 62 61 6c 20 63 6f 6e 6e 65 63 74 69 6f  global connectio
e0e0: 6e 20 66 6c 61 67 73 2e 0d 0a 20 20 20 20 20 20  n flags...      
e0f0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
e100: 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
e110: 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
e120: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
e130: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
e140: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
e150: 2d 2d 2d 2d 20 67 6c 6f 62 61 6c 20 63 6f 6e 6e  ---- global conn
e160: 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 64 65 74  ection flags det
e170: 65 63 74 65 64 3a 20 22 20 5c 0d 0a 20 20 20 20  ected: " \..    
e180: 20 20 20 20 20 20 20 20 20 20 5b 65 78 70 72 20            [expr 
e190: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
e1a0: 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73  connection_flags
e1b0: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
e1c0: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
e1d0: 6e 67 74 68 20 24 3a 3a 63 6f 6e 6e 65 63 74 69  ngth $::connecti
e1e0: 6f 6e 5f 66 6c 61 67 73 5d 20 3e 20 30 20 3f 20  on_flags] > 0 ? 
e1f0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
e200: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20   [appendArgs \" 
e210: 24 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c  $::connection_fl
e220: 61 67 73 20 5c 22 5d 20 3a 20 22 3c 6e 6f 6e 65  ags \"] : "<none
e230: 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  >"}] \n]..      
e240: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
e250: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
e260: 3a 20 43 6f 6d 62 69 6e 65 20 61 6e 64 2f 6f 72  : Combine and/or
e270: 20 72 65 70 6c 61 63 65 20 74 68 65 20 63 6f 6e   replace the con
e280: 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 61 6e  nection flags an
e290: 64 20 74 68 65 6e 20 73 68 6f 77 20 74 68 65 0d  d then show the.
e2a0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
e2b0: 20 6e 65 77 20 76 61 6c 75 65 2e 0d 0a 20 20 20   new value...   
e2c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
e2d0: 73 65 74 20 66 6c 61 67 73 20 5b 63 6f 6d 62 69  set flags [combi
e2e0: 6e 65 46 6c 61 67 73 20 24 66 6c 61 67 73 20 24  neFlags $flags $
e2f0: 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61  ::connection_fla
e300: 67 73 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  gs]....        #
e310: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
e320: 3a 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f 67 29  : Show (and log)
e330: 20 74 68 65 20 6e 65 77 20 65 66 66 65 63 74 69   the new effecti
e340: 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c  ve connection fl
e350: 61 67 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ags...        #.
e360: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71  .        if {!$q
e370: 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
e380: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
e390: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
e3a0: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
e3b0: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
e3c0: 20 63 6f 6d 62 69 6e 65 64 20 63 6f 6e 6e 65 63   combined connec
e3d0: 74 69 6f 6e 20 66 6c 61 67 73 20 66 6f 72 20 22  tion flags for "
e3e0: 20 24 64 61 74 61 62 61 73 65 20 5c 0d 0a 20 20   $database \..  
e3f0: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 61 72              " ar
e400: 65 3a 20 22 20 5b 65 78 70 72 20 7b 5b 73 74 72  e: " [expr {[str
e410: 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 6c 61 67  ing length $flag
e420: 73 5d 20 3e 20 30 20 3f 20 5c 0d 0a 20 20 20 20  s] > 0 ? \..    
e430: 20 20 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e            [appen
e440: 64 41 72 67 73 20 5c 22 20 24 66 6c 61 67 73 20  dArgs \" $flags 
e450: 5c 22 5d 20 3a 20 22 3c 6e 6f 6e 65 3e 22 7d 5d  \"] : "<none>"}]
e460: 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d   \n]..        }.
e470: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
e480: 20 20 72 65 74 75 72 6e 20 24 66 6c 61 67 73 0d    return $flags.
e490: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
e4a0: 72 6f 63 20 67 65 74 46 6c 61 67 73 50 72 6f 70  roc getFlagsProp
e4b0: 65 72 74 79 20 7b 20 7b 66 6c 61 67 73 20 22 22  erty { {flags ""
e4c0: 7d 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20  } {quiet false} 
e4d0: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
e4e0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 65 74 65      # NOTE: Dete
e4f0: 72 6d 69 6e 65 20 77 68 61 74 20 74 68 65 20 63  rmine what the c
e500: 6f 6d 62 69 6e 65 64 20 28 67 6c 6f 62 61 6c 20  ombined (global 
e510: 61 6e 64 20 6c 6f 63 61 6c 29 20 63 6f 6e 6e 65  and local) conne
e520: 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20  ction..      #  
e530: 20 20 20 20 20 66 6c 61 67 73 20 73 68 6f 75 6c       flags shoul
e540: 64 20 62 65 2c 20 70 6f 73 73 69 62 6c 79 20 71  d be, possibly q
e550: 75 69 65 74 6c 79 2e 0d 0a 20 20 20 20 20 20 23  uietly...      #
e560: 0d 0a 20 20 20 20 20 20 73 65 74 20 66 6c 61 67  ..      set flag
e570: 73 20 5b 67 65 74 43 6f 6e 6e 65 63 74 69 6f 6e  s [getConnection
e580: 46 6c 61 67 73 20 22 22 20 24 66 6c 61 67 73 20  Flags "" $flags 
e590: 24 71 75 69 65 74 5d 0d 0a 0d 0a 20 20 20 20 20  $quiet]....     
e5a0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
e5b0: 3a 20 49 66 20 6e 6f 20 67 6c 6f 62 61 6c 20 6f  : If no global o
e5c0: 72 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69  r local connecti
e5d0: 6f 6e 20 66 6c 61 67 73 20 77 65 72 65 20 73 70  on flags were sp
e5e0: 65 63 69 66 69 65 64 2c 20 74 68 65 0d 0a 20 20  ecified, the..  
e5f0: 20 20 20 20 23 20 20 20 20 20 20 20 64 65 66 61      #       defa
e600: 75 6c 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  ult connection f
e610: 6c 61 67 73 20 73 68 6f 75 6c 64 20 62 65 20 75  lags should be u
e620: 73 65 64 3b 20 74 68 65 72 65 66 6f 72 65 2c 20  sed; therefore, 
e630: 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 23 20  return..      # 
e640: 20 20 20 20 20 20 61 6e 20 65 6d 70 74 79 20 73        an empty s
e650: 74 72 69 6e 67 20 69 6e 20 74 68 61 74 20 63 61  tring in that ca
e660: 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  se...      #..  
e670: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
e680: 6c 65 6e 67 74 68 20 24 66 6c 61 67 73 5d 20 3d  length $flags] =
e690: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
e6a0: 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a       return ""..
e6b0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
e6c0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
e6d0: 3a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 63 68  : In order to ch
e6e0: 65 63 6b 20 69 66 20 74 68 65 20 64 65 66 61 75  eck if the defau
e6f0: 6c 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c  lt connection fl
e700: 61 67 73 20 61 72 65 20 62 65 69 6e 67 20 75 73  ags are being us
e710: 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ed..      #     
e720: 20 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72    it is necessar
e730: 79 20 74 6f 20 61 74 74 65 6d 70 74 20 61 20 63  y to attempt a c
e740: 6f 6e 76 65 72 73 69 6f 6e 20 74 6f 20 74 68 65  onversion to the
e750: 20 61 63 74 75 61 6c 20 65 6e 75 6d 65 72 61 74   actual enumerat
e760: 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ed..      #     
e770: 20 20 74 79 70 65 2e 20 20 46 61 69 6c 69 6e 67    type.  Failing
e780: 20 74 68 61 74 2c 20 74 68 65 20 63 68 65 63 6b   that, the check
e790: 20 61 67 61 69 6e 73 74 20 74 68 65 20 64 65 66   against the def
e7a0: 61 75 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c 20  ault value will 
e7b0: 62 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  be..      #     
e7c0: 20 20 73 6b 69 70 70 65 64 2e 0d 0a 20 20 20 20    skipped...    
e7d0: 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 65    #..      set e
e7e0: 72 72 6f 72 20 6e 75 6c 6c 3b 20 23 20 49 47 4e  rror null; # IGN
e7f0: 4f 52 45 44 0d 0a 20 20 20 20 20 20 73 65 74 20  ORED..      set 
e800: 76 61 6c 75 65 20 5b 6f 62 6a 65 63 74 20 69 6e  value [object in
e810: 76 6f 6b 65 20 55 74 69 6c 69 74 79 20 54 72 79  voke Utility Try
e820: 50 61 72 73 65 46 6c 61 67 73 45 6e 75 6d 20 22  ParseFlagsEnum "
e830: 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 53  " \..          S
e840: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
e850: 65 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69  e.SQLiteConnecti
e860: 6f 6e 46 6c 61 67 73 20 22 22 20 24 66 6c 61 67  onFlags "" $flag
e870: 73 20 6e 75 6c 6c 20 74 72 75 65 20 5c 0d 0a 20  s null true \.. 
e880: 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 5d 0d           error].
e890: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
e8a0: 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65    # NOTE: If the
e8b0: 20 63 6f 6d 62 69 6e 65 64 20 66 6c 61 67 73 20   combined flags 
e8c0: 73 74 72 69 6e 67 20 63 6f 75 6c 64 20 6e 6f 74  string could not
e8d0: 20 61 63 74 75 61 6c 6c 79 20 62 65 20 63 6f 6e   actually be con
e8e0: 76 65 72 74 65 64 0d 0a 20 20 20 20 20 20 23 20  verted..      # 
e8f0: 20 20 20 20 20 20 74 6f 20 74 68 65 20 65 6e 75        to the enu
e900: 6d 65 72 61 74 65 64 20 74 79 70 65 20 69 74 20  merated type it 
e910: 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 76  is the default v
e920: 61 6c 75 65 2c 20 74 68 65 6e 20 6a 75 73 74 20  alue, then just 
e930: 75 73 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  use..      #    
e940: 20 20 20 69 74 20 76 65 72 62 61 74 69 6d 3b 20     it verbatim; 
e950: 6f 74 68 65 72 77 69 73 65 2c 20 6a 75 73 74 20  otherwise, just 
e960: 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20  return an empty 
e970: 73 74 72 69 6e 67 2e 20 20 49 6e 20 74 68 61 74  string.  In that
e980: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
e990: 63 61 73 65 2c 20 74 68 65 20 64 65 66 61 75 6c  case, the defaul
e9a0: 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61  t connection fla
e9b0: 67 73 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2e  gs will be used.
e9c0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
e9d0: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
e9e0: 67 74 68 20 24 76 61 6c 75 65 5d 20 3d 3d 20 30  gth $value] == 0
e9f0: 20 7c 7c 20 24 76 61 6c 75 65 20 6e 65 20 22 44   || $value ne "D
ea00: 65 66 61 75 6c 74 22 7d 20 74 68 65 6e 20 7b 0d  efault"} then {.
ea10: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
ea20: 20 20 20 20 23 20 57 41 52 4e 49 4e 47 3a 20 54      # WARNING: T
ea30: 68 69 73 20 72 65 74 75 72 6e 73 20 74 68 65 20  his returns the 
ea40: 73 74 72 69 6e 67 20 76 61 6c 75 65 20 6f 66 20  string value of 
ea50: 74 68 65 20 63 6f 6d 62 69 6e 65 64 20 66 6c 61  the combined fla
ea60: 67 73 2c 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20  gs, not..       
ea70: 20 23 20 20 20 20 20 20 20 20 20 20 74 68 65 20   #          the 
ea80: 65 6e 75 6d 65 72 61 74 65 64 20 76 61 6c 75 65  enumerated value
ea90: 2e 20 20 54 68 69 73 20 69 73 20 62 79 20 64 65  .  This is by de
eaa0: 73 69 67 6e 20 61 6e 64 20 73 68 6f 75 6c 64 20  sign and should 
eab0: 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20  not..        #  
eac0: 20 20 20 20 20 20 20 20 62 65 20 63 68 61 6e 67          be chang
ead0: 65 64 20 77 69 74 68 6f 75 74 20 63 61 72 65 66  ed without caref
eae0: 75 6c 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e  ul consideration
eaf0: 20 28 65 2e 67 2e 20 69 74 20 77 6f 75 6c 64 0d   (e.g. it would.
eb00: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
eb10: 20 20 20 20 70 72 65 76 65 6e 74 20 74 68 65 20      prevent the 
eb20: 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
eb30: 20 63 6c 61 73 73 20 66 72 6f 6d 20 61 6c 6c 6f   class from allo
eb40: 77 69 6e 67 20 69 6e 76 61 6c 69 64 0d 0a 20 20  wing invalid..  
eb50: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
eb60: 20 5b 22 6d 61 67 69 63 61 6c 22 5d 20 6d 65 74   ["magical"] met
eb70: 61 2d 66 6c 61 67 73 29 2e 0d 0a 20 20 20 20 20  a-flags)...     
eb80: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
eb90: 74 75 72 6e 20 5b 61 70 70 65 6e 64 41 72 67 73  turn [appendArgs
eba0: 20 22 46 6c 61 67 73 3d 22 20 24 66 6c 61 67 73   "Flags=" $flags
ebb0: 20 5c 3b 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d   \;]..      }...
ebc0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22  .      return ""
ebd0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
ebe0: 70 72 6f 63 20 73 65 74 75 70 44 62 20 7b 0d 0a  proc setupDb {..
ebf0: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
ec00: 4e 61 6d 65 20 7b 6d 6f 64 65 20 22 22 7d 20 7b  Name {mode ""} {
ec10: 64 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 20 22  dateTimeFormat "
ec20: 22 7d 20 7b 64 61 74 65 54 69 6d 65 4b 69 6e 64  "} {dateTimeKind
ec30: 20 22 22 7d 20 7b 66 6c 61 67 73 20 22 22 7d 0d   ""} {flags ""}.
ec40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 65 78  .            {ex
ec50: 74 72 61 20 22 22 7d 20 7b 71 75 61 6c 69 66 79  tra ""} {qualify
ec60: 20 74 72 75 65 7d 20 7b 64 65 6c 65 74 65 20 74   true} {delete t
ec70: 72 75 65 7d 20 7b 75 72 69 20 66 61 6c 73 65 7d  rue} {uri false}
ec80: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 74  ..            {t
ec90: 65 6d 70 6f 72 61 72 79 20 74 72 75 65 7d 20 7b  emporary true} {
eca0: 76 61 72 4e 61 6d 65 20 64 62 7d 20 7b 71 75 69  varName db} {qui
ecb0: 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  et false} } {.. 
ecc0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
ecd0: 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20 73 65 65  NOTE: First, see
ece0: 20 69 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 68   if our caller h
ecf0: 61 73 20 72 65 71 75 65 73 74 65 64 20 61 6e 20  as requested an 
ed00: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
ed10: 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  se...      #..  
ed20: 20 20 20 20 73 65 74 20 69 73 4d 65 6d 6f 72 79      set isMemory
ed30: 20 5b 69 73 4d 65 6d 6f 72 79 44 62 20 24 66 69   [isMemoryDb $fi
ed40: 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20  leName]....     
ed50: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
ed60: 3a 20 46 6f 72 20 6e 6f 77 2c 20 61 6c 6c 20 74  : For now, all t
ed70: 65 73 74 20 64 61 74 61 62 61 73 65 73 20 75 73  est databases us
ed80: 65 64 20 62 79 20 74 68 65 20 74 65 73 74 20 73  ed by the test s
ed90: 75 69 74 65 20 61 72 65 20 70 6c 61 63 65 64 0d  uite are placed.
eda0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69  .      #       i
edb0: 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
edc0: 20 64 69 72 65 63 74 6f 72 79 2e 20 20 45 61 63   directory.  Eac
edd0: 68 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  h database and r
ede0: 65 6c 61 74 65 64 20 66 69 6c 65 73 0d 0a 20 20  elated files..  
edf0: 20 20 20 20 23 20 20 20 20 20 20 20 75 73 65 64      #       used
ee00: 20 62 79 20 61 20 74 65 73 74 20 73 68 6f 75 6c   by a test shoul
ee10: 64 20 62 65 20 63 6c 65 61 6e 65 64 20 75 70 20  d be cleaned up 
ee20: 62 79 20 74 68 61 74 20 74 65 73 74 20 75 73 69  by that test usi
ee30: 6e 67 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  ng the..      # 
ee40: 20 20 20 20 20 20 22 63 6c 65 61 6e 75 70 44 62        "cleanupDb
ee50: 22 20 70 72 6f 63 65 64 75 72 65 2c 20 62 65 6c  " procedure, bel
ee60: 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ow...      #..  
ee70: 20 20 20 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f      if {!$isMemo
ee80: 72 79 20 26 26 20 24 71 75 61 6c 69 66 79 7d 20  ry && $qualify} 
ee90: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
eea0: 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69  set fileName [fi
eeb0: 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 44 61 74 61  le join [getData
eec0: 62 61 73 65 44 69 72 65 63 74 6f 72 79 5d 20 5b  baseDirectory] [
eed0: 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e  file tail $fileN
eee0: 61 6d 65 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  ame]]..      }..
eef0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
ef00: 20 23 20 4e 4f 54 45 3a 20 42 79 20 64 65 66 61   # NOTE: By defa
ef10: 75 6c 74 2c 20 64 65 6c 65 74 65 20 61 6e 79 20  ult, delete any 
ef20: 70 72 65 2d 65 78 69 73 74 69 6e 67 20 64 61 74  pre-existing dat
ef30: 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73  abase with the s
ef40: 61 6d 65 20 66 69 6c 65 0d 0a 20 20 20 20 20 20  ame file..      
ef50: 23 20 20 20 20 20 20 20 6e 61 6d 65 20 69 66 20  #       name if 
ef60: 69 74 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69  it currently exi
ef70: 73 74 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  sts...      #.. 
ef80: 20 20 20 20 20 69 66 20 7b 21 24 69 73 4d 65 6d       if {!$isMem
ef90: 6f 72 79 20 26 26 20 24 64 65 6c 65 74 65 20 26  ory && $delete &
efa0: 26 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24  & [file exists $
efb0: 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  fileName]} then 
efc0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
efd0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74        # NOTE: At
efe0: 74 65 6d 70 74 20 74 6f 20 64 65 6c 65 74 65 20  tempt to delete 
eff0: 61 6e 79 20 70 72 65 2d 65 78 69 73 74 69 6e 67  any pre-existing
f000: 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74   database with t
f010: 68 65 20 73 61 6d 65 20 66 69 6c 65 0d 0a 20 20  he same file..  
f020: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61        #       na
f030: 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  me...        #..
f040: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
f050: 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20  ch {file delete 
f060: 24 66 69 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72  $fileName} error
f070: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
f080: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
f090: 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d    # NOTE: We som
f0a0: 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f 20 64  ehow failed to d
f0b0: 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 2c 20  elete the file, 
f0c0: 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20  report why...   
f0d0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
f0e0: 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
f0f0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
f100: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
f110: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
f120: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
f130: 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
f140: 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
f150: 74 6f 20 64 65 6c 65 74 65 20 64 61 74 61 62 61  to delete databa
f160: 73 65 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c  se file \"" $fil
f170: 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  eName \..       
f180: 20 20 20 20 20 20 20 20 20 22 5c 22 20 64 75 72           "\" dur
f190: 69 6e 67 20 73 65 74 75 70 2c 20 65 72 72 6f 72  ing setup, error
f1a0: 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20  : " \n\t $error 
f1b0: 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
f1c0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
f1d0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
f1e0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
f1f0: 65 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63  efer to the spec
f200: 69 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28  ified variable (
f210: 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68  e.g. "db") in th
f220: 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72  e context of our
f230: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
f240: 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 68 61 6e  caller.  The han
f250: 64 6c 65 20 74 6f 20 74 68 65 20 6f 70 65 6e 65  dle to the opene
f260: 64 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20  d database will 
f270: 62 65 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e  be stored there.
f280: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
f290: 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d   upvar 1 $varNam
f2a0: 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  e db....      #.
f2b0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53  .      # NOTE: S
f2c0: 74 61 72 74 20 62 75 69 6c 64 69 6e 67 20 74 68  tart building th
f2d0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72  e connection str
f2e0: 69 6e 67 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72  ing.  The only r
f2f0: 65 71 75 69 72 65 64 20 70 6f 72 74 69 6f 6e 0d  equired portion.
f300: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f  .      #       o
f310: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
f320: 20 73 74 72 69 6e 67 20 69 73 20 74 68 65 20 64   string is the d
f330: 61 74 61 20 73 6f 75 72 63 65 2c 20 77 68 69 63  ata source, whic
f340: 68 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0d 0a  h contains the..
f350: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 61        #       da
f360: 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
f370: 20 69 74 73 65 6c 66 2e 20 20 49 66 20 6f 75 72   itself.  If our
f380: 20 63 61 6c 6c 65 72 20 77 61 6e 74 73 20 74 6f   caller wants to
f390: 20 75 73 65 20 61 20 55 52 49 20 61 73 0d 0a 20   use a URI as.. 
f3a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
f3b0: 20 64 61 74 61 20 73 6f 75 72 63 65 2c 20 75 73   data source, us
f3c0: 65 20 74 68 65 20 46 75 6c 6c 55 72 69 20 63 6f  e the FullUri co
f3d0: 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20  nnection string 
f3e0: 70 72 6f 70 65 72 74 79 20 74 6f 0d 0a 20 20 20  property to..   
f3f0: 20 20 20 23 20 20 20 20 20 20 20 70 72 65 76 65     #       preve
f400: 6e 74 20 74 68 65 20 64 61 74 61 20 73 6f 75 72  nt the data sour
f410: 63 65 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 62  ce string from b
f420: 65 69 6e 67 20 6d 61 6e 67 6c 65 64 2e 0d 0a 20  eing mangled... 
f430: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
f440: 20 7b 24 75 72 69 7d 20 74 68 65 6e 20 7b 0d 0a   {$uri} then {..
f450: 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 6e 6e          set conn
f460: 65 63 74 69 6f 6e 20 7b 46 75 6c 6c 55 72 69 3d  ection {FullUri=
f470: 24 7b 66 69 6c 65 4e 61 6d 65 7d 7d 0d 0a 20 20  ${fileName}}..  
f480: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
f490: 20 20 20 20 20 20 73 65 74 20 63 6f 6e 6e 65 63        set connec
f4a0: 74 69 6f 6e 20 7b 44 61 74 61 20 53 6f 75 72 63  tion {Data Sourc
f4b0: 65 3d 24 7b 66 69 6c 65 4e 61 6d 65 7d 7d 0d 0a  e=${fileName}}..
f4c0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
f4d0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
f4e0: 3a 20 53 69 6e 63 65 20 74 68 69 73 20 70 72 6f  : Since this pro
f4f0: 63 65 64 75 72 65 20 68 61 73 20 6e 6f 20 73 70  cedure has no sp
f500: 65 63 69 61 6c 20 6b 6e 6f 77 6c 65 64 67 65 20  ecial knowledge 
f510: 6f 66 20 77 68 61 74 20 74 68 65 20 64 65 66 61  of what the defa
f520: 75 6c 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ult..      #    
f530: 20 20 20 73 65 74 74 69 6e 67 20 69 73 20 66 6f     setting is fo
f540: 72 20 74 68 65 20 54 6f 46 75 6c 6c 50 61 74 68  r the ToFullPath
f550: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69   connection stri
f560: 6e 67 20 70 72 6f 70 65 72 79 2c 20 61 6c 77 61  ng propery, alwa
f570: 79 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ys..      #     
f580: 20 20 61 64 64 20 74 68 65 20 76 61 6c 75 65 20    add the value 
f590: 77 65 20 6b 6e 6f 77 20 61 62 6f 75 74 20 74 6f  we know about to
f5a0: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
f5b0: 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 23  string...      #
f5c0: 0d 0a 20 20 20 20 20 20 61 70 70 65 6e 64 20 63  ..      append c
f5d0: 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 54 6f 46 75  onnection {;ToFu
f5e0: 6c 6c 50 61 74 68 3d 24 7b 71 75 61 6c 69 66 79  llPath=${qualify
f5f0: 7d 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  }}....      #.. 
f600: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
f610: 6f 75 72 20 63 61 6c 6c 65 72 20 73 70 65 63 69  our caller speci
f620: 66 69 65 64 20 61 20 6a 6f 75 72 6e 61 6c 20 6d  fied a journal m
f630: 6f 64 65 2c 20 61 64 64 20 74 68 65 20 6e 65 63  ode, add the nec
f640: 65 73 73 61 72 79 20 70 6f 72 74 69 6f 6e 0d 0a  essary portion..
f650: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 66        #       of
f660: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
f670: 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20  string now...   
f680: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
f690: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
f6a0: 6d 6f 64 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  mode] > 0} then 
f6b0: 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  {..        appen
f6c0: 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 4a  d connection {;J
f6d0: 6f 75 72 6e 61 6c 20 4d 6f 64 65 3d 24 7b 6d 6f  ournal Mode=${mo
f6e0: 64 65 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  de}}..      }...
f6f0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
f700: 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20 63  # NOTE: If our c
f710: 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64 20  aller specified 
f720: 61 20 44 61 74 65 54 69 6d 65 20 66 6f 72 6d 61  a DateTime forma
f730: 74 2c 20 61 64 64 20 74 68 65 20 6e 65 63 65 73  t, add the neces
f740: 73 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20  sary..      #   
f750: 20 20 20 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74      portion of t
f760: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74  he connection st
f770: 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  ring now...     
f780: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   #..      if {[s
f790: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 64 61  tring length $da
f7a0: 74 65 54 69 6d 65 46 6f 72 6d 61 74 5d 20 3e 20  teTimeFormat] > 
f7b0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
f7c0: 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63     append connec
f7d0: 74 69 6f 6e 20 7b 3b 44 61 74 65 54 69 6d 65 46  tion {;DateTimeF
f7e0: 6f 72 6d 61 74 3d 24 7b 64 61 74 65 54 69 6d 65  ormat=${dateTime
f7f0: 46 6f 72 6d 61 74 7d 7d 0d 0a 20 20 20 20 20 20  Format}}..      
f800: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
f810: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f      # NOTE: If o
f820: 75 72 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66  ur caller specif
f830: 69 65 64 20 61 20 44 61 74 65 54 69 6d 65 4b 69  ied a DateTimeKi
f840: 6e 64 2c 20 61 64 64 20 74 68 65 20 6e 65 63 65  nd, add the nece
f850: 73 73 61 72 79 20 70 6f 72 74 69 6f 6e 0d 0a 20  ssary portion.. 
f860: 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 66 20       #       of 
f870: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  the connection s
f880: 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20  tring now...    
f890: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
f8a0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 64  string length $d
f8b0: 61 74 65 54 69 6d 65 4b 69 6e 64 5d 20 3e 20 30  ateTimeKind] > 0
f8c0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
f8d0: 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74    append connect
f8e0: 69 6f 6e 20 7b 3b 44 61 74 65 54 69 6d 65 4b 69  ion {;DateTimeKi
f8f0: 6e 64 3d 24 7b 64 61 74 65 54 69 6d 65 4b 69 6e  nd=${dateTimeKin
f900: 64 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  d}}..      }....
f910: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
f920: 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f 75   NOTE: Figure ou
f930: 74 20 77 68 61 74 20 74 68 65 20 66 69 6e 61 6c  t what the final
f940: 20 66 6c 61 67 73 20 66 6f 72 20 74 68 69 73 20   flags for this 
f950: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 65 65 64 20  connection need 
f960: 74 6f 20 62 65 2e 0d 0a 20 20 20 20 20 20 23 0d  to be...      #.
f970: 0a 20 20 20 20 20 20 73 65 74 20 66 6c 61 67 73  .      set flags
f980: 20 5b 67 65 74 43 6f 6e 6e 65 63 74 69 6f 6e 46   [getConnectionF
f990: 6c 61 67 73 20 24 66 69 6c 65 4e 61 6d 65 20 24  lags $fileName $
f9a0: 66 6c 61 67 73 20 24 71 75 69 65 74 5d 0d 0a 0d  flags $quiet]...
f9b0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
f9c0: 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20 63  # NOTE: If our c
f9d0: 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64 20  aller specified 
f9e0: 73 6f 6d 65 20 53 51 4c 69 74 65 43 6f 6e 6e 65  some SQLiteConne
f9f0: 63 74 69 6f 6e 46 6c 61 67 73 2c 20 61 64 64 20  ctionFlags, add 
fa00: 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
fa10: 20 20 20 6e 65 63 65 73 73 61 72 79 20 70 6f 72     necessary por
fa20: 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6e 6e  tion of the conn
fa30: 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f  ection string no
fa40: 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  w...      #..   
fa50: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
fa60: 65 6e 67 74 68 20 24 66 6c 61 67 73 5d 20 3e 20  ength $flags] > 
fa70: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
fa80: 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63     append connec
fa90: 74 69 6f 6e 20 7b 3b 46 6c 61 67 73 3d 24 7b 66  tion {;Flags=${f
faa0: 6c 61 67 73 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d  lags}}..      }.
fab0: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
fac0: 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72    # NOTE: If our
fad0: 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65   caller specifie
fae0: 64 20 61 6e 20 65 78 74 72 61 20 70 61 79 6c 6f  d an extra paylo
faf0: 61 64 20 74 6f 20 74 68 65 20 63 6f 6e 6e 65 63  ad to the connec
fb00: 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  tion..      #   
fb10: 20 20 20 20 73 74 72 69 6e 67 2c 20 61 70 70 65      string, appe
fb20: 6e 64 20 69 74 20 6e 6f 77 2e 0d 0a 20 20 20 20  nd it now...    
fb30: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
fb40: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 65  string length $e
fb50: 78 74 72 61 5d 20 3e 20 30 7d 20 74 68 65 6e 20  xtra] > 0} then 
fb60: 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  {..        appen
fb70: 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 3b 20  d connection \; 
fb80: 24 65 78 74 72 61 0d 0a 20 20 20 20 20 20 7d 0d  $extra..      }.
fb90: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
fba0: 20 20 23 20 4e 4f 54 45 3a 20 4f 70 65 6e 20 74    # NOTE: Open t
fbb0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
fbc0: 65 63 74 69 6f 6e 20 6e 6f 77 2c 20 70 6c 61 63  ection now, plac
fbd0: 69 6e 67 20 74 68 65 20 6f 70 61 71 75 65 20 68  ing the opaque h
fbe0: 61 6e 64 6c 65 20 76 61 6c 75 65 0d 0a 20 20 20  andle value..   
fbf0: 20 20 20 23 20 20 20 20 20 20 20 69 6e 74 6f 20     #       into 
fc00: 74 68 65 20 76 61 72 69 61 62 6c 65 20 73 70 65  the variable spe
fc10: 63 69 66 69 65 64 20 62 79 20 6f 75 72 20 63 61  cified by our ca
fc20: 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ller...      #..
fc30: 20 20 20 20 20 20 73 65 74 20 64 62 20 5b 73 71        set db [sq
fc40: 6c 20 6f 70 65 6e 20 2d 74 79 70 65 20 53 51 4c  l open -type SQL
fc50: 69 74 65 20 5b 73 75 62 73 74 20 24 63 6f 6e 6e  ite [subst $conn
fc60: 65 63 74 69 6f 6e 5d 5d 0d 0a 0d 0a 20 20 20 20  ection]]....    
fc70: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
fc80: 45 3a 20 43 6f 6e 66 69 67 75 72 65 20 74 68 65  E: Configure the
fc90: 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63   temporary direc
fca0: 74 6f 72 79 20 66 6f 72 20 74 68 65 20 6e 65 77  tory for the new
fcb0: 6c 79 20 6f 70 65 6e 65 64 20 64 61 74 61 62 61  ly opened databa
fcc0: 73 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  se..      #     
fcd0: 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 77    connection now
fce0: 20 75 6e 6c 65 73 73 20 6f 75 72 20 63 61 6c 6c   unless our call
fcf0: 65 72 20 66 6f 72 62 69 64 73 20 69 74 2e 0d 0a  er forbids it...
fd00: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
fd10: 66 20 7b 24 74 65 6d 70 6f 72 61 72 79 20 26 26  f {$temporary &&
fd20: 20 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   ![info exists :
fd30: 3a 6e 6f 28 73 65 74 54 65 6d 70 6f 72 61 72 79  :no(setTemporary
fd40: 44 69 72 65 63 74 6f 72 79 29 5d 7d 20 74 68 65  Directory)]} the
fd50: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 71 6c  n {..        sql
fd60: 20 65 78 65 63 75 74 65 20 24 64 62 20 5b 61 70   execute $db [ap
fd70: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
fd80: 20 20 20 20 20 20 20 20 22 50 52 41 47 4d 41 20          "PRAGMA 
fd90: 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63  temp_store_direc
fda0: 74 6f 72 79 20 3d 20 5c 22 22 20 5b 67 65 74 54  tory = \"" [getT
fdb0: 65 6d 70 6f 72 61 72 79 44 69 72 65 63 74 6f 72  emporaryDirector
fdc0: 79 5d 20 5c 22 5c 3b 5d 0d 0a 20 20 20 20 20 20  y] \"\;]..      
fdd0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
fde0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 6c 77 61      # NOTE: Alwa
fdf0: 79 73 20 72 65 74 75 72 6e 20 74 68 65 20 63 6f  ys return the co
fe00: 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20  nnection handle 
fe10: 75 70 6f 6e 20 73 75 63 63 65 73 73 2e 0d 0a 20  upon success... 
fe20: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
fe30: 74 75 72 6e 20 24 64 62 0d 0a 20 20 20 20 7d 0d  turn $db..    }.
fe40: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
fe50: 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20 7b  DbConnection { {
fe60: 76 61 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b 0d  varName db} } {.
fe70: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
fe80: 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f  # NOTE: Refer to
fe90: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76   the specified v
fea0: 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64  ariable (e.g. "d
feb0: 62 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  b") in the conte
fec0: 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20  xt of our..     
fed0: 20 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e   #       caller.
fee0: 20 20 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20    The handle to 
fef0: 74 68 65 20 64 61 74 61 62 61 73 65 20 70 72 65  the database pre
ff00: 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 76  viously opened v
ff10: 69 61 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  ia the..      # 
ff20: 20 20 20 20 20 20 5b 73 65 74 75 70 44 62 5d 20        [setupDb] 
ff30: 70 72 6f 63 65 64 75 72 65 20 73 68 6f 75 6c 64  procedure should
ff40: 20 62 65 20 73 74 6f 72 65 64 20 74 68 65 72 65   be stored there
ff50: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
ff60: 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
ff70: 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23  me db....      #
ff80: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
ff90: 54 68 69 73 20 72 65 74 75 72 6e 73 20 74 68 65  This returns the
ffa0: 20 41 44 4f 2e 4e 45 54 20 49 44 62 43 6f 6e 6e   ADO.NET IDbConn
ffb0: 65 63 74 69 6f 6e 20 6f 62 6a 65 63 74 20 69 6e  ection object in
ffc0: 73 74 61 6e 63 65 20 66 6f 72 20 74 68 65 0d 0a  stance for the..
ffd0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 70        #       sp
ffe0: 65 63 69 66 69 65 64 20 64 61 74 61 62 73 65 20  ecified databse 
fff0: 68 61 6e 64 6c 65 2e 20 20 53 69 6e 63 65 20 67  handle.  Since g
10000 65 74 74 69 6e 67 20 74 68 69 73 20 6f 62 6a 65  etting this obje
10010 63 74 20 72 65 6c 69 65 73 20 75 70 6f 6e 0d 0a  ct relies upon..
10020 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61        #       Ea
10030 67 6c 65 20 69 6e 74 65 72 6e 61 6c 73 2c 20 67  gle internals, g
10040 72 65 61 74 20 63 61 72 65 20 73 68 6f 75 6c 64  reat care should
10050 20 62 65 20 74 61 6b 65 6e 20 74 6f 20 61 76 6f   be taken to avo
10060 69 64 20 64 69 73 70 6f 73 69 6e 67 20 6f 66 0d  id disposing of.
10070 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
10080 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 6f 74  his object or ot
10090 68 65 72 77 69 73 65 20 70 75 74 74 69 6e 67 20  herwise putting 
100a0 69 74 20 69 6e 74 6f 20 61 6e 20 69 6e 76 61 6c  it into an inval
100b0 69 64 20 73 74 61 74 65 2e 0d 0a 20 20 20 20 20  id state...     
100c0 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
100d0 6e 66 6f 20 65 78 69 73 74 73 20 64 62 5d 7d 20  nfo exists db]} 
100e0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
100f0 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
10100 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
10110 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
10120 6e 50 75 62 6c 69 63 20 2d 6f 62 6a 65 63 74 66  nPublic -objectf
10130 6c 61 67 73 20 2b 4e 6f 44 69 73 70 6f 73 65 20  lags +NoDispose 
10140 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20 20  -alias \..      
10150 20 20 20 20 20 20 20 20 49 6e 74 65 72 70 72 65          Interpre
10160 74 65 72 2e 47 65 74 41 63 74 69 76 65 2e 63 6f  ter.GetActive.co
10170 6e 6e 65 63 74 69 6f 6e 73 20 49 74 65 6d 20 24  nnections Item $
10180 64 62 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65  db..        } re
10190 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sult] == 0} then
101a0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
101b0 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
101c0 45 3a 20 53 75 63 63 65 73 73 2c 20 72 65 74 75  E: Success, retu
101d0 72 6e 20 74 68 65 20 6f 70 61 71 75 65 20 6f 62  rn the opaque ob
101e0 6a 65 63 74 20 68 61 6e 64 6c 65 2e 0d 0a 20 20  ject handle...  
101f0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
10200 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73       return $res
10210 75 6c 74 0d 0a 20 20 20 20 20 20 20 20 7d 20 65  ult..        } e
10220 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
10230 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
10240 4e 4f 54 45 3a 20 46 61 69 6c 75 72 65 2c 20 72  NOTE: Failure, r
10250 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20  eport why...    
10260 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
10270 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
10280 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
10290 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
102a0 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
102b0 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 67  ING: failed to g
102c0 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  et connection ha
102d0 6e 64 6c 65 20 66 6f 72 20 64 61 74 61 62 61 73  ndle for databas
102e0 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  e \"" \..       
102f0 20 20 20 20 20 20 20 24 64 62 20 22 5c 22 2c 20         $db "\", 
10300 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72  error: " \n\t $r
10310 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20  esult \n]..     
10320 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20     }..      }.. 
10330 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
10340 63 20 66 72 65 65 44 62 43 6f 6e 6e 65 63 74 69  c freeDbConnecti
10350 6f 6e 20 7b 20 7b 76 61 72 4e 61 6d 65 20 63 6f  on { {varName co
10360 6e 6e 65 63 74 69 6f 6e 7d 20 7d 20 7b 0d 0a 20  nnection} } {.. 
10370 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
10380 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74  NOTE: Refer to t
10390 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72  he specified var
103a0 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 63 6f 6e  iable (e.g. "con
103b0 6e 65 63 74 69 6f 6e 22 29 20 69 6e 20 74 68 65  nection") in the
103c0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
103d0 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 20 63  context of our c
103e0 61 6c 6c 65 72 2e 20 20 54 68 65 20 6f 70 61 71  aller.  The opaq
103f0 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65  ue object handle
10400 20 66 6f 72 20 61 6e 20 41 44 4f 2e 4e 45 54 0d   for an ADO.NET.
10410 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
10420 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 65 76 69 6f  onnection previo
10430 75 73 6c 79 20 72 65 74 75 72 6e 65 64 20 62 79  usly returned by
10440 20 5b 67 65 74 44 62 43 6f 6e 6e 65 63 74 69 6f   [getDbConnectio
10450 6e 5d 20 73 68 6f 75 6c 64 20 62 65 0d 0a 20 20  n] should be..  
10460 20 20 20 20 23 20 20 20 20 20 20 20 73 74 6f 72      #       stor
10470 65 64 20 74 68 65 72 65 2e 0d 0a 20 20 20 20 20  ed there...     
10480 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20   #..      upvar 
10490 31 20 24 76 61 72 4e 61 6d 65 20 63 6f 6e 6e 65  1 $varName conne
104a0 63 74 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 23  ction....      #
104b0 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
104c0 41 74 74 65 6d 70 74 20 74 6f 20 72 65 6d 6f 76  Attempt to remov
104d0 65 20 74 68 65 20 6f 70 61 71 75 65 20 6f 62 6a  e the opaque obj
104e0 65 63 74 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20  ect handle from 
104f0 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 0d  the interpreter.
10500 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e  .      #       n
10510 6f 77 2e 20 20 54 68 69 73 20 5b 6f 62 6a 65 63  ow.  This [objec
10520 74 20 64 69 73 70 6f 73 65 5d 20 63 61 6c 6c 20  t dispose] call 
10530 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c  will not actuall
10540 79 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65  y dispose of the
10550 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
10560 75 6e 64 65 72 6c 79 69 6e 67 20 6f 62 6a 65 63  underlying objec
10570 74 20 62 65 63 61 75 73 65 20 74 68 65 20 2b 4e  t because the +N
10580 6f 44 69 73 70 6f 73 65 20 66 6c 61 67 20 77 61  oDispose flag wa
10590 73 20 73 65 74 20 6f 6e 20 69 74 0d 0a 20 20 20  s set on it..   
105a0 20 20 20 23 20 20 20 20 20 20 20 64 75 72 69 6e     #       durin
105b0 67 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68  g creation of th
105c0 65 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74 20  e opaque object 
105d0 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 23  handle...      #
105e0 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
105f0 6f 20 65 78 69 73 74 73 20 63 6f 6e 6e 65 63 74  o exists connect
10600 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ion] && \..     
10610 20 20 20 20 20 5b 63 61 74 63 68 20 7b 6f 62 6a       [catch {obj
10620 65 63 74 20 64 69 73 70 6f 73 65 20 24 63 6f 6e  ect dispose $con
10630 6e 65 63 74 69 6f 6e 7d 20 65 72 72 6f 72 5d 7d  nection} error]}
10640 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
10650 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
10660 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20 66  TE: We somehow f
10670 61 69 6c 65 64 20 74 6f 20 72 65 6d 6f 76 65 20  ailed to remove 
10680 74 68 65 20 68 61 6e 64 6c 65 2c 20 72 65 70 6f  the handle, repo
10690 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20  rt why...       
106a0 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   #..        tput
106b0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
106c0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
106d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d  .            "==
106e0 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
106f0 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 63 6f 6e  ed to remove con
10700 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 5c  nection handle \
10710 22 22 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c  "" $connection \
10720 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 5c  ..            "\
10730 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  ", error: " \n\t
10740 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20   $error \n]..   
10750 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
10760 20 20 20 20 70 72 6f 63 20 61 64 64 44 62 43 6f      proc addDbCo
10770 6e 6e 65 63 74 69 6f 6e 20 7b 20 63 6f 6e 6e 65  nnection { conne
10780 63 74 69 6f 6e 20 7b 76 61 72 4e 61 6d 65 20 64  ction {varName d
10790 62 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  b} } {..      #.
107a0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
107b0 65 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63  efer to the spec
107c0 69 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28  ified variable (
107d0 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68  e.g. "db") in th
107e0 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72  e context of our
107f0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
10800 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23  caller...      #
10810 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20  ..      upvar 1 
10820 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20  $varName db.... 
10830 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
10840 4e 4f 54 45 3a 20 43 72 65 61 74 65 20 61 20 63  NOTE: Create a c
10850 6f 72 72 65 63 74 6c 79 20 66 6f 72 6d 61 74 74  orrectly formatt
10860 65 64 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  ed name for the 
10870 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
10880 69 6f 6e 20 74 6f 0d 0a 20 20 20 20 20 20 23 20  ion to..      # 
10890 20 20 20 20 20 20 62 65 20 61 64 64 65 64 20 74        be added t
108a0 6f 20 74 68 65 20 6c 69 73 74 20 6d 61 6e 61 67  o the list manag
108b0 65 64 20 62 79 20 74 68 65 20 45 61 67 6c 65 20  ed by the Eagle 
108c0 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20  interpreter...  
108d0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
108e0 20 64 62 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f   db [object invo
108f0 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
10900 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
10910 20 20 45 61 67 6c 65 2e 5f 43 6f 6d 70 6f 6e 65    Eagle._Compone
10920 6e 74 73 2e 50 72 69 76 61 74 65 2e 46 6f 72 6d  nts.Private.Form
10930 61 74 4f 70 73 20 44 61 74 61 62 61 73 65 4f 62  atOps DatabaseOb
10940 6a 65 63 74 4e 61 6d 65 20 24 63 6f 6e 6e 65 63  jectName $connec
10950 74 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  tion \..        
10960 20 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69    SQLiteConnecti
10970 6f 6e 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b  on [object invok
10980 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65  e Interpreter.Ge
10990 74 41 63 74 69 76 65 20 4e 65 78 74 49 64 5d 5d  tActive NextId]]
109a0 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
109b0 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 74     # NOTE: Add t
109c0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
109d0 65 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 64 20  ection provided 
109e0 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 20 74 6f  by our caller to
109f0 20 74 68 65 20 6c 69 73 74 0d 0a 20 20 20 20 20   the list..     
10a00 20 23 20 20 20 20 20 20 20 6f 66 20 74 68 6f 73   #       of thos
10a10 65 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 65 20 45  e known to the E
10a20 61 67 6c 65 20 69 6e 74 65 72 70 72 65 74 65 72  agle interpreter
10a30 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
10a40 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
10a50 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
10a60 63 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65  c Interpreter.Ge
10a70 74 41 63 74 69 76 65 2e 63 6f 6e 6e 65 63 74 69  tActive.connecti
10a80 6f 6e 73 20 41 64 64 20 5c 0d 0a 20 20 20 20 20  ons Add \..     
10a90 20 20 20 20 20 24 64 62 20 24 63 6f 6e 6e 65 63       $db $connec
10aa0 74 69 6f 6e 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  tion..    }.....
10ab0 20 20 20 20 70 72 6f 63 20 63 6c 65 61 6e 75 70      proc cleanup
10ac0 44 62 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 76  Db { fileName {v
10ad0 61 72 4e 61 6d 65 20 64 62 7d 20 7b 63 6f 6c 6c  arName db} {coll
10ae0 65 63 74 20 74 72 75 65 7d 20 7b 71 75 61 6c 69  ect true} {quali
10af0 66 79 20 74 72 75 65 7d 0d 0a 20 20 20 20 20 20  fy true}..      
10b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
10b10 64 65 6c 65 74 65 20 74 72 75 65 7d 20 7d 20 7b  delete true} } {
10b20 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
10b30 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
10b40 20 74 6f 20 66 6f 72 63 65 20 61 6c 6c 20 70 65   to force all pe
10b50 6e 64 69 6e 67 20 22 67 61 72 62 61 67 65 22 20  nding "garbage" 
10b60 6f 62 6a 65 63 74 73 20 74 6f 20 62 65 20 63 6f  objects to be co
10b70 6c 6c 65 63 74 65 64 2c 0d 0a 20 20 20 20 20 20  llected,..      
10b80 23 20 20 20 20 20 20 20 69 6e 63 6c 75 64 69 6e  #       includin
10b90 67 20 53 51 4c 69 74 65 20 73 74 61 74 65 6d 65  g SQLite stateme
10ba0 6e 74 73 20 61 6e 64 20 62 61 63 6b 75 70 20 6f  nts and backup o
10bb0 62 6a 65 63 74 73 3b 20 74 68 69 73 20 73 68 6f  bjects; this sho
10bc0 75 6c 64 20 61 6c 6c 6f 77 0d 0a 20 20 20 20 20  uld allow..     
10bd0 20 23 20 20 20 20 20 20 20 74 68 65 20 75 6e 64   #       the und
10be0 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
10bf0 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65   file to be dele
10c00 74 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ted...      #.. 
10c10 20 20 20 20 20 69 66 20 7b 24 63 6f 6c 6c 65 63       if {$collec
10c20 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
10c30 20 20 20 63 6f 6c 6c 65 63 74 47 61 72 62 61 67     collectGarbag
10c40 65 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  e $::test_channe
10c50 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  l..      }....  
10c60 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
10c70 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68  OTE: Refer to th
10c80 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72 69  e specified vari
10c90 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22 29  able (e.g. "db")
10ca0 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20   in the context 
10cb0 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23 20  of our..      # 
10cc0 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20 20 54        caller.  T
10cd0 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 74 68 65  he handle to the
10ce0 20 64 61 74 61 62 61 73 65 20 70 72 65 76 69 6f   database previo
10cf0 75 73 6c 79 20 6f 70 65 6e 65 64 20 76 69 61 20  usly opened via 
10d00 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
10d10 20 20 20 5b 73 65 74 75 70 44 62 5d 20 70 72 6f     [setupDb] pro
10d20 63 65 64 75 72 65 20 73 68 6f 75 6c 64 20 62 65  cedure should be
10d30 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a   stored there...
10d40 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75        #..      u
10d50 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20  pvar 1 $varName 
10d60 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  db....      #.. 
10d70 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6c 6f       # NOTE: Clo
10d80 73 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  se the connectio
10d90 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
10da0 65 20 6e 6f 77 2e 20 20 54 68 69 73 20 73 68 6f  e now.  This sho
10db0 75 6c 64 20 61 6c 6c 6f 77 20 75 73 0d 0a 20 20  uld allow us..  
10dc0 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 64      #       to d
10dd0 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c  elete the underl
10de0 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
10df0 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  le...      #..  
10e00 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
10e10 69 73 74 73 20 64 62 5d 20 26 26 20 5b 63 61 74  ists db] && [cat
10e20 63 68 20 7b 73 71 6c 20 63 6c 6f 73 65 20 24 64  ch {sql close $d
10e30 62 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20  b} error]} then 
10e40 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
10e50 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65        # NOTE: We
10e60 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20   somehow failed 
10e70 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 64 61 74  to close the dat
10e80 61 62 61 73 65 2c 20 72 65 70 6f 72 74 20 77 68  abase, report wh
10e90 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  y...        #.. 
10ea0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
10eb0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
10ec0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
10ed0 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
10ee0 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
10ef0 20 63 6c 6f 73 65 20 64 61 74 61 62 61 73 65 20   close database 
10f00 5c 22 22 20 24 64 62 20 22 5c 22 2c 20 65 72 72  \"" $db "\", err
10f10 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  or: " \..       
10f20 20 20 20 20 20 5c 6e 5c 74 20 24 65 72 72 6f 72       \n\t $error
10f30 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d   \n]..      }...
10f40 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
10f50 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20 73  # NOTE: First, s
10f60 65 65 20 69 66 20 6f 75 72 20 63 61 6c 6c 65 72  ee if our caller
10f70 20 68 61 73 20 72 65 71 75 65 73 74 65 64 20 61   has requested a
10f80 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
10f90 62 61 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  base...      #..
10fa0 20 20 20 20 20 20 73 65 74 20 69 73 4d 65 6d 6f        set isMemo
10fb0 72 79 20 5b 69 73 4d 65 6d 6f 72 79 44 62 20 24  ry [isMemoryDb $
10fc0 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20  fileName]....   
10fd0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
10fe0 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 66 75  TE: Build the fu
10ff0 6c 6c 20 70 61 74 68 20 74 6f 20 74 68 65 20 64  ll path to the d
11000 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
11010 65 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 61 6c 6c  e.  For now, all
11020 20 74 65 73 74 0d 0a 20 20 20 20 20 20 23 20 20   test..      #  
11030 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
11040 6c 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 69  les are stored i
11050 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  n the temporary 
11060 64 69 72 65 63 74 6f 72 79 2e 0d 0a 20 20 20 20  directory...    
11070 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21    #..      if {!
11080 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24 71 75  $isMemory && $qu
11090 61 6c 69 66 79 7d 20 74 68 65 6e 20 7b 0d 0a 20  alify} then {.. 
110a0 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e         set fileN
110b0 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b  ame [file join [
110c0 67 65 74 44 61 74 61 62 61 73 65 44 69 72 65 63  getDatabaseDirec
110d0 74 6f 72 79 5d 20 5b 66 69 6c 65 20 74 61 69 6c  tory] [file tail
110e0 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20   $fileName]]..  
110f0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
11100 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
11110 43 68 65 63 6b 20 69 66 20 74 68 65 20 66 69 6c  Check if the fil
11120 65 20 73 74 69 6c 6c 20 65 78 69 73 74 73 2e 0d  e still exists..
11130 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
11140 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72 79 20 26  if {!$isMemory &
11150 26 20 24 64 65 6c 65 74 65 20 26 26 20 5b 66 69  & $delete && [fi
11160 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e  le exists $fileN
11170 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
11180 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
11190 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 64 65   # NOTE: Skip de
111a0 6c 65 74 69 6e 67 20 64 61 74 61 62 61 73 65 20  leting database 
111b0 66 69 6c 65 73 20 69 66 20 73 6f 6d 65 62 6f 64  files if somebod
111c0 79 20 73 65 74 73 20 74 68 65 20 67 6c 6f 62 61  y sets the globa
111d0 6c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  l..        #    
111e0 20 20 20 76 61 72 69 61 62 6c 65 20 74 6f 20 70     variable to p
111f0 72 65 76 65 6e 74 20 69 74 2e 0d 0a 20 20 20 20  revent it...    
11200 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
11210 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
11220 20 3a 3a 6e 6f 28 63 6c 65 61 6e 75 70 44 62 46   ::no(cleanupDbF
11230 69 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ile)]} then {.. 
11240 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
11250 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74        # NOTE: At
11260 74 65 6d 70 74 20 74 6f 20 64 65 6c 65 74 65 20  tempt to delete 
11270 74 68 65 20 74 65 73 74 20 64 61 74 61 62 61 73  the test databas
11280 65 20 66 69 6c 65 20 6e 6f 77 2e 0d 0a 20 20 20  e file now...   
11290 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
112a0 20 20 20 20 69 66 20 7b 5b 73 65 74 20 63 6f 64      if {[set cod
112b0 65 20 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64  e [catch {file d
112c0 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d  elete $fileName}
112d0 20 65 72 72 6f 72 5d 5d 7d 20 74 68 65 6e 20 7b   error]]} then {
112e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
112f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
11300 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20  OTE: We somehow 
11310 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65  failed to delete
11320 20 74 68 65 20 66 69 6c 65 2c 20 72 65 70 6f 72   the file, repor
11330 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20  t why...        
11340 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
11350 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
11360 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
11370 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
11380 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
11390 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
113a0 20 64 65 6c 65 74 65 20 64 61 74 61 62 61 73 65   delete database
113b0 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e   file \"" $fileN
113c0 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
113d0 20 20 20 20 20 20 20 22 5c 22 20 64 75 72 69 6e         "\" durin
113e0 67 20 63 6c 65 61 6e 75 70 2c 20 65 72 72 6f 72  g cleanup, error
113f0 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20  : " \n\t $error 
11400 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
11410 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
11420 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
11430 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
11440 45 3a 20 53 68 6f 77 20 74 68 61 74 20 77 65 20  E: Show that we 
11450 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67  skipped deleting
11460 20 74 68 65 20 66 69 6c 65 2e 0d 0a 20 20 20 20   the file...    
11470 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
11480 20 20 20 73 65 74 20 63 6f 64 65 20 30 0d 0a 0d     set code 0...
11490 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
114a0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
114b0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
114c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
114d0 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 73 6b 69  === WARNING: ski
114e0 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20 64 61  pped deleting da
114f0 74 61 62 61 73 65 20 66 69 6c 65 20 5c 22 22 20  tabase file \"" 
11500 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20  $fileName \..   
11510 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 64             "\" d
11520 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 5c 6e 22  uring cleanup\n"
11530 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
11540 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
11550 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
11560 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 66 69 6c   # NOTE: The fil
11570 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
11580 2c 20 73 75 63 63 65 73 73 21 0d 0a 20 20 20 20  , success!..    
11590 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
115a0 65 74 20 63 6f 64 65 20 30 0d 0a 20 20 20 20 20  et code 0..     
115b0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
115c0 72 6e 20 24 63 6f 64 65 0d 0a 20 20 20 20 7d 0d  rn $code..    }.
115d0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 65 74  ....    proc set
115e0 75 70 44 62 49 6e 74 65 72 72 75 70 74 43 61 6c  upDbInterruptCal
115f0 6c 62 61 63 6b 20 7b 20 63 68 61 6e 6e 65 6c 20  lback { channel 
11600 6c 6f 67 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74  log } {..      t
11610 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
11620 2d 2d 2d 20 73 65 74 74 69 6e 67 20 75 70 20 64  --- setting up d
11630 65 62 75 67 67 65 72 20 69 6e 74 65 72 72 75 70  ebugger interrup
11640 74 20 63 61 6c 6c 62 61 63 6b 2e 2e 2e 20 22 0d  t callback... ".
11650 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  ...      if {[ca
11660 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  tch {..        #
11670 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
11680 3a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  : Make sure the 
11690 73 63 72 69 70 74 20 64 65 62 75 67 67 65 72 20  script debugger 
116a0 61 6e 64 20 74 68 65 20 69 73 6f 6c 61 74 65 64  and the isolated
116b0 20 69 6e 74 65 72 70 72 65 74 65 72 20 61 72 65   interpreter are
116c0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
116d0 20 20 73 65 74 75 70 20 61 6e 64 20 72 65 61 64    setup and read
116e0 79 20 66 6f 72 20 75 73 65 2e 0d 0a 20 20 20 20  y for use...    
116f0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 64      #..        d
11700 65 62 75 67 20 73 65 74 75 70 20 74 72 75 65 20  ebug setup true 
11710 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20  true....        
11720 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
11730 45 3a 20 4c 6f 61 64 20 74 68 65 20 6e 65 63 65  E: Load the nece
11740 73 73 61 72 79 20 70 61 63 6b 61 67 65 73 20 69  ssary packages i
11750 6e 74 6f 20 74 68 65 20 69 73 6f 6c 61 74 65 64  nto the isolated
11760 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20   interpreter... 
11770 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
11780 20 20 64 65 62 75 67 20 65 76 61 6c 20 7b 0d 0a    debug eval {..
11790 20 20 20 20 20 20 20 20 20 20 70 61 63 6b 61 67            packag
117a0 65 20 72 65 71 75 69 72 65 20 45 61 67 6c 65 0d  e require Eagle.
117b0 0a 20 20 20 20 20 20 20 20 20 20 70 61 63 6b 61  .          packa
117c0 67 65 20 72 65 71 75 69 72 65 20 45 61 67 6c 65  ge require Eagle
117d0 2e 4c 69 62 72 61 72 79 0d 0a 20 20 20 20 20 20  .Library..      
117e0 20 20 20 20 70 61 63 6b 61 67 65 20 72 65 71 75      package requ
117f0 69 72 65 20 45 61 67 6c 65 2e 54 65 73 74 0d 0a  ire Eagle.Test..
11800 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
11810 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
11820 23 20 4e 4f 54 45 3a 20 43 6f 70 79 20 74 68 65  # NOTE: Copy the
11830 20 6e 65 63 65 73 73 61 72 79 20 76 61 72 69 61   necessary varia
11840 62 6c 65 73 20 69 6e 74 6f 20 74 68 65 20 69 73  bles into the is
11850 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72 65 74  olated interpret
11860 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  er...        #..
11870 20 20 20 20 20 20 20 20 64 65 62 75 67 20 69 6e          debug in
11880 76 6f 6b 65 20 30 20 73 65 74 20 3a 3a 74 65 73  voke 0 set ::tes
11890 74 5f 63 68 61 6e 6e 65 6c 20 24 63 68 61 6e 6e  t_channel $chann
118a0 65 6c 3b 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20  el; # NOTE: For 
118b0 5b 74 70 75 74 73 5d 2e 0d 0a 20 20 20 20 20 20  [tputs]...      
118c0 20 20 64 65 62 75 67 20 69 6e 76 6f 6b 65 20 30    debug invoke 0
118d0 20 73 65 74 20 3a 3a 74 65 73 74 5f 6c 6f 67 20   set ::test_log 
118e0 24 6c 6f 67 3b 20 23 20 4e 4f 54 45 3a 20 46 6f  $log; # NOTE: Fo
118f0 72 20 5b 74 6c 6f 67 5d 2e 0d 0a 0d 0a 20 20 20  r [tlog].....   
11900 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
11910 23 20 4e 4f 54 45 3a 20 49 6e 73 74 61 6c 6c 20  # NOTE: Install 
11920 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 73 63 72  the callback scr
11930 69 70 74 20 74 6f 20 62 65 20 65 76 61 6c 75 61  ipt to be evalua
11940 74 65 64 20 69 6e 20 74 68 65 20 69 73 6f 6c 61  ted in the isola
11950 74 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ted..        #  
11960 20 20 20 20 20 69 6e 74 65 72 70 72 65 74 65 72       interpreter
11970 20 77 68 65 6e 20 74 68 69 73 20 69 6e 74 65 72   when this inter
11980 70 72 65 74 65 72 20 69 73 20 69 6e 74 65 72 72  preter is interr
11990 75 70 74 65 64 20 62 79 20 73 63 72 69 70 74 0d  upted by script.
119a0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
119b0 20 63 61 6e 63 65 6c 6c 61 74 69 6f 6e 2c 20 65   cancellation, e
119c0 74 63 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  tc...        #..
119d0 20 20 20 20 20 20 20 20 64 65 62 75 67 20 63 61          debug ca
119e0 6c 6c 62 61 63 6b 20 61 70 70 6c 79 20 7b 7b 73  llback apply {{s
119f0 65 6e 64 65 72 20 65 7d 20 7b 0d 0a 20 20 20 20  ender e} {..    
11a00 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
11a10 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
11a20 20 69 66 20 74 68 69 73 20 63 61 6c 6c 62 61 63   if this callbac
11a30 6b 20 69 73 20 6f 6e 65 20 74 68 61 74 20 77 65  k is one that we
11a40 20 63 61 72 65 20 61 62 6f 75 74 2e 0d 0a 20 20   care about...  
11a50 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
11a60 20 20 20 20 20 69 66 20 7b 22 43 61 6e 63 65 6c       if {"Cancel
11a70 65 64 22 20 69 6e 20 5b 73 70 6c 69 74 20 5b 24  ed" in [split [$
11a80 65 20 49 6e 74 65 72 72 75 70 74 54 79 70 65 5d  e InterruptType]
11a90 20 22 2c 20 22 5d 7d 20 74 68 65 6e 20 7b 0d 0a   ", "]} then {..
11aa0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
11ab0 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
11ac0 45 3a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75  E: Iterate throu
11ad0 67 68 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20  gh all database 
11ae0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6b 6e 6f 77  connections know
11af0 6e 20 74 6f 20 74 68 65 0d 0a 20 20 20 20 20 20  n to the..      
11b00 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 61        #       pa
11b10 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72  rent interpreter
11b20 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
11b30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 62  ..            ob
11b40 6a 65 63 74 20 66 6f 72 65 61 63 68 20 2d 61 6c  ject foreach -al
11b50 69 61 73 20 70 61 69 72 20 5c 0d 0a 20 20 20 20  ias pair \..    
11b60 20 20 20 20 20 20 20 20 20 20 20 20 5b 6f 62 6a              [obj
11b70 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
11b80 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 24 65 20  s +NonPublic $e 
11b90 49 6e 74 65 72 70 72 65 74 65 72 2e 63 6f 6e 6e  Interpreter.conn
11ba0 65 63 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20  ections] {..    
11bb0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
11bc0 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
11bd0 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 63 61  E: Attempt to ca
11be0 6e 63 65 6c 20 61 6e 79 20 53 51 4c 20 71 75 65  ncel any SQL que
11bf0 72 69 65 73 20 69 6e 20 70 72 6f 67 72 65 73 73  ries in progress
11c00 20 6f 6e 20 74 68 69 73 0d 0a 20 20 20 20 20 20   on this..      
11c10 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
11c20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
11c30 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ion...          
11c40 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
11c50 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
11c60 7b 24 70 61 69 72 20 56 61 6c 75 65 2e 43 61 6e  {$pair Value.Can
11c70 63 65 6c 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65  cel} error]} the
11c80 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
11c90 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
11ca0 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
11cb0 6e 64 41 72 67 73 20 5c 6e 20 5c 0d 0a 20 20 20  ndArgs \n \..   
11cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cd0 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
11ce0 66 61 69 6c 65 64 20 74 6f 20 63 61 6e 63 65 6c  failed to cancel
11cf0 20 71 75 65 72 79 20 66 6f 72 20 63 6f 6e 6e 65   query for conne
11d00 63 74 69 6f 6e 20 5c 22 22 20 5c 0d 0a 20 20 20  ction \"" \..   
11d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d20 20 5b 24 70 61 69 72 20 4b 65 79 5d 20 22 5c 22   [$pair Key] "\"
11d30 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  , error: " \n\t 
11d40 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20  $error \n]..    
11d50 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
11d60 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
11d70 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
11d80 20 7d 7d 0d 0a 20 20 20 20 20 20 7d 20 65 72 72   }}..      } err
11d90 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  or] == 0} then {
11da0 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
11db0 73 74 72 61 69 6e 74 20 69 6e 74 65 72 72 75 70  straint interrup
11dc0 74 43 61 6c 6c 62 61 63 6b 2e 73 71 6c 69 74 65  tCallback.sqlite
11dd0 33 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75  3....        tpu
11de0 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c  ts $channel yes\
11df0 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  n..      } else 
11e00 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
11e10 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
11e20 64 41 72 67 73 20 22 6e 6f 2c 20 65 72 72 6f 72  dArgs "no, error
11e30 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20  : " \n\t $error 
11e40 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  \n]..      }..  
11e50 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
11e60 20 63 6c 65 61 6e 75 70 46 69 6c 65 20 7b 20 66   cleanupFile { f
11e70 69 6c 65 4e 61 6d 65 20 7b 63 6f 6c 6c 65 63 74  ileName {collect
11e80 20 74 72 75 65 7d 20 7b 66 6f 72 63 65 20 66 61   true} {force fa
11e90 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  lse} } {..      
11ea0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
11eb0 20 41 74 74 65 6d 70 74 20 74 6f 20 66 6f 72 63   Attempt to forc
11ec0 65 20 61 6c 6c 20 70 65 6e 64 69 6e 67 20 22 67  e all pending "g
11ed0 61 72 62 61 67 65 22 20 6f 62 6a 65 63 74 73 20  arbage" objects 
11ee0 74 6f 20 62 65 20 63 6f 6c 6c 65 63 74 65 64 2c  to be collected,
11ef0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
11f00 69 6e 63 6c 75 64 69 6e 67 20 53 51 4c 69 74 65  including SQLite
11f10 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6e 64 20   statements and 
11f20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 3b 20  backup objects; 
11f30 74 68 69 73 20 73 68 6f 75 6c 64 20 61 6c 6c 6f  this should allo
11f40 77 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  w..      #      
11f50 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
11f60 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
11f70 20 62 65 20 64 65 6c 65 74 65 64 2e 0d 0a 20 20   be deleted...  
11f80 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
11f90 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65 6e 20  {$collect} then 
11fa0 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c 6c 65  {..        colle
11fb0 63 74 47 61 72 62 61 67 65 20 24 3a 3a 74 65 73  ctGarbage $::tes
11fc0 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20  t_channel..     
11fd0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
11fe0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
11ff0 63 6b 20 69 66 20 74 68 65 20 66 69 6c 65 20 73  ck if the file s
12000 74 69 6c 6c 20 65 78 69 73 74 73 2e 0d 0a 20 20  till exists...  
12010 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
12020 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66  {[file exists $f
12030 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
12040 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
12050 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69       # NOTE: Ski
12060 70 20 64 65 6c 65 74 69 6e 67 20 74 65 73 74 20  p deleting test 
12070 66 69 6c 65 73 20 69 66 20 73 6f 6d 65 62 6f 64  files if somebod
12080 79 20 73 65 74 73 20 74 68 65 20 67 6c 6f 62 61  y sets the globa
12090 6c 20 76 61 72 69 61 62 6c 65 0d 0a 20 20 20 20  l variable..    
120a0 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 70      #       to p
120b0 72 65 76 65 6e 74 20 69 74 2e 0d 0a 20 20 20 20  revent it...    
120c0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
120d0 66 20 7b 24 66 6f 72 63 65 20 7c 7c 20 21 5b 69  f {$force || ![i
120e0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
120f0 63 6c 65 61 6e 75 70 46 69 6c 65 29 5d 7d 20 74  cleanupFile)]} t
12100 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
12110 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
12120 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
12130 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 73 74   delete the test
12140 20 66 69 6c 65 20 6e 6f 77 2e 0d 0a 20 20 20 20   file now...    
12150 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
12160 20 20 20 69 66 20 7b 5b 73 65 74 20 63 6f 64 65     if {[set code
12170 20 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64 65   [catch {file de
12180 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d 20  lete $fileName} 
12190 65 72 72 6f 72 5d 5d 7d 20 74 68 65 6e 20 7b 0d  error]]} then {.
121a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
121b0 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
121c0 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20 66  TE: We somehow f
121d0 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20  ailed to delete 
121e0 74 68 65 20 66 69 6c 65 2c 20 72 65 70 6f 72 74  the file, report
121f0 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 20   why...         
12200 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
12210 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
12220 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
12230 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
12240 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
12250 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
12260 64 65 6c 65 74 65 20 74 65 73 74 20 66 69 6c 65  delete test file
12270 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c   \"" $fileName \
12280 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
12290 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c 65    "\" during cle
122a0 61 6e 75 70 2c 20 65 72 72 6f 72 3a 20 22 20 5c  anup, error: " \
122b0 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a  n\t $error \n]..
122c0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
122d0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
122e0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
122f0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68        # NOTE: Sh
12300 6f 77 20 74 68 61 74 20 77 65 20 73 6b 69 70 70  ow that we skipp
12310 65 64 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  ed deleting the 
12320 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20  file...         
12330 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   #..          se
12340 74 20 63 6f 64 65 20 30 0d 0a 0d 0a 20 20 20 20  t code 0....    
12350 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
12360 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
12370 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
12380 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
12390 41 52 4e 49 4e 47 3a 20 73 6b 69 70 70 65 64 20  ARNING: skipped 
123a0 64 65 6c 65 74 69 6e 67 20 74 65 73 74 20 66 69  deleting test fi
123b0 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65  le \"" $fileName
123c0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
123d0 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c 65    "\" during cle
123e0 61 6e 75 70 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  anup\n"]..      
123f0 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73    }..      } els
12400 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e {..        #..
12410 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
12420 54 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  The file does no
12430 74 20 65 78 69 73 74 2c 20 73 75 63 63 65 73 73  t exist, success
12440 21 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  !..        #..  
12450 20 20 20 20 20 20 73 65 74 20 63 6f 64 65 20 30        set code 0
12460 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
12470 20 20 20 72 65 74 75 72 6e 20 24 63 6f 64 65 0d     return $code.
12480 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
12490 72 6f 63 20 63 6f 6c 6c 65 63 74 47 61 72 62 61  roc collectGarba
124a0 67 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 6d 69  ge { channel {mi
124b0 6c 6c 69 73 65 63 6f 6e 64 73 20 31 30 30 30 7d  lliseconds 1000}
124c0 20 7b 71 75 69 65 74 20 74 72 75 65 7d 20 7d 20   {quiet true} } 
124d0 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  {..      if {[ca
124e0 74 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f  tch {object invo
124f0 6b 65 20 47 43 20 47 65 74 54 6f 74 61 6c 4d 65  ke GC GetTotalMe
12500 6d 6f 72 79 20 66 61 6c 73 65 7d 20 72 65 73 75  mory false} resu
12510 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  lt] == 0} then {
12520 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24  ..        if {!$
12530 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
12540 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
12550 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
12560 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
12570 20 20 20 20 20 22 2d 2d 2d 2d 20 6d 65 6d 6f 72       "---- memor
12580 79 20 69 6e 20 75 73 65 20 62 79 20 74 68 65 20  y in use by the 
12590 43 4c 52 20 62 65 66 6f 72 65 20 63 6f 6c 6c 65  CLR before colle
125a0 63 74 69 6f 6e 2e 2e 2e 20 22 20 5c 0d 0a 20 20  ction... " \..  
125b0 20 20 20 20 20 20 20 20 20 20 20 20 24 72 65 73              $res
125c0 75 6c 74 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d  ult " bytes\n"].
125d0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
125e0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
125f0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
12600 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
12610 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 3d  ..            "=
12620 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
12630 6c 65 64 20 74 6f 20 67 65 74 20 43 4c 52 20 6d  led to get CLR m
12640 65 6d 6f 72 79 20 75 73 61 67 65 2c 20 65 72 72  emory usage, err
12650 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  or: " \..       
12660 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c       \n\t $resul
12670 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  t \n]..      }..
12680 0d 0a 20 20 20 20 20 20 23 23 23 23 23 23 23 23  ..      ########
12690 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
126a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
126b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
126c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
126d0 23 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  #....      #..  
126e0 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 70 65      # NOTE: Repe
126f0 61 74 65 64 6c 79 20 61 74 74 65 6d 70 74 20 74  atedly attempt t
12700 6f 20 63 6f 6c 6c 65 63 74 20 67 61 72 62 61 67  o collect garbag
12710 65 20 75 6e 74 69 6c 20 74 68 65 20 61 6c 6c 6f  e until the allo
12720 74 74 65 64 20 6e 75 6d 62 65 72 0d 0a 20 20 20  tted number..   
12730 20 20 20 23 20 20 20 20 20 20 20 6f 66 20 6d 69     #       of mi
12740 6c 6c 69 73 65 63 6f 6e 64 73 20 68 61 73 20 65  lliseconds has e
12750 6c 61 70 73 65 64 2e 20 20 41 6c 77 61 79 73 20  lapsed.  Always 
12760 61 74 74 65 6d 70 74 20 74 6f 20 63 6f 6c 6c 65  attempt to colle
12770 63 74 20 67 61 72 62 61 67 65 0d 0a 20 20 20 20  ct garbage..    
12780 20 20 23 20 20 20 20 20 20 20 61 74 20 6c 65 61    #       at lea
12790 73 74 20 6f 6e 63 65 2e 0d 0a 20 20 20 20 20 20  st once...      
127a0 23 0d 0a 20 20 20 20 20 20 73 65 74 20 73 74 61  #..      set sta
127b0 72 74 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64  rt [clock second
127c0 73 5d 0d 0a 20 20 20 20 20 20 73 65 74 20 73 74  s]..      set st
127d0 6f 70 20 5b 65 78 70 72 20 7b 24 73 74 61 72 74  op [expr {$start
127e0 20 2b 20 28 24 6d 69 6c 6c 69 73 65 63 6f 6e 64   + ($millisecond
127f0 73 20 2f 20 31 30 30 30 29 7d 5d 0d 0a 0d 0a 20  s / 1000)}].... 
12800 20 20 20 20 20 64 6f 20 7b 0d 0a 20 20 20 20 20       do {..     
12810 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
12820 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
12830 20 66 6f 72 63 65 20 61 20 66 75 6c 6c 20 67 61   force a full ga
12840 72 62 61 67 65 20 63 6f 6c 6c 65 63 74 69 6f 6e  rbage collection
12850 20 6e 6f 77 2e 20 20 52 65 70 6f 72 74 20 61 6e   now.  Report an
12860 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
12870 20 20 20 65 72 72 6f 72 20 74 68 61 74 20 69 73     error that is
12880 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 66 20   encountered if 
12890 77 65 20 66 61 69 6c 2e 0d 0a 20 20 20 20 20 20  we fail...      
128a0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
128b0 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20  {[catch {object 
128c0 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54 6f 74  invoke GC GetTot
128d0 61 6c 4d 65 6d 6f 72 79 20 74 72 75 65 7d 20 65  alMemory true} e
128e0 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  rror]} then {.. 
128f0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
12900 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
12910 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
12920 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
12930 4e 47 3a 20 66 61 69 6c 65 64 20 66 75 6c 6c 20  NG: failed full 
12940 67 61 72 62 61 67 65 20 63 6f 6c 6c 65 63 74 69  garbage collecti
12950 6f 6e 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a  on, error: " \..
12960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e                \n
12970 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20  \t $error \n].. 
12980 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
12990 20 20 20 20 73 65 74 20 6e 6f 77 20 5b 63 6c 6f      set now [clo
129a0 63 6b 20 73 65 63 6f 6e 64 73 5d 0d 0a 20 20 20  ck seconds]..   
129b0 20 20 20 7d 20 77 68 69 6c 65 20 7b 24 73 74 61     } while {$sta
129c0 72 74 20 3c 3d 20 24 6e 6f 77 20 26 26 20 24 6e  rt <= $now && $n
129d0 6f 77 20 3c 20 24 73 74 6f 70 7d 0d 0a 0d 0a 20  ow < $stop}.... 
129e0 20 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23       ###########
129f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12a00 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12a10 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12a20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
12a30 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74  ..      if {[cat
12a40 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b  ch {object invok
12a50 65 20 47 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d  e GC GetTotalMem
12a60 6f 72 79 20 66 61 6c 73 65 7d 20 72 65 73 75 6c  ory false} resul
12a70 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  t] == 0} then {.
12a80 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71  .        if {!$q
12a90 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
12aa0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
12ab0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
12ac0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
12ad0 20 20 20 20 22 2d 2d 2d 2d 20 6d 65 6d 6f 72 79      "---- memory
12ae0 20 69 6e 20 75 73 65 20 62 79 20 74 68 65 20 43   in use by the C
12af0 4c 52 20 61 66 74 65 72 20 63 6f 6c 6c 65 63 74  LR after collect
12b00 69 6f 6e 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20  ion... " \..    
12b10 20 20 20 20 20 20 20 20 20 20 24 72 65 73 75 6c            $resul
12b20 74 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20  t " bytes\n"].. 
12b30 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
12b40 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
12b50 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
12b60 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
12b70 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
12b80 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
12b90 64 20 74 6f 20 67 65 74 20 43 4c 52 20 6d 65 6d  d to get CLR mem
12ba0 6f 72 79 20 75 73 61 67 65 2c 20 65 72 72 6f 72  ory usage, error
12bb0 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  : " \..         
12bc0 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20     \n\t $result 
12bd0 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  \n]..      }..  
12be0 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
12bf0 20 67 65 74 53 51 4c 69 74 65 48 61 6e 64 6c 65   getSQLiteHandle
12c00 43 6f 75 6e 74 73 20 7b 20 63 68 61 6e 6e 65 6c  Counts { channel
12c10 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d   {quiet false} }
12c20 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 72 65   {..      set re
12c30 73 75 6c 74 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20  sult [list].... 
12c40 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 43 6f       if {[haveCo
12c50 6e 73 74 72 61 69 6e 74 20 5c 0d 0a 20 20 20 20  nstraint \..    
12c60 20 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65            define
12c70 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74 65 6d 2e  Constant.System.
12c80 44 61 74 61 2e 53 51 4c 69 74 65 2e 43 4f 55 4e  Data.SQLite.COUN
12c90 54 5f 48 41 4e 44 4c 45 5d 7d 20 74 68 65 6e 20  T_HANDLE]} then 
12ca0 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
12cb0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64        # NOTE: Ad
12cc0 64 20 65 61 63 68 20 63 72 69 74 69 63 61 6c 20  d each critical 
12cd0 68 61 6e 64 6c 65 20 63 6f 75 6e 74 20 74 6f 20  handle count to 
12ce0 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20 6c 69  the resulting li
12cf0 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  st...        #..
12d00 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
12d10 6e 61 6d 65 20 5b 6c 69 73 74 20 63 6f 6e 6e 65  name [list conne
12d20 63 74 69 6f 6e 43 6f 75 6e 74 20 73 74 61 74 65  ctionCount state
12d30 6d 65 6e 74 43 6f 75 6e 74 20 62 61 63 6b 75 70  mentCount backup
12d40 43 6f 75 6e 74 5d 20 7b 0d 0a 20 20 20 20 20 20  Count] {..      
12d50 20 20 20 20 73 65 74 20 76 61 6c 75 65 20 5b 6f      set value [o
12d60 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
12d70 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
12d80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
12d90 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
12da0 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d  te.UnsafeNativeM
12db0 65 74 68 6f 64 73 20 24 6e 61 6d 65 5d 0d 0a 0d  ethods $name]...
12dc0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
12dd0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
12de0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
12df0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
12e00 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
12e10 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
12e20 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65 20  critical handle 
12e30 63 6f 75 6e 74 20 5c 22 22 20 24 6e 61 6d 65 20  count \"" $name 
12e40 22 5c 22 20 69 73 20 22 20 24 76 61 6c 75 65 20  "\" is " $value 
12e50 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
12e60 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 6c 61  ....          la
12e70 70 70 65 6e 64 20 72 65 73 75 6c 74 20 24 76 61  ppend result $va
12e80 6c 75 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  lue..        }..
12e90 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
12ea0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
12eb0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
12ec0 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
12ed0 61 63 74 75 61 6c 20 68 61 6e 64 6c 65 20 63 6f  actual handle co
12ee0 75 6e 74 73 20 61 72 65 20 6e 6f 74 20 61 76 61  unts are not ava
12ef0 69 6c 61 62 6c 65 3b 20 74 68 65 72 65 66 6f 72  ilable; therefor
12f00 65 2c 20 6a 75 73 74 0d 0a 20 20 20 20 20 20 20  e, just..       
12f10 20 23 20 20 20 20 20 20 20 72 65 74 75 72 6e 20   #       return 
12f20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e 0d 0a  an empty list...
12f30 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
12f40 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
12f50 6c 20 22 2d 2d 2d 2d 20 63 72 69 74 69 63 61 6c  l "---- critical
12f60 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 73 20 75   handle counts u
12f70 6e 61 76 61 69 6c 61 62 6c 65 5c 6e 22 0d 0a 20  navailable\n".. 
12f80 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
12f90 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a  return $result..
12fa0 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
12fb0 6f 63 20 73 68 75 74 64 6f 77 6e 53 51 4c 69 74  oc shutdownSQLit
12fc0 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 66 6f 72  e { channel {for
12fd0 63 65 20 66 61 6c 73 65 7d 20 7b 71 75 69 65 74  ce false} {quiet
12fe0 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20   false} } {..   
12ff0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
13000 54 45 3a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  TE: Make sure th
13010 61 74 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c  at SQLite core l
13020 69 62 72 61 72 79 20 69 73 20 63 6f 6d 70 6c 65  ibrary is comple
13030 74 65 6c 79 20 73 68 75 74 64 6f 77 6e 2e 20 20  tely shutdown.  
13040 54 68 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20  This..      #   
13050 20 20 20 20 69 73 20 75 73 65 64 20 62 79 20 74      is used by t
13060 65 73 74 73 20 74 68 61 74 20 63 68 61 6e 67 65  ests that change
13070 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f   configuration o
13080 70 74 69 6f 6e 73 20 61 6e 64 2f 6f 72 20 74 68  ptions and/or th
13090 6f 73 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ose..      #    
130a0 20 20 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20     that need to 
130b0 6d 61 6b 65 20 73 75 72 65 20 6c 6f 67 67 69 6e  make sure loggin
130c0 67 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  g is initialized
130d0 20 28 69 2e 65 2e 20 6a 75 73 74 20 69 6e 20 63   (i.e. just in c
130e0 61 73 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ase..      #    
130f0 20 20 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f     the SQLite co
13100 72 65 20 6c 69 62 72 61 72 79 20 77 61 73 20 69  re library was i
13110 6e 69 74 69 61 6c 69 7a 65 64 20 69 6e 20 74 68  nitialized in th
13120 65 20 70 72 6f 63 65 73 73 20 70 72 69 6f 72 20  e process prior 
13130 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  to..      #     
13140 20 20 74 68 65 20 53 51 4c 69 74 65 4c 6f 67 20    the SQLiteLog 
13150 63 6c 61 73 73 20 62 65 69 6e 67 20 61 62 6c 65  class being able
13160 20 74 6f 20 73 65 74 75 70 20 69 74 73 20 6c 6f   to setup its lo
13170 67 67 69 6e 67 20 63 61 6c 6c 62 61 63 6b 29 2e  gging callback).
13180 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
13190 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20 73  Normally, this s
131a0 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 70 65  hould only be pe
131b0 72 66 6f 72 6d 65 64 20 69 66 20 53 51 4c 69 74  rformed if SQLit
131c0 65 20 69 73 20 6c 6f 61 64 65 64 20 61 6e 64 0d  e is loaded and.
131d0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72  .      #       r
131e0 65 61 64 79 20 66 6f 72 20 75 73 65 20 62 79 20  eady for use by 
131f0 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d  the test suite..
13200 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
13210 69 66 20 7b 24 66 6f 72 63 65 20 7c 7c 20 5b 69  if {$force || [i
13220 73 53 51 4c 69 74 65 52 65 61 64 79 5d 7d 20 74  sSQLiteReady]} t
13230 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
13240 0d 0a 20 20 20 20 20 20 20 20 23 20 42 55 47 46  ..        # BUGF
13250 49 58 3a 20 42 65 66 6f 72 65 20 63 61 6c 6c 69  IX: Before calli
13260 6e 67 20 74 68 65 20 6e 61 74 69 76 65 20 73 68  ng the native sh
13270 75 74 64 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 2c  utdown function,
13280 20 6d 61 6b 65 20 73 75 72 65 20 62 6f 74 68 0d   make sure both.
13290 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
132a0 20 20 20 6f 66 20 74 68 65 20 50 52 41 47 4d 41     of the PRAGMA
132b0 20 72 65 6c 61 74 65 64 20 64 69 72 65 63 74 6f   related directo
132c0 72 79 20 6e 61 6d 65 73 20 61 72 65 20 66 72 65  ry names are fre
132d0 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ed...        #..
132e0 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
132f0 53 51 4c 69 74 65 44 69 72 65 63 74 6f 72 69 65  SQLiteDirectorie
13300 73 20 24 63 68 61 6e 6e 65 6c 20 74 72 75 65 0d  s $channel true.
13310 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  ...        if {[
13320 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
13330 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
13340 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
13350 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
13360 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
13370 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74  SQLite.UnsafeNat
13380 69 76 65 4d 65 74 68 6f 64 73 20 73 71 6c 69 74  iveMethods sqlit
13390 65 33 5f 73 68 75 74 64 6f 77 6e 0d 0a 20 20 20  e3_shutdown..   
133a0 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d       } result] =
133b0 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
133c0 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
133d0 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
133e0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
133f0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
13400 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
13410 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c        "---- call
13420 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77   sqlite3_shutdow
13430 6e 28 29 2e 2e 2e 20 6f 6b 3a 20 22 20 24 72 65  n()... ok: " $re
13440 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  sult \n]..      
13450 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
13460 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
13470 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
13480 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
13490 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
134a0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
134b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
134c0 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c    "---- call sql
134d0 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 2e  ite3_shutdown().
134e0 2e 2e 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  .. error: " \n\t
134f0 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20   $result \n]..  
13500 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
13510 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20     }..      }.. 
13520 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
13530 63 20 72 65 70 6f 72 74 53 51 4c 69 74 65 52 65  c reportSQLiteRe
13540 73 6f 75 72 63 65 73 20 7b 20 63 68 61 6e 6e 65  sources { channe
13550 6c 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20  l {quiet false} 
13560 7b 63 6f 6c 6c 65 63 74 20 74 72 75 65 7d 20 7d  {collect true} }
13570 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
13580 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20     # NOTE: Skip 
13590 61 6c 6c 20 6f 75 74 70 75 74 20 69 66 20 77 65  all output if we
135a0 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20   are running in 
135b0 22 71 75 69 65 74 22 20 6d 6f 64 65 2e 0d 0a 20  "quiet" mode... 
135c0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
135d0 20 7b 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e   {[haveConstrain
135e0 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
135f0 20 20 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e     defineConstan
13600 74 2e 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  t.System.Data.SQ
13610 4c 69 74 65 2e 49 4e 54 45 52 4f 50 5f 56 49 52  Lite.INTEROP_VIR
13620 54 55 41 4c 5f 54 41 42 4c 45 5d 20 26 26 20 5c  TUAL_TABLE] && \
13630 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 68 61 76  ..          [hav
13640 65 43 6f 6e 73 74 72 61 69 6e 74 20 5c 0d 0a 20  eConstraint \.. 
13650 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65 66               def
13660 69 6e 65 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74  ineConstant.Syst
13670 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 54  em.Data.SQLite.T
13680 52 41 43 4b 5f 4d 45 4d 4f 52 59 5f 42 59 54 45  RACK_MEMORY_BYTE
13690 53 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  S]} then {..    
136a0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
136b0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
136c0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
136d0 6c 20 22 2d 2d 2d 2d 20 63 75 72 72 65 6e 74 20  l "---- current 
136e0 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79  memory in use by
136f0 20 53 51 4c 69 74 65 4d 65 6d 6f 72 79 2e 2e 2e   SQLiteMemory...
13700 20 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   "..        }...
13710 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
13720 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
13730 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
13740 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
13750 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
13760 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
13770 4c 69 74 65 2e 53 51 4c 69 74 65 4d 65 6d 6f 72  Lite.SQLiteMemor
13780 79 20 62 79 74 65 73 41 6c 6c 6f 63 61 74 65 64  y bytesAllocated
13790 0d 0a 20 20 20 20 20 20 20 20 7d 20 6d 65 6d 6f  ..        } memo
137a0 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  ry] == 0} then {
137b0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
137c0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
137d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
137e0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
137f0 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20  endArgs $memory 
13800 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20  " bytes\n"]..   
13810 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
13820 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
13830 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79        set memory
13840 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20   unknown....    
13850 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
13860 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
13870 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
13880 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
13890 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20  s $memory \n].. 
138a0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
138b0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
138c0 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
138d0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
138e0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
138f0 2d 2d 2d 2d 20 6d 61 78 69 6d 75 6d 20 6d 65 6d  ---- maximum mem
13900 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 53 51  ory in use by SQ
13910 4c 69 74 65 4d 65 6d 6f 72 79 2e 2e 2e 20 22 0d  LiteMemory... ".
13920 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
13930 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
13940 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62   {..          ob
13950 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
13960 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
13970 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  .              S
13980 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
13990 65 2e 53 51 4c 69 74 65 4d 65 6d 6f 72 79 20 6d  e.SQLiteMemory m
139a0 61 78 69 6d 75 6d 42 79 74 65 73 41 6c 6c 6f 63  aximumBytesAlloc
139b0 61 74 65 64 0d 0a 20 20 20 20 20 20 20 20 7d 20  ated..        } 
139c0 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68  memory] == 0} th
139d0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
139e0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
139f0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
13a00 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
13a10 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d  [appendArgs $mem
13a20 6f 72 79 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d  ory " bytes\n"].
13a30 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
13a40 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
13a50 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6d 65            set me
13a60 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a  mory unknown....
13a70 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
13a80 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
13a90 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
13aa0 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
13ab0 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e  dArgs $memory \n
13ac0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
13ad0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
13ae0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   }....      if {
13af0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
13b00 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
13b10 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 75  channel "---- cu
13b20 72 72 65 6e 74 20 6d 65 6d 6f 72 79 20 69 6e 20  rrent memory in 
13b30 75 73 65 20 62 79 20 53 51 4c 69 74 65 2e 2e 2e  use by SQLite...
13b40 20 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   "..      }.... 
13b50 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
13b60 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63  {..        objec
13b70 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
13b80 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
13b90 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
13ba0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73  .Data.SQLite.Uns
13bb0 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
13bc0 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f   sqlite3_memory_
13bd0 75 73 65 64 0d 0a 20 20 20 20 20 20 7d 20 6d 65  used..      } me
13be0 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  mory] == 0} then
13bf0 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
13c00 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
13c10 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
13c20 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
13c30 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20  dArgs $memory " 
13c40 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20  bytes\n"]..     
13c50 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
13c60 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
13c70 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
13c80 20 4d 61 79 62 65 20 74 68 65 20 53 51 4c 69 74   Maybe the SQLit
13c90 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20 69  e core library i
13ca0 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 3f 0d 0a  s unavailable?..
13cb0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
13cc0 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e     set memory un
13cd0 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20  known....       
13ce0 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
13cf0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
13d00 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
13d10 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f  appendArgs $memo
13d20 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ry \n]..        
13d30 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
13d40 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 24      set result $
13d50 6d 65 6d 6f 72 79 3b 20 23 20 4e 4f 54 45 3a 20  memory; # NOTE: 
13d60 52 65 74 75 72 6e 20 6d 65 6d 6f 72 79 20 69 6e  Return memory in
13d70 2d 75 73 65 20 74 6f 20 6f 75 72 20 63 61 6c 6c  -use to our call
13d80 65 72 2e 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  er.....      if 
13d90 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
13da0 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
13db0 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 6d  $channel "---- m
13dc0 61 78 69 6d 75 6d 20 6d 65 6d 6f 72 79 20 69 6e  aximum memory in
13dd0 20 75 73 65 20 62 79 20 53 51 4c 69 74 65 2e 2e   use by SQLite..
13de0 2e 20 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  . "..      }....
13df0 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
13e00 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65   {..        obje
13e10 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
13e20 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
13e30 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
13e40 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e  m.Data.SQLite.Un
13e50 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
13e60 73 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79  s sqlite3_memory
13e70 5f 68 69 67 68 77 61 74 65 72 20 30 0d 0a 20 20  _highwater 0..  
13e80 20 20 20 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d      } memory] ==
13e90 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
13ea0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
13eb0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
13ec0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
13ed0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
13ee0 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e 22  emory " bytes\n"
13ef0 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
13f00 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
13f10 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
13f20 20 23 20 4e 4f 54 45 3a 20 4d 61 79 62 65 20 74   # NOTE: Maybe t
13f30 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c  he SQLite core l
13f40 69 62 72 61 72 79 20 69 73 20 75 6e 61 76 61 69  ibrary is unavai
13f50 6c 61 62 6c 65 3f 0d 0a 20 20 20 20 20 20 20 20  lable?..        
13f60 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d  #..        set m
13f70 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d  emory unknown...
13f80 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71  .        if {!$q
13f90 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
13fa0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
13fb0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
13fc0 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a  gs $memory \n]..
13fd0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
13fe0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   }....      if {
13ff0 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65 6e 20 7b  $collect} then {
14000 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c 6c 65 63  ..        collec
14010 74 47 61 72 62 61 67 65 20 24 63 68 61 6e 6e 65  tGarbage $channe
14020 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  l..      }....  
14030 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
14040 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
14050 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
14060 22 2d 2d 2d 2d 20 63 75 72 72 65 6e 74 20 6d 65  "---- current me
14070 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 74  mory in use by t
14080 68 65 20 43 4c 52 2e 2e 2e 20 22 0d 0a 20 20 20  he CLR... "..   
14090 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
140a0 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74   {[catch {object
140b0 20 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54 6f   invoke GC GetTo
140c0 74 61 6c 4d 65 6d 6f 72 79 20 66 61 6c 73 65 7d  talMemory false}
140d0 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74   memory] == 0} t
140e0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
140f0 66 20 7b 5b 73 74 72 69 6e 67 20 69 73 20 69 6e  f {[string is in
14100 74 65 67 65 72 20 2d 73 74 72 69 63 74 20 24 6d  teger -strict $m
14110 65 6d 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  emory]} then {..
14120 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
14130 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
14140 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
14150 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
14160 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20  dArgs $memory " 
14170 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20  bytes\n"]..     
14180 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
14190 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
141a0 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 69      set memory i
141b0 6e 76 61 6c 69 64 0d 0a 0d 0a 20 20 20 20 20 20  nvalid....      
141c0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
141d0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
141e0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
141f0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
14200 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20  $memory \n]..   
14210 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
14220 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73    }..      } els
14230 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  e {..        set
14240 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d   memory unknown.
14250 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
14260 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
14270 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
14280 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
14290 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d  Args $memory \n]
142a0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
142b0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
142c0 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20  turn $result..  
142d0 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
142e0 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44   checkForSQLiteD
142f0 69 72 65 63 74 6f 72 69 65 73 20 7b 20 63 68 61  irectories { cha
14300 6e 6e 65 6c 20 7b 72 65 73 65 74 20 66 61 6c 73  nnel {reset fals
14310 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e} } {..      #.
14320 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43  .      # NOTE: C
14330 68 65 63 6b 20 69 66 20 74 68 65 20 73 71 6c 69  heck if the sqli
14340 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69  te3_win32_set_di
14350 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e  rectory function
14360 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a   is available...
14370 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 74        #..      t
14380 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5c 0d  puts $channel \.
14390 0a 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d  .          "----
143a0 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 66 75   checking for fu
143b0 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 5f 77  nction sqlite3_w
143c0 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
143d0 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  ry... "....     
143e0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
143f0 3a 20 54 68 69 73 20 63 61 6c 6c 20 74 6f 20 74  : This call to t
14400 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  he sqlite3_win32
14410 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66  _set_directory f
14420 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 74 68 65  unction uses the
14430 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
14440 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 20 30 20  invalid value 0 
14450 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 61 72  for the first ar
14460 67 75 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f  gument.  This co
14470 64 65 20 69 73 20 64 65 73 69 67 6e 65 64 0d 0a  de is designed..
14480 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f        #       to
14490 20 63 68 65 63 6b 20 69 66 20 63 61 6c 6c 69 6e   check if callin
144a0 67 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 77  g the function w
144b0 69 6c 6c 20 72 61 69 73 65 20 61 6e 20 65 78 63  ill raise an exc
144c0 65 70 74 69 6f 6e 20 28 69 2e 65 2e 0d 0a 20 20  eption (i.e...  
144d0 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
144e0 61 63 74 75 61 6c 20 72 65 73 75 6c 74 20 6f 66  actual result of
144f0 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f   the function do
14500 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 20 61 73  es not matter as
14510 20 6c 6f 6e 67 20 61 73 20 6e 6f 0d 0a 20 20 20   long as no..   
14520 20 20 20 23 20 20 20 20 20 20 20 64 69 72 65 63     #       direc
14530 74 6f 72 79 20 69 73 20 63 68 61 6e 67 65 64 29  tory is changed)
14540 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
14550 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
14560 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
14570 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
14580 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
14590 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
145a0 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65  ta.SQLite.Unsafe
145b0 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d  NativeMethods \.
145c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
145d0 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
145e0 69 72 65 63 74 6f 72 79 20 30 20 6e 75 6c 6c 0d  irectory 0 null.
145f0 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20  .      }] == 0} 
14600 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
14610 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
14620 45 3a 20 43 61 6c 6c 69 6e 67 20 74 68 65 20 73  E: Calling the s
14630 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
14640 5f 64 69 72 65 63 74 6f 72 79 20 66 75 6e 63 74  _directory funct
14650 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 0d 0a 20 20  ion does not..  
14660 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61        #       ca
14670 75 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e  use an exception
14680 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 69 74 20  ; therefore, it 
14690 6d 75 73 74 20 62 65 20 61 76 61 69 6c 61 62 6c  must be availabl
146a0 65 20 28 69 2e 65 2e 0d 0a 20 20 20 20 20 20 20  e (i.e...       
146b0 20 23 20 20 20 20 20 20 20 65 76 65 6e 20 74 68   #       even th
146c0 6f 75 67 68 20 69 74 20 73 68 6f 75 6c 64 20 72  ough it should r
146d0 65 74 75 72 6e 20 61 20 66 61 69 6c 75 72 65 20  eturn a failure 
146e0 72 65 74 75 72 6e 20 63 6f 64 65 20 69 6e 20 74  return code in t
146f0 68 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20  his..        #  
14700 20 20 20 20 20 63 61 73 65 29 2e 0d 0a 20 20 20       case)...   
14710 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
14720 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 73 71  addConstraint sq
14730 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f  lite3_win32_set_
14740 64 69 72 65 63 74 6f 72 79 0d 0a 0d 0a 20 20 20  directory....   
14750 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
14760 6e 65 6c 20 79 65 73 5c 6e 0d 0a 0d 0a 20 20 20  nel yes\n....   
14770 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
14780 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20 6f 75 72  # NOTE: Does our
14790 20 63 61 6c 6c 65 72 20 77 61 6e 74 20 74 6f 20   caller want to 
147a0 72 65 73 65 74 20 74 68 65 20 64 69 72 65 63 74  reset the direct
147b0 6f 72 69 65 73 3f 0d 0a 20 20 20 20 20 20 20 20  ories?..        
147c0 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24  #..        if {$
147d0 72 65 73 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  reset} then {.. 
147e0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
147f0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f        # NOTE: No
14800 77 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  w make sure the 
14810 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 65 6d  database and tem
14820 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 69  porary directori
14830 65 73 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20  es are..        
14840 20 20 23 20 20 20 20 20 20 20 72 65 73 65 74 20    #       reset 
14850 74 68 65 69 72 20 64 65 66 61 75 6c 74 20 76 61  their default va
14860 6c 75 65 73 2c 20 77 68 69 63 68 20 73 68 6f 75  lues, which shou
14870 6c 64 20 62 65 20 6e 75 6c 6c 20 66 6f 72 20 62  ld be null for b
14880 6f 74 68 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  oth...          
14890 23 20 20 20 20 20 20 20 53 69 6e 63 65 20 74 68  #       Since th
148a0 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  e sqlite3_win32_
148b0 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66 75  set_directory fu
148c0 6e 63 74 69 6f 6e 20 69 73 20 61 76 61 69 6c 61  nction is availa
148d0 62 6c 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ble,..          
148e0 23 20 20 20 20 20 20 20 75 73 65 20 69 74 2e 0d  #       use it..
148f0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
14900 20 20 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74          for {set
14910 20 69 6e 64 65 78 20 31 7d 20 7b 24 69 6e 64 65   index 1} {$inde
14920 78 20 3c 20 33 7d 20 7b 69 6e 63 72 20 69 6e 64  x < 3} {incr ind
14930 65 78 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  ex} {..         
14940 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
14950 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  .              o
14960 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
14970 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
14980 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
14990 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
149a0 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74  SQLite.UnsafeNat
149b0 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20  iveMethods \..  
149c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149d0 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
149e0 74 5f 64 69 72 65 63 74 6f 72 79 20 24 69 6e 64  t_directory $ind
149f0 65 78 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20  ex null..       
14a00 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d       } result] =
14a10 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
14a20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
14a30 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
14a40 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
14a50 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
14a60 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 77 69   call sqlite3_wi
14a70 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
14a80 79 28 22 20 24 69 6e 64 65 78 20 5c 0d 0a 20 20  y(" $index \..  
14a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14aa0 22 2c 20 6e 75 6c 6c 29 2e 2e 2e 20 6f 6b 3a 20  ", null)... ok: 
14ab0 22 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20  " $result \n].. 
14ac0 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
14ad0 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
14ae0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
14af0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
14b00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14b10 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71     "---- call sq
14b20 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f  lite3_win32_set_
14b30 64 69 72 65 63 74 6f 72 79 28 22 20 24 69 6e 64  directory(" $ind
14b40 65 78 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ex \..          
14b50 20 20 20 20 20 20 20 20 22 2c 20 6e 75 6c 6c 29          ", null)
14b60 2e 2e 2e 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  ... error: " \n\
14b70 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20  t $result \n].. 
14b80 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
14b90 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
14ba0 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
14bb0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  se {..        tp
14bc0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c  uts $channel no\
14bd0 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n....        #..
14be0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
14bf0 44 6f 65 73 20 6f 75 72 20 63 61 6c 6c 65 72 20  Does our caller 
14c00 77 61 6e 74 20 74 6f 20 72 65 73 65 74 20 74 68  want to reset th
14c10 65 20 64 69 72 65 63 74 6f 72 69 65 73 3f 20 20  e directories?  
14c20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 0d 0a 20  This can only.. 
14c30 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62         #       b
14c40 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20 53  e performed if S
14c50 51 4c 69 74 65 20 69 73 20 6c 6f 61 64 65 64 20  QLite is loaded 
14c60 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20 75 73  and ready for us
14c70 65 20 62 79 20 74 68 65 20 74 65 73 74 0d 0a 20  e by the test.. 
14c80 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73         #       s
14c90 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  uite...        #
14ca0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 72  ..        if {$r
14cb0 65 73 65 74 20 26 26 20 5b 69 73 53 51 4c 69 74  eset && [isSQLit
14cc0 65 52 65 61 64 79 5d 7d 20 74 68 65 6e 20 7b 0d  eReady]} then {.
14cd0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
14ce0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
14cf0 4e 6f 77 20 6d 61 6b 65 20 73 75 72 65 20 74 68  Now make sure th
14d00 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  e database and t
14d10 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f  emporary directo
14d20 72 69 65 73 20 61 72 65 0d 0a 20 20 20 20 20 20  ries are..      
14d30 20 20 20 20 23 20 20 20 20 20 20 20 72 65 73 65      #       rese
14d40 74 20 74 68 65 69 72 20 64 65 66 61 75 6c 74 20  t their default 
14d50 76 61 6c 75 65 73 2c 20 77 68 69 63 68 20 73 68  values, which sh
14d60 6f 75 6c 64 20 62 65 20 6e 75 6c 6c 20 66 6f 72  ould be null for
14d70 20 62 6f 74 68 2e 0d 0a 20 20 20 20 20 20 20 20   both...        
14d80 20 20 23 20 20 20 20 20 20 20 53 69 6e 63 65 20    #       Since 
14d90 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  the sqlite3_win3
14da0 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20  2_set_directory 
14db0 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
14dc0 74 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  t..          #  
14dd0 20 20 20 20 20 61 70 70 65 61 72 20 74 6f 20 62       appear to b
14de0 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 75 73 65  e available, use
14df0 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
14e00 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 73 0d  PRAGMA commands.
14e10 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
14e20 20 20 20 69 6e 73 74 65 61 64 2e 0d 0a 20 20 20     instead...   
14e30 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
14e40 20 20 20 20 66 6f 72 65 61 63 68 20 64 69 72 65      foreach dire
14e50 63 74 6f 72 79 20 5b 6c 69 73 74 20 64 61 74 61  ctory [list data
14e60 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79  _store_directory
14e70 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65   temp_store_dire
14e80 63 74 6f 72 79 5d 20 7b 0d 0a 20 20 20 20 20 20  ctory] {..      
14e90 20 20 20 20 20 20 73 65 74 20 73 71 6c 20 5b 61        set sql [a
14ea0 70 70 65 6e 64 41 72 67 73 20 22 50 52 41 47 4d  ppendArgs "PRAGM
14eb0 41 20 22 20 24 64 69 72 65 63 74 6f 72 79 20 22  A " $directory "
14ec0 20 3d 20 5c 22 5c 22 3b 22 5d 0d 0a 0d 0a 20 20   = \"\";"]....  
14ed0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63            if {[c
14ee0 61 74 63 68 20 7b 65 78 65 63 75 74 65 53 71 6c  atch {executeSql
14ef0 20 24 73 71 6c 7d 20 72 65 73 75 6c 74 5d 20 3d   $sql} result] =
14f00 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
14f10 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
14f20 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
14f30 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
14f40 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
14f50 20 65 78 65 63 75 74 65 20 50 52 41 47 4d 41 20   execute PRAGMA 
14f60 22 20 24 64 69 72 65 63 74 6f 72 79 20 22 2e 2e  " $directory "..
14f70 2e 20 6f 6b 3a 20 5c 22 22 20 5c 0d 0a 20 20 20  . ok: \"" \..   
14f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
14f90 72 65 73 75 6c 74 20 5c 22 5c 6e 5d 0d 0a 20 20  result \"\n]..  
14fa0 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
14fb0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
14fc0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
14fd0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
14fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ff0 20 20 22 2d 2d 2d 2d 20 65 78 65 63 75 74 65 20    "---- execute 
15000 50 52 41 47 4d 41 20 22 20 24 64 69 72 65 63 74  PRAGMA " $direct
15010 6f 72 79 20 22 2e 2e 2e 20 65 72 72 6f 72 3a 20  ory "... error: 
15020 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
15030 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73         \n\t $res
15040 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ult \n]..       
15050 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
15060 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
15070 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
15080 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
15090 3a 20 46 69 6e 61 6c 6c 79 2c 20 73 68 6f 77 20  : Finally, show 
150a0 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
150b0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
150c0 65 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 0d  e and temporary.
150d0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64  .      #       d
150e0 69 72 65 63 74 6f 72 69 65 73 2e 20 20 54 68 69  irectories.  Thi
150f0 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 70 65  s can only be pe
15100 72 66 6f 72 6d 65 64 20 69 66 20 53 51 4c 69 74  rformed if SQLit
15110 65 20 69 73 20 6c 6f 61 64 65 64 0d 0a 20 20 20  e is loaded..   
15120 20 20 20 23 20 20 20 20 20 20 20 61 6e 64 20 72     #       and r
15130 65 61 64 79 20 66 6f 72 20 75 73 65 20 62 79 20  eady for use by 
15140 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d  the test suite..
15150 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
15160 69 66 20 7b 5b 69 73 53 51 4c 69 74 65 52 65 61  if {[isSQLiteRea
15170 64 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  dy]} then {..   
15180 20 20 20 20 20 66 6f 72 65 61 63 68 20 64 69 72       foreach dir
15190 65 63 74 6f 72 79 20 5b 6c 69 73 74 20 64 61 74  ectory [list dat
151a0 61 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72  a_store_director
151b0 79 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72  y temp_store_dir
151c0 65 63 74 6f 72 79 5d 20 7b 0d 0a 20 20 20 20 20  ectory] {..     
151d0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
151e0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
151f0 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 22  "---- checking "
15200 20 24 64 69 72 65 63 74 6f 72 79 20 22 2e 2e 2e   $directory "...
15210 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20   "]....         
15220 20 73 65 74 20 73 71 6c 20 5b 61 70 70 65 6e 64   set sql [append
15230 41 72 67 73 20 22 50 52 41 47 4d 41 20 22 20 24  Args "PRAGMA " $
15240 64 69 72 65 63 74 6f 72 79 20 5c 3b 5d 0d 0a 0d  directory \;]...
15250 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
15260 63 61 74 63 68 20 7b 65 78 65 63 75 74 65 53 71  catch {executeSq
15270 6c 20 24 73 71 6c 20 73 63 61 6c 61 72 7d 20 72  l $sql scalar} r
15280 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65  esult] == 0} the
15290 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
152a0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
152b0 5b 61 70 70 65 6e 64 41 72 67 73 20 22 6f 6b 3a  [appendArgs "ok:
152c0 20 5c 22 22 20 24 72 65 73 75 6c 74 20 5c 22 5c   \"" $result \"\
152d0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  n]..          } 
152e0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
152f0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
15300 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  el [appendArgs "
15310 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72  error: " \n\t $r
15320 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20  esult \n]..     
15330 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
15340 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
15350 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 6c  }.....    proc l
15360 6f 61 64 53 51 4c 69 74 65 54 65 73 74 53 65 74  oadSQLiteTestSet
15370 74 69 6e 67 73 20 7b 20 63 68 61 6e 6e 65 6c 20  tings { channel 
15380 7b 73 75 66 66 69 78 20 22 22 7d 20 7b 71 75 69  {suffix ""} {qui
15390 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  et false} } {.. 
153a0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
153b0 4e 4f 54 45 3a 20 53 6b 69 70 20 6c 6f 61 64 69  NOTE: Skip loadi
153c0 6e 67 20 74 68 65 20 73 65 74 74 69 6e 67 73 20  ng the settings 
153d0 69 66 20 74 68 65 69 72 20 75 73 61 67 65 20 68  if their usage h
153e0 61 73 20 62 65 65 6e 20 64 69 73 61 62 6c 65 64  as been disabled
153f0 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
15400 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
15410 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 54  sts ::no(sqliteT
15420 65 73 74 53 65 74 74 69 6e 67 73 29 5d 7d 20 74  estSettings)]} t
15430 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
15440 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
15450 3a 20 4c 6f 61 64 20 63 75 73 74 6f 6d 20 70 65  : Load custom pe
15460 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20 70 65  r-user and/or pe
15470 72 2d 68 6f 73 74 20 74 65 73 74 20 73 65 74 74  r-host test sett
15480 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  ings now...     
15490 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
154a0 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
154b0 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 75 73  :tcl_platform(us
154c0 65 72 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  er)]} then {..  
154d0 20 20 20 20 20 20 20 20 73 65 74 20 75 73 65 72          set user
154e0 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65  SettingsFileName
154f0 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74   [file join [get
15500 43 6f 6d 6d 6f 6e 44 69 72 65 63 74 6f 72 79 5d  CommonDirectory]
15510 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
15520 20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 73 65    [appendArgs se
15530 74 74 69 6e 67 73 20 24 73 75 66 66 69 78 20 2e  ttings $suffix .
15540 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d   $::tcl_platform
15550 28 75 73 65 72 29 20 2e 65 61 67 6c 65 5d 5d 0d  (user) .eagle]].
15560 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
15570 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 75  {[file exists $u
15580 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e  serSettingsFileN
15590 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
155a0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
155b0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
155c0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
155d0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
155e0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
155f0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
15600 2d 2d 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d 75  -- loading per-u
15610 73 65 72 20 74 65 73 74 20 73 65 74 74 69 6e 67  ser test setting
15620 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20  s file \"" \..  
15630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15640 24 75 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c  $userSettingsFil
15650 65 4e 61 6d 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a  eName \"...\n]..
15660 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
15670 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
15680 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
15690 20 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c           uplevel
156a0 20 31 20 5b 6c 69 73 74 20 73 6f 75 72 63 65 20   1 [list source 
156b0 24 75 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c  $userSettingsFil
156c0 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20  eName]..        
156d0 20 20 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68      } error]} th
156e0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
156f0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
15700 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
15710 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
15720 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
15730 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
15740 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
15750 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
15760 20 74 6f 20 6c 6f 61 64 20 70 65 72 2d 75 73 65   to load per-use
15770 72 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20  r settings file 
15780 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
15790 20 20 20 20 20 20 20 20 20 20 20 24 75 73 65 72             $user
157a0 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65  SettingsFileName
157b0 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c   "\", error: " \
157c0 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a  n\t $error \n]..
157d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
157e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
157f0 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
15800 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
15810 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
15820 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
15830 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
15840 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
15850 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15860 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64     "---- skipped
15870 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d 75 73 65   loading per-use
15880 72 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20  r test settings 
15890 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20  file \"" \..    
158a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 75                $u
158b0 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e  serSettingsFileN
158c0 61 6d 65 20 22 5c 22 2c 20 69 74 20 64 6f 65 73  ame "\", it does
158d0 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a   not exist\n"]..
158e0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
158f0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
15900 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
15910 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
15920 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15930 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15940 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15950 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20  ########....    
15960 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
15970 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66  ists ::tcl_platf
15980 6f 72 6d 28 68 6f 73 74 29 5d 7d 20 74 68 65 6e  orm(host)]} then
15990 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
159a0 74 20 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69  t hostSettingsFi
159b0 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  leName [file joi
159c0 6e 20 5b 67 65 74 43 6f 6d 6d 6f 6e 44 69 72 65  n [getCommonDire
159d0 63 74 6f 72 79 5d 20 5c 0d 0a 20 20 20 20 20 20  ctory] \..      
159e0 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41          [appendA
159f0 72 67 73 20 73 65 74 74 69 6e 67 73 20 24 73 75  rgs settings $su
15a00 66 66 69 78 20 2e 20 24 3a 3a 74 63 6c 5f 70 6c  ffix . $::tcl_pl
15a10 61 74 66 6f 72 6d 28 68 6f 73 74 29 20 2e 65 61  atform(host) .ea
15a20 67 6c 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  gle]]....       
15a30 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69     if {[file exi
15a40 73 74 73 20 24 68 6f 73 74 53 65 74 74 69 6e 67  sts $hostSetting
15a50 73 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  sFileName]} then
15a60 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
15a70 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
15a80 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
15a90 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
15aa0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
15ab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15ac0 20 20 20 22 2d 2d 2d 2d 20 6c 6f 61 64 69 6e 67     "---- loading
15ad0 20 70 65 72 2d 68 6f 73 74 20 74 65 73 74 20 73   per-host test s
15ae0 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22  ettings file \""
15af0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
15b00 20 20 20 20 20 20 24 68 6f 73 74 53 65 74 74 69        $hostSetti
15b10 6e 67 73 46 69 6c 65 4e 61 6d 65 20 5c 22 2e 2e  ngsFileName \"..
15b20 2e 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  .\n]..          
15b30 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
15b40 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
15b50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75  .              u
15b60 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 73  plevel 1 [list s
15b70 6f 75 72 63 65 20 24 68 6f 73 74 53 65 74 74 69  ource $hostSetti
15b80 6e 67 73 46 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20  ngsFileName]..  
15b90 20 20 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f            } erro
15ba0 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  r]} then {..    
15bb0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
15bc0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
15bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
15be0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
15bf0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
15c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c10 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
15c20 66 61 69 6c 65 64 20 74 6f 20 6c 6f 61 64 20 70  failed to load p
15c30 65 72 2d 68 6f 73 74 20 73 65 74 74 69 6e 67 73  er-host settings
15c40 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20   file \"" \..   
15c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c60 20 24 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69   $hostSettingsFi
15c70 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 65 72 72 6f  leName "\", erro
15c80 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72  r: " \n\t $error
15c90 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
15ca0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
15cb0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
15cc0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
15cd0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
15ce0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
15cf0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
15d00 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
15d10 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
15d20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
15d30 6b 69 70 70 65 64 20 6c 6f 61 64 69 6e 67 20 70  kipped loading p
15d40 65 72 2d 68 6f 73 74 20 74 65 73 74 20 73 65 74  er-host test set
15d50 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c  tings file \"" \
15d60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
15d70 20 20 20 20 24 68 6f 73 74 53 65 74 74 69 6e 67      $hostSetting
15d80 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 69  sFileName "\", i
15d90 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
15da0 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
15db0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
15dc0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
15dd0 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
15de0 20 20 20 20 70 72 6f 63 20 72 75 6e 53 51 4c 69      proc runSQLi
15df0 74 65 54 65 73 74 50 72 6f 6c 6f 67 75 65 20 7b  teTestPrologue {
15e00 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
15e10 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70      # NOTE: Skip
15e20 20 72 75 6e 6e 69 6e 67 20 6f 75 72 20 63 75 73   running our cus
15e30 74 6f 6d 20 70 72 6f 6c 6f 67 75 65 20 69 66 20  tom prologue if 
15e40 74 68 65 20 6d 61 69 6e 20 6f 6e 65 20 68 61 73  the main one has
15e50 20 62 65 65 6e 0d 0a 20 20 20 20 20 20 23 20 20   been..      #  
15e60 20 20 20 20 20 73 6b 69 70 70 65 64 2e 0d 0a 20       skipped... 
15e70 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
15e80 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
15e90 3a 3a 6e 6f 28 70 72 6f 6c 6f 67 75 65 2e 65 61  ::no(prologue.ea
15ea0 67 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  gle)]} then {.. 
15eb0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
15ec0 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 74    # NOTE: Load t
15ed0 68 65 20 22 62 65 66 6f 72 65 2d 63 6f 6e 73 74  he "before-const
15ee0 72 61 69 6e 74 73 22 20 63 75 73 74 6f 6d 20 70  raints" custom p
15ef0 65 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20 70  er-user and/or p
15f00 65 72 2d 68 6f 73 74 0d 0a 20 20 20 20 20 20 20  er-host..       
15f10 20 23 20 20 20 20 20 20 20 74 65 73 74 20 73 65   #       test se
15f20 74 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20 20  ttings now...   
15f30 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
15f40 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20  uplevel 1 [list 
15f50 6c 6f 61 64 53 51 4c 69 74 65 54 65 73 74 53 65  loadSQLiteTestSe
15f60 74 74 69 6e 67 73 20 24 3a 3a 74 65 73 74 5f 63  ttings $::test_c
15f70 68 61 6e 6e 65 6c 20 2e 62 65 66 6f 72 65 5d 0d  hannel .before].
15f80 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
15f90 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 65        # NOTE: De
15fa0 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 61 6d 65  termine the name
15fb0 73 20 6f 66 20 74 68 65 20 6e 61 74 69 76 65 20  s of the native 
15fc0 70 6c 61 74 66 6f 72 6d 20 61 6e 64 20 61 72 63  platform and arc
15fd0 68 69 74 65 63 74 75 72 65 2e 0d 0a 20 20 20 20  hitecture...    
15fe0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
15ff0 65 74 20 70 6c 61 74 66 6f 72 6d 20 5b 67 65 74  et platform [get
16000 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20 74 72  BuildPlatform tr
16010 75 65 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74  ue]..        set
16020 20 61 72 63 68 69 74 65 63 74 75 72 65 20 5b 61   architecture [a
16030 72 63 68 69 74 65 63 74 75 72 65 46 6f 72 50 6c  rchitectureForPl
16040 61 74 66 6f 72 6d 20 24 70 6c 61 74 66 6f 72 6d  atform $platform
16050 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
16060 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
16070 53 68 6f 77 20 74 68 65 20 70 6c 61 74 66 6f 72  Show the platfor
16080 6d 20 61 6e 64 20 61 72 63 68 69 74 65 63 74 75  m and architectu
16090 72 65 20 75 73 65 64 20 74 6f 20 68 65 6c 70 20  re used to help 
160a0 6c 6f 63 61 74 65 20 74 68 65 0d 0a 20 20 20 20  locate the..    
160b0 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 74 69      #       nati
160c0 76 65 20 62 75 69 6c 64 20 66 69 6c 65 73 2e 0d  ve build files..
160d0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
160e0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
160f0 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
16100 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
16110 20 20 20 20 20 22 2d 2d 2d 2d 20 70 6c 61 74 66       "---- platf
16120 6f 72 6d 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67  orm for locating
16130 20 6e 61 74 69 76 65 20 62 75 69 6c 64 20 66 69   native build fi
16140 6c 65 73 20 69 73 20 5c 22 22 20 5c 0d 0a 20 20  les is \"" \..  
16150 20 20 20 20 20 20 20 20 20 20 24 70 6c 61 74 66            $platf
16160 6f 72 6d 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20  orm \"\n]....   
16170 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
16180 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
16190 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
161a0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 61 72 63 68        "---- arch
161b0 69 74 65 63 74 75 72 65 20 66 6f 72 20 6c 6f 63  itecture for loc
161c0 61 74 69 6e 67 20 6e 61 74 69 76 65 20 62 75 69  ating native bui
161d0 6c 64 20 66 69 6c 65 73 20 69 73 20 5c 22 22 20  ld files is \"" 
161e0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24  \..            $
161f0 61 72 63 68 69 74 65 63 74 75 72 65 20 5c 22 5c  architecture \"\
16200 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  n]....        #.
16210 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
16220 20 42 75 69 6c 64 20 61 20 6c 69 73 74 20 6f 66   Build a list of
16230 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66   configuration f
16240 69 6c 65 73 20 74 68 61 74 20 77 65 20 68 61 6e  iles that we han
16250 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  dle...        #.
16260 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 6e  .        set con
16270 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69  figFileNames [li
16280 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  st \..          
16290 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
162a0 4c 69 74 65 2e 64 6c 6c 2e 63 6f 6e 66 69 67 5d  Lite.dll.config]
162b0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
162c0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42         # NOTE: B
162d0 75 69 6c 64 20 61 20 6c 69 73 74 20 6f 66 20 61  uild a list of a
162e0 75 78 69 6c 69 61 72 79 20 4d 61 6e 61 67 65 64  uxiliary Managed
162f0 20 44 65 62 75 67 67 69 6e 67 20 41 73 73 69 73   Debugging Assis
16300 74 61 6e 74 73 20 28 4d 44 41 29 0d 0a 20 20 20  tants (MDA)..   
16310 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e       #       con
16320 66 69 67 75 72 61 74 69 6f 6e 20 66 69 6c 65 73  figuration files
16330 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65 2e   that we handle.
16340 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
16350 20 20 20 20 20 73 65 74 20 6d 64 61 43 6f 6e 66       set mdaConf
16360 69 67 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73  igFileNames [lis
16370 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
16380 20 45 61 67 6c 65 53 68 65 6c 6c 33 32 2e 65 78   EagleShell32.ex
16390 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 49 6e 73  e.mda.config Ins
163a0 74 61 6c 6c 65 72 2e 65 78 65 2e 6d 64 61 2e 63  taller.exe.mda.c
163b0 6f 6e 66 69 67 20 5c 0d 0a 20 20 20 20 20 20 20  onfig \..       
163c0 20 20 20 20 20 74 65 73 74 2e 65 78 65 2e 6d 64       test.exe.md
163d0 61 2e 63 6f 6e 66 69 67 20 74 65 73 74 6c 69 6e  a.config testlin
163e0 71 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67  q.exe.mda.config
163f0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
16400 74 65 73 74 65 66 36 2e 65 78 65 2e 6d 64 61 2e  testef6.exe.mda.
16410 63 6f 6e 66 69 67 5d 0d 0a 0d 0a 20 20 20 20 20  config]....     
16420 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
16430 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20  NOTE: Build the 
16440 6c 69 73 74 20 6f 66 20 65 78 74 65 72 6e 61 6c  list of external
16450 20 66 69 6c 65 73 20 74 68 61 74 20 77 65 20 68   files that we h
16460 61 6e 64 6c 65 2e 20 20 53 6f 6d 65 20 6f 66 0d  andle.  Some of.
16470 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
16480 20 74 68 65 73 65 20 66 69 6c 65 73 20 6d 61 79   these files may
16490 20 62 65 20 6e 61 74 69 76 65 20 61 6e 64 2f 6f   be native and/o
164a0 72 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62  r managed assemb
164b0 6c 69 65 73 20 74 68 61 74 20 61 72 65 0d 0a 20  lies that are.. 
164c0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72         #       r
164d0 65 71 75 69 72 65 64 20 74 6f 20 70 65 72 66 6f  equired to perfo
164e0 72 6d 20 76 61 72 69 6f 75 73 20 74 65 73 74 73  rm various tests
164f0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
16500 20 20 20 20 20 20 73 65 74 20 65 78 74 65 72 6e        set extern
16510 61 6c 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73  alFileNames [lis
16520 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
16530 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 45 6e 74 69   [file join Enti
16540 74 79 46 72 61 6d 65 77 6f 72 6b 20 6c 69 62 20  tyFramework lib 
16550 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73  [string map [lis
16560 74 20 46 78 20 22 22 5d 20 5b 73 74 72 69 6e 67  t Fx ""] [string
16570 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
16580 6d 61 70 20 5b 6c 69 73 74 20 6e 65 74 46 78 34  map [list netFx4
16590 35 31 20 6e 65 74 46 78 34 35 5d 20 5b 67 65 74  51 netFx45] [get
165a0 42 75 69 6c 64 4e 65 74 46 78 5d 5d 5d 20 45 6e  BuildNetFx]]] En
165b0 74 69 74 79 46 72 61 6d 65 77 6f 72 6b 2e 64 6c  tityFramework.dl
165c0 6c 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  l]]....        #
165d0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
165e0 3a 20 42 75 69 6c 64 20 74 68 65 20 6c 69 73 74  : Build the list
165f0 20 6f 66 20 6e 61 74 69 76 65 20 61 73 73 65 6d   of native assem
16600 62 6c 79 20 66 69 6c 65 73 20 74 68 61 74 20 77  bly files that w
16610 65 20 68 61 6e 64 6c 65 2e 20 20 54 68 65 0d 0a  e handle.  The..
16620 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
16630 72 65 61 73 6f 6e 20 74 68 65 20 22 53 79 73 74  reason the "Syst
16640 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
16650 6c 6c 22 20 66 69 6c 65 20 69 73 20 69 6e 63 6c  ll" file is incl
16660 75 64 65 64 20 68 65 72 65 20 69 73 0d 0a 20 20  uded here is..  
16670 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65        #       be
16680 63 61 75 73 65 20 69 74 20 63 6f 75 6c 64 20 62  cause it could b
16690 65 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65  e the mixed-mode
166a0 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20   assembly...    
166b0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
166c0 65 74 20 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d  et nativeFileNam
166d0 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20  es [list \..    
166e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 2e          sqlite3.
166f0 64 6c 6c 20 53 51 4c 69 74 65 2e 49 6e 74 65 72  dll SQLite.Inter
16700 6f 70 2e 64 6c 6c 20 53 79 73 74 65 6d 2e 44 61  op.dll System.Da
16710 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d 0d 0a  ta.SQLite.dll]..
16720 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
16730 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69       # NOTE: Bui
16740 6c 64 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6d  ld the list of m
16750 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 20  anaged assembly 
16760 66 69 6c 65 73 20 74 68 61 74 20 77 65 20 68 61  files that we ha
16770 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  ndle...        #
16780 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d 61  ..        set ma
16790 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73 20 5b  nagedFileNames [
167a0 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  list \..        
167b0 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
167c0 53 51 4c 69 74 65 2e 64 6c 6c 20 53 79 73 74 65  SQLite.dll Syste
167d0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69  m.Data.SQLite.Li
167e0 6e 71 2e 64 6c 6c 20 5c 0d 0a 20 20 20 20 20 20  nq.dll \..      
167f0 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
16800 61 2e 53 51 4c 69 74 65 2e 45 46 36 2e 64 6c 6c  a.SQLite.EF6.dll
16810 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
16820 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
16830 52 65 6d 6f 76 65 20 61 6e 79 20 74 65 73 74 20  Remove any test 
16840 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74  constraints that
16850 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 6e 61   refer to the na
16860 74 69 76 65 20 61 6e 64 2f 6f 72 0d 0a 20 20 20  tive and/or..   
16870 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 61 6e       #       man
16880 61 67 65 64 20 61 73 73 65 6d 62 6c 79 20 66 69  aged assembly fi
16890 6c 65 73 20 74 68 61 74 20 77 65 20 68 61 6e 64  les that we hand
168a0 6c 65 20 75 6e 6c 65 73 73 20 66 6f 72 62 69 64  le unless forbid
168b0 64 65 6e 20 66 72 6f 6d 0d 0a 20 20 20 20 20 20  den from..      
168c0 20 20 23 20 20 20 20 20 20 20 64 6f 69 6e 67 20    #       doing 
168d0 73 6f 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  so...        #..
168e0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
168f0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73  fo exists ::no(s
16900 71 6c 69 74 65 52 65 6d 6f 76 65 43 6f 6e 73 74  qliteRemoveConst
16910 72 61 69 6e 74 73 29 5d 7d 20 74 68 65 6e 20 7b  raints)]} then {
16920 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65  ..          fore
16930 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 63 6f  ach fileName $co
16940 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  nfigFileNames {.
16950 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6d  .            rem
16960 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  oveConstraint [a
16970 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
16980 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20  $fileName]..    
16990 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
169a0 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
169b0 65 4e 61 6d 65 20 24 6d 64 61 43 6f 6e 66 69 67  eName $mdaConfig
169c0 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
169d0 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76 65 43           removeC
169e0 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
169f0 64 41 72 67 73 20 66 69 6c 65 5f 20 24 66 69 6c  dArgs file_ $fil
16a00 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20  eName]..        
16a10 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
16a20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
16a30 65 20 24 65 78 74 65 72 6e 61 6c 46 69 6c 65 4e  e $externalFileN
16a40 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
16a50 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72      removeConstr
16a60 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
16a70 20 66 69 6c 65 5f 20 5b 66 69 6c 65 20 74 61 69   file_ [file tai
16a80 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20  l $fileName]].. 
16a90 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
16aa0 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
16ab0 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65  fileName $native
16ac0 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
16ad0 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76 65 43           removeC
16ae0 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
16af0 64 41 72 67 73 20 66 69 6c 65 5f 20 24 66 69 6c  dArgs file_ $fil
16b00 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20  eName]..        
16b10 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
16b20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
16b30 65 20 24 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61  e $managedFileNa
16b40 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
16b50 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61     removeConstra
16b60 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
16b70 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61 6d 65 5d  file_ $fileName]
16b80 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
16b90 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
16ba0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
16bb0 20 4e 4f 54 45 3a 20 53 6b 69 70 20 61 6c 6c 20   NOTE: Skip all 
16bc0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
16bd0 74 65 20 72 65 6c 61 74 65 64 20 66 69 6c 65 20  te related file 
16be0 68 61 6e 64 6c 69 6e 67 20 28 64 65 6c 65 74 69  handling (deleti
16bf0 6e 67 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ng,..        #  
16c00 20 20 20 20 20 63 6f 70 79 69 6e 67 2c 20 61 6e       copying, an
16c10 64 20 6c 6f 61 64 69 6e 67 29 20 69 66 20 69 6e  d loading) if in
16c20 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20 20  structed...     
16c30 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
16c40 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
16c50 3a 3a 6e 6f 28 73 71 6c 69 74 65 46 69 6c 65 73  ::no(sqliteFiles
16c60 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
16c70 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
16c80 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20     # NOTE: Skip 
16c90 74 72 79 69 6e 67 20 74 6f 20 64 65 6c 65 74 65  trying to delete
16ca0 20 61 6e 79 20 66 69 6c 65 73 20 69 66 20 69 6e   any files if in
16cb0 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20 20  structed...     
16cc0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
16cd0 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
16ce0 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53  sts ::no(deleteS
16cf0 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20 74 68  qliteFiles)]} th
16d00 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
16d10 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
16d20 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53  sts ::no(deleteS
16d30 71 6c 69 74 65 43 6f 6e 66 69 67 46 69 6c 65 73  qliteConfigFiles
16d40 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
16d50 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
16d60 68 20 66 69 6c 65 4e 61 6d 65 20 24 63 6f 6e 66  h fileName $conf
16d70 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  igFileNames {.. 
16d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
16d90 72 79 44 65 6c 65 74 65 42 69 6e 61 72 79 46 69  ryDeleteBinaryFi
16da0 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20  le $fileName..  
16db0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
16dc0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
16dd0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
16de0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
16df0 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 45  no(deleteSqliteE
16e00 78 74 65 72 6e 61 6c 46 69 6c 65 73 29 5d 7d 20  xternalFiles)]} 
16e10 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
16e20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
16e30 6c 65 4e 61 6d 65 20 24 6d 64 61 43 6f 6e 66 69  leName $mdaConfi
16e40 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  gFileNames {..  
16e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
16e60 79 44 65 6c 65 74 65 42 75 69 6c 64 46 69 6c 65  yDeleteBuildFile
16e70 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20   $fileName..    
16e80 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
16e90 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
16ea0 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 65  each fileName $e
16eb0 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 73  xternalFileNames
16ec0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
16ed0 20 20 20 20 74 72 79 44 65 6c 65 74 65 42 69 6e      tryDeleteBin
16ee0 61 72 79 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d  aryFile $fileNam
16ef0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
16f00 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
16f10 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
16f20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
16f30 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71  ts ::no(deleteSq
16f40 6c 69 74 65 4e 61 74 69 76 65 46 69 6c 65 73 29  liteNativeFiles)
16f50 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
16f60 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
16f70 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
16f80 64 65 6c 65 74 65 53 71 6c 69 74 65 49 6d 70 6c  deleteSqliteImpl
16f90 69 63 69 74 46 69 6c 65 73 29 5d 7d 20 74 68 65  icitFiles)]} the
16fa0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
16fb0 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
16fc0 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c  eName $nativeFil
16fd0 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
16fe0 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44              tryD
16ff0 65 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 24 66  eleteAssembly $f
17000 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20  ileName..       
17010 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
17020 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
17030 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
17040 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
17050 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65  :no(deleteSqlite
17060 4e 6f 6e 49 6d 70 6c 69 63 69 74 46 69 6c 65 73  NonImplicitFiles
17070 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
17080 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
17090 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
170a0 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 50  no(deleteSqliteP
170b0 6c 61 74 66 6f 72 6d 46 69 6c 65 73 29 5d 20 26  latformFiles)] &
170c0 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
170d0 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
170e0 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72   length $platfor
170f0 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  m] > 0} then {..
17100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17110 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
17120 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61  me $nativeFileNa
17130 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
17140 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65             tryDe
17150 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 24 66 69  leteAssembly $fi
17160 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d  leName $platform
17170 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17180 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
17190 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
171a0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
171b0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
171c0 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 41  no(deleteSqliteA
171d0 72 63 68 69 74 65 63 74 75 72 65 46 69 6c 65 73  rchitectureFiles
171e0 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  )] && \..       
171f0 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74               [st
17200 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 61 72 63  ring length $arc
17210 68 69 74 65 63 74 75 72 65 5d 20 3e 20 30 7d 20  hitecture] > 0} 
17220 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
17230 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
17240 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69  h fileName $nati
17250 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  veFileNames {.. 
17260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17270 20 20 20 74 72 79 44 65 6c 65 74 65 41 73 73 65     tryDeleteAsse
17280 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 24  mbly $fileName $
17290 61 72 63 68 69 74 65 63 74 75 72 65 0d 0a 20 20  architecture..  
172a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172b0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
172c0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
172d0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
172e0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
172f0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
17300 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74  xists ::no(delet
17310 65 53 71 6c 69 74 65 4d 61 6e 61 67 65 64 46 69  eSqliteManagedFi
17320 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
17330 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
17340 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d  each fileName $m
17350 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73 20  anagedFileNames 
17360 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
17370 20 20 20 74 72 79 44 65 6c 65 74 65 41 73 73 65     tryDeleteAsse
17380 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 0d 0a  mbly $fileName..
17390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
173a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
173b0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
173c0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
173d0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
173e0 65 63 6b 20 66 6f 72 20 74 68 65 20 22 61 75 74  eck for the "aut
173f0 6f 53 65 6c 65 63 74 22 20 72 75 6e 74 69 6d 65  oSelect" runtime
17400 20 6f 70 74 69 6f 6e 2e 20 20 49 66 20 70 72 65   option.  If pre
17410 73 65 6e 74 2c 0d 0a 20 20 20 20 20 20 20 20 20  sent,..         
17420 20 23 20 20 20 20 20 20 20 61 74 74 65 6d 70 74   #       attempt
17430 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   to automaticall
17440 79 20 73 65 6c 65 63 74 20 74 68 65 20 66 69 72  y select the fir
17450 73 74 20 61 76 61 69 6c 61 62 6c 65 0d 0a 20 20  st available..  
17460 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
17470 62 75 69 6c 64 20 28 6f 72 20 22 72 65 6c 65 61  build (or "relea
17480 73 65 22 29 20 6f 66 20 53 51 4c 69 74 65 20 61  se") of SQLite a
17490 6e 64 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  nd System.Data.S
174a0 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 20 20 20  QLite..         
174b0 20 23 20 20 20 20 20 20 20 66 6f 72 20 75 73 65   #       for use
174c0 20 77 69 74 68 20 74 68 65 20 74 65 73 74 20 73   with the test s
174d0 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 20  uite...         
174e0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   #..          if
174f0 20 7b 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74   {[hasRuntimeOpt
17500 69 6f 6e 20 61 75 74 6f 53 65 6c 65 63 74 5d 7d  ion autoSelect]}
17510 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
17520 20 20 20 20 20 69 66 20 7b 21 5b 63 68 65 63 6b       if {![check
17530 46 6f 72 53 51 4c 69 74 65 42 75 69 6c 64 73 20  ForSQLiteBuilds 
17540 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
17550 74 72 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  true]} then {.. 
17560 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68 65               che
17570 63 6b 46 6f 72 53 51 4c 69 74 65 52 65 6c 65 61  ckForSQLiteRelea
17580 73 65 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  ses $::test_chan
17590 6e 65 6c 20 74 72 75 65 0d 0a 20 20 20 20 20 20  nel true..      
175a0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
175b0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
175c0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
175d0 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72 79 69   NOTE: Skip tryi
175e0 6e 67 20 74 6f 20 76 65 72 69 66 79 20 74 68 65  ng to verify the
175f0 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79   build directory
17600 20 69 66 20 69 6e 73 74 72 75 63 74 65 64 3b 0d   if instructed;.
17610 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
17620 20 20 20 6f 74 68 65 72 77 69 73 65 2c 20 6d 61     otherwise, ma
17630 6b 65 20 73 75 72 65 20 69 74 20 61 63 74 75 61  ke sure it actua
17640 6c 6c 79 20 65 78 69 73 74 73 20 6f 72 20 68 61  lly exists or ha
17650 6c 74 20 74 68 65 20 65 6e 74 69 72 65 0d 0a 20  lt the entire.. 
17660 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
17670 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73   testing process
17680 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20   if it does not 
17690 65 78 69 73 74 2e 0d 0a 20 20 20 20 20 20 20 20  exist...        
176a0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69    #..          i
176b0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
176c0 20 3a 3a 6e 6f 28 76 65 72 69 66 79 42 75 69 6c   ::no(verifyBuil
176d0 64 44 69 72 65 63 74 6f 72 79 29 5d 7d 20 74 68  dDirectory)]} th
176e0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
176f0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
17700 20 23 20 4e 4f 54 45 3a 20 41 74 20 74 68 69 73   # NOTE: At this
17710 20 70 6f 69 6e 74 2c 20 74 68 65 20 62 75 69 6c   point, the buil
17720 64 20 64 69 72 65 63 74 6f 72 79 20 4d 55 53 54  d directory MUST
17730 20 65 78 69 73 74 20 61 73 20 61 0d 0a 20 20 20   exist as a..   
17740 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
17750 20 76 61 6c 69 64 20 64 69 72 65 63 74 6f 72 79   valid directory
17760 20 66 6f 72 20 74 68 65 20 74 65 73 74 69 6e 67   for the testing
17770 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6e 74   process to cont
17780 69 6e 75 65 2e 0d 0a 20 20 20 20 20 20 20 20 20  inue...         
17790 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
177a0 20 20 73 65 74 20 64 69 72 65 63 74 6f 72 79 20    set directory 
177b0 5b 67 65 74 42 75 69 6c 64 44 69 72 65 63 74 6f  [getBuildDirecto
177c0 72 79 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ry]....         
177d0 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78     if {![file ex
177e0 69 73 74 73 20 24 64 69 72 65 63 74 6f 72 79 5d  ists $directory]
177f0 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   || \..         
17800 20 20 20 20 20 20 20 21 5b 66 69 6c 65 20 69 73         ![file is
17810 64 69 72 65 63 74 6f 72 79 20 24 64 69 72 65 63  directory $direc
17820 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  tory]} then {.. 
17830 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
17840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
17850 4e 4f 54 45 3a 20 4a 75 73 74 20 70 72 69 6f 72  NOTE: Just prior
17860 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 68 61 6c   to actually hal
17870 74 69 6e 67 20 74 68 65 20 74 65 73 74 69 6e 67  ting the testing
17880 20 70 72 6f 63 65 73 73 2c 0d 0a 20 20 20 20 20   process,..     
17890 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
178a0 20 61 64 64 20 61 6e 20 65 72 72 6f 72 20 74 6f   add an error to
178b0 20 74 68 65 20 74 65 73 74 20 6c 6f 67 20 66 69   the test log fi
178c0 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  le...           
178d0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
178e0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
178f0 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
17900 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
17910 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
17920 20 63 6f 75 6c 64 20 6e 6f 74 20 76 65 72 69 66   could not verif
17930 79 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72  y build director
17940 79 20 5c 22 22 20 24 64 69 72 65 63 74 6f 72 79  y \"" $directory
17950 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
17960 20 20 20 20 20 20 22 5c 22 2c 20 61 6c 6c 20 74        "\", all t
17970 65 73 74 69 6e 67 20 68 61 6c 74 65 64 5c 6e 22  esting halted\n"
17980 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
17990 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
179a0 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 61 69 73      # NOTE: Rais
179b0 69 6e 67 20 61 20 73 63 72 69 70 74 20 65 72 72  ing a script err
179c0 6f 72 20 66 72 6f 6d 20 74 68 69 73 20 70 6f 69  or from this poi
179d0 6e 74 20 73 68 6f 75 6c 64 20 68 61 6c 74 0d 0a  nt should halt..
179e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
179f0 20 20 20 20 20 20 74 68 65 20 74 65 73 74 69 6e        the testin
17a00 67 20 70 72 6f 63 65 73 73 2e 0d 0a 20 20 20 20  g process...    
17a10 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
17a20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72             error
17a30 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
17a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a50 20 20 22 63 6f 75 6c 64 20 6e 6f 74 20 76 65 72    "could not ver
17a60 69 66 79 20 62 75 69 6c 64 20 64 69 72 65 63 74  ify build direct
17a70 6f 72 79 20 5c 22 22 20 24 64 69 72 65 63 74 6f  ory \"" $directo
17a80 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ry \..          
17a90 20 20 20 20 20 20 20 20 22 5c 22 2c 20 61 6c 6c          "\", all
17aa0 20 74 65 73 74 69 6e 67 20 68 61 6c 74 65 64 22   testing halted"
17ab0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
17ac0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
17ad0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
17ae0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
17af0 53 6b 69 70 20 74 72 79 69 6e 67 20 74 6f 20 63  Skip trying to c
17b00 6f 70 79 20 61 6e 79 20 66 69 6c 65 73 20 69 66  opy any files if
17b10 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20   instructed...  
17b20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
17b30 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
17b40 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79  exists ::no(copy
17b50 53 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20 74  SqliteFiles)]} t
17b60 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
17b70 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
17b80 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71  ists ::no(copySq
17b90 6c 69 74 65 43 6f 6e 66 69 67 46 69 6c 65 73 29  liteConfigFiles)
17ba0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
17bb0 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
17bc0 20 66 69 6c 65 4e 61 6d 65 20 24 63 6f 6e 66 69   fileName $confi
17bd0 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  gFileNames {..  
17be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
17bf0 79 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20 24  yCopyBuildFile $
17c00 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20  fileName..      
17c10 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
17c20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
17c30 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
17c40 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63  fo exists ::no(c
17c50 6f 70 79 53 71 6c 69 74 65 45 78 74 65 72 6e 61  opySqliteExterna
17c60 6c 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  lFiles)]} then {
17c70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17c80 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
17c90 20 23 20 4e 4f 54 45 3a 20 43 6f 70 79 20 74 68   # NOTE: Copy th
17ca0 65 20 4d 61 6e 61 67 65 64 20 44 65 62 75 67 67  e Managed Debugg
17cb0 69 6e 67 20 41 73 73 69 73 74 61 6e 74 73 20 28  ing Assistants (
17cc0 4d 44 41 29 20 63 6f 6e 66 69 67 75 72 61 74 69  MDA) configurati
17cd0 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  on..            
17ce0 20 20 23 20 20 20 20 20 20 20 66 69 6c 65 20 66    #       file f
17cf0 6f 72 20 74 68 65 20 45 61 67 6c 65 20 73 68 65  or the Eagle she
17d00 6c 6c 20 74 6f 20 74 68 65 20 62 75 69 6c 64 20  ll to the build 
17d10 6f 75 74 70 75 74 20 64 69 72 65 63 74 6f 72 79  output directory
17d20 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
17d30 20 23 20 20 20 20 20 20 20 77 68 69 6c 65 20 75   #       while u
17d40 73 69 6e 67 20 65 61 63 68 20 6f 66 20 74 68 65  sing each of the
17d50 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 76 61   names of the va
17d60 72 69 6f 75 73 20 6c 65 67 61 63 79 20 74 65 73  rious legacy tes
17d70 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t..             
17d80 20 23 20 20 20 20 20 20 20 65 78 65 63 75 74 61   #       executa
17d90 62 6c 65 73 2e 20 20 54 68 69 73 20 77 69 6c 6c  bles.  This will
17da0 20 68 65 6c 70 20 74 6f 20 6d 61 6b 65 20 73 75   help to make su
17db0 72 65 20 74 68 61 74 20 61 6c 6c 20 74 68 65 0d  re that all the.
17dc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
17dd0 20 20 20 20 20 20 20 6c 65 67 61 63 79 20 74 65         legacy te
17de0 73 74 73 20 72 75 6e 20 77 69 74 68 20 65 78 61  sts run with exa
17df0 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 73 65  ctly the same se
17e00 74 20 6f 66 20 4d 61 6e 61 67 65 64 0d 0a 20 20  t of Managed..  
17e10 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
17e20 20 20 20 20 44 65 62 75 67 67 69 6e 67 20 41 73      Debugging As
17e30 73 69 73 74 61 6e 74 73 20 63 6f 6e 66 69 67 75  sistants configu
17e40 72 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  red...          
17e50 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
17e60 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
17e70 65 4e 61 6d 65 20 24 6d 64 61 43 6f 6e 66 69 67  eName $mdaConfig
17e80 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
17e90 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
17ea0 43 6f 70 79 42 69 6e 61 72 79 46 69 6c 65 20 45  CopyBinaryFile E
17eb0 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 2e 6d 64  agleShell.exe.md
17ec0 61 2e 63 6f 6e 66 69 67 20 22 22 20 24 66 69 6c  a.config "" $fil
17ed0 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20  eName..         
17ee0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
17ef0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
17f00 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
17f10 20 43 6f 70 79 20 74 68 65 20 65 78 74 65 72 6e   Copy the extern
17f20 61 6c 20 62 69 6e 61 72 69 65 73 2c 20 69 66 20  al binaries, if 
17f30 61 6e 79 2c 20 74 6f 20 74 68 65 20 64 69 72 65  any, to the dire
17f40 63 74 6f 72 79 20 74 68 61 74 0d 0a 20 20 20 20  ctory that..    
17f50 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
17f60 20 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 45    contains the E
17f70 61 67 6c 65 20 73 68 65 6c 6c 2e 20 20 54 68 69  agle shell.  Thi
17f80 73 20 69 73 20 74 79 70 69 63 61 6c 6c 79 20 75  s is typically u
17f90 73 65 64 20 74 6f 20 6d 61 6b 65 0d 0a 20 20 20  sed to make..   
17fa0 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
17fb0 20 20 20 73 75 72 65 20 61 73 73 65 6d 62 6c 69     sure assembli
17fc0 65 73 20 72 65 66 65 72 65 6e 63 65 64 20 62 79  es referenced by
17fd0 20 74 68 65 20 6f 6e 65 73 20 62 65 69 6e 67 20   the ones being 
17fe0 74 65 73 74 65 64 20 61 72 65 0d 0a 20 20 20 20  tested are..    
17ff0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
18000 20 20 61 76 61 69 6c 61 62 6c 65 20 64 75 72 69    available duri
18010 6e 67 20 74 68 65 20 74 65 73 74 69 6e 67 20 70  ng the testing p
18020 72 6f 63 65 73 73 2e 0d 0a 20 20 20 20 20 20 20  rocess...       
18030 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
18040 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
18050 66 69 6c 65 4e 61 6d 65 20 24 65 78 74 65 72 6e  fileName $extern
18060 61 6c 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  alFileNames {.. 
18070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
18080 72 79 43 6f 70 79 45 78 74 65 72 6e 61 6c 46 69  ryCopyExternalFi
18090 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20  le $fileName..  
180a0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
180b0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
180c0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
180d0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
180e0 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 4e 61 74  no(copySqliteNat
180f0 69 76 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  iveFiles)]} then
18100 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
18110 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
18120 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68     # NOTE: If th
18130 65 20 74 65 73 74 20 70 6c 61 74 66 6f 72 6d 20  e test platform 
18140 69 73 20 6c 69 6b 65 6c 79 20 74 68 65 20 64 65  is likely the de
18150 66 61 75 6c 74 20 66 6f 72 20 74 68 69 73 0d 0a  fault for this..
18160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
18170 20 20 20 20 20 20 6d 61 63 68 69 6e 65 2c 20 61        machine, a
18180 6c 73 6f 20 74 72 79 20 74 6f 20 63 6f 70 79 20  lso try to copy 
18190 74 68 65 20 6e 61 74 69 76 65 20 66 69 6c 65 73  the native files
181a0 20 74 6f 20 74 68 65 0d 0a 20 20 20 20 20 20 20   to the..       
181b0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62         #       b
181c0 69 6e 61 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0d  inary location..
181d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
181e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
181f0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
18200 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74  s ::no(copySqlit
18210 65 49 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d  eImplicitFiles)]
18220 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
18230 20 20 20 20 20 20 20 20 20 5b 69 73 44 65 66 61           [isDefa
18240 75 6c 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d  ultBuildPlatform
18250 20 74 72 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a   true]} then {..
18260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18270 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
18280 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65   $nativeFileName
18290 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
182a0 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 41 73         tryCopyAs
182b0 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65  sembly $fileName
182c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
182d0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
182e0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
182f0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
18300 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70   exists ::no(cop
18310 79 53 71 6c 69 74 65 4e 6f 6e 49 6d 70 6c 69 63  ySqliteNonImplic
18320 69 74 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  itFiles)]} then 
18330 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
18340 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
18350 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71  ists ::no(copySq
18360 6c 69 74 65 50 6c 61 74 66 6f 72 6d 46 69 6c 65  litePlatformFile
18370 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  s)] && \..      
18380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73                [s
18390 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c  tring length $pl
183a0 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65  atform] > 0} the
183b0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
183c0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
183d0 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46  ileName $nativeF
183e0 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
183f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18400 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20  tryCopyAssembly 
18410 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66  $fileName $platf
18420 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  orm..           
18430 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
18440 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
18450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
18460 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
18470 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65   ::no(copySqlite
18480 41 72 63 68 69 74 65 63 74 75 72 65 46 69 6c 65  ArchitectureFile
18490 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  s)] && \..      
184a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73                [s
184b0 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 61 72  tring length $ar
184c0 63 68 69 74 65 63 74 75 72 65 5d 20 3e 20 30 7d  chitecture] > 0}
184d0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
184e0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61             forea
184f0 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74  ch fileName $nat
18500 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  iveFileNames {..
18510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18520 20 20 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d      tryCopyAssem
18530 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 24 61  bly $fileName $a
18540 72 63 68 69 74 65 63 74 75 72 65 0d 0a 20 20 20  rchitecture..   
18550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
18560 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18570 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
18580 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
18590 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
185a0 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
185b0 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71  ists ::no(copySq
185c0 6c 69 74 65 4d 61 6e 61 67 65 64 46 69 6c 65 73  liteManagedFiles
185d0 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
185e0 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
185f0 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61  h fileName $mana
18600 67 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  gedFileNames {..
18610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18620 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20  tryCopyAssembly 
18630 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  $fileName..     
18640 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
18650 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
18660 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
18670 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
18680 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72   # NOTE: Skip tr
18690 79 69 6e 67 20 74 6f 20 6c 6f 61 64 20 61 6e 79  ying to load any
186a0 20 66 69 6c 65 73 20 69 66 20 69 6e 73 74 72 75   files if instru
186b0 63 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20  cted...         
186c0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   #..          if
186d0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
186e0 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 46  ::no(loadSqliteF
186f0 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
18700 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
18710 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
18720 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 49 6d 70  no(loadSqliteImp
18730 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d 20 74 68  licitFiles)]} th
18740 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
18750 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73 65 6d      tryLoadAssem
18760 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  bly System.Data.
18770 53 51 4c 69 74 65 2e 64 6c 6c 0d 0a 20 20 20 20  SQLite.dll..    
18780 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
18790 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
187a0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
187b0 6c 6f 61 64 53 71 6c 69 74 65 4c 69 6e 71 46 69  loadSqliteLinqFi
187c0 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
187d0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
187e0 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20 53 79 73  LoadAssembly Sys
187f0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
18800 4c 69 6e 71 2e 64 6c 6c 0d 0a 20 20 20 20 20 20  Linq.dll..      
18810 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
18820 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
18830 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f  o exists ::no(lo
18840 61 64 53 71 6c 69 74 65 45 66 36 46 69 6c 65 73  adSqliteEf6Files
18850 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
18860 20 20 20 20 20 20 20 20 20 20 74 72 79 4c 6f 61            tryLoa
18870 64 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65 6d  dAssembly System
18880 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 45 46 36  .Data.SQLite.EF6
18890 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20  .dll..          
188a0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
188b0 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
188c0 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71  ists ::no(loadSq
188d0 6c 69 74 65 4e 6f 6e 49 6d 70 6c 69 63 69 74 46  liteNonImplicitF
188e0 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
188f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
18900 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
18910 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 50  ::no(loadSqliteP
18920 6c 61 74 66 6f 72 6d 46 69 6c 65 73 29 5d 20 26  latformFiles)] &
18930 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
18940 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
18950 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d  ength $platform]
18960 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
18970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
18980 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20 53 79  yLoadAssembly Sy
18990 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
189a0 2e 64 6c 6c 20 24 70 6c 61 74 66 6f 72 6d 0d 0a  .dll $platform..
189b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
189c0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
189d0 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
189e0 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69  ts ::no(loadSqli
189f0 74 65 41 72 63 68 69 74 65 63 74 75 72 65 46 69  teArchitectureFi
18a00 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20  les)] && \..    
18a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73                [s
18a20 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 61 72  tring length $ar
18a30 63 68 69 74 65 63 74 75 72 65 5d 20 3e 20 30 7d  chitecture] > 0}
18a40 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
18a50 20 20 20 20 20 20 20 20 20 74 72 79 4c 6f 61 64           tryLoad
18a60 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e  Assembly System.
18a70 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 20  Data.SQLite.dll 
18a80 24 61 72 63 68 69 74 65 63 74 75 72 65 0d 0a 20  $architecture.. 
18a90 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
18aa0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
18ab0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
18ac0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
18ad0 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20   catch {..      
18ae0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
18af0 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
18b00 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
18b10 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c         "---- fil
18b20 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 73  e version of \"s
18b30 71 6c 69 74 65 33 2e 64 6c 6c 5c 22 2e 2e 2e 20  qlite3.dll\"... 
18b40 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
18b50 20 20 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e     [file version
18b60 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
18b70 61 6d 65 20 73 71 6c 69 74 65 33 2e 64 6c 6c 5d  ame sqlite3.dll]
18b80 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d  ] \n]..        }
18b90 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63  ....        catc
18ba0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  h {..          t
18bb0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
18bc0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
18bd0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
18be0 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72    "---- file ver
18bf0 73 69 6f 6e 20 6f 66 20 5c 22 53 51 4c 69 74 65  sion of \"SQLite
18c00 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 5c 22 2e 2e  .Interop.dll\"..
18c10 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  . " \..         
18c20 20 20 20 20 20 5b 66 69 6c 65 20 76 65 72 73 69       [file versi
18c30 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c  on [getBinaryFil
18c40 65 4e 61 6d 65 20 53 51 4c 69 74 65 2e 49 6e 74  eName SQLite.Int
18c50 65 72 6f 70 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a  erop.dll]] \n]..
18c60 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
18c70 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
18c80 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
18c90 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
18ca0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
18cb0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
18cc0 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66   file version of
18cd0 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53   \"System.Data.S
18ce0 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22  QLite.dll\"... "
18cf0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
18d00 20 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20    [file version 
18d10 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61  [getBinaryFileNa
18d20 6d 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  me System.Data.S
18d30 51 4c 69 74 65 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d  QLite.dll]] \n].
18d40 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
18d50 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20        catch {.. 
18d60 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
18d70 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
18d80 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
18d90 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
18da0 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f  - file version o
18db0 66 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e  f \"System.Data.
18dc0 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 5c  SQLite.Linq.dll\
18dd0 22 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20  "... " \..      
18de0 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 76 65          [file ve
18df0 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79  rsion [getBinary
18e00 46 69 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e  FileName System.
18e10 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71  Data.SQLite.Linq
18e20 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20  .dll]] \n]..    
18e30 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
18e40 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20   catch {..      
18e50 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
18e60 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
18e70 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
18e80 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c         "---- fil
18e90 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53  e version of \"S
18ea0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
18eb0 65 2e 45 46 36 2e 64 6c 6c 5c 22 2e 2e 2e 20 22  e.EF6.dll\"... "
18ec0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
18ed0 20 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20    [file version 
18ee0 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61  [getBinaryFileNa
18ef0 6d 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  me System.Data.S
18f00 51 4c 69 74 65 2e 45 46 36 2e 64 6c 6c 5d 5d 20  QLite.EF6.dll]] 
18f10 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  \n]..        }..
18f20 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73  ..        if {[s
18f30 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c  tring length $pl
18f40 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65  atform] > 0} the
18f50 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  n {..          c
18f60 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
18f70 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
18f80 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
18f90 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
18fa0 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66           "---- f
18fb0 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c  ile version of \
18fc0 22 22 20 24 70 6c 61 74 66 6f 72 6d 20 5c 0d 0a  "" $platform \..
18fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fe0 22 2f 73 71 6c 69 74 65 33 2e 64 6c 6c 5c 22 2e  "/sqlite3.dll\".
18ff0 2e 2e 20 22 20 5b 66 69 6c 65 20 76 65 72 73 69  .. " [file versi
19000 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  on \..          
19010 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61 72 79        [getBinary
19020 46 69 6c 65 4e 61 6d 65 20 73 71 6c 69 74 65 33  FileName sqlite3
19030 2e 64 6c 6c 20 24 70 6c 61 74 66 6f 72 6d 5d 5d  .dll $platform]]
19040 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
19050 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 63  }....          c
19060 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
19070 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
19080 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
19090 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
190a0 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66           "---- f
190b0 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c  ile version of \
190c0 22 22 20 24 70 6c 61 74 66 6f 72 6d 20 5c 0d 0a  "" $platform \..
190d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190e0 22 2f 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70  "/SQLite.Interop
190f0 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5b 66 69 6c  .dll\"... " [fil
19100 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20  e version \..   
19110 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65               [ge
19120 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
19130 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64  SQLite.Interop.d
19140 6c 6c 20 24 70 6c 61 74 66 6f 72 6d 5d 5d 20 5c  ll $platform]] \
19150 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
19160 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61 74  ...          cat
19170 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
19180 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
19190 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
191a0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
191b0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c         "---- fil
191c0 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22  e version of \""
191d0 20 24 70 6c 61 74 66 6f 72 6d 20 5c 0d 0a 20 20   $platform \..  
191e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2f                "/
191f0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
19200 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5b 66  te.dll\"... " [f
19210 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20  ile version \.. 
19220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
19230 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
19240 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  e System.Data.SQ
19250 4c 69 74 65 2e 64 6c 6c 20 24 70 6c 61 74 66 6f  Lite.dll $platfo
19260 72 6d 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  rm]] \n]..      
19270 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
19280 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
19290 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
192a0 61 72 63 68 69 74 65 63 74 75 72 65 5d 20 3e 20  architecture] > 
192b0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
192c0 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
192d0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
192e0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
192f0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
19300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
19310 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f  ---- file versio
19320 6e 20 6f 66 20 5c 22 22 20 24 61 72 63 68 69 74  n of \"" $archit
19330 65 63 74 75 72 65 20 5c 0d 0a 20 20 20 20 20 20  ecture \..      
19340 20 20 20 20 20 20 20 20 20 20 22 2f 73 71 6c 69            "/sqli
19350 74 65 33 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5b  te3.dll\"... " [
19360 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a  file version \..
19370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19380 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61  [getBinaryFileNa
19390 6d 65 20 73 71 6c 69 74 65 33 2e 64 6c 6c 20 24  me sqlite3.dll $
193a0 61 72 63 68 69 74 65 63 74 75 72 65 5d 5d 20 5c  architecture]] \
193b0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
193c0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61 74  ...          cat
193d0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
193e0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
193f0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
19400 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
19410 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c         "---- fil
19420 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22  e version of \""
19430 20 24 61 72 63 68 69 74 65 63 74 75 72 65 20 5c   $architecture \
19440 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19450 20 20 22 2f 53 51 4c 69 74 65 2e 49 6e 74 65 72    "/SQLite.Inter
19460 6f 70 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5b 66  op.dll\"... " [f
19470 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20  ile version \.. 
19480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
19490 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
194a0 65 20 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70  e SQLite.Interop
194b0 2e 64 6c 6c 20 24 61 72 63 68 69 74 65 63 74 75  .dll $architectu
194c0 72 65 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  re]] \n]..      
194d0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
194e0 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20     catch {..    
194f0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
19500 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
19510 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
19520 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
19530 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20  -- file version 
19540 6f 66 20 5c 22 22 20 24 61 72 63 68 69 74 65 63  of \"" $architec
19550 74 75 72 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  ture \..        
19560 20 20 20 20 20 20 20 20 22 2f 53 79 73 74 65 6d          "/System
19570 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
19580 5c 22 2e 2e 2e 20 22 20 5b 66 69 6c 65 20 76 65  \"... " [file ve
19590 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20  rsion \..       
195a0 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e           [getBin
195b0 61 72 79 46 69 6c 65 4e 61 6d 65 20 53 79 73 74  aryFileName Syst
195c0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
195d0 6c 6c 20 24 61 72 63 68 69 74 65 63 74 75 72 65  ll $architecture
195e0 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ]] \n]..        
195f0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
19600 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
19610 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 47 72 61       # NOTE: Gra
19620 62 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6d 61  b the list of ma
19630 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 69 65 73  naged assemblies
19640 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
19650 20 70 72 6f 63 65 73 73 0d 0a 20 20 20 20 20 20   process..      
19660 20 20 23 20 20 20 20 20 20 20 61 6e 64 20 72 65    #       and re
19670 70 6f 72 74 20 6f 6e 20 74 68 65 20 53 79 73 74  port on the Syst
19680 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 72  em.Data.SQLite r
19690 65 6c 61 74 65 64 20 6f 6e 65 73 2e 0d 0a 20 20  elated ones...  
196a0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
196b0 20 73 65 74 20 61 73 73 65 6d 62 6c 69 65 73 20   set assemblies 
196c0 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 41  [object invoke A
196d0 70 70 44 6f 6d 61 69 6e 2e 43 75 72 72 65 6e 74  ppDomain.Current
196e0 44 6f 6d 61 69 6e 20 47 65 74 41 73 73 65 6d 62  Domain GetAssemb
196f0 6c 69 65 73 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  lies]....       
19700 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20   object foreach 
19710 61 73 73 65 6d 62 6c 79 20 24 61 73 73 65 6d 62  assembly $assemb
19720 6c 69 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  lies {..        
19730 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61    if {[string ma
19740 74 63 68 20 5c 7b 53 79 73 74 65 6d 2e 44 61 74  tch \{System.Dat
19750 61 2e 53 51 4c 69 74 65 2a 20 24 61 73 73 65 6d  a.SQLite* $assem
19760 62 6c 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  bly]} then {..  
19770 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
19780 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
19790 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
197a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
197b0 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c 6f 61 64 65  ---- found loade
197c0 64 20 61 73 73 65 6d 62 6c 79 3a 20 22 20 24 61  d assembly: " $a
197d0 73 73 65 6d 62 6c 79 20 5c 6e 5d 0d 0a 20 20 20  ssembly \n]..   
197e0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
197f0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63    }....        c
19800 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
19810 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
19820 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20  channel \..     
19830 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 64           "---- d
19840 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74 73 20  efine constants 
19850 66 6f 72 20 5c 22 53 79 73 74 65 6d 2e 44 61 74  for \"System.Dat
19860 61 2e 53 51 4c 69 74 65 5c 22 2e 2e 2e 20 22 0d  a.SQLite\"... ".
19870 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
19880 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
19890 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
198a0 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
198b0 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
198c0 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
198d0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
198e0 69 74 65 33 20 44 65 66 69 6e 65 43 6f 6e 73 74  ite3 DefineConst
198f0 61 6e 74 73 0d 0a 20 20 20 20 20 20 20 20 20 20  ants..          
19900 7d 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74  } defineConstant
19910 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  s] == 0} then {.
19920 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
19930 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
19940 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b  el [appendArgs [
19950 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73 6f 72  formatList [lsor
19960 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
19970 20 20 20 20 20 24 64 65 66 69 6e 65 43 6f 6e 73       $defineCons
19980 74 61 6e 74 73 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c  tants] <none>] \
19990 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  n]..          } 
199a0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
199b0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
199c0 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77  t_channel unknow
199d0 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  n\n..          }
199e0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
199f0 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a         catch {..
19a00 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
19a10 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
19a20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
19a30 20 22 2d 2d 2d 2d 20 73 6f 75 72 63 65 20 76 65   "---- source ve
19a40 72 73 69 6f 6e 20 6f 66 20 5c 22 53 79 73 74 65  rsion of \"Syste
19a50 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
19a60 6c 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  l\"... "....    
19a70 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
19a80 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
19a90 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
19aa0 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
19ab0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
19ac0 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
19ad0 51 4c 69 74 65 2e 53 51 4c 69 74 65 43 6f 6e 6e  QLite.SQLiteConn
19ae0 65 63 74 69 6f 6e 20 50 72 6f 76 69 64 65 72 56  ection ProviderV
19af0 65 72 73 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20  ersion..        
19b00 20 20 7d 20 76 65 72 73 69 6f 6e 5d 20 3d 3d 20    } version] == 
19b10 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
19b20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
19b30 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72 73 69  ng length $versi
19b40 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  on] == 0} then {
19b50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19b60 73 65 74 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c  set version null
19b70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
19b80 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
19b90 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
19ba0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  el [appendArgs $
19bb0 76 65 72 73 69 6f 6e 20 5c 6e 5d 0d 0a 20 20 20  version \n]..   
19bc0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
19bd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
19be0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
19bf0 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20  el unknown\n..  
19c00 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
19c10 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
19c20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
19c30 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
19c40 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20  _channel \..    
19c50 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
19c60 73 6f 75 72 63 65 20 63 68 65 63 6b 6f 75 74 20  source checkout 
19c70 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61  of \"System.Data
19c80 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e  .SQLite.dll\"...
19c90 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   "....          
19ca0 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
19cb0 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
19cc0 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
19cd0 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
19ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
19cf0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
19d00 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
19d10 20 50 72 6f 76 69 64 65 72 53 6f 75 72 63 65 49   ProviderSourceI
19d20 64 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 73  d..          } s
19d30 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74  ourceId] == 0} t
19d40 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
19d50 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
19d60 65 6e 67 74 68 20 24 73 6f 75 72 63 65 49 64 5d  ength $sourceId]
19d70 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
19d80 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
19d90 20 73 6f 75 72 63 65 49 64 20 6e 75 6c 6c 0d 0a   sourceId null..
19da0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
19db0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
19dc0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
19dd0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 73 6f   [appendArgs $so
19de0 75 72 63 65 49 64 20 5c 6e 5d 0d 0a 20 20 20 20  urceId \n]..    
19df0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
19e00 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
19e10 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
19e20 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20  l unknown\n..   
19e30 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
19e40 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
19e50 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
19e60 3a 20 43 68 65 63 6b 20 74 68 65 20 61 76 61 69  : Check the avai
19e70 6c 61 62 6c 65 20 62 75 69 6c 64 73 20 28 61 6e  lable builds (an
19e80 64 20 22 72 65 6c 65 61 73 65 73 22 29 20 6f 66  d "releases") of
19e90 20 53 51 4c 69 74 65 20 61 6e 64 0d 0a 20 20 20   SQLite and..   
19ea0 20 20 20 20 20 23 20 20 20 20 20 20 20 53 79 73       #       Sys
19eb0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
19ec0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
19ed0 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c       checkForSQL
19ee0 69 74 65 42 75 69 6c 64 73 20 24 3a 3a 74 65 73  iteBuilds $::tes
19ef0 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20  t_channel..     
19f00 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74     checkForSQLit
19f10 65 52 65 6c 65 61 73 65 73 20 24 3a 3a 74 65 73  eReleases $::tes
19f20 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20  t_channel....   
19f30 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
19f40 23 20 4e 4f 54 45 3a 20 4e 6f 77 2c 20 77 65 20  # NOTE: Now, we 
19f50 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 66 20  need to know if 
19f60 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20  the SQLite core 
19f70 6c 69 62 72 61 72 79 20 69 73 20 61 76 61 69 6c  library is avail
19f80 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20  able..        # 
19f90 20 20 20 20 20 20 28 69 2e 65 2e 20 62 65 63 61        (i.e. beca
19fa0 75 73 65 20 74 68 65 20 6d 61 6e 61 67 65 64 2d  use the managed-
19fb0 6f 6e 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61  only System.Data
19fc0 2e 53 51 4c 69 74 65 20 61 73 73 65 6d 62 6c 79  .SQLite assembly
19fd0 20 63 61 6e 0d 0a 20 20 20 20 20 20 20 20 23 20   can..        # 
19fe0 20 20 20 20 20 20 6c 6f 61 64 20 77 69 74 68 6f        load witho
19ff0 75 74 20 69 74 3b 20 68 6f 77 65 76 65 72 2c 20  ut it; however, 
1a000 69 74 20 63 61 6e 6e 6f 74 20 64 6f 20 61 6e 79  it cannot do any
1a010 74 68 69 6e 67 20 75 73 65 66 75 6c 20 77 69 74  thing useful wit
1a020 68 6f 75 74 0d 0a 20 20 20 20 20 20 20 20 23 20  hout..        # 
1a030 20 20 20 20 20 20 69 74 29 2e 20 20 49 66 20 77        it).  If w
1a040 65 20 61 72 65 20 75 73 69 6e 67 20 74 68 65 20  e are using the 
1a050 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d  mixed-mode assem
1a060 62 6c 79 20 61 6e 64 20 77 65 20 61 6c 72 65 61  bly and we alrea
1a070 64 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  dy..        #   
1a080 20 20 20 20 66 6f 75 6e 64 20 69 74 20 28 61 62      found it (ab
1a090 6f 76 65 29 2c 20 74 68 69 73 20 73 68 6f 75 6c  ove), this shoul
1a0a0 64 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64  d always succeed
1a0b0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1a0c0 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51        checkForSQ
1a0d0 4c 69 74 65 4c 69 62 72 61 72 79 20 24 3a 3a 74  LiteLibrary $::t
1a0e0 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20  est_channel.... 
1a0f0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1a100 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
1a110 69 66 20 74 68 65 20 53 51 4c 69 74 65 20 69 6e  if the SQLite in
1a120 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 69  terop assembly i
1a130 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20  s available...  
1a140 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1a150 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 49   checkForSQLiteI
1a160 6e 74 65 72 6f 70 20 24 3a 3a 74 65 73 74 5f 63  nterop $::test_c
1a170 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20  hannel....      
1a180 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
1a190 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20 53  OTE: Check the S
1a1a0 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 61  QLite database a
1a1b0 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72  nd temporary dir
1a1c0 65 63 74 6f 72 69 65 73 2e 0d 0a 20 20 20 20 20  ectories...     
1a1d0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68     #..        ch
1a1e0 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 69 72 65  eckForSQLiteDire
1a1f0 63 74 6f 72 69 65 73 20 24 3a 3a 74 65 73 74 5f  ctories $::test_
1a200 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20  channel....     
1a210 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1a220 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
1a230 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 76 61   determine if va
1a240 72 69 6f 75 73 20 63 6f 6d 70 69 6c 65 2d 74 69  rious compile-ti
1a250 6d 65 20 6f 70 74 69 6f 6e 73 20 6e 65 65 64 65  me options neede
1a260 64 20 66 6f 72 0d 0a 20 20 20 20 20 20 20 20 23  d for..        #
1a270 20 20 20 20 20 20 20 74 65 73 74 20 63 6f 6e 73         test cons
1a280 74 72 61 69 6e 74 73 20 77 65 72 65 20 65 6e 61  traints were ena
1a290 62 6c 65 64 20 66 6f 72 20 74 68 65 20 6d 61 6e  bled for the man
1a2a0 61 67 65 64 20 61 73 73 65 6d 62 6c 79 2e 20 20  aged assembly.  
1a2b0 54 68 65 72 65 0d 0a 20 20 20 20 20 20 20 20 23  There..        #
1a2c0 20 20 20 20 20 20 20 61 72 65 20 73 6f 6d 65 20         are some 
1a2d0 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
1a2e0 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20 61  ions that must a
1a2f0 6c 73 6f 20 68 61 76 65 20 62 65 65 6e 20 65 6e  lso have been en
1a300 61 62 6c 65 64 0d 0a 20 20 20 20 20 20 20 20 23  abled..        #
1a310 20 20 20 20 20 20 20 66 6f 72 20 74 68 65 20 69         for the i
1a320 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20  nterop assembly 
1a330 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 65  in order to be e
1a340 66 66 65 63 74 69 76 65 2e 20 20 46 6f 72 20 74  ffective.  For t
1a350 68 6f 73 65 0d 0a 20 20 20 20 20 20 20 20 23 20  hose..        # 
1a360 20 20 20 20 20 20 6f 70 74 69 6f 6e 73 2c 20 69        options, i
1a370 74 20 77 69 6c 6c 20 62 65 20 61 73 73 75 6d 65  t will be assume
1a380 64 20 74 68 61 74 20 69 74 20 77 61 73 20 65 6e  d that it was en
1a390 61 62 6c 65 64 20 66 6f 72 20 74 68 65 20 69 6e  abled for the in
1a3a0 74 65 72 6f 70 0d 0a 20 20 20 20 20 20 20 20 23  terop..        #
1a3b0 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 20         assembly 
1a3c0 69 66 20 69 74 20 77 61 73 20 65 6e 61 62 6c 65  if it was enable
1a3d0 64 20 66 6f 72 20 74 68 65 20 6d 61 6e 61 67 65  d for the manage
1a3e0 64 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20  d assembly...   
1a3f0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1a400 66 6f 72 65 61 63 68 20 64 65 66 69 6e 65 43 6f  foreach defineCo
1a410 6e 73 74 61 6e 74 20 5b 6c 69 73 74 20 5c 0d 0a  nstant [list \..
1a420 20 20 20 20 20 20 20 20 20 20 20 20 43 48 45 43              CHEC
1a430 4b 5f 53 54 41 54 45 20 43 4f 55 4e 54 5f 48 41  K_STATE COUNT_HA
1a440 4e 44 4c 45 20 44 45 42 55 47 20 49 4e 54 45 52  NDLE DEBUG INTER
1a450 4f 50 5f 43 4f 44 45 43 20 49 4e 54 45 52 4f 50  OP_CODEC INTEROP
1a460 5f 44 45 42 55 47 20 5c 0d 0a 20 20 20 20 20 20  _DEBUG \..      
1a470 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 45 58        INTEROP_EX
1a480 54 45 4e 53 49 4f 4e 5f 46 55 4e 43 54 49 4f 4e  TENSION_FUNCTION
1a490 53 20 49 4e 54 45 52 4f 50 5f 4c 45 47 41 43 59  S INTEROP_LEGACY
1a4a0 5f 43 4c 4f 53 45 20 49 4e 54 45 52 4f 50 5f 4c  _CLOSE INTEROP_L
1a4b0 4f 47 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  OG \..          
1a4c0 20 20 49 4e 54 45 52 4f 50 5f 54 45 53 54 5f 45    INTEROP_TEST_E
1a4d0 58 54 45 4e 53 49 4f 4e 20 49 4e 54 45 52 4f 50  XTENSION INTEROP
1a4e0 5f 56 49 52 54 55 41 4c 5f 54 41 42 4c 45 20 4e  _VIRTUAL_TABLE N
1a4f0 45 54 5f 32 30 20 4e 45 54 5f 33 35 20 5c 0d 0a  ET_20 NET_35 \..
1a500 20 20 20 20 20 20 20 20 20 20 20 20 4e 45 54 5f              NET_
1a510 34 30 20 4e 45 54 5f 34 35 20 4e 45 54 5f 34 35  40 NET_45 NET_45
1a520 31 20 4e 45 54 5f 43 4f 4d 50 41 43 54 5f 32 30  1 NET_COMPACT_20
1a530 20 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50 41 43   PLATFORM_COMPAC
1a540 54 46 52 41 4d 45 57 4f 52 4b 20 5c 0d 0a 20 20  TFRAMEWORK \..  
1a550 20 20 20 20 20 20 20 20 20 20 50 52 45 4c 4f 41            PRELOA
1a560 44 5f 4e 41 54 49 56 45 5f 4c 49 42 52 41 52 59  D_NATIVE_LIBRARY
1a570 20 52 45 54 41 52 47 45 54 41 42 4c 45 20 53 51   RETARGETABLE SQ
1a580 4c 49 54 45 5f 53 54 41 4e 44 41 52 44 20 5c 0d  LITE_STANDARD \.
1a590 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 48 52  .            THR
1a5a0 4f 57 5f 4f 4e 5f 44 49 53 50 4f 53 45 44 20 54  OW_ON_DISPOSED T
1a5b0 52 41 43 45 20 54 52 41 43 45 5f 43 4f 4e 4e 45  RACE TRACE_CONNE
1a5c0 43 54 49 4f 4e 20 54 52 41 43 45 5f 44 45 54 45  CTION TRACE_DETE
1a5d0 43 54 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20  CTION \..       
1a5e0 20 20 20 20 20 54 52 41 43 45 5f 48 41 4e 44 4c       TRACE_HANDL
1a5f0 45 20 54 52 41 43 45 5f 50 52 45 4c 4f 41 44 20  E TRACE_PRELOAD 
1a600 54 52 41 43 45 5f 53 48 41 52 45 44 20 54 52 41  TRACE_SHARED TRA
1a610 43 45 5f 53 54 41 54 45 4d 45 4e 54 20 5c 0d 0a  CE_STATEMENT \..
1a620 20 20 20 20 20 20 20 20 20 20 20 20 54 52 41 43              TRAC
1a630 45 5f 57 41 52 4e 49 4e 47 20 54 52 41 43 4b 5f  E_WARNING TRACK_
1a640 4d 45 4d 4f 52 59 5f 42 59 54 45 53 20 55 53 45  MEMORY_BYTES USE
1a650 5f 45 4e 54 49 54 59 5f 46 52 41 4d 45 57 4f 52  _ENTITY_FRAMEWOR
1a660 4b 5f 36 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  K_6 \..         
1a670 20 20 20 55 53 45 5f 49 4e 54 45 52 4f 50 5f 44     USE_INTEROP_D
1a680 4c 4c 20 55 53 45 5f 50 52 45 50 41 52 45 5f 56  LL USE_PREPARE_V
1a690 32 20 57 49 4e 44 4f 57 53 5d 20 7b 0d 0a 20 20  2 WINDOWS] {..  
1a6a0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1a6b0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
1a6c0 63 6b 20 69 66 20 74 68 65 20 63 6f 6d 70 69 6c  ck if the compil
1a6d0 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
1a6e0 20 6c 69 73 74 65 64 20 69 6e 20 74 68 65 20 6c   listed in the l
1a6f0 69 73 74 20 6f 66 0d 0a 20 20 20 20 20 20 20 20  ist of..        
1a700 20 20 23 20 20 20 20 20 20 20 22 64 65 66 69 6e    #       "defin
1a710 65 20 63 6f 6e 73 74 61 6e 74 73 22 20 6b 65 70  e constants" kep
1a720 74 20 74 72 61 63 6b 20 6f 66 20 62 79 20 74 68  t track of by th
1a730 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62  e managed assemb
1a740 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ly...          #
1a750 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63  ..          chec
1a760 6b 46 6f 72 53 51 4c 69 74 65 44 65 66 69 6e 65  kForSQLiteDefine
1a770 43 6f 6e 73 74 61 6e 74 20 24 3a 3a 74 65 73 74  Constant $::test
1a780 5f 63 68 61 6e 6e 65 6c 20 24 64 65 66 69 6e 65  _channel $define
1a790 43 6f 6e 73 74 61 6e 74 0d 0a 20 20 20 20 20 20  Constant..      
1a7a0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
1a7b0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1a7c0 3a 20 43 68 65 63 6b 20 74 68 65 20 63 75 72 72  : Check the curr
1a7d0 65 6e 74 20 62 75 69 6c 64 20 79 65 61 72 2e 20  ent build year. 
1a7e0 20 42 61 73 69 63 61 6c 6c 79 2c 20 74 68 69 73   Basically, this
1a7f0 20 69 6e 64 69 63 61 74 65 73 0d 0a 20 20 20 20   indicates..    
1a800 20 20 20 20 23 20 20 20 20 20 20 20 77 68 69 63      #       whic
1a810 68 20 76 65 72 73 69 6f 6e 20 6f 66 20 4d 53 42  h version of MSB
1a820 75 69 6c 64 20 61 6e 64 2f 6f 72 20 56 69 73 75  uild and/or Visu
1a830 61 6c 20 53 74 75 64 69 6f 20 77 61 73 20 75 73  al Studio was us
1a840 65 64 20 74 6f 0d 0a 20 20 20 20 20 20 20 20 23  ed to..        #
1a850 20 20 20 20 20 20 20 63 6f 6d 70 69 6c 65 20 74         compile t
1a860 68 65 20 61 73 73 65 6d 62 6c 79 20 62 69 6e 61  he assembly bina
1a870 72 69 65 73 20 75 6e 64 65 72 20 74 65 73 74 2e  ries under test.
1a880 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1a890 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
1a8a0 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20  st_channel \..  
1a8b0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
1a8c0 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73  checking for Sys
1a8d0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
1a8e0 62 75 69 6c 64 20 79 65 61 72 2e 2e 2e 20 22 0d  build year... ".
1a8f0 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 79  ...        set y
1a900 65 61 72 20 5b 67 65 74 42 75 69 6c 64 59 65 61  ear [getBuildYea
1a910 72 5d 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43  r]..        addC
1a920 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
1a930 64 41 72 67 73 20 62 75 69 6c 64 59 65 61 72 2e  dArgs buildYear.
1a940 20 24 79 65 61 72 5d 0d 0a 20 20 20 20 20 20 20   $year]..       
1a950 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
1a960 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1a970 67 73 20 5c 22 20 24 79 65 61 72 20 5c 22 5c 6e  gs \" $year \"\n
1a980 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
1a990 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1a9a0 43 68 65 63 6b 20 74 68 65 20 63 75 72 72 65 6e  Check the curren
1a9b0 74 20 62 75 69 6c 64 20 2e 4e 45 54 20 46 72 61  t build .NET Fra
1a9c0 6d 65 77 6f 72 6b 2e 20 20 42 61 73 69 63 61 6c  mework.  Basical
1a9d0 6c 79 2c 20 74 68 69 73 0d 0a 20 20 20 20 20 20  ly, this..      
1a9e0 20 20 23 20 20 20 20 20 20 20 69 6e 64 69 63 61    #       indica
1a9f0 74 65 73 20 77 68 69 63 68 20 76 65 72 73 69 6f  tes which versio
1aa00 6e 20 6f 66 20 74 68 65 20 2e 4e 45 54 20 46 72  n of the .NET Fr
1aa10 61 6d 65 77 6f 72 6b 20 69 73 20 62 65 69 6e 67  amework is being
1aa20 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1aa30 20 20 75 73 65 64 20 62 79 20 74 68 65 20 61 73    used by the as
1aa40 73 65 6d 62 6c 79 20 62 69 6e 61 72 69 65 73 20  sembly binaries 
1aa50 75 6e 64 65 72 20 74 65 73 74 2e 0d 0a 20 20 20  under test...   
1aa60 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1aa70 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
1aa80 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20  annel \..       
1aa90 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b       "---- check
1aaa0 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e 44  ing for System.D
1aab0 61 74 61 2e 53 51 4c 69 74 65 20 62 75 69 6c 64  ata.SQLite build
1aac0 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 2e   .NET Framework.
1aad0 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20  .. "....        
1aae0 73 65 74 20 6e 65 74 46 78 20 5b 67 65 74 42 75  set netFx [getBu
1aaf0 69 6c 64 4e 65 74 46 78 5d 0d 0a 20 20 20 20 20  ildNetFx]..     
1ab00 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
1ab10 20 5b 61 70 70 65 6e 64 41 72 67 73 20 62 75 69   [appendArgs bui
1ab20 6c 64 46 72 61 6d 65 77 6f 72 6b 2e 20 24 6e 65  ldFramework. $ne
1ab30 74 46 78 5d 0d 0a 20 20 20 20 20 20 20 20 74 70  tFx]..        tp
1ab40 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
1ab50 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1ab60 5c 22 20 24 6e 65 74 46 78 20 5c 22 5c 6e 5d 0d  \" $netFx \"\n].
1ab70 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1ab80 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
1ab90 65 63 6b 20 74 68 65 20 63 75 72 72 65 6e 74 20  eck the current 
1aba0 62 75 69 6c 64 20 63 6f 6e 66 69 67 75 72 61 74  build configurat
1abb0 69 6f 6e 2e 20 20 54 68 69 73 20 73 68 6f 75 6c  ion.  This shoul
1abc0 64 20 6e 6f 72 6d 61 6c 6c 79 0d 0a 20 20 20 20  d normally..    
1abd0 20 20 20 20 23 20 20 20 20 20 20 20 62 65 20 65      #       be e
1abe0 69 74 68 65 72 20 22 44 65 62 75 67 22 20 6f 72  ither "Debug" or
1abf0 20 22 52 65 6c 65 61 73 65 22 2e 0d 0a 20 20 20   "Release"...   
1ac00 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1ac10 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
1ac20 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20  annel \..       
1ac30 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b       "---- check
1ac40 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e 44  ing for System.D
1ac50 61 74 61 2e 53 51 4c 69 74 65 20 62 75 69 6c 64  ata.SQLite build
1ac60 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 2e   configuration..
1ac70 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73  . "....        s
1ac80 65 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  et configuration
1ac90 20 5b 67 65 74 42 75 69 6c 64 43 6f 6e 66 69 67   [getBuildConfig
1aca0 75 72 61 74 69 6f 6e 5d 0d 0a 20 20 20 20 20 20  uration]..      
1acb0 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
1acc0 5b 61 70 70 65 6e 64 41 72 67 73 20 62 75 69 6c  [appendArgs buil
1acd0 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20  dConfiguration. 
1ace0 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 0d  $configuration].
1acf0 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
1ad00 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
1ad10 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24 63  appendArgs \" $c
1ad20 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 5c 22 5c  onfiguration \"\
1ad30 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  n]....        #.
1ad40 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
1ad50 20 54 72 79 20 74 6f 20 73 65 74 75 70 20 61 6e   Try to setup an
1ad60 20 69 6e 74 65 72 72 75 70 74 20 63 61 6c 6c 62   interrupt callb
1ad70 61 63 6b 20 75 73 69 6e 67 20 74 68 65 20 73 63  ack using the sc
1ad80 72 69 70 74 20 64 65 62 75 67 67 65 72 0d 0a 20  ript debugger.. 
1ad90 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
1ada0 68 61 74 20 77 69 6c 6c 20 63 61 6e 63 65 6c 20  hat will cancel 
1adb0 61 6c 6c 20 53 51 4c 20 71 75 65 72 69 65 73 20  all SQL queries 
1adc0 69 6e 20 70 72 6f 67 72 65 73 73 20 66 6f 72 20  in progress for 
1add0 61 6c 6c 20 64 61 74 61 62 61 73 65 0d 0a 20 20  all database..  
1ade0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
1adf0 6e 6e 65 63 74 69 6f 6e 73 20 6b 6e 6f 77 6e 20  nnections known 
1ae00 74 6f 20 74 68 69 73 20 69 6e 74 65 72 70 72 65  to this interpre
1ae10 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ter...        #.
1ae20 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69  .        if {![i
1ae30 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
1ae40 73 71 6c 69 74 65 49 6e 74 65 72 72 75 70 74 43  sqliteInterruptC
1ae50 61 6c 6c 62 61 63 6b 29 5d 7d 20 74 68 65 6e 20  allback)]} then 
1ae60 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
1ae70 75 70 44 62 49 6e 74 65 72 72 75 70 74 43 61 6c  upDbInterruptCal
1ae80 6c 62 61 63 6b 20 24 3a 3a 74 65 73 74 5f 63 68  lback $::test_ch
1ae90 61 6e 6e 65 6c 20 24 3a 3a 74 65 73 74 5f 6c 6f  annel $::test_lo
1aea0 67 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  g..        }....
1aeb0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1aec0 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
1aed0 20 66 6f 72 20 74 68 65 20 6e 61 74 69 76 65 20   for the native 
1aee0 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 2c 20  runtime option, 
1aef0 77 68 69 63 68 20 77 6f 75 6c 64 20 6d 65 61 6e  which would mean
1af00 20 77 65 20 61 72 65 0d 0a 20 20 20 20 20 20 20   we are..       
1af10 20 23 20 20 20 20 20 20 20 75 73 69 6e 67 20 74   #       using t
1af20 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73  he mixed-mode as
1af30 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20  sembly...       
1af40 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63   #..        chec
1af50 6b 46 6f 72 52 75 6e 74 69 6d 65 4f 70 74 69 6f  kForRuntimeOptio
1af60 6e 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  n $::test_channe
1af70 6c 20 6e 61 74 69 76 65 0d 0a 0d 0a 20 20 20 20  l native....    
1af80 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1af90 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20   NOTE: Check if 
1afa0 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20 73  the test suite s
1afb0 68 6f 75 6c 64 20 63 6f 75 6e 74 20 74 68 65 20  hould count the 
1afc0 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 6e 65 63  number of connec
1afd0 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20 23  tions..        #
1afe0 20 20 20 20 20 20 20 22 6f 70 65 6e 65 64 22 20         "opened" 
1aff0 61 6e 64 20 22 63 6c 6f 73 65 64 22 20 66 72 6f  and "closed" fro
1b000 6d 20 74 68 65 20 70 6f 6f 6c 20 77 68 65 6e 20  m the pool when 
1b010 64 65 74 65 72 6d 69 6e 69 6e 67 20 69 66 20 61  determining if a
1b020 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20 23   test..        #
1b030 20 20 20 20 20 20 20 70 61 73 73 65 64 2e 20 20         passed.  
1b040 44 69 73 61 62 6c 69 6e 67 20 74 68 69 73 20 62  Disabling this b
1b050 65 68 61 76 69 6f 72 20 69 73 20 73 6f 6d 65 74  ehavior is somet
1b060 69 6d 65 73 20 6e 65 63 65 73 73 61 72 79 20 28  imes necessary (
1b070 65 2e 67 2e 0d 0a 20 20 20 20 20 20 20 20 23 20  e.g...        # 
1b080 20 20 20 20 20 20 64 75 72 69 6e 67 20 74 68 65        during the
1b090 20 72 65 6c 65 61 73 65 20 74 65 73 74 69 6e 67   release testing
1b0a0 20 70 72 6f 63 65 73 73 29 20 62 65 63 61 75 73   process) becaus
1b0b0 65 20 74 68 65 72 65 20 61 72 65 20 73 65 76 65  e there are seve
1b0c0 72 61 6c 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ral..        #  
1b0d0 20 20 20 20 20 74 65 73 74 73 20 74 68 61 74 20       tests that 
1b0e0 72 65 6c 79 20 6f 6e 20 74 68 65 20 22 6f 70 65  rely on the "ope
1b0f0 6e 65 64 20 66 72 6f 6d 20 70 6f 6f 6c 22 20 63  ned from pool" c
1b100 6f 75 6e 74 20 62 65 69 6e 67 20 67 72 65 61 74  ount being great
1b110 65 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  er..        #   
1b120 20 20 20 20 74 68 61 6e 20 7a 65 72 6f 2e 20 20      than zero.  
1b130 54 68 65 73 65 20 74 65 73 74 73 20 6d 61 79 20  These tests may 
1b140 66 61 69 6c 20 64 75 65 20 74 6f 20 74 68 65 20  fail due to the 
1b150 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69  non-deterministi
1b160 63 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  c..        #    
1b170 20 20 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74     behavior of t
1b180 68 65 20 43 4c 52 20 47 43 2c 20 65 76 65 6e 20  he CLR GC, even 
1b190 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f  when there is no
1b1a0 20 62 75 67 20 69 6e 20 74 68 65 20 63 6f 64 65   bug in the code
1b1b0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1b1c0 20 20 62 65 69 6e 67 20 74 65 73 74 65 64 2e 0d    being tested..
1b1d0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1b1e0 20 20 20 20 63 68 65 63 6b 46 6f 72 52 75 6e 74      checkForRunt
1b1f0 69 6d 65 4f 70 74 69 6f 6e 20 24 3a 3a 74 65 73  imeOption $::tes
1b200 74 5f 63 68 61 6e 6e 65 6c 20 6e 6f 50 6f 6f 6c  t_channel noPool
1b210 43 6f 75 6e 74 73 0d 0a 0d 0a 20 20 20 20 20 20  Counts....      
1b220 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
1b230 4f 54 45 3a 20 52 65 70 6f 72 74 20 74 68 65 20  OTE: Report the 
1b240 72 65 73 6f 75 72 63 65 20 75 73 61 67 65 20 70  resource usage p
1b250 72 69 6f 72 20 74 6f 20 72 75 6e 6e 69 6e 67 20  rior to running 
1b260 61 6e 79 20 74 65 73 74 73 2e 0d 0a 20 20 20 20  any tests...    
1b270 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
1b280 65 70 6f 72 74 53 51 4c 69 74 65 52 65 73 6f 75  eportSQLiteResou
1b290 72 63 65 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  rces $::test_cha
1b2a0 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nnel....        
1b2b0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
1b2c0 45 3a 20 47 72 61 62 20 74 68 65 20 6c 69 73 74  E: Grab the list
1b2d0 20 6f 66 20 6e 61 74 69 76 65 20 6d 6f 64 75 6c   of native modul
1b2e0 65 73 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  es for the curre
1b2f0 6e 74 20 70 72 6f 63 65 73 73 20 61 6e 64 0d 0a  nt process and..
1b300 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1b310 72 65 70 6f 72 74 20 6f 6e 20 74 68 65 20 53 79  report on the Sy
1b320 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
1b330 20 72 65 6c 61 74 65 64 20 6f 6e 65 73 2e 0d 0a   related ones...
1b340 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1b350 20 20 20 73 65 74 20 6d 6f 64 75 6c 65 73 20 5b     set modules [
1b360 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 5c 0d  object invoke \.
1b370 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73  .            Sys
1b380 74 65 6d 2e 44 69 61 67 6e 6f 73 74 69 63 73 2e  tem.Diagnostics.
1b390 50 72 6f 63 65 73 73 2e 47 65 74 43 75 72 72 65  Process.GetCurre
1b3a0 6e 74 50 72 6f 63 65 73 73 20 4d 6f 64 75 6c 65  ntProcess Module
1b3b0 73 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 6f 62  s]....        ob
1b3c0 6a 65 63 74 20 66 6f 72 65 61 63 68 20 2d 61 6c  ject foreach -al
1b3d0 69 61 73 20 6d 6f 64 75 6c 65 20 24 6d 6f 64 75  ias module $modu
1b3e0 6c 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  les {..         
1b3f0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
1b400 4e 4f 54 45 3a 20 54 68 65 20 6d 6f 64 75 6c 65  NOTE: The module
1b410 20 66 69 6c 65 20 6e 61 6d 65 20 68 65 72 65 20   file name here 
1b420 6d 75 73 74 20 62 65 20 6e 6f 72 6d 61 6c 69 7a  must be normaliz
1b430 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ed...          #
1b440 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
1b450 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e  fileName [file n
1b460 6f 72 6d 61 6c 69 7a 65 20 5b 24 6d 6f 64 75 6c  ormalize [$modul
1b470 65 20 46 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 0d 0a  e FileName]]....
1b480 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73            if {[s
1b490 74 72 69 6e 67 20 6d 61 74 63 68 20 2d 6e 6f 63  tring match -noc
1b4a0 61 73 65 20 2a 2f 73 71 6c 69 74 65 33 2e 64 6c  ase */sqlite3.dl
1b4b0 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  l $fileName]} th
1b4c0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1b4d0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
1b4e0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1b4f0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1b500 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 6f 75         "---- fou
1b510 6e 64 20 6c 6f 61 64 65 64 20 53 51 4c 69 74 65  nd loaded SQLite
1b520 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79 20   native library 
1b530 6d 6f 64 75 6c 65 3a 20 22 20 5c 0d 0a 20 20 20  module: " \..   
1b540 20 20 20 20 20 20 20 20 20 20 20 20 20 24 66 69               $fi
1b550 6c 65 4e 61 6d 65 20 5c 6e 5d 0d 0a 20 20 20 20  leName \n]..    
1b560 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
1b570 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 5c 0d  [string match \.
1b580 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d  .              -
1b590 6e 6f 63 61 73 65 20 2a 2f 53 51 4c 69 74 65 2e  nocase */SQLite.
1b5a0 49 6e 74 65 72 6f 70 2e 64 6c 6c 20 24 66 69 6c  Interop.dll $fil
1b5b0 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
1b5c0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1b5d0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1b5e0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1b5f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b600 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c 6f 61   "---- found loa
1b610 64 65 64 20 53 51 4c 69 74 65 20 69 6e 74 65 72  ded SQLite inter
1b620 6f 70 20 61 73 73 65 6d 62 6c 79 20 6d 6f 64 75  op assembly modu
1b630 6c 65 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  le: " \..       
1b640 20 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61           $fileNa
1b650 6d 65 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  me \n]..        
1b660 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
1b670 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20  ..        catch 
1b680 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
1b690 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
1b6a0 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  el \..          
1b6b0 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 6d 70 69 6c      "---- compil
1b6c0 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 66  e-time options f
1b6d0 6f 72 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c  or SQLite core l
1b6e0 69 62 72 61 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20  ibrary... ".... 
1b6f0 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
1b700 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
1b710 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
1b720 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
1b730 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
1b740 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
1b750 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33  a.SQLite.SQLite3
1b760 20 53 51 4c 69 74 65 43 6f 6d 70 69 6c 65 4f 70   SQLiteCompileOp
1b770 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20 20  tions..         
1b780 20 7d 20 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e   } compileOption
1b790 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  s] == 0} then {.
1b7a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
1b7b0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
1b7c0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b  el [appendArgs [
1b7d0 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73 6f 72  formatList [lsor
1b7e0 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
1b7f0 20 20 20 20 20 24 63 6f 6d 70 69 6c 65 4f 70 74       $compileOpt
1b800 69 6f 6e 73 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e  ions] <none>] \n
1b810 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  ]..          } e
1b820 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
1b830 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
1b840 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e  _channel unknown
1b850 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  \n..          }.
1b860 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
1b870 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20        catch {.. 
1b880 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1b890 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c  ::test_channel \
1b8a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1b8b0 22 2d 2d 2d 2d 20 63 6f 6d 70 69 6c 65 2d 74 69  "---- compile-ti
1b8c0 6d 65 20 6f 70 74 69 6f 6e 73 20 66 6f 72 20 53  me options for S
1b8d0 51 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73  QLite interop as
1b8e0 73 65 6d 62 6c 79 2e 2e 2e 20 22 0d 0a 0d 0a 20  sembly... ".... 
1b8f0 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
1b900 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
1b910 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
1b920 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
1b930 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
1b940 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
1b950 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33  a.SQLite.SQLite3
1b960 20 49 6e 74 65 72 6f 70 43 6f 6d 70 69 6c 65 4f   InteropCompileO
1b970 70 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20  ptions..        
1b980 20 20 7d 20 63 6f 6d 70 69 6c 65 4f 70 74 69 6f    } compileOptio
1b990 6e 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  ns] == 0} then {
1b9a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
1b9b0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
1b9c0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1b9d0 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73 6f  [formatList [lso
1b9e0 72 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  rt \..          
1b9f0 20 20 20 20 20 20 24 63 6f 6d 70 69 6c 65 4f 70        $compileOp
1ba00 74 69 6f 6e 73 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c  tions] <none>] \
1ba10 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  n]..          } 
1ba20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
1ba30 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
1ba40 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77  t_channel unknow
1ba50 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  n\n..          }
1ba60 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
1ba70 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1ba80 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74    # NOTE: Show t
1ba90 68 65 20 61 63 74 69 76 65 20 74 65 73 74 20 63  he active test c
1baa0 6f 6e 73 74 72 61 69 6e 74 73 2e 0d 0a 20 20 20  onstraints...   
1bab0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1bac0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
1bad0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1bae0 73 20 22 2d 2d 2d 2d 20 63 6f 6e 73 74 72 61 69  s "---- constrai
1baf0 6e 74 73 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20  nts: " \..      
1bb00 20 20 20 20 20 20 5b 66 6f 72 6d 61 74 4c 69 73        [formatLis
1bb10 74 20 5b 6c 73 6f 72 74 20 5b 67 65 74 43 6f 6e  t [lsort [getCon
1bb20 73 74 72 61 69 6e 74 73 5d 5d 20 3c 6e 6f 6e 65  straints]] <none
1bb30 3e 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20  >] \n]....      
1bb40 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
1bb50 4f 54 45 3a 20 53 61 76 65 20 74 68 65 20 74 65  OTE: Save the te
1bb60 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66  st constraints f
1bb70 6f 72 20 75 73 65 20 62 79 20 74 68 72 65 61 64  or use by thread
1bb80 73 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 69  s created in thi
1bb90 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  s..        #    
1bba0 20 20 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64     application d
1bbb0 6f 6d 61 69 6e 2e 20 20 54 68 69 73 20 69 73 20  omain.  This is 
1bbc0 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73  necessary becaus
1bbd0 65 20 61 6c 6c 20 74 68 65 20 45 61 67 6c 65 0d  e all the Eagle.
1bbe0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
1bbf0 20 22 74 65 73 74 20 63 6f 6e 74 65 78 74 22 20   "test context" 
1bc00 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 70  information is p
1bc10 65 72 2d 74 68 72 65 61 64 2e 0d 0a 20 20 20 20  er-thread...    
1bc20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
1bc30 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
1bc40 20 3a 3a 74 65 73 74 5f 63 6f 6e 73 74 72 61 69   ::test_constrai
1bc50 6e 74 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  nts]} then {..  
1bc60 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65          set ::te
1bc70 73 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 24  st_constraints $
1bc80 3a 3a 65 61 67 6c 65 5f 74 65 73 74 73 28 63 6f  ::eagle_tests(co
1bc90 6e 73 74 72 61 69 6e 74 73 29 0d 0a 20 20 20 20  nstraints)..    
1bca0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1bcb0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1bcc0 54 45 3a 20 4c 6f 61 64 20 74 68 65 20 22 61 66  TE: Load the "af
1bcd0 74 65 72 2d 63 6f 6e 73 74 72 61 69 6e 74 73 22  ter-constraints"
1bce0 20 63 75 73 74 6f 6d 20 70 65 72 2d 75 73 65 72   custom per-user
1bcf0 20 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74   and/or per-host
1bd00 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1bd10 20 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20    test settings 
1bd20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  now...        #.
1bd30 0a 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c  .        uplevel
1bd40 20 31 20 5b 6c 69 73 74 20 6c 6f 61 64 53 51 4c   1 [list loadSQL
1bd50 69 74 65 54 65 73 74 53 65 74 74 69 6e 67 73 20  iteTestSettings 
1bd60 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
1bd70 2e 61 66 74 65 72 5d 0d 0a 0d 0a 20 20 20 20 20  .after]....     
1bd80 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1bd90 4e 4f 54 45 3a 20 53 68 6f 77 20 77 68 65 6e 20  NOTE: Show when 
1bda0 6f 75 72 20 74 65 73 74 73 20 61 63 74 75 61 6c  our tests actual
1bdb0 6c 79 20 62 65 67 61 6e 20 28 6e 6f 77 29 2e 0d  ly began (now)..
1bdc0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1bdd0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
1bde0 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
1bdf0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1be00 20 20 20 20 20 22 2d 2d 2d 2d 20 53 79 73 74 65       "---- Syste
1be10 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 74 65  m.Data.SQLite te
1be20 73 74 73 20 62 65 67 61 6e 20 61 74 20 22 20 5c  sts began at " \
1be30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 63  ..            [c
1be40 6c 6f 63 6b 20 66 6f 72 6d 61 74 20 5b 63 6c 6f  lock format [clo
1be50 63 6b 20 73 65 63 6f 6e 64 73 5d 5d 20 5c 6e 5d  ck seconds]] \n]
1be60 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
1be70 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 75  .....    proc ru
1be80 6e 53 51 4c 69 74 65 54 65 73 74 45 70 69 6c 6f  nSQLiteTestEpilo
1be90 67 75 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  gue {} {..      
1bea0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
1beb0 20 53 6b 69 70 20 72 75 6e 6e 69 6e 67 20 6f 75   Skip running ou
1bec0 72 20 63 75 73 74 6f 6d 20 65 70 69 6c 6f 67 75  r custom epilogu
1bed0 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20 6f 6e  e if the main on
1bee0 65 20 68 61 73 20 62 65 65 6e 0d 0a 20 20 20 20  e has been..    
1bef0 20 20 23 20 20 20 20 20 20 20 73 6b 69 70 70 65    #       skippe
1bf00 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  d...      #..   
1bf10 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
1bf20 69 73 74 73 20 3a 3a 6e 6f 28 65 70 69 6c 6f 67  ists ::no(epilog
1bf30 75 65 2e 65 61 67 6c 65 29 5d 7d 20 74 68 65 6e  ue.eagle)]} then
1bf40 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
1bf50 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
1bf60 68 6f 77 20 77 68 65 6e 20 6f 75 72 20 74 65 73  how when our tes
1bf70 74 73 20 61 63 74 75 61 6c 6c 79 20 65 6e 64 65  ts actually ende
1bf80 64 20 28 6e 6f 77 29 2e 0d 0a 20 20 20 20 20 20  d (now)...      
1bf90 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75    #..        tpu
1bfa0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
1bfb0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1bfc0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
1bfd0 2d 2d 2d 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  --- System.Data.
1bfe0 53 51 4c 69 74 65 20 74 65 73 74 73 20 65 6e 64  SQLite tests end
1bff0 65 64 20 61 74 20 22 20 5c 0d 0a 20 20 20 20 20  ed at " \..     
1c000 20 20 20 20 20 20 20 5b 63 6c 6f 63 6b 20 66 6f         [clock fo
1c010 72 6d 61 74 20 5b 63 6c 6f 63 6b 20 73 65 63 6f  rmat [clock seco
1c020 6e 64 73 5d 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20  nds]] \n]....   
1c030 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1c040 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 74 68 65  # NOTE: Load the
1c050 20 22 65 70 69 6c 6f 67 75 65 22 20 63 75 73 74   "epilogue" cust
1c060 6f 6d 20 70 65 72 2d 75 73 65 72 20 61 6e 64 2f  om per-user and/
1c070 6f 72 20 70 65 72 2d 68 6f 73 74 20 74 65 73 74  or per-host test
1c080 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1c090 20 20 73 65 74 74 69 6e 67 73 20 6e 6f 77 2e 0d    settings now..
1c0a0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1c0b0 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c      uplevel 1 [l
1c0c0 69 73 74 20 6c 6f 61 64 53 51 4c 69 74 65 54 65  ist loadSQLiteTe
1c0d0 73 74 53 65 74 74 69 6e 67 73 20 24 3a 3a 74 65  stSettings $::te
1c0e0 73 74 5f 63 68 61 6e 6e 65 6c 20 2e 65 70 69 6c  st_channel .epil
1c0f0 6f 67 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  ogue]....       
1c100 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 42 55   #..        # BU
1c110 47 46 49 58 3a 20 42 65 66 6f 72 65 20 63 68 65  GFIX: Before che
1c120 63 6b 69 6e 67 20 74 68 65 20 66 69 6e 61 6c 20  cking the final 
1c130 72 65 73 6f 75 72 63 65 73 20 69 6e 20 75 73 65  resources in use
1c140 20 62 79 20 53 51 4c 69 74 65 2c 20 6d 61 6b 65   by SQLite, make
1c150 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1c160 20 20 20 20 73 75 72 65 20 62 6f 74 68 20 6f 66      sure both of
1c170 20 74 68 65 20 50 52 41 47 4d 41 20 72 65 6c 61   the PRAGMA rela
1c180 74 65 64 20 64 69 72 65 63 74 6f 72 79 20 6e 61  ted directory na
1c190 6d 65 73 20 61 72 65 20 66 72 65 65 64 2e 0d 0a  mes are freed...
1c1a0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1c1b0 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74     checkForSQLit
1c1c0 65 44 69 72 65 63 74 6f 72 69 65 73 20 24 3a 3a  eDirectories $::
1c1d0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75  test_channel tru
1c1e0 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e....        #..
1c1f0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1c200 41 6c 73 6f 20 72 65 70 6f 72 74 20 74 68 65 20  Also report the 
1c210 72 65 73 6f 75 72 63 65 20 75 73 61 67 65 20 61  resource usage a
1c220 66 74 65 72 20 72 75 6e 6e 69 6e 67 20 74 68 65  fter running the
1c230 20 74 65 73 74 73 2e 0d 0a 20 20 20 20 20 20 20   tests...       
1c240 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 70 6f   #..        repo
1c250 72 74 53 51 4c 69 74 65 52 65 73 6f 75 72 63 65  rtSQLiteResource
1c260 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1c270 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  l....        #..
1c280 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1c290 52 65 70 6f 72 74 20 74 68 65 20 63 72 69 74 69  Report the criti
1c2a0 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74  cal handle count
1c2b0 73 20 61 66 74 65 72 20 72 75 6e 6e 69 6e 67 20  s after running 
1c2c0 74 68 65 20 74 65 73 74 73 2e 0d 0a 20 20 20 20  the tests...    
1c2d0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 67      #..        g
1c2e0 65 74 53 51 4c 69 74 65 48 61 6e 64 6c 65 43 6f  etSQLiteHandleCo
1c2f0 75 6e 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  unts $::test_cha
1c300 6e 6e 65 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  nnel..      }.. 
1c310 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 23 23 23     }.....    ###
1c320 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1c330 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1c340 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1c350 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1c360 23 23 23 23 23 23 23 23 0d 0a 20 20 20 20 23 23  ########..    ##
1c370 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1c380 23 23 23 23 23 23 23 23 23 23 23 20 45 4e 44 20  ########### END 
1c390 45 61 67 6c 65 20 4f 4e 4c 59 20 23 23 23 23 23  Eagle ONLY #####
1c3a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1c3b0 23 23 23 23 23 23 23 23 23 0d 0a 20 20 20 20 23  #########..    #
1c3c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1c3d0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1c3e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1c3f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1c400 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20 7d 0d  ##########..  }.
1c410 0a 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45  ...  #..  # NOTE
1c420 3a 20 53 61 76 65 20 74 68 65 20 6e 61 6d 65 20  : Save the name 
1c430 6f 66 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  of the directory
1c440 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73   containing this
1c450 20 66 69 6c 65 2e 0d 0a 20 20 23 0d 0a 20 20 69   file...  #..  i
1c460 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
1c470 20 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72   common_director
1c480 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  y]} then {..    
1c490 73 65 74 20 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63  set common_direc
1c4a0 74 6f 72 79 20 5b 66 69 6c 65 20 64 69 72 6e 61  tory [file dirna
1c4b0 6d 65 20 5b 69 6e 66 6f 20 73 63 72 69 70 74 5d  me [info script]
1c4c0 5d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 0d 0a 20  ]..  }....  #.. 
1c4d0 20 23 20 4e 4f 54 45 3a 20 50 72 6f 76 69 64 65   # NOTE: Provide
1c4e0 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61   the System.Data
1c4f0 2e 53 51 4c 69 74 65 20 74 65 73 74 20 70 61 63  .SQLite test pac
1c500 6b 61 67 65 20 74 6f 20 74 68 65 20 69 6e 74 65  kage to the inte
1c510 72 70 72 65 74 65 72 2e 0d 0a 20 20 23 0d 0a 20  rpreter...  #.. 
1c520 20 70 61 63 6b 61 67 65 20 70 72 6f 76 69 64 65   package provide
1c530 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
1c540 69 74 65 2e 54 65 73 74 20 31 2e 30 0d 0a 7d 0d  ite.Test 1.0..}.
1c550 0a                                               .