System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 1b9bd4f9d562e93d3193ccdecb480751972f0db6:


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 67 65 74 53 51  ..    proc getSQ
2c60: 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68  LiteTestDataPath
2c70: 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
2c80: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69        # NOTE: Fi
2c90: 67 75 72 65 20 6f 75 74 20 74 68 65 20 64 69 72  gure out the dir
2ca0: 65 63 74 6f 72 79 20 77 68 65 72 65 20 61 6c 6c  ectory where all
2cb0: 20 74 68 65 20 74 65 73 74 20 64 61 74 61 20 66   the test data f
2cc0: 69 6c 65 73 20 73 68 6f 75 6c 64 0d 0a 20 20 20  iles should..   
2cd0: 20 20 20 23 20 20 20 20 20 20 20 62 65 20 6c 6f     #       be lo
2ce0: 63 61 74 65 64 2e 20 20 54 68 69 73 20 73 68 6f  cated.  This sho
2cf0: 75 6c 64 20 62 65 20 74 68 65 20 22 64 61 74 61  uld be the "data
2d00: 22 20 64 69 72 65 63 74 6f 72 79 20 62 65 6e 65  " directory bene
2d10: 61 74 68 20 74 68 65 0d 0a 20 20 20 20 20 20 23  ath the..      #
2d20: 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79         directory
2d30: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
2d40: 61 63 74 75 61 6c 20 74 65 73 74 20 73 63 72 69  actual test scri
2d50: 70 74 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  pts...      #.. 
2d60: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c       return [fil
2d70: 65 20 6a 6f 69 6e 20 24 3a 3a 70 61 74 68 20 64  e join $::path d
2d80: 61 74 61 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  ata]..    }.....
2d90: 20 20 20 20 70 72 6f 63 20 69 73 52 75 6e 6e 69      proc isRunni
2da0: 6e 67 57 6f 57 36 34 20 7b 7d 20 7b 0d 0a 20 20  ngWoW64 {} {..  
2db0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
2dc0: 4f 54 45 3a 20 46 6f 72 20 6e 6f 77 2c 20 6a 75  OTE: For now, ju
2dd0: 73 74 20 75 73 65 20 74 68 65 20 65 78 69 73 74  st use the exist
2de0: 69 6e 67 20 74 65 73 74 20 63 6f 6e 73 74 72 61  ing test constra
2df0: 69 6e 74 20 66 6f 72 20 64 65 74 65 63 74 69 6e  int for detectin
2e00: 67 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  g..      #      
2e10: 20 61 20 57 6f 57 36 34 20 70 72 6f 63 65 73 73   a WoW64 process
2e20: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
2e30: 20 20 72 65 74 75 72 6e 20 5b 68 61 76 65 43 6f    return [haveCo
2e40: 6e 73 74 72 61 69 6e 74 20 77 6f 77 36 34 5d 0d  nstraint wow64].
2e50: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
2e60: 72 6f 63 20 69 73 4d 69 78 65 64 4d 6f 64 65 41  roc isMixedModeA
2e70: 73 73 65 6d 62 6c 79 20 7b 20 66 69 6c 65 4e 61  ssembly { fileNa
2e80: 6d 65 20 7b 76 61 72 4e 61 6d 65 20 22 22 7d 20  me {varName ""} 
2e90: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
2ea0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 72 73      # NOTE: Firs
2eb0: 74 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  t, make sure the
2ec0: 20 74 65 73 74 20 73 75 69 74 65 20 69 6e 66 72   test suite infr
2ed0: 61 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c  astructure is al
2ee0: 6c 6f 77 65 64 20 74 6f 0d 0a 20 20 20 20 20 20  lowed to..      
2ef0: 23 20 20 20 20 20 20 20 75 73 65 20 74 68 65 20  #       use the 
2f00: 5b 65 78 65 63 5d 20 63 6f 6d 6d 61 6e 64 2e 0d  [exec] command..
2f10: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
2f20: 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
2f30: 73 20 3a 3a 6e 6f 28 65 78 65 63 29 5d 20 26 26  s ::no(exec)] &&
2f40: 20 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   ![info exists :
2f50: 3a 6e 6f 28 63 6f 72 46 6c 61 67 73 29 5d 7d 20  :no(corFlags)]} 
2f60: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
2f70: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
2f80: 45 3a 20 49 66 20 74 68 65 20 6c 6f 63 61 74 69  E: If the locati
2f90: 6f 6e 20 6f 66 20 43 6f 72 46 6c 61 67 73 20 69  on of CorFlags i
2fa0: 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  s present in the
2fb0: 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 2c 0d 0a 20   environment,.. 
2fc0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75         #       u
2fd0: 73 65 20 69 74 3b 20 6f 74 68 65 72 77 69 73 65  se it; otherwise
2fe0: 20 61 73 73 75 6d 65 20 69 74 20 69 73 20 69 6e   assume it is in
2ff0: 20 74 68 65 20 50 41 54 48 2e 0d 0a 20 20 20 20   the PATH...    
3000: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
3010: 65 74 20 63 6f 72 46 6c 61 67 73 20 5b 65 78 70  et corFlags [exp
3020: 72 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  r {..          [
3030: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65 6e  info exists ::en
3040: 76 28 43 6f 72 46 6c 61 67 73 29 5d 20 3f 20 24  v(CorFlags)] ? $
3050: 3a 3a 65 6e 76 28 43 6f 72 46 6c 61 67 73 29 20  ::env(CorFlags) 
3060: 3a 20 22 43 6f 72 46 6c 61 67 73 22 0d 0a 20 20  : "CorFlags"..  
3070: 20 20 20 20 20 20 7d 5d 0d 0a 0d 0a 20 20 20 20        }]....    
3080: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
3090: 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
30a0: 6f 20 65 78 65 63 75 74 65 20 43 6f 72 46 6c 61  o execute CorFla
30b0: 67 73 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  gs on the specif
30c0: 69 65 64 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20  ied file...     
30d0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
30e0: 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
30f0: 20 20 20 20 20 20 65 78 65 63 20 2d 2d 20 24 63        exec -- $c
3100: 6f 72 46 6c 61 67 73 20 5b 66 69 6c 65 20 6e 61  orFlags [file na
3110: 74 69 76 65 6e 61 6d 65 20 24 66 69 6c 65 4e 61  tivename $fileNa
3120: 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65  me]..        } e
3130: 78 65 63 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  xec] == 0} then 
3140: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
3150: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
3160: 3a 20 49 66 20 72 65 71 75 65 73 74 65 64 20 62  : If requested b
3170: 79 20 6f 75 72 20 63 61 6c 6c 65 72 2c 20 61 74  y our caller, at
3180: 74 65 6d 70 74 20 74 6f 20 64 65 74 65 72 6d 69  tempt to determi
3190: 6e 65 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  ne the..        
31a0: 20 20 23 20 20 20 20 20 20 20 70 6c 61 74 66 6f    #       platfo
31b0: 72 6d 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  rm for the speci
31c0: 66 69 65 64 20 66 69 6c 65 20 61 73 20 77 65 6c  fied file as wel
31d0: 6c 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  l...          #.
31e0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
31f0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76  string length $v
3200: 61 72 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65  arName] > 0} the
3210: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
3220: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
3230: 23 20 4e 4f 54 45 3a 20 53 74 6f 72 65 20 74 68  # NOTE: Store th
3240: 65 20 70 6c 61 74 66 6f 72 6d 20 69 6e 20 74 68  e platform in th
3250: 65 20 6e 61 6d 65 64 20 76 61 72 69 61 62 6c 65  e named variable
3260: 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 20   in the..       
3270: 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e       #       con
3280: 74 65 78 74 20 6f 66 20 6f 75 72 20 63 61 6c 6c  text of our call
3290: 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  er...           
32a0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
32b0: 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65  upvar 1 $varName
32c0: 20 70 6c 61 74 66 6f 72 6d 0d 0a 0d 0a 20 20 20   platform....   
32d0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
32e0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
32f0: 41 74 74 65 6d 70 74 20 74 6f 20 65 78 74 72 61  Attempt to extra
3300: 63 74 20 74 68 65 20 50 45 20 6c 69 6e 65 20 66  ct the PE line f
3310: 72 6f 6d 20 74 68 65 20 63 61 70 74 75 72 65 64  rom the captured
3320: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
3330: 20 20 20 20 20 20 6f 75 74 70 75 74 2e 20 20 49        output.  I
3340: 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20  f this value is 
3350: 22 50 45 33 32 22 20 6f 72 20 22 50 45 33 32 2b  "PE32" or "PE32+
3360: 22 2c 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  ", the..        
3370: 20 20 20 20 23 20 20 20 20 20 20 20 61 73 73 65      #       asse
3380: 6d 62 6c 79 20 66 69 6c 65 20 69 73 20 33 32 2d  mbly file is 32-
3390: 62 69 74 20 6f 72 20 36 34 2d 62 69 74 2c 20 72  bit or 64-bit, r
33a0: 65 73 70 65 63 74 69 76 65 6c 79 3b 0d 0a 20 20  espectively;..  
33b0: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
33c0: 20 20 6f 74 68 65 72 77 69 73 65 2c 20 69 74 73    otherwise, its
33d0: 20 74 79 70 65 20 69 73 20 75 6e 6b 6e 6f 77 6e   type is unknown
33e0: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
33f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ..            se
3400: 74 20 70 61 74 74 65 72 6e 20 7b 5e 50 45 20 20  t pattern {^PE  
3410: 20 20 20 20 20 20 3a 20 28 50 45 33 32 7c 50 45        : (PE32|PE
3420: 33 32 5c 2b 29 5c 73 2b 24 7d 0d 0a 0d 0a 20 20  32\+)\s+$}....  
3430: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 72            if {[r
3440: 65 67 65 78 70 20 2d 6c 69 6e 65 20 2d 2d 20 24  egexp -line -- $
3450: 70 61 74 74 65 72 6e 20 24 65 78 65 63 20 64 75  pattern $exec du
3460: 6d 6d 79 20 70 65 33 32 5d 7d 20 74 68 65 6e 20  mmy pe32]} then 
3470: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
3480: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
3490: 20 20 23 20 48 41 43 4b 3a 20 54 68 69 73 20 5b    # HACK: This [
34a0: 73 77 69 74 63 68 5d 20 61 73 73 75 6d 65 73 20  switch] assumes 
34b0: 74 68 61 74 20 33 32 2d 62 69 74 20 65 78 65 63  that 32-bit exec
34c0: 75 74 61 62 6c 65 73 20 61 72 65 0d 0a 20 20 20  utables are..   
34d0: 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
34e0: 20 20 20 61 6c 77 61 79 73 20 78 38 36 20 61 6e     always x86 an
34f0: 64 20 74 68 61 74 20 36 34 2d 62 69 74 20 65 78  d that 64-bit ex
3500: 65 63 75 74 61 62 6c 65 73 20 61 72 65 20 61 6c  ecutables are al
3510: 77 61 79 73 0d 0a 20 20 20 20 20 20 20 20 20 20  ways..          
3520: 20 20 20 20 23 20 20 20 20 20 20 20 78 36 34 2e      #       x64.
3530: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
3540: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
3550: 20 73 77 69 74 63 68 20 2d 65 78 61 63 74 20 2d   switch -exact -
3560: 2d 20 24 70 65 33 32 20 7b 0d 0a 20 20 20 20 20  - $pe32 {..     
3570: 20 20 20 20 20 20 20 20 20 20 20 50 45 33 32 20             PE32 
3580: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
3590: 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72       set platfor
35a0: 6d 20 57 69 6e 33 32 0d 0a 20 20 20 20 20 20 20  m Win32..       
35b0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
35c0: 20 20 20 20 20 20 20 20 20 20 20 20 50 45 33 32              PE32
35d0: 2b 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  + {..           
35e0: 20 20 20 20 20 20 20 73 65 74 20 70 6c 61 74 66         set platf
35f0: 6f 72 6d 20 78 36 34 0d 0a 20 20 20 20 20 20 20  orm x64..       
3600: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
3610: 20 20 20 20 20 20 20 20 20 20 20 20 64 65 66 61              defa
3620: 75 6c 74 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  ult {..         
3630: 20 20 20 20 20 20 20 20 20 73 65 74 20 70 6c 61           set pla
3640: 74 66 6f 72 6d 20 22 22 0d 0a 20 20 20 20 20 20  tform ""..      
3650: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
3660: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
3670: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
3680: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
3690: 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 22    set platform "
36a0: 22 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  "..            }
36b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
36c0: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
36d0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
36e0: 41 74 74 65 6d 70 74 20 74 6f 20 65 78 74 72 61  Attempt to extra
36f0: 63 74 20 74 68 65 20 49 4c 4f 4e 4c 59 20 6c 69  ct the ILONLY li
3700: 6e 65 20 66 72 6f 6d 20 74 68 65 20 63 61 70 74  ne from the capt
3710: 75 72 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20  ured..          
3720: 23 20 20 20 20 20 20 20 6f 75 74 70 75 74 2e 20  #       output. 
3730: 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69   If this value i
3740: 73 20 7a 65 72 6f 2c 20 74 68 65 20 73 70 65 63  s zero, the spec
3750: 69 66 69 65 64 20 66 69 6c 65 20 6d 75 73 74 0d  ified file must.
3760: 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
3770: 20 20 20 62 65 20 61 20 6d 69 78 65 64 2d 6d 6f     be a mixed-mo
3780: 64 65 20 61 73 73 65 6d 62 6c 79 3b 20 6f 74 68  de assembly; oth
3790: 65 72 77 69 73 65 2c 20 69 74 20 63 6f 6e 74 61  erwise, it conta
37a0: 69 6e 73 20 6f 6e 6c 79 0d 0a 20 20 20 20 20 20  ins only..      
37b0: 20 20 20 20 23 20 20 20 20 20 20 20 6d 61 6e 61      #       mana
37c0: 67 65 64 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e 0d  ged components..
37d0: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
37e0: 20 20 20 20 20 20 20 20 73 65 74 20 70 61 74 74          set patt
37f0: 65 72 6e 20 7b 5e 49 4c 4f 4e 4c 59 20 20 20 20  ern {^ILONLY    
3800: 3a 20 28 30 7c 31 29 5c 73 2b 24 7d 0d 0a 0d 0a  : (0|1)\s+$}....
3810: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
3820: 72 65 67 65 78 70 20 2d 6c 69 6e 65 20 2d 2d 20  regexp -line -- 
3830: 24 70 61 74 74 65 72 6e 20 24 65 78 65 63 20 64  $pattern $exec d
3840: 75 6d 6d 79 20 69 6c 4f 6e 6c 79 5d 7d 20 74 68  ummy ilOnly]} th
3850: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
3860: 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a    return false..
3870: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
3880: 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 69           if {!$i
3890: 6c 4f 6e 6c 79 7d 20 74 68 65 6e 20 7b 0d 0a 20  lOnly} then {.. 
38a0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
38b0: 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20  n true..        
38c0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
38d0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
38e0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
38f0: 3a 20 49 66 20 74 68 65 20 74 65 73 74 20 73 75  : If the test su
3900: 69 74 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 5b  ite cannot use [
3910: 65 78 65 63 5d 20 6f 72 20 65 78 65 63 75 74 69  exec] or executi
3920: 6f 6e 20 6f 66 20 43 6f 72 46 6c 61 67 73 0d 0a  on of CorFlags..
3930: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66 61        #       fa
3940: 69 6c 65 64 2c 20 72 65 74 75 72 6e 20 66 61 6c  iled, return fal
3950: 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  se...      #..  
3960: 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
3970: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
3980: 70 72 6f 63 20 69 73 42 75 69 6c 64 41 76 61 69  proc isBuildAvai
3990: 6c 61 62 6c 65 20 7b 20 6e 61 74 69 76 65 20 64  lable { native d
39a0: 69 72 65 63 74 6f 72 79 20 7b 76 61 72 4e 61 6d  irectory {varNam
39b0: 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  e ""} } {..     
39c0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
39d0: 3a 20 42 75 69 6c 64 20 74 68 65 20 66 75 6c 6c  : Build the full
39e0: 79 20 71 75 61 6c 69 66 69 65 64 20 66 69 6c 65  y qualified file
39f0: 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 70 72   name for the pr
3a00: 69 6d 61 72 79 20 61 73 73 65 6d 62 6c 79 0d 0a  imary assembly..
3a10: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
3a20: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 53 79 73  ntaining the Sys
3a30: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
3a40: 6d 61 6e 61 67 65 64 20 63 6f 6d 70 6f 6e 65 6e  managed componen
3a50: 74 73 2e 20 20 49 74 0d 0a 20 20 20 20 20 20 23  ts.  It..      #
3a60: 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65         should be
3a70: 20 6e 6f 74 65 64 20 74 68 61 74 20 74 68 69 73   noted that this
3a80: 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 20 6d   assembly file m
3a90: 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20  ay also contain 
3aa0: 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
3ab0: 20 20 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e     native compon
3ac0: 65 6e 74 73 2c 20 69 66 20 61 20 6e 61 74 69 76  ents, if a nativ
3ad0: 65 20 62 75 69 6c 64 20 69 73 20 69 6e 20 75 73  e build is in us
3ae0: 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
3af0: 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20     set fileName 
3b00: 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
3b10: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72   [file join $dir
3b20: 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20  ectory \..      
3b30: 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
3b40: 53 51 4c 69 74 65 2e 64 6c 6c 5d 5d 0d 0a 0d 0a  SQLite.dll]]....
3b50: 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65        if {![file
3b60: 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d   exists $fileNam
3b70: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
3b80: 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
3b90: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
3ba0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
3bb0: 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 61  TE: Attempt to a
3bc0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 74  utomatically det
3bd0: 65 63 74 20 69 66 20 74 68 65 20 70 72 69 6d 61  ect if the prima
3be0: 72 79 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20  ry assembly..   
3bf0: 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74 61     #       conta
3c00: 69 6e 73 20 61 6e 79 20 6e 61 74 69 76 65 20 63  ins any native c
3c10: 6f 6d 70 6f 6e 65 6e 74 73 2c 20 69 66 20 6e 65  omponents, if ne
3c20: 63 65 73 73 61 72 79 2e 0d 0a 20 20 20 20 20 20  cessary...      
3c30: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  #..      if {[st
3c40: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e 61 74  ring length $nat
3c50: 69 76 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ive] == 0} then 
3c60: 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  {..        if {[
3c70: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76  string length $v
3c80: 61 72 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65  arName] > 0} the
3c90: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 75  n {..          u
3ca0: 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20  pvar 1 $varName 
3cb0: 24 76 61 72 4e 61 6d 65 0d 0a 20 20 20 20 20 20  $varName..      
3cc0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73    }....        s
3cd0: 65 74 20 6e 61 74 69 76 65 20 5b 69 73 4d 69 78  et native [isMix
3ce0: 65 64 4d 6f 64 65 41 73 73 65 6d 62 6c 79 20 24  edModeAssembly $
3cf0: 66 69 6c 65 4e 61 6d 65 20 24 76 61 72 4e 61 6d  fileName $varNam
3d00: 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  e]..      }.... 
3d10: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
3d20: 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 70 72 69  NOTE: If the pri
3d30: 6d 61 72 79 20 61 73 73 65 6d 62 6c 79 20 61 6c  mary assembly al
3d40: 73 6f 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  so contains the 
3d50: 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e 65 6e 74  native component
3d60: 73 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  s,..      #     
3d70: 20 20 77 65 20 68 61 76 65 20 65 76 65 72 79 74    we have everyt
3d80: 68 69 6e 67 20 77 65 20 6e 65 65 64 2e 0d 0a 20  hing we need... 
3d90: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
3da0: 20 7b 24 6e 61 74 69 76 65 7d 20 74 68 65 6e 20   {$native} then 
3db0: 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
3dc0: 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d  n true..      }.
3dd0: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
3de0: 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20    # NOTE: Build 
3df0: 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  the fully qualif
3e00: 69 65 64 20 66 69 6c 65 20 6e 61 6d 65 20 66 6f  ied file name fo
3e10: 72 20 74 68 65 20 69 6e 74 65 72 6f 70 20 61 73  r the interop as
3e20: 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 23 20  sembly..      # 
3e30: 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 69 6e 67        containing
3e40: 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61   the System.Data
3e50: 2e 53 51 4c 69 74 65 20 6e 61 74 69 76 65 20 63  .SQLite native c
3e60: 6f 6d 70 6f 6e 65 6e 74 73 2e 20 20 49 66 20 74  omponents.  If t
3e70: 68 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20  his..      #    
3e80: 20 20 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20     file exists, 
3e90: 77 65 20 73 68 6f 75 6c 64 20 68 61 76 65 20 65  we should have e
3ea0: 76 65 72 79 74 68 69 6e 67 20 77 65 20 6e 65 65  verything we nee
3eb0: 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  d...      #..   
3ec0: 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20     set fileName 
3ed0: 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
3ee0: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72   [file join $dir
3ef0: 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20  ectory \..      
3f00: 20 20 20 20 53 51 4c 69 74 65 2e 49 6e 74 65 72      SQLite.Inter
3f10: 6f 70 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20 20  op.dll]]....    
3f20: 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73    if {[file exis
3f30: 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74  ts $fileName]} t
3f40: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
3f50: 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20  eturn true..    
3f60: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
3f70: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75        # NOTE: Bu
3f80: 69 6c 64 20 74 68 65 20 66 75 6c 6c 79 20 71 75  ild the fully qu
3f90: 61 6c 69 66 69 65 64 20 66 69 6c 65 20 6e 61 6d  alified file nam
3fa0: 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69 74 65  e for the SQLite
3fb0: 20 63 6f 72 65 0d 0a 20 20 20 20 20 20 23 20 20   core..      #  
3fc0: 20 20 20 20 20 6c 69 62 72 61 72 79 2e 20 20 49       library.  I
3fd0: 66 20 74 68 69 73 20 66 69 6c 65 20 65 78 69 73  f this file exis
3fe0: 74 73 2c 20 77 65 20 73 68 6f 75 6c 64 20 68 61  ts, we should ha
3ff0: 76 65 20 65 76 65 72 79 74 68 69 6e 67 20 77 65  ve everything we
4000: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
4010: 6e 65 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  need...      #..
4020: 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61        set fileNa
4030: 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  me [file nativen
4040: 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24  ame [file join $
4050: 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20  directory \..   
4060: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 2e 64         sqlite3.d
4070: 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  ll]]....      if
4080: 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24   {[file exists $
4090: 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  fileName]} then 
40a0: 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
40b0: 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d  n true..      }.
40c0: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
40d0: 20 20 23 20 4e 4f 54 45 3a 20 4f 6e 65 20 6f 72    # NOTE: One or
40e0: 20 6d 6f 72 65 20 6e 61 74 69 76 65 20 63 6f 6d   more native com
40f0: 70 6f 6e 65 6e 74 73 20 6e 65 65 64 65 64 20 62  ponents needed b
4100: 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  y System.Data.SQ
4110: 4c 69 74 65 0d 0a 20 20 20 20 20 20 23 20 20 20  Lite..      #   
4120: 20 20 20 20 61 72 65 20 6d 69 73 73 69 6e 67 2e      are missing.
4130: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
4140: 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20   return false.. 
4150: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
4160: 63 20 69 73 52 65 6c 65 61 73 65 41 76 61 69 6c  c isReleaseAvail
4170: 61 62 6c 65 20 7b 20 64 69 72 65 63 74 6f 72 79  able { directory
4180: 20 7b 76 61 72 4e 61 6d 65 20 22 22 7d 20 7d 20   {varName ""} } 
4190: 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  {..      if {[st
41a0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 72  ring length $var
41b0: 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  Name] > 0} then 
41c0: 7b 0d 0a 20 20 20 20 20 20 20 20 75 70 76 61 72  {..        upvar
41d0: 20 31 20 24 76 61 72 4e 61 6d 65 20 24 76 61 72   1 $varName $var
41e0: 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  Name..      }...
41f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 69  .      return [i
4200: 73 42 75 69 6c 64 41 76 61 69 6c 61 62 6c 65 20  sBuildAvailable 
4210: 22 22 20 24 64 69 72 65 63 74 6f 72 79 20 24 76  "" $directory $v
4220: 61 72 4e 61 6d 65 5d 0d 0a 20 20 20 20 7d 0d 0a  arName]..    }..
4230: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 6a 6f 69 6e  ...    proc join
4240: 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79 20 7b  BuildDirectory {
4250: 20 6e 61 74 69 76 65 20 70 61 74 68 20 79 65 61   native path yea
4260: 72 20 70 6c 61 74 66 6f 72 6d 20 63 6f 6e 66 69  r platform confi
4270: 67 75 72 61 74 69 6f 6e 20 7d 20 7b 0d 0a 20 20  guration } {..  
4280: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
4290: 4f 54 45 3a 20 46 69 67 75 72 65 20 6f 75 74 20  OTE: Figure out 
42a0: 61 6e 64 20 74 68 65 6e 20 72 65 74 75 72 6e 20  and then return 
42b0: 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  the fully qualif
42c0: 69 65 64 20 70 61 74 68 20 74 6f 20 74 68 65 20  ied path to the 
42d0: 62 75 69 6c 64 0d 0a 20 20 20 20 20 20 23 20 20  build..      #  
42e0: 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 62       directory b
42f0: 61 73 65 64 20 6f 6e 20 61 6c 6c 20 74 68 65 20  ased on all the 
4300: 61 72 67 75 6d 65 6e 74 73 20 70 72 6f 76 69 64  arguments provid
4310: 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72  ed by our caller
4320: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
4330: 20 20 69 66 20 7b 24 6e 61 74 69 76 65 7d 20 74    if {$native} t
4340: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
4350: 65 74 75 72 6e 20 5b 66 69 6c 65 20 6a 6f 69 6e  eturn [file join
4360: 20 24 70 61 74 68 20 62 69 6e 20 24 79 65 61 72   $path bin $year
4370: 20 24 70 6c 61 74 66 6f 72 6d 20 24 63 6f 6e 66   $platform $conf
4380: 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 20 20 20 20  iguration]..    
4390: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
43a0: 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65      return [file
43b0: 20 6a 6f 69 6e 20 24 70 61 74 68 20 62 69 6e 20   join $path bin 
43c0: 24 79 65 61 72 20 24 63 6f 6e 66 69 67 75 72 61  $year $configura
43d0: 74 69 6f 6e 20 62 69 6e 5d 0d 0a 20 20 20 20 20  tion bin]..     
43e0: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
43f0: 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 44    proc getBuildD
4400: 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20  irectory {} {.. 
4410: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
4420: 4e 4f 54 45 3a 20 53 65 65 20 69 66 20 74 68 65  NOTE: See if the
4430: 20 22 6e 61 74 69 76 65 22 20 72 75 6e 74 69 6d   "native" runtim
4440: 65 20 6f 70 74 69 6f 6e 20 68 61 73 20 62 65 65  e option has bee
4450: 6e 20 73 65 74 2e 20 20 49 66 20 73 6f 2c 20 75  n set.  If so, u
4460: 73 65 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  se the..      # 
4470: 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20        directory 
4480: 66 6f 72 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f  for the mixed-mo
4490: 64 65 20 61 73 73 65 6d 62 6c 79 20 28 61 2e 6b  de assembly (a.k
44a0: 2e 61 2e 20 74 68 65 20 6e 61 74 69 76 65 20 69  .a. the native i
44b0: 6e 74 65 72 6f 70 0d 0a 20 20 20 20 20 20 23 20  nterop..      # 
44c0: 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 29 2e        assembly).
44d0: 20 20 54 6f 20 65 6e 61 62 6c 65 20 74 68 69 73    To enable this
44e0: 20 6f 70 74 69 6f 6e 20 76 69 61 20 74 68 65 20   option via the 
44f0: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2c 20 65 6e  command line, en
4500: 74 65 72 20 61 0d 0a 20 20 20 20 20 20 23 20 20  ter a..      #  
4510: 20 20 20 20 20 63 6f 6d 6d 61 6e 64 20 73 69 6d       command sim
4520: 69 6c 61 72 20 74 6f 20 6f 6e 65 20 6f 66 20 74  ilar to one of t
4530: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 28 61 6c  he following (al
4540: 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65 29 3a 0d  l on one line):.
4550: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
4560: 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65  #       EagleShe
4570: 6c 6c 2e 65 78 65 20 2d 69 6e 69 74 69 61 6c 69  ll.exe -initiali
4580: 7a 65 20 2d 72 75 6e 74 69 6d 65 4f 70 74 69 6f  ze -runtimeOptio
4590: 6e 20 6e 61 74 69 76 65 0d 0a 20 20 20 20 20 20  n native..      
45a0: 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20  #         -file 
45b0: 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61  .\path\to\all.ea
45c0: 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  gle..      #..  
45d0: 20 20 20 20 23 20 20 20 20 20 20 20 54 6f 20 65      #       To e
45e0: 6e 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6f  nable this optio
45f0: 6e 20 76 69 61 20 74 68 65 20 63 6f 6d 6d 61 6e  n via the comman
4600: 64 20 6c 69 6e 65 20 70 72 69 6f 72 20 74 6f 20  d line prior to 
4610: 74 68 65 20 22 62 65 74 61 20 31 36 22 0d 0a 20  the "beta 16".. 
4620: 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65 6c       #       rel
4630: 65 61 73 65 20 6f 66 20 45 61 67 6c 65 2c 20 74  ease of Eagle, t
4640: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d  he following com
4650: 6d 61 6e 64 20 6d 75 73 74 20 62 65 20 75 73 65  mand must be use
4660: 64 20 69 6e 73 74 65 61 64 0d 0a 20 20 20 20 20  d instead..     
4670: 20 23 20 20 20 20 20 20 20 28 61 6c 73 6f 20 61   #       (also a
4680: 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65 29 3a  ll on one line):
4690: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
46a0: 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68   #       EagleSh
46b0: 65 6c 6c 2e 65 78 65 20 2d 69 6e 69 74 69 61 6c  ell.exe -initial
46c0: 69 7a 65 20 2d 70 6f 73 74 49 6e 69 74 69 61 6c  ize -postInitial
46d0: 69 7a 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ize..      #    
46e0: 20 20 20 20 20 22 6f 62 6a 65 63 74 20 69 6e 76       "object inv
46f0: 6f 6b 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e  oke Interpreter.
4700: 47 65 74 41 63 74 69 76 65 20 41 64 64 52 75 6e  GetActive AddRun
4710: 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76  timeOption nativ
4720: 65 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  e"..      #     
4730: 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68      -file .\path
4740: 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20  \to\all.eagle.. 
4750: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
4760: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
4770: 3a 62 75 69 6c 64 5f 64 69 72 65 63 74 6f 72 79  :build_directory
4780: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
4790: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
47a0: 20 24 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63 74   $::build_direct
47b0: 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ory] > 0} then {
47c0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
47d0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
47e0: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
47f0: 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79   build directory
4800: 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69   has been overri
4810: 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23  dden;..        #
4820: 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65         therefore
4830: 2c 20 75 73 65 20 69 74 20 76 65 72 62 61 74 69  , use it verbati
4840: 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  m...        #.. 
4850: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
4860: 3a 62 75 69 6c 64 5f 64 69 72 65 63 74 6f 72 79  :build_directory
4870: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
4880: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
4890: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
48a0: 74 68 65 20 22 6e 61 74 69 76 65 22 20 72 75 6e  the "native" run
48b0: 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 73  time option is s
48c0: 65 74 2c 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f  et, the mixed-mo
48d0: 64 65 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20  de assembly..   
48e0: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 73 20       #       is 
48f0: 62 65 69 6e 67 20 74 65 73 74 65 64 2e 20 20 49  being tested.  I
4900: 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65  n that case, the
4910: 20 70 61 74 68 20 74 6f 20 74 68 65 20 62 75 69   path to the bui
4920: 6c 64 20 64 69 72 65 63 74 6f 72 79 0d 0a 20 20  ld directory..  
4930: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77 69        #       wi
4940: 6c 6c 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 70  ll contain the p
4950: 6c 61 74 66 6f 72 6d 20 6e 61 6d 65 20 61 6e 64  latform name and
4960: 20 61 6c 6c 20 74 68 65 20 62 69 6e 61 72 69 65   all the binarie
4970: 73 20 75 6e 64 65 72 20 74 65 73 74 0d 0a 20 20  s under test..  
4980: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 68        #       sh
4990: 6f 75 6c 64 20 62 65 20 70 72 65 73 65 6e 74 20  ould be present 
49a0: 69 6e 20 74 68 61 74 20 64 69 72 65 63 74 6f 72  in that director
49b0: 79 2e 20 20 49 66 20 74 68 65 20 22 6e 61 74 69  y.  If the "nati
49c0: 76 65 22 20 72 75 6e 74 69 6d 65 0d 0a 20 20 20  ve" runtime..   
49d0: 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 70 74       #       opt
49e0: 69 6f 6e 20 69 73 20 6e 6f 74 20 73 65 74 2c 20  ion is not set, 
49f0: 74 68 65 20 62 75 69 6c 64 20 64 69 72 65 63 74  the build direct
4a00: 6f 72 79 20 77 69 6c 6c 20 62 65 20 63 6f 6e 73  ory will be cons
4a10: 69 64 65 72 65 64 20 74 6f 20 62 65 0d 0a 20 20  idered to be..  
4a20: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22 70        #       "p
4a30: 6c 61 74 66 6f 72 6d 2d 6e 65 75 74 72 61 6c 22  latform-neutral"
4a40: 2c 20 77 69 74 68 20 74 68 65 20 6e 6f 74 61 62  , with the notab
4a50: 6c 65 20 65 78 63 65 70 74 69 6f 6e 20 6f 66 20  le exception of 
4a60: 61 6e 79 20 6e 61 74 69 76 65 0d 0a 20 20 20 20  any native..    
4a70: 20 20 20 20 23 20 20 20 20 20 20 20 61 73 73 65      #       asse
4a80: 6d 62 6c 79 20 28 65 2e 67 2e 20 22 53 51 4c 69  mbly (e.g. "SQLi
4a90: 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 22 29  te.Interop.dll")
4aa0: 20 63 6f 70 69 65 64 20 74 68 65 72 65 20 64 75   copied there du
4ab0: 72 69 6e 67 20 74 68 65 0d 0a 20 20 20 20 20 20  ring the..      
4ac0: 20 20 23 20 20 20 20 20 20 20 62 75 69 6c 64 20    #       build 
4ad0: 70 72 6f 63 65 73 73 20 69 74 73 65 6c 66 2e 20  process itself. 
4ae0: 20 49 66 20 74 68 65 20 62 75 69 6c 64 20 70 72   If the build pr
4af0: 6f 63 65 73 73 20 73 6f 6d 65 68 6f 77 20 64 6f  ocess somehow do
4b00: 65 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20  es not..        
4b10: 23 20 20 20 20 20 20 20 63 6f 70 79 20 74 68 65  #       copy the
4b20: 20 6e 61 74 69 76 65 20 61 73 73 65 6d 62 6c 79   native assembly
4b30: 20 66 6f 72 20 74 68 69 73 20 70 6c 61 74 66 6f   for this platfo
4b40: 72 6d 2c 20 6d 6f 73 74 20 6f 66 20 74 68 65 20  rm, most of the 
4b50: 74 65 73 74 73 0d 0a 20 20 20 20 20 20 20 20 23  tests..        #
4b60: 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 73 75         in the su
4b70: 69 74 65 20 77 69 6c 6c 20 73 69 6d 70 6c 79 20  ite will simply 
4b80: 62 65 20 73 6b 69 70 70 65 64 2e 20 20 47 65 6e  be skipped.  Gen
4b90: 65 72 61 6c 6c 79 20 73 70 65 61 6b 69 6e 67 2c  erally speaking,
4ba0: 20 74 68 65 72 65 0d 0a 20 20 20 20 20 20 20 20   there..        
4bb0: 23 20 20 20 20 20 20 20 61 72 65 20 74 77 6f 20  #       are two 
4bc0: 77 61 79 73 20 74 6f 20 62 75 69 6c 64 20 74 68  ways to build th
4bd0: 65 20 62 69 6e 61 72 69 65 73 20 77 68 65 6e 20  e binaries when 
4be0: 70 72 65 70 61 72 69 6e 67 20 74 6f 20 72 75 6e  preparing to run
4bf0: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
4c00: 20 20 20 20 20 20 74 65 73 74 20 73 75 69 74 65        test suite
4c10: 3a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  :..        #..  
4c20: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 31 2e        #       1.
4c30: 20 42 75 69 6c 64 20 74 68 65 20 73 65 70 61 72   Build the separ
4c40: 61 74 65 20 6d 61 6e 61 67 65 64 20 61 6e 64 20  ate managed and 
4c50: 6e 61 74 69 76 65 20 61 73 73 65 6d 62 6c 69 65  native assemblie
4c60: 73 20 75 73 69 6e 67 20 73 6f 6d 65 0d 0a 20 20  s using some..  
4c70: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
4c80: 20 63 6f 6d 6d 61 6e 64 73 20 73 69 6d 69 6c 61   commands simila
4c90: 72 20 74 6f 3a 0d 0a 20 20 20 20 20 20 20 20 23  r to:..        #
4ca0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
4cb0: 20 20 20 20 20 62 75 69 6c 64 2e 62 61 74 20 24       build.bat $
4cc0: 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 4d  {Configuration}M
4cd0: 61 6e 61 67 65 64 4f 6e 6c 79 20 24 7b 50 6c 61  anagedOnly ${Pla
4ce0: 74 66 6f 72 6d 7d 0d 0a 20 20 20 20 20 20 20 20  tform}..        
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 4e 61 74 69 76 65 4f 6e 6c 79 20  tion}NativeOnly 
4d20: 24 7b 50 6c 61 74 66 6f 72 6d 7d 0d 0a 20 20 20  ${Platform}..   
4d30: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4d40: 23 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65  #          Where
4d50: 20 24 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e   ${Configuration
4d60: 7d 20 69 73 20 65 69 74 68 65 72 20 22 44 65 62  } is either "Deb
4d70: 75 67 22 20 6f 72 20 22 52 65 6c 65 61 73 65 22  ug" or "Release"
4d80: 20 61 6e 64 0d 0a 20 20 20 20 20 20 20 20 23 20   and..        # 
4d90: 20 20 20 20 20 20 20 20 20 24 7b 50 6c 61 74 66           ${Platf
4da0: 6f 72 6d 7d 20 69 73 20 65 69 74 68 65 72 20 22  orm} is either "
4db0: 57 69 6e 33 32 22 20 6f 72 20 22 78 36 34 22 2e  Win32" or "x64".
4dc0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
4dd0: 20 20 20 20 20 23 20 20 20 20 20 20 20 32 2e 20       #       2. 
4de0: 42 75 69 6c 64 20 74 68 65 20 6d 69 78 65 64 2d  Build the mixed-
4df0: 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20 75 73  mode assembly us
4e00: 69 6e 67 20 61 20 63 6f 6d 6d 61 6e 64 20 73 69  ing a command si
4e10: 6d 69 6c 61 72 20 74 6f 3a 0d 0a 20 20 20 20 20  milar to:..     
4e20: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
4e30: 20 20 20 20 20 20 20 20 20 62 75 69 6c 64 2e 62           build.b
4e40: 61 74 20 24 7b 43 6f 6e 66 69 67 75 72 61 74 69  at ${Configurati
4e50: 6f 6e 7d 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 0d  on} ${Platform}.
4e60: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
4e70: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 57      #          W
4e80: 68 65 72 65 20 24 7b 43 6f 6e 66 69 67 75 72 61  here ${Configura
4e90: 74 69 6f 6e 7d 20 69 73 20 65 69 74 68 65 72 20  tion} is either 
4ea0: 22 44 65 62 75 67 22 20 6f 72 20 22 52 65 6c 65  "Debug" or "Rele
4eb0: 61 73 65 22 20 61 6e 64 0d 0a 20 20 20 20 20 20  ase" and..      
4ec0: 20 20 23 20 20 20 20 20 20 20 20 20 20 24 7b 50    #          ${P
4ed0: 6c 61 74 66 6f 72 6d 7d 20 69 73 20 65 69 74 68  latform} is eith
4ee0: 65 72 20 22 57 69 6e 33 32 22 20 6f 72 20 22 78  er "Win32" or "x
4ef0: 36 34 22 2e 20 20 49 66 20 74 68 69 73 20 63 6f  64".  If this co
4f00: 6d 6d 61 6e 64 20 69 73 0d 0a 20 20 20 20 20 20  mmand is..      
4f10: 20 20 23 20 20 20 20 20 20 20 20 20 20 75 73 65    #          use
4f20: 64 2c 20 76 61 72 69 6f 75 73 20 74 65 73 74 73  d, various tests
4f30: 20 74 68 61 74 20 72 65 71 75 69 72 65 20 73 75   that require su
4f40: 70 70 6c 65 6d 65 6e 74 61 72 79 20 6d 61 6e 61  pplementary mana
4f50: 67 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ged..        #  
4f60: 20 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 69          assembli
4f70: 65 73 20 28 65 2e 67 2e 20 4c 49 4e 51 29 20 6d  es (e.g. LINQ) m
4f80: 61 79 20 62 65 20 73 6b 69 70 70 65 64 20 75 6e  ay be skipped un
4f90: 6c 65 73 73 20 74 68 6f 73 65 20 62 69 6e 61 72  less those binar
4fa0: 69 65 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ies..        #  
4fb0: 20 20 20 20 20 20 20 20 61 72 65 20 73 75 62 73          are subs
4fc0: 65 71 75 65 6e 74 6c 79 20 63 6f 70 69 65 64 20  equently copied 
4fd0: 69 6e 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  into the correct
4fe0: 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e   directory (i.e.
4ff0: 20 62 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20   by..        #  
5000: 20 20 20 20 20 20 20 20 22 74 65 73 74 5f 61 6c          "test_al
5010: 6c 2e 62 61 74 22 29 2e 0d 0a 20 20 20 20 20 20  l.bat")...      
5020: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20    #..        #  
5030: 20 20 20 20 20 4e 6f 74 65 20 74 68 61 74 20 61       Note that a
5040: 6c 6c 20 6f 66 20 74 68 65 20 62 75 69 6c 64 20  ll of the build 
5050: 63 6f 6d 6d 61 6e 64 73 20 61 62 6f 76 65 20 77  commands above w
5060: 69 6c 6c 20 64 65 66 61 75 6c 74 20 74 6f 20 75  ill default to u
5070: 73 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 23 20  sing..        # 
5080: 20 20 20 20 20 20 74 68 65 20 6c 61 74 65 73 74        the latest
5090: 20 76 65 72 73 69 6f 6e 20 6f 66 20 4d 53 42 75   version of MSBu
50a0: 69 6c 64 20 61 76 61 69 6c 61 62 6c 65 20 61 6e  ild available an
50b0: 64 20 74 68 65 20 22 74 65 73 74 5f 79 65 61 72  d the "test_year
50c0: 22 20 6d 61 79 0d 0a 20 20 20 20 20 20 20 20 23  " may..        #
50d0: 20 20 20 20 20 20 20 6e 65 65 64 20 74 6f 20 62         need to b
50e0: 65 20 61 64 6a 75 73 74 65 64 20 61 63 63 6f 72  e adjusted accor
50f0: 64 69 6e 67 6c 79 20 74 6f 20 61 63 74 75 61 6c  dingly to actual
5100: 6c 79 20 72 75 6e 20 74 68 65 20 74 65 73 74 20  ly run the test 
5110: 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20  suite...        
5120: 23 20 20 20 20 20 20 20 52 65 66 65 72 20 74 6f  #       Refer to
5130: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 73 20 69 6e   the comments in
5140: 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72 5d 20   [getBuildYear] 
5150: 66 6f 72 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61  for more informa
5160: 74 69 6f 6e 20 6f 6e 0d 0a 20 20 20 20 20 20 20  tion on..       
5170: 20 23 20 20 20 20 20 20 20 68 6f 77 20 74 6f 20   #       how to 
5180: 73 65 74 20 74 68 69 73 20 76 61 72 69 61 62 6c  set this variabl
5190: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
51a0: 20 20 20 20 20 20 20 73 65 74 20 6e 61 74 69 76         set nativ
51b0: 65 20 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74  e [hasRuntimeOpt
51c0: 69 6f 6e 20 6e 61 74 69 76 65 5d 0d 0a 0d 0a 20  ion native].... 
51d0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6a         return [j
51e0: 6f 69 6e 42 75 69 6c 64 44 69 72 65 63 74 6f 72  oinBuildDirector
51f0: 79 20 24 6e 61 74 69 76 65 20 5b 67 65 74 42 75  y $native [getBu
5200: 69 6c 64 42 61 73 65 44 69 72 65 63 74 6f 72 79  ildBaseDirectory
5210: 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ] \..           
5220: 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72 5d 20   [getBuildYear] 
5230: 5b 67 65 74 42 75 69 6c 64 50 6c 61 74 66 6f 72  [getBuildPlatfor
5240: 6d 20 24 6e 61 74 69 76 65 5d 20 5b 67 65 74 42  m $native] [getB
5250: 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f  uildConfiguratio
5260: 6e 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  n]]..      }..  
5270: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
5280: 20 67 65 74 52 65 6c 65 61 73 65 56 65 72 73 69   getReleaseVersi
5290: 6f 6e 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  on {} {..      #
52a0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
52b0: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72  Figure out the r
52c0: 65 6c 65 61 73 65 20 76 65 72 73 69 6f 6e 20 66  elease version f
52d0: 6f 72 20 75 73 65 20 77 69 74 68 20 74 68 65 20  or use with the 
52e0: 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 0d  build directory.
52f0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77  .      #       w
5300: 68 65 6e 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  hen checking for
5310: 20 61 76 61 69 6c 61 62 6c 65 20 72 65 6c 65 61   available relea
5320: 73 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ses...      #.. 
5330: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
5340: 78 69 73 74 73 20 3a 3a 72 65 6c 65 61 73 65 5f  xists ::release_
5350: 76 65 72 73 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20  version] && \.. 
5360: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
5370: 20 6c 65 6e 67 74 68 20 24 3a 3a 72 65 6c 65 61   length $::relea
5380: 73 65 5f 76 65 72 73 69 6f 6e 5d 20 3e 20 30 7d  se_version] > 0}
5390: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
53a0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
53b0: 54 45 3a 20 54 68 65 20 72 65 6c 65 61 73 65 20  TE: The release 
53c0: 76 65 72 73 69 6f 6e 20 68 61 73 20 62 65 65 6e  version has been
53d0: 20 6f 76 65 72 72 69 64 64 65 6e 3b 20 74 68 65   overridden; the
53e0: 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 0d 0a  refore, use it..
53f0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
5400: 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20  verbatim...     
5410: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
5420: 74 75 72 6e 20 24 3a 3a 72 65 6c 65 61 73 65 5f  turn $::release_
5430: 76 65 72 73 69 6f 6e 0d 0a 20 20 20 20 20 20 7d  version..      }
5440: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
5450: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
5460: 54 45 3a 20 4e 6f 20 72 65 6c 65 61 73 65 20 76  TE: No release v
5470: 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c 61  ersion is availa
5480: 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65  ble, return an e
5490: 6d 70 74 79 20 73 74 72 69 6e 67 2e 0d 0a 20 20  mpty string...  
54a0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 49 74        #       It
54b0: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
54c0: 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79   return an empty
54d0: 20 73 74 72 69 6e 67 20 68 65 72 65 20 62 65 63   string here bec
54e0: 61 75 73 65 20 74 68 65 0d 0a 20 20 20 20 20 20  ause the..      
54f0: 20 20 23 20 20 20 20 20 20 20 72 65 73 75 6c 74    #       result
5500: 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75   of this procedu
5510: 72 65 20 6d 61 79 20 62 65 20 75 73 65 64 20 77  re may be used w
5520: 69 74 68 20 5b 66 69 6c 65 20 6a 6f 69 6e 5d 2e  ith [file join].
5530: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
5540: 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a       return ""..
5550: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
5560: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42  ...    proc getB
5570: 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 7b 20 66  uildFileName { f
5580: 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72  ileName {platfor
5590: 6d 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  m ""} } {..     
55a0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
55b0: 3a 20 52 65 74 75 72 6e 73 20 74 68 65 20 73 70  : Returns the sp
55c0: 65 63 69 66 69 65 64 20 66 69 6c 65 20 6e 61 6d  ecified file nam
55d0: 65 20 61 73 20 69 66 20 69 74 20 77 65 72 65 20  e as if it were 
55e0: 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65 0d 0a  located in the..
55f0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 75        #       bu
5600: 69 6c 64 20 64 69 72 65 63 74 6f 72 79 2c 20 64  ild directory, d
5610: 69 73 63 61 72 64 69 6e 67 20 61 6e 79 20 64 69  iscarding any di
5620: 72 65 63 74 6f 72 79 20 69 6e 66 6f 72 6d 61 74  rectory informat
5630: 69 6f 6e 20 70 72 65 73 65 6e 74 0d 0a 20 20 20  ion present..   
5640: 20 20 20 23 20 20 20 20 20 20 20 69 6e 20 74 68     #       in th
5650: 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 70  e file name as p
5660: 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20 63  rovided by our c
5670: 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d  aller...      #.
5680: 0a 20 20 20 20 20 20 73 65 74 20 72 65 73 75 6c  .      set resul
5690: 74 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  t [file nativena
56a0: 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
56b0: 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42  [file join [getB
56c0: 75 69 6c 64 44 69 72 65 63 74 6f 72 79 5d 20 24  uildDirectory] $
56d0: 70 6c 61 74 66 6f 72 6d 20 5b 66 69 6c 65 20 74  platform [file t
56e0: 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 5d  ail $fileName]]]
56f0: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
5700: 20 20 20 23 20 48 41 43 4b 3a 20 57 68 65 6e 20     # HACK: When 
5710: 72 75 6e 6e 69 6e 67 20 6f 6e 20 57 6f 57 36 34  running on WoW64
5720: 2c 20 61 73 73 75 6d 65 20 74 68 65 20 74 65 73  , assume the tes
5730: 74 20 65 78 65 63 75 74 61 62 6c 65 73 20 61 72  t executables ar
5740: 65 20 70 72 65 73 65 6e 74 0d 0a 20 20 20 20 20  e present..     
5750: 20 23 20 20 20 20 20 20 20 77 69 74 68 20 74 68   #       with th
5760: 65 20 22 33 32 22 20 73 75 66 66 69 78 20 6f 6e  e "32" suffix on
5770: 20 74 68 65 6d 2e 0d 0a 20 20 20 20 20 20 23 0d   them...      #.
5780: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 73 52 75  .      if {[isRu
5790: 6e 6e 69 6e 67 57 6f 57 36 34 5d 20 26 26 20 5b  nningWoW64] && [
57a0: 66 69 6c 65 20 65 78 74 65 6e 73 69 6f 6e 20 24  file extension $
57b0: 72 65 73 75 6c 74 5d 20 65 71 20 22 2e 65 78 65  result] eq ".exe
57c0: 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  "} then {..     
57d0: 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 61     set result [a
57e0: 70 70 65 6e 64 41 72 67 73 20 5b 66 69 6c 65 20  ppendArgs [file 
57f0: 72 6f 6f 74 6e 61 6d 65 20 24 72 65 73 75 6c 74  rootname $result
5800: 5d 20 33 32 2e 65 78 65 5d 0d 0a 20 20 20 20 20  ] 32.exe]..     
5810: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
5820: 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20  rn $result..    
5830: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
5840: 65 74 45 78 74 65 72 6e 61 6c 44 69 72 65 63 74  etExternalDirect
5850: 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  ory {} {..      
5860: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
5870: 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   This procedure 
5880: 72 65 74 75 72 6e 73 20 74 68 65 20 64 69 72 65  returns the dire
5890: 63 74 6f 72 79 20 77 68 65 72 65 20 74 68 65 20  ctory where the 
58a0: 65 78 74 65 72 6e 61 6c 20 62 69 6e 61 72 79 0d  external binary.
58b0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66  .      #       f
58c0: 69 6c 65 73 20 61 72 65 20 6c 6f 63 61 74 65 64  iles are located
58d0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
58e0: 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e    return [file n
58f0: 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
5900: 64 69 72 6e 61 6d 65 20 5b 66 69 6c 65 20 64 69  dirname [file di
5910: 72 6e 61 6d 65 20 5b 69 6e 66 6f 20 62 69 6e 61  rname [info bina
5920: 72 79 5d 5d 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c  ry]]]]..    }...
5930: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 69  ..    proc getBi
5940: 6e 61 72 79 44 69 72 65 63 74 6f 72 79 20 7b 7d  naryDirectory {}
5950: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
5960: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20     # NOTE: This 
5970: 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72 6e  procedure return
5980: 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  s the directory 
5990: 77 68 65 72 65 20 74 68 65 20 74 65 73 74 20 61  where the test a
59a0: 70 70 6c 69 63 61 74 69 6f 6e 0d 0a 20 20 20 20  pplication..    
59b0: 20 20 23 20 20 20 20 20 20 20 69 74 73 65 6c 66    #       itself
59c0: 20 28 69 2e 65 2e 20 74 68 65 20 45 61 67 6c 65   (i.e. the Eagle
59d0: 20 73 68 65 6c 6c 29 20 69 73 20 6c 6f 63 61 74   shell) is locat
59e0: 65 64 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 62  ed.  This will b
59f0: 65 20 75 73 65 64 20 61 73 0d 0a 20 20 20 20 20  e used as..     
5a00: 20 23 20 20 20 20 20 20 20 74 68 65 20 64 65 73   #       the des
5a10: 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  tination for the
5a20: 20 63 6f 70 69 65 64 20 53 79 73 74 65 6d 2e 44   copied System.D
5a30: 61 74 61 2e 53 51 4c 69 74 65 20 6e 61 74 69 76  ata.SQLite nativ
5a40: 65 20 61 6e 64 0d 0a 20 20 20 20 20 20 23 20 20  e and..      #  
5a50: 20 20 20 20 20 6d 61 6e 61 67 65 64 20 61 73 73       managed ass
5a60: 65 6d 62 6c 69 65 73 20 28 69 2e 65 2e 20 62 65  emblies (i.e. be
5a70: 63 61 75 73 65 20 74 68 69 73 20 69 73 20 6f 6e  cause this is on
5a80: 65 20 6f 66 20 74 68 65 20 66 65 77 20 70 6c 61  e of the few pla
5a90: 63 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ces..      #    
5aa0: 20 20 20 77 68 65 72 65 20 74 68 65 20 43 4c 52     where the CLR
5ab0: 20 77 69 6c 6c 20 61 63 74 75 61 6c 6c 79 20 66   will actually f
5ac0: 69 6e 64 20 61 6e 64 20 6c 6f 61 64 20 74 68 65  ind and load the
5ad0: 6d 20 70 72 6f 70 65 72 6c 79 29 2e 0d 0a 20 20  m properly)...  
5ae0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
5af0: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
5b00: 62 69 6e 61 72 79 5f 64 69 72 65 63 74 6f 72 79  binary_directory
5b10: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
5b20: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
5b30: 20 24 3a 3a 62 69 6e 61 72 79 5f 64 69 72 65 63   $::binary_direc
5b40: 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20  tory] > 0} then 
5b50: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
5b60: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
5b70: 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  e location of th
5b80: 65 20 62 69 6e 61 72 79 20 64 69 72 65 63 74 6f  e binary directo
5b90: 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  ry has been over
5ba0: 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20  ridden;..       
5bb0: 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f   #       therefo
5bc0: 72 65 2c 20 75 73 65 20 69 74 20 76 65 72 62 61  re, use it verba
5bd0: 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  tim...        #.
5be0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
5bf0: 24 3a 3a 62 69 6e 61 72 79 5f 64 69 72 65 63 74  $::binary_direct
5c00: 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  ory..      } els
5c10: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  e {..        ret
5c20: 75 72 6e 20 5b 69 6e 66 6f 20 62 69 6e 61 72 79  urn [info binary
5c30: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
5c40: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
5c50: 65 74 45 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61  etExternalFileNa
5c60: 6d 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20  me { fileName } 
5c70: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
5c80: 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e    # NOTE: Return
5c90: 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  s the specified 
5ca0: 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 69 66 20  file name as if 
5cb0: 69 74 20 77 65 72 65 20 6c 6f 63 61 74 65 64 20  it were located 
5cc0: 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  in the..      # 
5cd0: 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20        directory 
5ce0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65  containing the e
5cf0: 78 74 65 72 6e 61 6c 20 62 69 6e 61 72 69 65 73  xternal binaries
5d00: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
5d10: 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e    return [file n
5d20: 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
5d30: 6a 6f 69 6e 20 5b 67 65 74 45 78 74 65 72 6e 61  join [getExterna
5d40: 6c 44 69 72 65 63 74 6f 72 79 5d 20 24 66 69 6c  lDirectory] $fil
5d50: 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 7d 0d 0a  eName]]..    }..
5d60: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42  ...    proc getB
5d70: 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 7b 20  inaryFileName { 
5d80: 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f  fileName {platfo
5d90: 72 6d 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20  rm ""} } {..    
5da0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
5db0: 45 3a 20 52 65 74 75 72 6e 73 20 74 68 65 20 73  E: Returns the s
5dc0: 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 6e 61  pecified file na
5dd0: 6d 65 20 61 73 20 69 66 20 69 74 20 77 65 72 65  me as if it were
5de0: 20 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65 0d   located in the.
5df0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62  .      #       b
5e00: 69 6e 61 72 79 20 64 69 72 65 63 74 6f 72 79 2c  inary directory,
5e10: 20 64 69 73 63 61 72 64 69 6e 67 20 61 6e 79 20   discarding any 
5e20: 64 69 72 65 63 74 6f 72 79 20 69 6e 66 6f 72 6d  directory inform
5e30: 61 74 69 6f 6e 20 70 72 65 73 65 6e 74 0d 0a 20  ation present.. 
5e40: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 20       #       in 
5e50: 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 73  the file name as
5e60: 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72   provided by our
5e70: 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20   caller...      
5e80: 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  #..      return 
5e90: 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
5ea0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 66   \..          [f
5eb0: 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e  ile join [getBin
5ec0: 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20 24 70  aryDirectory] $p
5ed0: 6c 61 74 66 6f 72 6d 20 5b 66 69 6c 65 20 74 61  latform [file ta
5ee0: 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 5d 0d  il $fileName]]].
5ef0: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
5f00: 72 6f 63 20 67 65 74 43 6f 72 65 42 69 6e 61 72  roc getCoreBinar
5f10: 79 46 69 6c 65 4e 61 6d 65 20 7b 20 7b 70 6c 61  yFileName { {pla
5f20: 74 66 6f 72 6d 20 22 22 7d 20 7b 73 74 61 6e 64  tform ""} {stand
5f30: 61 72 64 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  ard false} } {..
5f40: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
5f50: 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 73 20 74   NOTE: Returns t
5f60: 68 65 20 66 75 6c 6c 20 70 61 74 68 20 66 6f 72  he full path for
5f70: 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69   the file contai
5f80: 6e 69 6e 67 20 74 68 65 20 53 51 4c 69 74 65 20  ning the SQLite 
5f90: 63 6f 72 65 0d 0a 20 20 20 20 20 20 23 20 20 20  core..      #   
5fa0: 20 20 20 20 6e 61 74 69 76 65 20 6c 69 62 72 61      native libra
5fb0: 72 79 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73  ry code for this
5fc0: 20 70 6c 61 74 66 6f 72 6d 2e 20 20 46 69 72 73   platform.  Firs
5fd0: 74 2c 20 63 68 65 63 6b 20 61 6e 64 20 73 65 65  t, check and see
5fe0: 20 69 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20   if..      #    
5ff0: 20 20 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f     the SQLite co
6000: 72 65 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72  re native librar
6010: 79 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  y has already be
6020: 65 6e 20 6c 6f 61 64 65 64 2e 20 20 4e 65 78 74  en loaded.  Next
6030: 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  ,..      #      
6040: 20 66 61 6c 6c 62 61 63 6b 20 74 6f 20 77 68 61   fallback to wha
6050: 74 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 20  t the full path 
6060: 73 68 6f 75 6c 64 20 62 65 2c 20 62 61 73 65 64  should be, based
6070: 20 6f 6e 20 77 68 65 74 68 65 72 20 74 68 65 0d   on whether the.
6080: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6d  .      #       m
6090: 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62  ixed-mode assemb
60a0: 6c 79 20 69 73 20 62 65 69 6e 67 20 75 73 65 64  ly is being used
60b0: 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66   and the name of
60c0: 20 74 68 65 20 63 75 72 72 65 6e 74 0d 0a 20 20   the current..  
60d0: 20 20 20 20 23 20 20 20 20 20 20 20 70 6c 61 74      #       plat
60e0: 66 6f 72 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  form...      #..
60f0: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
6100: 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65   {..        obje
6110: 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
6120: 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
6130: 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
6140: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e  m.Data.SQLite.Un
6150: 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
6160: 73 20 5f 53 51 4c 69 74 65 4e 61 74 69 76 65 4d  s _SQLiteNativeM
6170: 6f 64 75 6c 65 46 69 6c 65 4e 61 6d 65 0d 0a 20  oduleFileName.. 
6180: 20 20 20 20 20 7d 20 66 69 6c 65 4e 61 6d 65 5d       } fileName]
6190: 20 3d 3d 20 30 20 26 26 20 5b 73 74 72 69 6e 67   == 0 && [string
61a0: 20 6c 65 6e 67 74 68 20 24 66 69 6c 65 4e 61 6d   length $fileNam
61b0: 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
61c0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
61d0: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 53     # NOTE: The S
61e0: 51 4c 69 74 65 20 63 6f 72 65 20 6e 61 74 69 76  QLite core nativ
61f0: 65 20 6c 69 62 72 61 72 79 20 68 61 73 20 61 6c  e library has al
6200: 72 65 61 64 79 20 62 65 65 6e 20 6c 6f 61 64 65  ready been loade
6210: 64 20 76 69 61 0d 0a 20 20 20 20 20 20 20 20 23  d via..        #
6220: 20 20 20 20 20 20 20 74 68 65 20 6e 61 74 69 76         the nativ
6230: 65 20 6c 69 62 72 61 72 79 20 70 72 65 2d 6c 6f  e library pre-lo
6240: 61 64 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68  ader.  Return th
6250: 61 74 20 66 69 6c 65 20 6e 61 6d 65 20 6e 6f 77  at file name now
6260: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
6270: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 66 69        return $fi
6280: 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 0d  leName..      }.
6290: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61  ...      if {[ha
62a0: 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e  sRuntimeOption n
62b0: 61 74 69 76 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ative]} then {..
62c0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
62d0: 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72     # NOTE: Retur
62e0: 6e 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65  n the mixed-mode
62f0: 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 20 6e   assembly file n
6300: 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ame...        #.
6310: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
6320: 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
6330: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
6340: 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42  [file join [getB
6350: 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20  inaryDirectory] 
6360: 24 70 6c 61 74 66 6f 72 6d 20 53 79 73 74 65 6d  $platform System
6370: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
6380: 5d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ]]..      } else
6390: 69 66 20 7b 24 73 74 61 6e 64 61 72 64 7d 20 74  if {$standard} t
63a0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
63b0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
63c0: 3a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 74  : Return the nat
63d0: 69 76 65 2d 6f 6e 6c 79 20 73 74 61 6e 64 61 72  ive-only standar
63e0: 64 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79  d SQLite library
63f0: 20 66 69 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20 20   file name...   
6400: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
6410: 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74  return [file nat
6420: 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20  ivename \..     
6430: 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69         [file joi
6440: 6e 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65  n [getBinaryDire
6450: 63 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d  ctory] $platform
6460: 20 73 71 6c 69 74 65 33 2e 64 6c 6c 5d 5d 0d 0a   sqlite3.dll]]..
6470: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
6480: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
6490: 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72     # NOTE: Retur
64a0: 6e 20 74 68 65 20 6e 61 74 69 76 65 2d 6f 6e 6c  n the native-onl
64b0: 79 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62  y interop assemb
64c0: 6c 79 20 66 69 6c 65 20 6e 61 6d 65 2e 0d 0a 20  ly file name... 
64d0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
64e0: 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e    return [file n
64f0: 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20  ativename \..   
6500: 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a           [file j
6510: 6f 69 6e 20 5b 67 65 74 42 69 6e 61 72 79 44 69  oin [getBinaryDi
6520: 72 65 63 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f  rectory] $platfo
6530: 72 6d 20 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f  rm SQLite.Intero
6540: 70 2e 64 6c 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d  p.dll]]..      }
6550: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
6560: 70 72 6f 63 20 67 65 74 43 6f 6d 6d 6f 6e 44 69  proc getCommonDi
6570: 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20  rectory {} {..  
6580: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
6590: 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64  OTE: This proced
65a0: 75 72 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ure returns the 
65b0: 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65 20  directory where 
65c0: 74 68 65 20 74 65 73 74 20 73 63 72 69 70 74 73  the test scripts
65d0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
65e0: 73 68 6f 75 6c 64 20 62 65 20 6c 6f 63 61 74 65  should be locate
65f0: 64 2e 20 20 42 79 20 64 65 66 61 75 6c 74 2c 20  d.  By default, 
6600: 74 68 69 73 20 6a 75 73 74 20 72 65 74 75 72 6e  this just return
6610: 73 20 74 68 65 20 45 61 67 6c 65 0d 0a 20 20 20  s the Eagle..   
6620: 20 20 20 23 20 20 20 20 20 20 20 62 69 6e 61 72     #       binar
6630: 79 20 64 69 72 65 63 74 6f 72 79 2e 0d 0a 20 20  y directory...  
6640: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
6650: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
6660: 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79  common_directory
6670: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
6680: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
6690: 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63   $::common_direc
66a0: 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20  tory] > 0} then 
66b0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
66c0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
66d0: 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  e location of th
66e0: 65 20 63 6f 6d 6d 6f 6e 20 64 69 72 65 63 74 6f  e common directo
66f0: 72 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 3b  ry has been set;
6700: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
6710: 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65    therefore, use
6720: 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d   it...        #.
6730: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
6740: 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74  $::common_direct
6750: 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  ory..      } els
6760: 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74  eif {[info exist
6770: 73 20 3a 3a 76 65 6e 64 6f 72 5f 64 69 72 65 63  s ::vendor_direc
6780: 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20  tory] && \..    
6790: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
67a0: 6e 67 74 68 20 24 3a 3a 76 65 6e 64 6f 72 5f 64  ngth $::vendor_d
67b0: 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74  irectory] > 0} t
67c0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
67d0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
67e0: 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f  : The location o
67f0: 66 20 74 68 65 20 76 65 6e 64 6f 72 20 64 69 72  f the vendor dir
6800: 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
6810: 73 65 74 3b 0d 0a 20 20 20 20 20 20 20 20 23 20  set;..        # 
6820: 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c        therefore,
6830: 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20   use it...      
6840: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
6850: 75 72 6e 20 24 3a 3a 76 65 6e 64 6f 72 5f 64 69  urn $::vendor_di
6860: 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d  rectory..      }
6870: 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65   elseif {[info e
6880: 78 69 73 74 73 20 3a 3a 74 63 6c 5f 6c 69 62 72  xists ::tcl_libr
6890: 61 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ary] && \..     
68a0: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
68b0: 67 74 68 20 24 3a 3a 74 63 6c 5f 6c 69 62 72 61  gth $::tcl_libra
68c0: 72 79 5d 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20  ry] > 0 && \..  
68d0: 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 69 73          [file is
68e0: 64 69 72 65 63 74 6f 72 79 20 24 3a 3a 74 63 6c  directory $::tcl
68f0: 5f 6c 69 62 72 61 72 79 5d 7d 20 74 68 65 6e 20  _library]} then 
6900: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
6910: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
6920: 65 20 76 61 72 69 61 62 6c 65 20 77 69 74 68 20  e variable with 
6930: 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  the location of 
6940: 74 68 65 20 73 63 72 69 70 74 20 6c 69 62 72 61  the script libra
6950: 72 79 20 69 73 0d 0a 20 20 20 20 20 20 20 20 23  ry is..        #
6960: 20 20 20 20 20 20 20 73 65 74 20 61 6e 64 20 61         set and a
6970: 70 70 65 61 72 73 20 74 6f 20 62 65 20 61 20 72  ppears to be a r
6980: 65 61 6c 20 64 69 72 65 63 74 6f 72 79 20 28 69  eal directory (i
6990: 2e 65 2e 20 6e 6f 74 20 65 6d 62 65 64 64 65 64  .e. not embedded
69a0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
69b0: 20 20 77 69 74 68 69 6e 20 61 20 66 69 6c 65 29    within a file)
69c0: 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65  ; therefore, use
69d0: 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d   it...        #.
69e0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
69f0: 24 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79 0d 0a  $::tcl_library..
6a00: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
6a10: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
6a20: 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 6c 6c 62     # NOTE: Fallb
6a30: 61 63 6b 20 74 6f 20 74 68 65 20 64 69 72 65 63  ack to the direc
6a40: 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20  tory containing 
6a50: 74 68 65 20 65 78 65 63 75 74 61 62 6c 65 2e 0d  the executable..
6a60: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
6a70: 20 20 20 20 72 65 74 75 72 6e 20 5b 69 6e 66 6f      return [info
6a80: 20 62 69 6e 61 72 79 5d 0d 0a 20 20 20 20 20 20   binary]..      
6a90: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
6aa0: 20 70 72 6f 63 20 67 65 74 44 61 74 61 62 61 73   proc getDatabas
6ab0: 65 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d  eDirectory {} {.
6ac0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
6ad0: 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f  # NOTE: This pro
6ae0: 63 65 64 75 72 65 20 72 65 74 75 72 6e 73 20 74  cedure returns t
6af0: 68 65 20 64 69 72 65 63 74 6f 72 79 20 77 68 65  he directory whe
6b00: 72 65 20 74 68 65 20 74 65 73 74 20 64 61 74 61  re the test data
6b10: 62 61 73 65 73 0d 0a 20 20 20 20 20 20 23 20 20  bases..      #  
6b20: 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 6c       should be l
6b30: 6f 63 61 74 65 64 2e 20 20 42 79 20 64 65 66 61  ocated.  By defa
6b40: 75 6c 74 2c 20 74 68 69 73 20 6a 75 73 74 20 75  ult, this just u
6b50: 73 65 73 20 74 68 65 20 74 65 6d 70 6f 72 61 72  ses the temporar
6b60: 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
6b70: 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 66 69   directory confi
6b80: 67 75 72 65 64 20 66 6f 72 20 74 68 69 73 20 73  gured for this s
6b90: 79 73 74 65 6d 2e 0d 0a 20 20 20 20 20 20 23 0d  ystem...      #.
6ba0: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
6bb0: 20 65 78 69 73 74 73 20 3a 3a 64 61 74 61 62 61   exists ::databa
6bc0: 73 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26  se_directory] &&
6bd0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
6be0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
6bf0: 64 61 74 61 62 61 73 65 5f 64 69 72 65 63 74 6f  database_directo
6c00: 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ry] > 0} then {.
6c10: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
6c20: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
6c30: 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  location of the 
6c40: 64 61 74 61 62 61 73 65 20 64 69 72 65 63 74 6f  database directo
6c50: 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  ry has been over
6c60: 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20  ridden;..       
6c70: 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f   #       therefo
6c80: 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20  re, use it...   
6c90: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
6ca0: 72 65 74 75 72 6e 20 24 3a 3a 64 61 74 61 62 61  return $::databa
6cb0: 73 65 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20  se_directory..  
6cc0: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69      } elseif {[i
6cd0: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 73 63 72  nfo exists ::scr
6ce0: 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79 5d 20  atch_directory] 
6cf0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
6d00: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
6d10: 3a 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63 74  ::scratch_direct
6d20: 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ory] > 0} then {
6d30: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
6d40: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
6d50: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
6d60: 20 73 63 72 61 74 63 68 20 64 69 72 65 63 74 6f   scratch directo
6d70: 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  ry has been over
6d80: 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20  ridden;..       
6d90: 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f   #       therefo
6da0: 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20  re, use it...   
6db0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
6dc0: 72 65 74 75 72 6e 20 24 3a 3a 73 63 72 61 74 63  return $::scratc
6dd0: 68 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  h_directory..   
6de0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
6df0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 67 65 74       return [get
6e00: 54 65 6d 70 6f 72 61 72 79 50 61 74 68 5d 0d 0a  TemporaryPath]..
6e10: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
6e20: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 54  ...    proc getT
6e30: 65 6d 70 6f 72 61 72 79 44 69 72 65 63 74 6f 72  emporaryDirector
6e40: 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  y {} {..      #.
6e50: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
6e60: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65  his procedure re
6e70: 74 75 72 6e 73 20 74 68 65 20 64 69 72 65 63 74  turns the direct
6e80: 6f 72 79 20 77 68 65 72 65 20 74 68 65 20 74 65  ory where the te
6e90: 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 0d 0a 20  mporary files.. 
6ea0: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 68 6f       #       sho
6eb0: 75 6c 64 20 62 65 20 6c 6f 63 61 74 65 64 2e 20  uld be located. 
6ec0: 20 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69   By default, thi
6ed0: 73 20 6a 75 73 74 20 75 73 65 73 20 74 68 65 20  s just uses the 
6ee0: 74 65 6d 70 6f 72 61 72 79 0d 0a 20 20 20 20 20  temporary..     
6ef0: 20 23 20 20 20 20 20 20 20 64 69 72 65 63 74 6f   #       directo
6f00: 72 79 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  ry configured fo
6f10: 72 20 74 68 69 73 20 73 79 73 74 65 6d 2e 0d 0a  r this system...
6f20: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
6f30: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
6f40: 3a 3a 74 65 6d 70 6f 72 61 72 79 5f 64 69 72 65  ::temporary_dire
6f50: 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20  ctory] && \..   
6f60: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
6f70: 65 6e 67 74 68 20 24 3a 3a 74 65 6d 70 6f 72 61  ength $::tempora
6f80: 72 79 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20  ry_directory] > 
6f90: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
6fa0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
6fb0: 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69  NOTE: The locati
6fc0: 6f 6e 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72  on of the tempor
6fd0: 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 68 61  ary directory ha
6fe0: 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65  s been overridde
6ff0: 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  n;..        #   
7000: 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75      therefore, u
7010: 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20  se it...        
7020: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
7030: 6e 20 24 3a 3a 74 65 6d 70 6f 72 61 72 79 5f 64  n $::temporary_d
7040: 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20  irectory..      
7050: 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20  } elseif {[info 
7060: 65 78 69 73 74 73 20 3a 3a 73 63 72 61 74 63 68  exists ::scratch
7070: 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c  _directory] && \
7080: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
7090: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 73 63  ing length $::sc
70a0: 72 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79 5d  ratch_directory]
70b0: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
70c0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
70d0: 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63   # NOTE: The loc
70e0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 63 72  ation of the scr
70f0: 61 74 63 68 20 64 69 72 65 63 74 6f 72 79 20 68  atch directory h
7100: 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64  as been overridd
7110: 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20  en;..        #  
7120: 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20       therefore, 
7130: 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20  use it...       
7140: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
7150: 72 6e 20 24 3a 3a 73 63 72 61 74 63 68 5f 64 69  rn $::scratch_di
7160: 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d  rectory..      }
7170: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
7180: 20 72 65 74 75 72 6e 20 5b 67 65 74 54 65 6d 70   return [getTemp
7190: 6f 72 61 72 79 50 61 74 68 5d 0d 0a 20 20 20 20  oraryPath]..    
71a0: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
71b0: 20 20 20 70 72 6f 63 20 67 65 74 54 65 73 74 4f     proc getTestO
71c0: 76 65 72 72 69 64 65 73 50 72 65 61 6d 62 6c 65  verridesPreamble
71d0: 20 7b 20 7b 65 78 74 72 61 56 61 72 4e 61 6d 65   { {extraVarName
71e0: 73 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  s ""} } {..     
71f0: 20 73 65 74 20 76 61 72 4e 61 6d 65 73 20 5b 6c   set varNames [l
7200: 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  ist]....      #.
7210: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
7220: 66 20 61 76 61 69 6c 61 62 6c 65 2c 20 73 74 61  f available, sta
7230: 72 74 20 77 69 74 68 20 74 68 65 20 6d 61 73 74  rt with the mast
7240: 65 72 20 6c 69 73 74 20 6f 66 20 74 65 73 74 20  er list of test 
7250: 6f 76 65 72 72 69 64 65 0d 0a 20 20 20 20 20 20  override..      
7260: 23 20 20 20 20 20 20 20 76 61 72 69 61 62 6c 65  #       variable
7270: 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s...      #..   
7280: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
7290: 73 74 73 20 3a 3a 74 65 73 74 5f 6f 76 65 72 72  sts ::test_overr
72a0: 69 64 65 73 5d 20 26 26 20 5c 0d 0a 20 20 20 20  ides] && \..    
72b0: 20 20 20 20 20 20 5b 6c 6c 65 6e 67 74 68 20 24        [llength $
72c0: 3a 3a 74 65 73 74 5f 6f 76 65 72 72 69 64 65 73  ::test_overrides
72d0: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
72e0: 20 20 20 20 20 20 20 65 76 61 6c 20 6c 61 70 70         eval lapp
72f0: 65 6e 64 20 76 61 72 4e 61 6d 65 73 20 24 3a 3a  end varNames $::
7300: 74 65 73 74 5f 6f 76 65 72 72 69 64 65 73 0d 0a  test_overrides..
7310: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
7320: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
7330: 3a 20 49 66 20 72 65 71 75 65 73 74 65 64 20 62  : If requested b
7340: 79 20 6f 75 72 20 63 61 6c 6c 65 72 2c 20 61 64  y our caller, ad
7350: 64 20 61 6e 79 20 61 64 64 69 74 69 6f 6e 61 6c  d any additional
7360: 20 76 61 72 69 61 62 6c 65 0d 0a 20 20 20 20 20   variable..     
7370: 20 23 20 20 20 20 20 20 20 6e 61 6d 65 73 20 74   #       names t
7380: 6f 20 63 6f 70 79 20 6e 6f 77 2e 0d 0a 20 20 20  o copy now...   
7390: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
73a0: 5b 6c 6c 65 6e 67 74 68 20 24 65 78 74 72 61 56  [llength $extraV
73b0: 61 72 4e 61 6d 65 73 5d 20 3e 20 30 7d 20 74 68  arNames] > 0} th
73c0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 65 76  en {..        ev
73d0: 61 6c 20 6c 61 70 70 65 6e 64 20 76 61 72 4e 61  al lappend varNa
73e0: 6d 65 73 20 24 65 78 74 72 61 56 61 72 4e 61 6d  mes $extraVarNam
73f0: 65 73 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  es..      }.... 
7400: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
7410: 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20  NOTE: Build the 
7420: 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20  script fragment 
7430: 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
7440: 79 20 70 72 6f 63 65 73 73 69 6e 67 20 65 61 63  y processing eac
7450: 68 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  h..      #      
7460: 20 76 61 72 69 61 62 6c 65 20 6e 61 6d 65 20 61   variable name a
7470: 6e 64 20 61 64 64 69 6e 67 20 74 68 65 20 6e 65  nd adding the ne
7480: 63 65 63 65 73 73 61 72 79 20 73 63 72 69 70 74  cecessary script
7490: 20 66 72 61 67 6d 65 6e 74 73 20 66 6f 72 0d 0a   fragments for..
74a0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65 61        #       ea
74b0: 63 68 20 6f 6e 65 2e 0d 0a 20 20 20 20 20 20 23  ch one...      #
74c0: 0d 0a 20 20 20 20 20 20 73 65 74 20 72 65 73 75  ..      set resu
74d0: 6c 74 20 22 22 0d 0a 0d 0a 20 20 20 20 20 20 66  lt ""....      f
74e0: 6f 72 65 61 63 68 20 76 61 72 4e 61 6d 65 20 24  oreach varName $
74f0: 76 61 72 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  varNames {..    
7500: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
7510: 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65   NOTE: Build the
7520: 20 71 75 61 6c 69 66 69 65 64 20 67 6c 6f 62 61   qualified globa
7530: 6c 20 76 61 72 69 61 62 6c 65 20 6e 61 6d 65 2e  l variable name.
7540: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
7550: 20 20 20 20 20 73 65 74 20 66 75 6c 6c 56 61 72       set fullVar
7560: 4e 61 6d 65 20 5b 61 70 70 65 6e 64 41 72 67 73  Name [appendArgs
7570: 20 3a 3a 20 24 76 61 72 4e 61 6d 65 5d 0d 0a 0d   :: $varName]...
7580: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
7590: 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73      # NOTE: Does
75a0: 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 65 78   the variable ex
75b0: 69 73 74 20 69 6e 20 74 68 69 73 20 69 6e 74 65  ist in this inte
75c0: 72 70 72 65 74 65 72 20 63 6f 6e 74 65 78 74 3f  rpreter context?
75d0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
75e0: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
75f0: 78 69 73 74 73 20 24 66 75 6c 6c 56 61 72 4e 61  xists $fullVarNa
7600: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
7610: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
7620: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 70 70 65      # NOTE: Appe
7630: 6e 64 20 61 20 73 63 72 69 70 74 20 66 72 61 67  nd a script frag
7640: 6d 65 6e 74 20 74 6f 20 74 68 65 20 72 65 73 75  ment to the resu
7650: 6c 74 20 74 68 61 74 20 77 69 6c 6c 20 63 6f 72  lt that will cor
7660: 72 65 63 74 6c 79 0d 0a 20 20 20 20 20 20 20 20  rectly..        
7670: 20 20 23 20 20 20 20 20 20 20 63 6f 70 79 20 61    #       copy a
7680: 6e 79 20 63 6f 6e 74 61 69 6e 65 64 20 76 61 6c  ny contained val
7690: 75 65 20 74 6f 20 61 6e 6f 74 68 65 72 20 69 6e  ue to another in
76a0: 74 65 72 70 72 65 74 65 72 20 63 6f 6e 74 65 78  terpreter contex
76b0: 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  t...          #.
76c0: 0a 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e  .          appen
76d0: 64 20 72 65 73 75 6c 74 20 5c 6e 20 22 73 65 74  d result \n "set
76e0: 20 22 20 24 66 75 6c 6c 56 61 72 4e 61 6d 65 20   " $fullVarName 
76f0: 22 20 5c 7b 22 20 5b 73 65 74 20 24 66 75 6c 6c  " \{" [set $full
7700: 56 61 72 4e 61 6d 65 5d 20 5c 7d 0d 0a 20 20 20  VarName] \}..   
7710: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
7720: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
7730: 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65    # NOTE: If the
7740: 20 72 65 73 75 6c 74 20 63 6f 6e 74 61 69 6e 73   result contains
7750: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 63 72   one or more scr
7760: 69 70 74 20 66 72 61 67 6d 65 6e 74 73 2c 20 61  ipt fragments, a
7770: 70 70 65 6e 64 20 61 0d 0a 20 20 20 20 20 20 23  ppend a..      #
7780: 20 20 20 20 20 20 20 6e 65 77 6c 69 6e 65 2e 0d         newline..
7790: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
77a0: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
77b0: 74 68 20 24 72 65 73 75 6c 74 5d 20 3e 20 30 7d  th $result] > 0}
77c0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
77d0: 20 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 5c   append result \
77e0: 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  n..      }....  
77f0: 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73 75      return $resu
7800: 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  lt..    }.....  
7810: 20 20 70 72 6f 63 20 67 65 74 41 70 70 44 6f 6d    proc getAppDom
7820: 61 69 6e 50 72 65 61 6d 62 6c 65 20 7b 20 7b 70  ainPreamble { {p
7830: 72 65 66 69 78 20 22 22 7d 20 7b 73 75 66 66 69  refix ""} {suffi
7840: 78 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  x ""} } {..     
7850: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
7860: 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  : This procedure
7870: 20 72 65 74 75 72 6e 73 20 61 20 74 65 73 74 20   returns a test 
7880: 73 65 74 75 70 20 73 63 72 69 70 74 20 66 72 61  setup script fra
7890: 67 6d 65 6e 74 20 73 75 69 74 61 62 6c 65 20 66  gment suitable f
78a0: 6f 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  or..      #     
78b0: 20 20 65 76 61 6c 75 61 74 69 6f 6e 20 62 79 20    evaluation by 
78c0: 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72 20 63  an interpreter c
78d0: 72 65 61 74 65 64 20 69 6e 20 61 6e 20 69 73 6f  reated in an iso
78e0: 6c 61 74 65 64 20 61 70 70 6c 69 63 61 74 69 6f  lated applicatio
78f0: 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  n..      #      
7900: 20 64 6f 6d 61 69 6e 2e 20 20 54 68 65 20 73 63   domain.  The sc
7910: 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20 62 65  ript fragment be
7920: 69 6e 67 20 72 65 74 75 72 6e 65 64 20 77 69 6c  ing returned wil
7930: 6c 20 62 65 20 73 75 72 72 6f 75 6e 64 65 64 20  l be surrounded 
7940: 62 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  by..      #     
7950: 20 20 74 68 65 20 70 72 65 66 69 78 20 61 6e 64    the prefix and
7960: 20 73 75 66 66 69 78 20 22 73 63 72 69 70 74 20   suffix "script 
7970: 66 72 61 67 6d 65 6e 74 73 22 20 73 70 65 63 69  fragments" speci
7980: 66 69 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c  fied by our call
7990: 65 72 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20  er,..      #    
79a0: 20 20 20 69 66 20 61 6e 79 2e 20 20 54 68 65 20     if any.  The 
79b0: 65 6e 74 69 72 65 20 73 63 72 69 70 74 20 62 65  entire script be
79c0: 69 6e 67 20 72 65 74 75 72 6e 65 64 20 77 69 6c  ing returned wil
79d0: 6c 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64  l be substituted
79e0: 20 76 69 61 0d 0a 20 20 20 20 20 20 23 20 20 20   via..      #   
79f0: 20 20 20 20 5b 73 75 62 73 74 5d 2c 20 69 6e 20      [subst], in 
7a00: 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f  the context of o
7a10: 75 72 20 63 61 6c 6c 65 72 2c 20 62 65 66 6f 72  ur caller, befor
7a20: 65 20 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64  e being returned
7a30: 2e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  ...      #      
7a40: 20 54 68 69 73 20 73 74 65 70 20 69 73 20 6e 65   This step is ne
7a50: 63 65 73 73 61 72 79 20 73 6f 20 74 68 61 74 20  cessary so that 
7a60: 73 6f 6d 65 20 6c 69 6d 69 74 65 64 20 63 6f 6e  some limited con
7a70: 74 65 78 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  text information
7a80: 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  ,..      #      
7a90: 20 70 72 69 6d 61 72 69 6c 79 20 72 65 6c 61 74   primarily relat
7aa0: 65 64 20 74 6f 20 74 68 65 20 74 65 73 74 69 6e  ed to the testin
7ab0: 67 20 64 69 72 65 63 74 6f 72 69 65 73 2c 20 63  g directories, c
7ac0: 61 6e 20 62 65 20 74 72 61 6e 73 66 65 72 72 65  an be transferre
7ad0: 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
7ae0: 20 74 6f 20 74 68 65 20 69 6e 74 65 72 70 72 65   to the interpre
7af0: 74 65 72 20 69 6e 20 74 68 65 20 69 73 6f 6c 61  ter in the isola
7b00: 74 65 64 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  ted application 
7b10: 64 6f 6d 61 69 6e 2c 20 6d 61 6b 69 6e 67 20 69  domain, making i
7b20: 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  t..      #      
7b30: 20 61 62 6c 65 20 74 6f 20 73 75 63 63 65 73 73   able to success
7b40: 66 75 6c 6c 79 20 72 75 6e 20 74 65 73 74 73 20  fully run tests 
7b50: 74 68 61 74 20 72 65 71 75 69 72 65 20 6f 6e 65  that require one
7b60: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 0d   or more of the.
7b70: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66  .      #       f
7b80: 69 6c 65 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74  iles in one of t
7b90: 68 65 20 74 65 73 74 69 6e 67 20 64 69 72 65 63  he testing direc
7ba0: 74 6f 72 69 65 73 2e 20 20 43 61 6c 6c 65 72 73  tories.  Callers
7bb0: 20 73 68 6f 75 6c 64 20 6b 65 65 70 20 69 6e 0d   should keep in.
7bc0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6d  .      #       m
7bd0: 69 6e 64 20 74 68 61 74 20 74 68 65 20 74 65 73  ind that the tes
7be0: 74 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e  t script fragmen
7bf0: 74 20 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64  t being returned
7c00: 20 63 61 6e 6e 6f 74 20 72 65 6c 79 20 6f 6e 0d   cannot rely on.
7c10: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
7c20: 6e 79 20 73 63 72 69 70 74 20 6c 69 62 72 61 72  ny script librar
7c30: 79 20 70 72 6f 63 65 64 75 72 65 73 20 74 68 61  y procedures tha
7c40: 74 20 61 72 65 20 6e 6f 74 20 70 72 6f 76 69 64  t are not provid
7c50: 65 64 20 62 79 20 74 68 65 20 45 61 67 6c 65 0d  ed by the Eagle.
7c60: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6c  .      #       l
7c70: 69 62 72 61 72 79 20 70 61 63 6b 61 67 65 20 28  ibrary package (
7c80: 69 2e 65 2e 20 22 69 6e 69 74 2e 65 61 67 6c 65  i.e. "init.eagle
7c90: 22 29 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  "), including th
7ca0: 6f 73 65 20 70 72 6f 76 69 64 65 64 20 62 79 0d  ose provided by.
7cb0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
7cc0: 68 65 20 45 61 67 6c 65 20 74 65 73 74 20 70 61  he Eagle test pa
7cd0: 63 6b 61 67 65 2c 20 75 6e 6c 65 73 73 20 74 68  ckage, unless th
7ce0: 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e  e file containin
7cf0: 67 20 74 68 65 6d 20 69 73 20 6c 6f 61 64 65 64  g them is loaded
7d00: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
7d10: 6d 61 6e 75 61 6c 6c 79 20 76 69 61 20 73 6f 6d  manually via som
7d20: 65 20 6f 74 68 65 72 20 6d 65 63 68 61 6e 69 73  e other mechanis
7d30: 6d 20 28 65 2e 67 2e 20 62 79 20 69 6e 63 6c 75  m (e.g. by inclu
7d40: 64 69 6e 67 20 61 70 70 72 6f 70 72 69 61 74 65  ding appropriate
7d50: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
7d60: 5b 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65  [package require
7d70: 5d 20 6f 72 20 5b 73 6f 75 72 63 65 5d 20 63 6f  ] or [source] co
7d80: 6d 6d 61 6e 64 73 20 69 6e 20 74 68 65 20 70 72  mmands in the pr
7d90: 65 66 69 78 20 6f 72 20 73 75 66 66 69 78 0d 0a  efix or suffix..
7da0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 63        #       sc
7db0: 72 69 70 74 20 66 72 61 67 6d 65 6e 74 73 29 2e  ript fragments).
7dc0: 20 20 41 6c 73 6f 2c 20 61 6c 6c 20 76 61 72 69    Also, all vari
7dd0: 61 62 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20  able references 
7de0: 61 6e 64 20 61 6c 6c 20 6e 65 73 74 65 64 0d 0a  and all nested..
7df0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
7e00: 6d 6d 61 6e 64 73 20 28 69 2e 65 2e 20 74 68 6f  mmands (i.e. tho
7e10: 73 65 20 69 6e 20 73 71 75 61 72 65 20 62 72 61  se in square bra
7e20: 63 6b 65 74 73 29 20 63 6f 6e 74 61 69 6e 65 64  ckets) contained
7e30: 20 69 6e 20 74 68 65 20 66 69 6e 61 6c 0d 0a 20   in the final.. 
7e40: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 63 72       #       scr
7e50: 69 70 74 20 66 72 61 67 6d 65 6e 74 20 77 69 6c  ipt fragment wil
7e60: 6c 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 65  l end up being e
7e70: 76 61 6c 75 61 74 65 64 20 69 6e 20 74 68 65 20  valuated in the 
7e80: 63 6f 6e 74 65 78 74 20 6f 66 20 74 68 65 0d 0a  context of the..
7e90: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61        #       ca
7ea0: 6c 6c 69 6e 67 20 69 6e 74 65 72 70 72 65 74 65  lling interprete
7eb0: 72 20 61 6e 64 20 6e 6f 74 20 74 68 65 20 74 61  r and not the ta
7ec0: 72 67 65 74 20 69 6e 74 65 72 70 72 65 74 65 72  rget interpreter
7ed0: 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 0d   created in the.
7ee0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69  .      #       i
7ef0: 73 6f 6c 61 74 65 64 20 61 70 70 6c 69 63 61 74  solated applicat
7f00: 69 6f 6e 20 64 6f 6d 61 69 6e 20 75 6e 6c 65 73  ion domain unles
7f10: 73 20 74 68 65 20 64 6f 6c 6c 61 72 20 73 69 67  s the dollar sig
7f20: 6e 73 20 61 6e 64 2f 6f 72 20 73 71 75 61 72 65  ns and/or square
7f30: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
7f40: 62 72 61 63 6b 65 74 73 20 61 72 65 20 73 70 65  brackets are spe
7f50: 63 69 61 6c 6c 79 20 71 75 6f 74 65 64 20 77 69  cially quoted wi
7f60: 74 68 20 62 61 63 6b 73 6c 61 73 68 65 73 2e 0d  th backslashes..
7f70: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
7f80: 72 65 74 75 72 6e 20 5b 75 70 6c 65 76 65 6c 20  return [uplevel 
7f90: 31 20 5b 6c 69 73 74 20 73 75 62 73 74 20 5b 61  1 [list subst [a
7fa0: 70 70 65 6e 64 41 72 67 73 20 24 70 72 65 66 69  ppendArgs $prefi
7fb0: 78 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  x {..        if 
7fc0: 7b 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74 69  {[hasRuntimeOpti
7fd0: 6f 6e 20 6e 61 74 69 76 65 5d 7d 20 74 68 65 6e  on native]} then
7fe0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62   {..          ob
7ff0: 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49 6e 74 65  ject invoke Inte
8000: 72 70 72 65 74 65 72 2e 47 65 74 41 63 74 69 76  rpreter.GetActiv
8010: 65 20 41 64 64 52 75 6e 74 69 6d 65 4f 70 74 69  e AddRuntimeOpti
8020: 6f 6e 20 6e 61 74 69 76 65 0d 0a 20 20 20 20 20  on native..     
8030: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 5b 67     }..      } [g
8040: 65 74 54 65 73 74 4f 76 65 72 72 69 64 65 73 50  etTestOverridesP
8050: 72 65 61 6d 62 6c 65 20 5b 6c 69 73 74 20 70 61  reamble [list pa
8060: 74 68 20 74 65 73 74 5f 63 68 61 6e 6e 65 6c 5d  th test_channel]
8070: 5d 20 24 73 75 66 66 69 78 5d 5d 5d 0d 0a 20 20  ] $suffix]]]..  
8080: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
8090: 20 74 72 79 43 6f 70 79 45 78 74 65 72 6e 61 6c   tryCopyExternal
80a0: 46 69 6c 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  File {..        
80b0: 20 20 20 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c      fileName {pl
80c0: 61 74 66 6f 72 6d 20 22 22 7d 20 7b 6e 65 77 46  atform ""} {newF
80d0: 69 6c 65 4e 61 6d 65 20 22 22 7d 20 7b 76 65 72  ileName ""} {ver
80e0: 62 6f 73 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  bose false} } {.
80f0: 0a 20 20 20 20 20 20 73 65 74 20 73 6f 75 72 63  .      set sourc
8100: 65 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 45 78  eFileName [getEx
8110: 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 20 24  ternalFileName $
8120: 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20  fileName]....   
8130: 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78     if {![file ex
8140: 69 73 74 73 20 24 73 6f 75 72 63 65 46 69 6c 65  ists $sourceFile
8150: 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
8160: 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62         if {$verb
8170: 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ose} then {..   
8180: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
8190: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
81a0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
81b0: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
81c0: 73 6b 69 70 70 65 64 20 63 6f 70 79 69 6e 67 20  skipped copying 
81d0: 65 78 74 65 72 6e 61 6c 20 66 69 6c 65 20 5c 22  external file \"
81e0: 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  " $sourceFileNam
81f0: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
8200: 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20     "\", it does 
8210: 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20  not exist\n"].. 
8220: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
8230: 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20    return..      
8240: 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  }....      if {[
8250: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e  string length $n
8260: 65 77 46 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d  ewFileName] > 0}
8270: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
8280: 20 73 65 74 20 74 61 72 67 65 74 46 69 6c 65 4e   set targetFileN
8290: 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69  ame [getBinaryFi
82a0: 6c 65 4e 61 6d 65 20 24 6e 65 77 46 69 6c 65 4e  leName $newFileN
82b0: 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a  ame $platform]..
82c0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
82d0: 20 20 20 20 20 20 20 20 73 65 74 20 74 61 72 67          set targ
82e0: 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42  etFileName [getB
82f0: 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66  inaryFileName $f
8300: 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72  ileName $platfor
8310: 6d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  m]..      }.... 
8320: 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74 44       set targetD
8330: 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65 20 64  irectory [file d
8340: 69 72 6e 61 6d 65 20 24 74 61 72 67 65 74 46 69  irname $targetFi
8350: 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20  leName]....     
8360: 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
8370: 20 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c         if {![fil
8380: 65 20 65 78 69 73 74 73 20 24 74 61 72 67 65 74  e exists $target
8390: 44 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e  Directory]} then
83a0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66 69   {..          fi
83b0: 6c 65 20 6d 6b 64 69 72 20 24 74 61 72 67 65 74  le mkdir $target
83c0: 44 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20  Directory..     
83d0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 66 69     }..        fi
83e0: 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63 65 20 24  le copy -force $
83f0: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 24  sourceFileName $
8400: 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 0d 0a  targetFileName..
8410: 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74        }] == 0} t
8420: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  hen {..        t
8430: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
8440: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
8450: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
8460: 22 2d 2d 2d 2d 20 63 6f 70 69 65 64 20 65 78 74  "---- copied ext
8470: 65 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20  ernal file from 
8480: 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e  \"" $sourceFileN
8490: 61 6d 65 20 22 5c 22 20 74 6f 20 5c 22 22 20 5c  ame "\" to \"" \
84a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 74  ..            $t
84b0: 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22  argetFileName \"
84c0: 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  \n]..      } els
84d0: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e {..        tpu
84e0: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
84f0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
8500: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
8510: 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20 63 6f  --- failed to co
8520: 70 79 20 65 78 74 65 72 6e 61 6c 20 66 69 6c 65  py external file
8530: 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63   from \"" $sourc
8540: 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20  eFileName \..   
8550: 20 20 20 20 20 20 20 20 20 22 5c 22 20 74 6f 20           "\" to 
8560: 5c 22 22 20 24 74 61 72 67 65 74 46 69 6c 65 4e  \"" $targetFileN
8570: 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  ame \"\n]..     
8580: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
8590: 20 20 70 72 6f 63 20 74 72 79 43 6f 70 79 42 69    proc tryCopyBi
85a0: 6e 61 72 79 46 69 6c 65 20 7b 0d 0a 20 20 20 20  naryFile {..    
85b0: 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65          fileName
85c0: 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b   {platform ""} {
85d0: 6e 65 77 46 69 6c 65 4e 61 6d 65 20 22 22 7d 20  newFileName ""} 
85e0: 7b 76 65 72 62 6f 73 65 20 66 61 6c 73 65 7d 20  {verbose false} 
85f0: 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 73  } {..      set s
8600: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5b 67  ourceFileName [g
8610: 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  etBinaryFileName
8620: 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74   $fileName $plat
8630: 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69  form]....      i
8640: 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73  f {![file exists
8650: 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65   $sourceFileName
8660: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
8670: 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d     if {$verbose}
8680: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
8690: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
86a0: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
86b0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
86c0: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70        "---- skip
86d0: 70 65 64 20 63 6f 70 79 69 6e 67 20 62 69 6e 61  ped copying bina
86e0: 72 79 20 66 69 6c 65 20 5c 22 22 20 24 73 6f 75  ry file \"" $sou
86f0: 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  rceFileName \.. 
8700: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22               "\"
8710: 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78  , it does not ex
8720: 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  ist\n"]..       
8730: 20 7d 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   }..        retu
8740: 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  rn..      }.... 
8750: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
8760: 20 6c 65 6e 67 74 68 20 24 6e 65 77 46 69 6c 65   length $newFile
8770: 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  Name] > 0} then 
8780: 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74  {..        set t
8790: 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67  argetFileName [g
87a0: 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20  etBuildFileName 
87b0: 24 6e 65 77 46 69 6c 65 4e 61 6d 65 20 24 70 6c  $newFileName $pl
87c0: 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 7d  atform]..      }
87d0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
87e0: 20 73 65 74 20 74 61 72 67 65 74 46 69 6c 65 4e   set targetFileN
87f0: 61 6d 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c  ame [getBuildFil
8800: 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20  eName $fileName 
8810: 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20  $platform]..    
8820: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74    }....      set
8830: 20 74 61 72 67 65 74 44 69 72 65 63 74 6f 72 79   targetDirectory
8840: 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24   [file dirname $
8850: 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 5d 0d  targetFileName].
8860: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  ...      if {[ca
8870: 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  tch {..        i
8880: 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73  f {![file exists
8890: 20 24 74 61 72 67 65 74 44 69 72 65 63 74 6f 72   $targetDirector
88a0: 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  y]} then {..    
88b0: 20 20 20 20 20 20 66 69 6c 65 20 6d 6b 64 69 72        file mkdir
88c0: 20 24 74 61 72 67 65 74 44 69 72 65 63 74 6f 72   $targetDirector
88d0: 79 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  y..        }..  
88e0: 20 20 20 20 20 20 66 69 6c 65 20 63 6f 70 79 20        file copy 
88f0: 2d 66 6f 72 63 65 20 24 73 6f 75 72 63 65 46 69  -force $sourceFi
8900: 6c 65 4e 61 6d 65 20 24 74 61 72 67 65 74 46 69  leName $targetFi
8910: 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 5d  leName..      }]
8920: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
8930: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
8940: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
8950: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
8960: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f          "---- co
8970: 70 69 65 64 20 62 69 6e 61 72 79 20 66 69 6c 65  pied binary file
8980: 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63   from \"" $sourc
8990: 65 46 69 6c 65 4e 61 6d 65 20 22 5c 22 20 74 6f  eFileName "\" to
89a0: 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
89b0: 20 20 20 20 24 74 61 72 67 65 74 46 69 6c 65 4e      $targetFileN
89c0: 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  ame \"\n]..     
89d0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
89e0: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
89f0: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
8a00: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
8a10: 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64      "---- failed
8a20: 20 74 6f 20 63 6f 70 79 20 62 69 6e 61 72 79 20   to copy binary 
8a30: 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73  file from \"" $s
8a40: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d  ourceFileName \.
8a50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22  .            "\"
8a60: 20 74 6f 20 5c 22 22 20 24 74 61 72 67 65 74 46   to \"" $targetF
8a70: 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20  ileName \"\n].. 
8a80: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
8a90: 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79 43 6f  ..    proc tryCo
8aa0: 70 79 42 75 69 6c 64 46 69 6c 65 20 7b 0d 0a 20  pyBuildFile {.. 
8ab0: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 4e             fileN
8ac0: 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22  ame {platform ""
8ad0: 7d 20 7b 6e 65 77 46 69 6c 65 4e 61 6d 65 20 22  } {newFileName "
8ae0: 22 7d 20 7b 76 65 72 62 6f 73 65 20 66 61 6c 73  "} {verbose fals
8af0: 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  e} } {..      se
8b00: 74 20 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65  t sourceFileName
8b10: 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61   [getBuildFileNa
8b20: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c  me $fileName $pl
8b30: 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20  atform]....     
8b40: 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73   if {![file exis
8b50: 74 73 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61  ts $sourceFileNa
8b60: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
8b70: 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73       if {$verbos
8b80: 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
8b90: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
8ba0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
8bb0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
8bc0: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b          "---- sk
8bd0: 69 70 70 65 64 20 63 6f 70 79 69 6e 67 20 62 75  ipped copying bu
8be0: 69 6c 64 20 66 69 6c 65 20 5c 22 22 20 24 73 6f  ild file \"" $so
8bf0: 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a  urceFileName \..
8c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c                "\
8c10: 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65  ", it does not e
8c20: 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  xist\n"]..      
8c30: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 72 65 74    }..        ret
8c40: 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  urn..      }....
8c50: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
8c60: 67 20 6c 65 6e 67 74 68 20 24 6e 65 77 46 69 6c  g length $newFil
8c70: 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e  eName] > 0} then
8c80: 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
8c90: 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b  targetFileName [
8ca0: 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
8cb0: 65 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65 20 24  e $newFileName $
8cc0: 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20  platform]..     
8cd0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
8ce0: 20 20 20 73 65 74 20 74 61 72 67 65 74 46 69 6c     set targetFil
8cf0: 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79  eName [getBinary
8d00: 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61  FileName $fileNa
8d10: 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20  me $platform].. 
8d20: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
8d30: 73 65 74 20 74 61 72 67 65 74 44 69 72 65 63 74  set targetDirect
8d40: 6f 72 79 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  ory [file dirnam
8d50: 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d  e $targetFileNam
8d60: 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  e]....      if {
8d70: 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
8d80: 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69    if {![file exi
8d90: 73 74 73 20 24 74 61 72 67 65 74 44 69 72 65 63  sts $targetDirec
8da0: 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  tory]} then {.. 
8db0: 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 6d 6b           file mk
8dc0: 64 69 72 20 24 74 61 72 67 65 74 44 69 72 65 63  dir $targetDirec
8dd0: 74 6f 72 79 0d 0a 20 20 20 20 20 20 20 20 7d 0d  tory..        }.
8de0: 0a 20 20 20 20 20 20 20 20 66 69 6c 65 20 63 6f  .        file co
8df0: 70 79 20 2d 66 6f 72 63 65 20 24 73 6f 75 72 63  py -force $sourc
8e00: 65 46 69 6c 65 4e 61 6d 65 20 24 74 61 72 67 65  eFileName $targe
8e10: 74 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  tFileName..     
8e20: 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b   }] == 0} then {
8e30: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
8e40: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
8e50: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
8e60: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
8e70: 20 63 6f 70 69 65 64 20 62 75 69 6c 64 20 66 69   copied build fi
8e80: 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75  le from \"" $sou
8e90: 72 63 65 46 69 6c 65 4e 61 6d 65 20 22 5c 22 20  rceFileName "\" 
8ea0: 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  to \"" \..      
8eb0: 20 20 20 20 20 20 24 74 61 72 67 65 74 46 69 6c        $targetFil
8ec0: 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  eName \"\n]..   
8ed0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
8ee0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
8ef0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
8f00: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
8f10: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c        "---- fail
8f20: 65 64 20 74 6f 20 63 6f 70 79 20 62 75 69 6c 64  ed to copy build
8f30: 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24   file from \"" $
8f40: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c  sourceFileName \
8f50: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 5c  ..            "\
8f60: 22 20 74 6f 20 5c 22 22 20 24 74 61 72 67 65 74  " to \"" $target
8f70: 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a  FileName \"\n]..
8f80: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
8f90: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79 44  ...    proc tryD
8fa0: 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20  eleteBinaryFile 
8fb0: 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74  { fileName {plat
8fc0: 66 6f 72 6d 20 22 22 7d 20 7b 76 65 72 62 6f 73  form ""} {verbos
8fd0: 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20  e false} } {..  
8fe0: 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65      set fileName
8ff0: 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
9000: 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70  ame $fileName $p
9010: 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20  latform]....    
9020: 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69    if {![file exi
9030: 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20  sts $fileName]} 
9040: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
9050: 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68  if {$verbose} th
9060: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
9070: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
9080: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
9090: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
90a0: 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64     "---- skipped
90b0: 20 64 65 6c 65 74 69 6e 67 20 62 69 6e 61 72 79   deleting binary
90c0: 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e   file \"" $fileN
90d0: 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
90e0: 20 20 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65       "\", it doe
90f0: 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d  s not exist\n"].
9100: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
9110: 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20      return..    
9120: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
9130: 7b 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64 65  {[catch {file de
9140: 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d 5d  lete $fileName}]
9150: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
9160: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
9170: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
9180: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
9190: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 64 65          "---- de
91a0: 6c 65 74 65 64 20 62 69 6e 61 72 79 20 66 69 6c  leted binary fil
91b0: 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20  e \"" $fileName 
91c0: 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65  \"\n]..      } e
91d0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
91e0: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
91f0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
9200: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
9210: 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20  "---- failed to 
9220: 64 65 6c 65 74 65 20 62 69 6e 61 72 79 20 66 69  delete binary fi
9230: 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65  le \"" $fileName
9240: 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d   \"\n]..      }.
9250: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
9260: 72 6f 63 20 74 72 79 44 65 6c 65 74 65 42 75 69  roc tryDeleteBui
9270: 6c 64 46 69 6c 65 20 7b 20 66 69 6c 65 4e 61 6d  ldFile { fileNam
9280: 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20  e {platform ""} 
9290: 7b 76 65 72 62 6f 73 65 20 66 61 6c 73 65 7d 20  {verbose false} 
92a0: 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 66  } {..      set f
92b0: 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c  ileName [getBuil
92c0: 64 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e  dFileName $fileN
92d0: 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a  ame $platform]..
92e0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69  ..      if {![fi
92f0: 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e  le exists $fileN
9300: 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
9310: 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f        if {$verbo
9320: 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  se} then {..    
9330: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
9340: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
9350: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
9360: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
9370: 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20  kipped deleting 
9380: 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22 20 24  build file \"" $
9390: 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20  fileName \..    
93a0: 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69            "\", i
93b0: 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
93c0: 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d  \n"]..        }.
93d0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d  .        return.
93e0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
93f0: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 66 69    if {[catch {fi
9400: 6c 65 20 64 65 6c 65 74 65 20 24 66 69 6c 65 4e  le delete $fileN
9410: 61 6d 65 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ame}] == 0} then
9420: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
9430: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
9440: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
9450: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
9460: 2d 2d 20 64 65 6c 65 74 65 64 20 62 75 69 6c 64  -- deleted build
9470: 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e   file \"" $fileN
9480: 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  ame \"\n]..     
9490: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
94a0: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
94b0: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
94c0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
94d0: 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64      "---- failed
94e0: 20 74 6f 20 64 65 6c 65 74 65 20 62 75 69 6c 64   to delete build
94f0: 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e   file \"" $fileN
9500: 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  ame \"\n]..     
9510: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
9520: 20 20 70 72 6f 63 20 74 72 79 43 6f 70 79 41 73    proc tryCopyAs
9530: 73 65 6d 62 6c 79 20 7b 0d 0a 20 20 20 20 20 20  sembly {..      
9540: 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65 20 7b        fileName {
9550: 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 70 64  platform ""} {pd
9560: 62 20 74 72 75 65 7d 20 7b 76 65 72 62 6f 73 65  b true} {verbose
9570: 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20   false} } {..   
9580: 20 20 20 74 72 79 43 6f 70 79 42 75 69 6c 64 46     tryCopyBuildF
9590: 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70  ile $fileName $p
95a0: 6c 61 74 66 6f 72 6d 20 22 22 20 24 76 65 72 62  latform "" $verb
95b0: 6f 73 65 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  ose....      if 
95c0: 7b 24 70 64 62 7d 20 74 68 65 6e 20 7b 0d 0a 20  {$pdb} then {.. 
95d0: 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 42 75         tryCopyBu
95e0: 69 6c 64 46 69 6c 65 20 5b 61 70 70 65 6e 64 41  ildFile [appendA
95f0: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
9600: 20 20 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d     [file rootnam
9610: 65 20 24 66 69 6c 65 4e 61 6d 65 5d 20 2e 70 64  e $fileName] .pd
9620: 62 5d 20 24 70 6c 61 74 66 6f 72 6d 20 22 22 20  b] $platform "" 
9630: 24 76 65 72 62 6f 73 65 0d 0a 20 20 20 20 20 20  $verbose..      
9640: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
9650: 20 70 72 6f 63 20 74 72 79 44 65 6c 65 74 65 41   proc tryDeleteA
9660: 73 73 65 6d 62 6c 79 20 7b 0d 0a 20 20 20 20 20  ssembly {..     
9670: 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65 20         fileName 
9680: 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 70  {platform ""} {p
9690: 64 62 20 74 72 75 65 7d 20 7b 76 65 72 62 6f 73  db true} {verbos
96a0: 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20  e false} } {..  
96b0: 20 20 20 20 74 72 79 44 65 6c 65 74 65 42 69 6e      tryDeleteBin
96c0: 61 72 79 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d  aryFile $fileNam
96d0: 65 20 24 70 6c 61 74 66 6f 72 6d 20 24 76 65 72  e $platform $ver
96e0: 62 6f 73 65 0d 0a 0d 0a 20 20 20 20 20 20 69 66  bose....      if
96f0: 20 7b 24 70 64 62 7d 20 74 68 65 6e 20 7b 0d 0a   {$pdb} then {..
9700: 20 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74          tryDelet
9710: 65 42 69 6e 61 72 79 46 69 6c 65 20 5b 61 70 70  eBinaryFile [app
9720: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
9730: 20 20 20 20 20 20 20 5b 66 69 6c 65 20 72 6f 6f         [file roo
9740: 74 6e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d  tname $fileName]
9750: 20 2e 70 64 62 5d 20 24 70 6c 61 74 66 6f 72 6d   .pdb] $platform
9760: 20 24 76 65 72 62 6f 73 65 0d 0a 20 20 20 20 20   $verbose..     
9770: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
9780: 20 20 70 72 6f 63 20 74 72 79 4c 6f 61 64 41 73    proc tryLoadAs
9790: 73 65 6d 62 6c 79 20 7b 20 66 69 6c 65 4e 61 6d  sembly { fileNam
97a0: 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20  e {platform ""} 
97b0: 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 66  } {..      set f
97c0: 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61  ileName [getBina
97d0: 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  ryFileName $file
97e0: 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d  Name $platform].
97f0: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  ...      if {[ca
9800: 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  tch {..        s
9810: 65 74 20 61 73 73 65 6d 62 6c 79 20 5b 6f 62 6a  et assembly [obj
9820: 65 63 74 20 6c 6f 61 64 20 2d 6c 6f 61 64 74 79  ect load -loadty
9830: 70 65 20 46 69 6c 65 20 2d 61 6c 69 61 73 20 24  pe File -alias $
9840: 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20  fileName]..     
9850: 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b   }] == 0} then {
9860: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
9870: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77       # NOTE: Now
9880: 2c 20 61 64 64 20 74 68 65 20 6e 65 63 65 73 73  , add the necess
9890: 61 72 79 20 74 65 73 74 20 63 6f 6e 73 74 72 61  ary test constra
98a0: 69 6e 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  int...        #.
98b0: 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73  .        addCons
98c0: 74 72 61 69 6e 74 20 5b 66 69 6c 65 20 72 6f 6f  traint [file roo
98d0: 74 6e 61 6d 65 20 5b 66 69 6c 65 20 74 61 69 6c  tname [file tail
98e0: 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 0d 0a   $fileName]]....
98f0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
9900: 20 20 20 23 20 4e 4f 54 45 3a 20 47 72 61 62 20     # NOTE: Grab 
9910: 74 68 65 20 69 6d 61 67 65 20 72 75 6e 74 69 6d  the image runtim
9920: 65 20 76 65 72 73 69 6f 6e 20 66 72 6f 6d 20 74  e version from t
9930: 68 65 20 61 73 73 65 6d 62 6c 79 20 62 65 63 61  he assembly beca
9940: 75 73 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  use..        #  
9950: 20 20 20 20 20 73 65 76 65 72 61 6c 20 74 65 73       several tes
9960: 74 73 20 72 65 6c 79 20 6f 6e 20 69 74 20 68 61  ts rely on it ha
9970: 76 69 6e 67 20 61 20 63 65 72 74 61 69 6e 20 76  ving a certain v
9980: 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  alue...        #
9990: 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
99a0: 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
99b0: 72 67 73 20 5b 66 69 6c 65 20 74 61 69 6c 20 24  rgs [file tail $
99c0: 66 69 6c 65 4e 61 6d 65 5d 20 5f 20 5c 0d 0a 20  fileName] _ \.. 
99d0: 20 20 20 20 20 20 20 20 20 20 20 5b 24 61 73 73             [$ass
99e0: 65 6d 62 6c 79 20 49 6d 61 67 65 52 75 6e 74 69  embly ImageRunti
99f0: 6d 65 56 65 72 73 69 6f 6e 5d 5d 0d 0a 0d 0a 20  meVersion]].... 
9a00: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
9a10: 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e    # NOTE: Return
9a20: 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 20 6f   the full path o
9a30: 66 20 74 68 65 20 6c 6f 61 64 65 64 20 66 69 6c  f the loaded fil
9a40: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
9a50: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 66         return $f
9a60: 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d  ileName..      }
9a70: 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ....      return
9a80: 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20   ""..    }..... 
9a90: 20 20 20 70 72 6f 63 20 69 73 53 51 4c 69 74 65     proc isSQLite
9aa0: 52 65 61 64 79 20 7b 7d 20 7b 0d 0a 20 20 20 20  Ready {} {..    
9ab0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
9ac0: 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72  E: This procedur
9ad0: 65 20 6d 75 73 74 20 72 65 74 75 72 6e 20 6e 6f  e must return no
9ae0: 6e 2d 7a 65 72 6f 20 6f 6e 6c 79 20 69 66 20 74  n-zero only if t
9af0: 68 65 20 53 51 4c 69 74 65 20 6e 61 74 69 76 65  he SQLite native
9b00: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
9b10: 6c 69 62 72 61 72 79 20 61 6e 64 20 74 68 65 20  library and the 
9b20: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
9b30: 74 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d  te managed assem
9b40: 62 6c 79 20 61 72 65 20 6c 6f 61 64 65 64 0d 0a  bly are loaded..
9b50: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6e        #       an
9b60: 64 20 72 65 61 64 79 20 66 6f 72 20 75 73 65 20  d ready for use 
9b70: 62 79 20 74 68 65 20 74 65 73 74 20 73 75 69 74  by the test suit
9b80: 65 2e 20 20 43 75 72 72 65 6e 74 6c 79 2c 20 74  e.  Currently, t
9b90: 68 69 73 20 70 72 6f 63 65 64 75 72 65 0d 0a 20  his procedure.. 
9ba0: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 68 6f       #       sho
9bb0: 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  uld be called on
9bc0: 6c 79 20 61 66 74 65 72 20 74 68 65 20 5b 74 72  ly after the [tr
9bd0: 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 5d 20 70  yLoadAssembly] p
9be0: 72 6f 63 65 64 75 72 65 20 68 61 73 0d 0a 20 20  rocedure has..  
9bf0: 20 20 20 20 23 20 20 20 20 20 20 20 62 65 65 6e      #       been
9c00: 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 62 65   called to probe
9c10: 20 66 6f 72 20 74 68 65 20 53 79 73 74 65 6d 2e   for the System.
9c20: 44 61 74 61 2e 53 51 4c 69 74 65 20 6d 61 6e 61  Data.SQLite mana
9c30: 67 65 64 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20  ged assembly..  
9c40: 20 20 20 20 23 20 20 20 20 20 20 20 61 6e 64 20      #       and 
9c50: 74 68 65 20 5b 63 68 65 63 6b 46 6f 72 53 51 4c  the [checkForSQL
9c60: 69 74 65 5d 20 70 72 6f 63 65 64 75 72 65 20 68  ite] procedure h
9c70: 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74  as been called t
9c80: 6f 20 70 72 6f 62 65 20 66 6f 72 0d 0a 20 20 20  o probe for..   
9c90: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 53     #       the S
9ca0: 51 4c 69 74 65 20 6e 61 74 69 76 65 20 6c 69 62  QLite native lib
9cb0: 72 61 72 79 3b 20 6f 74 68 65 72 77 69 73 65 2c  rary; otherwise,
9cc0: 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   this procedure 
9cd0: 77 69 6c 6c 20 73 69 6d 70 6c 79 0d 0a 20 20 20  will simply..   
9ce0: 20 20 20 23 20 20 20 20 20 20 20 61 6c 77 61 79     #       alway
9cf0: 73 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e 0d 0a  s return zero...
9d00: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72        #..      r
9d10: 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 0d 0a 20  eturn [expr {.. 
9d20: 20 20 20 20 20 20 20 5b 68 61 76 65 43 6f 6e 73         [haveCons
9d30: 74 72 61 69 6e 74 20 53 79 73 74 65 6d 2e 44 61  traint System.Da
9d40: 74 61 2e 53 51 4c 69 74 65 5d 20 26 26 20 5b 68  ta.SQLite] && [h
9d50: 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 53 51  aveConstraint SQ
9d60: 4c 69 74 65 5d 0d 0a 20 20 20 20 20 20 7d 5d 0d  Lite]..      }].
9d70: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
9d80: 72 6f 63 20 6d 61 74 63 68 4d 61 63 68 69 6e 65  roc matchMachine
9d90: 20 7b 20 70 6c 61 74 66 6f 72 6d 20 7d 20 7b 0d   { platform } {.
9da0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
9db0: 23 20 4e 4f 54 45 3a 20 41 6e 20 65 6d 70 74 79  # NOTE: An empty
9dc0: 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65 20   string for the 
9dd0: 70 6c 61 74 66 6f 72 6d 20 6d 65 61 6e 73 20 74  platform means t
9de0: 68 61 74 20 74 68 65 20 62 75 69 6c 64 20 69 73  hat the build is
9df0: 20 6e 6f 74 0d 0a 20 20 20 20 20 20 23 20 20 20   not..      #   
9e00: 20 20 20 20 5b 70 72 69 6d 61 72 69 6c 79 5d 20      [primarily] 
9e10: 61 20 6e 61 74 69 76 65 20 62 75 69 6c 64 3b 20  a native build; 
9e20: 74 68 65 72 65 66 6f 72 65 2c 20 69 74 20 61 6c  therefore, it al
9e30: 77 61 79 73 20 6d 61 74 63 68 65 73 2e 0d 0a 20  ways matches... 
9e40: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
9e50: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
9e60: 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3d 3d 20 30   $platform] == 0
9e70: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
9e80: 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20    return true.. 
9e90: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
9ea0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
9eb0: 20 44 6f 65 73 20 74 68 65 20 73 70 65 63 69 66   Does the specif
9ec0: 69 65 64 20 70 6c 61 74 66 6f 72 6d 20 6d 61 74  ied platform mat
9ed0: 63 68 20 75 70 20 74 6f 20 74 68 65 20 63 75 72  ch up to the cur
9ee0: 72 65 6e 74 20 70 72 6f 63 65 73 73 3f 0d 0a 20  rent process?.. 
9ef0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
9f00: 20 7b 24 70 6c 61 74 66 6f 72 6d 20 65 71 20 5b   {$platform eq [
9f10: 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72  machineToPlatfor
9f20: 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72  m $::tcl_platfor
9f30: 6d 28 6d 61 63 68 69 6e 65 29 5d 7d 20 74 68 65  m(machine)]} the
9f40: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  n {..        ret
9f50: 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
9f60: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
9f70: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
9f80: 73 70 65 63 69 66 69 65 64 20 70 6c 61 74 66 6f  specified platfo
9f90: 72 6d 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  rm does not matc
9fa0: 68 20 75 70 20 77 69 74 68 20 74 68 65 20 70 6c  h up with the pl
9fb0: 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 23 20  atform..      # 
9fc0: 20 20 20 20 20 20 66 6f 72 20 74 68 65 20 63 75        for the cu
9fd0: 72 72 65 6e 74 20 70 72 6f 63 65 73 73 2e 0d 0a  rrent process...
9fe0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72        #..      r
9ff0: 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20  eturn false..   
a000: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
a010: 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 42 75  checkForSQLiteBu
a020: 69 6c 64 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b  ilds { channel {
a030: 73 65 6c 65 63 74 20 66 61 6c 73 65 7d 20 7d 20  select false} } 
a040: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
a050: 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
a060: 66 6f 72 20 65 76 65 72 79 20 70 6f 73 73 69 62  for every possib
a070: 6c 65 20 76 61 6c 69 64 20 63 6f 6d 62 69 6e 61  le valid combina
a080: 74 69 6f 6e 20 6f 66 20 76 61 6c 75 65 73 20 75  tion of values u
a090: 73 65 64 20 77 68 65 6e 0d 0a 20 20 20 20 20 20  sed when..      
a0a0: 23 20 20 20 20 20 20 20 6c 6f 63 61 74 69 6e 67  #       locating
a0b0: 20 6f 75 74 20 74 68 65 20 62 75 69 6c 64 20 6f   out the build o
a0c0: 75 74 70 75 74 20 64 69 72 65 63 74 6f 72 79 2c  utput directory,
a0d0: 20 73 68 6f 77 69 6e 67 20 65 61 63 68 20 61 76   showing each av
a0e0: 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20 23  ailable..      #
a0f0: 20 20 20 20 20 20 20 62 75 69 6c 64 20 76 61 72         build var
a100: 69 61 74 69 6f 6e 20 61 6c 6f 6e 67 20 74 68 65  iation along the
a110: 20 77 61 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a   way...      #..
a120: 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 6e 61        foreach na
a130: 74 69 76 65 20 5b 6c 69 73 74 20 66 61 6c 73 65  tive [list false
a140: 20 74 72 75 65 5d 20 7b 0d 0a 20 20 20 20 20 20   true] {..      
a150: 20 20 66 6f 72 65 61 63 68 20 79 65 61 72 20 5b    foreach year [
a160: 67 65 74 42 75 69 6c 64 59 65 61 72 73 5d 20 7b  getBuildYears] {
a170: 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65  ..          fore
a180: 61 63 68 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ach configuratio
a190: 6e 20 5b 67 65 74 42 75 69 6c 64 43 6f 6e 66 69  n [getBuildConfi
a1a0: 67 75 72 61 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20  gurations] {..  
a1b0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
a1c0: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
a1d0: 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
a1e0: 65 66 66 65 63 74 69 76 65 20 62 75 69 6c 64 20  effective build 
a1f0: 70 6c 61 74 66 6f 72 6d 2e 20 20 54 68 69 73 20  platform.  This 
a200: 69 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  is..            
a210: 23 20 20 20 20 20 20 20 62 61 73 65 64 20 6f 6e  #       based on
a220: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
a230: 61 20 5b 70 72 69 6d 61 72 69 6c 79 5d 20 6e 61  a [primarily] na
a240: 74 69 76 65 20 62 75 69 6c 64 0d 0a 20 20 20 20  tive build..    
a250: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
a260: 69 73 20 62 65 69 6e 67 20 75 73 65 64 2e 20 20  is being used.  
a270: 46 6f 72 20 5b 70 72 69 6d 61 72 69 6c 79 5d 20  For [primarily] 
a280: 6e 6f 6e 2d 6e 61 74 69 76 65 20 62 75 69 6c 64  non-native build
a290: 73 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  s,..            
a2a0: 23 20 20 20 20 20 20 20 74 68 69 73 20 77 69 6c  #       this wil
a2b0: 6c 20 62 65 20 61 6e 20 65 6d 70 74 79 20 73 74  l be an empty st
a2c0: 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 20  ring...         
a2d0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
a2e0: 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 5b    set platform [
a2f0: 67 65 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d  getBuildPlatform
a300: 20 24 6e 61 74 69 76 65 5d 0d 0a 0d 0a 20 20 20   $native]....   
a310: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
a320: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
a330: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
a340: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65         "---- che
a350: 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d  cking for System
a360: 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75 69  .Data.SQLite bui
a370: 6c 64 20 5c 22 22 20 5b 65 78 70 72 20 5c 0d 0a  ld \"" [expr \..
a380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a390: 7b 24 6e 61 74 69 76 65 20 3f 20 22 6e 61 74 69  {$native ? "nati
a3a0: 76 65 2f 22 20 3a 20 22 22 7d 5d 20 5b 65 78 70  ve/" : ""}] [exp
a3b0: 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  r {[string lengt
a3c0: 68 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h \..           
a3d0: 20 20 20 20 20 24 70 6c 61 74 66 6f 72 6d 5d 20       $platform] 
a3e0: 3e 20 30 20 3f 20 5b 61 70 70 65 6e 64 41 72 67  > 0 ? [appendArg
a3f0: 73 20 24 70 6c 61 74 66 6f 72 6d 20 2f 5d 20 3a  s $platform /] :
a400: 20 22 22 7d 5d 20 24 79 65 61 72 20 5c 0d 0a 20   ""}] $year \.. 
a410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a420: 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20   $configuration 
a430: 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20  "\"... "]....   
a440: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
a450: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
a460: 42 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 79 20  Build the fully 
a470: 71 75 61 6c 69 66 69 65 64 20 64 69 72 65 63 74  qualified direct
a480: 6f 72 79 20 77 68 65 72 65 20 74 68 65 20 6e 65  ory where the ne
a490: 63 65 73 73 61 72 79 0d 0a 20 20 20 20 20 20 20  cessary..       
a4a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6d       #       com
a4b0: 70 6f 6e 65 6e 74 73 20 66 6f 72 20 53 79 73 74  ponents for Syst
a4c0: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 73  em.Data.SQLite s
a4d0: 68 6f 75 6c 64 20 62 65 20 66 6f 75 6e 64 2e 0d  hould be found..
a4e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
a4f0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
a500: 64 69 72 65 63 74 6f 72 79 20 5b 6a 6f 69 6e 42  directory [joinB
a510: 75 69 6c 64 44 69 72 65 63 74 6f 72 79 20 24 6e  uildDirectory $n
a520: 61 74 69 76 65 20 5c 0d 0a 20 20 20 20 20 20 20  ative \..       
a530: 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 75 69           [getBui
a540: 6c 64 42 61 73 65 44 69 72 65 63 74 6f 72 79 5d  ldBaseDirectory]
a550: 20 24 79 65 61 72 20 24 70 6c 61 74 66 6f 72 6d   $year $platform
a560: 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d   $configuration]
a570: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
a580: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  #..            #
a590: 20 4e 4f 54 45 3a 20 44 6f 20 74 68 65 20 6e 65   NOTE: Do the ne
a5a0: 63 65 73 73 61 72 79 20 66 69 6c 65 73 20 65 78  cessary files ex
a5b0: 69 73 74 3f 20 20 43 75 72 72 65 6e 74 6c 79 2c  ist?  Currently,
a5c0: 20 6e 6f 20 6f 74 68 65 72 20 73 74 65 70 73 0d   no other steps.
a5d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20  .            #  
a5e0: 20 20 20 20 20 61 72 65 20 74 61 6b 65 6e 20 74       are taken t
a5f0: 6f 20 76 65 72 69 66 79 20 74 68 69 73 20 62 75  o verify this bu
a600: 69 6c 64 20 69 73 20 61 63 74 75 61 6c 6c 79 20  ild is actually 
a610: 76 69 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20  viable...       
a620: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
a630: 20 20 20 20 69 66 20 7b 5b 69 73 42 75 69 6c 64      if {[isBuild
a640: 41 76 61 69 6c 61 62 6c 65 20 24 6e 61 74 69 76  Available $nativ
a650: 65 20 24 64 69 72 65 63 74 6f 72 79 5d 7d 20 74  e $directory]} t
a660: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
a670: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
a680: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 68        # NOTE: Wh
a690: 65 6e 20 69 6e 20 22 73 65 6c 65 63 74 22 20 6d  en in "select" m
a6a0: 6f 64 65 2c 20 61 75 74 6f 6d 61 74 69 63 61 6c  ode, automatical
a6b0: 6c 79 20 73 65 6c 65 63 74 20 74 68 65 20 66 69  ly select the fi
a6c0: 72 73 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20  rst..           
a6d0: 20 20 20 23 20 20 20 20 20 20 20 61 76 61 69 6c     #       avail
a6e0: 61 62 6c 65 20 62 75 69 6c 64 20 6f 66 20 53 79  able build of Sy
a6f0: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
a700: 20 61 6e 64 20 74 68 65 6e 20 72 65 74 75 72 6e   and then return
a710: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a720: 23 20 20 20 20 20 20 20 69 6d 6d 65 64 69 61 74  #       immediat
a730: 65 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ely...          
a740: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
a750: 20 20 20 20 20 69 66 20 7b 24 73 65 6c 65 63 74       if {$select
a760: 20 26 26 20 5b 6d 61 74 63 68 4d 61 63 68 69 6e   && [matchMachin
a770: 65 20 24 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68  e $platform]} th
a780: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
a790: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
a7a0: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
a7b0: 20 4d 61 6e 75 61 6c 6c 79 20 6f 76 65 72 72 69   Manually overri
a7c0: 64 65 20 61 6c 6c 20 74 68 65 20 62 75 69 6c 64  de all the build
a7d0: 20 64 69 72 65 63 74 6f 72 79 20 73 65 6c 65 63   directory selec
a7e0: 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  tion..          
a7f0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65        #       re
a800: 6c 61 74 65 64 20 74 65 73 74 20 73 65 74 74 69  lated test setti
a810: 6e 67 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ngs in order to 
a820: 66 6f 72 63 65 20 74 68 69 73 20 62 75 69 6c 64  force this build
a830: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a840: 20 20 23 20 20 20 20 20 20 20 6f 66 20 53 79 73    #       of Sys
a850: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
a860: 74 6f 20 62 65 20 75 73 65 64 2e 0d 0a 20 20 20  to be used...   
a870: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
a880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a890: 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49 6e  object invoke In
a8a0: 74 65 72 70 72 65 74 65 72 2e 47 65 74 41 63 74  terpreter.GetAct
a8b0: 69 76 65 20 5b 65 78 70 72 20 7b 24 6e 61 74 69  ive [expr {$nati
a8c0: 76 65 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ve ? \..        
a8d0: 20 20 20 20 20 20 20 20 20 20 20 20 22 41 64 64              "Add
a8e0: 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 22 20 3a  RuntimeOption" :
a8f0: 20 22 52 65 6d 6f 76 65 52 75 6e 74 69 6d 65 4f   "RemoveRuntimeO
a900: 70 74 69 6f 6e 22 7d 5d 20 6e 61 74 69 76 65 0d  ption"}] native.
a910: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
a920: 20 20 20 73 65 74 20 3a 3a 74 65 73 74 5f 79 65     set ::test_ye
a930: 61 72 20 24 79 65 61 72 0d 0a 20 20 20 20 20 20  ar $year..      
a940: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a            set ::
a950: 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d 20 24 70  test_platform $p
a960: 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20  latform..       
a970: 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 74           set ::t
a980: 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f  est_configuratio
a990: 6e 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  n $configuration
a9a0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
a9b0: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
a9c0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
a9d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a9e0: 20 20 20 20 20 20 22 79 65 73 2c 20 73 65 6c 65        "yes, sele
a9f0: 63 74 65 64 20 28 22 20 5b 65 78 70 72 20 7b 24  cted (" [expr {$
aa00: 6e 61 74 69 76 65 20 3f 20 22 6e 61 74 69 76 65  native ? "native
aa10: 2f 22 20 3a 20 22 22 7d 5d 20 5c 0d 0a 20 20 20  /" : ""}] \..   
aa20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa30: 20 5b 65 78 70 72 20 7b 5b 73 74 72 69 6e 67 20   [expr {[string 
aa40: 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d  length $platform
aa50: 5d 20 3e 20 30 20 3f 20 5b 61 70 70 65 6e 64 41  ] > 0 ? [appendA
aa60: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
aa70: 20 20 20 20 20 20 20 20 20 20 20 24 70 6c 61 74             $plat
aa80: 66 6f 72 6d 20 2f 5d 20 3a 20 22 22 7d 5d 20 24  form /] : ""}] $
aa90: 79 65 61 72 20 2f 20 24 63 6f 6e 66 69 67 75 72  year / $configur
aaa0: 61 74 69 6f 6e 20 22 29 5c 6e 22 5d 0d 0a 0d 0a  ation ")\n"]....
aab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aac0: 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20  return true..   
aad0: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
aae0: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
aaf0: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
ab00: 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20  nel yes\n..     
ab10: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
ab20: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
ab30: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
ab40: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e  tputs $channel n
ab50: 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  o\n..           
ab60: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
ab70: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
ab80: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74    }....      ret
ab90: 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d  urn false..    }
aba0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68  .....    proc ch
abb0: 65 63 6b 46 6f 72 53 51 4c 69 74 65 52 65 6c 65  eckForSQLiteRele
abc0: 61 73 65 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b  ases { channel {
abd0: 73 65 6c 65 63 74 20 66 61 6c 73 65 7d 20 7d 20  select false} } 
abe0: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
abf0: 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
ac00: 66 6f 72 20 70 61 73 74 20 72 65 6c 65 61 73 65  for past release
ac10: 73 20 6f 66 20 53 79 73 74 65 6d 2e 44 61 74 61  s of System.Data
ac20: 2e 53 51 4c 69 74 65 20 69 6e 20 74 68 65 20 64  .SQLite in the d
ac30: 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20  irectory..      
ac40: 23 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 65  #       containe
ac50: 64 20 69 6e 20 74 68 65 20 22 53 79 73 74 65 6d  d in the "System
ac60: 2e 44 61 74 61 2e 53 51 4c 69 74 65 22 20 65 6e  .Data.SQLite" en
ac70: 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62  vironment variab
ac80: 6c 65 2c 20 69 66 0d 0a 20 20 20 20 20 20 23 20  le, if..      # 
ac90: 20 20 20 20 20 20 70 72 65 73 65 6e 74 2e 0d 0a        present...
aca0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
acb0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
acc0: 3a 3a 65 6e 76 28 53 79 73 74 65 6d 2e 44 61 74  ::env(System.Dat
acd0: 61 2e 53 51 4c 69 74 65 29 5d 20 26 26 20 5c 0d  a.SQLite)] && \.
ace0: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
acf0: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 65 6e 76  ng length $::env
ad00: 28 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  (System.Data.SQL
ad10: 69 74 65 29 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ite)] > 0} then 
ad20: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
ad30: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75        # NOTE: Bu
ad40: 69 6c 64 20 74 68 65 20 66 75 6c 6c 79 20 71 75  ild the fully qu
ad50: 61 6c 69 66 69 65 64 20 64 69 72 65 63 74 6f 72  alified director
ad60: 79 20 77 68 65 72 65 20 74 68 65 20 6e 65 63 65  y where the nece
ad70: 73 73 61 72 79 0d 0a 20 20 20 20 20 20 20 20 23  ssary..        #
ad80: 20 20 20 20 20 20 20 63 6f 6d 70 6f 6e 65 6e 74         component
ad90: 73 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74  s for System.Dat
ada0: 61 2e 53 51 4c 69 74 65 20 73 68 6f 75 6c 64 20  a.SQLite should 
adb0: 62 65 20 66 6f 75 6e 64 2e 0d 0a 20 20 20 20 20  be found...     
adc0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65     #..        se
add0: 74 20 64 69 72 65 63 74 6f 72 79 20 5b 66 69 6c  t directory [fil
ade0: 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69  e nativename [fi
adf0: 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20  le join \..     
ae00: 20 20 20 20 20 20 20 24 3a 3a 65 6e 76 28 53 79         $::env(Sy
ae10: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
ae20: 29 20 5b 67 65 74 52 65 6c 65 61 73 65 56 65 72  ) [getReleaseVer
ae30: 73 69 6f 6e 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20  sion]]]....     
ae40: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
ae50: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
ae60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
ae70: 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
ae80: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
ae90: 74 65 20 72 65 6c 65 61 73 65 20 5c 22 22 20 5c  te release \"" \
aea0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 64  ..            $d
aeb0: 69 72 65 63 74 6f 72 79 20 22 5c 22 2e 2e 2e 20  irectory "\"... 
aec0: 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66  "]....        if
aed0: 20 7b 5b 69 73 52 65 6c 65 61 73 65 41 76 61 69   {[isReleaseAvai
aee0: 6c 61 62 6c 65 20 24 64 69 72 65 63 74 6f 72 79  lable $directory
aef0: 20 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e   platform]} then
af00: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
af10: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
af20: 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3d 3d 20 30   $platform] == 0
af30: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
af40: 20 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f        set platfo
af50: 72 6d 20 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20  rm unknown..    
af60: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
af70: 20 20 20 20 20 69 66 20 7b 24 73 65 6c 65 63 74       if {$select
af80: 20 26 26 20 5b 6d 61 74 63 68 4d 61 63 68 69 6e   && [matchMachin
af90: 65 20 24 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68  e $platform]} th
afa0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
afb0: 20 20 73 65 74 20 3a 3a 62 75 69 6c 64 5f 64 69    set ::build_di
afc0: 72 65 63 74 6f 72 79 20 24 64 69 72 65 63 74 6f  rectory $directo
afd0: 72 79 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  ry....          
afe0: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
aff0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79 65   [appendArgs "ye
b000: 73 2c 20 73 65 6c 65 63 74 65 64 20 28 22 20 24  s, selected (" $
b010: 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d  platform ")\n"].
b020: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ...            r
b030: 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20  eturn true..    
b040: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
b050: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
b060: 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
b070: 6e 64 41 72 67 73 20 22 79 65 73 20 28 22 20 24  ndArgs "yes (" $
b080: 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d  platform ")\n"].
b090: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
b0a0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
b0b0: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
b0c0: 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 0d  $channel no\n...
b0d0: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61  .          forea
b0e0: 63 68 20 70 61 74 68 20 5b 6c 73 6f 72 74 20 2d  ch path [lsort -
b0f0: 64 65 63 72 65 61 73 69 6e 67 20 5b 66 69 6c 65  decreasing [file
b100: 20 6c 69 73 74 20 24 64 69 72 65 63 74 6f 72 79   list $directory
b110: 20 2a 5d 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20   *]] {..        
b120: 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78      if {[file ex
b130: 69 73 74 73 20 24 70 61 74 68 5d 20 26 26 20 5b  ists $path] && [
b140: 66 69 6c 65 20 69 73 64 69 72 65 63 74 6f 72 79  file isdirectory
b150: 20 24 70 61 74 68 5d 7d 20 74 68 65 6e 20 7b 0d   $path]} then {.
b160: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
b170: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
b180: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
b190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
b1a0: 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
b1b0: 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  r System.Data.SQ
b1c0: 4c 69 74 65 20 72 65 6c 65 61 73 65 20 5c 22 22  Lite release \""
b1d0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
b1e0: 20 20 20 20 20 20 24 70 61 74 68 20 22 5c 22 2e        $path "\".
b1f0: 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  .. "]....       
b200: 20 20 20 20 20 20 20 69 66 20 7b 5b 69 73 52 65         if {[isRe
b210: 6c 65 61 73 65 41 76 61 69 6c 61 62 6c 65 20 24  leaseAvailable $
b220: 70 61 74 68 20 70 6c 61 74 66 6f 72 6d 5d 7d 20  path platform]} 
b230: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
b240: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
b250: 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74  ing length $plat
b260: 66 6f 72 6d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  form] == 0} then
b270: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
b280: 20 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f        set platfo
b290: 72 6d 20 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20  rm unknown..    
b2a0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
b2b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b2c0: 20 69 66 20 7b 24 73 65 6c 65 63 74 20 26 26 20   if {$select && 
b2d0: 5b 6d 61 74 63 68 4d 61 63 68 69 6e 65 20 24 70  [matchMachine $p
b2e0: 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b  latform]} then {
b2f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
b300: 20 20 20 20 73 65 74 20 3a 3a 62 75 69 6c 64 5f      set ::build_
b310: 64 69 72 65 63 74 6f 72 79 20 24 70 61 74 68 0d  directory $path.
b320: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
b330: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
b340: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
b350: 22 79 65 73 2c 20 73 65 6c 65 63 74 65 64 20 28  "yes, selected (
b360: 22 20 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e  " $platform ")\n
b370: 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  "]....          
b380: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
b390: 72 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  rue..           
b3a0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
b3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3c0: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
b3d0: 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73  [appendArgs "yes
b3e0: 20 28 22 20 24 70 6c 61 74 66 6f 72 6d 20 22 29   (" $platform ")
b3f0: 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
b400: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
b410: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
b420: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b430: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
b440: 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  no\n..          
b450: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
b460: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
b470: 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
b480: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
b490: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
b4a0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
b4b0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
b4c0: 22 2d 2d 2d 2d 20 65 6e 76 69 72 6f 6e 6d 65 6e  "---- environmen
b4d0: 74 20 76 61 72 69 61 62 6c 65 20 5c 22 53 79 73  t variable \"Sys
b4e0: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 5c  tem.Data.SQLite\
b4f0: 22 20 69 73 20 6e 6f 74 20 22 20 5c 0d 0a 20 20  " is not " \..  
b500: 20 20 20 20 20 20 20 20 20 20 22 73 65 74 2c 20            "set, 
b510: 73 6b 69 70 70 69 6e 67 20 63 68 65 63 6b 20 66  skipping check f
b520: 6f 72 20 72 65 6c 65 61 73 65 73 2e 2e 2e 5c 6e  or releases...\n
b530: 22 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  "]..      }.... 
b540: 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73       return fals
b550: 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  e..    }.....   
b560: 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51   proc checkForSQ
b570: 4c 69 74 65 4c 69 62 72 61 72 79 20 7b 20 63 68  LiteLibrary { ch
b580: 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20  annel } {..     
b590: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
b5a0: 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
b5b0: 6f 72 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c  or SQLite core l
b5c0: 69 62 72 61 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20  ibrary... ".... 
b5d0: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
b5e0: 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63  {..        objec
b5f0: 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
b600: 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
b610: 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
b620: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
b630: 69 74 65 33 20 53 51 4c 69 74 65 56 65 72 73 69  ite3 SQLiteVersi
b640: 6f 6e 0d 0a 20 20 20 20 20 20 7d 20 76 65 72 73  on..      } vers
b650: 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ion] == 0} then 
b660: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
b670: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
b680: 65 63 6b 20 69 66 20 74 68 65 20 72 65 74 75 72  eck if the retur
b690: 6e 65 64 20 76 65 72 73 69 6f 6e 20 77 61 73 20  ned version was 
b6a0: 6e 75 6c 6c 2e 20 20 49 66 20 73 6f 2c 20 6d 61  null.  If so, ma
b6b0: 6b 65 20 69 74 20 65 61 73 79 0d 0a 20 20 20 20  ke it easy..    
b6c0: 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 73      #       to s
b6d0: 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  pot...        #.
b6e0: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74  .        if {[st
b6f0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72  ring length $ver
b700: 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sion] == 0} then
b710: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
b720: 74 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a  t version null..
b730: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
b740: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
b750: 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
b760: 74 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f 73  to query the Fos
b770: 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74  sil source ident
b780: 69 66 69 65 72 20 66 6f 72 20 74 68 65 20 53 51  ifier for the SQ
b790: 4c 69 74 65 0d 0a 20 20 20 20 20 20 20 20 23 20  Lite..        # 
b7a0: 20 20 20 20 20 20 63 6f 72 65 20 6c 69 62 72 61        core libra
b7b0: 72 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ry...        #..
b7c0: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
b7d0: 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
b7e0: 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
b7f0: 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
b800: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
b810: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
b820: 69 74 65 2e 53 51 4c 69 74 65 33 20 53 51 4c 69  ite.SQLite3 SQLi
b830: 74 65 53 6f 75 72 63 65 49 64 0d 0a 20 20 20 20  teSourceId..    
b840: 20 20 20 20 7d 20 73 6f 75 72 63 65 49 64 5d 7d      } sourceId]}
b850: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
b860: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
b870: 23 20 4e 4f 54 45 3a 20 57 65 20 66 61 69 6c 65  # NOTE: We faile
b880: 64 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 46  d to query the F
b890: 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65  ossil source ide
b8a0: 6e 74 69 66 69 65 72 2e 0d 0a 20 20 20 20 20 20  ntifier...      
b8b0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
b8c0: 20 73 65 74 20 73 6f 75 72 63 65 49 64 20 75 6e   set sourceId un
b8d0: 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20 7d  known..        }
b8e0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
b8f0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
b900: 68 65 63 6b 20 69 66 20 74 68 65 20 72 65 74 75  heck if the retu
b910: 72 6e 65 64 20 46 6f 73 73 69 6c 20 73 6f 75 72  rned Fossil sour
b920: 63 65 20 69 64 65 6e 74 69 66 69 65 72 20 77 61  ce identifier wa
b930: 73 20 6e 75 6c 6c 2e 20 20 49 66 0d 0a 20 20 20  s null.  If..   
b940: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6f 2c       #       so,
b950: 20 6d 61 6b 65 20 69 74 20 65 61 73 79 20 74 6f   make it easy to
b960: 20 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20   spot...        
b970: 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  #..        if {[
b980: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73  string length $s
b990: 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74  ourceId] == 0} t
b9a0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
b9b0: 20 73 65 74 20 73 6f 75 72 63 65 49 64 20 6e 75   set sourceId nu
b9c0: 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ll..        }...
b9d0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
b9e0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c      # NOTE: Yes,
b9f0: 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65   the SQLite core
ba00: 20 6c 69 62 72 61 72 79 20 61 70 70 65 61 72 73   library appears
ba10: 20 74 6f 20 62 65 20 61 76 61 69 6c 61 62 6c 65   to be available
ba20: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
ba30: 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
ba40: 69 6e 74 20 53 51 4c 69 74 65 0d 0a 0d 0a 20 20  int SQLite....  
ba50: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
ba60: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
ba70: 20 22 79 65 73 20 28 22 20 24 76 65 72 73 69 6f   "yes (" $versio
ba80: 6e 20 22 20 22 20 24 73 6f 75 72 63 65 49 64 20  n " " $sourceId 
ba90: 22 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 20  ")\n"]..      } 
baa0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
bab0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e  tputs $channel n
bac0: 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  o\n..      }..  
bad0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
bae0: 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 49   checkForSQLiteI
baf0: 6e 74 65 72 6f 70 20 7b 20 63 68 61 6e 6e 65 6c  nterop { channel
bb00: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74   } {..      tput
bb10: 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
bb20: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 51   checking for SQ
bb30: 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73  Lite interop ass
bb40: 65 6d 62 6c 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20  embly... "....  
bb50: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
bb60: 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74  ..        object
bb70: 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
bb80: 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
bb90: 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
bba0: 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69  Data.SQLite.SQLi
bbb0: 74 65 33 20 49 6e 74 65 72 6f 70 56 65 72 73 69  te3 InteropVersi
bbc0: 6f 6e 0d 0a 20 20 20 20 20 20 7d 20 76 65 72 73  on..      } vers
bbd0: 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ion] == 0} then 
bbe0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
bbf0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
bc00: 65 63 6b 20 69 66 20 74 68 65 20 72 65 74 75 72  eck if the retur
bc10: 6e 65 64 20 76 65 72 73 69 6f 6e 20 77 61 73 20  ned version was 
bc20: 6e 75 6c 6c 2e 20 20 49 66 20 73 6f 2c 20 6d 61  null.  If so, ma
bc30: 6b 65 20 69 74 20 65 61 73 79 0d 0a 20 20 20 20  ke it easy..    
bc40: 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 73      #       to s
bc50: 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  pot...        #.
bc60: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74  .        if {[st
bc70: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72  ring length $ver
bc80: 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sion] == 0} then
bc90: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
bca0: 74 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a  t version null..
bcb0: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
bcc0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
bcd0: 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
bce0: 74 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f 73  to query the Fos
bcf0: 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74  sil source ident
bd00: 69 66 69 65 72 20 66 6f 72 20 74 68 65 20 53 51  ifier for the SQ
bd10: 4c 69 74 65 0d 0a 20 20 20 20 20 20 20 20 23 20  Lite..        # 
bd20: 20 20 20 20 20 20 63 6f 72 65 20 6c 69 62 72 61        core libra
bd30: 72 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ry...        #..
bd40: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
bd50: 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
bd60: 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
bd70: 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
bd80: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
bd90: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
bda0: 69 74 65 2e 53 51 4c 69 74 65 33 20 49 6e 74 65  ite.SQLite3 Inte
bdb0: 72 6f 70 53 6f 75 72 63 65 49 64 0d 0a 20 20 20  ropSourceId..   
bdc0: 20 20 20 20 20 7d 20 73 6f 75 72 63 65 49 64 5d       } sourceId]
bdd0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
bde0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
bdf0: 20 23 20 4e 4f 54 45 3a 20 57 65 20 66 61 69 6c   # NOTE: We fail
be00: 65 64 20 74 6f 20 71 75 65 72 79 20 74 68 65 20  ed to query the 
be10: 46 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64  Fossil source id
be20: 65 6e 74 69 66 69 65 72 2e 0d 0a 20 20 20 20 20  entifier...     
be30: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
be40: 20 20 73 65 74 20 73 6f 75 72 63 65 49 64 20 75    set sourceId u
be50: 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20  nknown..        
be60: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  }....        #..
be70: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
be80: 43 68 65 63 6b 20 69 66 20 74 68 65 20 72 65 74  Check if the ret
be90: 75 72 6e 65 64 20 46 6f 73 73 69 6c 20 73 6f 75  urned Fossil sou
bea0: 72 63 65 20 69 64 65 6e 74 69 66 69 65 72 20 77  rce identifier w
beb0: 61 73 20 6e 75 6c 6c 2e 20 20 49 66 0d 0a 20 20  as null.  If..  
bec0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6f        #       so
bed0: 2c 20 6d 61 6b 65 20 69 74 20 65 61 73 79 20 74  , make it easy t
bee0: 6f 20 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20  o spot...       
bef0: 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
bf00: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
bf10: 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20  sourceId] == 0} 
bf20: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
bf30: 20 20 73 65 74 20 73 6f 75 72 63 65 49 64 20 6e    set sourceId n
bf40: 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ull..        }..
bf50: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
bf60: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73       # NOTE: Yes
bf70: 2c 20 74 68 65 20 53 51 4c 69 74 65 20 69 6e 74  , the SQLite int
bf80: 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 61 70  erop assembly ap
bf90: 70 65 61 72 73 20 74 6f 20 62 65 20 61 76 61 69  pears to be avai
bfa0: 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  lable...        
bfb0: 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  #..        addCo
bfc0: 6e 73 74 72 61 69 6e 74 20 53 51 4c 69 74 65 49  nstraint SQLiteI
bfd0: 6e 74 65 72 6f 70 0d 0a 0d 0a 20 20 20 20 20 20  nterop....      
bfe0: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
bff0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79 65   [appendArgs "ye
c000: 73 20 28 22 20 24 76 65 72 73 69 6f 6e 20 22 20  s (" $version " 
c010: 22 20 24 73 6f 75 72 63 65 49 64 20 22 29 5c 6e  " $sourceId ")\n
c020: 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  "]..      } else
c030: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
c040: 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d  s $channel no\n.
c050: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
c060: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65  ....    proc che
c070: 63 6b 46 6f 72 53 51 4c 69 74 65 44 65 66 69 6e  ckForSQLiteDefin
c080: 65 43 6f 6e 73 74 61 6e 74 20 7b 20 63 68 61 6e  eConstant { chan
c090: 6e 65 6c 20 6e 61 6d 65 20 7d 20 7b 0d 0a 20 20  nel name } {..  
c0a0: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
c0b0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
c0c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d  ..          "---
c0d0: 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53  - checking for S
c0e0: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
c0f0: 65 20 64 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e  e define constan
c100: 74 20 5c 22 22 20 24 6e 61 6d 65 20 5c 0d 0a 20  t \"" $name \.. 
c110: 20 20 20 20 20 20 20 20 20 22 5c 22 2e 2e 2e 20           "\"... 
c120: 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  "]....      if {
c130: 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
c140: 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
c150: 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
c160: 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
c170: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
c180: 69 74 65 2e 53 51 4c 69 74 65 33 20 44 65 66 69  ite.SQLite3 Defi
c190: 6e 65 43 6f 6e 73 74 61 6e 74 73 0d 0a 20 20 20  neConstants..   
c1a0: 20 20 20 7d 20 64 65 66 69 6e 65 43 6f 6e 73 74     } defineConst
c1b0: 61 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ants] == 0} then
c1c0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
c1d0: 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74 20  [lsearch -exact 
c1e0: 2d 6e 6f 63 61 73 65 20 24 64 65 66 69 6e 65 43  -nocase $defineC
c1f0: 6f 6e 73 74 61 6e 74 73 20 24 6e 61 6d 65 5d 20  onstants $name] 
c200: 21 3d 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a 20  != -1} then {.. 
c210: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
c220: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65        # NOTE: Ye
c230: 73 2c 20 74 68 69 73 20 64 65 66 69 6e 65 20 63  s, this define c
c240: 6f 6e 73 74 61 6e 74 20 77 61 73 20 65 6e 61 62  onstant was enab
c250: 6c 65 64 20 77 68 65 6e 20 74 68 65 20 6d 61 6e  led when the man
c260: 61 67 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20  aged..          
c270: 23 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79  #       assembly
c280: 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 2e 0d 0a   was compiled...
c290: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
c2a0: 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
c2b0: 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
c2c0: 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 2e   defineConstant.
c2d0: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
c2e0: 74 65 2e 20 24 6e 61 6d 65 5d 0d 0a 0d 0a 20 20  te. $name]....  
c2f0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
c300: 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20  hannel yes\n..  
c310: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
c320: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
c330: 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20  $channel no\n.. 
c340: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
c350: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
c360: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
c370: 20 65 72 72 6f 72 5c 6e 0d 0a 20 20 20 20 20 20   error\n..      
c380: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
c390: 20 70 72 6f 63 20 67 65 74 44 61 74 65 54 69 6d   proc getDateTim
c3a0: 65 46 6f 72 6d 61 74 20 7b 7d 20 7b 0d 0a 20 20  eFormat {} {..  
c3b0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
c3c0: 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64  OTE: This proced
c3d0: 75 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72  ure simply retur
c3e0: 6e 73 20 74 68 65 20 22 64 65 66 61 75 6c 74 22  ns the "default"
c3f0: 20 44 61 74 65 54 69 6d 65 20 66 6f 72 6d 61 74   DateTime format
c400: 20 75 73 65 64 0d 0a 20 20 20 20 20 20 23 20 20   used..      #  
c410: 20 20 20 20 20 62 79 20 74 68 65 20 74 65 73 74       by the test
c420: 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 23   suite...      #
c430: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
c440: 6f 20 65 78 69 73 74 73 20 3a 3a 64 61 74 65 74  o exists ::datet
c450: 69 6d 65 5f 66 6f 72 6d 61 74 5d 20 26 26 20 5c  ime_format] && \
c460: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
c470: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 64 61  ing length $::da
c480: 74 65 74 69 6d 65 5f 66 6f 72 6d 61 74 5d 20 3e  tetime_format] >
c490: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
c4a0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
c4b0: 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68   NOTE: Return th
c4c0: 65 20 6d 61 6e 75 61 6c 6c 79 20 6f 76 65 72 72  e manually overr
c4d0: 69 64 64 65 6e 20 76 61 6c 75 65 20 66 6f 72 20  idden value for 
c4e0: 74 68 65 20 44 61 74 65 54 69 6d 65 20 66 6f 72  the DateTime for
c4f0: 6d 61 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  mat...        #.
c500: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
c510: 24 3a 3a 64 61 74 65 74 69 6d 65 5f 66 6f 72 6d  $::datetime_form
c520: 61 74 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  at..      } else
c530: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
c540: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52         # NOTE: R
c550: 65 74 75 72 6e 20 61 6e 20 49 53 4f 38 36 30 31  eturn an ISO8601
c560: 20 44 61 74 65 54 69 6d 65 20 66 6f 72 6d 61 74   DateTime format
c570: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
c580: 20 53 51 4c 69 74 65 2c 0d 0a 20 20 20 20 20 20   SQLite,..      
c590: 20 20 23 20 20 20 20 20 20 20 53 79 73 74 65 6d    #       System
c5a0: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2c 20 61 6e  .Data.SQLite, an
c5b0: 64 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 72  d suitable for r
c5c0: 6f 75 6e 64 2d 74 72 69 70 70 69 6e 67 20 77 69  ound-tripping wi
c5d0: 74 68 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  th the..        
c5e0: 23 20 20 20 20 20 20 20 44 61 74 65 54 69 6d 65  #       DateTime
c5f0: 20 63 6c 61 73 73 20 6f 66 20 74 68 65 20 66 72   class of the fr
c600: 61 6d 65 77 6f 72 6b 2e 20 20 49 66 20 74 68 69  amework.  If thi
c610: 73 20 76 61 6c 75 65 20 69 73 20 63 68 61 6e 67  s value is chang
c620: 65 64 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ed,..        #  
c630: 20 20 20 20 20 76 61 72 69 6f 75 73 20 74 65 73       various tes
c640: 74 73 20 6d 61 79 20 66 61 69 6c 2e 0d 0a 20 20  ts may fail...  
c650: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
c660: 20 72 65 74 75 72 6e 20 22 79 79 79 79 2d 4d 4d   return "yyyy-MM
c670: 2d 64 64 20 48 48 3a 6d 6d 3a 73 73 2e 46 46 46  -dd HH:mm:ss.FFF
c680: 46 46 46 46 4b 22 0d 0a 20 20 20 20 20 20 7d 0d  FFFFK"..      }.
c690: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
c6a0: 72 6f 63 20 65 6e 75 6d 65 72 61 62 6c 65 54 6f  roc enumerableTo
c6b0: 4c 69 73 74 20 7b 20 65 6e 75 6d 65 72 61 62 6c  List { enumerabl
c6c0: 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  e } {..      set
c6d0: 20 72 65 73 75 6c 74 20 5b 6c 69 73 74 5d 0d 0a   result [list]..
c6e0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
c6f0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 65 6e 75 6d  ing length $enum
c700: 65 72 61 62 6c 65 5d 20 3d 3d 20 30 20 7c 7c 20  erable] == 0 || 
c710: 24 65 6e 75 6d 65 72 61 62 6c 65 20 65 71 20 22  $enumerable eq "
c720: 6e 75 6c 6c 22 7d 20 74 68 65 6e 20 7b 0d 0a 20  null"} then {.. 
c730: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72         return $r
c740: 65 73 75 6c 74 0d 0a 20 20 20 20 20 20 7d 0d 0a  esult..      }..
c750: 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66  ..      object f
c760: 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20 69 74  oreach -alias it
c770: 65 6d 20 24 65 6e 75 6d 65 72 61 62 6c 65 20 7b  em $enumerable {
c780: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73  ..        if {[s
c790: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 69 74  tring length $it
c7a0: 65 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  em] > 0} then {.
c7b0: 0a 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65  .          lappe
c7c0: 6e 64 20 72 65 73 75 6c 74 20 5b 24 69 74 65 6d  nd result [$item
c7d0: 20 54 6f 53 74 72 69 6e 67 5d 0d 0a 20 20 20 20   ToString]..    
c7e0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
c7f0: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24  ..      return $
c800: 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c  result..    }...
c810: 0d 0a 20 20 20 20 70 72 6f 63 20 63 61 74 63 68  ..    proc catch
c820: 41 6e 64 52 65 74 75 72 6e 20 7b 20 73 63 72 69  AndReturn { scri
c830: 70 74 20 7b 73 74 61 63 6b 54 72 61 63 65 20 66  pt {stackTrace f
c840: 61 6c 73 65 7d 20 7b 73 74 72 69 63 74 20 74 72  alse} {strict tr
c850: 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ue} } {..      #
c860: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
c870: 45 76 61 6c 75 61 74 65 20 74 68 65 20 73 63 72  Evaluate the scr
c880: 69 70 74 20 70 72 6f 76 69 64 65 64 20 62 79 20  ipt provided by 
c890: 6f 75 72 20 63 61 6c 6c 65 72 20 69 6e 20 74 68  our caller in th
c8a0: 65 69 72 20 63 6f 6e 74 65 78 74 2c 0d 0a 20 20  eir context,..  
c8b0: 20 20 20 20 23 20 20 20 20 20 20 20 63 61 70 74      #       capt
c8c0: 75 72 69 6e 67 20 62 6f 74 68 20 74 68 65 20 72  uring both the r
c8d0: 65 73 75 6c 74 20 61 6e 64 20 74 68 65 20 72 65  esult and the re
c8e0: 74 75 72 6e 20 63 6f 64 65 2e 0d 0a 20 20 20 20  turn code...    
c8f0: 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 63    #..      set c
c900: 6f 64 65 20 5b 63 61 74 63 68 20 7b 75 70 6c 65  ode [catch {uple
c910: 76 65 6c 20 31 20 24 73 63 72 69 70 74 7d 20 72  vel 1 $script} r
c920: 65 73 75 6c 74 5d 0d 0a 0d 0a 20 20 20 20 20 20  esult]....      
c930: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
c940: 20 44 69 64 20 74 68 65 20 73 63 72 69 70 74 20   Did the script 
c950: 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20  provided by our 
c960: 63 61 6c 6c 65 72 20 4e 4f 54 20 72 61 69 73 65  caller NOT raise
c970: 20 61 6e 20 65 72 72 6f 72 3f 0d 0a 20 20 20 20   an error?..    
c980: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24    #..      if {$
c990: 73 74 72 69 63 74 20 26 26 20 24 63 6f 64 65 20  strict && $code 
c9a0: 3d 3d 20 30 20 7c 7c 20 21 24 73 74 72 69 63 74  == 0 || !$strict
c9b0: 20 26 26 20 24 63 6f 64 65 20 21 3d 20 31 7d 20   && $code != 1} 
c9c0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
c9d0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
c9e0: 45 3a 20 53 75 63 63 65 73 73 2e 20 20 52 65 74  E: Success.  Ret
c9f0: 75 72 6e 20 61 20 6c 69 73 74 20 77 69 74 68 20  urn a list with 
ca00: 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
ca10: 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 2e 0d  and the result..
ca20: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
ca30: 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74      return [list
ca40: 20 24 63 6f 64 65 20 24 72 65 73 75 6c 74 5d 0d   $code $result].
ca50: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20  .      } elseif 
ca60: 7b 24 73 74 61 63 6b 54 72 61 63 65 7d 20 74 68  {$stackTrace} th
ca70: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
ca80: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
ca90: 20 46 61 69 6c 75 72 65 2e 20 20 4f 75 72 20 63   Failure.  Our c
caa0: 61 6c 6c 65 72 20 77 61 6e 74 73 20 61 20 66 75  aller wants a fu
cab0: 6c 6c 20 73 74 61 63 6b 20 74 72 61 63 65 20 28  ll stack trace (
cac0: 69 66 20 61 70 70 6c 69 63 61 62 6c 65 29 2c 0d  if applicable),.
cad0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
cae0: 20 72 65 74 75 72 6e 20 61 20 6c 69 73 74 20 77   return a list w
caf0: 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 20 63  ith the return c
cb00: 6f 64 65 20 61 6e 64 20 74 68 65 20 72 65 73 75  ode and the resu
cb10: 6c 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20  lt verbatim...  
cb20: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
cb30: 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 24 63   return [list $c
cb40: 6f 64 65 20 24 72 65 73 75 6c 74 5d 0d 0a 20 20  ode $result]..  
cb50: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
cb60: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
cb70: 20 23 20 4e 4f 54 45 3a 20 46 61 69 6c 75 72 65   # NOTE: Failure
cb80: 2e 20 20 4f 75 72 20 63 61 6c 6c 65 72 20 64 6f  .  Our caller do
cb90: 65 73 20 6e 6f 74 20 77 61 6e 74 20 61 20 66 75  es not want a fu
cba0: 6c 6c 20 73 74 61 63 6b 20 74 72 61 63 65 20 28  ll stack trace (
cbb0: 69 66 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  if..        #   
cbc0: 20 20 20 20 61 70 70 6c 69 63 61 62 6c 65 29 2c      applicable),
cbd0: 20 72 65 74 75 72 6e 20 61 20 6c 69 73 74 20 77   return a list w
cbe0: 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 20 63  ith the return c
cbf0: 6f 64 65 2c 20 74 68 65 20 65 72 72 6f 72 0d 0a  ode, the error..
cc00: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
cc10: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69 6e 74  code for the int
cc20: 65 72 70 72 65 74 65 72 2c 20 61 6e 64 20 74 68  erpreter, and th
cc30: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
cc40: 75 70 20 74 6f 20 74 68 65 0d 0a 20 20 20 20 20  up to the..     
cc50: 20 20 20 23 20 20 20 20 20 20 20 70 6f 69 6e 74     #       point
cc60: 20 77 68 65 72 65 20 74 68 65 20 73 74 61 63 6b   where the stack
cc70: 20 74 72 61 63 65 20 73 68 6f 75 6c 64 20 73 74   trace should st
cc80: 61 72 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  art...        #.
cc90: 0a 20 20 20 20 20 20 20 20 73 65 74 20 69 6e 64  .        set ind
cca0: 65 78 20 5b 73 74 72 69 6e 67 20 66 69 72 73 74  ex [string first
ccb0: 20 22 20 20 20 61 74 20 22 20 24 72 65 73 75 6c   "   at " $resul
ccc0: 74 5d 3b 20 23 20 48 41 43 4b 3a 20 52 65 6c 69  t]; # HACK: Reli
ccd0: 61 62 6c 65 3f 0d 0a 0d 0a 20 20 20 20 20 20 20  able?....       
cce0: 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 24 63   return [list $c
ccf0: 6f 64 65 20 24 3a 3a 65 72 72 6f 72 43 6f 64 65  ode $::errorCode
cd00: 20 5b 65 78 70 72 20 7b 24 69 6e 64 65 78 20 21   [expr {$index !
cd10: 3d 20 2d 31 20 3f 20 5c 0d 0a 20 20 20 20 20 20  = -1 ? \..      
cd20: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 74 72        [string tr
cd30: 69 6d 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65  im [string range
cd40: 20 24 72 65 73 75 6c 74 20 30 20 24 69 6e 64 65   $result 0 $inde
cd50: 78 5d 5d 20 3a 20 24 72 65 73 75 6c 74 7d 5d 5d  x]] : $result}]]
cd60: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
cd70: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 6f  .....    proc co
cd80: 6d 70 69 6c 65 43 53 68 61 72 70 57 69 74 68 20  mpileCSharpWith 
cd90: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
cda0: 65 78 74 20 6d 65 6d 6f 72 79 20 73 79 6d 62 6f  ext memory symbo
cdb0: 6c 73 20 73 74 72 69 63 74 20 72 65 73 75 6c 74  ls strict result
cdc0: 73 56 61 72 4e 61 6d 65 20 65 72 72 6f 72 73 56  sVarName errorsV
cdd0: 61 72 4e 61 6d 65 20 66 69 6c 65 4e 61 6d 65 73  arName fileNames
cde0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 72  ..            ar
cdf0: 67 73 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  gs } {..      #.
ce00: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53  .      # NOTE: S
ce10: 69 6e 63 65 20 77 65 20 61 72 65 20 67 6f 69 6e  ince we are goin
ce20: 67 20 74 6f 20 75 73 65 20 74 68 69 73 20 6d 65  g to use this me
ce30: 74 68 6f 64 20 6e 61 6d 65 20 61 20 6c 6f 74 2c  thod name a lot,
ce40: 20 61 73 73 69 67 6e 20 69 74 20 74 6f 20 61 0d   assign it to a.
ce50: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76  .      #       v
ce60: 61 72 69 61 62 6c 65 20 66 69 72 73 74 2e 0d 0a  ariable first...
ce70: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73        #..      s
ce80: 65 74 20 61 64 64 20 52 65 66 65 72 65 6e 63 65  et add Reference
ce90: 64 41 73 73 65 6d 62 6c 69 65 73 2e 41 64 64 0d  dAssemblies.Add.
cea0: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
ceb0: 20 20 23 20 4e 4f 54 45 3a 20 43 72 65 61 74 65    # NOTE: Create
cec0: 20 74 68 65 20 62 61 73 65 20 63 6f 6d 6d 61 6e   the base comman
ced0: 64 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e  d to evaluate an
cee0: 64 20 61 64 64 20 74 68 65 20 70 72 6f 70 65 72  d add the proper
cef0: 74 79 20 73 65 74 74 69 6e 67 73 0d 0a 20 20 20  ty settings..   
cf00: 20 20 20 23 20 20 20 20 20 20 20 74 68 61 74 20     #       that 
cf10: 61 72 65 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79  are almost alway
cf20: 73 20 6e 65 65 64 65 64 20 62 79 20 6f 75 72 20  s needed by our 
cf30: 75 6e 69 74 20 74 65 73 74 73 20 28 69 2e 65 2e  unit tests (i.e.
cf40: 20 74 68 65 20 53 79 73 74 65 6d 0d 0a 20 20 20   the System..   
cf50: 20 20 20 23 20 20 20 20 20 20 20 61 6e 64 20 53     #       and S
cf60: 79 73 74 65 6d 2e 44 61 74 61 20 61 73 73 65 6d  ystem.Data assem
cf70: 62 6c 79 20 72 65 66 65 72 65 6e 63 65 73 29 2e  bly references).
cf80: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
cf90: 20 73 65 74 20 63 6f 6d 6d 61 6e 64 20 5b 6c 69   set command [li
cfa0: 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  st \..          
cfb0: 63 6f 6d 70 69 6c 65 43 53 68 61 72 70 20 24 74  compileCSharp $t
cfc0: 65 78 74 20 24 6d 65 6d 6f 72 79 20 24 73 79 6d  ext $memory $sym
cfd0: 62 6f 6c 73 20 24 73 74 72 69 63 74 20 72 65 73  bols $strict res
cfe0: 75 6c 74 73 20 65 72 72 6f 72 73 20 5c 0d 0a 20  ults errors \.. 
cff0: 20 20 20 20 20 20 20 20 20 24 61 64 64 20 53 79           $add Sy
d000: 73 74 65 6d 2e 64 6c 6c 20 24 61 64 64 20 53 79  stem.dll $add Sy
d010: 73 74 65 6d 2e 44 61 74 61 2e 64 6c 6c 20 24 61  stem.Data.dll $a
d020: 64 64 20 53 79 73 74 65 6d 2e 54 72 61 6e 73 61  dd System.Transa
d030: 63 74 69 6f 6e 73 2e 64 6c 6c 20 5c 0d 0a 20 20  ctions.dll \..  
d040: 20 20 20 20 20 20 20 20 24 61 64 64 20 53 79 73          $add Sys
d050: 74 65 6d 2e 58 6d 6c 2e 64 6c 6c 5d 0d 0a 0d 0a  tem.Xml.dll]....
d060: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
d070: 20 4e 4f 54 45 3a 20 41 64 64 20 61 6c 6c 20 74   NOTE: Add all t
d080: 68 65 20 70 72 6f 76 69 64 65 64 20 66 69 6c 65  he provided file
d090: 20 6e 61 6d 65 73 20 61 73 20 61 73 73 65 6d 62   names as assemb
d0a0: 6c 79 20 72 65 66 65 72 65 6e 63 65 73 2e 0d 0a  ly references...
d0b0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 66        #..      f
d0c0: 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
d0d0: 24 66 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  $fileNames {..  
d0e0: 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 63 6f        lappend co
d0f0: 6d 6d 61 6e 64 20 24 61 64 64 20 5b 67 65 74 42  mmand $add [getB
d100: 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66  inaryFileName $f
d110: 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20  ileName]..      
d120: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
d130: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20      # NOTE: Add 
d140: 74 68 65 20 65 78 74 72 61 20 61 72 67 75 6d 65  the extra argume
d150: 6e 74 73 2c 20 69 66 20 61 6e 79 2c 20 74 6f 20  nts, if any, to 
d160: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65  the command to e
d170: 76 61 6c 75 61 74 65 2e 0d 0a 20 20 20 20 20 20  valuate...      
d180: 23 0d 0a 20 20 20 20 20 20 65 76 61 6c 20 6c 61  #..      eval la
d190: 70 70 65 6e 64 20 63 6f 6d 6d 61 6e 64 20 24 61  ppend command $a
d1a0: 72 67 73 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  rgs....      #..
d1b0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 6c        # NOTE: Al
d1c0: 69 61 73 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  ias the compiler
d1d0: 20 6c 6f 63 61 6c 20 72 65 73 75 6c 74 73 20 61   local results a
d1e0: 6e 64 20 65 72 72 6f 72 73 20 76 61 72 69 61 62  nd errors variab
d1f0: 6c 65 73 20 74 6f 20 74 68 65 0d 0a 20 20 20 20  les to the..    
d200: 20 20 23 20 20 20 20 20 20 20 76 61 72 69 61 62    #       variab
d210: 6c 65 20 6e 61 6d 65 73 20 70 72 6f 76 69 64 65  le names provide
d220: 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e  d by our caller.
d230: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
d240: 20 75 70 76 61 72 20 31 20 24 72 65 73 75 6c 74   upvar 1 $result
d250: 73 56 61 72 4e 61 6d 65 20 72 65 73 75 6c 74 73  sVarName results
d260: 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20  ..      upvar 1 
d270: 24 65 72 72 6f 72 73 56 61 72 4e 61 6d 65 20 65  $errorsVarName e
d280: 72 72 6f 72 73 0d 0a 0d 0a 20 20 20 20 20 20 23  rrors....      #
d290: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
d2a0: 45 76 61 6c 75 61 74 65 20 74 68 65 20 63 6f 6e  Evaluate the con
d2b0: 73 74 72 75 63 74 65 64 20 5b 63 6f 6d 70 69 6c  structed [compil
d2c0: 65 43 53 68 61 72 70 5d 20 63 6f 6d 6d 61 6e 64  eCSharp] command
d2d0: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0d   and return the.
d2e0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72  .      #       r
d2f0: 65 73 75 6c 74 2e 0d 0a 20 20 20 20 20 20 23 0d  esult...      #.
d300: 0a 20 20 20 20 20 20 65 76 61 6c 20 24 63 6f 6d  .      eval $com
d310: 6d 61 6e 64 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  mand..    }.....
d320: 20 20 20 20 70 72 6f 63 20 69 73 4d 65 6d 6f 72      proc isMemor
d330: 79 44 62 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d  yDb { fileName }
d340: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
d350: 20 20 20 23 20 4e 4f 54 45 3a 20 49 73 20 74 68     # NOTE: Is th
d360: 65 20 73 70 65 63 69 66 69 65 64 20 64 61 74 61  e specified data
d370: 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 72  base file name r
d380: 65 61 6c 6c 79 20 61 6e 20 69 6e 2d 6d 65 6d 6f  eally an in-memo
d390: 72 79 20 64 61 74 61 62 61 73 65 3f 0d 0a 20 20  ry database?..  
d3a0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74      #..      ret
d3b0: 75 72 6e 20 5b 65 78 70 72 20 7b 24 66 69 6c 65  urn [expr {$file
d3c0: 4e 61 6d 65 20 65 71 20 22 3a 6d 65 6d 6f 72 79  Name eq ":memory
d3d0: 3a 22 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20  :" || \..       
d3e0: 20 20 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65     [string range
d3f0: 20 24 66 69 6c 65 4e 61 6d 65 20 30 20 31 32 5d   $fileName 0 12]
d400: 20 65 71 20 22 66 69 6c 65 3a 3a 6d 65 6d 6f 72   eq "file::memor
d410: 79 3a 22 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  y:"}]..    }....
d420: 0a 20 20 20 20 70 72 6f 63 20 69 73 54 61 62 6c  .    proc isTabl
d430: 65 49 6e 44 62 20 7b 20 6e 61 6d 65 20 7b 76 61  eInDb { name {va
d440: 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a 20  rName db} } {.. 
d450: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
d460: 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74  NOTE: Refer to t
d470: 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72  he specified var
d480: 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22  iable (e.g. "db"
d490: 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74  ) in the context
d4a0: 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23   of our..      #
d4b0: 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20 20         caller.  
d4c0: 49 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  It contains the 
d4d0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
d4e0: 69 6f 6e 20 68 61 6e 64 6c 65 20 74 68 61 74 20  ion handle that 
d4f0: 77 69 6c 6c 20 62 65 0d 0a 20 20 20 20 20 20 23  will be..      #
d500: 20 20 20 20 20 20 20 75 73 65 64 20 74 6f 20 65         used to e
d510: 78 65 63 75 74 65 20 74 68 65 20 71 75 65 72 79  xecute the query
d520: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
d530: 6e 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  ne if the named 
d540: 74 61 62 6c 65 20 69 73 0d 0a 20 20 20 20 20 20  table is..      
d550: 23 20 20 20 20 20 20 20 70 72 65 73 65 6e 74 20  #       present 
d560: 69 6e 20 74 68 61 74 20 64 61 74 61 62 61 73 65  in that database
d570: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
d580: 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
d590: 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23  me db....      #
d5a0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
d5b0: 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  Use the sqlite_m
d5c0: 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f 20 64  aster table to d
d5d0: 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
d5e0: 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73 0d 0a  named table is..
d5f0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 72        #       pr
d600: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74  esent in the dat
d610: 61 62 61 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d  abase...      #.
d620: 0a 20 20 20 20 20 20 73 65 74 20 73 71 6c 20 7b  .      set sql {
d630: 0d 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  ..        SELECT
d640: 20 43 4f 55 4e 54 28 2a 29 20 46 52 4f 4d 20 73   COUNT(*) FROM s
d650: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45  qlite_master WHE
d660: 52 45 20 74 79 70 65 20 3d 20 27 74 61 62 6c 65  RE type = 'table
d670: 27 20 41 4e 44 20 6e 61 6d 65 20 3d 20 3f 3b 0d  ' AND name = ?;.
d680: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
d690: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
d6a0: 45 3a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  E: Return non-ze
d6b0: 72 6f 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  ro if the named 
d6c0: 74 61 62 6c 65 20 69 73 20 70 72 65 73 65 6e 74  table is present
d6d0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
d6e0: 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b    return [expr {
d6f0: 0d 0a 20 20 20 20 20 20 20 20 5b 73 71 6c 20 65  ..        [sql e
d700: 78 65 63 75 74 65 20 2d 65 78 65 63 75 74 65 20  xecute -execute 
d710: 73 63 61 6c 61 72 20 24 64 62 20 24 73 71 6c 20  scalar $db $sql 
d720: 5b 6c 69 73 74 20 70 61 72 61 6d 31 20 53 74 72  [list param1 Str
d730: 69 6e 67 20 24 6e 61 6d 65 5d 5d 20 3e 20 30 0d  ing $name]] > 0.
d740: 0a 20 20 20 20 20 20 7d 5d 0d 0a 20 20 20 20 7d  .      }]..    }
d750: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72  .....    proc tr
d760: 69 6d 53 71 6c 20 7b 20 73 71 6c 20 7d 20 7b 0d  imSql { sql } {.
d770: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 72  .      return [r
d780: 65 67 73 75 62 20 2d 61 6c 6c 20 2d 2d 20 7b 5c  egsub -all -- {\
d790: 73 2b 7d 20 5b 73 74 72 69 6e 67 20 74 72 69 6d  s+} [string trim
d7a0: 20 24 73 71 6c 5d 20 22 20 22 5d 0d 0a 20 20 20   $sql] " "]..   
d7b0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
d7c0: 65 78 65 63 75 74 65 53 71 6c 20 7b 20 73 71 6c  executeSql { sql
d7d0: 20 7b 65 78 65 63 75 74 65 20 6e 6f 6e 65 7d 20   {execute none} 
d7e0: 7b 66 6f 72 6d 61 74 20 6e 6f 6e 65 7d 20 7b 66  {format none} {f
d7f0: 69 6c 65 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d  ileName ""} } {.
d800: 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
d810: 6e 67 20 6c 65 6e 67 74 68 20 24 66 69 6c 65 4e  ng length $fileN
d820: 61 6d 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ame] == 0} then 
d830: 7b 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 3a 6d  {set fileName :m
d840: 65 6d 6f 72 79 3a 7d 0d 0a 20 20 20 20 20 20 73  emory:}..      s
d850: 65 74 75 70 44 62 20 24 66 69 6c 65 4e 61 6d 65  etupDb $fileName
d860: 20 22 22 20 22 22 20 22 22 20 22 22 20 22 22 20   "" "" "" "" "" 
d870: 66 61 6c 73 65 20 66 61 6c 73 65 20 66 61 6c 73  false false fals
d880: 65 20 66 61 6c 73 65 20 64 62 20 74 72 75 65 0d  e false db true.
d890: 0a 0d 0a 20 20 20 20 20 20 74 72 79 20 7b 0d 0a  ...      try {..
d8a0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
d8b0: 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20  uplevel 1 [list 
d8c0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  \..            s
d8d0: 71 6c 20 65 78 65 63 75 74 65 20 2d 65 78 65 63  ql execute -exec
d8e0: 75 74 65 20 24 65 78 65 63 75 74 65 20 2d 66 6f  ute $execute -fo
d8f0: 72 6d 61 74 20 24 66 6f 72 6d 61 74 20 24 64 62  rmat $format $db
d900: 20 24 73 71 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d   $sql]]..      }
d910: 20 66 69 6e 61 6c 6c 79 20 7b 0d 0a 20 20 20 20   finally {..    
d920: 20 20 20 20 63 6c 65 61 6e 75 70 44 62 20 24 66      cleanupDb $f
d930: 69 6c 65 4e 61 6d 65 20 64 62 20 66 61 6c 73 65  ileName db false
d940: 20 66 61 6c 73 65 20 66 61 6c 73 65 0d 0a 20 20   false false..  
d950: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
d960: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 43 6f 6e  .    proc getCon
d970: 6e 65 63 74 69 6f 6e 46 6c 61 67 73 20 7b 20 66  nectionFlags { f
d980: 69 6c 65 4e 61 6d 65 20 66 6c 61 67 73 20 7b 71  ileName flags {q
d990: 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  uiet false} } {.
d9a0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
d9b0: 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f  # NOTE: Figure o
d9c0: 75 74 20 77 68 69 63 68 20 64 61 74 61 62 61 73  ut which databas
d9d0: 65 20 66 69 6c 65 20 6e 61 6d 65 20 6f 72 20 63  e file name or c
d9e0: 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67  onnection string
d9f0: 20 74 68 65 73 65 0d 0a 20 20 20 20 20 20 23 20   these..      # 
da00: 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e        connection
da10: 20 66 6c 61 67 73 20 77 69 6c 6c 20 61 63 74 75   flags will actu
da20: 61 6c 6c 79 20 61 70 70 6c 79 20 74 6f 2e 20 20  ally apply to.  
da30: 54 68 69 73 20 69 73 20 6e 6f 74 20 6e 65 63 65  This is not nece
da40: 73 73 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20  ssary..      #  
da50: 20 20 20 20 20 69 6e 20 71 75 69 65 74 20 6d 6f       in quiet mo
da60: 64 65 20 62 65 63 61 75 73 65 20 74 68 69 73 20  de because this 
da70: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6f  information is o
da80: 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 67  nly used for log
da90: 67 69 6e 67 0d 0a 20 20 20 20 20 20 23 20 20 20  ging..      #   
daa0: 20 20 20 20 61 6e 64 20 72 65 70 6f 72 74 69 6e      and reportin
dab0: 67 20 70 75 72 70 6f 73 65 73 2e 0d 0a 20 20 20  g purposes...   
dac0: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
dad0: 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
dae0: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74  .        if {[st
daf0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 69 6c  ring length $fil
db00: 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e  eName] > 0} then
db10: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
db20: 74 20 64 61 74 61 62 61 73 65 20 5b 61 70 70 65  t database [appe
db30: 6e 64 41 72 67 73 20 22 66 69 6c 65 20 6e 61 6d  ndArgs "file nam
db40: 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20  e \"" $fileName 
db50: 5c 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65  \"]..        } e
db60: 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69  lseif {[info exi
db70: 73 74 73 20 3a 3a 64 61 74 61 53 6f 75 72 63 65  sts ::dataSource
db80: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
db90: 20 20 20 20 21 5b 61 72 72 61 79 20 65 78 69 73      ![array exis
dba0: 74 73 20 3a 3a 64 61 74 61 53 6f 75 72 63 65 5d  ts ::dataSource]
dbb0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
dbc0: 20 20 20 20 73 65 74 20 64 61 74 61 62 61 73 65      set database
dbd0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 64 61   [appendArgs "da
dbe0: 74 61 20 73 6f 75 72 63 65 20 5c 22 22 20 24 3a  ta source \"" $:
dbf0: 3a 64 61 74 61 53 6f 75 72 63 65 20 5c 22 5d 0d  :dataSource \"].
dc00: 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
dc10: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
dc20: 20 64 61 74 61 62 61 73 65 20 3c 75 6e 6b 6e 6f   database <unkno
dc30: 77 6e 3e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  wn>..        }..
dc40: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
dc50: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
dc60: 3a 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f 67 29  : Show (and log)
dc70: 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65   the local conne
dc80: 63 74 69 6f 6e 20 66 6c 61 67 73 20 61 6e 64 20  ction flags and 
dc90: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0d 0a  the associated..
dca0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 61        #       da
dcb0: 74 61 20 73 6f 75 72 63 65 20 6f 72 20 66 69 6c  ta source or fil
dcc0: 65 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20 23  e name...      #
dcd0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71 75  ..      if {!$qu
dce0: 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
dcf0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
dd00: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
dd10: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
dd20: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 6f 63 61        "---- loca
dd30: 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61  l connection fla
dd40: 67 73 20 66 6f 72 20 22 20 24 64 61 74 61 62 61  gs for " $databa
dd50: 73 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  se \..          
dd60: 20 20 22 20 61 72 65 3a 20 22 20 5b 65 78 70 72    " are: " [expr
dd70: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
dd80: 20 24 66 6c 61 67 73 5d 20 3e 20 30 20 3f 20 5c   $flags] > 0 ? \
dd90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 61  ..            [a
dda0: 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24 66 6c  ppendArgs \" $fl
ddb0: 61 67 73 20 5c 22 5d 20 3a 20 22 3c 6e 6f 6e 65  ags \"] : "<none
ddc0: 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  >"}] \n]..      
ddd0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
dde0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77      # NOTE: Show
ddf0: 20 28 61 6e 64 20 6c 6f 67 29 20 74 68 65 20 73   (and log) the s
de00: 68 61 72 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e  hared connection
de10: 20 66 6c 61 67 73 2e 0d 0a 20 20 20 20 20 20 23   flags...      #
de20: 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71 75  ..      if {!$qu
de30: 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
de40: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
de50: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a  {..          obj
de60: 65 63 74 20 69 6e 76 6f 6b 65 20 53 79 73 74 65  ect invoke Syste
de70: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51  m.Data.SQLite.SQ
de80: 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 53  LiteConnection S
de90: 68 61 72 65 64 46 6c 61 67 73 0d 0a 20 20 20 20  haredFlags..    
dea0: 20 20 20 20 7d 20 73 68 61 72 65 64 46 6c 61 67      } sharedFlag
deb0: 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  s] == 0} then {.
dec0: 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
ded0: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
dee0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
def0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
df00: 2d 2d 2d 20 73 68 61 72 65 64 20 63 6f 6e 6e 65  --- shared conne
df10: 63 74 69 6f 6e 20 66 6c 61 67 73 20 66 6f 72 20  ction flags for 
df20: 22 20 24 64 61 74 61 62 61 73 65 20 5c 0d 0a 20  " $database \.. 
df30: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 61               " a
df40: 72 65 3a 20 22 20 5b 65 78 70 72 20 7b 5b 73 74  re: " [expr {[st
df50: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 68 61  ring length $sha
df60: 72 65 64 46 6c 61 67 73 5d 20 3e 20 30 20 26 26  redFlags] > 0 &&
df70: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
df80: 20 20 24 73 68 61 72 65 64 46 6c 61 67 73 20 6e    $sharedFlags n
df90: 65 20 22 4e 6f 6e 65 22 20 3f 20 5c 0d 0a 20 20  e "None" ? \..  
dfa0: 20 20 20 20 20 20 20 20 20 20 20 20 5b 61 70 70              [app
dfb0: 65 6e 64 41 72 67 73 20 5c 22 20 24 73 68 61 72  endArgs \" $shar
dfc0: 65 64 46 6c 61 67 73 20 5c 22 5d 20 3a 20 22 3c  edFlags \"] : "<
dfd0: 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20 20  none>"}] \n]..  
dfe0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
dff0: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
e000: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
e010: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
e020: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
e030: 2d 2d 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63  -- shared connec
e040: 74 69 6f 6e 20 66 6c 61 67 73 20 66 6f 72 20 22  tion flags for "
e050: 20 24 64 61 74 61 62 61 73 65 20 5c 0d 0a 20 20   $database \..  
e060: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 61 72              " ar
e070: 65 3a 20 3c 75 6e 61 76 61 69 6c 61 62 6c 65 3e  e: <unavailable>
e080: 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d  \n"]..        }.
e090: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
e0a0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
e0b0: 45 3a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  E: If there are 
e0c0: 61 6e 79 20 67 6c 6f 62 61 6c 20 28 70 65 72 20  any global (per 
e0d0: 74 65 73 74 20 72 75 6e 29 20 63 6f 6e 6e 65 63  test run) connec
e0e0: 74 69 6f 6e 20 66 6c 61 67 73 20 63 75 72 72 65  tion flags curre
e0f0: 6e 74 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20  ntly..      #   
e100: 20 20 20 20 73 65 74 2c 20 75 73 65 20 74 68 65      set, use the
e110: 6d 20 6e 6f 77 20 28 69 2e 65 2e 20 62 79 20 63  m now (i.e. by c
e120: 6f 6d 62 69 6e 69 6e 67 20 74 68 65 6d 20 77 69  ombining them wi
e130: 74 68 20 74 68 65 20 6f 6e 65 73 20 66 6f 72 20  th the ones for 
e140: 74 68 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20  this..      #   
e150: 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e      connection).
e160: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
e170: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
e180: 73 20 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66  s ::connection_f
e190: 6c 61 67 73 5d 20 26 26 20 5c 0d 0a 20 20 20 20  lags] && \..    
e1a0: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
e1b0: 6e 67 74 68 20 24 3a 3a 63 6f 6e 6e 65 63 74 69  ngth $::connecti
e1c0: 6f 6e 5f 66 6c 61 67 73 5d 20 3e 20 30 7d 20 74  on_flags] > 0} t
e1d0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
e1e0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
e1f0: 3a 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f 67 29  : Show (and log)
e200: 20 74 68 65 20 64 65 74 65 63 74 65 64 20 67 6c   the detected gl
e210: 6f 62 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  obal connection 
e220: 66 6c 61 67 73 2e 0d 0a 20 20 20 20 20 20 20 20  flags...        
e230: 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  #..        if {!
e240: 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
e250: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
e260: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
e270: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
e280: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
e290: 2d 2d 20 67 6c 6f 62 61 6c 20 63 6f 6e 6e 65 63  -- global connec
e2a0: 74 69 6f 6e 20 66 6c 61 67 73 20 64 65 74 65 63  tion flags detec
e2b0: 74 65 64 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20  ted: " \..      
e2c0: 20 20 20 20 20 20 20 20 5b 65 78 70 72 20 7b 5b          [expr {[
e2d0: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f  info exists ::co
e2e0: 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73 5d 20  nnection_flags] 
e2f0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
e300: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
e310: 74 68 20 24 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e  th $::connection
e320: 5f 66 6c 61 67 73 5d 20 3e 20 30 20 3f 20 5c 0d  _flags] > 0 ? \.
e330: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
e340: 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24 3a  appendArgs \" $:
e350: 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67  :connection_flag
e360: 73 20 5c 22 5d 20 3a 20 22 3c 6e 6f 6e 65 3e 22  s \"] : "<none>"
e370: 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  }] \n]..        
e380: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  }....        #..
e390: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
e3a0: 43 6f 6d 62 69 6e 65 20 61 6e 64 2f 6f 72 20 72  Combine and/or r
e3b0: 65 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 6e 65  eplace the conne
e3c0: 63 74 69 6f 6e 20 66 6c 61 67 73 20 61 6e 64 20  ction flags and 
e3d0: 74 68 65 6e 20 73 68 6f 77 20 74 68 65 0d 0a 20  then show the.. 
e3e0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e         #       n
e3f0: 65 77 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20  ew value...     
e400: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65     #..        se
e410: 74 20 66 6c 61 67 73 20 5b 63 6f 6d 62 69 6e 65  t flags [combine
e420: 46 6c 61 67 73 20 24 66 6c 61 67 73 20 24 3a 3a  Flags $flags $::
e430: 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73  connection_flags
e440: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
e450: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
e460: 53 68 6f 77 20 28 61 6e 64 20 6c 6f 67 29 20 74  Show (and log) t
e470: 68 65 20 6e 65 77 20 65 66 66 65 63 74 69 76 65  he new effective
e480: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67   connection flag
e490: 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  s...        #.. 
e4a0: 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
e4b0: 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
e4c0: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
e4d0: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
e4e0: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
e4f0: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
e500: 6f 6d 62 69 6e 65 64 20 63 6f 6e 6e 65 63 74 69  ombined connecti
e510: 6f 6e 20 66 6c 61 67 73 20 66 6f 72 20 22 20 24  on flags for " $
e520: 64 61 74 61 62 61 73 65 20 5c 0d 0a 20 20 20 20  database \..    
e530: 20 20 20 20 20 20 20 20 20 20 22 20 61 72 65 3a            " are:
e540: 20 22 20 5b 65 78 70 72 20 7b 5b 73 74 72 69 6e   " [expr {[strin
e550: 67 20 6c 65 6e 67 74 68 20 24 66 6c 61 67 73 5d  g length $flags]
e560: 20 3e 20 30 20 3f 20 5c 0d 0a 20 20 20 20 20 20   > 0 ? \..      
e570: 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41          [appendA
e580: 72 67 73 20 5c 22 20 24 66 6c 61 67 73 20 5c 22  rgs \" $flags \"
e590: 5d 20 3a 20 22 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c  ] : "<none>"}] \
e5a0: 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  n]..        }.. 
e5b0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
e5c0: 72 65 74 75 72 6e 20 24 66 6c 61 67 73 0d 0a 20  return $flags.. 
e5d0: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
e5e0: 63 20 67 65 74 46 6c 61 67 73 50 72 6f 70 65 72  c getFlagsProper
e5f0: 74 79 20 7b 20 7b 66 6c 61 67 73 20 22 22 7d 20  ty { {flags ""} 
e600: 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20  {quiet false} } 
e610: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
e620: 20 20 23 20 4e 4f 54 45 3a 20 44 65 74 65 72 6d    # NOTE: Determ
e630: 69 6e 65 20 77 68 61 74 20 74 68 65 20 63 6f 6d  ine what the com
e640: 62 69 6e 65 64 20 28 67 6c 6f 62 61 6c 20 61 6e  bined (global an
e650: 64 20 6c 6f 63 61 6c 29 20 63 6f 6e 6e 65 63 74  d local) connect
e660: 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ion..      #    
e670: 20 20 20 66 6c 61 67 73 20 73 68 6f 75 6c 64 20     flags should 
e680: 62 65 2c 20 70 6f 73 73 69 62 6c 79 20 71 75 69  be, possibly qui
e690: 65 74 6c 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  etly...      #..
e6a0: 20 20 20 20 20 20 73 65 74 20 66 6c 61 67 73 20        set flags 
e6b0: 5b 67 65 74 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c  [getConnectionFl
e6c0: 61 67 73 20 22 22 20 24 66 6c 61 67 73 20 24 71  ags "" $flags $q
e6d0: 75 69 65 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 23  uiet]....      #
e6e0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
e6f0: 49 66 20 6e 6f 20 67 6c 6f 62 61 6c 20 6f 72 20  If no global or 
e700: 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e  local connection
e710: 20 66 6c 61 67 73 20 77 65 72 65 20 73 70 65 63   flags were spec
e720: 69 66 69 65 64 2c 20 74 68 65 0d 0a 20 20 20 20  ified, the..    
e730: 20 20 23 20 20 20 20 20 20 20 64 65 66 61 75 6c    #       defaul
e740: 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61  t connection fla
e750: 67 73 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  gs should be use
e760: 64 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 72 65  d; therefore, re
e770: 74 75 72 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  turn..      #   
e780: 20 20 20 20 61 6e 20 65 6d 70 74 79 20 73 74 72      an empty str
e790: 69 6e 67 20 69 6e 20 74 68 61 74 20 63 61 73 65  ing in that case
e7a0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
e7b0: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
e7c0: 6e 67 74 68 20 24 66 6c 61 67 73 5d 20 3d 3d 20  ngth $flags] == 
e7d0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
e7e0: 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20     return ""..  
e7f0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
e800: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
e810: 49 6e 20 6f 72 64 65 72 20 74 6f 20 63 68 65 63  In order to chec
e820: 6b 20 69 66 20 74 68 65 20 64 65 66 61 75 6c 74  k if the default
e830: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67   connection flag
e840: 73 20 61 72 65 20 62 65 69 6e 67 20 75 73 65 64  s are being used
e850: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
e860: 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  it is necessary 
e870: 74 6f 20 61 74 74 65 6d 70 74 20 61 20 63 6f 6e  to attempt a con
e880: 76 65 72 73 69 6f 6e 20 74 6f 20 74 68 65 20 61  version to the a
e890: 63 74 75 61 6c 20 65 6e 75 6d 65 72 61 74 65 64  ctual enumerated
e8a0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
e8b0: 74 79 70 65 2e 20 20 46 61 69 6c 69 6e 67 20 74  type.  Failing t
e8c0: 68 61 74 2c 20 74 68 65 20 63 68 65 63 6b 20 61  hat, the check a
e8d0: 67 61 69 6e 73 74 20 74 68 65 20 64 65 66 61 75  gainst the defau
e8e0: 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65  lt value will be
e8f0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
e900: 73 6b 69 70 70 65 64 2e 0d 0a 20 20 20 20 20 20  skipped...      
e910: 23 0d 0a 20 20 20 20 20 20 73 65 74 20 65 72 72  #..      set err
e920: 6f 72 20 6e 75 6c 6c 3b 20 23 20 49 47 4e 4f 52  or null; # IGNOR
e930: 45 44 0d 0a 20 20 20 20 20 20 73 65 74 20 76 61  ED..      set va
e940: 6c 75 65 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f  lue [object invo
e950: 6b 65 20 55 74 69 6c 69 74 79 20 54 72 79 50 61  ke Utility TryPa
e960: 72 73 65 46 6c 61 67 73 45 6e 75 6d 20 22 22 20  rseFlagsEnum "" 
e970: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 53 79 73  \..          Sys
e980: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
e990: 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
e9a0: 46 6c 61 67 73 20 22 22 20 24 66 6c 61 67 73 20  Flags "" $flags 
e9b0: 6e 75 6c 6c 20 74 72 75 65 20 5c 0d 0a 20 20 20  null true \..   
e9c0: 20 20 20 20 20 20 20 74 72 75 65 20 65 72 72 6f         true erro
e9d0: 72 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  r]....      #.. 
e9e0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
e9f0: 74 68 65 20 63 6f 6d 62 69 6e 65 64 20 66 6c 61  the combined fla
ea00: 67 73 20 73 74 72 69 6e 67 20 63 6f 75 6c 64 20  gs string could 
ea10: 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20  not actually be 
ea20: 63 6f 6e 76 65 72 74 65 64 0d 0a 20 20 20 20 20  converted..     
ea30: 20 23 20 20 20 20 20 20 20 74 6f 20 74 68 65 20   #       to the 
ea40: 65 6e 75 6d 65 72 61 74 65 64 20 74 79 70 65 20  enumerated type 
ea50: 69 74 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  it is the defaul
ea60: 74 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 6a 75  t value, then ju
ea70: 73 74 20 75 73 65 0d 0a 20 20 20 20 20 20 23 20  st use..      # 
ea80: 20 20 20 20 20 20 69 74 20 76 65 72 62 61 74 69        it verbati
ea90: 6d 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 6a 75  m; otherwise, ju
eaa0: 73 74 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70  st return an emp
eab0: 74 79 20 73 74 72 69 6e 67 2e 20 20 49 6e 20 74  ty string.  In t
eac0: 68 61 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20  hat..      #    
ead0: 20 20 20 63 61 73 65 2c 20 74 68 65 20 64 65 66     case, the def
eae0: 61 75 6c 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ault connection 
eaf0: 66 6c 61 67 73 20 77 69 6c 6c 20 62 65 20 75 73  flags will be us
eb00: 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ed...      #..  
eb10: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
eb20: 6c 65 6e 67 74 68 20 24 76 61 6c 75 65 5d 20 3d  length $value] =
eb30: 3d 20 30 20 7c 7c 20 24 76 61 6c 75 65 20 6e 65  = 0 || $value ne
eb40: 20 22 44 65 66 61 75 6c 74 22 7d 20 74 68 65 6e   "Default"} then
eb50: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
eb60: 20 20 20 20 20 20 20 23 20 57 41 52 4e 49 4e 47         # WARNING
eb70: 3a 20 54 68 69 73 20 72 65 74 75 72 6e 73 20 74  : This returns t
eb80: 68 65 20 73 74 72 69 6e 67 20 76 61 6c 75 65 20  he string value 
eb90: 6f 66 20 74 68 65 20 63 6f 6d 62 69 6e 65 64 20  of the combined 
eba0: 66 6c 61 67 73 2c 20 6e 6f 74 0d 0a 20 20 20 20  flags, not..    
ebb0: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 74      #          t
ebc0: 68 65 20 65 6e 75 6d 65 72 61 74 65 64 20 76 61  he enumerated va
ebd0: 6c 75 65 2e 20 20 54 68 69 73 20 69 73 20 62 79  lue.  This is by
ebe0: 20 64 65 73 69 67 6e 20 61 6e 64 20 73 68 6f 75   design and shou
ebf0: 6c 64 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20  ld not..        
ec00: 23 20 20 20 20 20 20 20 20 20 20 62 65 20 63 68  #          be ch
ec10: 61 6e 67 65 64 20 77 69 74 68 6f 75 74 20 63 61  anged without ca
ec20: 72 65 66 75 6c 20 63 6f 6e 73 69 64 65 72 61 74  reful considerat
ec30: 69 6f 6e 20 28 65 2e 67 2e 20 69 74 20 77 6f 75  ion (e.g. it wou
ec40: 6c 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ld..        #   
ec50: 20 20 20 20 20 20 20 70 72 65 76 65 6e 74 20 74         prevent t
ec60: 68 65 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74  he SQLiteConnect
ec70: 69 6f 6e 20 63 6c 61 73 73 20 66 72 6f 6d 20 61  ion class from a
ec80: 6c 6c 6f 77 69 6e 67 20 69 6e 76 61 6c 69 64 0d  llowing invalid.
ec90: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
eca0: 20 20 20 20 5b 22 6d 61 67 69 63 61 6c 22 5d 20      ["magical"] 
ecb0: 6d 65 74 61 2d 66 6c 61 67 73 29 2e 0d 0a 20 20  meta-flags)...  
ecc0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
ecd0: 20 72 65 74 75 72 6e 20 5b 61 70 70 65 6e 64 41   return [appendA
ece0: 72 67 73 20 22 46 6c 61 67 73 3d 22 20 24 66 6c  rgs "Flags=" $fl
ecf0: 61 67 73 20 5c 3b 5d 0d 0a 20 20 20 20 20 20 7d  ags \;]..      }
ed00: 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ....      return
ed10: 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20   ""..    }..... 
ed20: 20 20 20 70 72 6f 63 20 65 6e 61 62 6c 65 53 68     proc enableSh
ed30: 61 72 65 64 43 61 63 68 65 20 7b 20 63 68 61 6e  aredCache { chan
ed40: 6e 65 6c 20 65 6e 61 62 6c 65 20 7b 71 75 69 65  nel enable {quie
ed50: 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20  t false} } {..  
ed60: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
ed70: 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74  ..        object
ed80: 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
ed90: 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
eda0: 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
edb0: 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61  Data.SQLite.Unsa
edc0: 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20  feNativeMethods 
edd0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  \..            s
ede0: 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68  qlite3_enable_sh
edf0: 61 72 65 64 5f 63 61 63 68 65 20 5b 65 78 70 72  ared_cache [expr
ee00: 20 69 6e 74 28 24 65 6e 61 62 6c 65 29 5d 0d 0a   int($enable)]..
ee10: 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 20        } result] 
ee20: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
ee30: 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
ee40: 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
ee50: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
ee60: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
ee70: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
ee80: 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69   "---- call sqli
ee90: 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65  te3_enable_share
eea0: 64 5f 63 61 63 68 65 28 22 20 24 65 6e 61 62 6c  d_cache(" $enabl
eeb0: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
eec0: 20 20 20 22 29 2e 2e 2e 20 6f 6b 3a 20 22 20 24     ")... ok: " $
eed0: 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20  result \n]..    
eee0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65      }..      } e
eef0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  lse {..        i
ef00: 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
ef10: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
ef20: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
ef30: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
ef40: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
ef50: 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 65 6e 61  call sqlite3_ena
ef60: 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65  ble_shared_cache
ef70: 28 22 20 24 65 6e 61 62 6c 65 20 5c 0d 0a 20 20  (" $enable \..  
ef80: 20 20 20 20 20 20 20 20 20 20 20 20 22 29 2e 2e              ")..
ef90: 2e 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  . error: " \n\t 
efa0: 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
efb0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
efc0: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
efd0: 72 6f 63 20 73 65 74 75 70 44 62 20 7b 0d 0a 20  roc setupDb {.. 
efe0: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 4e             fileN
eff0: 61 6d 65 20 7b 6d 6f 64 65 20 22 22 7d 20 7b 64  ame {mode ""} {d
f000: 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 20 22 22  ateTimeFormat ""
f010: 7d 20 7b 64 61 74 65 54 69 6d 65 4b 69 6e 64 20  } {dateTimeKind 
f020: 22 22 7d 20 7b 66 6c 61 67 73 20 22 22 7d 0d 0a  ""} {flags ""}..
f030: 20 20 20 20 20 20 20 20 20 20 20 20 7b 65 78 74              {ext
f040: 72 61 20 22 22 7d 20 7b 71 75 61 6c 69 66 79 20  ra ""} {qualify 
f050: 74 72 75 65 7d 20 7b 64 65 6c 65 74 65 20 74 72  true} {delete tr
f060: 75 65 7d 20 7b 75 72 69 20 66 61 6c 73 65 7d 0d  ue} {uri false}.
f070: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 74 65  .            {te
f080: 6d 70 6f 72 61 72 79 20 74 72 75 65 7d 20 7b 76  mporary true} {v
f090: 61 72 4e 61 6d 65 20 64 62 7d 20 7b 71 75 69 65  arName db} {quie
f0a0: 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20  t false} } {..  
f0b0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
f0c0: 4f 54 45 3a 20 46 69 72 73 74 2c 20 73 65 65 20  OTE: First, see 
f0d0: 69 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 68 61  if our caller ha
f0e0: 73 20 72 65 71 75 65 73 74 65 64 20 61 6e 20 69  s requested an i
f0f0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
f100: 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
f110: 20 20 20 73 65 74 20 69 73 4d 65 6d 6f 72 79 20     set isMemory 
f120: 5b 69 73 4d 65 6d 6f 72 79 44 62 20 24 66 69 6c  [isMemoryDb $fil
f130: 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  eName]....      
f140: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
f150: 20 46 6f 72 20 6e 6f 77 2c 20 61 6c 6c 20 74 65   For now, all te
f160: 73 74 20 64 61 74 61 62 61 73 65 73 20 75 73 65  st databases use
f170: 64 20 62 79 20 74 68 65 20 74 65 73 74 20 73 75  d by the test su
f180: 69 74 65 20 61 72 65 20 70 6c 61 63 65 64 0d 0a  ite are placed..
f190: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e        #       in
f1a0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
f1b0: 64 69 72 65 63 74 6f 72 79 2e 20 20 45 61 63 68  directory.  Each
f1c0: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72 65   database and re
f1d0: 6c 61 74 65 64 20 66 69 6c 65 73 0d 0a 20 20 20  lated files..   
f1e0: 20 20 20 23 20 20 20 20 20 20 20 75 73 65 64 20     #       used 
f1f0: 62 79 20 61 20 74 65 73 74 20 73 68 6f 75 6c 64  by a test should
f200: 20 62 65 20 63 6c 65 61 6e 65 64 20 75 70 20 62   be cleaned up b
f210: 79 20 74 68 61 74 20 74 65 73 74 20 75 73 69 6e  y that test usin
f220: 67 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  g the..      #  
f230: 20 20 20 20 20 22 63 6c 65 61 6e 75 70 44 62 22       "cleanupDb"
f240: 20 70 72 6f 63 65 64 75 72 65 2c 20 62 65 6c 6f   procedure, belo
f250: 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  w...      #..   
f260: 20 20 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72     if {!$isMemor
f270: 79 20 26 26 20 24 71 75 61 6c 69 66 79 7d 20 74  y && $qualify} t
f280: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  hen {..        s
f290: 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c  et fileName [fil
f2a0: 65 20 6a 6f 69 6e 20 5b 67 65 74 44 61 74 61 62  e join [getDatab
f2b0: 61 73 65 44 69 72 65 63 74 6f 72 79 5d 20 5b 66  aseDirectory] [f
f2c0: 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61  ile tail $fileNa
f2d0: 6d 65 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  me]]..      }...
f2e0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
f2f0: 23 20 4e 4f 54 45 3a 20 42 79 20 64 65 66 61 75  # NOTE: By defau
f300: 6c 74 2c 20 64 65 6c 65 74 65 20 61 6e 79 20 70  lt, delete any p
f310: 72 65 2d 65 78 69 73 74 69 6e 67 20 64 61 74 61  re-existing data
f320: 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61  base with the sa
f330: 6d 65 20 66 69 6c 65 0d 0a 20 20 20 20 20 20 23  me file..      #
f340: 20 20 20 20 20 20 20 6e 61 6d 65 20 69 66 20 69         name if i
f350: 74 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73  t currently exis
f360: 74 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ts...      #..  
f370: 20 20 20 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f      if {!$isMemo
f380: 72 79 20 26 26 20 24 64 65 6c 65 74 65 20 26 26  ry && $delete &&
f390: 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66   [file exists $f
f3a0: 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
f3b0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
f3c0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74       # NOTE: Att
f3d0: 65 6d 70 74 20 74 6f 20 64 65 6c 65 74 65 20 61  empt to delete a
f3e0: 6e 79 20 70 72 65 2d 65 78 69 73 74 69 6e 67 20  ny pre-existing 
f3f0: 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68  database with th
f400: 65 20 73 61 6d 65 20 66 69 6c 65 0d 0a 20 20 20  e same file..   
f410: 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d       #       nam
f420: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
f430: 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
f440: 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24  h {file delete $
f450: 66 69 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72 5d  fileName} error]
f460: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
f470: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
f480: 20 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65   # NOTE: We some
f490: 68 6f 77 20 66 61 69 6c 65 64 20 74 6f 20 64 65  how failed to de
f4a0: 6c 65 74 65 20 74 68 65 20 66 69 6c 65 2c 20 72  lete the file, r
f4b0: 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20  eport why...    
f4c0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
f4d0: 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
f4e0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
f4f0: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
f500: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
f510: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
f520: 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
f530: 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
f540: 6f 20 64 65 6c 65 74 65 20 64 61 74 61 62 61 73  o delete databas
f550: 65 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65  e file \"" $file
f560: 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  Name \..        
f570: 20 20 20 20 20 20 20 20 22 5c 22 20 64 75 72 69          "\" duri
f580: 6e 67 20 73 65 74 75 70 2c 20 65 72 72 6f 72 3a  ng setup, error:
f590: 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c   " \n\t $error \
f5a0: 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
f5b0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
f5c0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
f5d0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
f5e0: 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63 69  fer to the speci
f5f0: 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28 65  fied variable (e
f600: 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65  .g. "db") in the
f610: 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d   context of our.
f620: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
f630: 61 6c 6c 65 72 2e 20 20 54 68 65 20 68 61 6e 64  aller.  The hand
f640: 6c 65 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64  le to the opened
f650: 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62   database will b
f660: 65 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e 0d  e stored there..
f670: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
f680: 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65  upvar 1 $varName
f690: 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a   db....      #..
f6a0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 74        # NOTE: St
f6b0: 61 72 74 20 62 75 69 6c 64 69 6e 67 20 74 68 65  art building the
f6c0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69   connection stri
f6d0: 6e 67 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72 65  ng.  The only re
f6e0: 71 75 69 72 65 64 20 70 6f 72 74 69 6f 6e 0d 0a  quired portion..
f6f0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 66        #       of
f700: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
f710: 73 74 72 69 6e 67 20 69 73 20 74 68 65 20 64 61  string is the da
f720: 74 61 20 73 6f 75 72 63 65 2c 20 77 68 69 63 68  ta source, which
f730: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0d 0a 20   contains the.. 
f740: 20 20 20 20 20 23 20 20 20 20 20 20 20 64 61 74       #       dat
f750: 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20  abase file name 
f760: 69 74 73 65 6c 66 2e 20 20 49 66 20 6f 75 72 20  itself.  If our 
f770: 63 61 6c 6c 65 72 20 77 61 6e 74 73 20 74 6f 20  caller wants to 
f780: 75 73 65 20 61 20 55 52 49 20 61 73 0d 0a 20 20  use a URI as..  
f790: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
f7a0: 64 61 74 61 20 73 6f 75 72 63 65 2c 20 75 73 65  data source, use
f7b0: 20 74 68 65 20 46 75 6c 6c 55 72 69 20 63 6f 6e   the FullUri con
f7c0: 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 70  nection string p
f7d0: 72 6f 70 65 72 74 79 20 74 6f 0d 0a 20 20 20 20  roperty to..    
f7e0: 20 20 23 20 20 20 20 20 20 20 70 72 65 76 65 6e    #       preven
f7f0: 74 20 74 68 65 20 64 61 74 61 20 73 6f 75 72 63  t the data sourc
f800: 65 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 62 65  e string from be
f810: 69 6e 67 20 6d 61 6e 67 6c 65 64 2e 0d 0a 20 20  ing mangled...  
f820: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
f830: 7b 24 75 72 69 7d 20 74 68 65 6e 20 7b 0d 0a 20  {$uri} then {.. 
f840: 20 20 20 20 20 20 20 73 65 74 20 63 6f 6e 6e 65         set conne
f850: 63 74 69 6f 6e 20 7b 46 75 6c 6c 55 72 69 3d 24  ction {FullUri=$
f860: 7b 66 69 6c 65 4e 61 6d 65 7d 7d 0d 0a 20 20 20  {fileName}}..   
f870: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
f880: 20 20 20 20 20 73 65 74 20 63 6f 6e 6e 65 63 74       set connect
f890: 69 6f 6e 20 7b 44 61 74 61 20 53 6f 75 72 63 65  ion {Data Source
f8a0: 3d 24 7b 66 69 6c 65 4e 61 6d 65 7d 7d 0d 0a 20  =${fileName}}.. 
f8b0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
f8c0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
f8d0: 20 53 69 6e 63 65 20 74 68 69 73 20 70 72 6f 63   Since this proc
f8e0: 65 64 75 72 65 20 68 61 73 20 6e 6f 20 73 70 65  edure has no spe
f8f0: 63 69 61 6c 20 6b 6e 6f 77 6c 65 64 67 65 20 6f  cial knowledge o
f900: 66 20 77 68 61 74 20 74 68 65 20 64 65 66 61 75  f what the defau
f910: 6c 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  lt..      #     
f920: 20 20 73 65 74 74 69 6e 67 20 69 73 20 66 6f 72    setting is for
f930: 20 74 68 65 20 54 6f 46 75 6c 6c 50 61 74 68 20   the ToFullPath 
f940: 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e  connection strin
f950: 67 20 70 72 6f 70 65 72 79 2c 20 61 6c 77 61 79  g propery, alway
f960: 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
f970: 20 61 64 64 20 74 68 65 20 76 61 6c 75 65 20 77   add the value w
f980: 65 20 6b 6e 6f 77 20 61 62 6f 75 74 20 74 6f 20  e know about to 
f990: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  the connection s
f9a0: 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 23 0d  tring...      #.
f9b0: 0a 20 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f  .      append co
f9c0: 6e 6e 65 63 74 69 6f 6e 20 7b 3b 54 6f 46 75 6c  nnection {;ToFul
f9d0: 6c 50 61 74 68 3d 24 7b 71 75 61 6c 69 66 79 7d  lPath=${qualify}
f9e0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
f9f0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f      # NOTE: If o
fa00: 75 72 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66  ur caller specif
fa10: 69 65 64 20 61 20 6a 6f 75 72 6e 61 6c 20 6d 6f  ied a journal mo
fa20: 64 65 2c 20 61 64 64 20 74 68 65 20 6e 65 63 65  de, add the nece
fa30: 73 73 61 72 79 20 70 6f 72 74 69 6f 6e 0d 0a 20  ssary portion.. 
fa40: 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 66 20       #       of 
fa50: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  the connection s
fa60: 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20  tring now...    
fa70: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
fa80: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6d  string length $m
fa90: 6f 64 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ode] > 0} then {
faa0: 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  ..        append
fab0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 4a 6f   connection {;Jo
fac0: 75 72 6e 61 6c 20 4d 6f 64 65 3d 24 7b 6d 6f 64  urnal Mode=${mod
fad0: 65 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  e}}..      }....
fae0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
faf0: 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20 63 61   NOTE: If our ca
fb00: 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64 20 61  ller specified a
fb10: 20 44 61 74 65 54 69 6d 65 20 66 6f 72 6d 61 74   DateTime format
fb20: 2c 20 61 64 64 20 74 68 65 20 6e 65 63 65 73 73  , add the necess
fb30: 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ary..      #    
fb40: 20 20 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68     portion of th
fb50: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72  e connection str
fb60: 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  ing now...      
fb70: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  #..      if {[st
fb80: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 64 61 74  ring length $dat
fb90: 65 54 69 6d 65 46 6f 72 6d 61 74 5d 20 3e 20 30  eTimeFormat] > 0
fba0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
fbb0: 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74    append connect
fbc0: 69 6f 6e 20 7b 3b 44 61 74 65 54 69 6d 65 46 6f  ion {;DateTimeFo
fbd0: 72 6d 61 74 3d 24 7b 64 61 74 65 54 69 6d 65 46  rmat=${dateTimeF
fbe0: 6f 72 6d 61 74 7d 7d 0d 0a 20 20 20 20 20 20 7d  ormat}}..      }
fbf0: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
fc00: 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75     # NOTE: If ou
fc10: 72 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69  r caller specifi
fc20: 65 64 20 61 20 44 61 74 65 54 69 6d 65 4b 69 6e  ed a DateTimeKin
fc30: 64 2c 20 61 64 64 20 74 68 65 20 6e 65 63 65 73  d, add the neces
fc40: 73 61 72 79 20 70 6f 72 74 69 6f 6e 0d 0a 20 20  sary portion..  
fc50: 20 20 20 20 23 20 20 20 20 20 20 20 6f 66 20 74      #       of t
fc60: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74  he connection st
fc70: 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  ring now...     
fc80: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   #..      if {[s
fc90: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 64 61  tring length $da
fca0: 74 65 54 69 6d 65 4b 69 6e 64 5d 20 3e 20 30 7d  teTimeKind] > 0}
fcb0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
fcc0: 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69   append connecti
fcd0: 6f 6e 20 7b 3b 44 61 74 65 54 69 6d 65 4b 69 6e  on {;DateTimeKin
fce0: 64 3d 24 7b 64 61 74 65 54 69 6d 65 4b 69 6e 64  d=${dateTimeKind
fcf0: 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  }}..      }.... 
fd00: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
fd10: 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f 75 74  NOTE: Figure out
fd20: 20 77 68 61 74 20 74 68 65 20 66 69 6e 61 6c 20   what the final 
fd30: 66 6c 61 67 73 20 66 6f 72 20 74 68 69 73 20 63  flags for this c
fd40: 6f 6e 6e 65 63 74 69 6f 6e 20 6e 65 65 64 20 74  onnection need t
fd50: 6f 20 62 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  o be...      #..
fd60: 20 20 20 20 20 20 73 65 74 20 66 6c 61 67 73 20        set flags 
fd70: 5b 67 65 74 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c  [getConnectionFl
fd80: 61 67 73 20 24 66 69 6c 65 4e 61 6d 65 20 24 66  ags $fileName $f
fd90: 6c 61 67 73 20 24 71 75 69 65 74 5d 0d 0a 0d 0a  lags $quiet]....
fda0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
fdb0: 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20 63 61   NOTE: If our ca
fdc0: 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64 20 73  ller specified s
fdd0: 6f 6d 65 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63  ome SQLiteConnec
fde0: 74 69 6f 6e 46 6c 61 67 73 2c 20 61 64 64 20 74  tionFlags, add t
fdf0: 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
fe00: 20 20 6e 65 63 65 73 73 61 72 79 20 70 6f 72 74    necessary port
fe10: 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65  ion of the conne
fe20: 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77  ction string now
fe30: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
fe40: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
fe50: 6e 67 74 68 20 24 66 6c 61 67 73 5d 20 3e 20 30  ngth $flags] > 0
fe60: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
fe70: 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74    append connect
fe80: 69 6f 6e 20 7b 3b 46 6c 61 67 73 3d 24 7b 66 6c  ion {;Flags=${fl
fe90: 61 67 73 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a  ags}}..      }..
fea0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
feb0: 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20   # NOTE: If our 
fec0: 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64  caller specified
fed0: 20 61 6e 20 65 78 74 72 61 20 70 61 79 6c 6f 61   an extra payloa
fee0: 64 20 74 6f 20 74 68 65 20 63 6f 6e 6e 65 63 74  d to the connect
fef0: 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ion..      #    
ff00: 20 20 20 73 74 72 69 6e 67 2c 20 61 70 70 65 6e     string, appen
ff10: 64 20 69 74 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  d it now...     
ff20: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   #..      if {[s
ff30: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 65 78  tring length $ex
ff40: 74 72 61 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  tra] > 0} then {
ff50: 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  ..        append
ff60: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 3b 20 24   connection \; $
ff70: 65 78 74 72 61 0d 0a 20 20 20 20 20 20 7d 0d 0a  extra..      }..
ff80: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
ff90: 20 23 20 4e 4f 54 45 3a 20 4f 70 65 6e 20 74 68   # NOTE: Open th
ffa0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
ffb0: 63 74 69 6f 6e 20 6e 6f 77 2c 20 70 6c 61 63 69  ction now, placi
ffc0: 6e 67 20 74 68 65 20 6f 70 61 71 75 65 20 68 61  ng the opaque ha
ffd0: 6e 64 6c 65 20 76 61 6c 75 65 0d 0a 20 20 20 20  ndle value..    
ffe0: 20 20 23 20 20 20 20 20 20 20 69 6e 74 6f 20 74    #       into t
fff0: 68 65 20 76 61 72 69 61 62 6c 65 20 73 70 65 63  he variable spec
10000 69 66 69 65 64 20 62 79 20 6f 75 72 20 63 61 6c  ified by our cal
10010 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ler...      #.. 
10020 20 20 20 20 20 73 65 74 20 64 62 20 5b 73 71 6c       set db [sql
10030 20 6f 70 65 6e 20 2d 74 79 70 65 20 53 51 4c 69   open -type SQLi
10040 74 65 20 5b 73 75 62 73 74 20 24 63 6f 6e 6e 65  te [subst $conne
10050 63 74 69 6f 6e 5d 5d 0d 0a 0d 0a 20 20 20 20 20  ction]]....     
10060 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
10070 3a 20 43 6f 6e 66 69 67 75 72 65 20 74 68 65 20  : Configure the 
10080 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
10090 6f 72 79 20 66 6f 72 20 74 68 65 20 6e 65 77 6c  ory for the newl
100a0 79 20 6f 70 65 6e 65 64 20 64 61 74 61 62 61 73  y opened databas
100b0 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
100c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 77 20   connection now 
100d0 75 6e 6c 65 73 73 20 6f 75 72 20 63 61 6c 6c 65  unless our calle
100e0 72 20 66 6f 72 62 69 64 73 20 69 74 2e 0d 0a 20  r forbids it... 
100f0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
10100 20 7b 24 74 65 6d 70 6f 72 61 72 79 20 26 26 20   {$temporary && 
10110 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
10120 6e 6f 28 73 65 74 54 65 6d 70 6f 72 61 72 79 44  no(setTemporaryD
10130 69 72 65 63 74 6f 72 79 29 5d 7d 20 74 68 65 6e  irectory)]} then
10140 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 71 6c 20   {..        sql 
10150 65 78 65 63 75 74 65 20 24 64 62 20 5b 61 70 70  execute $db [app
10160 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
10170 20 20 20 20 20 20 20 22 50 52 41 47 4d 41 20 74         "PRAGMA t
10180 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74  emp_store_direct
10190 6f 72 79 20 3d 20 5c 22 22 20 5b 67 65 74 54 65  ory = \"" [getTe
101a0 6d 70 6f 72 61 72 79 44 69 72 65 63 74 6f 72 79  mporaryDirectory
101b0 5d 20 5c 22 5c 3b 5d 0d 0a 20 20 20 20 20 20 7d  ] \"\;]..      }
101c0 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
101d0 20 20 20 23 20 4e 4f 54 45 3a 20 41 6c 77 61 79     # NOTE: Alway
101e0 73 20 72 65 74 75 72 6e 20 74 68 65 20 63 6f 6e  s return the con
101f0 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 75  nection handle u
10200 70 6f 6e 20 73 75 63 63 65 73 73 2e 0d 0a 20 20  pon success...  
10210 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74      #..      ret
10220 75 72 6e 20 24 64 62 0d 0a 20 20 20 20 7d 0d 0a  urn $db..    }..
10230 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 44  ...    proc getD
10240 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20 7b 76  bConnection { {v
10250 61 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a  arName db} } {..
10260 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
10270 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20   NOTE: Refer to 
10280 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61  the specified va
10290 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62  riable (e.g. "db
102a0 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78  ") in the contex
102b0 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20  t of our..      
102c0 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20  #       caller. 
102d0 20 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 74   The handle to t
102e0 68 65 20 64 61 74 61 62 61 73 65 20 70 72 65 76  he database prev
102f0 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 76 69  iously opened vi
10300 61 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  a the..      #  
10310 20 20 20 20 20 5b 73 65 74 75 70 44 62 5d 20 70       [setupDb] p
10320 72 6f 63 65 64 75 72 65 20 73 68 6f 75 6c 64 20  rocedure should 
10330 62 65 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e  be stored there.
10340 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
10350 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d   upvar 1 $varNam
10360 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  e db....      #.
10370 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
10380 68 69 73 20 72 65 74 75 72 6e 73 20 74 68 65 20  his returns the 
10390 41 44 4f 2e 4e 45 54 20 49 44 62 43 6f 6e 6e 65  ADO.NET IDbConne
103a0 63 74 69 6f 6e 20 6f 62 6a 65 63 74 20 69 6e 73  ction object ins
103b0 74 61 6e 63 65 20 66 6f 72 20 74 68 65 0d 0a 20  tance for the.. 
103c0 20 20 20 20 20 23 20 20 20 20 20 20 20 73 70 65       #       spe
103d0 63 69 66 69 65 64 20 64 61 74 61 62 73 65 20 68  cified databse h
103e0 61 6e 64 6c 65 2e 20 20 53 69 6e 63 65 20 67 65  andle.  Since ge
103f0 74 74 69 6e 67 20 74 68 69 73 20 6f 62 6a 65 63  tting this objec
10400 74 20 72 65 6c 69 65 73 20 75 70 6f 6e 0d 0a 20  t relies upon.. 
10410 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
10420 6c 65 20 69 6e 74 65 72 6e 61 6c 73 2c 20 67 72  le internals, gr
10430 65 61 74 20 63 61 72 65 20 73 68 6f 75 6c 64 20  eat care should 
10440 62 65 20 74 61 6b 65 6e 20 74 6f 20 61 76 6f 69  be taken to avoi
10450 64 20 64 69 73 70 6f 73 69 6e 67 20 6f 66 0d 0a  d disposing of..
10460 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
10470 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 6f 74 68  is object or oth
10480 65 72 77 69 73 65 20 70 75 74 74 69 6e 67 20 69  erwise putting i
10490 74 20 69 6e 74 6f 20 61 6e 20 69 6e 76 61 6c 69  t into an invali
104a0 64 20 73 74 61 74 65 2e 0d 0a 20 20 20 20 20 20  d state...      
104b0 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
104c0 66 6f 20 65 78 69 73 74 73 20 64 62 5d 7d 20 74  fo exists db]} t
104d0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
104e0 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
104f0 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
10500 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
10510 50 75 62 6c 69 63 20 2d 6f 62 6a 65 63 74 66 6c  Public -objectfl
10520 61 67 73 20 2b 4e 6f 44 69 73 70 6f 73 65 20 2d  ags +NoDispose -
10530 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20 20 20  alias \..       
10540 20 20 20 20 20 20 20 49 6e 74 65 72 70 72 65 74         Interpret
10550 65 72 2e 47 65 74 41 63 74 69 76 65 2e 63 6f 6e  er.GetActive.con
10560 6e 65 63 74 69 6f 6e 73 20 49 74 65 6d 20 24 64  nections Item $d
10570 62 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65 73  b..        } res
10580 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ult] == 0} then 
10590 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
105a0 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
105b0 3a 20 53 75 63 63 65 73 73 2c 20 72 65 74 75 72  : Success, retur
105c0 6e 20 74 68 65 20 6f 70 61 71 75 65 20 6f 62 6a  n the opaque obj
105d0 65 63 74 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20  ect handle...   
105e0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
105f0 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73 75      return $resu
10600 6c 74 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  lt..        } el
10610 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
10620 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
10630 4f 54 45 3a 20 46 61 69 6c 75 72 65 2c 20 72 65  OTE: Failure, re
10640 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20  port why...     
10650 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
10660 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
10670 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
10680 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
10690 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
106a0 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 67 65  NG: failed to ge
106b0 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e  t connection han
106c0 64 6c 65 20 66 6f 72 20 64 61 74 61 62 61 73 65  dle for database
106d0 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
106e0 20 20 20 20 20 20 24 64 62 20 22 5c 22 2c 20 65        $db "\", e
106f0 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65  rror: " \n\t $re
10700 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  sult \n]..      
10710 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
10720 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
10730 20 66 72 65 65 44 62 43 6f 6e 6e 65 63 74 69 6f   freeDbConnectio
10740 6e 20 7b 20 7b 76 61 72 4e 61 6d 65 20 63 6f 6e  n { {varName con
10750 6e 65 63 74 69 6f 6e 7d 20 7d 20 7b 0d 0a 20 20  nection} } {..  
10760 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
10770 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68  OTE: Refer to th
10780 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72 69  e specified vari
10790 61 62 6c 65 20 28 65 2e 67 2e 20 22 63 6f 6e 6e  able (e.g. "conn
107a0 65 63 74 69 6f 6e 22 29 20 69 6e 20 74 68 65 0d  ection") in the.
107b0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
107c0 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 20 63 61  ontext of our ca
107d0 6c 6c 65 72 2e 20 20 54 68 65 20 6f 70 61 71 75  ller.  The opaqu
107e0 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20  e object handle 
107f0 66 6f 72 20 61 6e 20 41 44 4f 2e 4e 45 54 0d 0a  for an ADO.NET..
10800 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
10810 6e 6e 65 63 74 69 6f 6e 20 70 72 65 76 69 6f 75  nnection previou
10820 73 6c 79 20 72 65 74 75 72 6e 65 64 20 62 79 20  sly returned by 
10830 5b 67 65 74 44 62 43 6f 6e 6e 65 63 74 69 6f 6e  [getDbConnection
10840 5d 20 73 68 6f 75 6c 64 20 62 65 0d 0a 20 20 20  ] should be..   
10850 20 20 20 23 20 20 20 20 20 20 20 73 74 6f 72 65     #       store
10860 64 20 74 68 65 72 65 2e 0d 0a 20 20 20 20 20 20  d there...      
10870 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31  #..      upvar 1
10880 20 24 76 61 72 4e 61 6d 65 20 63 6f 6e 6e 65 63   $varName connec
10890 74 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  tion....      #.
108a0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41  .      # NOTE: A
108b0 74 74 65 6d 70 74 20 74 6f 20 72 65 6d 6f 76 65  ttempt to remove
108c0 20 74 68 65 20 6f 70 61 71 75 65 20 6f 62 6a 65   the opaque obje
108d0 63 74 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 74  ct handle from t
108e0 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 0d 0a  he interpreter..
108f0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 6f        #       no
10900 77 2e 20 20 54 68 69 73 20 5b 6f 62 6a 65 63 74  w.  This [object
10910 20 64 69 73 70 6f 73 65 5d 20 63 61 6c 6c 20 77   dispose] call w
10920 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  ill not actually
10930 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65 0d   dispose of the.
10940 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75  .      #       u
10950 6e 64 65 72 6c 79 69 6e 67 20 6f 62 6a 65 63 74  nderlying object
10960 20 62 65 63 61 75 73 65 20 74 68 65 20 2b 4e 6f   because the +No
10970 44 69 73 70 6f 73 65 20 66 6c 61 67 20 77 61 73  Dispose flag was
10980 20 73 65 74 20 6f 6e 20 69 74 0d 0a 20 20 20 20   set on it..    
10990 20 20 23 20 20 20 20 20 20 20 64 75 72 69 6e 67    #       during
109a0 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65   creation of the
109b0 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74 20 68   opaque object h
109c0 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d  andle...      #.
109d0 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
109e0 20 65 78 69 73 74 73 20 63 6f 6e 6e 65 63 74 69   exists connecti
109f0 6f 6e 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  on] && \..      
10a00 20 20 20 20 5b 63 61 74 63 68 20 7b 6f 62 6a 65      [catch {obje
10a10 63 74 20 64 69 73 70 6f 73 65 20 24 63 6f 6e 6e  ct dispose $conn
10a20 65 63 74 69 6f 6e 7d 20 65 72 72 6f 72 5d 7d 20  ection} error]} 
10a30 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
10a40 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
10a50 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20 66 61  E: We somehow fa
10a60 69 6c 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 74  iled to remove t
10a70 68 65 20 68 61 6e 64 6c 65 2c 20 72 65 70 6f 72  he handle, repor
10a80 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20  t why...        
10a90 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  #..        tputs
10aa0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
10ab0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
10ac0 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
10ad0 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
10ae0 64 20 74 6f 20 72 65 6d 6f 76 65 20 63 6f 6e 6e  d to remove conn
10af0 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 5c 22  ection handle \"
10b00 22 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 0d  " $connection \.
10b10 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22  .            "\"
10b20 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  , error: " \n\t 
10b30 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20  $error \n]..    
10b40 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
10b50 20 20 20 70 72 6f 63 20 61 64 64 44 62 43 6f 6e     proc addDbCon
10b60 6e 65 63 74 69 6f 6e 20 7b 20 63 6f 6e 6e 65 63  nection { connec
10b70 74 69 6f 6e 20 7b 76 61 72 4e 61 6d 65 20 64 62  tion {varName db
10b80 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
10b90 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
10ba0 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63 69  fer to the speci
10bb0 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28 65  fied variable (e
10bc0 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65  .g. "db") in the
10bd0 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d   context of our.
10be0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
10bf0 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d  aller...      #.
10c00 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24  .      upvar 1 $
10c10 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20  varName db....  
10c20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
10c30 4f 54 45 3a 20 43 72 65 61 74 65 20 61 20 63 6f  OTE: Create a co
10c40 72 72 65 63 74 6c 79 20 66 6f 72 6d 61 74 74 65  rrectly formatte
10c50 64 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 64  d name for the d
10c60 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
10c70 6f 6e 20 74 6f 0d 0a 20 20 20 20 20 20 23 20 20  on to..      #  
10c80 20 20 20 20 20 62 65 20 61 64 64 65 64 20 74 6f       be added to
10c90 20 74 68 65 20 6c 69 73 74 20 6d 61 6e 61 67 65   the list manage
10ca0 64 20 62 79 20 74 68 65 20 45 61 67 6c 65 20 69  d by the Eagle i
10cb0 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20  nterpreter...   
10cc0 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
10cd0 64 62 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b  db [object invok
10ce0 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
10cf0 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
10d00 20 45 61 67 6c 65 2e 5f 43 6f 6d 70 6f 6e 65 6e   Eagle._Componen
10d10 74 73 2e 50 72 69 76 61 74 65 2e 46 6f 72 6d 61  ts.Private.Forma
10d20 74 4f 70 73 20 44 61 74 61 62 61 73 65 4f 62 6a  tOps DatabaseObj
10d30 65 63 74 4e 61 6d 65 20 24 63 6f 6e 6e 65 63 74  ectName $connect
10d40 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ion \..         
10d50 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f   SQLiteConnectio
10d60 6e 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65  n [object invoke
10d70 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74   Interpreter.Get
10d80 41 63 74 69 76 65 20 4e 65 78 74 49 64 5d 5d 0d  Active NextId]].
10d90 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
10da0 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 74 68    # NOTE: Add th
10db0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
10dc0 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 64 20 62  ction provided b
10dd0 79 20 6f 75 72 20 63 61 6c 6c 65 72 20 74 6f 20  y our caller to 
10de0 74 68 65 20 6c 69 73 74 0d 0a 20 20 20 20 20 20  the list..      
10df0 23 20 20 20 20 20 20 20 6f 66 20 74 68 6f 73 65  #       of those
10e00 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 65 20 45 61   known to the Ea
10e10 67 6c 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e  gle interpreter.
10e20 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
10e30 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
10e40 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
10e50 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74   Interpreter.Get
10e60 41 63 74 69 76 65 2e 63 6f 6e 6e 65 63 74 69 6f  Active.connectio
10e70 6e 73 20 41 64 64 20 5c 0d 0a 20 20 20 20 20 20  ns Add \..      
10e80 20 20 20 20 24 64 62 20 24 63 6f 6e 6e 65 63 74      $db $connect
10e90 69 6f 6e 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  ion..    }..... 
10ea0 20 20 20 70 72 6f 63 20 67 65 74 52 6f 77 73 46     proc getRowsF
10eb0 72 6f 6d 44 61 74 61 54 61 62 6c 65 20 7b 20 64  romDataTable { d
10ec0 61 74 61 54 61 62 6c 65 20 7d 20 7b 0d 0a 20 20  ataTable } {..  
10ed0 20 20 20 20 73 65 74 20 72 6f 77 73 20 5b 6c 69      set rows [li
10ee0 73 74 5d 0d 0a 20 20 20 20 20 20 73 65 74 20 63  st]..      set c
10ef0 6f 75 6e 74 20 5b 24 64 61 74 61 54 61 62 6c 65  ount [$dataTable
10f00 20 43 6f 6c 75 6d 6e 73 2e 43 6f 75 6e 74 5d 0d   Columns.Count].
10f10 0a 0d 0a 20 20 20 20 20 20 66 6f 72 20 7b 73 65  ...      for {se
10f20 74 20 69 6e 64 65 78 20 30 7d 20 7b 24 69 6e 64  t index 0} {$ind
10f30 65 78 20 3c 20 24 63 6f 75 6e 74 7d 20 7b 69 6e  ex < $count} {in
10f40 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20  cr index} {..   
10f50 20 20 20 20 20 73 65 74 20 64 61 74 61 43 6f 6c       set dataCol
10f60 75 6d 6e 20 5b 24 64 61 74 61 54 61 62 6c 65 20  umn [$dataTable 
10f70 2d 61 6c 69 61 73 20 43 6f 6c 75 6d 6e 73 2e 67  -alias Columns.g
10f80 65 74 5f 49 74 65 6d 20 24 69 6e 64 65 78 5d 0d  et_Item $index].
10f90 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 61 6d  .        set nam
10fa0 65 73 28 24 69 6e 64 65 78 29 20 5b 24 64 61 74  es($index) [$dat
10fb0 61 43 6f 6c 75 6d 6e 20 43 6f 6c 75 6d 6e 4e 61  aColumn ColumnNa
10fc0 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  me]..      }....
10fd0 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72        object for
10fe0 65 61 63 68 20 2d 61 6c 69 61 73 20 64 61 74 61  each -alias data
10ff0 52 6f 77 20 5b 73 65 74 20 64 61 74 61 52 6f 77  Row [set dataRow
11000 73 20 5b 24 64 61 74 61 54 61 62 6c 65 20 52 6f  s [$dataTable Ro
11010 77 73 5d 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20  ws]] {..        
11020 73 65 74 20 72 6f 77 20 5b 6c 69 73 74 5d 0d 0a  set row [list]..
11030 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 20 7b 73  ..        for {s
11040 65 74 20 69 6e 64 65 78 20 30 7d 20 7b 24 69 6e  et index 0} {$in
11050 64 65 78 20 3c 20 24 63 6f 75 6e 74 7d 20 7b 69  dex < $count} {i
11060 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20  ncr index} {..  
11070 20 20 20 20 20 20 20 20 73 65 74 20 76 61 6c 75          set valu
11080 65 20 5b 24 64 61 74 61 52 6f 77 20 2d 63 72 65  e [$dataRow -cre
11090 61 74 65 20 2d 61 6c 69 61 73 20 67 65 74 5f 49  ate -alias get_I
110a0 74 65 6d 20 24 69 6e 64 65 78 5d 0d 0a 0d 0a 20  tem $index].... 
110b0 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74           if {[st
110c0 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 6c  ring length $val
110d0 75 65 5d 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20  ue] > 0 && \..  
110e0 20 20 20 20 20 20 20 20 20 20 20 20 21 5b 6f 62              ![ob
110f0 6a 65 63 74 20 69 6e 76 6f 6b 65 20 43 6f 6e 76  ject invoke Conv
11100 65 72 74 20 49 73 44 42 4e 75 6c 6c 20 24 76 61  ert IsDBNull $va
11110 6c 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  lue]} then {..  
11120 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e            lappen
11130 64 20 72 6f 77 20 5b 6c 69 73 74 20 24 6e 61 6d  d row [list $nam
11140 65 73 28 24 69 6e 64 65 78 29 20 5b 24 76 61 6c  es($index) [$val
11150 75 65 20 54 6f 53 74 72 69 6e 67 5d 5d 0d 0a 20  ue ToString]].. 
11160 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
11170 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  {..            l
11180 61 70 70 65 6e 64 20 72 6f 77 20 5b 6c 69 73 74  append row [list
11190 20 24 6e 61 6d 65 73 28 24 69 6e 64 65 78 29 5d   $names($index)]
111a0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
111b0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
111c0 20 20 20 20 6c 61 70 70 65 6e 64 20 72 6f 77 73      lappend rows
111d0 20 24 72 6f 77 0d 0a 20 20 20 20 20 20 7d 0d 0a   $row..      }..
111e0 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24  ..      return $
111f0 72 6f 77 73 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  rows..    }.....
11200 20 20 20 20 70 72 6f 63 20 64 75 6d 70 52 6f 77      proc dumpRow
11210 73 46 72 6f 6d 44 61 74 61 54 61 62 6c 65 20 7b  sFromDataTable {
11220 20 63 68 61 6e 6e 65 6c 20 72 6f 77 73 20 7d 20   channel rows } 
11230 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 73 65 71  {..      set seq
11240 75 65 6e 63 65 20 31 0d 0a 0d 0a 20 20 20 20 20  uence 1....     
11250 20 66 6f 72 65 61 63 68 20 72 6f 77 20 24 72 6f   foreach row $ro
11260 77 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  ws {..        tp
11270 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
11280 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
11290 20 20 20 20 20 20 20 20 5b 65 78 70 72 20 7b 24          [expr {$
112a0 73 65 71 75 65 6e 63 65 20 3e 20 31 20 3f 20 22  sequence > 1 ? "
112b0 5c 6e 22 20 3a 20 22 22 7d 5d 20 22 2d 2d 2d 2d  \n" : ""}] "----
112c0 20 52 4f 57 20 23 22 20 24 73 65 71 75 65 6e 63   ROW #" $sequenc
112d0 65 20 3a 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20  e :\n]....      
112e0 20 20 66 6f 72 65 61 63 68 20 70 61 69 72 20 24    foreach pair $
112f0 72 6f 77 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  row {..         
11300 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 70   if {[llength $p
11310 61 69 72 5d 20 3e 3d 20 32 7d 20 74 68 65 6e 20  air] >= 2} then 
11320 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
11330 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
11340 70 70 65 6e 64 41 72 67 73 20 5c 74 20 5c 0d 0a  ppendArgs \t \..
11350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11360 5b 6c 69 73 74 20 5b 6c 69 6e 64 65 78 20 24 70  [list [lindex $p
11370 61 69 72 20 30 5d 5d 20 22 3a 20 22 20 5b 6c 69  air 0]] ": " [li
11380 73 74 20 5b 6c 69 6e 64 65 78 20 24 70 61 69 72  st [lindex $pair
11390 20 31 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20   1]] \n]..      
113a0 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 6c      } elseif {[l
113b0 6c 65 6e 67 74 68 20 24 70 61 69 72 5d 20 3d 3d  length $pair] ==
113c0 20 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   1} then {..    
113d0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
113e0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
113f0 67 73 20 5c 74 20 5c 0d 0a 20 20 20 20 20 20 20  gs \t \..       
11400 20 20 20 20 20 20 20 20 20 5b 6c 69 73 74 20 5b           [list [
11410 6c 69 6e 64 65 78 20 24 70 61 69 72 20 30 5d 5d  lindex $pair 0]]
11420 20 22 3a 20 3c 6e 75 6c 6c 3e 5c 6e 22 5d 0d 0a   ": <null>\n"]..
11430 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
11440 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
11450 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5c  tputs $channel \
11460 74 3c 65 6d 70 74 79 3e 5c 6e 3b 20 23 20 4e 4f  t<empty>\n; # NO
11470 54 45 3a 20 4e 6f 20 64 61 74 61 3f 0d 0a 20 20  TE: No data?..  
11480 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
11490 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
114a0 69 6e 63 72 20 73 65 71 75 65 6e 63 65 0d 0a 20  incr sequence.. 
114b0 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
114c0 0d 0a 20 20 20 20 70 72 6f 63 20 63 6c 65 61 6e  ..    proc clean
114d0 75 70 44 62 20 7b 20 66 69 6c 65 4e 61 6d 65 20  upDb { fileName 
114e0 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20 7b 63 6f  {varName db} {co
114f0 6c 6c 65 63 74 20 74 72 75 65 7d 20 7b 71 75 61  llect true} {qua
11500 6c 69 66 79 20 74 72 75 65 7d 0d 0a 20 20 20 20  lify true}..    
11510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11520 20 7b 64 65 6c 65 74 65 20 74 72 75 65 7d 20 7d   {delete true} }
11530 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
11540 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
11550 70 74 20 74 6f 20 66 6f 72 63 65 20 61 6c 6c 20  pt to force all 
11560 70 65 6e 64 69 6e 67 20 22 67 61 72 62 61 67 65  pending "garbage
11570 22 20 6f 62 6a 65 63 74 73 20 74 6f 20 62 65 20  " objects to be 
11580 63 6f 6c 6c 65 63 74 65 64 2c 0d 0a 20 20 20 20  collected,..    
11590 20 20 23 20 20 20 20 20 20 20 69 6e 63 6c 75 64    #       includ
115a0 69 6e 67 20 53 51 4c 69 74 65 20 73 74 61 74 65  ing SQLite state
115b0 6d 65 6e 74 73 20 61 6e 64 20 62 61 63 6b 75 70  ments and backup
115c0 20 6f 62 6a 65 63 74 73 3b 20 74 68 69 73 20 73   objects; this s
115d0 68 6f 75 6c 64 20 61 6c 6c 6f 77 0d 0a 20 20 20  hould allow..   
115e0 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 75     #       the u
115f0 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
11600 73 65 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65  se file to be de
11610 6c 65 74 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d  leted...      #.
11620 0a 20 20 20 20 20 20 69 66 20 7b 24 63 6f 6c 6c  .      if {$coll
11630 65 63 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ect} then {..   
11640 20 20 20 20 20 63 6f 6c 6c 65 63 74 47 61 72 62       collectGarb
11650 61 67 65 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  age $::test_chan
11660 6e 65 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  nel..      }....
11670 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
11680 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20   NOTE: Refer to 
11690 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61  the specified va
116a0 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62  riable (e.g. "db
116b0 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78  ") in the contex
116c0 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20  t of our..      
116d0 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20  #       caller. 
116e0 20 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 74   The handle to t
116f0 68 65 20 64 61 74 61 62 61 73 65 20 70 72 65 76  he database prev
11700 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 76 69  iously opened vi
11710 61 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  a the..      #  
11720 20 20 20 20 20 5b 73 65 74 75 70 44 62 5d 20 70       [setupDb] p
11730 72 6f 63 65 64 75 72 65 20 73 68 6f 75 6c 64 20  rocedure should 
11740 62 65 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e  be stored there.
11750 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
11760 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d   upvar 1 $varNam
11770 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  e db....      #.
11780 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43  .      # NOTE: C
11790 6c 6f 73 65 20 74 68 65 20 63 6f 6e 6e 65 63 74  lose the connect
117a0 69 6f 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ion to the datab
117b0 61 73 65 20 6e 6f 77 2e 20 20 54 68 69 73 20 73  ase now.  This s
117c0 68 6f 75 6c 64 20 61 6c 6c 6f 77 20 75 73 0d 0a  hould allow us..
117d0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f        #       to
117e0 20 64 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65   delete the unde
117f0 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
11800 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  file...      #..
11810 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
11820 65 78 69 73 74 73 20 64 62 5d 20 26 26 20 5b 63  exists db] && [c
11830 61 74 63 68 20 7b 73 71 6c 20 63 6c 6f 73 65 20  atch {sql close 
11840 24 64 62 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65  $db} error]} the
11850 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
11860 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
11870 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65  We somehow faile
11880 64 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 64  d to close the d
11890 61 74 61 62 61 73 65 2c 20 72 65 70 6f 72 74 20  atabase, report 
118a0 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  why...        #.
118b0 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
118c0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
118d0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
118e0 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
118f0 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
11900 74 6f 20 63 6c 6f 73 65 20 64 61 74 61 62 61 73  to close databas
11910 65 20 5c 22 22 20 24 64 62 20 22 5c 22 2c 20 65  e \"" $db "\", e
11920 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20  rror: " \..     
11930 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 65 72 72         \n\t $err
11940 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d  or \n]..      }.
11950 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
11960 20 20 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c    # NOTE: First,
11970 20 73 65 65 20 69 66 20 6f 75 72 20 63 61 6c 6c   see if our call
11980 65 72 20 68 61 73 20 72 65 71 75 65 73 74 65 64  er has requested
11990 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
119a0 74 61 62 61 73 65 2e 0d 0a 20 20 20 20 20 20 23  tabase...      #
119b0 0d 0a 20 20 20 20 20 20 73 65 74 20 69 73 4d 65  ..      set isMe
119c0 6d 6f 72 79 20 5b 69 73 4d 65 6d 6f 72 79 44 62  mory [isMemoryDb
119d0 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20   $fileName].... 
119e0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
119f0 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20  NOTE: Build the 
11a00 66 75 6c 6c 20 70 61 74 68 20 74 6f 20 74 68 65  full path to the
11a10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
11a20 61 6d 65 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 61  ame.  For now, a
11a30 6c 6c 20 74 65 73 74 0d 0a 20 20 20 20 20 20 23  ll test..      #
11a40 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
11a50 66 69 6c 65 73 20 61 72 65 20 73 74 6f 72 65 64  files are stored
11a60 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72   in the temporar
11a70 79 20 64 69 72 65 63 74 6f 72 79 2e 0d 0a 20 20  y directory...  
11a80 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
11a90 7b 21 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24  {!$isMemory && $
11aa0 71 75 61 6c 69 66 79 7d 20 74 68 65 6e 20 7b 0d  qualify} then {.
11ab0 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c  .        set fil
11ac0 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  eName [file join
11ad0 20 5b 67 65 74 44 61 74 61 62 61 73 65 44 69 72   [getDatabaseDir
11ae0 65 63 74 6f 72 79 5d 20 5b 66 69 6c 65 20 74 61  ectory] [file ta
11af0 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a  il $fileName]]..
11b00 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
11b10 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
11b20 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 66  : Check if the f
11b30 69 6c 65 20 73 74 69 6c 6c 20 65 78 69 73 74 73  ile still exists
11b40 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
11b50 20 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72 79    if {!$isMemory
11b60 20 26 26 20 24 64 65 6c 65 74 65 20 26 26 20 5b   && $delete && [
11b70 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c  file exists $fil
11b80 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
11b90 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
11ba0 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20     # NOTE: Skip 
11bb0 64 65 6c 65 74 69 6e 67 20 64 61 74 61 62 61 73  deleting databas
11bc0 65 20 66 69 6c 65 73 20 69 66 20 73 6f 6d 65 62  e files if someb
11bd0 6f 64 79 20 73 65 74 73 20 74 68 65 20 67 6c 6f  ody sets the glo
11be0 62 61 6c 0d 0a 20 20 20 20 20 20 20 20 23 20 20  bal..        #  
11bf0 20 20 20 20 20 76 61 72 69 61 62 6c 65 20 74 6f       variable to
11c00 20 70 72 65 76 65 6e 74 20 69 74 2e 0d 0a 20 20   prevent it...  
11c10 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
11c20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
11c30 74 73 20 3a 3a 6e 6f 28 63 6c 65 61 6e 75 70 44  ts ::no(cleanupD
11c40 62 46 69 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d  bFile)]} then {.
11c50 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
11c60 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
11c70 41 74 74 65 6d 70 74 20 74 6f 20 64 65 6c 65 74  Attempt to delet
11c80 65 20 74 68 65 20 74 65 73 74 20 64 61 74 61 62  e the test datab
11c90 61 73 65 20 66 69 6c 65 20 6e 6f 77 2e 0d 0a 20  ase file now... 
11ca0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
11cb0 20 20 20 20 20 20 69 66 20 7b 5b 73 65 74 20 63        if {[set c
11cc0 6f 64 65 20 5b 63 61 74 63 68 20 7b 66 69 6c 65  ode [catch {file
11cd0 20 64 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d   delete $fileNam
11ce0 65 7d 20 65 72 72 6f 72 5d 5d 7d 20 74 68 65 6e  e} error]]} then
11cf0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
11d00 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  #..            #
11d10 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f   NOTE: We someho
11d20 77 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65  w failed to dele
11d30 74 65 20 74 68 65 20 66 69 6c 65 2c 20 72 65 70  te the file, rep
11d40 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20  ort why...      
11d50 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
11d60 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
11d70 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
11d80 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
11d90 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
11da0 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
11db0 74 6f 20 64 65 6c 65 74 65 20 64 61 74 61 62 61  to delete databa
11dc0 73 65 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c  se file \"" $fil
11dd0 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  eName \..       
11de0 20 20 20 20 20 20 20 20 20 22 5c 22 20 64 75 72           "\" dur
11df0 69 6e 67 20 63 6c 65 61 6e 75 70 2c 20 65 72 72  ing cleanup, err
11e00 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f  or: " \n\t $erro
11e10 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  r \n]..         
11e20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c   }..        } el
11e30 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
11e40 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
11e50 4f 54 45 3a 20 53 68 6f 77 20 74 68 61 74 20 77  OTE: Show that w
11e60 65 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69  e skipped deleti
11e70 6e 67 20 74 68 65 20 66 69 6c 65 2e 0d 0a 20 20  ng the file...  
11e80 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
11e90 20 20 20 20 20 73 65 74 20 63 6f 64 65 20 30 0d       set code 0.
11ea0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  ...          tpu
11eb0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
11ec0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
11ed0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
11ee0 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 73  "==== WARNING: s
11ef0 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20  kipped deleting 
11f00 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 5c 22  database file \"
11f10 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  " $fileName \.. 
11f20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22               "\"
11f30 20 64 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 5c   during cleanup\
11f40 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  n"]..        }..
11f50 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
11f60 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
11f70 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 66     # NOTE: The f
11f80 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
11f90 73 74 2c 20 73 75 63 63 65 73 73 21 0d 0a 20 20  st, success!..  
11fa0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
11fb0 20 73 65 74 20 63 6f 64 65 20 30 0d 0a 20 20 20   set code 0..   
11fc0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
11fd0 74 75 72 6e 20 24 63 6f 64 65 0d 0a 20 20 20 20  turn $code..    
11fe0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73  }.....    proc s
11ff0 65 74 75 70 44 62 49 6e 74 65 72 72 75 70 74 43  etupDbInterruptC
12000 61 6c 6c 62 61 63 6b 20 7b 20 63 68 61 6e 6e 65  allback { channe
12010 6c 20 6c 6f 67 20 7d 20 7b 0d 0a 20 20 20 20 20  l log } {..     
12020 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
12030 22 2d 2d 2d 2d 20 73 65 74 74 69 6e 67 20 75 70  "---- setting up
12040 20 64 65 62 75 67 67 65 72 20 69 6e 74 65 72 72   debugger interr
12050 75 70 74 20 63 61 6c 6c 62 61 63 6b 2e 2e 2e 20  upt callback... 
12060 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  "....      if {[
12070 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
12080 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
12090 54 45 3a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  TE: Make sure th
120a0 65 20 73 63 72 69 70 74 20 64 65 62 75 67 67 65  e script debugge
120b0 72 20 61 6e 64 20 74 68 65 20 69 73 6f 6c 61 74  r and the isolat
120c0 65 64 20 69 6e 74 65 72 70 72 65 74 65 72 20 61  ed interpreter a
120d0 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  re..        #   
120e0 20 20 20 20 73 65 74 75 70 20 61 6e 64 20 72 65      setup and re
120f0 61 64 79 20 66 6f 72 20 75 73 65 2e 0d 0a 20 20  ady for use...  
12100 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
12110 20 64 65 62 75 67 20 73 65 74 75 70 20 74 72 75   debug setup tru
12120 65 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20  e true....      
12130 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
12140 4f 54 45 3a 20 4c 6f 61 64 20 74 68 65 20 6e 65  OTE: Load the ne
12150 63 65 73 73 61 72 79 20 70 61 63 6b 61 67 65 73  cessary packages
12160 20 69 6e 74 6f 20 74 68 65 20 69 73 6f 6c 61 74   into the isolat
12170 65 64 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d  ed interpreter..
12180 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
12190 20 20 20 20 64 65 62 75 67 20 65 76 61 6c 20 7b      debug eval {
121a0 0d 0a 20 20 20 20 20 20 20 20 20 20 70 61 63 6b  ..          pack
121b0 61 67 65 20 72 65 71 75 69 72 65 20 45 61 67 6c  age require Eagl
121c0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 70 61 63  e..          pac
121d0 6b 61 67 65 20 72 65 71 75 69 72 65 20 45 61 67  kage require Eag
121e0 6c 65 2e 4c 69 62 72 61 72 79 0d 0a 20 20 20 20  le.Library..    
121f0 20 20 20 20 20 20 70 61 63 6b 61 67 65 20 72 65        package re
12200 71 75 69 72 65 20 45 61 67 6c 65 2e 54 65 73 74  quire Eagle.Test
12210 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
12220 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
12230 20 20 23 20 4e 4f 54 45 3a 20 43 6f 70 79 20 74    # NOTE: Copy t
12240 68 65 20 6e 65 63 65 73 73 61 72 79 20 76 61 72  he necessary var
12250 69 61 62 6c 65 73 20 69 6e 74 6f 20 74 68 65 20  iables into the 
12260 69 73 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72  isolated interpr
12270 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 23  eter...        #
12280 0d 0a 20 20 20 20 20 20 20 20 64 65 62 75 67 20  ..        debug 
12290 69 6e 76 6f 6b 65 20 30 20 73 65 74 20 3a 3a 74  invoke 0 set ::t
122a0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 63 68 61  est_channel $cha
122b0 6e 6e 65 6c 3b 20 23 20 4e 4f 54 45 3a 20 46 6f  nnel; # NOTE: Fo
122c0 72 20 5b 74 70 75 74 73 5d 2e 0d 0a 20 20 20 20  r [tputs]...    
122d0 20 20 20 20 64 65 62 75 67 20 69 6e 76 6f 6b 65      debug invoke
122e0 20 30 20 73 65 74 20 3a 3a 74 65 73 74 5f 6c 6f   0 set ::test_lo
122f0 67 20 24 6c 6f 67 3b 20 23 20 4e 4f 54 45 3a 20  g $log; # NOTE: 
12300 46 6f 72 20 5b 74 6c 6f 67 5d 2e 0d 0a 0d 0a 20  For [tlog]..... 
12310 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
12320 20 20 23 20 4e 4f 54 45 3a 20 49 6e 73 74 61 6c    # NOTE: Instal
12330 6c 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 73  l the callback s
12340 63 72 69 70 74 20 74 6f 20 62 65 20 65 76 61 6c  cript to be eval
12350 75 61 74 65 64 20 69 6e 20 74 68 65 20 69 73 6f  uated in the iso
12360 6c 61 74 65 64 0d 0a 20 20 20 20 20 20 20 20 23  lated..        #
12370 20 20 20 20 20 20 20 69 6e 74 65 72 70 72 65 74         interpret
12380 65 72 20 77 68 65 6e 20 74 68 69 73 20 69 6e 74  er when this int
12390 65 72 70 72 65 74 65 72 20 69 73 20 69 6e 74 65  erpreter is inte
123a0 72 72 75 70 74 65 64 20 62 79 20 73 63 72 69 70  rrupted by scrip
123b0 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
123c0 20 20 20 63 61 6e 63 65 6c 6c 61 74 69 6f 6e 2c     cancellation,
123d0 20 65 74 63 2e 0d 0a 20 20 20 20 20 20 20 20 23   etc...        #
123e0 0d 0a 20 20 20 20 20 20 20 20 64 65 62 75 67 20  ..        debug 
123f0 63 61 6c 6c 62 61 63 6b 20 61 70 70 6c 79 20 7b  callback apply {
12400 7b 73 65 6e 64 65 72 20 65 7d 20 7b 0d 0a 20 20  {sender e} {..  
12410 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
12420 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
12430 63 6b 20 69 66 20 74 68 69 73 20 63 61 6c 6c 62  ck if this callb
12440 61 63 6b 20 69 73 20 6f 6e 65 20 74 68 61 74 20  ack is one that 
12450 77 65 20 63 61 72 65 20 61 62 6f 75 74 2e 0d 0a  we care about...
12460 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
12470 20 20 20 20 20 20 20 69 66 20 7b 22 43 61 6e 63         if {"Canc
12480 65 6c 65 64 22 20 69 6e 20 5b 73 70 6c 69 74 20  eled" in [split 
12490 5b 24 65 20 49 6e 74 65 72 72 75 70 74 54 79 70  [$e InterruptTyp
124a0 65 5d 20 22 2c 20 22 5d 7d 20 74 68 65 6e 20 7b  e] ", "]} then {
124b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
124c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
124d0 4f 54 45 3a 20 49 74 65 72 61 74 65 20 74 68 72  OTE: Iterate thr
124e0 6f 75 67 68 20 61 6c 6c 20 64 61 74 61 62 61 73  ough all databas
124f0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6b 6e  e connections kn
12500 6f 77 6e 20 74 6f 20 74 68 65 0d 0a 20 20 20 20  own to the..    
12510 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
12520 70 61 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74  parent interpret
12530 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  er...           
12540 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
12550 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20 2d  object foreach -
12560 61 6c 69 61 73 20 70 61 69 72 20 5c 0d 0a 20 20  alias pair \..  
12570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 6f                [o
12580 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
12590 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 24  ags +NonPublic $
125a0 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e 63 6f  e Interpreter.co
125b0 6e 6e 65 63 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20  nnections] {..  
125c0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
125d0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
125e0 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20  OTE: Attempt to 
125f0 63 61 6e 63 65 6c 20 61 6e 79 20 53 51 4c 20 71  cancel any SQL q
12600 75 65 72 69 65 73 20 69 6e 20 70 72 6f 67 72 65  ueries in progre
12610 73 73 20 6f 6e 20 74 68 69 73 0d 0a 20 20 20 20  ss on this..    
12620 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
12630 20 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65    database conne
12640 63 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20  ction...        
12650 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
12660 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
12670 68 20 7b 24 70 61 69 72 20 56 61 6c 75 65 2e 43  h {$pair Value.C
12680 61 6e 63 65 6c 7d 20 65 72 72 6f 72 5d 7d 20 74  ancel} error]} t
12690 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
126a0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
126b0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
126c0 70 65 6e 64 41 72 67 73 20 5c 6e 20 5c 0d 0a 20  pendArgs \n \.. 
126d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126e0 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
126f0 3a 20 66 61 69 6c 65 64 20 74 6f 20 63 61 6e 63  : failed to canc
12700 65 6c 20 71 75 65 72 79 20 66 6f 72 20 63 6f 6e  el query for con
12710 6e 65 63 74 69 6f 6e 20 5c 22 22 20 5c 0d 0a 20  nection \"" \.. 
12720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12730 20 20 20 5b 24 70 61 69 72 20 4b 65 79 5d 20 22     [$pair Key] "
12740 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  \", error: " \n\
12750 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20  t $error \n]..  
12760 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
12770 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
12780 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
12790 20 20 20 7d 7d 0d 0a 20 20 20 20 20 20 7d 20 65     }}..      } e
127a0 72 72 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  rror] == 0} then
127b0 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43   {..        addC
127c0 6f 6e 73 74 72 61 69 6e 74 20 69 6e 74 65 72 72  onstraint interr
127d0 75 70 74 43 61 6c 6c 62 61 63 6b 2e 73 71 6c 69  uptCallback.sqli
127e0 74 65 33 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74  te3....        t
127f0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65  puts $channel ye
12800 73 5c 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  s\n..      } els
12810 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e {..        tpu
12820 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
12830 65 6e 64 41 72 67 73 20 22 6e 6f 2c 20 65 72 72  endArgs "no, err
12840 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f  or: " \n\t $erro
12850 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  r \n]..      }..
12860 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
12870 6f 63 20 63 6c 65 61 6e 75 70 46 69 6c 65 20 7b  oc cleanupFile {
12880 20 66 69 6c 65 4e 61 6d 65 20 7b 63 6f 6c 6c 65   fileName {colle
12890 63 74 20 74 72 75 65 7d 20 7b 66 6f 72 63 65 20  ct true} {force 
128a0 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20  false} } {..    
128b0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
128c0 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 66 6f  E: Attempt to fo
128d0 72 63 65 20 61 6c 6c 20 70 65 6e 64 69 6e 67 20  rce all pending 
128e0 22 67 61 72 62 61 67 65 22 20 6f 62 6a 65 63 74  "garbage" object
128f0 73 20 74 6f 20 62 65 20 63 6f 6c 6c 65 63 74 65  s to be collecte
12900 64 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  d,..      #     
12910 20 20 69 6e 63 6c 75 64 69 6e 67 20 53 51 4c 69    including SQLi
12920 74 65 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6e  te statements an
12930 64 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73  d backup objects
12940 3b 20 74 68 69 73 20 73 68 6f 75 6c 64 20 61 6c  ; this should al
12950 6c 6f 77 0d 0a 20 20 20 20 20 20 23 20 20 20 20  low..      #    
12960 20 20 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e     the underlyin
12970 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
12980 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 0d 0a  to be deleted...
12990 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
129a0 66 20 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65  f {$collect} the
129b0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c  n {..        col
129c0 6c 65 63 74 47 61 72 62 61 67 65 20 24 3a 3a 74  lectGarbage $::t
129d0 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20  est_channel..   
129e0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
129f0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43  .      # NOTE: C
12a00 68 65 63 6b 20 69 66 20 74 68 65 20 66 69 6c 65  heck if the file
12a10 20 73 74 69 6c 6c 20 65 78 69 73 74 73 2e 0d 0a   still exists...
12a20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
12a30 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20  f {[file exists 
12a40 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  $fileName]} then
12a50 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
12a60 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
12a70 6b 69 70 20 64 65 6c 65 74 69 6e 67 20 74 65 73  kip deleting tes
12a80 74 20 66 69 6c 65 73 20 69 66 20 73 6f 6d 65 62  t files if someb
12a90 6f 64 79 20 73 65 74 73 20 74 68 65 20 67 6c 6f  ody sets the glo
12aa0 62 61 6c 20 76 61 72 69 61 62 6c 65 0d 0a 20 20  bal variable..  
12ab0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f        #       to
12ac0 20 70 72 65 76 65 6e 74 20 69 74 2e 0d 0a 20 20   prevent it...  
12ad0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
12ae0 20 69 66 20 7b 24 66 6f 72 63 65 20 7c 7c 20 21   if {$force || !
12af0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
12b00 6f 28 63 6c 65 61 6e 75 70 46 69 6c 65 29 5d 7d  o(cleanupFile)]}
12b10 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
12b20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
12b30 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
12b40 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  to delete the te
12b50 73 74 20 66 69 6c 65 20 6e 6f 77 2e 0d 0a 20 20  st file now...  
12b60 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
12b70 20 20 20 20 20 69 66 20 7b 5b 73 65 74 20 63 6f       if {[set co
12b80 64 65 20 5b 63 61 74 63 68 20 7b 66 69 6c 65 20  de [catch {file 
12b90 64 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65  delete $fileName
12ba0 7d 20 65 72 72 6f 72 5d 5d 7d 20 74 68 65 6e 20  } error]]} then 
12bb0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  {..            #
12bc0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
12bd0 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77  NOTE: We somehow
12be0 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74   failed to delet
12bf0 65 20 74 68 65 20 66 69 6c 65 2c 20 72 65 70 6f  e the file, repo
12c00 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20  rt why...       
12c10 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
12c20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
12c30 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
12c40 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
12c50 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
12c60 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
12c70 6f 20 64 65 6c 65 74 65 20 74 65 73 74 20 66 69  o delete test fi
12c80 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65  le \"" $fileName
12c90 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
12ca0 20 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63      "\" during c
12cb0 6c 65 61 6e 75 70 2c 20 65 72 72 6f 72 3a 20 22  leanup, error: "
12cc0 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d   \n\t $error \n]
12cd0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
12ce0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
12cf0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
12d00 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
12d10 53 68 6f 77 20 74 68 61 74 20 77 65 20 73 6b 69  Show that we ski
12d20 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20 74 68  pped deleting th
12d30 65 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20  e file...       
12d40 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
12d50 73 65 74 20 63 6f 64 65 20 30 0d 0a 0d 0a 20 20  set code 0....  
12d60 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
12d70 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
12d80 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
12d90 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
12da0 20 57 41 52 4e 49 4e 47 3a 20 73 6b 69 70 70 65   WARNING: skippe
12db0 64 20 64 65 6c 65 74 69 6e 67 20 74 65 73 74 20  d deleting test 
12dc0 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61  file \"" $fileNa
12dd0 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
12de0 20 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63      "\" during c
12df0 6c 65 61 6e 75 70 5c 6e 22 5d 0d 0a 20 20 20 20  leanup\n"]..    
12e00 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65      }..      } e
12e10 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
12e20 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
12e30 3a 20 54 68 65 20 66 69 6c 65 20 64 6f 65 73 20  : The file does 
12e40 6e 6f 74 20 65 78 69 73 74 2c 20 73 75 63 63 65  not exist, succe
12e50 73 73 21 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ss!..        #..
12e60 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 64 65          set code
12e70 20 30 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   0..      }.... 
12e80 20 20 20 20 20 72 65 74 75 72 6e 20 24 63 6f 64       return $cod
12e90 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  e..    }.....   
12ea0 20 70 72 6f 63 20 63 6f 6c 6c 65 63 74 47 61 72   proc collectGar
12eb0 62 61 67 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7b  bage { channel {
12ec0 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 31 30 30  milliseconds 100
12ed0 30 7d 20 7b 71 75 69 65 74 20 74 72 75 65 7d 20  0} {quiet true} 
12ee0 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  } {..      if {[
12ef0 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e  catch {object in
12f00 76 6f 6b 65 20 47 43 20 47 65 74 54 6f 74 61 6c  voke GC GetTotal
12f10 4d 65 6d 6f 72 79 20 66 61 6c 73 65 7d 20 72 65  Memory false} re
12f20 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sult] == 0} then
12f30 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
12f40 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
12f50 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
12f60 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
12f70 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
12f80 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6d 65 6d         "---- mem
12f90 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 74 68  ory in use by th
12fa0 65 20 43 4c 52 20 62 65 66 6f 72 65 20 63 6f 6c  e CLR before col
12fb0 6c 65 63 74 69 6f 6e 2e 2e 2e 20 22 20 5c 0d 0a  lection... " \..
12fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 72                $r
12fd0 65 73 75 6c 74 20 22 20 62 79 74 65 73 5c 6e 22  esult " bytes\n"
12fe0 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
12ff0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
13000 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
13010 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
13020 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
13030 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
13040 61 69 6c 65 64 20 74 6f 20 67 65 74 20 43 4c 52  ailed to get CLR
13050 20 6d 65 6d 6f 72 79 20 75 73 61 67 65 2c 20 65   memory usage, e
13060 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20  rror: " \..     
13070 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73         \n\t $res
13080 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d  ult \n]..      }
13090 0d 0a 0d 0a 20 20 20 20 20 20 23 23 23 23 23 23  ....      ######
130a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
130b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
130c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
130d0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
130e0 23 23 23 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  ###....      #..
130f0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
13100 70 65 61 74 65 64 6c 79 20 61 74 74 65 6d 70 74  peatedly attempt
13110 20 74 6f 20 63 6f 6c 6c 65 63 74 20 67 61 72 62   to collect garb
13120 61 67 65 20 75 6e 74 69 6c 20 74 68 65 20 61 6c  age until the al
13130 6c 6f 74 74 65 64 20 6e 75 6d 62 65 72 0d 0a 20  lotted number.. 
13140 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 66 20       #       of 
13150 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 68 61 73  milliseconds has
13160 20 65 6c 61 70 73 65 64 2e 20 20 41 6c 77 61 79   elapsed.  Alway
13170 73 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6f 6c  s attempt to col
13180 6c 65 63 74 20 67 61 72 62 61 67 65 0d 0a 20 20  lect garbage..  
13190 20 20 20 20 23 20 20 20 20 20 20 20 61 74 20 6c      #       at l
131a0 65 61 73 74 20 6f 6e 63 65 2e 0d 0a 20 20 20 20  east once...    
131b0 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 73    #..      set s
131c0 74 61 72 74 20 5b 63 6c 6f 63 6b 20 73 65 63 6f  tart [clock seco
131d0 6e 64 73 5d 0d 0a 20 20 20 20 20 20 73 65 74 20  nds]..      set 
131e0 73 74 6f 70 20 5b 65 78 70 72 20 7b 24 73 74 61  stop [expr {$sta
131f0 72 74 20 2b 20 28 24 6d 69 6c 6c 69 73 65 63 6f  rt + ($milliseco
13200 6e 64 73 20 2f 20 31 30 30 30 29 7d 5d 0d 0a 0d  nds / 1000)}]...
13210 0a 20 20 20 20 20 20 64 6f 20 7b 0d 0a 20 20 20  .      do {..   
13220 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
13230 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
13240 74 6f 20 66 6f 72 63 65 20 61 20 66 75 6c 6c 20  to force a full 
13250 67 61 72 62 61 67 65 20 63 6f 6c 6c 65 63 74 69  garbage collecti
13260 6f 6e 20 6e 6f 77 2e 20 20 52 65 70 6f 72 74 20  on now.  Report 
13270 61 6e 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20  any..        #  
13280 20 20 20 20 20 65 72 72 6f 72 20 74 68 61 74 20       error that 
13290 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69  is encountered i
132a0 66 20 77 65 20 66 61 69 6c 2e 0d 0a 20 20 20 20  f we fail...    
132b0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
132c0 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63  f {[catch {objec
132d0 74 20 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54  t invoke GC GetT
132e0 6f 74 61 6c 4d 65 6d 6f 72 79 20 74 72 75 65 7d  otalMemory true}
132f0 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d   error]} then {.
13300 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
13310 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
13320 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
13330 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
13340 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 66 75 6c  NING: failed ful
13350 6c 20 67 61 72 62 61 67 65 20 63 6f 6c 6c 65 63  l garbage collec
13360 74 69 6f 6e 2c 20 65 72 72 6f 72 3a 20 22 20 5c  tion, error: " \
13370 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
13380 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
13390 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
133a0 20 20 20 20 20 20 73 65 74 20 6e 6f 77 20 5b 63        set now [c
133b0 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 0d 0a 20  lock seconds].. 
133c0 20 20 20 20 20 7d 20 77 68 69 6c 65 20 7b 24 73       } while {$s
133d0 74 61 72 74 20 3c 3d 20 24 6e 6f 77 20 26 26 20  tart <= $now && 
133e0 24 6e 6f 77 20 3c 20 24 73 74 6f 70 7d 0d 0a 0d  $now < $stop}...
133f0 0a 20 20 20 20 20 20 23 23 23 23 23 23 23 23 23  .      #########
13400 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13410 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13420 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13430 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13440 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63  ....      if {[c
13450 61 74 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76  atch {object inv
13460 6f 6b 65 20 47 43 20 47 65 74 54 6f 74 61 6c 4d  oke GC GetTotalM
13470 65 6d 6f 72 79 20 66 61 6c 73 65 7d 20 72 65 73  emory false} res
13480 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ult] == 0} then 
13490 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  {..        if {!
134a0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
134b0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
134c0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
134d0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
134e0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6d 65 6d 6f        "---- memo
134f0 72 79 20 69 6e 20 75 73 65 20 62 79 20 74 68 65  ry in use by the
13500 20 43 4c 52 20 61 66 74 65 72 20 63 6f 6c 6c 65   CLR after colle
13510 63 74 69 6f 6e 2e 2e 2e 20 22 20 5c 0d 0a 20 20  ction... " \..  
13520 20 20 20 20 20 20 20 20 20 20 20 20 24 72 65 73              $res
13530 75 6c 74 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d  ult " bytes\n"].
13540 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
13550 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
13560 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
13570 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
13580 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 3d  ..            "=
13590 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
135a0 6c 65 64 20 74 6f 20 67 65 74 20 43 4c 52 20 6d  led to get CLR m
135b0 65 6d 6f 72 79 20 75 73 61 67 65 2c 20 65 72 72  emory usage, err
135c0 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  or: " \..       
135d0 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c       \n\t $resul
135e0 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  t \n]..      }..
135f0 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
13600 6f 63 20 67 65 74 53 51 4c 69 74 65 48 61 6e 64  oc getSQLiteHand
13610 6c 65 43 6f 75 6e 74 73 20 7b 20 63 68 61 6e 6e  leCounts { chann
13620 65 6c 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d  el {quiet false}
13630 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20   } {..      set 
13640 72 65 73 75 6c 74 20 5b 6c 69 73 74 5d 0d 0a 0d  result [list]...
13650 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65  .      if {[have
13660 43 6f 6e 73 74 72 61 69 6e 74 20 5c 0d 0a 20 20  Constraint \..  
13670 20 20 20 20 20 20 20 20 20 20 20 20 64 65 66 69              defi
13680 6e 65 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74 65  neConstant.Syste
13690 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 43 4f  m.Data.SQLite.CO
136a0 55 4e 54 5f 48 41 4e 44 4c 45 5d 7d 20 74 68 65  UNT_HANDLE]} the
136b0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
136c0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
136d0 41 64 64 20 65 61 63 68 20 63 72 69 74 69 63 61  Add each critica
136e0 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 20 74  l handle count t
136f0 6f 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20  o the resulting 
13700 6c 69 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  list...        #
13710 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  ..        foreac
13720 68 20 6e 61 6d 65 20 5b 6c 69 73 74 20 63 6f 6e  h name [list con
13730 6e 65 63 74 69 6f 6e 43 6f 75 6e 74 20 73 74 61  nectionCount sta
13740 74 65 6d 65 6e 74 43 6f 75 6e 74 20 62 61 63 6b  tementCount back
13750 75 70 43 6f 75 6e 74 5d 20 7b 0d 0a 20 20 20 20  upCount] {..    
13760 20 20 20 20 20 20 73 65 74 20 76 61 6c 75 65 20        set value 
13770 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d  [object invoke -
13780 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
13790 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
137a0 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
137b0 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76  Lite.UnsafeNativ
137c0 65 4d 65 74 68 6f 64 73 20 24 6e 61 6d 65 5d 0d  eMethods $name].
137d0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
137e0 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
137f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
13800 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
13810 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
13820 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
13830 2d 20 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c  - critical handl
13840 65 20 63 6f 75 6e 74 20 5c 22 22 20 24 6e 61 6d  e count \"" $nam
13850 65 20 22 5c 22 20 69 73 20 22 20 24 76 61 6c 75  e "\" is " $valu
13860 65 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  e \n]..         
13870 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
13880 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 24  lappend result $
13890 76 61 6c 75 65 0d 0a 20 20 20 20 20 20 20 20 7d  value..        }
138a0 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66  ..      } elseif
138b0 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
138c0 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
138d0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
138e0 65 20 61 63 74 75 61 6c 20 68 61 6e 64 6c 65 20  e actual handle 
138f0 63 6f 75 6e 74 73 20 61 72 65 20 6e 6f 74 20 61  counts are not a
13900 76 61 69 6c 61 62 6c 65 3b 20 74 68 65 72 65 66  vailable; theref
13910 6f 72 65 2c 20 6a 75 73 74 0d 0a 20 20 20 20 20  ore, just..     
13920 20 20 20 23 20 20 20 20 20 20 20 72 65 74 75 72     #       retur
13930 6e 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e  n an empty list.
13940 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
13950 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
13960 6e 65 6c 20 22 2d 2d 2d 2d 20 63 72 69 74 69 63  nel "---- critic
13970 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 73  al handle counts
13980 20 75 6e 61 76 61 69 6c 61 62 6c 65 5c 6e 22 0d   unavailable\n".
13990 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
139a0 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74    return $result
139b0 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
139c0 70 72 6f 63 20 73 68 75 74 64 6f 77 6e 53 51 4c  proc shutdownSQL
139d0 69 74 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 66  ite { channel {f
139e0 6f 72 63 65 20 66 61 6c 73 65 7d 20 7b 71 75 69  orce false} {qui
139f0 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  et false} } {.. 
13a00 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
13a10 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75 72 65 20  NOTE: Make sure 
13a20 74 68 61 74 20 53 51 4c 69 74 65 20 63 6f 72 65  that SQLite core
13a30 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d 70   library is comp
13a40 6c 65 74 65 6c 79 20 73 68 75 74 64 6f 77 6e 2e  letely shutdown.
13a50 20 20 54 68 69 73 0d 0a 20 20 20 20 20 20 23 20    This..      # 
13a60 20 20 20 20 20 20 69 73 20 75 73 65 64 20 62 79        is used by
13a70 20 74 65 73 74 73 20 74 68 61 74 20 63 68 61 6e   tests that chan
13a80 67 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ge configuration
13a90 20 6f 70 74 69 6f 6e 73 20 61 6e 64 2f 6f 72 20   options and/or 
13aa0 74 68 6f 73 65 0d 0a 20 20 20 20 20 20 23 20 20  those..      #  
13ab0 20 20 20 20 20 74 68 61 74 20 6e 65 65 64 20 74       that need t
13ac0 6f 20 6d 61 6b 65 20 73 75 72 65 20 6c 6f 67 67  o make sure logg
13ad0 69 6e 67 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ing is initializ
13ae0 65 64 20 28 69 2e 65 2e 20 6a 75 73 74 20 69 6e  ed (i.e. just in
13af0 20 63 61 73 65 0d 0a 20 20 20 20 20 20 23 20 20   case..      #  
13b00 20 20 20 20 20 74 68 65 20 53 51 4c 69 74 65 20       the SQLite 
13b10 63 6f 72 65 20 6c 69 62 72 61 72 79 20 77 61 73  core library was
13b20 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 69 6e 20   initialized in 
13b30 74 68 65 20 70 72 6f 63 65 73 73 20 70 72 69 6f  the process prio
13b40 72 20 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20  r to..      #   
13b50 20 20 20 20 74 68 65 20 53 51 4c 69 74 65 4c 6f      the SQLiteLo
13b60 67 20 63 6c 61 73 73 20 62 65 69 6e 67 20 61 62  g class being ab
13b70 6c 65 20 74 6f 20 73 65 74 75 70 20 69 74 73 20  le to setup its 
13b80 6c 6f 67 67 69 6e 67 20 63 61 6c 6c 62 61 63 6b  logging callback
13b90 29 2e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  )...      #     
13ba0 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73    Normally, this
13bb0 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
13bc0 70 65 72 66 6f 72 6d 65 64 20 69 66 20 53 51 4c  performed if SQL
13bd0 69 74 65 20 69 73 20 6c 6f 61 64 65 64 20 61 6e  ite is loaded an
13be0 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
13bf0 20 72 65 61 64 79 20 66 6f 72 20 75 73 65 20 62   ready for use b
13c00 79 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  y the test suite
13c10 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
13c20 20 20 69 66 20 7b 24 66 6f 72 63 65 20 7c 7c 20    if {$force || 
13c30 5b 69 73 53 51 4c 69 74 65 52 65 61 64 79 5d 7d  [isSQLiteReady]}
13c40 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
13c50 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 42 55   #..        # BU
13c60 47 46 49 58 3a 20 4d 61 6b 65 20 73 75 72 65 20  GFIX: Make sure 
13c70 74 68 61 74 20 61 6e 79 20 22 6c 65 61 6b 65 64  that any "leaked
13c80 22 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  " transactions a
13c90 6e 64 2f 6f 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  nd/or connection
13ca0 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  s..        #    
13cb0 20 20 20 20 20 61 72 65 20 63 6c 65 61 6e 65 64       are cleaned
13cc0 20 75 70 20 62 65 66 6f 72 65 20 63 61 6c 6c 69   up before calli
13cd0 6e 67 20 74 68 65 20 6e 61 74 69 76 65 20 73 68  ng the native sh
13ce0 75 74 64 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 2e  utdown function.
13cf0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
13d00 20 20 20 20 20 66 6f 72 65 61 63 68 20 74 72 61       foreach tra
13d10 6e 73 61 63 74 69 6f 6e 20 5b 69 6e 66 6f 20 74  nsaction [info t
13d20 72 61 6e 73 61 63 74 69 6f 6e 73 5d 20 7b 0d 0a  ransactions] {..
13d30 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73            if {[s
13d40 74 72 69 6e 67 20 6d 61 74 63 68 20 5c 0d 0a 20  tring match \.. 
13d50 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
13d60 74 65 6d 23 44 61 74 61 23 53 51 4c 69 74 65 23  tem#Data#SQLite#
13d70 53 51 4c 69 74 65 54 72 61 6e 73 61 63 74 69 6f  SQLiteTransactio
13d80 6e 23 2a 20 24 74 72 61 6e 73 61 63 74 69 6f 6e  n#* $transaction
13d90 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
13da0 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
13db0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
13dc0 20 20 20 73 71 6c 20 74 72 61 6e 73 61 63 74 69     sql transacti
13dd0 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 24 74 72 61  on rollback $tra
13de0 6e 73 61 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20  nsaction..      
13df0 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d 20 3d        } error] =
13e00 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
13e10 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
13e20 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
13e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e40 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
13e50 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
13e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e70 20 20 22 2d 2d 2d 2d 20 72 6f 6c 6c 65 64 20 62    "---- rolled b
13e80 61 63 6b 20 6c 65 61 6b 65 64 20 74 72 61 6e 73  ack leaked trans
13e90 61 63 74 69 6f 6e 20 5c 22 22 20 5c 0d 0a 20 20  action \"" \..  
13ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13eb0 20 20 24 74 72 61 6e 73 61 63 74 69 6f 6e 20 5c    $transaction \
13ec0 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  "\n]..          
13ed0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
13ee0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
13ef0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
13f00 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
13f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
13f30 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
13f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f50 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
13f60 20 66 61 69 6c 65 64 20 74 6f 20 72 6f 6c 6c 62   failed to rollb
13f70 61 63 6b 20 6c 65 61 6b 65 64 20 74 72 61 6e 73  ack leaked trans
13f80 61 63 74 69 6f 6e 20 5c 22 22 20 5c 0d 0a 20 20  action \"" \..  
13f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fa0 20 20 24 74 72 61 6e 73 61 63 74 69 6f 6e 20 22    $transaction "
13fb0 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  \", error: " \n\
13fc0 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20  t $error \n]..  
13fd0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
13fe0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
13ff0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
14000 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
14010 66 6f 72 65 61 63 68 20 64 62 20 5b 69 6e 66 6f  foreach db [info
14020 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 5d 20 7b 0d   connections] {.
14030 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
14040 73 74 72 69 6e 67 20 6d 61 74 63 68 20 5c 0d 0a  string match \..
14050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
14060 73 74 65 6d 23 44 61 74 61 23 53 51 4c 69 74 65  stem#Data#SQLite
14070 23 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f  #SQLiteConnectio
14080 6e 23 2a 20 24 64 62 5d 7d 20 74 68 65 6e 20 7b  n#* $db]} then {
14090 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
140a0 20 7b 5b 63 61 74 63 68 20 7b 73 71 6c 20 63 6c   {[catch {sql cl
140b0 6f 73 65 20 24 64 62 7d 20 65 72 72 6f 72 5d 20  ose $db} error] 
140c0 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
140d0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
140e0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
140f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14100 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
14110 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
14120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14130 20 20 20 22 2d 2d 2d 2d 20 63 6c 6f 73 65 64 20     "---- closed 
14140 6c 65 61 6b 65 64 20 64 61 74 61 62 61 73 65 20  leaked database 
14150 5c 22 22 20 24 64 62 20 5c 22 5c 6e 5d 0d 0a 20  \"" $db \"\n].. 
14160 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
14170 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
14180 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
14190 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
141a0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
141b0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
141c0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
141d0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
141e0 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
141f0 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
14200 20 74 6f 20 63 6c 6f 73 65 20 6c 65 61 6b 65 64   to close leaked
14210 20 64 61 74 61 62 61 73 65 20 5c 22 22 20 5c 0d   database \"" \.
14220 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14230 20 20 20 20 20 24 64 62 20 22 5c 22 2c 20 65 72       $db "\", er
14240 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72  ror: " \n\t $err
14250 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  or \n]..        
14260 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
14270 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
14280 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
14290 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
142a0 20 20 20 20 20 23 20 42 55 47 46 49 58 3a 20 42       # BUGFIX: B
142b0 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68  efore calling th
142c0 65 20 6e 61 74 69 76 65 20 73 68 75 74 64 6f 77  e native shutdow
142d0 6e 20 66 75 6e 63 74 69 6f 6e 2c 20 6d 61 6b 65  n function, make
142e0 20 73 75 72 65 20 62 6f 74 68 0d 0a 20 20 20 20   sure both..    
142f0 20 20 20 20 23 20 20 20 20 20 20 20 20 20 6f 66      #         of
14300 20 74 68 65 20 50 52 41 47 4d 41 20 72 65 6c 61   the PRAGMA rela
14310 74 65 64 20 64 69 72 65 63 74 6f 72 79 20 6e 61  ted directory na
14320 6d 65 73 20 61 72 65 20 66 72 65 65 64 2e 0d 0a  mes are freed...
14330 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
14340 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74     checkForSQLit
14350 65 44 69 72 65 63 74 6f 72 69 65 73 20 24 63 68  eDirectories $ch
14360 61 6e 6e 65 6c 20 74 72 75 65 0d 0a 0d 0a 20 20  annel true....  
14370 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
14380 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62   {..          ob
14390 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
143a0 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
143b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  .              S
143c0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
143d0 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  e.UnsafeNativeMe
143e0 74 68 6f 64 73 20 73 71 6c 69 74 65 33 5f 73 68  thods sqlite3_sh
143f0 75 74 64 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20  utdown..        
14400 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20  } result] == 0} 
14410 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
14420 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
14430 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
14440 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
14450 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
14460 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14470 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69   "---- call sqli
14480 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 2e 2e  te3_shutdown()..
14490 2e 20 6f 6b 3a 20 22 20 24 72 65 73 75 6c 74 20  . ok: " $result 
144a0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
144b0 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
144c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
144d0 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
144e0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
144f0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
14500 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
14510 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
14520 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f  -- call sqlite3_
14530 73 68 75 74 64 6f 77 6e 28 29 2e 2e 2e 20 65 72  shutdown()... er
14540 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65 73  ror: " \n\t $res
14550 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ult \n]..       
14560 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
14570 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
14580 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 65 70  ....    proc rep
14590 6f 72 74 53 51 4c 69 74 65 52 65 73 6f 75 72 63  ortSQLiteResourc
145a0 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
145b0 20 20 63 68 61 6e 6e 65 6c 20 7b 71 75 69 65 74    channel {quiet
145c0 20 66 61 6c 73 65 7d 20 7b 72 65 73 65 74 20 74   false} {reset t
145d0 72 75 65 7d 20 7b 63 6f 6c 6c 65 63 74 20 74 72  rue} {collect tr
145e0 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ue} } {..      #
145f0 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
14600 49 66 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65  If available, re
14610 70 6f 72 74 20 6f 6e 20 28 61 6e 64 20 70 6f 73  port on (and pos
14620 73 69 62 6c 79 20 72 65 73 65 74 29 20 74 68 65  sibly reset) the
14630 20 72 75 6e 74 69 6d 65 0d 0a 20 20 20 20 20 20   runtime..      
14640 23 20 20 20 20 20 20 20 63 6f 6e 66 69 67 75 72  #       configur
14650 61 74 69 6f 6e 20 73 74 61 74 69 73 74 69 63 73  ation statistics
14660 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
14670 20 20 69 66 20 7b 5b 68 61 76 65 43 6f 6e 73 74    if {[haveConst
14680 72 61 69 6e 74 20 62 75 69 6c 64 43 6f 6e 66 69  raint buildConfi
14690 67 75 72 61 74 69 6f 6e 2e 44 65 62 75 67 5d 20  guration.Debug] 
146a0 26 26 20 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  && [catch {..   
146b0 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
146c0 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
146d0 62 6c 69 63 20 2d 61 6c 69 61 73 20 5c 0d 0a 20  blic -alias \.. 
146e0 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
146f0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e  m.Data.SQLite.Un
14700 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
14710 73 20 73 65 74 74 69 6e 67 52 65 61 64 43 6f 75  s settingReadCou
14720 6e 74 73 0d 0a 20 20 20 20 20 20 7d 20 73 65 74  nts..      } set
14730 74 69 6e 67 52 65 61 64 43 6f 75 6e 74 73 5d 20  tingReadCounts] 
14740 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
14750 20 20 20 20 20 20 73 65 74 20 6e 61 6d 65 43 6f        set nameCo
14760 75 6e 74 20 5b 24 73 65 74 74 69 6e 67 52 65 61  unt [$settingRea
14770 64 43 6f 75 6e 74 73 20 43 6f 75 6e 74 5d 0d 0a  dCounts Count]..
14780 20 20 20 20 20 20 20 20 73 65 74 20 76 61 6c 75          set valu
14790 65 43 6f 75 6e 74 20 30 0d 0a 0d 0a 20 20 20 20  eCount 0....    
147a0 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61      object forea
147b0 63 68 20 2d 61 6c 69 61 73 20 70 61 69 72 20 24  ch -alias pair $
147c0 73 65 74 74 69 6e 67 52 65 61 64 43 6f 75 6e 74  settingReadCount
147d0 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  s {..          i
147e0 6e 63 72 20 76 61 6c 75 65 43 6f 75 6e 74 20 5b  ncr valueCount [
147f0 24 70 61 69 72 20 56 61 6c 75 65 5d 0d 0a 0d 0a  $pair Value]....
14800 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
14810 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
14820 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
14830 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
14840 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
14850 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
14860 65 74 74 69 6e 67 20 5c 22 22 20 5b 24 70 61 69  etting \"" [$pai
14870 72 20 4b 65 79 5d 20 22 5c 22 20 77 61 73 20 72  r Key] "\" was r
14880 65 61 64 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  ead " \..       
14890 20 20 20 20 20 20 20 20 20 5b 24 70 61 69 72 20           [$pair 
148a0 56 61 6c 75 65 5d 20 22 20 74 69 6d 65 73 5c 6e  Value] " times\n
148b0 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  "]..          }.
148c0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
148d0 20 20 20 20 20 20 69 66 20 7b 24 72 65 73 65 74        if {$reset
148e0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
148f0 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
14900 24 73 65 74 74 69 6e 67 52 65 61 64 43 6f 75 6e  $settingReadCoun
14910 74 73 20 43 6c 65 61 72 7d 20 65 72 72 6f 72 5d  ts Clear} error]
14920 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
14930 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
14940 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
14950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
14960 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
14970 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
14980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
14990 2d 2d 2d 20 72 65 73 65 74 20 73 65 74 74 69 6e  --- reset settin
149a0 67 20 73 74 61 74 69 73 74 69 63 73 20 66 6f 72  g statistics for
149b0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 22 20   the previous " 
149c0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
149d0 20 20 20 20 20 24 6e 61 6d 65 43 6f 75 6e 74 20       $nameCount 
149e0 22 20 6e 61 6d 65 73 20 61 6e 64 20 22 20 24 76  " names and " $v
149f0 61 6c 75 65 43 6f 75 6e 74 20 22 20 76 61 6c 75  alueCount " valu
14a00 65 73 20 72 65 61 64 5c 6e 22 5d 0d 0a 20 20 20  es read\n"]..   
14a10 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
14a20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
14a30 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
14a40 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
14a50 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
14a60 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
14a70 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
14a80 74 6f 20 72 65 73 65 74 20 73 65 74 74 69 6e 67  to reset setting
14a90 20 73 74 61 74 69 73 74 69 63 73 20 66 6f 72 20   statistics for 
14aa0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
14ab0 20 20 20 20 20 22 74 68 65 20 70 72 65 76 69 6f       "the previo
14ac0 75 73 20 22 20 24 6e 61 6d 65 43 6f 75 6e 74 20  us " $nameCount 
14ad0 22 20 6e 61 6d 65 73 20 61 6e 64 20 22 20 24 76  " names and " $v
14ae0 61 6c 75 65 43 6f 75 6e 74 20 5c 0d 0a 20 20 20  alueCount \..   
14af0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 76               " v
14b00 61 6c 75 65 73 20 72 65 61 64 2c 20 65 72 72 6f  alues read, erro
14b10 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72  r: " \n\t $error
14b20 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
14b30 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
14b40 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69      }....      i
14b50 66 20 7b 5b 68 61 76 65 43 6f 6e 73 74 72 61 69  f {[haveConstrai
14b60 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  nt \..          
14b70 20 20 20 20 64 65 66 69 6e 65 43 6f 6e 73 74 61      defineConsta
14b80 6e 74 2e 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  nt.System.Data.S
14b90 51 4c 69 74 65 2e 49 4e 54 45 52 4f 50 5f 56 49  QLite.INTEROP_VI
14ba0 52 54 55 41 4c 5f 54 41 42 4c 45 5d 20 26 26 20  RTUAL_TABLE] && 
14bb0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 68 61  \..          [ha
14bc0 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5c 0d 0a  veConstraint \..
14bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65                de
14be0 66 69 6e 65 43 6f 6e 73 74 61 6e 74 2e 53 79 73  fineConstant.Sys
14bf0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
14c00 54 52 41 43 4b 5f 4d 45 4d 4f 52 59 5f 42 59 54  TRACK_MEMORY_BYT
14c10 45 53 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ES]} then {..   
14c20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
14c30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
14c40 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
14c50 65 6c 20 22 2d 2d 2d 2d 20 63 75 72 72 65 6e 74  el "---- current
14c60 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62   memory in use b
14c70 79 20 53 51 4c 69 74 65 4d 65 6d 6f 72 79 2e 2e  y SQLiteMemory..
14c80 2e 20 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  . "..        }..
14c90 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
14ca0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
14cb0 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
14cc0 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
14cd0 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
14ce0 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
14cf0 51 4c 69 74 65 2e 53 51 4c 69 74 65 4d 65 6d 6f  QLite.SQLiteMemo
14d00 72 79 20 62 79 74 65 73 41 6c 6c 6f 63 61 74 65  ry bytesAllocate
14d10 64 0d 0a 20 20 20 20 20 20 20 20 7d 20 6d 65 6d  d..        } mem
14d20 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ory] == 0} then 
14d30 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
14d40 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
14d50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
14d60 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
14d70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79  pendArgs $memory
14d80 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20   " bytes\n"]..  
14d90 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
14da0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
14db0 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72         set memor
14dc0 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20  y unknown....   
14dd0 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
14de0 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
14df0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
14e00 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
14e10 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a  gs $memory \n]..
14e20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
14e30 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
14e40 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
14e50 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
14e60 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
14e70 22 2d 2d 2d 2d 20 6d 61 78 69 6d 75 6d 20 6d 65  "---- maximum me
14e80 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 53  mory in use by S
14e90 51 4c 69 74 65 4d 65 6d 6f 72 79 2e 2e 2e 20 22  QLiteMemory... "
14ea0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
14eb0 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
14ec0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f  h {..          o
14ed0 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
14ee0 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
14ef0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
14f00 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
14f10 74 65 2e 53 51 4c 69 74 65 4d 65 6d 6f 72 79 20  te.SQLiteMemory 
14f20 6d 61 78 69 6d 75 6d 42 79 74 65 73 41 6c 6c 6f  maximumBytesAllo
14f30 63 61 74 65 64 0d 0a 20 20 20 20 20 20 20 20 7d  cated..        }
14f40 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74   memory] == 0} t
14f50 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
14f60 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
14f70 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
14f80 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
14f90 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65   [appendArgs $me
14fa0 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e 22 5d  mory " bytes\n"]
14fb0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
14fc0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
14fd0 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6d  .          set m
14fe0 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d  emory unknown...
14ff0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
15000 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
15010 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
15020 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
15030 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c  ndArgs $memory \
15040 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
15050 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
15060 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
15070 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
15080 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
15090 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63  $channel "---- c
150a0 75 72 72 65 6e 74 20 6d 65 6d 6f 72 79 20 69 6e  urrent memory in
150b0 20 75 73 65 20 62 79 20 53 51 4c 69 74 65 2e 2e   use by SQLite..
150c0 2e 20 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  . "..      }....
150d0 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
150e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65   {..        obje
150f0 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
15100 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
15110 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
15120 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e  m.Data.SQLite.Un
15130 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
15140 73 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79  s sqlite3_memory
15150 5f 75 73 65 64 0d 0a 20 20 20 20 20 20 7d 20 6d  _used..      } m
15160 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65  emory] == 0} the
15170 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
15180 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
15190 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
151a0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
151b0 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22  ndArgs $memory "
151c0 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20   bytes\n"]..    
151d0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65      }..      } e
151e0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
151f0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
15200 3a 20 4d 61 79 62 65 20 74 68 65 20 53 51 4c 69  : Maybe the SQLi
15210 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20  te core library 
15220 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 3f 0d  is unavailable?.
15230 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
15240 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75      set memory u
15250 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20  nknown....      
15260 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
15270 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
15280 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
15290 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d  [appendArgs $mem
152a0 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ory \n]..       
152b0 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
152c0 20 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20       set result 
152d0 24 6d 65 6d 6f 72 79 3b 20 23 20 4e 4f 54 45 3a  $memory; # NOTE:
152e0 20 52 65 74 75 72 6e 20 6d 65 6d 6f 72 79 20 69   Return memory i
152f0 6e 2d 75 73 65 20 74 6f 20 6f 75 72 20 63 61 6c  n-use to our cal
15300 6c 65 72 2e 0d 0a 0d 0a 20 20 20 20 20 20 69 66  ler.....      if
15310 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
15320 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
15330 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
15340 6d 61 78 69 6d 75 6d 20 6d 65 6d 6f 72 79 20 69  maximum memory i
15350 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74 65 2e  n use by SQLite.
15360 2e 2e 20 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  .. "..      }...
15370 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63  .      if {[catc
15380 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a  h {..        obj
15390 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
153a0 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
153b0 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
153c0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55  em.Data.SQLite.U
153d0 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
153e0 64 73 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72  ds sqlite3_memor
153f0 79 5f 68 69 67 68 77 61 74 65 72 20 30 0d 0a 20  y_highwater 0.. 
15400 20 20 20 20 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d       } memory] =
15410 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
15420 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
15430 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
15440 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
15450 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  el [appendArgs $
15460 6d 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e  memory " bytes\n
15470 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  "]..        }.. 
15480 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
15490 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
154a0 20 20 23 20 4e 4f 54 45 3a 20 4d 61 79 62 65 20    # NOTE: Maybe 
154b0 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20  the SQLite core 
154c0 6c 69 62 72 61 72 79 20 69 73 20 75 6e 61 76 61  library is unava
154d0 69 6c 61 62 6c 65 3f 0d 0a 20 20 20 20 20 20 20  ilable?..       
154e0 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
154f0 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a  memory unknown..
15500 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24  ..        if {!$
15510 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
15520 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
15530 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
15540 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d  rgs $memory \n].
15550 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
15560 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
15570 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65 6e 20  {$collect} then 
15580 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c 6c 65  {..        colle
15590 63 74 47 61 72 62 61 67 65 20 24 63 68 61 6e 6e  ctGarbage $chann
155a0 65 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  el..      }.... 
155b0 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
155c0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
155d0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
155e0 20 22 2d 2d 2d 2d 20 63 75 72 72 65 6e 74 20 6d   "---- current m
155f0 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20  emory in use by 
15600 74 68 65 20 43 4c 52 2e 2e 2e 20 22 0d 0a 20 20  the CLR... "..  
15610 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69      }....      i
15620 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63  f {[catch {objec
15630 74 20 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54  t invoke GC GetT
15640 6f 74 61 6c 4d 65 6d 6f 72 79 20 66 61 6c 73 65  otalMemory false
15650 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20  } memory] == 0} 
15660 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
15670 69 66 20 7b 5b 73 74 72 69 6e 67 20 69 73 20 69  if {[string is i
15680 6e 74 65 67 65 72 20 2d 73 74 72 69 63 74 20 24  nteger -strict $
15690 6d 65 6d 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d  memory]} then {.
156a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
156b0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
156c0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
156d0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
156e0 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22  ndArgs $memory "
156f0 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20   bytes\n"]..    
15700 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
15710 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
15720 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20       set memory 
15730 69 6e 76 61 6c 69 64 0d 0a 0d 0a 20 20 20 20 20  invalid....     
15740 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
15750 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
15760 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
15770 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
15780 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20   $memory \n]..  
15790 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
157a0 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
157b0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  se {..        se
157c0 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e  t memory unknown
157d0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
157e0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
157f0 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
15800 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
15810 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e  dArgs $memory \n
15820 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
15830 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72      }....      r
15840 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20  eturn $result.. 
15850 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
15860 63 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65  c checkForSQLite
15870 44 69 72 65 63 74 6f 72 69 65 73 20 7b 20 63 68  Directories { ch
15880 61 6e 6e 65 6c 20 7b 72 65 73 65 74 20 66 61 6c  annel {reset fal
15890 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  se} } {..      #
158a0 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
158b0 43 68 65 63 6b 20 69 66 20 74 68 65 20 73 71 6c  Check if the sql
158c0 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
158d0 69 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f  irectory functio
158e0 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d  n is available..
158f0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
15900 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5c  tputs $channel \
15910 0d 0a 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d  ..          "---
15920 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 66  - checking for f
15930 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 5f  unction sqlite3_
15940 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
15950 6f 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  ory... "....    
15960 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
15970 45 3a 20 54 68 69 73 20 63 61 6c 6c 20 74 6f 20  E: This call to 
15980 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  the sqlite3_win3
15990 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20  2_set_directory 
159a0 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 74 68  function uses th
159b0 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
159c0 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 20 30   invalid value 0
159d0 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 61   for the first a
159e0 72 67 75 6d 65 6e 74 2e 20 20 54 68 69 73 20 63  rgument.  This c
159f0 6f 64 65 20 69 73 20 64 65 73 69 67 6e 65 64 0d  ode is designed.
15a00 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
15a10 6f 20 63 68 65 63 6b 20 69 66 20 63 61 6c 6c 69  o check if calli
15a20 6e 67 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  ng the function 
15a30 77 69 6c 6c 20 72 61 69 73 65 20 61 6e 20 65 78  will raise an ex
15a40 63 65 70 74 69 6f 6e 20 28 69 2e 65 2e 0d 0a 20  ception (i.e... 
15a50 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
15a60 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74 20 6f   actual result o
15a70 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64  f the function d
15a80 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 20 61  oes not matter a
15a90 73 20 6c 6f 6e 67 20 61 73 20 6e 6f 0d 0a 20 20  s long as no..  
15aa0 20 20 20 20 23 20 20 20 20 20 20 20 64 69 72 65      #       dire
15ab0 63 74 6f 72 79 20 69 73 20 63 68 61 6e 67 65 64  ctory is changed
15ac0 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  )...      #..   
15ad0 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
15ae0 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20  .        object 
15af0 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
15b00 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
15b10 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
15b20 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66  ata.SQLite.Unsaf
15b30 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20 5c  eNativeMethods \
15b40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ..            sq
15b50 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f  lite3_win32_set_
15b60 64 69 72 65 63 74 6f 72 79 20 30 20 6e 75 6c 6c  directory 0 null
15b70 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d  ..      }] == 0}
15b80 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
15b90 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
15ba0 54 45 3a 20 43 61 6c 6c 69 6e 67 20 74 68 65 20  TE: Calling the 
15bb0 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
15bc0 74 5f 64 69 72 65 63 74 6f 72 79 20 66 75 6e 63  t_directory func
15bd0 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 0d 0a 20  tion does not.. 
15be0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
15bf0 61 75 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f  ause an exceptio
15c00 6e 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 69 74  n; therefore, it
15c10 20 6d 75 73 74 20 62 65 20 61 76 61 69 6c 61 62   must be availab
15c20 6c 65 20 28 69 2e 65 2e 0d 0a 20 20 20 20 20 20  le (i.e...      
15c30 20 20 23 20 20 20 20 20 20 20 65 76 65 6e 20 74    #       even t
15c40 68 6f 75 67 68 20 69 74 20 73 68 6f 75 6c 64 20  hough it should 
15c50 72 65 74 75 72 6e 20 61 20 66 61 69 6c 75 72 65  return a failure
15c60 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 6e 20   return code in 
15c70 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20  this..        # 
15c80 20 20 20 20 20 20 63 61 73 65 29 2e 0d 0a 20 20        case)...  
15c90 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
15ca0 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 73   addConstraint s
15cb0 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
15cc0 5f 64 69 72 65 63 74 6f 72 79 0d 0a 0d 0a 20 20  _directory....  
15cd0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
15ce0 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 0d 0a 20 20  nnel yes\n....  
15cf0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
15d00 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20 6f 75   # NOTE: Does ou
15d10 72 20 63 61 6c 6c 65 72 20 77 61 6e 74 20 74 6f  r caller want to
15d20 20 72 65 73 65 74 20 74 68 65 20 64 69 72 65 63   reset the direc
15d30 74 6f 72 69 65 73 3f 0d 0a 20 20 20 20 20 20 20  tories?..       
15d40 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
15d50 24 72 65 73 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $reset} then {..
15d60 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
15d70 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e         # NOTE: N
15d80 6f 77 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  ow make sure the
15d90 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 65   database and te
15da0 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72  mporary director
15db0 69 65 73 20 61 72 65 0d 0a 20 20 20 20 20 20 20  ies are..       
15dc0 20 20 20 23 20 20 20 20 20 20 20 72 65 73 65 74     #       reset
15dd0 20 74 68 65 69 72 20 64 65 66 61 75 6c 74 20 76   their default v
15de0 61 6c 75 65 73 2c 20 77 68 69 63 68 20 73 68 6f  alues, which sho
15df0 75 6c 64 20 62 65 20 6e 75 6c 6c 20 66 6f 72 20  uld be null for 
15e00 62 6f 74 68 2e 0d 0a 20 20 20 20 20 20 20 20 20  both...         
15e10 20 23 20 20 20 20 20 20 20 53 69 6e 63 65 20 74   #       Since t
15e20 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  he sqlite3_win32
15e30 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66  _set_directory f
15e40 75 6e 63 74 69 6f 6e 20 69 73 20 61 76 61 69 6c  unction is avail
15e50 61 62 6c 65 2c 0d 0a 20 20 20 20 20 20 20 20 20  able,..         
15e60 20 23 20 20 20 20 20 20 20 75 73 65 20 69 74 2e   #       use it.
15e70 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
15e80 20 20 20 20 20 20 20 20 20 66 6f 72 20 7b 73 65           for {se
15e90 74 20 69 6e 64 65 78 20 31 7d 20 7b 24 69 6e 64  t index 1} {$ind
15ea0 65 78 20 3c 20 33 7d 20 7b 69 6e 63 72 20 69 6e  ex < 3} {incr in
15eb0 64 65 78 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20  dex} {..        
15ec0 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
15ed0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
15ee0 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
15ef0 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
15f00 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
15f10 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
15f20 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61  .SQLite.UnsafeNa
15f30 74 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20  tiveMethods \.. 
15f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f50 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
15f60 65 74 5f 64 69 72 65 63 74 6f 72 79 20 24 69 6e  et_directory $in
15f70 64 65 78 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20  dex null..      
15f80 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 20        } result] 
15f90 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
15fa0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
15fb0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
15fc0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
15fd0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
15fe0 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 77  - call sqlite3_w
15ff0 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
16000 72 79 28 22 20 24 69 6e 64 65 78 20 5c 0d 0a 20  ry(" $index \.. 
16010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16020 20 22 2c 20 6e 75 6c 6c 29 2e 2e 2e 20 6f 6b 3a   ", null)... ok:
16030 20 22 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a   " $result \n]..
16040 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
16050 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
16060 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
16070 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
16080 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
16090 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73      "---- call s
160a0 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
160b0 5f 64 69 72 65 63 74 6f 72 79 28 22 20 24 69 6e  _directory(" $in
160c0 64 65 78 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  dex \..         
160d0 20 20 20 20 20 20 20 20 20 22 2c 20 6e 75 6c 6c           ", null
160e0 29 2e 2e 2e 20 65 72 72 6f 72 3a 20 22 20 5c 6e  )... error: " \n
160f0 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a  \t $result \n]..
16100 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
16110 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
16120 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65      }..      } e
16130 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
16140 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
16150 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  \n....        #.
16160 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
16170 20 44 6f 65 73 20 6f 75 72 20 63 61 6c 6c 65 72   Does our caller
16180 20 77 61 6e 74 20 74 6f 20 72 65 73 65 74 20 74   want to reset t
16190 68 65 20 64 69 72 65 63 74 6f 72 69 65 73 3f 20  he directories? 
161a0 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 0d 0a   This can only..
161b0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
161c0 62 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20  be performed if 
161d0 53 51 4c 69 74 65 20 69 73 20 6c 6f 61 64 65 64  SQLite is loaded
161e0 20 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20 75   and ready for u
161f0 73 65 20 62 79 20 74 68 65 20 74 65 73 74 0d 0a  se by the test..
16200 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
16210 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20  suite...        
16220 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24  #..        if {$
16230 72 65 73 65 74 20 26 26 20 5b 69 73 53 51 4c 69  reset && [isSQLi
16240 74 65 52 65 61 64 79 5d 7d 20 74 68 65 6e 20 7b  teReady]} then {
16250 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
16260 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
16270 20 4e 6f 77 20 6d 61 6b 65 20 73 75 72 65 20 74   Now make sure t
16280 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
16290 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
162a0 6f 72 69 65 73 20 61 72 65 0d 0a 20 20 20 20 20  ories are..     
162b0 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65 73       #       res
162c0 65 74 20 74 68 65 69 72 20 64 65 66 61 75 6c 74  et their default
162d0 20 76 61 6c 75 65 73 2c 20 77 68 69 63 68 20 73   values, which s
162e0 68 6f 75 6c 64 20 62 65 20 6e 75 6c 6c 20 66 6f  hould be null fo
162f0 72 20 62 6f 74 68 2e 0d 0a 20 20 20 20 20 20 20  r both...       
16300 20 20 20 23 20 20 20 20 20 20 20 53 69 6e 63 65     #       Since
16310 20 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e   the sqlite3_win
16320 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79  32_set_directory
16330 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
16340 6f 74 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  ot..          # 
16350 20 20 20 20 20 20 61 70 70 65 61 72 20 74 6f 20        appear to 
16360 62 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 75 73  be available, us
16370 65 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  e the associated
16380 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 73   PRAGMA commands
16390 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
163a0 20 20 20 20 69 6e 73 74 65 61 64 2e 0d 0a 20 20      instead...  
163b0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
163c0 20 20 20 20 20 66 6f 72 65 61 63 68 20 64 69 72       foreach dir
163d0 65 63 74 6f 72 79 20 5b 6c 69 73 74 20 64 61 74  ectory [list dat
163e0 61 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72  a_store_director
163f0 79 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72  y temp_store_dir
16400 65 63 74 6f 72 79 5d 20 7b 0d 0a 20 20 20 20 20  ectory] {..     
16410 20 20 20 20 20 20 20 73 65 74 20 73 71 6c 20 5b         set sql [
16420 61 70 70 65 6e 64 41 72 67 73 20 22 50 52 41 47  appendArgs "PRAG
16430 4d 41 20 22 20 24 64 69 72 65 63 74 6f 72 79 20  MA " $directory 
16440 22 20 3d 20 5c 22 5c 22 3b 22 5d 0d 0a 0d 0a 20  " = \"\";"].... 
16450 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
16460 63 61 74 63 68 20 7b 65 78 65 63 75 74 65 53 71  catch {executeSq
16470 6c 20 24 73 71 6c 7d 20 72 65 73 75 6c 74 5d 20  l $sql} result] 
16480 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
16490 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
164a0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
164b0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
164c0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
164d0 2d 20 65 78 65 63 75 74 65 20 50 52 41 47 4d 41  - execute PRAGMA
164e0 20 22 20 24 64 69 72 65 63 74 6f 72 79 20 22 2e   " $directory ".
164f0 2e 2e 20 6f 6b 3a 20 5c 22 22 20 5c 0d 0a 20 20  .. ok: \"" \..  
16500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16510 24 72 65 73 75 6c 74 20 5c 22 5c 6e 5d 0d 0a 20  $result \"\n].. 
16520 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
16530 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
16540 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
16550 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
16560 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16570 20 20 20 22 2d 2d 2d 2d 20 65 78 65 63 75 74 65     "---- execute
16580 20 50 52 41 47 4d 41 20 22 20 24 64 69 72 65 63   PRAGMA " $direc
16590 74 6f 72 79 20 22 2e 2e 2e 20 65 72 72 6f 72 3a  tory "... error:
165a0 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
165b0 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65          \n\t $re
165c0 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  sult \n]..      
165d0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
165e0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
165f0 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
16600 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
16610 45 3a 20 46 69 6e 61 6c 6c 79 2c 20 73 68 6f 77  E: Finally, show
16620 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
16630 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ue of the databa
16640 73 65 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79  se and temporary
16650 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
16660 64 69 72 65 63 74 6f 72 69 65 73 2e 20 20 54 68  directories.  Th
16670 69 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 70  is can only be p
16680 65 72 66 6f 72 6d 65 64 20 69 66 20 53 51 4c 69  erformed if SQLi
16690 74 65 20 69 73 20 6c 6f 61 64 65 64 0d 0a 20 20  te is loaded..  
166a0 20 20 20 20 23 20 20 20 20 20 20 20 61 6e 64 20      #       and 
166b0 72 65 61 64 79 20 66 6f 72 20 75 73 65 20 62 79  ready for use by
166c0 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e   the test suite.
166d0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
166e0 20 69 66 20 7b 5b 69 73 53 51 4c 69 74 65 52 65   if {[isSQLiteRe
166f0 61 64 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ady]} then {..  
16700 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 64 69        foreach di
16710 72 65 63 74 6f 72 79 20 5b 6c 69 73 74 20 64 61  rectory [list da
16720 74 61 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  ta_store_directo
16730 72 79 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69  ry temp_store_di
16740 72 65 63 74 6f 72 79 5d 20 7b 0d 0a 20 20 20 20  rectory] {..    
16750 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
16760 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
16770 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20   "---- checking 
16780 22 20 24 64 69 72 65 63 74 6f 72 79 20 22 2e 2e  " $directory "..
16790 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  . "]....        
167a0 20 20 73 65 74 20 73 71 6c 20 5b 61 70 70 65 6e    set sql [appen
167b0 64 41 72 67 73 20 22 50 52 41 47 4d 41 20 22 20  dArgs "PRAGMA " 
167c0 24 64 69 72 65 63 74 6f 72 79 20 5c 3b 5d 0d 0a  $directory \;]..
167d0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
167e0 5b 63 61 74 63 68 20 7b 65 78 65 63 75 74 65 53  [catch {executeS
167f0 71 6c 20 24 73 71 6c 20 73 63 61 6c 61 72 7d 20  ql $sql scalar} 
16800 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68  result] == 0} th
16810 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
16820 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
16830 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 6f 6b   [appendArgs "ok
16840 3a 20 5c 22 22 20 24 72 65 73 75 6c 74 20 5c 22  : \"" $result \"
16850 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
16860 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
16870 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
16880 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
16890 22 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24  "error: " \n\t $
168a0 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20  result \n]..    
168b0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
168c0 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20   }..      }..   
168d0 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
168e0 6c 6f 61 64 53 51 4c 69 74 65 54 65 73 74 53 65  loadSQLiteTestSe
168f0 74 74 69 6e 67 73 20 7b 20 63 68 61 6e 6e 65 6c  ttings { channel
16900 20 7b 73 75 66 66 69 78 20 22 22 7d 20 7b 71 75   {suffix ""} {qu
16910 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  iet false} } {..
16920 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
16930 20 4e 4f 54 45 3a 20 53 6b 69 70 20 6c 6f 61 64   NOTE: Skip load
16940 69 6e 67 20 74 68 65 20 73 65 74 74 69 6e 67 73  ing the settings
16950 20 69 66 20 74 68 65 69 72 20 75 73 61 67 65 20   if their usage 
16960 68 61 73 20 62 65 65 6e 20 64 69 73 61 62 6c 65  has been disable
16970 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  d...      #..   
16980 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
16990 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65  ists ::no(sqlite
169a0 54 65 73 74 53 65 74 74 69 6e 67 73 29 5d 7d 20  TestSettings)]} 
169b0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
169c0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
169d0 45 3a 20 4c 6f 61 64 20 63 75 73 74 6f 6d 20 70  E: Load custom p
169e0 65 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20 70  er-user and/or p
169f0 65 72 2d 68 6f 73 74 20 74 65 73 74 20 73 65 74  er-host test set
16a00 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20 20 20  tings now...    
16a10 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
16a20 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
16a30 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 75  ::tcl_platform(u
16a40 73 65 72 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ser)]} then {.. 
16a50 20 20 20 20 20 20 20 20 20 73 65 74 20 75 73 65           set use
16a60 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d  rSettingsFileNam
16a70 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65  e [file join [ge
16a80 74 43 6f 6d 6d 6f 6e 44 69 72 65 63 74 6f 72 79  tCommonDirectory
16a90 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ] \..           
16aa0 20 20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 73     [appendArgs s
16ab0 65 74 74 69 6e 67 73 20 24 73 75 66 66 69 78 20  ettings $suffix 
16ac0 2e 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72  . $::tcl_platfor
16ad0 6d 28 75 73 65 72 29 20 2e 65 61 67 6c 65 5d 5d  m(user) .eagle]]
16ae0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
16af0 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24   {[file exists $
16b00 75 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65  userSettingsFile
16b10 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
16b20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
16b30 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
16b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
16b50 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
16b60 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
16b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
16b80 2d 2d 2d 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d  --- loading per-
16b90 75 73 65 72 20 74 65 73 74 20 73 65 74 74 69 6e  user test settin
16ba0 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20  gs file \"" \.. 
16bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16bc0 20 24 75 73 65 72 53 65 74 74 69 6e 67 73 46 69   $userSettingsFi
16bd0 6c 65 4e 61 6d 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d  leName \"...\n].
16be0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
16bf0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
16c00 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
16c10 20 20 20 20 20 20 20 20 20 20 75 70 6c 65 76 65            upleve
16c20 6c 20 31 20 5b 6c 69 73 74 20 73 6f 75 72 63 65  l 1 [list source
16c30 20 24 75 73 65 72 53 65 74 74 69 6e 67 73 46 69   $userSettingsFi
16c40 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20  leName]..       
16c50 20 20 20 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74       } error]} t
16c60 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
16c70 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
16c80 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
16c90 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
16ca0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
16cb0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
16cc0 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
16cd0 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
16ce0 64 20 74 6f 20 6c 6f 61 64 20 70 65 72 2d 75 73  d to load per-us
16cf0 65 72 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65  er settings file
16d00 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
16d10 20 20 20 20 20 20 20 20 20 20 20 20 24 75 73 65              $use
16d20 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d  rSettingsFileNam
16d30 65 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20  e "\", error: " 
16d40 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
16d50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
16d60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
16d70 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
16d80 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
16d90 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
16da0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
16db0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
16dc0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
16dd0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
16de0 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65      "---- skippe
16df0 64 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d 75 73  d loading per-us
16e00 65 72 20 74 65 73 74 20 73 65 74 74 69 6e 67 73  er test settings
16e10 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20   file \"" \..   
16e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
16e30 75 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65  userSettingsFile
16e40 4e 61 6d 65 20 22 5c 22 2c 20 69 74 20 64 6f 65  Name "\", it doe
16e50 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d  s not exist\n"].
16e60 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
16e70 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
16e80 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
16e90 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
16ea0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16eb0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16ec0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16ed0 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20  #########....   
16ee0 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
16ef0 78 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74  xists ::tcl_plat
16f00 66 6f 72 6d 28 68 6f 73 74 29 5d 7d 20 74 68 65  form(host)]} the
16f10 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
16f20 65 74 20 68 6f 73 74 53 65 74 74 69 6e 67 73 46  et hostSettingsF
16f30 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ileName [file jo
16f40 69 6e 20 5b 67 65 74 43 6f 6d 6d 6f 6e 44 69 72  in [getCommonDir
16f50 65 63 74 6f 72 79 5d 20 5c 0d 0a 20 20 20 20 20  ectory] \..     
16f60 20 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64           [append
16f70 41 72 67 73 20 73 65 74 74 69 6e 67 73 20 24 73  Args settings $s
16f80 75 66 66 69 78 20 2e 20 24 3a 3a 74 63 6c 5f 70  uffix . $::tcl_p
16f90 6c 61 74 66 6f 72 6d 28 68 6f 73 74 29 20 2e 65  latform(host) .e
16fa0 61 67 6c 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  agle]]....      
16fb0 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78      if {[file ex
16fc0 69 73 74 73 20 24 68 6f 73 74 53 65 74 74 69 6e  ists $hostSettin
16fd0 67 73 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65  gsFileName]} the
16fe0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
16ff0 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
17000 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
17010 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
17020 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
17030 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17040 20 20 20 20 22 2d 2d 2d 2d 20 6c 6f 61 64 69 6e      "---- loadin
17050 67 20 70 65 72 2d 68 6f 73 74 20 74 65 73 74 20  g per-host test 
17060 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22  settings file \"
17070 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
17080 20 20 20 20 20 20 20 24 68 6f 73 74 53 65 74 74         $hostSett
17090 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 5c 22 2e  ingsFileName \".
170a0 2e 2e 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  ..\n]..         
170b0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
170c0 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
170d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
170e0 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20  uplevel 1 [list 
170f0 73 6f 75 72 63 65 20 24 68 6f 73 74 53 65 74 74  source $hostSett
17100 69 6e 67 73 46 69 6c 65 4e 61 6d 65 5d 0d 0a 20  ingsFileName].. 
17110 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 72 72             } err
17120 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
17130 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
17140 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
17150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17160 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
17170 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
17180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17190 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
171a0 20 66 61 69 6c 65 64 20 74 6f 20 6c 6f 61 64 20   failed to load 
171b0 70 65 72 2d 68 6f 73 74 20 73 65 74 74 69 6e 67  per-host setting
171c0 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20  s file \"" \..  
171d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171e0 20 20 24 68 6f 73 74 53 65 74 74 69 6e 67 73 46    $hostSettingsF
171f0 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 65 72 72  ileName "\", err
17200 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f  or: " \n\t $erro
17210 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  r \n]..         
17220 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
17230 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
17240 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
17250 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
17260 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
17270 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
17280 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
17290 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
172a0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
172b0 73 6b 69 70 70 65 64 20 6c 6f 61 64 69 6e 67 20  skipped loading 
172c0 70 65 72 2d 68 6f 73 74 20 74 65 73 74 20 73 65  per-host test se
172d0 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20  ttings file \"" 
172e0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
172f0 20 20 20 20 20 24 68 6f 73 74 53 65 74 74 69 6e       $hostSettin
17300 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20  gsFileName "\", 
17310 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  it does not exis
17320 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  t\n"]..         
17330 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
17340 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
17350 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
17360 0a 20 20 20 20 70 72 6f 63 20 72 75 6e 53 51 4c  .    proc runSQL
17370 69 74 65 54 65 73 74 50 72 6f 6c 6f 67 75 65 20  iteTestPrologue 
17380 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
17390 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69       # NOTE: Ski
173a0 70 20 72 75 6e 6e 69 6e 67 20 6f 75 72 20 63 75  p running our cu
173b0 73 74 6f 6d 20 70 72 6f 6c 6f 67 75 65 20 69 66  stom prologue if
173c0 20 74 68 65 20 6d 61 69 6e 20 6f 6e 65 20 68 61   the main one ha
173d0 73 20 62 65 65 6e 0d 0a 20 20 20 20 20 20 23 20  s been..      # 
173e0 20 20 20 20 20 20 73 6b 69 70 70 65 64 2e 0d 0a        skipped...
173f0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
17400 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
17410 20 3a 3a 6e 6f 28 70 72 6f 6c 6f 67 75 65 2e 65   ::no(prologue.e
17420 61 67 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  agle)]} then {..
17430 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
17440 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20     # NOTE: Load 
17450 74 68 65 20 22 62 65 66 6f 72 65 2d 63 6f 6e 73  the "before-cons
17460 74 72 61 69 6e 74 73 22 20 63 75 73 74 6f 6d 20  traints" custom 
17470 70 65 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20  per-user and/or 
17480 70 65 72 2d 68 6f 73 74 0d 0a 20 20 20 20 20 20  per-host..      
17490 20 20 23 20 20 20 20 20 20 20 74 65 73 74 20 73    #       test s
174a0 65 74 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20  ettings now...  
174b0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
174c0 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74   uplevel 1 [list
174d0 20 6c 6f 61 64 53 51 4c 69 74 65 54 65 73 74 53   loadSQLiteTestS
174e0 65 74 74 69 6e 67 73 20 24 3a 3a 74 65 73 74 5f  ettings $::test_
174f0 63 68 61 6e 6e 65 6c 20 2e 62 65 66 6f 72 65 5d  channel .before]
17500 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
17510 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44         # NOTE: D
17520 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 61 6d  etermine the nam
17530 65 73 20 6f 66 20 74 68 65 20 6e 61 74 69 76 65  es of the native
17540 20 70 6c 61 74 66 6f 72 6d 20 61 6e 64 20 61 72   platform and ar
17550 63 68 69 74 65 63 74 75 72 65 2e 0d 0a 20 20 20  chitecture...   
17560 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
17570 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 5b 67 65  set platform [ge
17580 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20 74  tBuildPlatform t
17590 72 75 65 5d 0d 0a 20 20 20 20 20 20 20 20 73 65  rue]..        se
175a0 74 20 61 72 63 68 69 74 65 63 74 75 72 65 20 5b  t architecture [
175b0 61 72 63 68 69 74 65 63 74 75 72 65 46 6f 72 50  architectureForP
175c0 6c 61 74 66 6f 72 6d 20 24 70 6c 61 74 66 6f 72  latform $platfor
175d0 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  m]....        #.
175e0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
175f0 20 53 68 6f 77 20 74 68 65 20 70 6c 61 74 66 6f   Show the platfo
17600 72 6d 20 61 6e 64 20 61 72 63 68 69 74 65 63 74  rm and architect
17610 75 72 65 20 75 73 65 64 20 74 6f 20 68 65 6c 70  ure used to help
17620 20 6c 6f 63 61 74 65 20 74 68 65 0d 0a 20 20 20   locate the..   
17630 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 74       #       nat
17640 69 76 65 20 62 75 69 6c 64 20 66 69 6c 65 73 2e  ive build files.
17650 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
17660 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
17670 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
17680 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
17690 20 20 20 20 20 20 22 2d 2d 2d 2d 20 70 6c 61 74        "---- plat
176a0 66 6f 72 6d 20 66 6f 72 20 6c 6f 63 61 74 69 6e  form for locatin
176b0 67 20 6e 61 74 69 76 65 20 62 75 69 6c 64 20 66  g native build f
176c0 69 6c 65 73 20 69 73 20 5c 22 22 20 5c 0d 0a 20  iles is \"" \.. 
176d0 20 20 20 20 20 20 20 20 20 20 20 24 70 6c 61 74             $plat
176e0 66 6f 72 6d 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20  form \"\n]....  
176f0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
17700 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
17710 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
17720 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 61 72 63         "---- arc
17730 68 69 74 65 63 74 75 72 65 20 66 6f 72 20 6c 6f  hitecture for lo
17740 63 61 74 69 6e 67 20 6e 61 74 69 76 65 20 62 75  cating native bu
17750 69 6c 64 20 66 69 6c 65 73 20 69 73 20 5c 22 22  ild files is \""
17760 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
17770 24 61 72 63 68 69 74 65 63 74 75 72 65 20 5c 22  $architecture \"
17780 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  \n]....        #
17790 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
177a0 3a 20 42 75 69 6c 64 20 61 20 6c 69 73 74 20 6f  : Build a list o
177b0 66 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  f configuration 
177c0 66 69 6c 65 73 20 74 68 61 74 20 77 65 20 68 61  files that we ha
177d0 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  ndle...        #
177e0 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f  ..        set co
177f0 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 5b 6c  nfigFileNames [l
17800 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ist \..         
17810 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
17820 51 4c 69 74 65 2e 64 6c 6c 2e 63 6f 6e 66 69 67  QLite.dll.config
17830 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
17840 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
17850 42 75 69 6c 64 20 61 20 6c 69 73 74 20 6f 66 20  Build a list of 
17860 61 75 78 69 6c 69 61 72 79 20 4d 61 6e 61 67 65  auxiliary Manage
17870 64 20 44 65 62 75 67 67 69 6e 67 20 41 73 73 69  d Debugging Assi
17880 73 74 61 6e 74 73 20 28 4d 44 41 29 0d 0a 20 20  stants (MDA)..  
17890 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
178a0 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 69 6c 65  nfiguration file
178b0 73 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65  s that we handle
178c0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
178d0 20 20 20 20 20 20 73 65 74 20 6d 64 61 43 6f 6e        set mdaCon
178e0 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69  figFileNames [li
178f0 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  st \..          
17900 20 20 45 61 67 6c 65 53 68 65 6c 6c 33 32 2e 65    EagleShell32.e
17910 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 49 6e  xe.mda.config In
17920 73 74 61 6c 6c 65 72 2e 65 78 65 2e 6d 64 61 2e  staller.exe.mda.
17930 63 6f 6e 66 69 67 20 5c 0d 0a 20 20 20 20 20 20  config \..      
17940 20 20 20 20 20 20 74 65 73 74 2e 65 78 65 2e 6d        test.exe.m
17950 64 61 2e 63 6f 6e 66 69 67 20 74 65 73 74 6c 69  da.config testli
17960 6e 71 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69  nq.exe.mda.confi
17970 67 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  g \..           
17980 20 74 65 73 74 65 66 36 2e 65 78 65 2e 6d 64 61   testef6.exe.mda
17990 2e 63 6f 6e 66 69 67 5d 0d 0a 0d 0a 20 20 20 20  .config]....    
179a0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
179b0 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65   NOTE: Build the
179c0 20 6c 69 73 74 20 6f 66 20 65 78 74 65 72 6e 61   list of externa
179d0 6c 20 66 69 6c 65 73 20 74 68 61 74 20 77 65 20  l files that we 
179e0 68 61 6e 64 6c 65 2e 20 20 53 6f 6d 65 20 6f 66  handle.  Some of
179f0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
17a00 20 20 74 68 65 73 65 20 66 69 6c 65 73 20 6d 61    these files ma
17a10 79 20 62 65 20 6e 61 74 69 76 65 20 61 6e 64 2f  y be native and/
17a20 6f 72 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d  or managed assem
17a30 62 6c 69 65 73 20 74 68 61 74 20 61 72 65 0d 0a  blies that are..
17a40 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
17a50 72 65 71 75 69 72 65 64 20 74 6f 20 70 65 72 66  required to perf
17a60 6f 72 6d 20 76 61 72 69 6f 75 73 20 74 65 73 74  orm various test
17a70 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  s...        #.. 
17a80 20 20 20 20 20 20 20 73 65 74 20 65 78 74 65 72         set exter
17a90 6e 61 6c 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69  nalFileNames [li
17aa0 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  st \..          
17ab0 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 45 6e 74    [file join Ent
17ac0 69 74 79 46 72 61 6d 65 77 6f 72 6b 20 6c 69 62  ityFramework lib
17ad0 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69   [string map [li
17ae0 73 74 20 46 78 20 22 22 5d 20 5b 73 74 72 69 6e  st Fx ""] [strin
17af0 67 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  g \..           
17b00 20 6d 61 70 20 5b 6c 69 73 74 20 6e 65 74 46 78   map [list netFx
17b10 34 35 31 20 6e 65 74 46 78 34 35 5d 20 5b 67 65  451 netFx45] [ge
17b20 74 42 75 69 6c 64 4e 65 74 46 78 5d 5d 5d 20 45  tBuildNetFx]]] E
17b30 6e 74 69 74 79 46 72 61 6d 65 77 6f 72 6b 2e 64  ntityFramework.d
17b40 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ll]]....        
17b50 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
17b60 45 3a 20 42 75 69 6c 64 20 74 68 65 20 6c 69 73  E: Build the lis
17b70 74 20 6f 66 20 6e 61 74 69 76 65 20 61 73 73 65  t of native asse
17b80 6d 62 6c 79 20 66 69 6c 65 73 20 74 68 61 74 20  mbly files that 
17b90 77 65 20 68 61 6e 64 6c 65 2e 20 20 54 68 65 0d  we handle.  The.
17ba0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
17bb0 20 72 65 61 73 6f 6e 20 74 68 65 20 22 53 79 73   reason the "Sys
17bc0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
17bd0 64 6c 6c 22 20 66 69 6c 65 20 69 73 20 69 6e 63  dll" file is inc
17be0 6c 75 64 65 64 20 68 65 72 65 20 69 73 0d 0a 20  luded here is.. 
17bf0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62         #       b
17c00 65 63 61 75 73 65 20 69 74 20 63 6f 75 6c 64 20  ecause it could 
17c10 62 65 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64  be the mixed-mod
17c20 65 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20  e assembly...   
17c30 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
17c40 73 65 74 20 6e 61 74 69 76 65 46 69 6c 65 4e 61  set nativeFileNa
17c50 6d 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20  mes [list \..   
17c60 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17c70 2e 64 6c 6c 20 53 51 4c 69 74 65 2e 49 6e 74 65  .dll SQLite.Inte
17c80 72 6f 70 2e 64 6c 6c 20 53 79 73 74 65 6d 2e 44  rop.dll System.D
17c90 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d 0d  ata.SQLite.dll].
17ca0 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
17cb0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75        # NOTE: Bu
17cc0 69 6c 64 20 74 68 65 20 6c 69 73 74 20 6f 66 20  ild the list of 
17cd0 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79  managed assembly
17ce0 20 66 69 6c 65 73 20 74 68 61 74 20 77 65 20 68   files that we h
17cf0 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  andle...        
17d00 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d  #..        set m
17d10 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73 20  anagedFileNames 
17d20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20  [list \..       
17d30 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
17d40 2e 53 51 4c 69 74 65 2e 64 6c 6c 20 53 79 73 74  .SQLite.dll Syst
17d50 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c  em.Data.SQLite.L
17d60 69 6e 71 2e 64 6c 6c 20 5c 0d 0a 20 20 20 20 20  inq.dll \..     
17d70 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
17d80 74 61 2e 53 51 4c 69 74 65 2e 45 46 36 2e 64 6c  ta.SQLite.EF6.dl
17d90 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  l]....        #.
17da0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
17db0 20 52 65 6d 6f 76 65 20 61 6e 79 20 74 65 73 74   Remove any test
17dc0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 68 61   constraints tha
17dd0 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 6e  t refer to the n
17de0 61 74 69 76 65 20 61 6e 64 2f 6f 72 0d 0a 20 20  ative and/or..  
17df0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 61        #       ma
17e00 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 20 66  naged assembly f
17e10 69 6c 65 73 20 74 68 61 74 20 77 65 20 68 61 6e  iles that we han
17e20 64 6c 65 20 75 6e 6c 65 73 73 20 66 6f 72 62 69  dle unless forbi
17e30 64 64 65 6e 20 66 72 6f 6d 0d 0a 20 20 20 20 20  dden from..     
17e40 20 20 20 23 20 20 20 20 20 20 20 64 6f 69 6e 67     #       doing
17e50 20 73 6f 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d   so...        #.
17e60 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69  .        if {![i
17e70 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
17e80 73 71 6c 69 74 65 52 65 6d 6f 76 65 43 6f 6e 73  sqliteRemoveCons
17e90 74 72 61 69 6e 74 73 29 5d 7d 20 74 68 65 6e 20  traints)]} then 
17ea0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  {..          for
17eb0 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 63  each fileName $c
17ec0 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b  onfigFileNames {
17ed0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
17ee0 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  moveConstraint [
17ef0 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
17f00 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20   $fileName]..   
17f10 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
17f20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
17f30 6c 65 4e 61 6d 65 20 24 6d 64 61 43 6f 6e 66 69  leName $mdaConfi
17f40 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  gFileNames {..  
17f50 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76 65            remove
17f60 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
17f70 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 24 66 69  ndArgs file_ $fi
17f80 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20  leName]..       
17f90 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
17fa0 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
17fb0 6d 65 20 24 65 78 74 65 72 6e 61 6c 46 69 6c 65  me $externalFile
17fc0 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
17fd0 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74       removeConst
17fe0 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
17ff0 73 20 66 69 6c 65 5f 20 5b 66 69 6c 65 20 74 61  s file_ [file ta
18000 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a  il $fileName]]..
18010 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
18020 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
18030 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76   fileName $nativ
18040 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  eFileNames {..  
18050 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76 65            remove
18060 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
18070 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 24 66 69  ndArgs file_ $fi
18080 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20  leName]..       
18090 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
180a0 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
180b0 6d 65 20 24 6d 61 6e 61 67 65 64 46 69 6c 65 4e  me $managedFileN
180c0 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
180d0 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72      removeConstr
180e0 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
180f0 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61 6d 65   file_ $fileName
18100 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
18110 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
18120 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
18130 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 61 6c 6c  # NOTE: Skip all
18140 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
18150 69 74 65 20 72 65 6c 61 74 65 64 20 66 69 6c 65  ite related file
18160 20 68 61 6e 64 6c 69 6e 67 20 28 64 65 6c 65 74   handling (delet
18170 69 6e 67 2c 0d 0a 20 20 20 20 20 20 20 20 23 20  ing,..        # 
18180 20 20 20 20 20 20 63 6f 70 79 69 6e 67 2c 20 61        copying, a
18190 6e 64 20 6c 6f 61 64 69 6e 67 29 20 69 66 20 69  nd loading) if i
181a0 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20  nstructed...    
181b0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
181c0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
181d0 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 46 69 6c 65   ::no(sqliteFile
181e0 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
181f0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
18200 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70      # NOTE: Skip
18210 20 74 72 79 69 6e 67 20 74 6f 20 64 65 6c 65 74   trying to delet
18220 65 20 61 6e 79 20 66 69 6c 65 73 20 69 66 20 69  e any files if i
18230 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20  nstructed...    
18240 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
18250 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
18260 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65  ists ::no(delete
18270 53 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20 74  SqliteFiles)]} t
18280 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
18290 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
182a0 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65  ists ::no(delete
182b0 53 71 6c 69 74 65 43 6f 6e 66 69 67 46 69 6c 65  SqliteConfigFile
182c0 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
182d0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61             forea
182e0 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 63 6f 6e  ch fileName $con
182f0 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  figFileNames {..
18300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18310 74 72 79 44 65 6c 65 74 65 42 69 6e 61 72 79 46  tryDeleteBinaryF
18320 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20  ile $fileName.. 
18330 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
18340 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
18350 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
18360 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
18370 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65  :no(deleteSqlite
18380 45 78 74 65 72 6e 61 6c 46 69 6c 65 73 29 5d 7d  ExternalFiles)]}
18390 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
183a0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
183b0 69 6c 65 4e 61 6d 65 20 24 6d 64 61 43 6f 6e 66  ileName $mdaConf
183c0 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  igFileNames {.. 
183d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
183e0 72 79 44 65 6c 65 74 65 42 75 69 6c 64 46 69 6c  ryDeleteBuildFil
183f0 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  e $fileName..   
18400 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
18410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
18420 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
18430 65 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65  externalFileName
18440 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
18450 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 42 69       tryDeleteBi
18460 6e 61 72 79 46 69 6c 65 20 24 66 69 6c 65 4e 61  naryFile $fileNa
18470 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  me..            
18480 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
18490 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
184a0 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
184b0 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53  sts ::no(deleteS
184c0 71 6c 69 74 65 4e 61 74 69 76 65 46 69 6c 65 73  qliteNativeFiles
184d0 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
184e0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
184f0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
18500 28 64 65 6c 65 74 65 53 71 6c 69 74 65 49 6d 70  (deleteSqliteImp
18510 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d 20 74 68  licitFiles)]} th
18520 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
18530 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
18540 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69  leName $nativeFi
18550 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
18560 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
18570 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 24  DeleteAssembly $
18580 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20  fileName..      
18590 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
185a0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
185b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
185c0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
185d0 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74  ::no(deleteSqlit
185e0 65 4e 6f 6e 49 6d 70 6c 69 63 69 74 46 69 6c 65  eNonImplicitFile
185f0 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
18600 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
18610 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
18620 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65  :no(deleteSqlite
18630 50 6c 61 74 66 6f 72 6d 46 69 6c 65 73 29 5d 20  PlatformFiles)] 
18640 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
18650 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
18660 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f  g length $platfo
18670 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  rm] > 0} then {.
18680 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18690 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
186a0 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e  ame $nativeFileN
186b0 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
186c0 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44              tryD
186d0 65 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 24 66  eleteAssembly $f
186e0 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72  ileName $platfor
186f0 6d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m..             
18700 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
18710 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
18720 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
18730 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
18740 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65  :no(deleteSqlite
18750 41 72 63 68 69 74 65 63 74 75 72 65 46 69 6c 65  ArchitectureFile
18760 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  s)] && \..      
18770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73                [s
18780 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 61 72  tring length $ar
18790 63 68 69 74 65 63 74 75 72 65 5d 20 3e 20 30 7d  chitecture] > 0}
187a0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
187b0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61             forea
187c0 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74  ch fileName $nat
187d0 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  iveFileNames {..
187e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
187f0 20 20 20 20 74 72 79 44 65 6c 65 74 65 41 73 73      tryDeleteAss
18800 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20  embly $fileName 
18810 24 61 72 63 68 69 74 65 63 74 75 72 65 0d 0a 20  $architecture.. 
18820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18830 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
18840 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
18850 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
18860 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
18870 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
18880 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65  exists ::no(dele
18890 74 65 53 71 6c 69 74 65 4d 61 6e 61 67 65 64 46  teSqliteManagedF
188a0 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
188b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
188c0 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
188d0 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73  managedFileNames
188e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
188f0 20 20 20 20 74 72 79 44 65 6c 65 74 65 41 73 73      tryDeleteAss
18900 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 0d  embly $fileName.
18910 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
18920 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
18930 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
18940 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
18950 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
18960 68 65 63 6b 20 66 6f 72 20 74 68 65 20 22 61 75  heck for the "au
18970 74 6f 53 65 6c 65 63 74 22 20 72 75 6e 74 69 6d  toSelect" runtim
18980 65 20 6f 70 74 69 6f 6e 2e 20 20 49 66 20 70 72  e option.  If pr
18990 65 73 65 6e 74 2c 0d 0a 20 20 20 20 20 20 20 20  esent,..        
189a0 20 20 23 20 20 20 20 20 20 20 61 74 74 65 6d 70    #       attemp
189b0 74 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c  t to automatical
189c0 6c 79 20 73 65 6c 65 63 74 20 74 68 65 20 66 69  ly select the fi
189d0 72 73 74 20 61 76 61 69 6c 61 62 6c 65 0d 0a 20  rst available.. 
189e0 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
189f0 20 62 75 69 6c 64 20 28 6f 72 20 22 72 65 6c 65   build (or "rele
18a00 61 73 65 22 29 20 6f 66 20 53 51 4c 69 74 65 20  ase") of SQLite 
18a10 61 6e 64 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  and System.Data.
18a20 53 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 20 20  SQLite..        
18a30 20 20 23 20 20 20 20 20 20 20 66 6f 72 20 75 73    #       for us
18a40 65 20 77 69 74 68 20 74 68 65 20 74 65 73 74 20  e with the test 
18a50 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20  suite...        
18a60 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69    #..          i
18a70 66 20 7b 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70  f {[hasRuntimeOp
18a80 74 69 6f 6e 20 61 75 74 6f 53 65 6c 65 63 74 5d  tion autoSelect]
18a90 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
18aa0 20 20 20 20 20 20 69 66 20 7b 21 5b 63 68 65 63        if {![chec
18ab0 6b 46 6f 72 53 51 4c 69 74 65 42 75 69 6c 64 73  kForSQLiteBuilds
18ac0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
18ad0 20 74 72 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a   true]} then {..
18ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68                ch
18af0 65 63 6b 46 6f 72 53 51 4c 69 74 65 52 65 6c 65  eckForSQLiteRele
18b00 61 73 65 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  ases $::test_cha
18b10 6e 6e 65 6c 20 74 72 75 65 0d 0a 20 20 20 20 20  nnel true..     
18b20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
18b30 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
18b40 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
18b50 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72 79  # NOTE: Skip try
18b60 69 6e 67 20 74 6f 20 76 65 72 69 66 79 20 74 68  ing to verify th
18b70 65 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72  e build director
18b80 79 20 69 66 20 69 6e 73 74 72 75 63 74 65 64 3b  y if instructed;
18b90 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
18ba0 20 20 20 20 6f 74 68 65 72 77 69 73 65 2c 20 6d      otherwise, m
18bb0 61 6b 65 20 73 75 72 65 20 69 74 20 61 63 74 75  ake sure it actu
18bc0 61 6c 6c 79 20 65 78 69 73 74 73 20 6f 72 20 68  ally exists or h
18bd0 61 6c 74 20 74 68 65 20 65 6e 74 69 72 65 0d 0a  alt the entire..
18be0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
18bf0 20 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73    testing proces
18c00 73 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  s if it does not
18c10 20 65 78 69 73 74 2e 0d 0a 20 20 20 20 20 20 20   exist...       
18c20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
18c30 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
18c40 73 20 3a 3a 6e 6f 28 76 65 72 69 66 79 42 75 69  s ::no(verifyBui
18c50 6c 64 44 69 72 65 63 74 6f 72 79 29 5d 7d 20 74  ldDirectory)]} t
18c60 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
18c70 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
18c80 20 20 23 20 4e 4f 54 45 3a 20 41 74 20 74 68 69    # NOTE: At thi
18c90 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 62 75 69  s point, the bui
18ca0 6c 64 20 64 69 72 65 63 74 6f 72 79 20 4d 55 53  ld directory MUS
18cb0 54 20 65 78 69 73 74 20 61 73 20 61 0d 0a 20 20  T exist as a..  
18cc0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
18cd0 20 20 76 61 6c 69 64 20 64 69 72 65 63 74 6f 72    valid director
18ce0 79 20 66 6f 72 20 74 68 65 20 74 65 73 74 69 6e  y for the testin
18cf0 67 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6e  g process to con
18d00 74 69 6e 75 65 2e 0d 0a 20 20 20 20 20 20 20 20  tinue...        
18d10 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
18d20 20 20 20 73 65 74 20 64 69 72 65 63 74 6f 72 79     set directory
18d30 20 5b 67 65 74 42 75 69 6c 64 44 69 72 65 63 74   [getBuildDirect
18d40 6f 72 79 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ory]....        
18d50 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65      if {![file e
18d60 78 69 73 74 73 20 24 64 69 72 65 63 74 6f 72 79  xists $directory
18d70 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] || \..        
18d80 20 20 20 20 20 20 20 20 21 5b 66 69 6c 65 20 69          ![file i
18d90 73 64 69 72 65 63 74 6f 72 79 20 24 64 69 72 65  sdirectory $dire
18da0 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ctory]} then {..
18db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
18dc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
18dd0 20 4e 4f 54 45 3a 20 4a 75 73 74 20 70 72 69 6f   NOTE: Just prio
18de0 72 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 68 61  r to actually ha
18df0 6c 74 69 6e 67 20 74 68 65 20 74 65 73 74 69 6e  lting the testin
18e00 67 20 70 72 6f 63 65 73 73 2c 0d 0a 20 20 20 20  g process,..    
18e10 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
18e20 20 20 61 64 64 20 61 6e 20 65 72 72 6f 72 20 74    add an error t
18e30 6f 20 74 68 65 20 74 65 73 74 20 6c 6f 67 20 66  o the test log f
18e40 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ile...          
18e50 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
18e60 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
18e70 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
18e80 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
18e90 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
18ea0 2d 20 63 6f 75 6c 64 20 6e 6f 74 20 76 65 72 69  - could not veri
18eb0 66 79 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f  fy build directo
18ec0 72 79 20 5c 22 22 20 24 64 69 72 65 63 74 6f 72  ry \"" $director
18ed0 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  y \..           
18ee0 20 20 20 20 20 20 20 22 5c 22 2c 20 61 6c 6c 20         "\", all 
18ef0 74 65 73 74 69 6e 67 20 68 61 6c 74 65 64 5c 6e  testing halted\n
18f00 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  "]....          
18f10 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
18f20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 61 69       # NOTE: Rai
18f30 73 69 6e 67 20 61 20 73 63 72 69 70 74 20 65 72  sing a script er
18f40 72 6f 72 20 66 72 6f 6d 20 74 68 69 73 20 70 6f  ror from this po
18f50 69 6e 74 20 73 68 6f 75 6c 64 20 68 61 6c 74 0d  int should halt.
18f60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
18f70 20 20 20 20 20 20 20 74 68 65 20 74 65 73 74 69         the testi
18f80 6e 67 20 70 72 6f 63 65 73 73 2e 0d 0a 20 20 20  ng process...   
18f90 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
18fa0 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f              erro
18fb0 72 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  r [appendArgs \.
18fc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18fd0 20 20 20 22 63 6f 75 6c 64 20 6e 6f 74 20 76 65     "could not ve
18fe0 72 69 66 79 20 62 75 69 6c 64 20 64 69 72 65 63  rify build direc
18ff0 74 6f 72 79 20 5c 22 22 20 24 64 69 72 65 63 74  tory \"" $direct
19000 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ory \..         
19010 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 61 6c           "\", al
19020 6c 20 74 65 73 74 69 6e 67 20 68 61 6c 74 65 64  l testing halted
19030 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  "]..            
19040 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
19050 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
19060 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
19070 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74 6f 20   Skip trying to 
19080 63 6f 70 79 20 61 6e 79 20 66 69 6c 65 73 20 69  copy any files i
19090 66 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20  f instructed... 
190a0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
190b0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
190c0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70   exists ::no(cop
190d0 79 53 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20  ySqliteFiles)]} 
190e0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
190f0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
19100 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53  xists ::no(copyS
19110 71 6c 69 74 65 43 6f 6e 66 69 67 46 69 6c 65 73  qliteConfigFiles
19120 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
19130 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
19140 68 20 66 69 6c 65 4e 61 6d 65 20 24 63 6f 6e 66  h fileName $conf
19150 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  igFileNames {.. 
19160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
19170 72 79 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20  ryCopyBuildFile 
19180 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  $fileName..     
19190 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
191a0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
191b0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
191c0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
191d0 63 6f 70 79 53 71 6c 69 74 65 45 78 74 65 72 6e  copySqliteExtern
191e0 61 6c 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  alFiles)]} then 
191f0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
19200 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
19210 20 20 23 20 4e 4f 54 45 3a 20 43 6f 70 79 20 74    # NOTE: Copy t
19220 68 65 20 4d 61 6e 61 67 65 64 20 44 65 62 75 67  he Managed Debug
19230 67 69 6e 67 20 41 73 73 69 73 74 61 6e 74 73 20  ging Assistants 
19240 28 4d 44 41 29 20 63 6f 6e 66 69 67 75 72 61 74  (MDA) configurat
19250 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ion..           
19260 20 20 20 23 20 20 20 20 20 20 20 66 69 6c 65 20     #       file 
19270 66 6f 72 20 74 68 65 20 45 61 67 6c 65 20 73 68  for the Eagle sh
19280 65 6c 6c 20 74 6f 20 74 68 65 20 62 75 69 6c 64  ell to the build
19290 20 6f 75 74 70 75 74 20 64 69 72 65 63 74 6f 72   output director
192a0 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y,..            
192b0 20 20 23 20 20 20 20 20 20 20 77 68 69 6c 65 20    #       while 
192c0 75 73 69 6e 67 20 65 61 63 68 20 6f 66 20 74 68  using each of th
192d0 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 76  e names of the v
192e0 61 72 69 6f 75 73 20 6c 65 67 61 63 79 20 74 65  arious legacy te
192f0 73 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  st..            
19300 20 20 23 20 20 20 20 20 20 20 65 78 65 63 75 74    #       execut
19310 61 62 6c 65 73 2e 20 20 54 68 69 73 20 77 69 6c  ables.  This wil
19320 6c 20 68 65 6c 70 20 74 6f 20 6d 61 6b 65 20 73  l help to make s
19330 75 72 65 20 74 68 61 74 20 61 6c 6c 20 74 68 65  ure that all the
19340 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19350 23 20 20 20 20 20 20 20 6c 65 67 61 63 79 20 74  #       legacy t
19360 65 73 74 73 20 72 75 6e 20 77 69 74 68 20 65 78  ests run with ex
19370 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 73  actly the same s
19380 65 74 20 6f 66 20 4d 61 6e 61 67 65 64 0d 0a 20  et of Managed.. 
19390 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
193a0 20 20 20 20 20 44 65 62 75 67 67 69 6e 67 20 41       Debugging A
193b0 73 73 69 73 74 61 6e 74 73 20 63 6f 6e 66 69 67  ssistants config
193c0 75 72 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20  ured...         
193d0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
193e0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
193f0 6c 65 4e 61 6d 65 20 24 6d 64 61 43 6f 6e 66 69  leName $mdaConfi
19400 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  gFileNames {..  
19410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
19420 79 43 6f 70 79 42 69 6e 61 72 79 46 69 6c 65 20  yCopyBinaryFile 
19430 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 2e 6d  EagleShell.exe.m
19440 64 61 2e 63 6f 6e 66 69 67 20 22 22 20 24 66 69  da.config "" $fi
19450 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20  leName..        
19460 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
19470 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
19480 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
19490 3a 20 43 6f 70 79 20 74 68 65 20 65 78 74 65 72  : Copy the exter
194a0 6e 61 6c 20 62 69 6e 61 72 69 65 73 2c 20 69 66  nal binaries, if
194b0 20 61 6e 79 2c 20 74 6f 20 74 68 65 20 64 69 72   any, to the dir
194c0 65 63 74 6f 72 79 20 74 68 61 74 0d 0a 20 20 20  ectory that..   
194d0 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
194e0 20 20 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20     contains the 
194f0 45 61 67 6c 65 20 73 68 65 6c 6c 2e 20 20 54 68  Eagle shell.  Th
19500 69 73 20 69 73 20 74 79 70 69 63 61 6c 6c 79 20  is is typically 
19510 75 73 65 64 20 74 6f 20 6d 61 6b 65 0d 0a 20 20  used to make..  
19520 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
19530 20 20 20 20 73 75 72 65 20 61 73 73 65 6d 62 6c      sure assembl
19540 69 65 73 20 72 65 66 65 72 65 6e 63 65 64 20 62  ies referenced b
19550 79 20 74 68 65 20 6f 6e 65 73 20 62 65 69 6e 67  y the ones being
19560 20 74 65 73 74 65 64 20 61 72 65 0d 0a 20 20 20   tested are..   
19570 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
19580 20 20 20 61 76 61 69 6c 61 62 6c 65 20 64 75 72     available dur
19590 69 6e 67 20 74 68 65 20 74 65 73 74 69 6e 67 20  ing the testing 
195a0 70 72 6f 63 65 73 73 2e 0d 0a 20 20 20 20 20 20  process...      
195b0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
195c0 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
195d0 20 66 69 6c 65 4e 61 6d 65 20 24 65 78 74 65 72   fileName $exter
195e0 6e 61 6c 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  nalFileNames {..
195f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19600 74 72 79 43 6f 70 79 45 78 74 65 72 6e 61 6c 46  tryCopyExternalF
19610 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20  ile $fileName.. 
19620 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
19630 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
19640 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
19650 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
19660 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 4e 61  :no(copySqliteNa
19670 74 69 76 65 46 69 6c 65 73 29 5d 7d 20 74 68 65  tiveFiles)]} the
19680 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
19690 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
196a0 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74      # NOTE: If t
196b0 68 65 20 74 65 73 74 20 70 6c 61 74 66 6f 72 6d  he test platform
196c0 20 69 73 20 6c 69 6b 65 6c 79 20 74 68 65 20 64   is likely the d
196d0 65 66 61 75 6c 74 20 66 6f 72 20 74 68 69 73 0d  efault for this.
196e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
196f0 20 20 20 20 20 20 20 6d 61 63 68 69 6e 65 2c 20         machine, 
19700 61 6c 73 6f 20 74 72 79 20 74 6f 20 63 6f 70 79  also try to copy
19710 20 74 68 65 20 6e 61 74 69 76 65 20 66 69 6c 65   the native file
19720 73 20 74 6f 20 74 68 65 0d 0a 20 20 20 20 20 20  s to the..      
19730 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
19740 62 69 6e 61 72 79 20 6c 6f 63 61 74 69 6f 6e 2e  binary location.
19750 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19760 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
19770 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
19780 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69  ts ::no(copySqli
19790 74 65 49 6d 70 6c 69 63 69 74 46 69 6c 65 73 29  teImplicitFiles)
197a0 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
197b0 20 20 20 20 20 20 20 20 20 20 5b 69 73 44 65 66            [isDef
197c0 61 75 6c 74 42 75 69 6c 64 50 6c 61 74 66 6f 72  aultBuildPlatfor
197d0 6d 20 74 72 75 65 5d 7d 20 74 68 65 6e 20 7b 0d  m true]} then {.
197e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
197f0 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
19800 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d  e $nativeFileNam
19810 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
19820 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 41          tryCopyA
19830 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d  ssembly $fileNam
19840 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
19850 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
19860 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
19870 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
19880 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f  o exists ::no(co
19890 70 79 53 71 6c 69 74 65 4e 6f 6e 49 6d 70 6c 69  pySqliteNonImpli
198a0 63 69 74 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  citFiles)]} then
198b0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
198c0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
198d0 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53  xists ::no(copyS
198e0 71 6c 69 74 65 50 6c 61 74 66 6f 72 6d 46 69 6c  qlitePlatformFil
198f0 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  es)] && \..     
19900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
19910 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70  string length $p
19920 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68  latform] > 0} th
19930 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
19940 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
19950 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65  fileName $native
19960 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
19970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19980 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79   tryCopyAssembly
19990 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74   $fileName $plat
199a0 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20 20 20  form..          
199b0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
199c0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
199d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199e0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
199f0 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74  s ::no(copySqlit
19a00 65 41 72 63 68 69 74 65 63 74 75 72 65 46 69 6c  eArchitectureFil
19a10 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  es)] && \..     
19a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
19a30 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 61  string length $a
19a40 72 63 68 69 74 65 63 74 75 72 65 5d 20 3e 20 30  rchitecture] > 0
19a50 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
19a60 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
19a70 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61  ach fileName $na
19a80 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  tiveFileNames {.
19a90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19aa0 20 20 20 20 20 74 72 79 43 6f 70 79 41 73 73 65       tryCopyAsse
19ab0 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 24  mbly $fileName $
19ac0 61 72 63 68 69 74 65 63 74 75 72 65 0d 0a 20 20  architecture..  
19ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ae0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
19af0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
19b00 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
19b10 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
19b20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
19b30 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53  xists ::no(copyS
19b40 71 6c 69 74 65 4d 61 6e 61 67 65 64 46 69 6c 65  qliteManagedFile
19b50 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
19b60 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61             forea
19b70 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 61 6e  ch fileName $man
19b80 61 67 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  agedFileNames {.
19b90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19ba0 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79   tryCopyAssembly
19bb0 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20   $fileName..    
19bc0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
19bd0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
19be0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
19bf0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
19c00 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74    # NOTE: Skip t
19c10 72 79 69 6e 67 20 74 6f 20 6c 6f 61 64 20 61 6e  rying to load an
19c20 79 20 66 69 6c 65 73 20 69 66 20 69 6e 73 74 72  y files if instr
19c30 75 63 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20  ucted...        
19c40 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69    #..          i
19c50 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
19c60 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65   ::no(loadSqlite
19c70 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
19c80 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
19c90 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
19ca0 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 49 6d  :no(loadSqliteIm
19cb0 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d 20 74  plicitFiles)]} t
19cc0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
19cd0 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73 65       tryLoadAsse
19ce0 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61  mbly System.Data
19cf0 2e 53 51 4c 69 74 65 2e 64 6c 6c 0d 0a 20 20 20  .SQLite.dll..   
19d00 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
19d10 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
19d20 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
19d30 28 6c 6f 61 64 53 71 6c 69 74 65 4c 69 6e 71 46  (loadSqliteLinqF
19d40 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
19d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
19d60 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20 53 79  yLoadAssembly Sy
19d70 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
19d80 2e 4c 69 6e 71 2e 64 6c 6c 0d 0a 20 20 20 20 20  .Linq.dll..     
19d90 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
19da0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
19db0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c  fo exists ::no(l
19dc0 6f 61 64 53 71 6c 69 74 65 45 66 36 46 69 6c 65  oadSqliteEf6File
19dd0 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
19de0 20 20 20 20 20 20 20 20 20 20 20 74 72 79 4c 6f             tryLo
19df0 61 64 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65  adAssembly Syste
19e00 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 45 46  m.Data.SQLite.EF
19e10 36 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20  6.dll..         
19e20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
19e30 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
19e40 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53  xists ::no(loadS
19e50 71 6c 69 74 65 4e 6f 6e 49 6d 70 6c 69 63 69 74  qliteNonImplicit
19e60 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
19e70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
19e80 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
19e90 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65   ::no(loadSqlite
19ea0 50 6c 61 74 66 6f 72 6d 46 69 6c 65 73 29 5d 20  PlatformFiles)] 
19eb0 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
19ec0 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
19ed0 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d  length $platform
19ee0 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
19ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
19f00 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20 53  ryLoadAssembly S
19f10 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
19f20 65 2e 64 6c 6c 20 24 70 6c 61 74 66 6f 72 6d 0d  e.dll $platform.
19f30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
19f40 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
19f50 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
19f60 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c  sts ::no(loadSql
19f70 69 74 65 41 72 63 68 69 74 65 63 74 75 72 65 46  iteArchitectureF
19f80 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20  iles)] && \..   
19f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
19fa0 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 61  string length $a
19fb0 72 63 68 69 74 65 63 74 75 72 65 5d 20 3e 20 30  rchitecture] > 0
19fc0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
19fd0 20 20 20 20 20 20 20 20 20 20 74 72 79 4c 6f 61            tryLoa
19fe0 64 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65 6d  dAssembly System
19ff0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
1a000 20 24 61 72 63 68 69 74 65 63 74 75 72 65 0d 0a   $architecture..
1a010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
1a020 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
1a030 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1a040 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1a050 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20    catch {..     
1a060 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
1a070 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
1a080 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1a090 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69          "---- fi
1a0a0 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22  le version of \"
1a0b0 73 71 6c 69 74 65 33 2e 64 6c 6c 5c 22 2e 2e 2e  sqlite3.dll\"...
1a0c0 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
1a0d0 20 20 20 20 5b 66 69 6c 65 20 76 65 72 73 69 6f      [file versio
1a0e0 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65  n [getBinaryFile
1a0f0 4e 61 6d 65 20 73 71 6c 69 74 65 33 2e 64 6c 6c  Name sqlite3.dll
1a100 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ]] \n]..        
1a110 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74  }....        cat
1a120 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
1a130 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
1a140 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1a150 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1a160 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65     "---- file ve
1a170 72 73 69 6f 6e 20 6f 66 20 5c 22 53 51 4c 69 74  rsion of \"SQLit
1a180 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 5c 22 2e  e.Interop.dll\".
1a190 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  .. " \..        
1a1a0 20 20 20 20 20 20 5b 66 69 6c 65 20 76 65 72 73        [file vers
1a1b0 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69  ion [getBinaryFi
1a1c0 6c 65 4e 61 6d 65 20 53 51 4c 69 74 65 2e 49 6e  leName SQLite.In
1a1d0 74 65 72 6f 70 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d  terop.dll]] \n].
1a1e0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
1a1f0 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20        catch {.. 
1a200 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1a210 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
1a220 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1a230 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
1a240 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f  - file version o
1a250 66 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e  f \"System.Data.
1a260 53 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20  SQLite.dll\"... 
1a270 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
1a280 20 20 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e     [file version
1a290 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
1a2a0 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  ame System.Data.
1a2b0 53 51 4c 69 74 65 2e 64 6c 6c 5d 5d 20 5c 6e 5d  SQLite.dll]] \n]
1a2c0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
1a2d0 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a         catch {..
1a2e0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1a2f0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
1a300 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1a310 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
1a320 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20  -- file version 
1a330 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61  of \"System.Data
1a340 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c  .SQLite.Linq.dll
1a350 5c 22 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20  \"... " \..     
1a360 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 76           [file v
1a370 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72  ersion [getBinar
1a380 79 46 69 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d  yFileName System
1a390 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e  .Data.SQLite.Lin
1a3a0 71 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20 20  q.dll]] \n]..   
1a3b0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1a3c0 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20    catch {..     
1a3d0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
1a3e0 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
1a3f0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1a400 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69          "---- fi
1a410 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22  le version of \"
1a420 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
1a430 74 65 2e 45 46 36 2e 64 6c 6c 5c 22 2e 2e 2e 20  te.EF6.dll\"... 
1a440 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
1a450 20 20 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e     [file version
1a460 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
1a470 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  ame System.Data.
1a480 53 51 4c 69 74 65 2e 45 46 36 2e 64 6c 6c 5d 5d  SQLite.EF6.dll]]
1a490 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d   \n]..        }.
1a4a0 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  ...        if {[
1a4b0 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70  string length $p
1a4c0 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68  latform] > 0} th
1a4d0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1a4e0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
1a4f0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
1a500 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
1a510 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1a520 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
1a530 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20  file version of 
1a540 5c 22 22 20 24 70 6c 61 74 66 6f 72 6d 20 5c 0d  \"" $platform \.
1a550 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a560 20 22 2f 73 71 6c 69 74 65 33 2e 64 6c 6c 5c 22   "/sqlite3.dll\"
1a570 2e 2e 2e 20 22 20 5b 66 69 6c 65 20 76 65 72 73  ... " [file vers
1a580 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ion \..         
1a590 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61 72         [getBinar
1a5a0 79 46 69 6c 65 4e 61 6d 65 20 73 71 6c 69 74 65  yFileName sqlite
1a5b0 33 2e 64 6c 6c 20 24 70 6c 61 74 66 6f 72 6d 5d  3.dll $platform]
1a5c0 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  ] \n]..         
1a5d0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
1a5e0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
1a5f0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
1a600 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
1a610 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1a620 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
1a630 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20  file version of 
1a640 5c 22 22 20 24 70 6c 61 74 66 6f 72 6d 20 5c 0d  \"" $platform \.
1a650 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a660 20 22 2f 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f   "/SQLite.Intero
1a670 70 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5b 66 69  p.dll\"... " [fi
1a680 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20 20  le version \..  
1a690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67                [g
1a6a0 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  etBinaryFileName
1a6b0 20 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e   SQLite.Interop.
1a6c0 64 6c 6c 20 24 70 6c 61 74 66 6f 72 6d 5d 5d 20  dll $platform]] 
1a6d0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
1a6e0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61  ....          ca
1a6f0 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
1a700 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
1a710 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
1a720 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1a730 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69          "---- fi
1a740 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22  le version of \"
1a750 22 20 24 70 6c 61 74 66 6f 72 6d 20 5c 0d 0a 20  " $platform \.. 
1a760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1a770 2f 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  /System.Data.SQL
1a780 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5b  ite.dll\"... " [
1a790 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a  file version \..
1a7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7b0 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61  [getBinaryFileNa
1a7c0 6d 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  me System.Data.S
1a7d0 51 4c 69 74 65 2e 64 6c 6c 20 24 70 6c 61 74 66  QLite.dll $platf
1a7e0 6f 72 6d 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20  orm]] \n]..     
1a7f0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1a800 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
1a810 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
1a820 24 61 72 63 68 69 74 65 63 74 75 72 65 5d 20 3e  $architecture] >
1a830 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1a840 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20        catch {.. 
1a850 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1a860 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1a870 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1a880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a890 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69  "---- file versi
1a8a0 6f 6e 20 6f 66 20 5c 22 22 20 24 61 72 63 68 69  on of \"" $archi
1a8b0 74 65 63 74 75 72 65 20 5c 0d 0a 20 20 20 20 20  tecture \..     
1a8c0 20 20 20 20 20 20 20 20 20 20 20 22 2f 73 71 6c             "/sql
1a8d0 69 74 65 33 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20  ite3.dll\"... " 
1a8e0 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d  [file version \.
1a8f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a900 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
1a910 61 6d 65 20 73 71 6c 69 74 65 33 2e 64 6c 6c 20  ame sqlite3.dll 
1a920 24 61 72 63 68 69 74 65 63 74 75 72 65 5d 5d 20  $architecture]] 
1a930 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
1a940 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61  ....          ca
1a950 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
1a960 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
1a970 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
1a980 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1a990 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69          "---- fi
1a9a0 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22  le version of \"
1a9b0 22 20 24 61 72 63 68 69 74 65 63 74 75 72 65 20  " $architecture 
1a9c0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1a9d0 20 20 20 22 2f 53 51 4c 69 74 65 2e 49 6e 74 65     "/SQLite.Inte
1a9e0 72 6f 70 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5b  rop.dll\"... " [
1a9f0 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a  file version \..
1aa00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa10 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61  [getBinaryFileNa
1aa20 6d 65 20 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f  me SQLite.Intero
1aa30 70 2e 64 6c 6c 20 24 61 72 63 68 69 74 65 63 74  p.dll $architect
1aa40 75 72 65 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20  ure]] \n]..     
1aa50 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1aa60 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
1aa70 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1aa80 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
1aa90 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1aaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
1aab0 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e  --- file version
1aac0 20 6f 66 20 5c 22 22 20 24 61 72 63 68 69 74 65   of \"" $archite
1aad0 63 74 75 72 65 20 5c 0d 0a 20 20 20 20 20 20 20  cture \..       
1aae0 20 20 20 20 20 20 20 20 20 22 2f 53 79 73 74 65           "/Syste
1aaf0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
1ab00 6c 5c 22 2e 2e 2e 20 22 20 5b 66 69 6c 65 20 76  l\"... " [file v
1ab10 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20  ersion \..      
1ab20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 69            [getBi
1ab30 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 53 79 73  naryFileName Sys
1ab40 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
1ab50 64 6c 6c 20 24 61 72 63 68 69 74 65 63 74 75 72  dll $architectur
1ab60 65 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  e]] \n]..       
1ab70 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
1ab80 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1ab90 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 47 72        # NOTE: Gr
1aba0 61 62 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6d  ab the list of m
1abb0 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 69 65  anaged assemblie
1abc0 73 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  s for the curren
1abd0 74 20 70 72 6f 63 65 73 73 0d 0a 20 20 20 20 20  t process..     
1abe0 20 20 20 23 20 20 20 20 20 20 20 61 6e 64 20 72     #       and r
1abf0 65 70 6f 72 74 20 6f 6e 20 74 68 65 20 53 79 73  eport on the Sys
1ac00 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
1ac10 72 65 6c 61 74 65 64 20 6f 6e 65 73 2e 0d 0a 20  related ones... 
1ac20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1ac30 20 20 73 65 74 20 61 73 73 65 6d 62 6c 69 65 73    set assemblies
1ac40 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   [object invoke 
1ac50 41 70 70 44 6f 6d 61 69 6e 2e 43 75 72 72 65 6e  AppDomain.Curren
1ac60 74 44 6f 6d 61 69 6e 20 47 65 74 41 73 73 65 6d  tDomain GetAssem
1ac70 62 6c 69 65 73 5d 0d 0a 0d 0a 20 20 20 20 20 20  blies]....      
1ac80 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68    object foreach
1ac90 20 61 73 73 65 6d 62 6c 79 20 24 61 73 73 65 6d   assembly $assem
1aca0 62 6c 69 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  blies {..       
1acb0 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d     if {[string m
1acc0 61 74 63 68 20 5c 7b 53 79 73 74 65 6d 2e 44 61  atch \{System.Da
1acd0 74 61 2e 53 51 4c 69 74 65 2a 20 24 61 73 73 65  ta.SQLite* $asse
1ace0 6d 62 6c 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  mbly]} then {.. 
1acf0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1ad00 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1ad10 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1ad20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad30 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c 6f 61 64  "---- found load
1ad40 65 64 20 61 73 73 65 6d 62 6c 79 3a 20 22 20 24  ed assembly: " $
1ad50 61 73 73 65 6d 62 6c 79 20 5c 6e 5d 0d 0a 20 20  assembly \n]..  
1ad60 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1ad70 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1ad80 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
1ad90 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
1ada0 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20  _channel \..    
1adb0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
1adc0 64 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74 73  define constants
1add0 20 66 6f 72 20 5c 22 53 79 73 74 65 6d 2e 44 61   for \"System.Da
1ade0 74 61 2e 53 51 4c 69 74 65 5c 22 2e 2e 2e 20 22  ta.SQLite\"... "
1adf0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
1ae00 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
1ae10 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
1ae20 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
1ae30 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
1ae40 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
1ae50 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51  m.Data.SQLite.SQ
1ae60 4c 69 74 65 33 20 44 65 66 69 6e 65 43 6f 6e 73  Lite3 DefineCons
1ae70 74 61 6e 74 73 0d 0a 20 20 20 20 20 20 20 20 20  tants..         
1ae80 20 7d 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e   } defineConstan
1ae90 74 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  ts] == 0} then {
1aea0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
1aeb0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
1aec0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1aed0 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73 6f  [formatList [lso
1aee0 72 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  rt \..          
1aef0 20 20 20 20 20 20 24 64 65 66 69 6e 65 43 6f 6e        $defineCon
1af00 73 74 61 6e 74 73 5d 20 3c 6e 6f 6e 65 3e 5d 20  stants] <none>] 
1af10 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
1af20 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1af30 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
1af40 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f  st_channel unkno
1af50 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  wn\n..          
1af60 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
1af70 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d          catch {.
1af80 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
1af90 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1afa0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1afb0 20 20 22 2d 2d 2d 2d 20 73 6f 75 72 63 65 20 76    "---- source v
1afc0 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53 79 73 74  ersion of \"Syst
1afd0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
1afe0 6c 6c 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  ll\"... "....   
1aff0 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
1b000 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
1b010 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
1b020 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
1b030 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1b040 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
1b050 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 43 6f 6e  SQLite.SQLiteCon
1b060 6e 65 63 74 69 6f 6e 20 50 72 6f 76 69 64 65 72  nection Provider
1b070 56 65 72 73 69 6f 6e 0d 0a 20 20 20 20 20 20 20  Version..       
1b080 20 20 20 7d 20 76 65 72 73 69 6f 6e 5d 20 3d 3d     } version] ==
1b090 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1b0a0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
1b0b0 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72 73  ing length $vers
1b0c0 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ion] == 0} then 
1b0d0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1b0e0 20 73 65 74 20 76 65 72 73 69 6f 6e 20 6e 75 6c   set version nul
1b0f0 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  l..            }
1b100 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
1b110 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
1b120 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1b130 24 76 65 72 73 69 6f 6e 20 5c 6e 5d 0d 0a 20 20  $version \n]..  
1b140 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
1b150 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
1b160 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
1b170 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20  nel unknown\n.. 
1b180 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1b190 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1b1a0 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20   catch {..      
1b1b0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
1b1c0 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20  t_channel \..   
1b1d0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
1b1e0 20 73 6f 75 72 63 65 20 63 68 65 63 6b 6f 75 74   source checkout
1b1f0 20 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44 61 74   of \"System.Dat
1b200 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e  a.SQLite.dll\"..
1b210 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  . "....         
1b220 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
1b230 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63             objec
1b240 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
1b250 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
1b260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
1b270 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
1b280 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f  .SQLiteConnectio
1b290 6e 20 50 72 6f 76 69 64 65 72 53 6f 75 72 63 65  n ProviderSource
1b2a0 49 64 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  Id..          } 
1b2b0 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20  sourceId] == 0} 
1b2c0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1b2d0 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
1b2e0 6c 65 6e 67 74 68 20 24 73 6f 75 72 63 65 49 64  length $sourceId
1b2f0 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
1b300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
1b310 74 20 73 6f 75 72 63 65 49 64 20 6e 75 6c 6c 0d  t sourceId null.
1b320 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
1b330 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1b340 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1b350 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 73  l [appendArgs $s
1b360 6f 75 72 63 65 49 64 20 5c 6e 5d 0d 0a 20 20 20  ourceId \n]..   
1b370 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
1b380 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
1b390 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
1b3a0 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20  el unknown\n..  
1b3b0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1b3c0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1b3d0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
1b3e0 45 3a 20 43 68 65 63 6b 20 74 68 65 20 61 76 61  E: Check the ava
1b3f0 69 6c 61 62 6c 65 20 62 75 69 6c 64 73 20 28 61  ilable builds (a
1b400 6e 64 20 22 72 65 6c 65 61 73 65 73 22 29 20 6f  nd "releases") o
1b410 66 20 53 51 4c 69 74 65 20 61 6e 64 0d 0a 20 20  f SQLite and..  
1b420 20 20 20 20 20 20 23 20 20 20 20 20 20 20 53 79        #       Sy
1b430 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
1b440 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1b450 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51        checkForSQ
1b460 4c 69 74 65 42 75 69 6c 64 73 20 24 3a 3a 74 65  LiteBuilds $::te
1b470 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20  st_channel..    
1b480 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69      checkForSQLi
1b490 74 65 52 65 6c 65 61 73 65 73 20 24 3a 3a 74 65  teReleases $::te
1b4a0 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20  st_channel....  
1b4b0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1b4c0 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 2c 20 77 65   # NOTE: Now, we
1b4d0 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 66   need to know if
1b4e0 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65   the SQLite core
1b4f0 20 6c 69 62 72 61 72 79 20 69 73 20 61 76 61 69   library is avai
1b500 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 23  lable..        #
1b510 20 20 20 20 20 20 20 28 69 2e 65 2e 20 62 65 63         (i.e. bec
1b520 61 75 73 65 20 74 68 65 20 6d 61 6e 61 67 65 64  ause the managed
1b530 2d 6f 6e 6c 79 20 53 79 73 74 65 6d 2e 44 61 74  -only System.Dat
1b540 61 2e 53 51 4c 69 74 65 20 61 73 73 65 6d 62 6c  a.SQLite assembl
1b550 79 20 63 61 6e 0d 0a 20 20 20 20 20 20 20 20 23  y can..        #
1b560 20 20 20 20 20 20 20 6c 6f 61 64 20 77 69 74 68         load with
1b570 6f 75 74 20 69 74 3b 20 68 6f 77 65 76 65 72 2c  out it; however,
1b580 20 69 74 20 63 61 6e 6e 6f 74 20 64 6f 20 61 6e   it cannot do an
1b590 79 74 68 69 6e 67 20 75 73 65 66 75 6c 20 77 69  ything useful wi
1b5a0 74 68 6f 75 74 0d 0a 20 20 20 20 20 20 20 20 23  thout..        #
1b5b0 20 20 20 20 20 20 20 69 74 29 2e 20 20 49 66 20         it).  If 
1b5c0 77 65 20 61 72 65 20 75 73 69 6e 67 20 74 68 65  we are using the
1b5d0 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65   mixed-mode asse
1b5e0 6d 62 6c 79 20 61 6e 64 20 77 65 20 61 6c 72 65  mbly and we alre
1b5f0 61 64 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ady..        #  
1b600 20 20 20 20 20 66 6f 75 6e 64 20 69 74 20 28 61       found it (a
1b610 62 6f 76 65 29 2c 20 74 68 69 73 20 73 68 6f 75  bove), this shou
1b620 6c 64 20 61 6c 77 61 79 73 20 73 75 63 63 65 65  ld always succee
1b630 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  d...        #.. 
1b640 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53         checkForS
1b650 51 4c 69 74 65 4c 69 62 72 61 72 79 20 24 3a 3a  QLiteLibrary $::
1b660 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a  test_channel....
1b670 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1b680 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
1b690 20 69 66 20 74 68 65 20 53 51 4c 69 74 65 20 69   if the SQLite i
1b6a0 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20  nterop assembly 
1b6b0 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20  is available... 
1b6c0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1b6d0 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65    checkForSQLite
1b6e0 49 6e 74 65 72 6f 70 20 24 3a 3a 74 65 73 74 5f  Interop $::test_
1b6f0 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20  channel....     
1b700 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1b710 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20  NOTE: Check the 
1b720 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20  SQLite database 
1b730 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 64 69  and temporary di
1b740 72 65 63 74 6f 72 69 65 73 2e 0d 0a 20 20 20 20  rectories...    
1b750 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63      #..        c
1b760 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 69 72  heckForSQLiteDir
1b770 65 63 74 6f 72 69 65 73 20 24 3a 3a 74 65 73 74  ectories $::test
1b780 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20  _channel....    
1b790 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1b7a0 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
1b7b0 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 76  o determine if v
1b7c0 61 72 69 6f 75 73 20 63 6f 6d 70 69 6c 65 2d 74  arious compile-t
1b7d0 69 6d 65 20 6f 70 74 69 6f 6e 73 20 6e 65 65 64  ime options need
1b7e0 65 64 20 66 6f 72 0d 0a 20 20 20 20 20 20 20 20  ed for..        
1b7f0 23 20 20 20 20 20 20 20 74 65 73 74 20 63 6f 6e  #       test con
1b800 73 74 72 61 69 6e 74 73 20 77 65 72 65 20 65 6e  straints were en
1b810 61 62 6c 65 64 20 66 6f 72 20 74 68 65 20 6d 61  abled for the ma
1b820 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 2e 20  naged assembly. 
1b830 20 54 68 65 72 65 0d 0a 20 20 20 20 20 20 20 20   There..        
1b840 23 20 20 20 20 20 20 20 61 72 65 20 73 6f 6d 65  #       are some
1b850 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
1b860 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20  tions that must 
1b870 61 6c 73 6f 20 68 61 76 65 20 62 65 65 6e 20 65  also have been e
1b880 6e 61 62 6c 65 64 0d 0a 20 20 20 20 20 20 20 20  nabled..        
1b890 23 20 20 20 20 20 20 20 66 6f 72 20 74 68 65 20  #       for the 
1b8a0 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79  interop assembly
1b8b0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20   in order to be 
1b8c0 65 66 66 65 63 74 69 76 65 2e 20 20 46 6f 72 20  effective.  For 
1b8d0 74 68 6f 73 65 0d 0a 20 20 20 20 20 20 20 20 23  those..        #
1b8e0 20 20 20 20 20 20 20 6f 70 74 69 6f 6e 73 2c 20         options, 
1b8f0 69 74 20 77 69 6c 6c 20 62 65 20 61 73 73 75 6d  it will be assum
1b900 65 64 20 74 68 61 74 20 69 74 20 77 61 73 20 65  ed that it was e
1b910 6e 61 62 6c 65 64 20 66 6f 72 20 74 68 65 20 69  nabled for the i
1b920 6e 74 65 72 6f 70 0d 0a 20 20 20 20 20 20 20 20  nterop..        
1b930 23 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79  #       assembly
1b940 20 69 66 20 69 74 20 77 61 73 20 65 6e 61 62 6c   if it was enabl
1b950 65 64 20 66 6f 72 20 74 68 65 20 6d 61 6e 61 67  ed for the manag
1b960 65 64 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20  ed assembly...  
1b970 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1b980 20 66 6f 72 65 61 63 68 20 64 65 66 69 6e 65 43   foreach defineC
1b990 6f 6e 73 74 61 6e 74 20 5b 6c 69 73 74 20 5c 0d  onstant [list \.
1b9a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 43 48 45  .            CHE
1b9b0 43 4b 5f 53 54 41 54 45 20 43 4f 55 4e 54 5f 48  CK_STATE COUNT_H
1b9c0 41 4e 44 4c 45 20 44 45 42 55 47 20 49 4e 54 45  ANDLE DEBUG INTE
1b9d0 52 4f 50 5f 43 4f 44 45 43 20 49 4e 54 45 52 4f  ROP_CODEC INTERO
1b9e0 50 5f 44 45 42 55 47 20 5c 0d 0a 20 20 20 20 20  P_DEBUG \..     
1b9f0 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 45         INTEROP_E
1ba00 58 54 45 4e 53 49 4f 4e 5f 46 55 4e 43 54 49 4f  XTENSION_FUNCTIO
1ba10 4e 53 20 49 4e 54 45 52 4f 50 5f 4c 45 47 41 43  NS INTEROP_LEGAC
1ba20 59 5f 43 4c 4f 53 45 20 49 4e 54 45 52 4f 50 5f  Y_CLOSE INTEROP_
1ba30 4c 4f 47 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  LOG \..         
1ba40 20 20 20 49 4e 54 45 52 4f 50 5f 54 45 53 54 5f     INTEROP_TEST_
1ba50 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54 45 52 4f  EXTENSION INTERO
1ba60 50 5f 56 49 52 54 55 41 4c 5f 54 41 42 4c 45 20  P_VIRTUAL_TABLE 
1ba70 4e 45 54 5f 32 30 20 4e 45 54 5f 33 35 20 5c 0d  NET_20 NET_35 \.
1ba80 0a 20 20 20 20 20 20 20 20 20 20 20 20 4e 45 54  .            NET
1ba90 5f 34 30 20 4e 45 54 5f 34 35 20 4e 45 54 5f 34  _40 NET_45 NET_4
1baa0 35 31 20 4e 45 54 5f 43 4f 4d 50 41 43 54 5f 32  51 NET_COMPACT_2
1bab0 30 20 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50 41  0 PLATFORM_COMPA
1bac0 43 54 46 52 41 4d 45 57 4f 52 4b 20 5c 0d 0a 20  CTFRAMEWORK \.. 
1bad0 20 20 20 20 20 20 20 20 20 20 20 50 52 45 4c 4f             PRELO
1bae0 41 44 5f 4e 41 54 49 56 45 5f 4c 49 42 52 41 52  AD_NATIVE_LIBRAR
1baf0 59 20 52 45 54 41 52 47 45 54 41 42 4c 45 20 53  Y RETARGETABLE S
1bb00 51 4c 49 54 45 5f 53 54 41 4e 44 41 52 44 20 5c  QLITE_STANDARD \
1bb10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 48  ..            TH
1bb20 52 4f 57 5f 4f 4e 5f 44 49 53 50 4f 53 45 44 20  ROW_ON_DISPOSED 
1bb30 54 52 41 43 45 20 54 52 41 43 45 5f 43 4f 4e 4e  TRACE TRACE_CONN
1bb40 45 43 54 49 4f 4e 20 54 52 41 43 45 5f 44 45 54  ECTION TRACE_DET
1bb50 45 43 54 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20  ECTION \..      
1bb60 20 20 20 20 20 20 54 52 41 43 45 5f 48 41 4e 44        TRACE_HAND
1bb70 4c 45 20 54 52 41 43 45 5f 50 52 45 4c 4f 41 44  LE TRACE_PRELOAD
1bb80 20 54 52 41 43 45 5f 53 48 41 52 45 44 20 54 52   TRACE_SHARED TR
1bb90 41 43 45 5f 53 54 41 54 45 4d 45 4e 54 20 5c 0d  ACE_STATEMENT \.
1bba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 52 41  .            TRA
1bbb0 43 45 5f 57 41 52 4e 49 4e 47 20 54 52 41 43 4b  CE_WARNING TRACK
1bbc0 5f 4d 45 4d 4f 52 59 5f 42 59 54 45 53 20 55 53  _MEMORY_BYTES US
1bbd0 45 5f 45 4e 54 49 54 59 5f 46 52 41 4d 45 57 4f  E_ENTITY_FRAMEWO
1bbe0 52 4b 5f 36 20 5c 0d 0a 20 20 20 20 20 20 20 20  RK_6 \..        
1bbf0 20 20 20 20 55 53 45 5f 49 4e 54 45 52 4f 50 5f      USE_INTEROP_
1bc00 44 4c 4c 20 55 53 45 5f 50 52 45 50 41 52 45 5f  DLL USE_PREPARE_
1bc10 56 32 20 57 49 4e 44 4f 57 53 5d 20 7b 0d 0a 20  V2 WINDOWS] {.. 
1bc20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1bc30 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
1bc40 65 63 6b 20 69 66 20 74 68 65 20 63 6f 6d 70 69  eck if the compi
1bc50 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69  le-time option i
1bc60 73 20 6c 69 73 74 65 64 20 69 6e 20 74 68 65 20  s listed in the 
1bc70 6c 69 73 74 20 6f 66 0d 0a 20 20 20 20 20 20 20  list of..       
1bc80 20 20 20 23 20 20 20 20 20 20 20 22 64 65 66 69     #       "defi
1bc90 6e 65 20 63 6f 6e 73 74 61 6e 74 73 22 20 6b 65  ne constants" ke
1bca0 70 74 20 74 72 61 63 6b 20 6f 66 20 62 79 20 74  pt track of by t
1bcb0 68 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d  he managed assem
1bcc0 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  bly...          
1bcd0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65  #..          che
1bce0 63 6b 46 6f 72 53 51 4c 69 74 65 44 65 66 69 6e  ckForSQLiteDefin
1bcf0 65 43 6f 6e 73 74 61 6e 74 20 24 3a 3a 74 65 73  eConstant $::tes
1bd00 74 5f 63 68 61 6e 6e 65 6c 20 24 64 65 66 69 6e  t_channel $defin
1bd10 65 43 6f 6e 73 74 61 6e 74 0d 0a 20 20 20 20 20  eConstant..     
1bd20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1bd30 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
1bd40 45 3a 20 43 68 65 63 6b 20 74 68 65 20 63 75 72  E: Check the cur
1bd50 72 65 6e 74 20 62 75 69 6c 64 20 79 65 61 72 2e  rent build year.
1bd60 20 20 42 61 73 69 63 61 6c 6c 79 2c 20 74 68 69    Basically, thi
1bd70 73 20 69 6e 64 69 63 61 74 65 73 0d 0a 20 20 20  s indicates..   
1bd80 20 20 20 20 20 23 20 20 20 20 20 20 20 77 68 69       #       whi
1bd90 63 68 20 76 65 72 73 69 6f 6e 20 6f 66 20 4d 53  ch version of MS
1bda0 42 75 69 6c 64 20 61 6e 64 2f 6f 72 20 56 69 73  Build and/or Vis
1bdb0 75 61 6c 20 53 74 75 64 69 6f 20 77 61 73 20 75  ual Studio was u
1bdc0 73 65 64 20 74 6f 0d 0a 20 20 20 20 20 20 20 20  sed to..        
1bdd0 23 20 20 20 20 20 20 20 63 6f 6d 70 69 6c 65 20  #       compile 
1bde0 74 68 65 20 61 73 73 65 6d 62 6c 79 20 62 69 6e  the assembly bin
1bdf0 61 72 69 65 73 20 75 6e 64 65 72 20 74 65 73 74  aries under test
1be00 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1be10 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
1be20 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20  est_channel \.. 
1be30 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
1be40 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79   checking for Sy
1be50 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
1be60 20 62 75 69 6c 64 20 79 65 61 72 2e 2e 2e 20 22   build year... "
1be70 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
1be80 79 65 61 72 20 5b 67 65 74 42 75 69 6c 64 59 65  year [getBuildYe
1be90 61 72 5d 0d 0a 20 20 20 20 20 20 20 20 61 64 64  ar]..        add
1bea0 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
1beb0 6e 64 41 72 67 73 20 62 75 69 6c 64 59 65 61 72  ndArgs buildYear
1bec0 2e 20 24 79 65 61 72 5d 0d 0a 20 20 20 20 20 20  . $year]..      
1bed0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
1bee0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1bef0 72 67 73 20 5c 22 20 24 79 65 61 72 20 5c 22 5c  rgs \" $year \"\
1bf00 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  n]....        #.
1bf10 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
1bf20 20 43 68 65 63 6b 20 74 68 65 20 63 75 72 72 65   Check the curre
1bf30 6e 74 20 62 75 69 6c 64 20 2e 4e 45 54 20 46 72  nt build .NET Fr
1bf40 61 6d 65 77 6f 72 6b 2e 20 20 42 61 73 69 63 61  amework.  Basica
1bf50 6c 6c 79 2c 20 74 68 69 73 0d 0a 20 20 20 20 20  lly, this..     
1bf60 20 20 20 23 20 20 20 20 20 20 20 69 6e 64 69 63     #       indic
1bf70 61 74 65 73 20 77 68 69 63 68 20 76 65 72 73 69  ates which versi
1bf80 6f 6e 20 6f 66 20 74 68 65 20 2e 4e 45 54 20 46  on of the .NET F
1bf90 72 61 6d 65 77 6f 72 6b 20 69 73 20 62 65 69 6e  ramework is bein
1bfa0 67 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  g..        #    
1bfb0 20 20 20 75 73 65 64 20 62 79 20 74 68 65 20 61     used by the a
1bfc0 73 73 65 6d 62 6c 79 20 62 69 6e 61 72 69 65 73  ssembly binaries
1bfd0 20 75 6e 64 65 72 20 74 65 73 74 2e 0d 0a 20 20   under test...  
1bfe0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1bff0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
1c000 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20  hannel \..      
1c010 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63        "---- chec
1c020 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e  king for System.
1c030 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75 69 6c  Data.SQLite buil
1c040 64 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b  d .NET Framework
1c050 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20  ... "....       
1c060 20 73 65 74 20 6e 65 74 46 78 20 5b 67 65 74 42   set netFx [getB
1c070 75 69 6c 64 4e 65 74 46 78 5d 0d 0a 20 20 20 20  uildNetFx]..    
1c080 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
1c090 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 62 75  t [appendArgs bu
1c0a0 69 6c 64 46 72 61 6d 65 77 6f 72 6b 2e 20 24 6e  ildFramework. $n
1c0b0 65 74 46 78 5d 0d 0a 20 20 20 20 20 20 20 20 74  etFx]..        t
1c0c0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
1c0d0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1c0e0 20 5c 22 20 24 6e 65 74 46 78 20 5c 22 5c 6e 5d   \" $netFx \"\n]
1c0f0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
1c100 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
1c110 68 65 63 6b 20 74 68 65 20 63 75 72 72 65 6e 74  heck the current
1c120 20 62 75 69 6c 64 20 63 6f 6e 66 69 67 75 72 61   build configura
1c130 74 69 6f 6e 2e 20 20 54 68 69 73 20 73 68 6f 75  tion.  This shou
1c140 6c 64 20 6e 6f 72 6d 61 6c 6c 79 0d 0a 20 20 20  ld normally..   
1c150 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65 20       #       be 
1c160 65 69 74 68 65 72 20 22 44 65 62 75 67 22 20 6f  either "Debug" o
1c170 72 20 22 52 65 6c 65 61 73 65 22 2e 0d 0a 20 20  r "Release"...  
1c180 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1c190 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
1c1a0 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20  hannel \..      
1c1b0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63        "---- chec
1c1c0 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e  king for System.
1c1d0 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75 69 6c  Data.SQLite buil
1c1e0 64 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  d configuration.
1c1f0 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20  .. "....        
1c200 73 65 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  set configuratio
1c210 6e 20 5b 67 65 74 42 75 69 6c 64 43 6f 6e 66 69  n [getBuildConfi
1c220 67 75 72 61 74 69 6f 6e 5d 0d 0a 20 20 20 20 20  guration]..     
1c230 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
1c240 20 5b 61 70 70 65 6e 64 41 72 67 73 20 62 75 69   [appendArgs bui
1c250 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  ldConfiguration.
1c260 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d   $configuration]
1c270 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
1c280 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
1c290 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24  [appendArgs \" $
1c2a0 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 5c 22  configuration \"
1c2b0 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  \n]....        #
1c2c0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1c2d0 3a 20 54 72 79 20 74 6f 20 73 65 74 75 70 20 61  : Try to setup a
1c2e0 6e 20 69 6e 74 65 72 72 75 70 74 20 63 61 6c 6c  n interrupt call
1c2f0 62 61 63 6b 20 75 73 69 6e 67 20 74 68 65 20 73  back using the s
1c300 63 72 69 70 74 20 64 65 62 75 67 67 65 72 0d 0a  cript debugger..
1c310 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1c320 74 68 61 74 20 77 69 6c 6c 20 63 61 6e 63 65 6c  that will cancel
1c330 20 61 6c 6c 20 53 51 4c 20 71 75 65 72 69 65 73   all SQL queries
1c340 20 69 6e 20 70 72 6f 67 72 65 73 73 20 66 6f 72   in progress for
1c350 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0d 0a 20   all database.. 
1c360 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
1c370 6f 6e 6e 65 63 74 69 6f 6e 73 20 6b 6e 6f 77 6e  onnections known
1c380 20 74 6f 20 74 68 69 73 20 69 6e 74 65 72 70 72   to this interpr
1c390 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 23  eter...        #
1c3a0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
1c3b0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
1c3c0 28 73 71 6c 69 74 65 49 6e 74 65 72 72 75 70 74  (sqliteInterrupt
1c3d0 43 61 6c 6c 62 61 63 6b 29 5d 7d 20 74 68 65 6e  Callback)]} then
1c3e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
1c3f0 74 75 70 44 62 49 6e 74 65 72 72 75 70 74 43 61  tupDbInterruptCa
1c400 6c 6c 62 61 63 6b 20 24 3a 3a 74 65 73 74 5f 63  llback $::test_c
1c410 68 61 6e 6e 65 6c 20 24 3a 3a 74 65 73 74 5f 6c  hannel $::test_l
1c420 6f 67 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  og..        }...
1c430 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1c440 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
1c450 6b 20 66 6f 72 20 74 68 65 20 6e 61 74 69 76 65  k for the native
1c460 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 2c   runtime option,
1c470 20 77 68 69 63 68 20 77 6f 75 6c 64 20 6d 65 61   which would mea
1c480 6e 20 77 65 20 61 72 65 0d 0a 20 20 20 20 20 20  n we are..      
1c490 20 20 23 20 20 20 20 20 20 20 75 73 69 6e 67 20    #       using 
1c4a0 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61  the mixed-mode a
1c4b0 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20  ssembly...      
1c4c0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65    #..        che
1c4d0 63 6b 46 6f 72 52 75 6e 74 69 6d 65 4f 70 74 69  ckForRuntimeOpti
1c4e0 6f 6e 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  on $::test_chann
1c4f0 65 6c 20 6e 61 74 69 76 65 0d 0a 0d 0a 20 20 20  el native....   
1c500 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1c510 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66  # NOTE: Check if
1c520 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20   the test suite 
1c530 73 68 6f 75 6c 64 20 63 6f 75 6e 74 20 74 68 65  should count the
1c540 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 6e 65   number of conne
1c550 63 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20  ctions..        
1c560 23 20 20 20 20 20 20 20 22 6f 70 65 6e 65 64 22  #       "opened"
1c570 20 61 6e 64 20 22 63 6c 6f 73 65 64 22 20 66 72   and "closed" fr
1c580 6f 6d 20 74 68 65 20 70 6f 6f 6c 20 77 68 65 6e  om the pool when
1c590 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 69 66 20   determining if 
1c5a0 61 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20  a test..        
1c5b0 23 20 20 20 20 20 20 20 70 61 73 73 65 64 2e 20  #       passed. 
1c5c0 20 44 69 73 61 62 6c 69 6e 67 20 74 68 69 73 20   Disabling this 
1c5d0 62 65 68 61 76 69 6f 72 20 69 73 20 73 6f 6d 65  behavior is some
1c5e0 74 69 6d 65 73 20 6e 65 63 65 73 73 61 72 79 20  times necessary 
1c5f0 28 65 2e 67 2e 0d 0a 20 20 20 20 20 20 20 20 23  (e.g...        #
1c600 20 20 20 20 20 20 20 64 75 72 69 6e 67 20 74 68         during th
1c610 65 20 72 65 6c 65 61 73 65 20 74 65 73 74 69 6e  e release testin
1c620 67 20 70 72 6f 63 65 73 73 29 20 62 65 63 61 75  g process) becau
1c630 73 65 20 74 68 65 72 65 20 61 72 65 20 73 65 76  se there are sev
1c640 65 72 61 6c 0d 0a 20 20 20 20 20 20 20 20 23 20  eral..        # 
1c650 20 20 20 20 20 20 74 65 73 74 73 20 74 68 61 74        tests that
1c660 20 72 65 6c 79 20 6f 6e 20 74 68 65 20 22 6f 70   rely on the "op
1c670 65 6e 65 64 20 66 72 6f 6d 20 70 6f 6f 6c 22 20  ened from pool" 
1c680 63 6f 75 6e 74 20 62 65 69 6e 67 20 67 72 65 61  count being grea
1c690 74 65 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ter..        #  
1c6a0 20 20 20 20 20 74 68 61 6e 20 7a 65 72 6f 2e 20       than zero. 
1c6b0 20 54 68 65 73 65 20 74 65 73 74 73 20 6d 61 79   These tests may
1c6c0 20 66 61 69 6c 20 64 75 65 20 74 6f 20 74 68 65   fail due to the
1c6d0 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74   non-determinist
1c6e0 69 63 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ic..        #   
1c6f0 20 20 20 20 62 65 68 61 76 69 6f 72 20 6f 66 20      behavior of 
1c700 74 68 65 20 43 4c 52 20 47 43 2c 20 65 76 65 6e  the CLR GC, even
1c710 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   when there is n
1c720 6f 20 62 75 67 20 69 6e 20 74 68 65 20 63 6f 64  o bug in the cod
1c730 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
1c740 20 20 20 62 65 69 6e 67 20 74 65 73 74 65 64 2e     being tested.
1c750 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1c760 20 20 20 20 20 63 68 65 63 6b 46 6f 72 52 75 6e       checkForRun
1c770 74 69 6d 65 4f 70 74 69 6f 6e 20 24 3a 3a 74 65  timeOption $::te
1c780 73 74 5f 63 68 61 6e 6e 65 6c 20 6e 6f 50 6f 6f  st_channel noPoo
1c790 6c 43 6f 75 6e 74 73 0d 0a 0d 0a 20 20 20 20 20  lCounts....     
1c7a0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1c7b0 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74  NOTE: Check if t
1c7c0 68 65 20 74 65 73 74 20 73 75 69 74 65 20 73 68  he test suite sh
1c7d0 6f 75 6c 64 20 75 73 65 20 73 68 61 72 65 64 2d  ould use shared-
1c7e0 63 61 63 68 65 20 6d 6f 64 65 2e 0d 0a 20 20 20  cache mode...   
1c7f0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1c800 63 68 65 63 6b 46 6f 72 52 75 6e 74 69 6d 65 4f  checkForRuntimeO
1c810 70 74 69 6f 6e 20 24 3a 3a 74 65 73 74 5f 63 68  ption $::test_ch
1c820 61 6e 6e 65 6c 20 73 68 61 72 65 64 43 61 63 68  annel sharedCach
1c830 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e....        #..
1c840 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1c850 52 65 70 6f 72 74 20 74 68 65 20 72 65 73 6f 75  Report the resou
1c860 72 63 65 20 75 73 61 67 65 20 70 72 69 6f 72 20  rce usage prior 
1c870 74 6f 20 72 75 6e 6e 69 6e 67 20 61 6e 79 20 74  to running any t
1c880 65 73 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 23  ests...        #
1c890 0d 0a 20 20 20 20 20 20 20 20 72 65 70 6f 72 74  ..        report
1c8a0 53 51 4c 69 74 65 52 65 73 6f 75 72 63 65 73 20  SQLiteResources 
1c8b0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d  $::test_channel.
1c8c0 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1c8d0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 47 72        # NOTE: Gr
1c8e0 61 62 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6e  ab the list of n
1c8f0 61 74 69 76 65 20 6d 6f 64 75 6c 65 73 20 66 6f  ative modules fo
1c900 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72  r the current pr
1c910 6f 63 65 73 73 20 61 6e 64 0d 0a 20 20 20 20 20  ocess and..     
1c920 20 20 20 23 20 20 20 20 20 20 20 72 65 70 6f 72     #       repor
1c930 74 20 6f 6e 20 74 68 65 20 53 79 73 74 65 6d 2e  t on the System.
1c940 44 61 74 61 2e 53 51 4c 69 74 65 20 72 65 6c 61  Data.SQLite rela
1c950 74 65 64 20 6f 6e 65 73 2e 0d 0a 20 20 20 20 20  ted ones...     
1c960 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65     #..        se
1c970 74 20 6d 6f 64 75 6c 65 73 20 5b 6f 62 6a 65 63  t modules [objec
1c980 74 20 69 6e 76 6f 6b 65 20 5c 0d 0a 20 20 20 20  t invoke \..    
1c990 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
1c9a0 69 61 67 6e 6f 73 74 69 63 73 2e 50 72 6f 63 65  iagnostics.Proce
1c9b0 73 73 2e 47 65 74 43 75 72 72 65 6e 74 50 72 6f  ss.GetCurrentPro
1c9c0 63 65 73 73 20 4d 6f 64 75 6c 65 73 5d 0d 0a 0d  cess Modules]...
1c9d0 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20  .        object 
1c9e0 66 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20 6d  foreach -alias m
1c9f0 6f 64 75 6c 65 20 24 6d 6f 64 75 6c 65 73 20 7b  odule $modules {
1ca00 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
1ca10 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
1ca20 20 54 68 65 20 6d 6f 64 75 6c 65 20 66 69 6c 65   The module file
1ca30 20 6e 61 6d 65 20 68 65 72 65 20 6d 75 73 74 20   name here must 
1ca40 62 65 20 6e 6f 72 6d 61 6c 69 7a 65 64 2e 0d 0a  be normalized...
1ca50 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1ca60 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e         set fileN
1ca70 61 6d 65 20 5b 66 69 6c 65 20 6e 6f 72 6d 61 6c  ame [file normal
1ca80 69 7a 65 20 5b 24 6d 6f 64 75 6c 65 20 46 69 6c  ize [$module Fil
1ca90 65 4e 61 6d 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20  eName]]....     
1caa0 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
1cab0 20 6d 61 74 63 68 20 2d 6e 6f 63 61 73 65 20 2a   match -nocase *
1cac0 2f 73 71 6c 69 74 65 33 2e 64 6c 6c 20 24 66 69  /sqlite3.dll $fi
1cad0 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
1cae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
1caf0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
1cb00 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1cb10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1cb20 20 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c 6f    "---- found lo
1cb30 61 64 65 64 20 53 51 4c 69 74 65 20 6e 61 74 69  aded SQLite nati
1cb40 76 65 20 6c 69 62 72 61 72 79 20 6d 6f 64 75 6c  ve library modul
1cb50 65 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  e: " \..        
1cb60 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d          $fileNam
1cb70 65 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  e \n]..         
1cb80 20 7d 20 65 6c 73 65 69 66 20 7b 5b 73 74 72 69   } elseif {[stri
1cb90 6e 67 20 6d 61 74 63 68 20 5c 0d 0a 20 20 20 20  ng match \..    
1cba0 20 20 20 20 20 20 20 20 20 20 2d 6e 6f 63 61 73            -nocas
1cbb0 65 20 2a 2f 53 51 4c 69 74 65 2e 49 6e 74 65 72  e */SQLite.Inter
1cbc0 6f 70 2e 64 6c 6c 20 24 66 69 6c 65 4e 61 6d 65  op.dll $fileName
1cbd0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1cbe0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
1cbf0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
1cc00 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
1cc10 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
1cc20 2d 20 66 6f 75 6e 64 20 6c 6f 61 64 65 64 20 53  - found loaded S
1cc30 51 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73  QLite interop as
1cc40 73 65 6d 62 6c 79 20 6d 6f 64 75 6c 65 3a 20 22  sembly module: "
1cc50 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1cc60 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 20 5c 6e      $fileName \n
1cc70 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
1cc80 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1cc90 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
1cca0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
1ccb0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d  :test_channel \.
1ccc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
1ccd0 2d 2d 2d 2d 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  ---- compile-tim
1cce0 65 20 6f 70 74 69 6f 6e 73 20 66 6f 72 20 53 51  e options for SQ
1ccf0 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72  Lite core librar
1cd00 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  y... "....      
1cd10 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
1cd20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 62  ..            ob
1cd30 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
1cd40 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
1cd50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cd60 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
1cd70 69 74 65 2e 53 51 4c 69 74 65 33 20 53 51 4c 69  ite.SQLite3 SQLi
1cd80 74 65 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73  teCompileOptions
1cd90 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 63 6f  ..          } co
1cda0 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 5d 20 3d 3d  mpileOptions] ==
1cdb0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1cdc0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
1cdd0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
1cde0 70 70 65 6e 64 41 72 67 73 20 5b 66 6f 72 6d 61  ppendArgs [forma
1cdf0 74 4c 69 73 74 20 5b 6c 73 6f 72 74 20 5c 0d 0a  tList [lsort \..
1ce00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce10 24 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 5d  $compileOptions]
1ce20 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a 20 20   <none>] \n]..  
1ce30 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
1ce40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
1ce50 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
1ce60 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20  nel unknown\n.. 
1ce70 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1ce80 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1ce90 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20   catch {..      
1cea0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
1ceb0 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20  t_channel \..   
1cec0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
1ced0 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
1cee0 74 69 6f 6e 73 20 66 6f 72 20 53 51 4c 69 74 65  tions for SQLite
1cef0 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c   interop assembl
1cf00 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  y... "....      
1cf10 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
1cf20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 62  ..            ob
1cf30 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
1cf40 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
1cf50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cf60 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
1cf70 69 74 65 2e 53 51 4c 69 74 65 33 20 49 6e 74 65  ite.SQLite3 Inte
1cf80 72 6f 70 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e  ropCompileOption
1cf90 73 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 63  s..          } c
1cfa0 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 5d 20 3d  ompileOptions] =
1cfb0 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
1cfc0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1cfd0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
1cfe0 61 70 70 65 6e 64 41 72 67 73 20 5b 66 6f 72 6d  appendArgs [form
1cff0 61 74 4c 69 73 74 20 5b 6c 73 6f 72 74 20 5c 0d  atList [lsort \.
1d000 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d010 20 24 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73   $compileOptions
1d020 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a 20  ] <none>] \n].. 
1d030 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
1d040 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
1d050 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
1d060 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a  nnel unknown\n..
1d070 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1d080 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1d090 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
1d0a0 4f 54 45 3a 20 53 68 6f 77 20 74 68 65 20 61 63  OTE: Show the ac
1d0b0 74 69 76 65 20 74 65 73 74 20 63 6f 6e 73 74 72  tive test constr
1d0c0 61 69 6e 74 73 2e 0d 0a 20 20 20 20 20 20 20 20  aints...        
1d0d0 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  #..        tputs
1d0e0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1d0f0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 2d 2d   [appendArgs "--
1d100 2d 2d 20 63 6f 6e 73 74 72 61 69 6e 74 73 3a 20  -- constraints: 
1d110 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
1d120 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73   [formatList [ls
1d130 6f 72 74 20 5b 67 65 74 43 6f 6e 73 74 72 61 69  ort [getConstrai
1d140 6e 74 73 5d 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e  nts]] <none>] \n
1d150 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
1d160 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1d170 53 61 76 65 20 74 68 65 20 74 65 73 74 20 63 6f  Save the test co
1d180 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20 75 73  nstraints for us
1d190 65 20 62 79 20 74 68 72 65 61 64 73 20 63 72 65  e by threads cre
1d1a0 61 74 65 64 20 69 6e 20 74 68 69 73 0d 0a 20 20  ated in this..  
1d1b0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 70        #       ap
1d1c0 70 6c 69 63 61 74 69 6f 6e 20 64 6f 6d 61 69 6e  plication domain
1d1d0 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  .  This is neces
1d1e0 73 61 72 79 20 62 65 63 61 75 73 65 20 61 6c 6c  sary because all
1d1f0 20 74 68 65 20 45 61 67 6c 65 0d 0a 20 20 20 20   the Eagle..    
1d200 20 20 20 20 23 20 20 20 20 20 20 20 22 74 65 73      #       "tes
1d210 74 20 63 6f 6e 74 65 78 74 22 20 69 6e 66 6f 72  t context" infor
1d220 6d 61 74 69 6f 6e 20 69 73 20 70 65 72 2d 74 68  mation is per-th
1d230 72 65 61 64 2e 0d 0a 20 20 20 20 20 20 20 20 23  read...        #
1d240 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
1d250 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65  info exists ::te
1d260 73 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 5d 7d  st_constraints]}
1d270 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1d280 20 20 20 73 65 74 20 3a 3a 74 65 73 74 5f 63 6f     set ::test_co
1d290 6e 73 74 72 61 69 6e 74 73 20 24 3a 3a 65 61 67  nstraints $::eag
1d2a0 6c 65 5f 74 65 73 74 73 28 63 6f 6e 73 74 72 61  le_tests(constra
1d2b0 69 6e 74 73 29 0d 0a 20 20 20 20 20 20 20 20 7d  ints)..        }
1d2c0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
1d2d0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c         # NOTE: L
1d2e0 6f 61 64 20 74 68 65 20 22 61 66 74 65 72 2d 63  oad the "after-c
1d2f0 6f 6e 73 74 72 61 69 6e 74 73 22 20 63 75 73 74  onstraints" cust
1d300 6f 6d 20 70 65 72 2d 75 73 65 72 20 61 6e 64 2f  om per-user and/
1d310 6f 72 20 70 65 72 2d 68 6f 73 74 0d 0a 20 20 20  or per-host..   
1d320 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73       #       tes
1d330 74 20 73 65 74 74 69 6e 67 73 20 6e 6f 77 2e 0d  t settings now..
1d340 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1d350 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c      uplevel 1 [l
1d360 69 73 74 20 6c 6f 61 64 53 51 4c 69 74 65 54 65  ist loadSQLiteTe
1d370 73 74 53 65 74 74 69 6e 67 73 20 24 3a 3a 74 65  stSettings $::te
1d380 73 74 5f 63 68 61 6e 6e 65 6c 20 2e 61 66 74 65  st_channel .afte
1d390 72 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  r]....        #.
1d3a0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
1d3b0 20 49 66 20 6e 65 63 65 73 73 61 72 79 2c 20 65   If necessary, e
1d3c0 6e 61 62 6c 65 20 73 68 61 72 65 64 2d 63 61 63  nable shared-cac
1d3d0 68 65 20 6d 6f 64 65 20 6e 6f 77 2e 0d 0a 20 20  he mode now...  
1d3e0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1d3f0 20 69 66 20 7b 5b 68 61 73 52 75 6e 74 69 6d 65   if {[hasRuntime
1d400 4f 70 74 69 6f 6e 20 73 68 61 72 65 64 43 61 63  Option sharedCac
1d410 68 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  he]} then {..   
1d420 20 20 20 20 20 20 20 65 6e 61 62 6c 65 53 68 61         enableSha
1d430 72 65 64 43 61 63 68 65 20 24 3a 3a 74 65 73 74  redCache $::test
1d440 5f 63 68 61 6e 6e 65 6c 20 74 72 75 65 0d 0a 20  _channel true.. 
1d450 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1d460 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1d470 20 4e 4f 54 45 3a 20 53 68 6f 77 20 77 68 65 6e   NOTE: Show when
1d480 20 6f 75 72 20 74 65 73 74 73 20 61 63 74 75 61   our tests actua
1d490 6c 6c 79 20 62 65 67 61 6e 20 28 6e 6f 77 29 2e  lly began (now).
1d4a0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1d4b0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
1d4c0 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
1d4d0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1d4e0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 53 79 73 74        "---- Syst
1d4f0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 74  em.Data.SQLite t
1d500 65 73 74 73 20 62 65 67 61 6e 20 61 74 20 22 20  ests began at " 
1d510 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
1d520 63 6c 6f 63 6b 20 66 6f 72 6d 61 74 20 5b 63 6c  clock format [cl
1d530 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 5d 20 5c 6e  ock seconds]] \n
1d540 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
1d550 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72  }.....    proc r
1d560 75 6e 53 51 4c 69 74 65 54 65 73 74 46 69 6c 65  unSQLiteTestFile
1d570 73 50 72 6f 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a  sPrologue {} {..
1d580 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20        uplevel 1 
1d590 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
1d5a0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 65        # NOTE: Se
1d5b0 74 75 70 20 74 68 65 20 76 61 72 69 61 62 6c 65  tup the variable
1d5c0 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  s that refer to 
1d5d0 74 68 65 20 76 61 72 69 6f 75 73 20 6e 6f 6e 2d  the various non-
1d5e0 64 61 74 61 20 66 69 6c 65 73 0d 0a 20 20 20 20  data files..    
1d5f0 20 20 20 20 23 20 20 20 20 20 20 20 72 65 71 75      #       requ
1d600 69 72 65 64 20 62 79 20 74 68 65 20 74 65 73 74  ired by the test
1d610 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e 0d  s in this file..
1d620 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1d630 20 20 20 20 73 65 74 20 65 6e 74 69 74 79 46 72      set entityFr
1d640 61 6d 65 77 6f 72 6b 44 6c 6c 46 69 6c 65 20 5c  ameworkDllFile \
1d650 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67  ..            [g
1d660 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20  etBuildFileName 
1d670 45 6e 74 69 74 79 46 72 61 6d 65 77 6f 72 6b 2e  EntityFramework.
1d680 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  dll]....        
1d690 73 65 74 20 69 6e 73 74 61 6c 6c 65 72 45 78 65  set installerExe
1d6a0 46 69 6c 65 20 5b 67 65 74 42 75 69 6c 64 46 69  File [getBuildFi
1d6b0 6c 65 4e 61 6d 65 20 49 6e 73 74 61 6c 6c 65 72  leName Installer
1d6c0 2e 65 78 65 5d 0d 0a 20 20 20 20 20 20 20 20 73  .exe]..        s
1d6d0 65 74 20 73 71 6c 69 74 65 44 65 73 69 67 6e 65  et sqliteDesigne
1d6e0 72 44 6c 6c 46 69 6c 65 20 5b 67 65 74 42 75 69  rDllFile [getBui
1d6f0 6c 64 46 69 6c 65 4e 61 6d 65 20 53 51 4c 69 74  ldFileName SQLit
1d700 65 2e 44 65 73 69 67 6e 65 72 2e 64 6c 6c 5d 0d  e.Designer.dll].
1d710 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 73  ...        set s
1d720 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65 44  ystemDataSQLiteD
1d730 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20  llFile \..      
1d740 20 20 20 20 20 20 5b 67 65 74 42 75 69 6c 64 46        [getBuildF
1d750 69 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44  ileName System.D
1d760 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d 0d  ata.SQLite.dll].
1d770 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 73  ...        set s
1d780 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65 4c  ystemDataSQLiteL
1d790 69 6e 71 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20  inqDllFile \..  
1d7a0 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 75            [getBu
1d7b0 69 6c 64 46 69 6c 65 4e 61 6d 65 20 53 79 73 74  ildFileName Syst
1d7c0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c  em.Data.SQLite.L
1d7d0 69 6e 71 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20  inq.dll]....    
1d7e0 20 20 20 20 73 65 74 20 73 79 73 74 65 6d 44 61      set systemDa
1d7f0 74 61 53 51 4c 69 74 65 45 66 36 44 6c 6c 46 69  taSQLiteEf6DllFi
1d800 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  le \..          
1d810 20 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e    [getBuildFileN
1d820 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  ame System.Data.
1d830 53 51 4c 69 74 65 2e 45 46 36 2e 64 6c 6c 5d 0d  SQLite.EF6.dll].
1d840 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74  ...        set t
1d850 65 73 74 45 78 65 46 69 6c 65 20 5b 67 65 74 42  estExeFile [getB
1d860 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 74 65 73  uildFileName tes
1d870 74 2e 65 78 65 5d 0d 0a 20 20 20 20 20 20 20 20  t.exe]..        
1d880 73 65 74 20 74 65 73 74 4c 69 6e 71 45 78 65 46  set testLinqExeF
1d890 69 6c 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c  ile [getBuildFil
1d8a0 65 4e 61 6d 65 20 74 65 73 74 6c 69 6e 71 2e 65  eName testlinq.e
1d8b0 78 65 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74  xe]..        set
1d8c0 20 74 65 73 74 45 66 36 45 78 65 46 69 6c 65 20   testEf6ExeFile 
1d8d0 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d  [getBuildFileNam
1d8e0 65 20 74 65 73 74 65 66 36 2e 65 78 65 5d 0d 0a  e testef6.exe]..
1d8f0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1d900 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 74       # NOTE: Set
1d910 75 70 20 74 68 65 20 76 61 72 69 61 62 6c 65 73  up the variables
1d920 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74   that refer to t
1d930 68 65 20 76 61 72 69 6f 75 73 20 64 61 74 61 20  he various data 
1d940 66 69 6c 65 73 0d 0a 20 20 20 20 20 20 20 20 23  files..        #
1d950 20 20 20 20 20 20 20 72 65 71 75 69 72 65 64 20         required 
1d960 62 79 20 74 68 65 20 74 65 73 74 73 20 69 6e 20  by the tests in 
1d970 74 68 69 73 20 66 69 6c 65 2e 0d 0a 20 20 20 20  this file...    
1d980 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
1d990 65 74 20 74 65 73 74 4c 69 6e 71 4f 75 74 46 69  et testLinqOutFi
1d9a0 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  le [file nativen
1d9b0 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c  ame [file join \
1d9c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67  ..            [g
1d9d0 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61  etSQLiteTestData
1d9e0 50 61 74 68 5d 20 74 65 73 74 6c 69 6e 71 2e 6f  Path] testlinq.o
1d9f0 75 74 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ut]]....        
1da00 73 65 74 20 6e 6f 72 74 68 77 69 6e 64 45 66 44  set northwindEfD
1da10 62 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69  bFile [file nati
1da20 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  vename [file joi
1da30 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
1da40 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b   [file dirname [
1da50 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b 67 65  file dirname [ge
1da60 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50  tSQLiteTestDataP
1da70 61 74 68 5d 5d 5d 20 5c 0d 0a 20 20 20 20 20 20  ath]]] \..      
1da80 20 20 20 20 20 20 74 65 73 74 6c 69 6e 71 20 6e        testlinq n
1da90 6f 72 74 68 77 69 6e 64 45 46 2e 64 62 5d 5d 0d  orthwindEF.db]].
1daa0 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e  ...        set n
1dab0 6f 6e 57 61 6c 44 62 46 69 6c 65 20 5b 66 69 6c  onWalDbFile [fil
1dac0 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69  e nativename [fi
1dad0 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20  le join \..     
1dae0 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74         [getSQLit
1daf0 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 6e  eTestDataPath] n
1db00 6f 6e 57 61 6c 2e 64 62 5d 5d 0d 0a 0d 0a 20 20  onWal.db]]....  
1db10 20 20 20 20 20 20 73 65 74 20 77 61 6c 44 62 46        set walDbF
1db20 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ile [file native
1db30 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
1db40 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
1db50 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74  getSQLiteTestDat
1db60 61 50 61 74 68 5d 20 77 61 6c 2e 64 62 5d 5d 0d  aPath] wal.db]].
1db70 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1db80 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
1db90 65 20 76 61 72 69 6f 75 73 20 69 6e 73 74 61 6c  e various instal
1dba0 6c 2f 75 6e 69 6e 73 74 61 6c 6c 20 6c 6f 67 20  l/uninstall log 
1dbb0 66 69 6c 65 73 20 75 73 65 64 20 74 6f 20 74 65  files used to te
1dbc0 73 74 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  st the..        
1dbd0 23 20 20 20 20 20 20 20 64 65 73 69 67 6e 2d 74  #       design-t
1dbe0 69 6d 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 69 6e  ime component in
1dbf0 73 74 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20  staller...      
1dc00 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74    #..        set
1dc10 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30   testInstallVs20
1dc20 30 35 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20  05LogFile [file 
1dc30 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
1dc40 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20   join \..       
1dc50 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54       [getSQLiteT
1dc60 65 73 74 44 61 74 61 50 61 74 68 5d 20 49 6e 73  estDataPath] Ins
1dc70 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30  taller_Test_Vs20
1dc80 30 35 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20  05.log]]....    
1dc90 20 20 20 20 73 65 74 20 74 65 73 74 49 6e 73 74      set testInst
1dca0 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c 65  allVs2008LogFile
1dcb0 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
1dcc0 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a  e [file join \..
1dcd0 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
1dce0 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61  SQLiteTestDataPa
1dcf0 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54 65  th] Installer_Te
1dd00 73 74 5f 56 73 32 30 30 38 2e 6c 6f 67 5d 5d 0d  st_Vs2008.log]].
1dd10 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74  ...        set t
1dd20 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 30  estInstallVs2010
1dd30 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61  LogFile [file na
1dd40 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a  tivename [file j
1dd50 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  oin \..         
1dd60 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73     [getSQLiteTes
1dd70 74 44 61 74 61 50 61 74 68 5d 20 49 6e 73 74 61  tDataPath] Insta
1dd80 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31 30  ller_Test_Vs2010
1dd90 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  .log]]....      
1dda0 20 20 73 65 74 20 74 65 73 74 49 6e 73 74 61 6c    set testInstal
1ddb0 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65 20 5b  lVs2012LogFile [
1ddc0 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
1ddd0 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20  [file join \..  
1dde0 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51            [getSQ
1ddf0 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68  LiteTestDataPath
1de00 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74  ] Installer_Test
1de10 5f 56 73 32 30 31 32 2e 6c 6f 67 5d 5d 0d 0a 0d  _Vs2012.log]]...
1de20 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73  .        set tes
1de30 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f  tInstallVs2013Lo
1de40 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69  gFile [file nati
1de50 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  vename [file joi
1de60 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
1de70 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44   [getSQLiteTestD
1de80 61 74 61 50 61 74 68 5d 20 49 6e 73 74 61 6c 6c  ataPath] Install
1de90 65 72 5f 54 65 73 74 5f 56 73 32 30 31 33 2e 6c  er_Test_Vs2013.l
1dea0 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  og]]....        
1deb0 73 65 74 20 74 65 73 74 55 6e 69 6e 73 74 61 6c  set testUninstal
1dec0 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 20 5b  lVs2005LogFile [
1ded0 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
1dee0 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20  [file join \..  
1def0 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51            [getSQ
1df00 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68  LiteTestDataPath
1df10 5d 20 55 6e 69 6e 73 74 61 6c 6c 65 72 5f 54 65  ] Uninstaller_Te
1df20 73 74 5f 56 73 32 30 30 35 2e 6c 6f 67 5d 5d 0d  st_Vs2005.log]].
1df30 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74  ...        set t
1df40 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30  estUninstallVs20
1df50 30 38 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20  08LogFile [file 
1df60 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
1df70 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20   join \..       
1df80 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54       [getSQLiteT
1df90 65 73 74 44 61 74 61 50 61 74 68 5d 20 55 6e 69  estDataPath] Uni
1dfa0 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73  nstaller_Test_Vs
1dfb0 32 30 30 38 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20  2008.log]]....  
1dfc0 20 20 20 20 20 20 73 65 74 20 74 65 73 74 55 6e        set testUn
1dfd0 69 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67  installVs2010Log
1dfe0 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  File [file nativ
1dff0 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
1e000 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1e010 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61  [getSQLiteTestDa
1e020 74 61 50 61 74 68 5d 20 55 6e 69 6e 73 74 61 6c  taPath] Uninstal
1e030 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31 30 2e  ler_Test_Vs2010.
1e040 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  log]]....       
1e050 20 73 65 74 20 74 65 73 74 55 6e 69 6e 73 74 61   set testUninsta
1e060 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65 20  llVs2012LogFile 
1e070 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
1e080 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20   [file join \.. 
1e090 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53             [getS
1e0a0 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74  QLiteTestDataPat
1e0b0 68 5d 20 55 6e 69 6e 73 74 61 6c 6c 65 72 5f 54  h] Uninstaller_T
1e0c0 65 73 74 5f 56 73 32 30 31 32 2e 6c 6f 67 5d 5d  est_Vs2012.log]]
1e0d0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
1e0e0 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
1e0f0 30 31 33 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65  013LogFile [file
1e100 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
1e110 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20  e join \..      
1e120 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65        [getSQLite
1e130 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 55 6e  TestDataPath] Un
1e140 69 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56  installer_Test_V
1e150 73 32 30 31 33 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20  s2013.log]].... 
1e160 20 20 20 20 20 20 20 23 23 23 23 23 23 23 23 23         #########
1e170 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1e180 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1e190 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1e1a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
1e1b0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
1e1c0 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
1e1d0 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
1e1e0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1e1f0 5b 66 69 6c 65 20 74 61 69 6c 20 24 65 6e 74 69  [file tail $enti
1e200 74 79 46 72 61 6d 65 77 6f 72 6b 44 6c 6c 46 69  tyFrameworkDllFi
1e210 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  le]]]} then {.. 
1e220 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f           checkFo
1e230 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e  rFile $test_chan
1e240 6e 65 6c 20 24 65 6e 74 69 74 79 46 72 61 6d 65  nel $entityFrame
1e250 77 6f 72 6b 44 6c 6c 46 69 6c 65 0d 0a 20 20 20  workDllFile..   
1e260 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1e270 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
1e280 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
1e290 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
1e2a0 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
1e2b0 69 6c 20 24 69 6e 73 74 61 6c 6c 65 72 45 78 65  il $installerExe
1e2c0 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d  File]]]} then {.
1e2d0 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b  .          check
1e2e0 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
1e2f0 61 6e 6e 65 6c 20 24 69 6e 73 74 61 6c 6c 65 72  annel $installer
1e300 45 78 65 46 69 6c 65 20 49 6e 73 74 61 6c 6c 65  ExeFile Installe
1e310 72 2e 65 78 65 0d 0a 20 20 20 20 20 20 20 20 7d  r.exe..        }
1e320 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
1e330 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
1e340 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
1e350 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
1e360 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 73 71    [file tail $sq
1e370 6c 69 74 65 44 65 73 69 67 6e 65 72 44 6c 6c 46  liteDesignerDllF
1e380 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ile]]]} then {..
1e390 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
1e3a0 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
1e3b0 6e 6e 65 6c 20 24 73 71 6c 69 74 65 44 65 73 69  nnel $sqliteDesi
1e3c0 67 6e 65 72 44 6c 6c 46 69 6c 65 0d 0a 20 20 20  gnerDllFile..   
1e3d0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1e3e0 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
1e3f0 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
1e400 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
1e410 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
1e420 69 6c 20 24 73 79 73 74 65 6d 44 61 74 61 53 51  il $systemDataSQ
1e430 4c 69 74 65 44 6c 6c 46 69 6c 65 5d 5d 5d 7d 20  LiteDllFile]]]} 
1e440 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1e450 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24    checkForFile $
1e460 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 73 79  test_channel $sy
1e470 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65 44 6c  stemDataSQLiteDl
1e480 6c 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d  lFile..        }
1e490 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
1e4a0 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
1e4b0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
1e4c0 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
1e4d0 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 73 79    [file tail $sy
1e4e0 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65 4c 69  stemDataSQLiteLi
1e4f0 6e 71 44 6c 6c 46 69 6c 65 5d 5d 5d 7d 20 74 68  nqDllFile]]]} th
1e500 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1e510 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
1e520 73 74 5f 63 68 61 6e 6e 65 6c 20 24 73 79 73 74  st_channel $syst
1e530 65 6d 44 61 74 61 53 51 4c 69 74 65 4c 69 6e 71  emDataSQLiteLinq
1e540 44 6c 6c 46 69 6c 65 0d 0a 20 20 20 20 20 20 20  DllFile..       
1e550 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
1e560 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69   {![haveConstrai
1e570 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
1e580 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ile_ \..        
1e590 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
1e5a0 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65  systemDataSQLite
1e5b0 45 66 36 44 6c 6c 46 69 6c 65 5d 5d 5d 7d 20 74  Ef6DllFile]]]} t
1e5c0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1e5d0 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
1e5e0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 73 79 73  est_channel $sys
1e5f0 74 65 6d 44 61 74 61 53 51 4c 69 74 65 45 66 36  temDataSQLiteEf6
1e600 44 6c 6c 46 69 6c 65 0d 0a 20 20 20 20 20 20 20  DllFile..       
1e610 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
1e620 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69   {![haveConstrai
1e630 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
1e640 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ile_ \..        
1e650 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
1e660 74 65 73 74 45 78 65 46 69 6c 65 5d 5d 5d 7d 20  testExeFile]]]} 
1e670 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1e680 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24    checkForFile $
1e690 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65  test_channel $te
1e6a0 73 74 45 78 65 46 69 6c 65 20 74 65 73 74 2e 65  stExeFile test.e
1e6b0 78 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  xe..        }...
1e6c0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68  .        if {![h
1e6d0 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  aveConstraint [a
1e6e0 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
1e6f0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
1e700 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74 4c  file tail $testL
1e710 69 6e 71 45 78 65 46 69 6c 65 5d 5d 5d 7d 20 74  inqExeFile]]]} t
1e720 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1e730 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
1e740 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73  est_channel $tes
1e750 74 4c 69 6e 71 45 78 65 46 69 6c 65 20 74 65 73  tLinqExeFile tes
1e760 74 6c 69 6e 71 2e 65 78 65 0d 0a 20 20 20 20 20  tlinq.exe..     
1e770 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1e780 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
1e790 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
1e7a0 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
1e7b0 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c        [file tail
1e7c0 20 24 74 65 73 74 45 66 36 45 78 65 46 69 6c 65   $testEf6ExeFile
1e7d0 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
1e7e0 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
1e7f0 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
1e800 6c 20 24 74 65 73 74 45 66 36 45 78 65 46 69 6c  l $testEf6ExeFil
1e810 65 20 74 65 73 74 65 66 36 2e 65 78 65 0d 0a 20  e testef6.exe.. 
1e820 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1e830 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f      if {![haveCo
1e840 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
1e850 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20  Args file_ \..  
1e860 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
1e870 74 61 69 6c 20 24 74 65 73 74 4c 69 6e 71 4f 75  tail $testLinqOu
1e880 74 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b  tFile]]]} then {
1e890 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63  ..          chec
1e8a0 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63  kForFile $test_c
1e8b0 68 61 6e 6e 65 6c 20 24 74 65 73 74 4c 69 6e 71  hannel $testLinq
1e8c0 4f 75 74 46 69 6c 65 0d 0a 20 20 20 20 20 20 20  OutFile..       
1e8d0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
1e8e0 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69   {![haveConstrai
1e8f0 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
1e900 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ile_ \..        
1e910 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
1e920 6e 6f 72 74 68 77 69 6e 64 45 66 44 62 46 69 6c  northwindEfDbFil
1e930 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e]]]} then {..  
1e940 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
1e950 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e  File $test_chann
1e960 65 6c 20 24 6e 6f 72 74 68 77 69 6e 64 45 66 44  el $northwindEfD
1e970 62 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d  bFile..        }
1e980 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
1e990 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
1e9a0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
1e9b0 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
1e9c0 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 6e 6f    [file tail $no
1e9d0 6e 57 61 6c 44 62 46 69 6c 65 5d 5d 5d 7d 20 74  nWalDbFile]]]} t
1e9e0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1e9f0 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
1ea00 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 6e 6f 6e  est_channel $non
1ea10 57 61 6c 44 62 46 69 6c 65 0d 0a 20 20 20 20 20  WalDbFile..     
1ea20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1ea30 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
1ea40 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
1ea50 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
1ea60 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c        [file tail
1ea70 20 24 77 61 6c 44 62 46 69 6c 65 5d 5d 5d 7d 20   $walDbFile]]]} 
1ea80 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1ea90 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24    checkForFile $
1eaa0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 77 61  test_channel $wa
1eab0 6c 44 62 46 69 6c 65 0d 0a 20 20 20 20 20 20 20  lDbFile..       
1eac0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
1ead0 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69   {![haveConstrai
1eae0 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
1eaf0 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ile_ \..        
1eb00 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
1eb10 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 30  testInstallVs200
1eb20 35 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65  5LogFile]]]} the
1eb30 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  n {..          c
1eb40 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
1eb50 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 49  t_channel $testI
1eb60 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46  nstallVs2005LogF
1eb70 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ile..        }..
1eb80 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
1eb90 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
1eba0 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
1ebb0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1ebc0 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74  [file tail $test
1ebd0 49 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f 67  InstallVs2008Log
1ebe0 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d  File]]]} then {.
1ebf0 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b  .          check
1ec00 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
1ec10 61 6e 6e 65 6c 20 24 74 65 73 74 49 6e 73 74 61  annel $testInsta
1ec20 6c 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c 65 0d  llVs2008LogFile.
1ec30 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
1ec40 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
1ec50 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
1ec60 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
1ec70 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
1ec80 65 20 74 61 69 6c 20 24 74 65 73 74 49 6e 73 74  e tail $testInst
1ec90 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65  allVs2010LogFile
1eca0 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
1ecb0 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
1ecc0 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
1ecd0 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73  l $testInstallVs
1ece0 32 30 31 30 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2010LogFile..   
1ecf0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1ed00 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
1ed10 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
1ed20 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
1ed30 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
1ed40 69 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56  il $testInstallV
1ed50 73 32 30 31 32 4c 6f 67 46 69 6c 65 5d 5d 5d 7d  s2012LogFile]]]}
1ed60 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1ed70 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20     checkForFile 
1ed80 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74  $test_channel $t
1ed90 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 32  estInstallVs2012
1eda0 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20  LogFile..       
1edb0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
1edc0 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69   {![haveConstrai
1edd0 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
1ede0 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ile_ \..        
1edf0 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
1ee00 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31  testInstallVs201
1ee10 33 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65  3LogFile]]]} the
1ee20 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  n {..          c
1ee30 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
1ee40 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 49  t_channel $testI
1ee50 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67 46  nstallVs2013LogF
1ee60 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ile..        }..
1ee70 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
1ee80 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
1ee90 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
1eea0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1eeb0 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74  [file tail $test
1eec0 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c  UninstallVs2005L
1eed0 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  ogFile]]]} then 
1eee0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65  {..          che
1eef0 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f  ckForFile $test_
1ef00 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69  channel $testUni
1ef10 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46  nstallVs2005LogF
1ef20 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ile..        }..
1ef30 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
1ef40 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
1ef50 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
1ef60 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1ef70 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74  [file tail $test
1ef80 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c  UninstallVs2008L
1ef90 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  ogFile]]]} then 
1efa0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65  {..          che
1efb0 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f  ckForFile $test_
1efc0 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69  channel $testUni
1efd0 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46  nstallVs2008LogF
1efe0 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ile..        }..
1eff0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
1f000 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
1f010 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
1f020 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1f030 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74  [file tail $test
1f040 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c  UninstallVs2010L
1f050 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  ogFile]]]} then 
1f060 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65  {..          che
1f070 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f  ckForFile $test_
1f080 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69  channel $testUni
1f090 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46  nstallVs2010LogF
1f0a0 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ile..        }..
1f0b0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
1f0c0 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
1f0d0 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
1f0e0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1f0f0 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74  [file tail $test
1f100 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c  UninstallVs2012L
1f110 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  ogFile]]]} then 
1f120 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65  {..          che
1f130 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f  ckForFile $test_
1f140 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69  channel $testUni
1f150 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46  nstallVs2012LogF
1f160 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ile..        }..
1f170 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
1f180 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
1f190 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
1f1a0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1f1b0 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74  [file tail $test
1f1c0 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c  UninstallVs2013L
1f1d0 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  ogFile]]]} then 
1f1e0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65  {..          che
1f1f0 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f  ckForFile $test_
1f200 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69  channel $testUni
1f210 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67 46  nstallVs2013LogF
1f220 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ile..        }..
1f230 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
1f240 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 75 6e 53  ...    proc runS
1f250 51 4c 69 74 65 54 65 73 74 46 69 6c 65 73 45 70  QLiteTestFilesEp
1f260 69 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20 20 20  ilogue {} {..   
1f270 20 20 20 75 70 6c 65 76 65 6c 20 31 20 7b 0d 0a     uplevel 1 {..
1f280 20 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e          unset -n
1f290 6f 63 6f 6d 70 6c 61 69 6e 20 5c 0d 0a 20 20 20  ocomplain \..   
1f2a0 20 20 20 20 20 20 20 20 20 74 65 73 74 55 6e 69           testUni
1f2b0 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67 46  nstallVs2013LogF
1f2c0 69 6c 65 20 74 65 73 74 55 6e 69 6e 73 74 61 6c  ile testUninstal
1f2d0 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65 20 5c  lVs2012LogFile \
1f2e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ..            te
1f2f0 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31  stUninstallVs201
1f300 30 4c 6f 67 46 69 6c 65 20 74 65 73 74 55 6e 69  0LogFile testUni
1f310 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46  nstallVs2008LogF
1f320 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ile \..         
1f330 20 20 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c     testUninstall
1f340 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 20 74 65  Vs2005LogFile te
1f350 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c  stInstallVs2013L
1f360 6f 67 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20  ogFile \..      
1f370 20 20 20 20 20 20 74 65 73 74 49 6e 73 74 61 6c        testInstal
1f380 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65 20 74  lVs2012LogFile t
1f390 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 30  estInstallVs2010
1f3a0 4c 6f 67 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20  LogFile \..     
1f3b0 20 20 20 20 20 20 20 74 65 73 74 49 6e 73 74 61         testInsta
1f3c0 6c 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c 65 20  llVs2008LogFile 
1f3d0 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 30  testInstallVs200
1f3e0 35 4c 6f 67 46 69 6c 65 0d 0a 0d 0a 20 20 20 20  5LogFile....    
1f3f0 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d      unset -nocom
1f400 70 6c 61 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20  plain \..       
1f410 20 20 20 20 20 6e 6f 72 74 68 77 69 6e 64 45 66       northwindEf
1f420 44 62 46 69 6c 65 20 74 65 73 74 4c 69 6e 71 4f  DbFile testLinqO
1f430 75 74 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20  utFile \..      
1f440 20 20 20 20 20 20 77 61 6c 44 62 46 69 6c 65 20        walDbFile 
1f450 6e 6f 6e 57 61 6c 44 62 46 69 6c 65 0d 0a 0d 0a  nonWalDbFile....
1f460 20 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e          unset -n
1f470 6f 63 6f 6d 70 6c 61 69 6e 20 5c 0d 0a 20 20 20  ocomplain \..   
1f480 20 20 20 20 20 20 20 20 20 74 65 73 74 45 66 36           testEf6
1f490 45 78 65 46 69 6c 65 20 74 65 73 74 4c 69 6e 71  ExeFile testLinq
1f4a0 45 78 65 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20  ExeFile \..     
1f4b0 20 20 20 20 20 20 20 74 65 73 74 45 78 65 46 69         testExeFi
1f4c0 6c 65 20 73 79 73 74 65 6d 44 61 74 61 53 51 4c  le systemDataSQL
1f4d0 69 74 65 45 66 36 44 6c 6c 46 69 6c 65 20 5c 0d  iteEf6DllFile \.
1f4e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 79 73  .            sys
1f4f0 74 65 6d 44 61 74 61 53 51 4c 69 74 65 4c 69 6e  temDataSQLiteLin
1f500 71 44 6c 6c 46 69 6c 65 20 73 79 73 74 65 6d 44  qDllFile systemD
1f510 61 74 61 53 51 4c 69 74 65 44 6c 6c 46 69 6c 65  ataSQLiteDllFile
1f520 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1f530 73 71 6c 69 74 65 44 65 73 69 67 6e 65 72 44 6c  sqliteDesignerDl
1f540 6c 46 69 6c 65 20 69 6e 73 74 61 6c 6c 65 72 45  lFile installerE
1f550 78 65 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20  xeFile \..      
1f560 20 20 20 20 20 20 65 6e 74 69 74 79 46 72 61 6d        entityFram
1f570 65 77 6f 72 6b 44 6c 6c 46 69 6c 65 0d 0a 20 20  eworkDllFile..  
1f580 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
1f590 0a 20 20 20 20 70 72 6f 63 20 72 75 6e 53 51 4c  .    proc runSQL
1f5a0 69 74 65 54 65 73 74 45 70 69 6c 6f 67 75 65 20  iteTestEpilogue 
1f5b0 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
1f5c0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69       # NOTE: Ski
1f5d0 70 20 72 75 6e 6e 69 6e 67 20 6f 75 72 20 63 75  p running our cu
1f5e0 73 74 6f 6d 20 65 70 69 6c 6f 67 75 65 20 69 66  stom epilogue if
1f5f0 20 74 68 65 20 6d 61 69 6e 20 6f 6e 65 20 68 61   the main one ha
1f600 73 20 62 65 65 6e 0d 0a 20 20 20 20 20 20 23 20  s been..      # 
1f610 20 20 20 20 20 20 73 6b 69 70 70 65 64 2e 0d 0a        skipped...
1f620 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
1f630 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
1f640 20 3a 3a 6e 6f 28 65 70 69 6c 6f 67 75 65 2e 65   ::no(epilogue.e
1f650 61 67 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  agle)]} then {..
1f660 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1f670 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20     # NOTE: Show 
1f680 77 68 65 6e 20 6f 75 72 20 74 65 73 74 73 20 61  when our tests a
1f690 63 74 75 61 6c 6c 79 20 65 6e 64 65 64 20 28 6e  ctually ended (n
1f6a0 6f 77 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ow)...        #.
1f6b0 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
1f6c0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
1f6d0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1f6e0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
1f6f0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
1f700 74 65 20 74 65 73 74 73 20 65 6e 64 65 64 20 61  te tests ended a
1f710 74 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  t " \..         
1f720 20 20 20 5b 63 6c 6f 63 6b 20 66 6f 72 6d 61 74     [clock format
1f730 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d   [clock seconds]
1f740 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  ] \n]....       
1f750 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1f760 54 45 3a 20 4c 6f 61 64 20 74 68 65 20 22 65 70  TE: Load the "ep
1f770 69 6c 6f 67 75 65 22 20 63 75 73 74 6f 6d 20 70  ilogue" custom p
1f780 65 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20 70  er-user and/or p
1f790 65 72 2d 68 6f 73 74 20 74 65 73 74 0d 0a 20 20  er-host test..  
1f7a0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 65        #       se
1f7b0 74 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20 20  ttings now...   
1f7c0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1f7d0 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20  uplevel 1 [list 
1f7e0 6c 6f 61 64 53 51 4c 69 74 65 54 65 73 74 53 65  loadSQLiteTestSe
1f7f0 74 74 69 6e 67 73 20 24 3a 3a 74 65 73 74 5f 63  ttings $::test_c
1f800 68 61 6e 6e 65 6c 20 2e 65 70 69 6c 6f 67 75 65  hannel .epilogue
1f810 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
1f820 20 20 20 20 20 20 20 20 23 20 42 55 47 46 49 58          # BUGFIX
1f830 3a 20 42 65 66 6f 72 65 20 63 68 65 63 6b 69 6e  : Before checkin
1f840 67 20 74 68 65 20 66 69 6e 61 6c 20 72 65 73 6f  g the final reso
1f850 75 72 63 65 73 20 69 6e 20 75 73 65 20 62 79 20  urces in use by 
1f860 53 51 4c 69 74 65 2c 20 6d 61 6b 65 0d 0a 20 20  SQLite, make..  
1f870 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
1f880 73 75 72 65 20 62 6f 74 68 20 6f 66 20 74 68 65  sure both of the
1f890 20 50 52 41 47 4d 41 20 72 65 6c 61 74 65 64 20   PRAGMA related 
1f8a0 64 69 72 65 63 74 6f 72 79 20 6e 61 6d 65 73 20  directory names 
1f8b0 61 72 65 20 66 72 65 65 64 2e 0d 0a 20 20 20 20  are freed...    
1f8c0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63      #..        c
1f8d0 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 69 72  heckForSQLiteDir
1f8e0 65 63 74 6f 72 69 65 73 20 24 3a 3a 74 65 73 74  ectories $::test
1f8f0 5f 63 68 61 6e 6e 65 6c 20 74 72 75 65 0d 0a 0d  _channel true...
1f900 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1f910 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 6c 73 6f      # NOTE: Also
1f920 20 72 65 70 6f 72 74 20 74 68 65 20 72 65 73 6f   report the reso
1f930 75 72 63 65 20 75 73 61 67 65 20 61 66 74 65 72  urce usage after
1f940 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 74 65 73   running the tes
1f950 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ts...        #..
1f960 20 20 20 20 20 20 20 20 72 65 70 6f 72 74 53 51          reportSQ
1f970 4c 69 74 65 52 65 73 6f 75 72 63 65 73 20 24 3a  LiteResources $:
1f980 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d  :test_channel...
1f990 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1f9a0 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 70 6f      # NOTE: Repo
1f9b0 72 74 20 74 68 65 20 63 72 69 74 69 63 61 6c 20  rt the critical 
1f9c0 68 61 6e 64 6c 65 20 63 6f 75 6e 74 73 20 61 66  handle counts af
1f9d0 74 65 72 20 72 75 6e 6e 69 6e 67 20 74 68 65 20  ter running the 
1f9e0 74 65 73 74 73 2e 0d 0a 20 20 20 20 20 20 20 20  tests...        
1f9f0 23 0d 0a 20 20 20 20 20 20 20 20 67 65 74 53 51  #..        getSQ
1fa00 4c 69 74 65 48 61 6e 64 6c 65 43 6f 75 6e 74 73  LiteHandleCounts
1fa10 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1fa20 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
1fa30 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49         # NOTE: I
1fa40 66 20 6e 65 63 65 73 73 61 72 79 2c 20 64 69 73  f necessary, dis
1fa50 61 62 6c 65 20 73 68 61 72 65 64 2d 63 61 63 68  able shared-cach
1fa60 65 20 6d 6f 64 65 20 6e 6f 77 2e 0d 0a 20 20 20  e mode now...   
1fa70 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1fa80 69 66 20 7b 5b 68 61 73 52 75 6e 74 69 6d 65 4f  if {[hasRuntimeO
1fa90 70 74 69 6f 6e 20 73 68 61 72 65 64 43 61 63 68  ption sharedCach
1faa0 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
1fab0 20 20 20 20 20 20 65 6e 61 62 6c 65 53 68 61 72        enableShar
1fac0 65 64 43 61 63 68 65 20 24 3a 3a 74 65 73 74 5f  edCache $::test_
1fad0 63 68 61 6e 6e 65 6c 20 66 61 6c 73 65 0d 0a 20  channel false.. 
1fae0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1faf0 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
1fb00 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
1fb10 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1fb20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1fb30 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1fb40 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20  ############..  
1fb50 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
1fb60 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 20  ############### 
1fb70 45 4e 44 20 45 61 67 6c 65 20 4f 4e 4c 59 20 23  END Eagle ONLY #
1fb80 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1fb90 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 20  #############.. 
1fba0 20 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23     #############
1fbb0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1fbc0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1fbd0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1fbe0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
1fbf0 20 20 7d 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23 20    }....  #..  # 
1fc00 4e 4f 54 45 3a 20 53 61 76 65 20 74 68 65 20 6e  NOTE: Save the n
1fc10 61 6d 65 20 6f 66 20 74 68 65 20 64 69 72 65 63  ame of the direc
1fc20 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20  tory containing 
1fc30 74 68 69 73 20 66 69 6c 65 2e 0d 0a 20 20 23 0d  this file...  #.
1fc40 0a 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78  .  if {![info ex
1fc50 69 73 74 73 20 63 6f 6d 6d 6f 6e 5f 64 69 72 65  ists common_dire
1fc60 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ctory]} then {..
1fc70 20 20 20 20 73 65 74 20 63 6f 6d 6d 6f 6e 5f 64      set common_d
1fc80 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65 20 64  irectory [file d
1fc90 69 72 6e 61 6d 65 20 5b 69 6e 66 6f 20 73 63 72  irname [info scr
1fca0 69 70 74 5d 5d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20  ipt]]..  }....  
1fcb0 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 50 72 6f  #..  # NOTE: Pro
1fcc0 76 69 64 65 20 74 68 65 20 53 79 73 74 65 6d 2e  vide the System.
1fcd0 44 61 74 61 2e 53 51 4c 69 74 65 20 74 65 73 74  Data.SQLite test
1fce0 20 70 61 63 6b 61 67 65 20 74 6f 20 74 68 65 20   package to the 
1fcf0 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20  interpreter...  
1fd00 23 0d 0a 20 20 70 61 63 6b 61 67 65 20 70 72 6f  #..  package pro
1fd10 76 69 64 65 20 53 79 73 74 65 6d 2e 44 61 74 61  vide System.Data
1fd20 2e 53 51 4c 69 74 65 2e 54 65 73 74 20 31 2e 30  .SQLite.Test 1.0
1fd30 0d 0a 7d 0d 0a                                   ..}..