System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 4be4f6a44f7db75cfca635fc7c9899b6a987383a:


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 45 78 65 63 75     proc getExecu
71c0: 74 65 4f 6e 53 65 74 75 70 20 7b 7d 20 7b 0d 0a  teOnSetup {} {..
71d0: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
71e0: 65 78 69 73 74 73 20 3a 3a 65 78 65 63 75 74 65  exists ::execute
71f0: 5f 6f 6e 5f 73 65 74 75 70 5d 20 26 26 20 5c 0d  _on_setup] && \.
7200: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
7210: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 65 78 65  ng length $::exe
7220: 63 75 74 65 5f 6f 6e 5f 73 65 74 75 70 5d 20 3e  cute_on_setup] >
7230: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
7240: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
7250: 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68   NOTE: Return th
7260: 65 20 63 6f 6e 66 69 67 75 72 65 64 20 53 51 4c  e configured SQL
7270: 20 74 6f 20 65 78 65 63 75 74 65 20 64 75 72 69   to execute duri
7280: 6e 67 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ng the connectio
7290: 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  n..        #    
72a0: 20 20 20 73 65 74 75 70 20 70 72 6f 63 65 64 75     setup procedu
72b0: 72 65 20 28 69 2e 65 2e 20 66 6f 72 20 65 76 65  re (i.e. for eve
72c0: 72 79 20 74 65 73 74 20 64 61 74 61 62 61 73 65  ry test database
72d0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0d 0a 20   connection)... 
72e0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
72f0: 20 20 72 65 74 75 72 6e 20 24 3a 3a 65 78 65 63    return $::exec
7300: 75 74 65 5f 6f 6e 5f 73 65 74 75 70 0d 0a 20 20  ute_on_setup..  
7310: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
7320: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
7330: 20 23 20 4e 4f 54 45 3a 20 42 79 20 64 65 66 61   # NOTE: By defa
7340: 75 6c 74 2c 20 74 68 65 72 65 20 69 73 20 6e 6f  ult, there is no
7350: 20 53 51 4c 20 74 6f 20 65 78 65 63 75 74 65 20   SQL to execute 
7360: 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6e 6e 65  during the conne
7370: 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 23  ction..        #
7380: 20 20 20 20 20 20 20 73 65 74 75 70 20 70 72 6f         setup pro
7390: 63 65 64 75 72 65 20 28 69 2e 65 2e 20 66 6f 72  cedure (i.e. for
73a0: 20 65 76 65 72 79 20 74 65 73 74 20 64 61 74 61   every test data
73b0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 29  base connection)
73c0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
73d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d        return "".
73e0: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
73f0: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
7400: 54 65 73 74 4f 76 65 72 72 69 64 65 73 50 72 65  TestOverridesPre
7410: 61 6d 62 6c 65 20 7b 20 7b 65 78 74 72 61 56 61  amble { {extraVa
7420: 72 4e 61 6d 65 73 20 22 22 7d 20 7d 20 7b 0d 0a  rNames ""} } {..
7430: 20 20 20 20 20 20 73 65 74 20 76 61 72 4e 61 6d        set varNam
7440: 65 73 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20  es [list]....   
7450: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
7460: 54 45 3a 20 49 66 20 61 76 61 69 6c 61 62 6c 65  TE: If available
7470: 2c 20 73 74 61 72 74 20 77 69 74 68 20 74 68 65  , start with the
7480: 20 6d 61 73 74 65 72 20 6c 69 73 74 20 6f 66 20   master list of 
7490: 74 65 73 74 20 6f 76 65 72 72 69 64 65 0d 0a 20  test override.. 
74a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61 72       #       var
74b0: 69 61 62 6c 65 73 2e 0d 0a 20 20 20 20 20 20 23  iables...      #
74c0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
74d0: 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f  o exists ::test_
74e0: 6f 76 65 72 72 69 64 65 73 5d 20 26 26 20 5c 0d  overrides] && \.
74f0: 0a 20 20 20 20 20 20 20 20 20 20 5b 6c 6c 65 6e  .          [llen
7500: 67 74 68 20 24 3a 3a 74 65 73 74 5f 6f 76 65 72  gth $::test_over
7510: 72 69 64 65 73 5d 20 3e 20 30 7d 20 74 68 65 6e  rides] > 0} then
7520: 20 7b 0d 0a 20 20 20 20 20 20 20 20 65 76 61 6c   {..        eval
7530: 20 6c 61 70 70 65 6e 64 20 76 61 72 4e 61 6d 65   lappend varName
7540: 73 20 24 3a 3a 74 65 73 74 5f 6f 76 65 72 72 69  s $::test_overri
7550: 64 65 73 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  des..      }....
7560: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
7570: 20 4e 4f 54 45 3a 20 49 66 20 72 65 71 75 65 73   NOTE: If reques
7580: 74 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65  ted by our calle
7590: 72 2c 20 61 64 64 20 61 6e 79 20 61 64 64 69 74  r, add any addit
75a0: 69 6f 6e 61 6c 20 76 61 72 69 61 62 6c 65 0d 0a  ional variable..
75b0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61        #       na
75c0: 6d 65 73 20 74 6f 20 63 6f 70 79 20 6e 6f 77 2e  mes to copy now.
75d0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
75e0: 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 65   if {[llength $e
75f0: 78 74 72 61 56 61 72 4e 61 6d 65 73 5d 20 3e 20  xtraVarNames] > 
7600: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
7610: 20 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20     eval lappend 
7620: 76 61 72 4e 61 6d 65 73 20 24 65 78 74 72 61 56  varNames $extraV
7630: 61 72 4e 61 6d 65 73 0d 0a 20 20 20 20 20 20 7d  arNames..      }
7640: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
7650: 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64     # NOTE: Build
7660: 20 74 68 65 20 73 63 72 69 70 74 20 66 72 61 67   the script frag
7670: 6d 65 6e 74 20 74 6f 20 62 65 20 72 65 74 75 72  ment to be retur
7680: 6e 65 64 20 62 79 20 70 72 6f 63 65 73 73 69 6e  ned by processin
7690: 67 20 65 61 63 68 0d 0a 20 20 20 20 20 20 23 20  g each..      # 
76a0: 20 20 20 20 20 20 76 61 72 69 61 62 6c 65 20 6e        variable n
76b0: 61 6d 65 20 61 6e 64 20 61 64 64 69 6e 67 20 74  ame and adding t
76c0: 68 65 20 6e 65 63 65 63 65 73 73 61 72 79 20 73  he nececessary s
76d0: 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 73 20  cript fragments 
76e0: 66 6f 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20  for..      #    
76f0: 20 20 20 65 61 63 68 20 6f 6e 65 2e 0d 0a 20 20     each one...  
7700: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
7710: 20 72 65 73 75 6c 74 20 22 22 0d 0a 0d 0a 20 20   result ""....  
7720: 20 20 20 20 66 6f 72 65 61 63 68 20 76 61 72 4e      foreach varN
7730: 61 6d 65 20 24 76 61 72 4e 61 6d 65 73 20 7b 0d  ame $varNames {.
7740: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
7750: 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c      # NOTE: Buil
7760: 64 20 74 68 65 20 71 75 61 6c 69 66 69 65 64 20  d the qualified 
7770: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
7780: 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  name...        #
7790: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 75  ..        set fu
77a0: 6c 6c 56 61 72 4e 61 6d 65 20 5b 61 70 70 65 6e  llVarName [appen
77b0: 64 41 72 67 73 20 3a 3a 20 24 76 61 72 4e 61 6d  dArgs :: $varNam
77c0: 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  e]....        #.
77d0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
77e0: 20 44 6f 65 73 20 74 68 65 20 76 61 72 69 61 62   Does the variab
77f0: 6c 65 20 65 78 69 73 74 20 69 6e 20 74 68 69 73  le exist in this
7800: 20 69 6e 74 65 72 70 72 65 74 65 72 20 63 6f 6e   interpreter con
7810: 74 65 78 74 3f 0d 0a 20 20 20 20 20 20 20 20 23  text?..        #
7820: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69  ..        if {[i
7830: 6e 66 6f 20 65 78 69 73 74 73 20 24 66 75 6c 6c  nfo exists $full
7840: 56 61 72 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  VarName]} then {
7850: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
7860: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
7870: 20 41 70 70 65 6e 64 20 61 20 73 63 72 69 70 74   Append a script
7880: 20 66 72 61 67 6d 65 6e 74 20 74 6f 20 74 68 65   fragment to the
7890: 20 72 65 73 75 6c 74 20 74 68 61 74 20 77 69 6c   result that wil
78a0: 6c 20 63 6f 72 72 65 63 74 6c 79 0d 0a 20 20 20  l correctly..   
78b0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
78c0: 6f 70 79 20 61 6e 79 20 63 6f 6e 74 61 69 6e 65  opy any containe
78d0: 64 20 76 61 6c 75 65 20 74 6f 20 61 6e 6f 74 68  d value to anoth
78e0: 65 72 20 69 6e 74 65 72 70 72 65 74 65 72 20 63  er interpreter c
78f0: 6f 6e 74 65 78 74 2e 0d 0a 20 20 20 20 20 20 20  ontext...       
7900: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
7910: 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 5c 6e  append result \n
7920: 20 22 73 65 74 20 22 20 24 66 75 6c 6c 56 61 72   "set " $fullVar
7930: 4e 61 6d 65 20 22 20 5c 7b 22 20 5b 73 65 74 20  Name " \{" [set 
7940: 24 66 75 6c 6c 56 61 72 4e 61 6d 65 5d 20 5c 7d  $fullVarName] \}
7950: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
7960: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
7970: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
7980: 66 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6e  f the result con
7990: 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  tains one or mor
79a0: 65 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e  e script fragmen
79b0: 74 73 2c 20 61 70 70 65 6e 64 20 61 0d 0a 20 20  ts, append a..  
79c0: 20 20 20 20 23 20 20 20 20 20 20 20 6e 65 77 6c      #       newl
79d0: 69 6e 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ine...      #.. 
79e0: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
79f0: 20 6c 65 6e 67 74 68 20 24 72 65 73 75 6c 74 5d   length $result]
7a00: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
7a10: 20 20 20 20 20 20 61 70 70 65 6e 64 20 72 65 73        append res
7a20: 75 6c 74 20 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d  ult \n..      }.
7a30: 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
7a40: 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a  $result..    }..
7a50: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 41  ...    proc getA
7a60: 70 70 44 6f 6d 61 69 6e 50 72 65 61 6d 62 6c 65  ppDomainPreamble
7a70: 20 7b 20 7b 70 72 65 66 69 78 20 22 22 7d 20 7b   { {prefix ""} {
7a80: 73 75 66 66 69 78 20 22 22 7d 20 7d 20 7b 0d 0a  suffix ""} } {..
7a90: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
7aa0: 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63   NOTE: This proc
7ab0: 65 64 75 72 65 20 72 65 74 75 72 6e 73 20 61 20  edure returns a 
7ac0: 74 65 73 74 20 73 65 74 75 70 20 73 63 72 69 70  test setup scrip
7ad0: 74 20 66 72 61 67 6d 65 6e 74 20 73 75 69 74 61  t fragment suita
7ae0: 62 6c 65 20 66 6f 72 0d 0a 20 20 20 20 20 20 23  ble for..      #
7af0: 20 20 20 20 20 20 20 65 76 61 6c 75 61 74 69 6f         evaluatio
7b00: 6e 20 62 79 20 61 6e 20 69 6e 74 65 72 70 72 65  n by an interpre
7b10: 74 65 72 20 63 72 65 61 74 65 64 20 69 6e 20 61  ter created in a
7b20: 6e 20 69 73 6f 6c 61 74 65 64 20 61 70 70 6c 69  n isolated appli
7b30: 63 61 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20  cation..      # 
7b40: 20 20 20 20 20 20 64 6f 6d 61 69 6e 2e 20 20 54        domain.  T
7b50: 68 65 20 73 63 72 69 70 74 20 66 72 61 67 6d 65  he script fragme
7b60: 6e 74 20 62 65 69 6e 67 20 72 65 74 75 72 6e 65  nt being returne
7b70: 64 20 77 69 6c 6c 20 62 65 20 73 75 72 72 6f 75  d will be surrou
7b80: 6e 64 65 64 20 62 79 0d 0a 20 20 20 20 20 20 23  nded by..      #
7b90: 20 20 20 20 20 20 20 74 68 65 20 70 72 65 66 69         the prefi
7ba0: 78 20 61 6e 64 20 73 75 66 66 69 78 20 22 73 63  x and suffix "sc
7bb0: 72 69 70 74 20 66 72 61 67 6d 65 6e 74 73 22 20  ript fragments" 
7bc0: 73 70 65 63 69 66 69 65 64 20 62 79 20 6f 75 72  specified by our
7bd0: 20 63 61 6c 6c 65 72 2c 0d 0a 20 20 20 20 20 20   caller,..      
7be0: 23 20 20 20 20 20 20 20 69 66 20 61 6e 79 2e 20  #       if any. 
7bf0: 20 54 68 65 20 65 6e 74 69 72 65 20 73 63 72 69   The entire scri
7c00: 70 74 20 62 65 69 6e 67 20 72 65 74 75 72 6e 65  pt being returne
7c10: 64 20 77 69 6c 6c 20 62 65 20 73 75 62 73 74 69  d will be substi
7c20: 74 75 74 65 64 20 76 69 61 0d 0a 20 20 20 20 20  tuted via..     
7c30: 20 23 20 20 20 20 20 20 20 5b 73 75 62 73 74 5d   #       [subst]
7c40: 2c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74  , in the context
7c50: 20 6f 66 20 6f 75 72 20 63 61 6c 6c 65 72 2c 20   of our caller, 
7c60: 62 65 66 6f 72 65 20 62 65 69 6e 67 20 72 65 74  before being ret
7c70: 75 72 6e 65 64 2e 0d 0a 20 20 20 20 20 20 23 20  urned...      # 
7c80: 20 20 20 20 20 20 54 68 69 73 20 73 74 65 70 20        This step 
7c90: 69 73 20 6e 65 63 65 73 73 61 72 79 20 73 6f 20  is necessary so 
7ca0: 74 68 61 74 20 73 6f 6d 65 20 6c 69 6d 69 74 65  that some limite
7cb0: 64 20 63 6f 6e 74 65 78 74 20 69 6e 66 6f 72 6d  d context inform
7cc0: 61 74 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 23 20  ation,..      # 
7cd0: 20 20 20 20 20 20 70 72 69 6d 61 72 69 6c 79 20        primarily 
7ce0: 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20 74  related to the t
7cf0: 65 73 74 69 6e 67 20 64 69 72 65 63 74 6f 72 69  esting directori
7d00: 65 73 2c 20 63 61 6e 20 62 65 20 74 72 61 6e 73  es, can be trans
7d10: 66 65 72 72 65 64 0d 0a 20 20 20 20 20 20 23 20  ferred..      # 
7d20: 20 20 20 20 20 20 74 6f 20 74 68 65 20 69 6e 74        to the int
7d30: 65 72 70 72 65 74 65 72 20 69 6e 20 74 68 65 20  erpreter in the 
7d40: 69 73 6f 6c 61 74 65 64 20 61 70 70 6c 69 63 61  isolated applica
7d50: 74 69 6f 6e 20 64 6f 6d 61 69 6e 2c 20 6d 61 6b  tion domain, mak
7d60: 69 6e 67 20 69 74 0d 0a 20 20 20 20 20 20 23 20  ing it..      # 
7d70: 20 20 20 20 20 20 61 62 6c 65 20 74 6f 20 73 75        able to su
7d80: 63 63 65 73 73 66 75 6c 6c 79 20 72 75 6e 20 74  ccessfully run t
7d90: 65 73 74 73 20 74 68 61 74 20 72 65 71 75 69 72  ests that requir
7da0: 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  e one or more of
7db0: 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
7dc0: 20 20 20 20 66 69 6c 65 73 20 69 6e 20 6f 6e 65      files in one
7dd0: 20 6f 66 20 74 68 65 20 74 65 73 74 69 6e 67 20   of the testing 
7de0: 64 69 72 65 63 74 6f 72 69 65 73 2e 20 20 43 61  directories.  Ca
7df0: 6c 6c 65 72 73 20 73 68 6f 75 6c 64 20 6b 65 65  llers should kee
7e00: 70 20 69 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  p in..      #   
7e10: 20 20 20 20 6d 69 6e 64 20 74 68 61 74 20 74 68      mind that th
7e20: 65 20 74 65 73 74 20 73 63 72 69 70 74 20 66 72  e test script fr
7e30: 61 67 6d 65 6e 74 20 62 65 69 6e 67 20 72 65 74  agment being ret
7e40: 75 72 6e 65 64 20 63 61 6e 6e 6f 74 20 72 65 6c  urned cannot rel
7e50: 79 20 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  y on..      #   
7e60: 20 20 20 20 61 6e 79 20 73 63 72 69 70 74 20 6c      any script l
7e70: 69 62 72 61 72 79 20 70 72 6f 63 65 64 75 72 65  ibrary procedure
7e80: 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 70  s that are not p
7e90: 72 6f 76 69 64 65 64 20 62 79 20 74 68 65 20 45  rovided by the E
7ea0: 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 20 20 20  agle..      #   
7eb0: 20 20 20 20 6c 69 62 72 61 72 79 20 70 61 63 6b      library pack
7ec0: 61 67 65 20 28 69 2e 65 2e 20 22 69 6e 69 74 2e  age (i.e. "init.
7ed0: 65 61 67 6c 65 22 29 2c 20 69 6e 63 6c 75 64 69  eagle"), includi
7ee0: 6e 67 20 74 68 6f 73 65 20 70 72 6f 76 69 64 65  ng those provide
7ef0: 64 20 62 79 0d 0a 20 20 20 20 20 20 23 20 20 20  d by..      #   
7f00: 20 20 20 20 74 68 65 20 45 61 67 6c 65 20 74 65      the Eagle te
7f10: 73 74 20 70 61 63 6b 61 67 65 2c 20 75 6e 6c 65  st package, unle
7f20: 73 73 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74  ss the file cont
7f30: 61 69 6e 69 6e 67 20 74 68 65 6d 20 69 73 20 6c  aining them is l
7f40: 6f 61 64 65 64 0d 0a 20 20 20 20 20 20 23 20 20  oaded..      #  
7f50: 20 20 20 20 20 6d 61 6e 75 61 6c 6c 79 20 76 69       manually vi
7f60: 61 20 73 6f 6d 65 20 6f 74 68 65 72 20 6d 65 63  a some other mec
7f70: 68 61 6e 69 73 6d 20 28 65 2e 67 2e 20 62 79 20  hanism (e.g. by 
7f80: 69 6e 63 6c 75 64 69 6e 67 20 61 70 70 72 6f 70  including approp
7f90: 72 69 61 74 65 0d 0a 20 20 20 20 20 20 23 20 20  riate..      #  
7fa0: 20 20 20 20 20 5b 70 61 63 6b 61 67 65 20 72 65       [package re
7fb0: 71 75 69 72 65 5d 20 6f 72 20 5b 73 6f 75 72 63  quire] or [sourc
7fc0: 65 5d 20 63 6f 6d 6d 61 6e 64 73 20 69 6e 20 74  e] commands in t
7fd0: 68 65 20 70 72 65 66 69 78 20 6f 72 20 73 75 66  he prefix or suf
7fe0: 66 69 78 0d 0a 20 20 20 20 20 20 23 20 20 20 20  fix..      #    
7ff0: 20 20 20 73 63 72 69 70 74 20 66 72 61 67 6d 65     script fragme
8000: 6e 74 73 29 2e 20 20 41 6c 73 6f 2c 20 61 6c 6c  nts).  Also, all
8010: 20 76 61 72 69 61 62 6c 65 20 72 65 66 65 72 65   variable refere
8020: 6e 63 65 73 20 61 6e 64 20 61 6c 6c 20 6e 65 73  nces and all nes
8030: 74 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ted..      #    
8040: 20 20 20 63 6f 6d 6d 61 6e 64 73 20 28 69 2e 65     commands (i.e
8050: 2e 20 74 68 6f 73 65 20 69 6e 20 73 71 75 61 72  . those in squar
8060: 65 20 62 72 61 63 6b 65 74 73 29 20 63 6f 6e 74  e brackets) cont
8070: 61 69 6e 65 64 20 69 6e 20 74 68 65 20 66 69 6e  ained in the fin
8080: 61 6c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  al..      #     
8090: 20 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e    script fragmen
80a0: 74 20 77 69 6c 6c 20 65 6e 64 20 75 70 20 62 65  t will end up be
80b0: 69 6e 67 20 65 76 61 6c 75 61 74 65 64 20 69 6e  ing evaluated in
80c0: 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20   the context of 
80d0: 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
80e0: 20 20 20 63 61 6c 6c 69 6e 67 20 69 6e 74 65 72     calling inter
80f0: 70 72 65 74 65 72 20 61 6e 64 20 6e 6f 74 20 74  preter and not t
8100: 68 65 20 74 61 72 67 65 74 20 69 6e 74 65 72 70  he target interp
8110: 72 65 74 65 72 20 63 72 65 61 74 65 64 20 69 6e  reter created in
8120: 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
8130: 20 20 20 20 69 73 6f 6c 61 74 65 64 20 61 70 70      isolated app
8140: 6c 69 63 61 74 69 6f 6e 20 64 6f 6d 61 69 6e 20  lication domain 
8150: 75 6e 6c 65 73 73 20 74 68 65 20 64 6f 6c 6c 61  unless the dolla
8160: 72 20 73 69 67 6e 73 20 61 6e 64 2f 6f 72 20 73  r signs and/or s
8170: 71 75 61 72 65 0d 0a 20 20 20 20 20 20 23 20 20  quare..      #  
8180: 20 20 20 20 20 62 72 61 63 6b 65 74 73 20 61 72       brackets ar
8190: 65 20 73 70 65 63 69 61 6c 6c 79 20 71 75 6f 74  e specially quot
81a0: 65 64 20 77 69 74 68 20 62 61 63 6b 73 6c 61 73  ed with backslas
81b0: 68 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  hes...      #.. 
81c0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 75 70 6c       return [upl
81d0: 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 73 75 62  evel 1 [list sub
81e0: 73 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  st [appendArgs $
81f0: 70 72 65 66 69 78 20 7b 0d 0a 20 20 20 20 20 20  prefix {..      
8200: 20 20 69 66 20 7b 5b 68 61 73 52 75 6e 74 69 6d    if {[hasRuntim
8210: 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65 5d 7d  eOption native]}
8220: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
8230: 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
8240: 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74   Interpreter.Get
8250: 41 63 74 69 76 65 20 41 64 64 52 75 6e 74 69 6d  Active AddRuntim
8260: 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65 0d 0a  eOption native..
8270: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
8280: 20 7d 20 5b 67 65 74 54 65 73 74 4f 76 65 72 72   } [getTestOverr
8290: 69 64 65 73 50 72 65 61 6d 62 6c 65 20 5b 6c 69  idesPreamble [li
82a0: 73 74 20 70 61 74 68 20 74 65 73 74 5f 63 68 61  st path test_cha
82b0: 6e 6e 65 6c 5d 5d 20 24 73 75 66 66 69 78 5d 5d  nnel]] $suffix]]
82c0: 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  ]..    }.....   
82d0: 20 70 72 6f 63 20 74 72 79 43 6f 70 79 45 78 74   proc tryCopyExt
82e0: 65 72 6e 61 6c 46 69 6c 65 20 7b 0d 0a 20 20 20  ernalFile {..   
82f0: 20 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d           fileNam
8300: 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20  e {platform ""} 
8310: 7b 6e 65 77 46 69 6c 65 4e 61 6d 65 20 22 22 7d  {newFileName ""}
8320: 20 7b 76 65 72 62 6f 73 65 20 66 61 6c 73 65 7d   {verbose false}
8330: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20   } {..      set 
8340: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5b  sourceFileName [
8350: 67 65 74 45 78 74 65 72 6e 61 6c 46 69 6c 65 4e  getExternalFileN
8360: 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a  ame $fileName]..
8370: 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69  ..      if {![fi
8380: 6c 65 20 65 78 69 73 74 73 20 24 73 6f 75 72 63  le exists $sourc
8390: 65 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  eFileName]} then
83a0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
83b0: 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b  $verbose} then {
83c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
83d0: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
83e0: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
83f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
8400: 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 63 6f 70  ---- skipped cop
8410: 79 69 6e 67 20 65 78 74 65 72 6e 61 6c 20 66 69  ying external fi
8420: 6c 65 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69  le \"" $sourceFi
8430: 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  leName \..      
8440: 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69 74 20          "\", it 
8450: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e  does not exist\n
8460: 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  "]..        }.. 
8470: 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20         return.. 
8480: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
8490: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
84a0: 74 68 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65 5d  th $newFileName]
84b0: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
84c0: 20 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74        set target
84d0: 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e  FileName [getBin
84e0: 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 6e 65 77  aryFileName $new
84f0: 46 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f  FileName $platfo
8500: 72 6d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  rm]..      } els
8510: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  e {..        set
8520: 20 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20   targetFileName 
8530: 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61  [getBinaryFileNa
8540: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c  me $fileName $pl
8550: 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 7d  atform]..      }
8560: 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 74 61  ....      set ta
8570: 72 67 65 74 44 69 72 65 63 74 6f 72 79 20 5b 66  rgetDirectory [f
8580: 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 74 61 72  ile dirname $tar
8590: 67 65 74 46 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a  getFileName]....
85a0: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
85b0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
85c0: 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 74  ![file exists $t
85d0: 61 72 67 65 74 44 69 72 65 63 74 6f 72 79 5d 7d  argetDirectory]}
85e0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
85f0: 20 20 20 66 69 6c 65 20 6d 6b 64 69 72 20 24 74     file mkdir $t
8600: 61 72 67 65 74 44 69 72 65 63 74 6f 72 79 0d 0a  argetDirectory..
8610: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
8620: 20 20 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f     file copy -fo
8630: 72 63 65 20 24 73 6f 75 72 63 65 46 69 6c 65 4e  rce $sourceFileN
8640: 61 6d 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e  ame $targetFileN
8650: 61 6d 65 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d  ame..      }] ==
8660: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
8670: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
8680: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
8690: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
86a0: 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 69 65       "---- copie
86b0: 64 20 65 78 74 65 72 6e 61 6c 20 66 69 6c 65 20  d external file 
86c0: 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63 65  from \"" $source
86d0: 46 69 6c 65 4e 61 6d 65 20 22 5c 22 20 74 6f 20  FileName "\" to 
86e0: 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
86f0: 20 20 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61     $targetFileNa
8700: 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  me \"\n]..      
8710: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
8720: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
8730: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
8740: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
8750: 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20     "---- failed 
8760: 74 6f 20 63 6f 70 79 20 65 78 74 65 72 6e 61 6c  to copy external
8770: 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24   file from \"" $
8780: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c  sourceFileName \
8790: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 5c  ..            "\
87a0: 22 20 74 6f 20 5c 22 22 20 24 74 61 72 67 65 74  " to \"" $target
87b0: 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a  FileName \"\n]..
87c0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
87d0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79 43  ...    proc tryC
87e0: 6f 70 79 42 69 6e 61 72 79 46 69 6c 65 20 7b 0d  opyBinaryFile {.
87f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c  .            fil
8800: 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20  eName {platform 
8810: 22 22 7d 20 7b 6e 65 77 46 69 6c 65 4e 61 6d 65  ""} {newFileName
8820: 20 22 22 7d 20 7b 76 65 72 62 6f 73 65 20 66 61   ""} {verbose fa
8830: 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  lse} } {..      
8840: 73 65 74 20 73 6f 75 72 63 65 46 69 6c 65 4e 61  set sourceFileNa
8850: 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c  me [getBinaryFil
8860: 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20  eName $fileName 
8870: 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20  $platform]....  
8880: 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65      if {![file e
8890: 78 69 73 74 73 20 24 73 6f 75 72 63 65 46 69 6c  xists $sourceFil
88a0: 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
88b0: 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72          if {$ver
88c0: 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  bose} then {..  
88d0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
88e0: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
88f0: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
8900: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
8910: 20 73 6b 69 70 70 65 64 20 63 6f 70 79 69 6e 67   skipped copying
8920: 20 62 69 6e 61 72 79 20 66 69 6c 65 20 5c 22 22   binary file \""
8930: 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65   $sourceFileName
8940: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
8950: 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e    "\", it does n
8960: 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20  ot exist\n"]..  
8970: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
8980: 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d   return..      }
8990: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73  ....      if {[s
89a0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e 65  tring length $ne
89b0: 77 46 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20  wFileName] > 0} 
89c0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
89d0: 73 65 74 20 74 61 72 67 65 74 46 69 6c 65 4e 61  set targetFileNa
89e0: 6d 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65  me [getBuildFile
89f0: 4e 61 6d 65 20 24 6e 65 77 46 69 6c 65 4e 61 6d  Name $newFileNam
8a00: 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20  e $platform]..  
8a10: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
8a20: 20 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74        set target
8a30: 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 75 69  FileName [getBui
8a40: 6c 64 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  ldFileName $file
8a50: 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d  Name $platform].
8a60: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
8a70: 20 20 73 65 74 20 74 61 72 67 65 74 44 69 72 65    set targetDire
8a80: 63 74 6f 72 79 20 5b 66 69 6c 65 20 64 69 72 6e  ctory [file dirn
8a90: 61 6d 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e  ame $targetFileN
8aa0: 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  ame]....      if
8ab0: 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
8ac0: 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65      if {![file e
8ad0: 78 69 73 74 73 20 24 74 61 72 67 65 74 44 69 72  xists $targetDir
8ae0: 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d  ectory]} then {.
8af0: 0a 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20  .          file 
8b00: 6d 6b 64 69 72 20 24 74 61 72 67 65 74 44 69 72  mkdir $targetDir
8b10: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 20 20  ectory..        
8b20: 7d 0d 0a 20 20 20 20 20 20 20 20 66 69 6c 65 20  }..        file 
8b30: 63 6f 70 79 20 2d 66 6f 72 63 65 20 24 73 6f 75  copy -force $sou
8b40: 72 63 65 46 69 6c 65 4e 61 6d 65 20 24 74 61 72  rceFileName $tar
8b50: 67 65 74 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  getFileName..   
8b60: 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e     }] == 0} then
8b70: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
8b80: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
8b90: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
8ba0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
8bb0: 2d 2d 20 63 6f 70 69 65 64 20 62 69 6e 61 72 79  -- copied binary
8bc0: 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24   file from \"" $
8bd0: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 22  sourceFileName "
8be0: 5c 22 20 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20  \" to \"" \..   
8bf0: 20 20 20 20 20 20 20 20 20 24 74 61 72 67 65 74           $target
8c00: 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a  FileName \"\n]..
8c10: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
8c20: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
8c30: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
8c40: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
8c50: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66           "---- f
8c60: 61 69 6c 65 64 20 74 6f 20 63 6f 70 79 20 62 69  ailed to copy bi
8c70: 6e 61 72 79 20 66 69 6c 65 20 66 72 6f 6d 20 5c  nary file from \
8c80: 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61  "" $sourceFileNa
8c90: 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
8ca0: 20 20 22 5c 22 20 74 6f 20 5c 22 22 20 24 74 61    "\" to \"" $ta
8cb0: 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c  rgetFileName \"\
8cc0: 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  n]..      }..   
8cd0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
8ce0: 74 72 79 43 6f 70 79 42 75 69 6c 64 46 69 6c 65  tryCopyBuildFile
8cf0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
8d00: 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f  fileName {platfo
8d10: 72 6d 20 22 22 7d 20 7b 6e 65 77 46 69 6c 65 4e  rm ""} {newFileN
8d20: 61 6d 65 20 22 22 7d 20 7b 76 65 72 62 6f 73 65  ame ""} {verbose
8d30: 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20   false} } {..   
8d40: 20 20 20 73 65 74 20 73 6f 75 72 63 65 46 69 6c     set sourceFil
8d50: 65 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c 64 46  eName [getBuildF
8d60: 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d  ileName $fileNam
8d70: 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a  e $platform]....
8d80: 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65        if {![file
8d90: 20 65 78 69 73 74 73 20 24 73 6f 75 72 63 65 46   exists $sourceF
8da0: 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
8db0: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 76  ..        if {$v
8dc0: 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a  erbose} then {..
8dd0: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
8de0: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
8df0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
8e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
8e10: 2d 2d 20 73 6b 69 70 70 65 64 20 63 6f 70 79 69  -- skipped copyi
8e20: 6e 67 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22  ng build file \"
8e30: 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  " $sourceFileNam
8e40: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
8e50: 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20     "\", it does 
8e60: 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20  not exist\n"].. 
8e70: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
8e80: 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20    return..      
8e90: 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  }....      if {[
8ea0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e  string length $n
8eb0: 65 77 46 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d  ewFileName] > 0}
8ec0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
8ed0: 20 73 65 74 20 74 61 72 67 65 74 46 69 6c 65 4e   set targetFileN
8ee0: 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69  ame [getBinaryFi
8ef0: 6c 65 4e 61 6d 65 20 24 6e 65 77 46 69 6c 65 4e  leName $newFileN
8f00: 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a  ame $platform]..
8f10: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
8f20: 20 20 20 20 20 20 20 20 73 65 74 20 74 61 72 67          set targ
8f30: 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42  etFileName [getB
8f40: 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66  inaryFileName $f
8f50: 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72  ileName $platfor
8f60: 6d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  m]..      }.... 
8f70: 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74 44       set targetD
8f80: 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65 20 64  irectory [file d
8f90: 69 72 6e 61 6d 65 20 24 74 61 72 67 65 74 46 69  irname $targetFi
8fa0: 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20  leName]....     
8fb0: 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
8fc0: 20 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c         if {![fil
8fd0: 65 20 65 78 69 73 74 73 20 24 74 61 72 67 65 74  e exists $target
8fe0: 44 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e  Directory]} then
8ff0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66 69   {..          fi
9000: 6c 65 20 6d 6b 64 69 72 20 24 74 61 72 67 65 74  le mkdir $target
9010: 44 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20  Directory..     
9020: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 66 69     }..        fi
9030: 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63 65 20 24  le copy -force $
9040: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 24  sourceFileName $
9050: 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 0d 0a  targetFileName..
9060: 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74        }] == 0} t
9070: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  hen {..        t
9080: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
9090: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
90a0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
90b0: 22 2d 2d 2d 2d 20 63 6f 70 69 65 64 20 62 75 69  "---- copied bui
90c0: 6c 64 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22  ld file from \""
90d0: 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65   $sourceFileName
90e0: 20 22 5c 22 20 74 6f 20 5c 22 22 20 5c 0d 0a 20   "\" to \"" \.. 
90f0: 20 20 20 20 20 20 20 20 20 20 20 24 74 61 72 67             $targ
9100: 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d  etFileName \"\n]
9110: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
9120: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
9130: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
9140: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
9150: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
9160: 20 66 61 69 6c 65 64 20 74 6f 20 63 6f 70 79 20   failed to copy 
9170: 62 75 69 6c 64 20 66 69 6c 65 20 66 72 6f 6d 20  build file from 
9180: 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e  \"" $sourceFileN
9190: 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
91a0: 20 20 20 22 5c 22 20 74 6f 20 5c 22 22 20 24 74     "\" to \"" $t
91b0: 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22  argetFileName \"
91c0: 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  \n]..      }..  
91d0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
91e0: 20 74 72 79 44 65 6c 65 74 65 42 69 6e 61 72 79   tryDeleteBinary
91f0: 46 69 6c 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20  File { fileName 
9200: 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 76  {platform ""} {v
9210: 65 72 62 6f 73 65 20 66 61 6c 73 65 7d 20 7d 20  erbose false} } 
9220: 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c  {..      set fil
9230: 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79  eName [getBinary
9240: 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61  FileName $fileNa
9250: 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d  me $platform]...
9260: 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c  .      if {![fil
9270: 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61  e exists $fileNa
9280: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
9290: 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73       if {$verbos
92a0: 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
92b0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
92c0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
92d0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
92e0: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b          "---- sk
92f0: 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20 62  ipped deleting b
9300: 69 6e 61 72 79 20 66 69 6c 65 20 5c 22 22 20 24  inary file \"" $
9310: 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20  fileName \..    
9320: 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69            "\", i
9330: 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
9340: 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d  \n"]..        }.
9350: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d  .        return.
9360: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
9370: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 66 69    if {[catch {fi
9380: 6c 65 20 64 65 6c 65 74 65 20 24 66 69 6c 65 4e  le delete $fileN
9390: 61 6d 65 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ame}] == 0} then
93a0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
93b0: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
93c0: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
93d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
93e0: 2d 2d 20 64 65 6c 65 74 65 64 20 62 69 6e 61 72  -- deleted binar
93f0: 79 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65  y file \"" $file
9400: 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20  Name \"\n]..    
9410: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
9420: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
9430: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
9440: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
9450: 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65       "---- faile
9460: 64 20 74 6f 20 64 65 6c 65 74 65 20 62 69 6e 61  d to delete bina
9470: 72 79 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c  ry file \"" $fil
9480: 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  eName \"\n]..   
9490: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
94a0: 20 20 20 20 70 72 6f 63 20 74 72 79 44 65 6c 65      proc tryDele
94b0: 74 65 42 75 69 6c 64 46 69 6c 65 20 7b 20 66 69  teBuildFile { fi
94c0: 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d  leName {platform
94d0: 20 22 22 7d 20 7b 76 65 72 62 6f 73 65 20 66 61   ""} {verbose fa
94e0: 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  lse} } {..      
94f0: 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65  set fileName [ge
9500: 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 24  tBuildFileName $
9510: 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f  fileName $platfo
9520: 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  rm]....      if 
9530: 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24  {![file exists $
9540: 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  fileName]} then 
9550: 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24  {..        if {$
9560: 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d  verbose} then {.
9570: 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
9580: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
9590: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
95a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
95b0: 2d 2d 2d 20 73 6b 69 70 70 65 64 20 64 65 6c 65  --- skipped dele
95c0: 74 69 6e 67 20 62 75 69 6c 64 20 66 69 6c 65 20  ting build file 
95d0: 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d  \"" $fileName \.
95e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
95f0: 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  \", it does not 
9600: 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20  exist\n"]..     
9610: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 72 65     }..        re
9620: 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  turn..      }...
9630: 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63  .      if {[catc
9640: 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24  h {file delete $
9650: 66 69 6c 65 4e 61 6d 65 7d 5d 20 3d 3d 20 30 7d  fileName}] == 0}
9660: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
9670: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
9680: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
9690: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
96a0: 20 20 22 2d 2d 2d 2d 20 64 65 6c 65 74 65 64 20    "---- deleted 
96b0: 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22 20 24  build file \"" $
96c0: 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a  fileName \"\n]..
96d0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
96e0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
96f0: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
9700: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
9710: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66           "---- f
9720: 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20  ailed to delete 
9730: 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22 20 24  build file \"" $
9740: 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a  fileName \"\n]..
9750: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
9760: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79 43  ...    proc tryC
9770: 6f 70 79 41 73 73 65 6d 62 6c 79 20 7b 0d 0a 20  opyAssembly {.. 
9780: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 4e             fileN
9790: 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22  ame {platform ""
97a0: 7d 20 7b 70 64 62 20 74 72 75 65 7d 20 7b 76 65  } {pdb true} {ve
97b0: 72 62 6f 73 65 20 66 61 6c 73 65 7d 20 7d 20 7b  rbose false} } {
97c0: 0d 0a 20 20 20 20 20 20 74 72 79 43 6f 70 79 42  ..      tryCopyB
97d0: 75 69 6c 64 46 69 6c 65 20 24 66 69 6c 65 4e 61  uildFile $fileNa
97e0: 6d 65 20 24 70 6c 61 74 66 6f 72 6d 20 22 22 20  me $platform "" 
97f0: 24 76 65 72 62 6f 73 65 0d 0a 0d 0a 20 20 20 20  $verbose....    
9800: 20 20 69 66 20 7b 24 70 64 62 7d 20 74 68 65 6e    if {$pdb} then
9810: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 72 79 43   {..        tryC
9820: 6f 70 79 42 75 69 6c 64 46 69 6c 65 20 5b 61 70  opyBuildFile [ap
9830: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
9840: 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 72 6f          [file ro
9850: 6f 74 6e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  otname $fileName
9860: 5d 20 2e 70 64 62 5d 20 24 70 6c 61 74 66 6f 72  ] .pdb] $platfor
9870: 6d 20 22 22 20 24 76 65 72 62 6f 73 65 0d 0a 20  m "" $verbose.. 
9880: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
9890: 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79 44 65  ..    proc tryDe
98a0: 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 7b 0d 0a  leteAssembly {..
98b0: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
98c0: 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22  Name {platform "
98d0: 22 7d 20 7b 70 64 62 20 74 72 75 65 7d 20 7b 76  "} {pdb true} {v
98e0: 65 72 62 6f 73 65 20 66 61 6c 73 65 7d 20 7d 20  erbose false} } 
98f0: 7b 0d 0a 20 20 20 20 20 20 74 72 79 44 65 6c 65  {..      tryDele
9900: 74 65 42 69 6e 61 72 79 46 69 6c 65 20 24 66 69  teBinaryFile $fi
9910: 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d  leName $platform
9920: 20 24 76 65 72 62 6f 73 65 0d 0a 0d 0a 20 20 20   $verbose....   
9930: 20 20 20 69 66 20 7b 24 70 64 62 7d 20 74 68 65     if {$pdb} the
9940: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 72 79  n {..        try
9950: 44 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65  DeleteBinaryFile
9960: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
9970: 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
9980: 65 20 72 6f 6f 74 6e 61 6d 65 20 24 66 69 6c 65  e rootname $file
9990: 4e 61 6d 65 5d 20 2e 70 64 62 5d 20 24 70 6c 61  Name] .pdb] $pla
99a0: 74 66 6f 72 6d 20 24 76 65 72 62 6f 73 65 0d 0a  tform $verbose..
99b0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
99c0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79 4c  ...    proc tryL
99d0: 6f 61 64 41 73 73 65 6d 62 6c 79 20 7b 20 66 69  oadAssembly { fi
99e0: 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d  leName {platform
99f0: 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20   ""} } {..      
9a00: 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65  set fileName [ge
9a10: 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
9a20: 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66  $fileName $platf
9a30: 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  orm]....      if
9a40: 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
9a50: 20 20 20 20 73 65 74 20 61 73 73 65 6d 62 6c 79      set assembly
9a60: 20 5b 6f 62 6a 65 63 74 20 6c 6f 61 64 20 2d 6c   [object load -l
9a70: 6f 61 64 74 79 70 65 20 46 69 6c 65 20 2d 61 6c  oadtype File -al
9a80: 69 61 73 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a  ias $fileName]..
9a90: 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74        }] == 0} t
9aa0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
9ab0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
9ac0: 3a 20 4e 6f 77 2c 20 61 64 64 20 74 68 65 20 6e  : Now, add the n
9ad0: 65 63 65 73 73 61 72 79 20 74 65 73 74 20 63 6f  ecessary test co
9ae0: 6e 73 74 72 61 69 6e 74 2e 0d 0a 20 20 20 20 20  nstraint...     
9af0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64     #..        ad
9b00: 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 66 69 6c  dConstraint [fil
9b10: 65 20 72 6f 6f 74 6e 61 6d 65 20 5b 66 69 6c 65  e rootname [file
9b20: 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d   tail $fileName]
9b30: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
9b40: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
9b50: 47 72 61 62 20 74 68 65 20 69 6d 61 67 65 20 72  Grab the image r
9b60: 75 6e 74 69 6d 65 20 76 65 72 73 69 6f 6e 20 66  untime version f
9b70: 72 6f 6d 20 74 68 65 20 61 73 73 65 6d 62 6c 79  rom the assembly
9b80: 20 62 65 63 61 75 73 65 0d 0a 20 20 20 20 20 20   because..      
9b90: 20 20 23 20 20 20 20 20 20 20 73 65 76 65 72 61    #       severa
9ba0: 6c 20 74 65 73 74 73 20 72 65 6c 79 20 6f 6e 20  l tests rely on 
9bb0: 69 74 20 68 61 76 69 6e 67 20 61 20 63 65 72 74  it having a cert
9bc0: 61 69 6e 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20  ain value...    
9bd0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61      #..        a
9be0: 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  ddConstraint [ap
9bf0: 70 65 6e 64 41 72 67 73 20 5b 66 69 6c 65 20 74  pendArgs [file t
9c00: 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 20 5f  ail $fileName] _
9c10: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
9c20: 5b 24 61 73 73 65 6d 62 6c 79 20 49 6d 61 67 65  [$assembly Image
9c30: 52 75 6e 74 69 6d 65 56 65 72 73 69 6f 6e 5d 5d  RuntimeVersion]]
9c40: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
9c50: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52         # NOTE: R
9c60: 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70  eturn the full p
9c70: 61 74 68 20 6f 66 20 74 68 65 20 6c 6f 61 64 65  ath of the loade
9c80: 64 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20  d file...       
9c90: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
9ca0: 72 6e 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20  rn $fileName..  
9cb0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72      }....      r
9cc0: 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 7d 0d  eturn ""..    }.
9cd0: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73 53  ....    proc isS
9ce0: 51 4c 69 74 65 52 65 61 64 79 20 7b 7d 20 7b 0d  QLiteReady {} {.
9cf0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
9d00: 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f  # NOTE: This pro
9d10: 63 65 64 75 72 65 20 6d 75 73 74 20 72 65 74 75  cedure must retu
9d20: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 6c 79  rn non-zero only
9d30: 20 69 66 20 74 68 65 20 53 51 4c 69 74 65 20 6e   if the SQLite n
9d40: 61 74 69 76 65 0d 0a 20 20 20 20 20 20 23 20 20  ative..      #  
9d50: 20 20 20 20 20 6c 69 62 72 61 72 79 20 61 6e 64       library and
9d60: 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61   the System.Data
9d70: 2e 53 51 4c 69 74 65 20 6d 61 6e 61 67 65 64 20  .SQLite managed 
9d80: 61 73 73 65 6d 62 6c 79 20 61 72 65 20 6c 6f 61  assembly are loa
9d90: 64 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ded..      #    
9da0: 20 20 20 61 6e 64 20 72 65 61 64 79 20 66 6f 72     and ready for
9db0: 20 75 73 65 20 62 79 20 74 68 65 20 74 65 73 74   use by the test
9dc0: 20 73 75 69 74 65 2e 20 20 43 75 72 72 65 6e 74   suite.  Current
9dd0: 6c 79 2c 20 74 68 69 73 20 70 72 6f 63 65 64 75  ly, this procedu
9de0: 72 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  re..      #     
9df0: 20 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c    should be call
9e00: 65 64 20 6f 6e 6c 79 20 61 66 74 65 72 20 74 68  ed only after th
9e10: 65 20 5b 74 72 79 4c 6f 61 64 41 73 73 65 6d 62  e [tryLoadAssemb
9e20: 6c 79 5d 20 70 72 6f 63 65 64 75 72 65 20 68 61  ly] procedure ha
9e30: 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
9e40: 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20   been called to 
9e50: 70 72 6f 62 65 20 66 6f 72 20 74 68 65 20 53 79  probe for the Sy
9e60: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
9e70: 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c   managed assembl
9e80: 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
9e90: 20 61 6e 64 20 74 68 65 20 5b 63 68 65 63 6b 46   and the [checkF
9ea0: 6f 72 53 51 4c 69 74 65 5d 20 70 72 6f 63 65 64  orSQLite] proced
9eb0: 75 72 65 20 68 61 73 20 62 65 65 6e 20 63 61 6c  ure has been cal
9ec0: 6c 65 64 20 74 6f 20 70 72 6f 62 65 20 66 6f 72  led to probe for
9ed0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
9ee0: 74 68 65 20 53 51 4c 69 74 65 20 6e 61 74 69 76  the SQLite nativ
9ef0: 65 20 6c 69 62 72 61 72 79 3b 20 6f 74 68 65 72  e library; other
9f00: 77 69 73 65 2c 20 74 68 69 73 20 70 72 6f 63 65  wise, this proce
9f10: 64 75 72 65 20 77 69 6c 6c 20 73 69 6d 70 6c 79  dure will simply
9f20: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
9f30: 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20 7a 65  always return ze
9f40: 72 6f 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ro...      #..  
9f50: 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72      return [expr
9f60: 20 7b 0d 0a 20 20 20 20 20 20 20 20 5b 68 61 76   {..        [hav
9f70: 65 43 6f 6e 73 74 72 61 69 6e 74 20 53 79 73 74  eConstraint Syst
9f80: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 5d 20  em.Data.SQLite] 
9f90: 26 26 20 5b 68 61 76 65 43 6f 6e 73 74 72 61 69  && [haveConstrai
9fa0: 6e 74 20 53 51 4c 69 74 65 5d 0d 0a 20 20 20 20  nt SQLite]..    
9fb0: 20 20 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a    }]..    }.....
9fc0: 20 20 20 20 70 72 6f 63 20 6d 61 74 63 68 4d 61      proc matchMa
9fd0: 63 68 69 6e 65 20 7b 20 70 6c 61 74 66 6f 72 6d  chine { platform
9fe0: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
9ff0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 6e 20       # NOTE: An 
a000: 65 6d 70 74 79 20 73 74 72 69 6e 67 20 66 6f 72  empty string for
a010: 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 20 6d 65   the platform me
a020: 61 6e 73 20 74 68 61 74 20 74 68 65 20 62 75 69  ans that the bui
a030: 6c 64 20 69 73 20 6e 6f 74 0d 0a 20 20 20 20 20  ld is not..     
a040: 20 23 20 20 20 20 20 20 20 5b 70 72 69 6d 61 72   #       [primar
a050: 69 6c 79 5d 20 61 20 6e 61 74 69 76 65 20 62 75  ily] a native bu
a060: 69 6c 64 3b 20 74 68 65 72 65 66 6f 72 65 2c 20  ild; therefore, 
a070: 69 74 20 61 6c 77 61 79 73 20 6d 61 74 63 68 65  it always matche
a080: 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s...      #..   
a090: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
a0a0: 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d  ength $platform]
a0b0: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
a0c0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
a0d0: 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ue..      }.... 
a0e0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
a0f0: 4e 4f 54 45 3a 20 44 6f 65 73 20 74 68 65 20 73  NOTE: Does the s
a100: 70 65 63 69 66 69 65 64 20 70 6c 61 74 66 6f 72  pecified platfor
a110: 6d 20 6d 61 74 63 68 20 75 70 20 74 6f 20 74 68  m match up to th
a120: 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73  e current proces
a130: 73 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s?..      #..   
a140: 20 20 20 69 66 20 7b 24 70 6c 61 74 66 6f 72 6d     if {$platform
a150: 20 65 71 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c   eq [machineToPl
a160: 61 74 66 6f 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c  atform $::tcl_pl
a170: 61 74 66 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d  atform(machine)]
a180: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
a190: 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20    return true.. 
a1a0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
a1b0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
a1c0: 20 54 68 65 20 73 70 65 63 69 66 69 65 64 20 70   The specified p
a1d0: 6c 61 74 66 6f 72 6d 20 64 6f 65 73 20 6e 6f 74  latform does not
a1e0: 20 6d 61 74 63 68 20 75 70 20 77 69 74 68 20 74   match up with t
a1f0: 68 65 20 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20  he platform..   
a200: 20 20 20 23 20 20 20 20 20 20 20 66 6f 72 20 74     #       for t
a210: 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65  he current proce
a220: 73 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ss...      #..  
a230: 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
a240: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
a250: 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51 4c  proc checkForSQL
a260: 69 74 65 42 75 69 6c 64 73 20 7b 20 63 68 61 6e  iteBuilds { chan
a270: 6e 65 6c 20 7b 73 65 6c 65 63 74 20 66 61 6c 73  nel {select fals
a280: 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e} } {..      #.
a290: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43  .      # NOTE: C
a2a0: 68 65 63 6b 20 66 6f 72 20 65 76 65 72 79 20 70  heck for every p
a2b0: 6f 73 73 69 62 6c 65 20 76 61 6c 69 64 20 63 6f  ossible valid co
a2c0: 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 76 61 6c  mbination of val
a2d0: 75 65 73 20 75 73 65 64 20 77 68 65 6e 0d 0a 20  ues used when.. 
a2e0: 20 20 20 20 20 23 20 20 20 20 20 20 20 6c 6f 63       #       loc
a2f0: 61 74 69 6e 67 20 6f 75 74 20 74 68 65 20 62 75  ating out the bu
a300: 69 6c 64 20 6f 75 74 70 75 74 20 64 69 72 65 63  ild output direc
a310: 74 6f 72 79 2c 20 73 68 6f 77 69 6e 67 20 65 61  tory, showing ea
a320: 63 68 20 61 76 61 69 6c 61 62 6c 65 0d 0a 20 20  ch available..  
a330: 20 20 20 20 23 20 20 20 20 20 20 20 62 75 69 6c      #       buil
a340: 64 20 76 61 72 69 61 74 69 6f 6e 20 61 6c 6f 6e  d variation alon
a350: 67 20 74 68 65 20 77 61 79 2e 0d 0a 20 20 20 20  g the way...    
a360: 20 20 23 0d 0a 20 20 20 20 20 20 66 6f 72 65 61    #..      forea
a370: 63 68 20 6e 61 74 69 76 65 20 5b 6c 69 73 74 20  ch native [list 
a380: 66 61 6c 73 65 20 74 72 75 65 5d 20 7b 0d 0a 20  false true] {.. 
a390: 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 79         foreach y
a3a0: 65 61 72 20 5b 67 65 74 42 75 69 6c 64 59 65 61  ear [getBuildYea
a3b0: 72 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  rs] {..         
a3c0: 20 66 6f 72 65 61 63 68 20 63 6f 6e 66 69 67 75   foreach configu
a3d0: 72 61 74 69 6f 6e 20 5b 67 65 74 42 75 69 6c 64  ration [getBuild
a3e0: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 5d 20  Configurations] 
a3f0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  {..            #
a400: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
a410: 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f 75 74  NOTE: Figure out
a420: 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 62   the effective b
a430: 75 69 6c 64 20 70 6c 61 74 66 6f 72 6d 2e 20 20  uild platform.  
a440: 54 68 69 73 20 69 73 0d 0a 20 20 20 20 20 20 20  This is..       
a450: 20 20 20 20 20 23 20 20 20 20 20 20 20 62 61 73       #       bas
a460: 65 64 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ed on whether or
a470: 20 6e 6f 74 20 61 20 5b 70 72 69 6d 61 72 69 6c   not a [primaril
a480: 79 5d 20 6e 61 74 69 76 65 20 62 75 69 6c 64 0d  y] native build.
a490: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20  .            #  
a4a0: 20 20 20 20 20 69 73 20 62 65 69 6e 67 20 75 73       is being us
a4b0: 65 64 2e 20 20 46 6f 72 20 5b 70 72 69 6d 61 72  ed.  For [primar
a4c0: 69 6c 79 5d 20 6e 6f 6e 2d 6e 61 74 69 76 65 20  ily] non-native 
a4d0: 62 75 69 6c 64 73 2c 0d 0a 20 20 20 20 20 20 20  builds,..       
a4e0: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 69       #       thi
a4f0: 73 20 77 69 6c 6c 20 62 65 20 61 6e 20 65 6d 70  s will be an emp
a500: 74 79 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20  ty string...    
a510: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
a520: 20 20 20 20 20 20 20 73 65 74 20 70 6c 61 74 66         set platf
a530: 6f 72 6d 20 5b 67 65 74 42 75 69 6c 64 50 6c 61  orm [getBuildPla
a540: 74 66 6f 72 6d 20 24 6e 61 74 69 76 65 5d 0d 0a  tform $native]..
a550: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
a560: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
a570: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
a580: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
a590: 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53  - checking for S
a5a0: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
a5b0: 65 20 62 75 69 6c 64 20 5c 22 22 20 5b 65 78 70  e build \"" [exp
a5c0: 72 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  r \..           
a5d0: 20 20 20 20 20 7b 24 6e 61 74 69 76 65 20 3f 20       {$native ? 
a5e0: 22 6e 61 74 69 76 65 2f 22 20 3a 20 22 22 7d 5d  "native/" : ""}]
a5f0: 20 5b 65 78 70 72 20 7b 5b 73 74 72 69 6e 67 20   [expr {[string 
a600: 6c 65 6e 67 74 68 20 5c 0d 0a 20 20 20 20 20 20  length \..      
a610: 20 20 20 20 20 20 20 20 20 20 24 70 6c 61 74 66            $platf
a620: 6f 72 6d 5d 20 3e 20 30 20 3f 20 5b 61 70 70 65  orm] > 0 ? [appe
a630: 6e 64 41 72 67 73 20 24 70 6c 61 74 66 6f 72 6d  ndArgs $platform
a640: 20 2f 5d 20 3a 20 22 22 7d 5d 20 24 79 65 61 72   /] : ""}] $year
a650: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
a660: 20 20 20 20 2f 20 24 63 6f 6e 66 69 67 75 72 61      / $configura
a670: 74 69 6f 6e 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a  tion "\"... "]..
a680: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
a690: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
a6a0: 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 66  OTE: Build the f
a6b0: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 64  ully qualified d
a6c0: 69 72 65 63 74 6f 72 79 20 77 68 65 72 65 20 74  irectory where t
a6d0: 68 65 20 6e 65 63 65 73 73 61 72 79 0d 0a 20 20  he necessary..  
a6e0: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
a6f0: 20 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 66 6f 72    components for
a700: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
a710: 69 74 65 20 73 68 6f 75 6c 64 20 62 65 20 66 6f  ite should be fo
a720: 75 6e 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  und...          
a730: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
a740: 20 73 65 74 20 64 69 72 65 63 74 6f 72 79 20 5b   set directory [
a750: 6a 6f 69 6e 42 75 69 6c 64 44 69 72 65 63 74 6f  joinBuildDirecto
a760: 72 79 20 24 6e 61 74 69 76 65 20 5c 0d 0a 20 20  ry $native \..  
a770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67                [g
a780: 65 74 42 75 69 6c 64 42 61 73 65 44 69 72 65 63  etBuildBaseDirec
a790: 74 6f 72 79 5d 20 24 79 65 61 72 20 24 70 6c 61  tory] $year $pla
a7a0: 74 66 6f 72 6d 20 24 63 6f 6e 66 69 67 75 72 61  tform $configura
a7b0: 74 69 6f 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  tion]....       
a7c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
a7d0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f 20 74      # NOTE: Do t
a7e0: 68 65 20 6e 65 63 65 73 73 61 72 79 20 66 69 6c  he necessary fil
a7f0: 65 73 20 65 78 69 73 74 3f 20 20 43 75 72 72 65  es exist?  Curre
a800: 6e 74 6c 79 2c 20 6e 6f 20 6f 74 68 65 72 20 73  ntly, no other s
a810: 74 65 70 73 0d 0a 20 20 20 20 20 20 20 20 20 20  teps..          
a820: 20 20 23 20 20 20 20 20 20 20 61 72 65 20 74 61    #       are ta
a830: 6b 65 6e 20 74 6f 20 76 65 72 69 66 79 20 74 68  ken to verify th
a840: 69 73 20 62 75 69 6c 64 20 69 73 20 61 63 74 75  is build is actu
a850: 61 6c 6c 79 20 76 69 61 62 6c 65 2e 0d 0a 20 20  ally viable...  
a860: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
a870: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 73           if {[is
a880: 42 75 69 6c 64 41 76 61 69 6c 61 62 6c 65 20 24  BuildAvailable $
a890: 6e 61 74 69 76 65 20 24 64 69 72 65 63 74 6f 72  native $director
a8a0: 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  y]} then {..    
a8b0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
a8c0: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
a8d0: 45 3a 20 57 68 65 6e 20 69 6e 20 22 73 65 6c 65  E: When in "sele
a8e0: 63 74 22 20 6d 6f 64 65 2c 20 61 75 74 6f 6d 61  ct" mode, automa
a8f0: 74 69 63 61 6c 6c 79 20 73 65 6c 65 63 74 20 74  tically select t
a900: 68 65 20 66 69 72 73 74 0d 0a 20 20 20 20 20 20  he first..      
a910: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
a920: 61 76 61 69 6c 61 62 6c 65 20 62 75 69 6c 64 20  available build 
a930: 6f 66 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  of System.Data.S
a940: 51 4c 69 74 65 20 61 6e 64 20 74 68 65 6e 20 72  QLite and then r
a950: 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 20 20 20  eturn..         
a960: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6d 6d       #       imm
a970: 65 64 69 61 74 65 6c 79 2e 0d 0a 20 20 20 20 20  ediately...     
a980: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
a990: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 73            if {$s
a9a0: 65 6c 65 63 74 20 26 26 20 5b 6d 61 74 63 68 4d  elect && [matchM
a9b0: 61 63 68 69 6e 65 20 24 70 6c 61 74 66 6f 72 6d  achine $platform
a9c0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
a9d0: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
a9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
a9f0: 4e 4f 54 45 3a 20 4d 61 6e 75 61 6c 6c 79 20 6f  NOTE: Manually o
aa00: 76 65 72 72 69 64 65 20 61 6c 6c 20 74 68 65 20  verride all the 
aa10: 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20  build directory 
aa20: 73 65 6c 65 63 74 69 6f 6e 0d 0a 20 20 20 20 20  selection..     
aa30: 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
aa40: 20 20 20 72 65 6c 61 74 65 64 20 74 65 73 74 20     related test 
aa50: 73 65 74 74 69 6e 67 73 20 69 6e 20 6f 72 64 65  settings in orde
aa60: 72 20 74 6f 20 66 6f 72 63 65 20 74 68 69 73 20  r to force this 
aa70: 62 75 69 6c 64 0d 0a 20 20 20 20 20 20 20 20 20  build..         
aa80: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f         #       o
aa90: 66 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  f System.Data.SQ
aaa0: 4c 69 74 65 20 74 6f 20 62 65 20 75 73 65 64 2e  Lite to be used.
aab0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
aac0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
aad0: 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
aae0: 6b 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47  ke Interpreter.G
aaf0: 65 74 41 63 74 69 76 65 20 5b 65 78 70 72 20 7b  etActive [expr {
ab00: 24 6e 61 74 69 76 65 20 3f 20 5c 0d 0a 20 20 20  $native ? \..   
ab10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab20: 20 22 41 64 64 52 75 6e 74 69 6d 65 4f 70 74 69   "AddRuntimeOpti
ab30: 6f 6e 22 20 3a 20 22 52 65 6d 6f 76 65 52 75 6e  on" : "RemoveRun
ab40: 74 69 6d 65 4f 70 74 69 6f 6e 22 7d 5d 20 6e 61  timeOption"}] na
ab50: 74 69 76 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20  tive....        
ab60: 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65          set ::te
ab70: 73 74 5f 79 65 61 72 20 24 79 65 61 72 0d 0a 20  st_year $year.. 
ab80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
ab90: 65 74 20 3a 3a 74 65 73 74 5f 70 6c 61 74 66 6f  et ::test_platfo
aba0: 72 6d 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 20 20  rm $platform..  
abb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
abc0: 74 20 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75  t ::test_configu
abd0: 72 61 74 69 6f 6e 20 24 63 6f 6e 66 69 67 75 72  ration $configur
abe0: 61 74 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20  ation....       
abf0: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
ac00: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
ac10: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
ac20: 20 20 20 20 20 20 20 20 20 20 20 22 79 65 73 2c             "yes,
ac30: 20 73 65 6c 65 63 74 65 64 20 28 22 20 5b 65 78   selected (" [ex
ac40: 70 72 20 7b 24 6e 61 74 69 76 65 20 3f 20 22 6e  pr {$native ? "n
ac50: 61 74 69 76 65 2f 22 20 3a 20 22 22 7d 5d 20 5c  ative/" : ""}] \
ac60: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
ac70: 20 20 20 20 20 20 5b 65 78 70 72 20 7b 5b 73 74        [expr {[st
ac80: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61  ring length $pla
ac90: 74 66 6f 72 6d 5d 20 3e 20 30 20 3f 20 5b 61 70  tform] > 0 ? [ap
aca0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
acb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
acc0: 24 70 6c 61 74 66 6f 72 6d 20 2f 5d 20 3a 20 22  $platform /] : "
acd0: 22 7d 5d 20 24 79 65 61 72 20 2f 20 24 63 6f 6e  "}] $year / $con
ace0: 66 69 67 75 72 61 74 69 6f 6e 20 22 29 5c 6e 22  figuration ")\n"
acf0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
ad00: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
ad10: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
ad20: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
ad30: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
ad40: 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a  $channel yes\n..
ad50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
ad60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65  .            } e
ad70: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
ad80: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
ad90: 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20  nel no\n..      
ada0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
adb0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
adc0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
add0: 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a    return false..
ade0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
adf0: 6f 63 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74  oc checkForSQLit
ae00: 65 52 65 6c 65 61 73 65 73 20 7b 20 63 68 61 6e  eReleases { chan
ae10: 6e 65 6c 20 7b 73 65 6c 65 63 74 20 66 61 6c 73  nel {select fals
ae20: 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e} } {..      #.
ae30: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43  .      # NOTE: C
ae40: 68 65 63 6b 20 66 6f 72 20 70 61 73 74 20 72 65  heck for past re
ae50: 6c 65 61 73 65 73 20 6f 66 20 53 79 73 74 65 6d  leases of System
ae60: 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 69 6e 20  .Data.SQLite in 
ae70: 74 68 65 20 64 69 72 65 63 74 6f 72 79 0d 0a 20  the directory.. 
ae80: 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e       #       con
ae90: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 22 53  tained in the "S
aea0: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
aeb0: 65 22 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76  e" environment v
aec0: 61 72 69 61 62 6c 65 2c 20 69 66 0d 0a 20 20 20  ariable, if..   
aed0: 20 20 20 23 20 20 20 20 20 20 20 70 72 65 73 65     #       prese
aee0: 6e 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  nt...      #..  
aef0: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
af00: 69 73 74 73 20 3a 3a 65 6e 76 28 53 79 73 74 65  ists ::env(Syste
af10: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 29 5d 20  m.Data.SQLite)] 
af20: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
af30: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
af40: 3a 3a 65 6e 76 28 53 79 73 74 65 6d 2e 44 61 74  ::env(System.Dat
af50: 61 2e 53 51 4c 69 74 65 29 5d 20 3e 20 30 7d 20  a.SQLite)] > 0} 
af60: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
af70: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
af80: 45 3a 20 42 75 69 6c 64 20 74 68 65 20 66 75 6c  E: Build the ful
af90: 6c 79 20 71 75 61 6c 69 66 69 65 64 20 64 69 72  ly qualified dir
afa0: 65 63 74 6f 72 79 20 77 68 65 72 65 20 74 68 65  ectory where the
afb0: 20 6e 65 63 65 73 73 61 72 79 0d 0a 20 20 20 20   necessary..    
afc0: 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6d 70      #       comp
afd0: 6f 6e 65 6e 74 73 20 66 6f 72 20 53 79 73 74 65  onents for Syste
afe0: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 73 68  m.Data.SQLite sh
aff0: 6f 75 6c 64 20 62 65 20 66 6f 75 6e 64 2e 0d 0a  ould be found...
b000: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
b010: 20 20 20 73 65 74 20 64 69 72 65 63 74 6f 72 79     set directory
b020: 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
b030: 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a  e [file join \..
b040: 20 20 20 20 20 20 20 20 20 20 20 20 24 3a 3a 65              $::e
b050: 6e 76 28 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  nv(System.Data.S
b060: 51 4c 69 74 65 29 20 5b 67 65 74 52 65 6c 65 61  QLite) [getRelea
b070: 73 65 56 65 72 73 69 6f 6e 5d 5d 5d 0d 0a 0d 0a  seVersion]]]....
b080: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
b090: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
b0a0: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
b0b0: 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67    "---- checking
b0c0: 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61   for System.Data
b0d0: 2e 53 51 4c 69 74 65 20 72 65 6c 65 61 73 65 20  .SQLite release 
b0e0: 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
b0f0: 20 20 20 24 64 69 72 65 63 74 6f 72 79 20 22 5c     $directory "\
b100: 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20  "... "]....     
b110: 20 20 20 69 66 20 7b 5b 69 73 52 65 6c 65 61 73     if {[isReleas
b120: 65 41 76 61 69 6c 61 62 6c 65 20 24 64 69 72 65  eAvailable $dire
b130: 63 74 6f 72 79 20 70 6c 61 74 66 6f 72 6d 5d 7d  ctory platform]}
b140: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
b150: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
b160: 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d  ength $platform]
b170: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
b180: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 70             set p
b190: 6c 61 74 66 6f 72 6d 20 75 6e 6b 6e 6f 77 6e 0d  latform unknown.
b1a0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
b1b0: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 73            if {$s
b1c0: 65 6c 65 63 74 20 26 26 20 5b 6d 61 74 63 68 4d  elect && [matchM
b1d0: 61 63 68 69 6e 65 20 24 70 6c 61 74 66 6f 72 6d  achine $platform
b1e0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
b1f0: 20 20 20 20 20 20 20 73 65 74 20 3a 3a 62 75 69         set ::bui
b200: 6c 64 5f 64 69 72 65 63 74 6f 72 79 20 24 64 69  ld_directory $di
b210: 72 65 63 74 6f 72 79 0d 0a 0d 0a 20 20 20 20 20  rectory....     
b220: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
b230: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
b240: 73 20 22 79 65 73 2c 20 73 65 6c 65 63 74 65 64  s "yes, selected
b250: 20 28 22 20 24 70 6c 61 74 66 6f 72 6d 20 22 29   (" $platform ")
b260: 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  \n"]....        
b270: 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d      return true.
b280: 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
b290: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
b2a0: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
b2b0: 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73  [appendArgs "yes
b2c0: 20 28 22 20 24 70 6c 61 74 66 6f 72 6d 20 22 29   (" $platform ")
b2d0: 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
b2e0: 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  }..        } els
b2f0: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  e {..          t
b300: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
b310: 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  \n....          
b320: 66 6f 72 65 61 63 68 20 70 61 74 68 20 5b 6c 73  foreach path [ls
b330: 6f 72 74 20 2d 64 65 63 72 65 61 73 69 6e 67 20  ort -decreasing 
b340: 5b 66 69 6c 65 20 6c 69 73 74 20 24 64 69 72 65  [file list $dire
b350: 63 74 6f 72 79 20 2a 5d 5d 20 7b 0d 0a 20 20 20  ctory *]] {..   
b360: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69           if {[fi
b370: 6c 65 20 65 78 69 73 74 73 20 24 70 61 74 68 5d  le exists $path]
b380: 20 26 26 20 5b 66 69 6c 65 20 69 73 64 69 72 65   && [file isdire
b390: 63 74 6f 72 79 20 24 70 61 74 68 5d 7d 20 74 68  ctory $path]} th
b3a0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
b3b0: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
b3c0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
b3d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
b3e0: 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69      "---- checki
b3f0: 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61  ng for System.Da
b400: 74 61 2e 53 51 4c 69 74 65 20 72 65 6c 65 61 73  ta.SQLite releas
b410: 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  e \"" \..       
b420: 20 20 20 20 20 20 20 20 20 20 20 24 70 61 74 68             $path
b430: 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20   "\"... "]....  
b440: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
b450: 5b 69 73 52 65 6c 65 61 73 65 41 76 61 69 6c 61  [isReleaseAvaila
b460: 62 6c 65 20 24 70 61 74 68 20 70 6c 61 74 66 6f  ble $path platfo
b470: 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  rm]} then {..   
b480: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
b490: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
b4a0: 24 70 6c 61 74 66 6f 72 6d 5d 20 3d 3d 20 30 7d  $platform] == 0}
b4b0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
b4c0: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 70             set p
b4d0: 6c 61 74 66 6f 72 6d 20 75 6e 6b 6e 6f 77 6e 0d  latform unknown.
b4e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b4f0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
b500: 20 20 20 20 20 20 69 66 20 7b 24 73 65 6c 65 63        if {$selec
b510: 74 20 26 26 20 5b 6d 61 74 63 68 4d 61 63 68 69  t && [matchMachi
b520: 6e 65 20 24 70 6c 61 74 66 6f 72 6d 5d 7d 20 74  ne $platform]} t
b530: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
b540: 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 62           set ::b
b550: 75 69 6c 64 5f 64 69 72 65 63 74 6f 72 79 20 24  uild_directory $
b560: 70 61 74 68 0d 0a 0d 0a 20 20 20 20 20 20 20 20  path....        
b570: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
b580: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
b590: 41 72 67 73 20 22 79 65 73 2c 20 73 65 6c 65 63  Args "yes, selec
b5a0: 74 65 64 20 28 22 20 24 70 6c 61 74 66 6f 72 6d  ted (" $platform
b5b0: 20 22 29 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20   ")\n"]....     
b5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
b5d0: 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
b5e0: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
b5f0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
b600: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
b610: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
b620: 20 22 79 65 73 20 28 22 20 24 70 6c 61 74 66 6f   "yes (" $platfo
b630: 72 6d 20 22 29 5c 6e 22 5d 0d 0a 20 20 20 20 20  rm ")\n"]..     
b640: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
b650: 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
b660: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
b670: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
b680: 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20  nnel no\n..     
b690: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
b6a0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
b6b0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
b6c0: 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  }..      } else 
b6d0: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
b6e0: 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
b6f0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
b700: 20 20 20 20 20 22 2d 2d 2d 2d 20 65 6e 76 69 72       "---- envir
b710: 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20  onment variable 
b720: 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  \"System.Data.SQ
b730: 4c 69 74 65 5c 22 20 69 73 20 6e 6f 74 20 22 20  Lite\" is not " 
b740: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
b750: 73 65 74 2c 20 73 6b 69 70 70 69 6e 67 20 63 68  set, skipping ch
b760: 65 63 6b 20 66 6f 72 20 72 65 6c 65 61 73 65 73  eck for releases
b770: 2e 2e 2e 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d  ...\n"]..      }
b780: 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ....      return
b790: 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c   false..    }...
b7a0: 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b  ..    proc check
b7b0: 46 6f 72 53 51 4c 69 74 65 4c 69 62 72 61 72 79  ForSQLiteLibrary
b7c0: 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a   { channel } {..
b7d0: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
b7e0: 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b  nnel "---- check
b7f0: 69 6e 67 20 66 6f 72 20 53 51 4c 69 74 65 20 63  ing for SQLite c
b800: 6f 72 65 20 6c 69 62 72 61 72 79 2e 2e 2e 20 22  ore library... "
b810: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63  ....      if {[c
b820: 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
b830: 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
b840: 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
b850: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  \..            S
b860: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
b870: 65 2e 53 51 4c 69 74 65 33 20 53 51 4c 69 74 65  e.SQLite3 SQLite
b880: 56 65 72 73 69 6f 6e 0d 0a 20 20 20 20 20 20 7d  Version..      }
b890: 20 76 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20   version] == 0} 
b8a0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
b8b0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
b8c0: 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  E: Check if the 
b8d0: 72 65 74 75 72 6e 65 64 20 76 65 72 73 69 6f 6e  returned version
b8e0: 20 77 61 73 20 6e 75 6c 6c 2e 20 20 49 66 20 73   was null.  If s
b8f0: 6f 2c 20 6d 61 6b 65 20 69 74 20 65 61 73 79 0d  o, make it easy.
b900: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
b910: 20 74 6f 20 73 70 6f 74 2e 0d 0a 20 20 20 20 20   to spot...     
b920: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
b930: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
b940: 20 24 76 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d   $version] == 0}
b950: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
b960: 20 20 20 73 65 74 20 76 65 72 73 69 6f 6e 20 6e     set version n
b970: 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ull..        }..
b980: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
b990: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74       # NOTE: Att
b9a0: 65 6d 70 74 20 74 6f 20 71 75 65 72 79 20 74 68  empt to query th
b9b0: 65 20 46 6f 73 73 69 6c 20 73 6f 75 72 63 65 20  e Fossil source 
b9c0: 69 64 65 6e 74 69 66 69 65 72 20 66 6f 72 20 74  identifier for t
b9d0: 68 65 20 53 51 4c 69 74 65 0d 0a 20 20 20 20 20  he SQLite..     
b9e0: 20 20 20 23 20 20 20 20 20 20 20 63 6f 72 65 20     #       core 
b9f0: 6c 69 62 72 61 72 79 2e 0d 0a 20 20 20 20 20 20  library...      
ba00: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
ba10: 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
ba20: 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
ba30: 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
ba40: 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
ba50: 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
ba60: 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33  a.SQLite.SQLite3
ba70: 20 53 51 4c 69 74 65 53 6f 75 72 63 65 49 64 0d   SQLiteSourceId.
ba80: 0a 20 20 20 20 20 20 20 20 7d 20 73 6f 75 72 63  .        } sourc
ba90: 65 49 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  eId]} then {..  
baa0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
bab0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20       # NOTE: We 
bac0: 66 61 69 6c 65 64 20 74 6f 20 71 75 65 72 79 20  failed to query 
bad0: 74 68 65 20 46 6f 73 73 69 6c 20 73 6f 75 72 63  the Fossil sourc
bae0: 65 20 69 64 65 6e 74 69 66 69 65 72 2e 0d 0a 20  e identifier... 
baf0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
bb00: 20 20 20 20 20 20 73 65 74 20 73 6f 75 72 63 65        set source
bb10: 49 64 20 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20  Id unknown..    
bb20: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
bb30: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
bb40: 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65  TE: Check if the
bb50: 20 72 65 74 75 72 6e 65 64 20 46 6f 73 73 69 6c   returned Fossil
bb60: 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69 66 69   source identifi
bb70: 65 72 20 77 61 73 20 6e 75 6c 6c 2e 20 20 49 66  er was null.  If
bb80: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
bb90: 20 20 73 6f 2c 20 6d 61 6b 65 20 69 74 20 65 61    so, make it ea
bba0: 73 79 20 74 6f 20 73 70 6f 74 2e 0d 0a 20 20 20  sy to spot...   
bbb0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
bbc0: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
bbd0: 74 68 20 24 73 6f 75 72 63 65 49 64 5d 20 3d 3d  th $sourceId] ==
bbe0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
bbf0: 20 20 20 20 20 20 73 65 74 20 73 6f 75 72 63 65        set source
bc00: 49 64 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20  Id null..       
bc10: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
bc20: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
bc30: 20 59 65 73 2c 20 74 68 65 20 53 51 4c 69 74 65   Yes, the SQLite
bc40: 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20 61 70   core library ap
bc50: 70 65 61 72 73 20 74 6f 20 62 65 20 61 76 61 69  pears to be avai
bc60: 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  lable...        
bc70: 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  #..        addCo
bc80: 6e 73 74 72 61 69 6e 74 20 53 51 4c 69 74 65 0d  nstraint SQLite.
bc90: 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  ...        tputs
bca0: 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
bcb0: 64 41 72 67 73 20 22 79 65 73 20 28 22 20 24 76  dArgs "yes (" $v
bcc0: 65 72 73 69 6f 6e 20 22 20 22 20 24 73 6f 75 72  ersion " " $sour
bcd0: 63 65 49 64 20 22 29 5c 6e 22 5d 0d 0a 20 20 20  ceId ")\n"]..   
bce0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
bcf0: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
bd00: 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20  nel no\n..      
bd10: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
bd20: 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51   proc checkForSQ
bd30: 4c 69 74 65 49 6e 74 65 72 6f 70 20 7b 20 63 68  LiteInterop { ch
bd40: 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20  annel } {..     
bd50: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
bd60: 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
bd70: 6f 72 20 53 51 4c 69 74 65 20 69 6e 74 65 72 6f  or SQLite intero
bd80: 70 20 61 73 73 65 6d 62 6c 79 2e 2e 2e 20 22 0d  p assembly... ".
bd90: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  ...      if {[ca
bda0: 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f  tch {..        o
bdb0: 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
bdc0: 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
bdd0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79  ..            Sy
bde0: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
bdf0: 2e 53 51 4c 69 74 65 33 20 49 6e 74 65 72 6f 70  .SQLite3 Interop
be00: 56 65 72 73 69 6f 6e 0d 0a 20 20 20 20 20 20 7d  Version..      }
be10: 20 76 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20   version] == 0} 
be20: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
be30: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
be40: 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  E: Check if the 
be50: 72 65 74 75 72 6e 65 64 20 76 65 72 73 69 6f 6e  returned version
be60: 20 77 61 73 20 6e 75 6c 6c 2e 20 20 49 66 20 73   was null.  If s
be70: 6f 2c 20 6d 61 6b 65 20 69 74 20 65 61 73 79 0d  o, make it easy.
be80: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
be90: 20 74 6f 20 73 70 6f 74 2e 0d 0a 20 20 20 20 20   to spot...     
bea0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
beb0: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
bec0: 20 24 76 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d   $version] == 0}
bed0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
bee0: 20 20 20 73 65 74 20 76 65 72 73 69 6f 6e 20 6e     set version n
bef0: 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ull..        }..
bf00: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
bf10: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74       # NOTE: Att
bf20: 65 6d 70 74 20 74 6f 20 71 75 65 72 79 20 74 68  empt to query th
bf30: 65 20 46 6f 73 73 69 6c 20 73 6f 75 72 63 65 20  e Fossil source 
bf40: 69 64 65 6e 74 69 66 69 65 72 20 66 6f 72 20 74  identifier for t
bf50: 68 65 20 53 51 4c 69 74 65 0d 0a 20 20 20 20 20  he SQLite..     
bf60: 20 20 20 23 20 20 20 20 20 20 20 63 6f 72 65 20     #       core 
bf70: 6c 69 62 72 61 72 79 2e 0d 0a 20 20 20 20 20 20  library...      
bf80: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
bf90: 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
bfa0: 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
bfb0: 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
bfc0: 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
bfd0: 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
bfe0: 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33  a.SQLite.SQLite3
bff0: 20 49 6e 74 65 72 6f 70 53 6f 75 72 63 65 49 64   InteropSourceId
c000: 0d 0a 20 20 20 20 20 20 20 20 7d 20 73 6f 75 72  ..        } sour
c010: 63 65 49 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ceId]} then {.. 
c020: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
c030: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65        # NOTE: We
c040: 20 66 61 69 6c 65 64 20 74 6f 20 71 75 65 72 79   failed to query
c050: 20 74 68 65 20 46 6f 73 73 69 6c 20 73 6f 75 72   the Fossil sour
c060: 63 65 20 69 64 65 6e 74 69 66 69 65 72 2e 0d 0a  ce identifier...
c070: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
c080: 20 20 20 20 20 20 20 73 65 74 20 73 6f 75 72 63         set sourc
c090: 65 49 64 20 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20  eId unknown..   
c0a0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
c0b0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
c0c0: 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68  OTE: Check if th
c0d0: 65 20 72 65 74 75 72 6e 65 64 20 46 6f 73 73 69  e returned Fossi
c0e0: 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69 66  l source identif
c0f0: 69 65 72 20 77 61 73 20 6e 75 6c 6c 2e 20 20 49  ier was null.  I
c100: 66 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  f..        #    
c110: 20 20 20 73 6f 2c 20 6d 61 6b 65 20 69 74 20 65     so, make it e
c120: 61 73 79 20 74 6f 20 73 70 6f 74 2e 0d 0a 20 20  asy to spot...  
c130: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
c140: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
c150: 67 74 68 20 24 73 6f 75 72 63 65 49 64 5d 20 3d  gth $sourceId] =
c160: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
c170: 20 20 20 20 20 20 20 73 65 74 20 73 6f 75 72 63         set sourc
c180: 65 49 64 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20  eId null..      
c190: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
c1a0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
c1b0: 3a 20 59 65 73 2c 20 74 68 65 20 53 51 4c 69 74  : Yes, the SQLit
c1c0: 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62  e interop assemb
c1d0: 6c 79 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  ly appears to be
c1e0: 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20   available...   
c1f0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
c200: 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 53 51  addConstraint SQ
c210: 4c 69 74 65 49 6e 74 65 72 6f 70 0d 0a 0d 0a 20  LiteInterop.... 
c220: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
c230: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
c240: 73 20 22 79 65 73 20 28 22 20 24 76 65 72 73 69  s "yes (" $versi
c250: 6f 6e 20 22 20 22 20 24 73 6f 75 72 63 65 49 64  on " " $sourceId
c260: 20 22 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d   ")\n"]..      }
c270: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
c280: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
c290: 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  no\n..      }.. 
c2a0: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
c2b0: 63 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65  c checkForSQLite
c2c0: 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 7b  DefineConstant {
c2d0: 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 20 7d 20   channel name } 
c2e0: 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24  {..      tputs $
c2f0: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
c300: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
c310: 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20   "---- checking 
c320: 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  for System.Data.
c330: 53 51 4c 69 74 65 20 64 65 66 69 6e 65 20 63 6f  SQLite define co
c340: 6e 73 74 61 6e 74 20 5c 22 22 20 24 6e 61 6d 65  nstant \"" $name
c350: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 22 5c   \..          "\
c360: 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20  "... "]....     
c370: 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
c380: 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
c390: 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
c3a0: 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
c3b0: 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
c3c0: 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33  a.SQLite.SQLite3
c3d0: 20 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73   DefineConstants
c3e0: 0d 0a 20 20 20 20 20 20 7d 20 64 65 66 69 6e 65  ..      } define
c3f0: 43 6f 6e 73 74 61 6e 74 73 5d 20 3d 3d 20 30 7d  Constants] == 0}
c400: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
c410: 20 69 66 20 7b 5b 6c 73 65 61 72 63 68 20 2d 65   if {[lsearch -e
c420: 78 61 63 74 20 2d 6e 6f 63 61 73 65 20 24 64 65  xact -nocase $de
c430: 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73 20 24 6e  fineConstants $n
c440: 61 6d 65 5d 20 21 3d 20 2d 31 7d 20 74 68 65 6e  ame] != -1} then
c450: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
c460: 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
c470: 45 3a 20 59 65 73 2c 20 74 68 69 73 20 64 65 66  E: Yes, this def
c480: 69 6e 65 20 63 6f 6e 73 74 61 6e 74 20 77 61 73  ine constant was
c490: 20 65 6e 61 62 6c 65 64 20 77 68 65 6e 20 74 68   enabled when th
c4a0: 65 20 6d 61 6e 61 67 65 64 0d 0a 20 20 20 20 20  e managed..     
c4b0: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 73 73       #       ass
c4c0: 65 6d 62 6c 79 20 77 61 73 20 63 6f 6d 70 69 6c  embly was compil
c4d0: 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ed...          #
c4e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 43  ..          addC
c4f0: 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
c500: 64 41 72 67 73 20 64 65 66 69 6e 65 43 6f 6e 73  dArgs defineCons
c510: 74 61 6e 74 2e 53 79 73 74 65 6d 2e 44 61 74 61  tant.System.Data
c520: 2e 53 51 4c 69 74 65 2e 20 24 6e 61 6d 65 5d 0d  .SQLite. $name].
c530: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  ...          tpu
c540: 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c  ts $channel yes\
c550: 6e 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  n..        } els
c560: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  e {..          t
c570: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
c580: 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  \n..        }.. 
c590: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
c5a0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
c5b0: 61 6e 6e 65 6c 20 65 72 72 6f 72 5c 6e 0d 0a 20  annel error\n.. 
c5c0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
c5d0: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 44 61  ..    proc getDa
c5e0: 74 65 54 69 6d 65 46 6f 72 6d 61 74 20 7b 7d 20  teTimeFormat {} 
c5f0: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
c600: 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70    # NOTE: This p
c610: 72 6f 63 65 64 75 72 65 20 73 69 6d 70 6c 79 20  rocedure simply 
c620: 72 65 74 75 72 6e 73 20 74 68 65 20 22 64 65 66  returns the "def
c630: 61 75 6c 74 22 20 44 61 74 65 54 69 6d 65 20 66  ault" DateTime f
c640: 6f 72 6d 61 74 20 75 73 65 64 0d 0a 20 20 20 20  ormat used..    
c650: 20 20 23 20 20 20 20 20 20 20 62 79 20 74 68 65    #       by the
c660: 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20   test suite...  
c670: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
c680: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
c690: 64 61 74 65 74 69 6d 65 5f 66 6f 72 6d 61 74 5d  datetime_format]
c6a0: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
c6b0: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
c6c0: 24 3a 3a 64 61 74 65 74 69 6d 65 5f 66 6f 72 6d  $::datetime_form
c6d0: 61 74 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  at] > 0} then {.
c6e0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
c6f0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75      # NOTE: Retu
c700: 72 6e 20 74 68 65 20 6d 61 6e 75 61 6c 6c 79 20  rn the manually 
c710: 6f 76 65 72 72 69 64 64 65 6e 20 76 61 6c 75 65  overridden value
c720: 20 66 6f 72 20 74 68 65 20 44 61 74 65 54 69 6d   for the DateTim
c730: 65 20 66 6f 72 6d 61 74 2e 0d 0a 20 20 20 20 20  e format...     
c740: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
c750: 74 75 72 6e 20 24 3a 3a 64 61 74 65 74 69 6d 65  turn $::datetime
c760: 5f 66 6f 72 6d 61 74 0d 0a 20 20 20 20 20 20 7d  _format..      }
c770: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
c780: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
c790: 54 45 3a 20 52 65 74 75 72 6e 20 61 6e 20 49 53  TE: Return an IS
c7a0: 4f 38 36 30 31 20 44 61 74 65 54 69 6d 65 20 66  O8601 DateTime f
c7b0: 6f 72 6d 61 74 20 63 6f 6d 70 61 74 69 62 6c 65  ormat compatible
c7c0: 20 77 69 74 68 20 53 51 4c 69 74 65 2c 0d 0a 20   with SQLite,.. 
c7d0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 53         #       S
c7e0: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
c7f0: 65 2c 20 61 6e 64 20 73 75 69 74 61 62 6c 65 20  e, and suitable 
c800: 66 6f 72 20 72 6f 75 6e 64 2d 74 72 69 70 70 69  for round-trippi
c810: 6e 67 20 77 69 74 68 20 74 68 65 0d 0a 20 20 20  ng with the..   
c820: 20 20 20 20 20 23 20 20 20 20 20 20 20 44 61 74       #       Dat
c830: 65 54 69 6d 65 20 63 6c 61 73 73 20 6f 66 20 74  eTime class of t
c840: 68 65 20 66 72 61 6d 65 77 6f 72 6b 2e 20 20 49  he framework.  I
c850: 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20  f this value is 
c860: 63 68 61 6e 67 65 64 2c 0d 0a 20 20 20 20 20 20  changed,..      
c870: 20 20 23 20 20 20 20 20 20 20 76 61 72 69 6f 75    #       variou
c880: 73 20 74 65 73 74 73 20 6d 61 79 20 66 61 69 6c  s tests may fail
c890: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
c8a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 79 79        return "yy
c8b0: 79 79 2d 4d 4d 2d 64 64 20 48 48 3a 6d 6d 3a 73  yy-MM-dd HH:mm:s
c8c0: 73 2e 46 46 46 46 46 46 46 4b 22 0d 0a 20 20 20  s.FFFFFFFK"..   
c8d0: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
c8e0: 20 20 20 20 70 72 6f 63 20 65 6e 75 6d 65 72 61      proc enumera
c8f0: 62 6c 65 54 6f 4c 69 73 74 20 7b 20 65 6e 75 6d  bleToList { enum
c900: 65 72 61 62 6c 65 20 7d 20 7b 0d 0a 20 20 20 20  erable } {..    
c910: 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 6c 69    set result [li
c920: 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  st]....      if 
c930: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
c940: 24 65 6e 75 6d 65 72 61 62 6c 65 5d 20 3d 3d 20  $enumerable] == 
c950: 30 20 7c 7c 20 24 65 6e 75 6d 65 72 61 62 6c 65  0 || $enumerable
c960: 20 65 71 20 22 6e 75 6c 6c 22 7d 20 74 68 65 6e   eq "null"} then
c970: 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
c980: 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20  rn $result..    
c990: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 6f 62 6a    }....      obj
c9a0: 65 63 74 20 66 6f 72 65 61 63 68 20 2d 61 6c 69  ect foreach -ali
c9b0: 61 73 20 69 74 65 6d 20 24 65 6e 75 6d 65 72 61  as item $enumera
c9c0: 62 6c 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  ble {..        i
c9d0: 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
c9e0: 68 20 24 69 74 65 6d 5d 20 3e 20 30 7d 20 74 68  h $item] > 0} th
c9f0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
ca00: 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 5b  lappend result [
ca10: 24 69 74 65 6d 20 54 6f 53 74 72 69 6e 67 5d 0d  $item ToString].
ca20: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
ca30: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74    }....      ret
ca40: 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20  urn $result..   
ca50: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
ca60: 63 61 74 63 68 41 6e 64 52 65 74 75 72 6e 20 7b  catchAndReturn {
ca70: 20 73 63 72 69 70 74 20 7b 73 74 61 63 6b 54 72   script {stackTr
ca80: 61 63 65 20 66 61 6c 73 65 7d 20 7b 73 74 72 69  ace false} {stri
ca90: 63 74 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20  ct true} } {..  
caa0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
cab0: 4f 54 45 3a 20 45 76 61 6c 75 61 74 65 20 74 68  OTE: Evaluate th
cac0: 65 20 73 63 72 69 70 74 20 70 72 6f 76 69 64 65  e script provide
cad0: 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 20  d by our caller 
cae0: 69 6e 20 74 68 65 69 72 20 63 6f 6e 74 65 78 74  in their context
caf0: 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  ,..      #      
cb00: 20 63 61 70 74 75 72 69 6e 67 20 62 6f 74 68 20   capturing both 
cb10: 74 68 65 20 72 65 73 75 6c 74 20 61 6e 64 20 74  the result and t
cb20: 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 0d  he return code..
cb30: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
cb40: 73 65 74 20 63 6f 64 65 20 5b 63 61 74 63 68 20  set code [catch 
cb50: 7b 75 70 6c 65 76 65 6c 20 31 20 24 73 63 72 69  {uplevel 1 $scri
cb60: 70 74 7d 20 72 65 73 75 6c 74 5d 0d 0a 0d 0a 20  pt} result].... 
cb70: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
cb80: 4e 4f 54 45 3a 20 44 69 64 20 74 68 65 20 73 63  NOTE: Did the sc
cb90: 72 69 70 74 20 70 72 6f 76 69 64 65 64 20 62 79  ript provided by
cba0: 20 6f 75 72 20 63 61 6c 6c 65 72 20 4e 4f 54 20   our caller NOT 
cbb0: 72 61 69 73 65 20 61 6e 20 65 72 72 6f 72 3f 0d  raise an error?.
cbc0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
cbd0: 69 66 20 7b 24 73 74 72 69 63 74 20 26 26 20 24  if {$strict && $
cbe0: 63 6f 64 65 20 3d 3d 20 30 20 7c 7c 20 21 24 73  code == 0 || !$s
cbf0: 74 72 69 63 74 20 26 26 20 24 63 6f 64 65 20 21  trict && $code !
cc00: 3d 20 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 1} then {..   
cc10: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
cc20: 23 20 4e 4f 54 45 3a 20 53 75 63 63 65 73 73 2e  # NOTE: Success.
cc30: 20 20 52 65 74 75 72 6e 20 61 20 6c 69 73 74 20    Return a list 
cc40: 77 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 20  with the return 
cc50: 63 6f 64 65 20 61 6e 64 20 74 68 65 20 72 65 73  code and the res
cc60: 75 6c 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ult...        #.
cc70: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
cc80: 5b 6c 69 73 74 20 24 63 6f 64 65 20 24 72 65 73  [list $code $res
cc90: 75 6c 74 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  ult]..      } el
cca0: 73 65 69 66 20 7b 24 73 74 61 63 6b 54 72 61 63  seif {$stackTrac
ccb0: 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
ccc0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
ccd0: 4e 4f 54 45 3a 20 46 61 69 6c 75 72 65 2e 20 20  NOTE: Failure.  
cce0: 4f 75 72 20 63 61 6c 6c 65 72 20 77 61 6e 74 73  Our caller wants
ccf0: 20 61 20 66 75 6c 6c 20 73 74 61 63 6b 20 74 72   a full stack tr
cd00: 61 63 65 20 28 69 66 20 61 70 70 6c 69 63 61 62  ace (if applicab
cd10: 6c 65 29 2c 0d 0a 20 20 20 20 20 20 20 20 23 20  le),..        # 
cd20: 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 20 6c        return a l
cd30: 69 73 74 20 77 69 74 68 20 74 68 65 20 72 65 74  ist with the ret
cd40: 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 74 68 65  urn code and the
cd50: 20 72 65 73 75 6c 74 20 76 65 72 62 61 74 69 6d   result verbatim
cd60: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
cd70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69        return [li
cd80: 73 74 20 24 63 6f 64 65 20 24 72 65 73 75 6c 74  st $code $result
cd90: 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
cda0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
cdb0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61        # NOTE: Fa
cdc0: 69 6c 75 72 65 2e 20 20 4f 75 72 20 63 61 6c 6c  ilure.  Our call
cdd0: 65 72 20 64 6f 65 73 20 6e 6f 74 20 77 61 6e 74  er does not want
cde0: 20 61 20 66 75 6c 6c 20 73 74 61 63 6b 20 74 72   a full stack tr
cdf0: 61 63 65 20 28 69 66 0d 0a 20 20 20 20 20 20 20  ace (if..       
ce00: 20 23 20 20 20 20 20 20 20 61 70 70 6c 69 63 61   #       applica
ce10: 62 6c 65 29 2c 20 72 65 74 75 72 6e 20 61 20 6c  ble), return a l
ce20: 69 73 74 20 77 69 74 68 20 74 68 65 20 72 65 74  ist with the ret
ce30: 75 72 6e 20 63 6f 64 65 2c 20 74 68 65 20 65 72  urn code, the er
ce40: 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ror..        #  
ce50: 20 20 20 20 20 63 6f 64 65 20 66 6f 72 20 74 68       code for th
ce60: 65 20 69 6e 74 65 72 70 72 65 74 65 72 2c 20 61  e interpreter, a
ce70: 6e 64 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  nd the error mes
ce80: 73 61 67 65 20 75 70 20 74 6f 20 74 68 65 0d 0a  sage up to the..
ce90: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
cea0: 70 6f 69 6e 74 20 77 68 65 72 65 20 74 68 65 20  point where the 
ceb0: 73 74 61 63 6b 20 74 72 61 63 65 20 73 68 6f 75  stack trace shou
cec0: 6c 64 20 73 74 61 72 74 2e 0d 0a 20 20 20 20 20  ld start...     
ced0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65     #..        se
cee0: 74 20 69 6e 64 65 78 20 5b 73 74 72 69 6e 67 20  t index [string 
cef0: 66 69 72 73 74 20 22 20 20 20 61 74 20 22 20 24  first "   at " $
cf00: 72 65 73 75 6c 74 5d 3b 20 23 20 48 41 43 4b 3a  result]; # HACK:
cf10: 20 52 65 6c 69 61 62 6c 65 3f 0d 0a 0d 0a 20 20   Reliable?....  
cf20: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69        return [li
cf30: 73 74 20 24 63 6f 64 65 20 24 3a 3a 65 72 72 6f  st $code $::erro
cf40: 72 43 6f 64 65 20 5b 65 78 70 72 20 7b 24 69 6e  rCode [expr {$in
cf50: 64 65 78 20 21 3d 20 2d 31 20 3f 20 5c 0d 0a 20  dex != -1 ? \.. 
cf60: 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69             [stri
cf70: 6e 67 20 74 72 69 6d 20 5b 73 74 72 69 6e 67 20  ng trim [string 
cf80: 72 61 6e 67 65 20 24 72 65 73 75 6c 74 20 30 20  range $result 0 
cf90: 24 69 6e 64 65 78 5d 5d 20 3a 20 24 72 65 73 75  $index]] : $resu
cfa0: 6c 74 7d 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  lt}]]..      }..
cfb0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
cfc0: 6f 63 20 63 6f 6d 70 69 6c 65 43 53 68 61 72 70  oc compileCSharp
cfd0: 57 69 74 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  With {..        
cfe0: 20 20 20 20 74 65 78 74 20 6d 65 6d 6f 72 79 20      text memory 
cff0: 73 79 6d 62 6f 6c 73 20 73 74 72 69 63 74 20 72  symbols strict r
d000: 65 73 75 6c 74 73 56 61 72 4e 61 6d 65 20 65 72  esultsVarName er
d010: 72 6f 72 73 56 61 72 4e 61 6d 65 20 66 69 6c 65  rorsVarName file
d020: 4e 61 6d 65 73 0d 0a 20 20 20 20 20 20 20 20 20  Names..         
d030: 20 20 20 61 72 67 73 20 7d 20 7b 0d 0a 20 20 20     args } {..   
d040: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
d050: 54 45 3a 20 53 69 6e 63 65 20 77 65 20 61 72 65  TE: Since we are
d060: 20 67 6f 69 6e 67 20 74 6f 20 75 73 65 20 74 68   going to use th
d070: 69 73 20 6d 65 74 68 6f 64 20 6e 61 6d 65 20 61  is method name a
d080: 20 6c 6f 74 2c 20 61 73 73 69 67 6e 20 69 74 20   lot, assign it 
d090: 74 6f 20 61 0d 0a 20 20 20 20 20 20 23 20 20 20  to a..      #   
d0a0: 20 20 20 20 76 61 72 69 61 62 6c 65 20 66 69 72      variable fir
d0b0: 73 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  st...      #..  
d0c0: 20 20 20 20 73 65 74 20 61 64 64 20 52 65 66 65      set add Refe
d0d0: 72 65 6e 63 65 64 41 73 73 65 6d 62 6c 69 65 73  rencedAssemblies
d0e0: 2e 41 64 64 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  .Add....      #.
d0f0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43  .      # NOTE: C
d100: 72 65 61 74 65 20 74 68 65 20 62 61 73 65 20 63  reate the base c
d110: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 75 61  ommand to evalua
d120: 74 65 20 61 6e 64 20 61 64 64 20 74 68 65 20 70  te and add the p
d130: 72 6f 70 65 72 74 79 20 73 65 74 74 69 6e 67 73  roperty settings
d140: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
d150: 74 68 61 74 20 61 72 65 20 61 6c 6d 6f 73 74 20  that are almost 
d160: 61 6c 77 61 79 73 20 6e 65 65 64 65 64 20 62 79  always needed by
d170: 20 6f 75 72 20 75 6e 69 74 20 74 65 73 74 73 20   our unit tests 
d180: 28 69 2e 65 2e 20 74 68 65 20 53 79 73 74 65 6d  (i.e. the System
d190: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
d1a0: 61 6e 64 20 53 79 73 74 65 6d 2e 44 61 74 61 20  and System.Data 
d1b0: 61 73 73 65 6d 62 6c 79 20 72 65 66 65 72 65 6e  assembly referen
d1c0: 63 65 73 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ces)...      #..
d1d0: 20 20 20 20 20 20 73 65 74 20 63 6f 6d 6d 61 6e        set comman
d1e0: 64 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20  d [list \..     
d1f0: 20 20 20 20 20 63 6f 6d 70 69 6c 65 43 53 68 61       compileCSha
d200: 72 70 20 24 74 65 78 74 20 24 6d 65 6d 6f 72 79  rp $text $memory
d210: 20 24 73 79 6d 62 6f 6c 73 20 24 73 74 72 69 63   $symbols $stric
d220: 74 20 72 65 73 75 6c 74 73 20 65 72 72 6f 72 73  t results errors
d230: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 24 61   \..          $a
d240: 64 64 20 53 79 73 74 65 6d 2e 64 6c 6c 20 24 61  dd System.dll $a
d250: 64 64 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 64  dd System.Data.d
d260: 6c 6c 20 24 61 64 64 20 53 79 73 74 65 6d 2e 54  ll $add System.T
d270: 72 61 6e 73 61 63 74 69 6f 6e 73 2e 64 6c 6c 20  ransactions.dll 
d280: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 24 61 64  \..          $ad
d290: 64 20 53 79 73 74 65 6d 2e 58 6d 6c 2e 64 6c 6c  d System.Xml.dll
d2a0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ]....      #..  
d2b0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20      # NOTE: Add 
d2c0: 61 6c 6c 20 74 68 65 20 70 72 6f 76 69 64 65 64  all the provided
d2d0: 20 66 69 6c 65 20 6e 61 6d 65 73 20 61 73 20 61   file names as a
d2e0: 73 73 65 6d 62 6c 79 20 72 65 66 65 72 65 6e 63  ssembly referenc
d2f0: 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  es...      #..  
d300: 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
d310: 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 73 20  Name $fileNames 
d320: 7b 0d 0a 20 20 20 20 20 20 20 20 6c 61 70 70 65  {..        lappe
d330: 6e 64 20 63 6f 6d 6d 61 6e 64 20 24 61 64 64 20  nd command $add 
d340: 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61  [getBinaryFileNa
d350: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20  me $fileName].. 
d360: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
d370: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
d380: 20 41 64 64 20 74 68 65 20 65 78 74 72 61 20 61   Add the extra a
d390: 72 67 75 6d 65 6e 74 73 2c 20 69 66 20 61 6e 79  rguments, if any
d3a0: 2c 20 74 6f 20 74 68 65 20 63 6f 6d 6d 61 6e 64  , to the command
d3b0: 20 74 6f 20 65 76 61 6c 75 61 74 65 2e 0d 0a 20   to evaluate... 
d3c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 65 76       #..      ev
d3d0: 61 6c 20 6c 61 70 70 65 6e 64 20 63 6f 6d 6d 61  al lappend comma
d3e0: 6e 64 20 24 61 72 67 73 0d 0a 0d 0a 20 20 20 20  nd $args....    
d3f0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
d400: 45 3a 20 41 6c 69 61 73 20 74 68 65 20 63 6f 6d  E: Alias the com
d410: 70 69 6c 65 72 20 6c 6f 63 61 6c 20 72 65 73 75  piler local resu
d420: 6c 74 73 20 61 6e 64 20 65 72 72 6f 72 73 20 76  lts and errors v
d430: 61 72 69 61 62 6c 65 73 20 74 6f 20 74 68 65 0d  ariables to the.
d440: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76  .      #       v
d450: 61 72 69 61 62 6c 65 20 6e 61 6d 65 73 20 70 72  ariable names pr
d460: 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20 63 61  ovided by our ca
d470: 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ller...      #..
d480: 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24 72        upvar 1 $r
d490: 65 73 75 6c 74 73 56 61 72 4e 61 6d 65 20 72 65  esultsVarName re
d4a0: 73 75 6c 74 73 0d 0a 20 20 20 20 20 20 75 70 76  sults..      upv
d4b0: 61 72 20 31 20 24 65 72 72 6f 72 73 56 61 72 4e  ar 1 $errorsVarN
d4c0: 61 6d 65 20 65 72 72 6f 72 73 0d 0a 0d 0a 20 20  ame errors....  
d4d0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
d4e0: 4f 54 45 3a 20 45 76 61 6c 75 61 74 65 20 74 68  OTE: Evaluate th
d4f0: 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 5b 63  e constructed [c
d500: 6f 6d 70 69 6c 65 43 53 68 61 72 70 5d 20 63 6f  ompileCSharp] co
d510: 6d 6d 61 6e 64 20 61 6e 64 20 72 65 74 75 72 6e  mmand and return
d520: 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
d530: 20 20 20 20 72 65 73 75 6c 74 2e 0d 0a 20 20 20      result...   
d540: 20 20 20 23 0d 0a 20 20 20 20 20 20 65 76 61 6c     #..      eval
d550: 20 24 63 6f 6d 6d 61 6e 64 0d 0a 20 20 20 20 7d   $command..    }
d560: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73  .....    proc is
d570: 4d 65 6d 6f 72 79 44 62 20 7b 20 66 69 6c 65 4e  MemoryDb { fileN
d580: 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ame } {..      #
d590: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
d5a0: 49 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64  Is the specified
d5b0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
d5c0: 61 6d 65 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e  ame really an in
d5d0: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
d5e0: 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ?..      #..    
d5f0: 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b    return [expr {
d600: 24 66 69 6c 65 4e 61 6d 65 20 65 71 20 22 3a 6d  $fileName eq ":m
d610: 65 6d 6f 72 79 3a 22 20 7c 7c 20 5c 0d 0a 20 20  emory:" || \..  
d620: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
d630: 72 61 6e 67 65 20 24 66 69 6c 65 4e 61 6d 65 20  range $fileName 
d640: 30 20 31 32 5d 20 65 71 20 22 66 69 6c 65 3a 3a  0 12] eq "file::
d650: 6d 65 6d 6f 72 79 3a 22 7d 5d 0d 0a 20 20 20 20  memory:"}]..    
d660: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69  }.....    proc i
d670: 73 54 61 62 6c 65 49 6e 44 62 20 7b 20 6e 61 6d  sTableInDb { nam
d680: 65 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20 7d  e {varName db} }
d690: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
d6a0: 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72     # NOTE: Refer
d6b0: 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65   to the specifie
d6c0: 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e  d variable (e.g.
d6d0: 20 22 64 62 22 29 20 69 6e 20 74 68 65 20 63 6f   "db") in the co
d6e0: 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20  ntext of our..  
d6f0: 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c      #       call
d700: 65 72 2e 20 20 49 74 20 63 6f 6e 74 61 69 6e 73  er.  It contains
d710: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
d720: 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20  nnection handle 
d730: 74 68 61 74 20 77 69 6c 6c 20 62 65 0d 0a 20 20  that will be..  
d740: 20 20 20 20 23 20 20 20 20 20 20 20 75 73 65 64      #       used
d750: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20   to execute the 
d760: 71 75 65 72 79 20 75 73 65 64 20 74 6f 20 64 65  query used to de
d770: 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e  termine if the n
d780: 61 6d 65 64 20 74 61 62 6c 65 20 69 73 0d 0a 20  amed table is.. 
d790: 20 20 20 20 20 23 20 20 20 20 20 20 20 70 72 65       #       pre
d7a0: 73 65 6e 74 20 69 6e 20 74 68 61 74 20 64 61 74  sent in that dat
d7b0: 61 62 61 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d  abase...      #.
d7c0: 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24  .      upvar 1 $
d7d0: 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20  varName db....  
d7e0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
d7f0: 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 71 6c  OTE: Use the sql
d800: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
d810: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
d820: 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65   the named table
d830: 20 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20   is..      #    
d840: 20 20 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68     present in th
d850: 65 20 64 61 74 61 62 61 73 65 2e 0d 0a 20 20 20  e database...   
d860: 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
d870: 73 71 6c 20 7b 0d 0a 20 20 20 20 20 20 20 20 53  sql {..        S
d880: 45 4c 45 43 54 20 43 4f 55 4e 54 28 2a 29 20 46  ELECT COUNT(*) F
d890: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
d8a0: 72 20 57 48 45 52 45 20 74 79 70 65 20 3d 20 27  r WHERE type = '
d8b0: 74 61 62 6c 65 27 20 41 4e 44 20 6e 61 6d 65 20  table' AND name 
d8c0: 3d 20 3f 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  = ?;..      }...
d8d0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
d8e0: 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 6e  # NOTE: Return n
d8f0: 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 6e  on-zero if the n
d900: 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20 70 72  amed table is pr
d910: 65 73 65 6e 74 2e 0d 0a 20 20 20 20 20 20 23 0d  esent...      #.
d920: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65  .      return [e
d930: 78 70 72 20 7b 0d 0a 20 20 20 20 20 20 20 20 5b  xpr {..        [
d940: 73 71 6c 20 65 78 65 63 75 74 65 20 2d 65 78 65  sql execute -exe
d950: 63 75 74 65 20 73 63 61 6c 61 72 20 24 64 62 20  cute scalar $db 
d960: 24 73 71 6c 20 5b 6c 69 73 74 20 70 61 72 61 6d  $sql [list param
d970: 31 20 53 74 72 69 6e 67 20 24 6e 61 6d 65 5d 5d  1 String $name]]
d980: 20 3e 20 30 0d 0a 20 20 20 20 20 20 7d 5d 0d 0a   > 0..      }]..
d990: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
d9a0: 6f 63 20 74 72 69 6d 53 71 6c 20 7b 20 73 71 6c  oc trimSql { sql
d9b0: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75   } {..      retu
d9c0: 72 6e 20 5b 72 65 67 73 75 62 20 2d 61 6c 6c 20  rn [regsub -all 
d9d0: 2d 2d 20 7b 5c 73 2b 7d 20 5b 73 74 72 69 6e 67  -- {\s+} [string
d9e0: 20 74 72 69 6d 20 24 73 71 6c 5d 20 22 20 22 5d   trim $sql] " "]
d9f0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
da00: 70 72 6f 63 20 65 78 65 63 75 74 65 53 71 6c 20  proc executeSql 
da10: 7b 20 73 71 6c 20 7b 65 78 65 63 75 74 65 20 6e  { sql {execute n
da20: 6f 6e 65 7d 20 7b 66 6f 72 6d 61 74 20 6e 6f 6e  one} {format non
da30: 65 7d 20 7b 66 69 6c 65 4e 61 6d 65 20 22 22 7d  e} {fileName ""}
da40: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b   } {..      if {
da50: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
da60: 66 69 6c 65 4e 61 6d 65 5d 20 3d 3d 20 30 7d 20  fileName] == 0} 
da70: 74 68 65 6e 20 7b 73 65 74 20 66 69 6c 65 4e 61  then {set fileNa
da80: 6d 65 20 3a 6d 65 6d 6f 72 79 3a 7d 0d 0a 20 20  me :memory:}..  
da90: 20 20 20 20 73 65 74 75 70 44 62 20 24 66 69 6c      setupDb $fil
daa0: 65 4e 61 6d 65 20 22 22 20 22 22 20 22 22 20 22  eName "" "" "" "
dab0: 22 20 22 22 20 66 61 6c 73 65 20 66 61 6c 73 65  " "" false false
dac0: 20 66 61 6c 73 65 20 66 61 6c 73 65 20 64 62 20   false false db 
dad0: 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20 74 72  true....      tr
dae0: 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  y {..        ret
daf0: 75 72 6e 20 5b 75 70 6c 65 76 65 6c 20 31 20 5b  urn [uplevel 1 [
db00: 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  list \..        
db10: 20 20 20 20 73 71 6c 20 65 78 65 63 75 74 65 20      sql execute 
db20: 2d 65 78 65 63 75 74 65 20 24 65 78 65 63 75 74  -execute $execut
db30: 65 20 2d 66 6f 72 6d 61 74 20 24 66 6f 72 6d 61  e -format $forma
db40: 74 20 24 64 62 20 24 73 71 6c 5d 5d 0d 0a 20 20  t $db $sql]]..  
db50: 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0d      } finally {.
db60: 0a 20 20 20 20 20 20 20 20 63 6c 65 61 6e 75 70  .        cleanup
db70: 44 62 20 24 66 69 6c 65 4e 61 6d 65 20 64 62 20  Db $fileName db 
db80: 66 61 6c 73 65 20 66 61 6c 73 65 20 66 61 6c 73  false false fals
db90: 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  e..      }..    
dba0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
dbb0: 65 74 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67  etConnectionFlag
dbc0: 73 20 7b 20 66 69 6c 65 4e 61 6d 65 20 66 6c 61  s { fileName fla
dbd0: 67 73 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d  gs {quiet false}
dbe0: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
dbf0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 67       # NOTE: Fig
dc00: 75 72 65 20 6f 75 74 20 77 68 69 63 68 20 64 61  ure out which da
dc10: 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
dc20: 20 6f 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73   or connection s
dc30: 74 72 69 6e 67 20 74 68 65 73 65 0d 0a 20 20 20  tring these..   
dc40: 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 6e 65     #       conne
dc50: 63 74 69 6f 6e 20 66 6c 61 67 73 20 77 69 6c 6c  ction flags will
dc60: 20 61 63 74 75 61 6c 6c 79 20 61 70 70 6c 79 20   actually apply 
dc70: 74 6f 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 74  to.  This is not
dc80: 20 6e 65 63 65 73 73 61 72 79 0d 0a 20 20 20 20   necessary..    
dc90: 20 20 23 20 20 20 20 20 20 20 69 6e 20 71 75 69    #       in qui
dca0: 65 74 20 6d 6f 64 65 20 62 65 63 61 75 73 65 20  et mode because 
dcb0: 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  this information
dcc0: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f   is only used fo
dcd0: 72 20 6c 6f 67 67 69 6e 67 0d 0a 20 20 20 20 20  r logging..     
dce0: 20 23 20 20 20 20 20 20 20 61 6e 64 20 72 65 70   #       and rep
dcf0: 6f 72 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e  orting purposes.
dd00: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
dd10: 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
dd20: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
dd30: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
dd40: 20 24 66 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d   $fileName] > 0}
dd50: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
dd60: 20 20 20 73 65 74 20 64 61 74 61 62 61 73 65 20     set database 
dd70: 5b 61 70 70 65 6e 64 41 72 67 73 20 22 66 69 6c  [appendArgs "fil
dd80: 65 20 6e 61 6d 65 20 5c 22 22 20 24 66 69 6c 65  e name \"" $file
dd90: 4e 61 6d 65 20 5c 22 5d 0d 0a 20 20 20 20 20 20  Name \"]..      
dda0: 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66    } elseif {[inf
ddb0: 6f 20 65 78 69 73 74 73 20 3a 3a 64 61 74 61 53  o exists ::dataS
ddc0: 6f 75 72 63 65 5d 20 26 26 20 5c 0d 0a 20 20 20  ource] && \..   
ddd0: 20 20 20 20 20 20 20 20 20 21 5b 61 72 72 61 79           ![array
dde0: 20 65 78 69 73 74 73 20 3a 3a 64 61 74 61 53 6f   exists ::dataSo
ddf0: 75 72 63 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  urce]} then {.. 
de00: 20 20 20 20 20 20 20 20 20 73 65 74 20 64 61 74           set dat
de10: 61 62 61 73 65 20 5b 61 70 70 65 6e 64 41 72 67  abase [appendArg
de20: 73 20 22 64 61 74 61 20 73 6f 75 72 63 65 20 5c  s "data source \
de30: 22 22 20 24 3a 3a 64 61 74 61 53 6f 75 72 63 65  "" $::dataSource
de40: 20 5c 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20   \"]..        } 
de50: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
de60: 20 20 73 65 74 20 64 61 74 61 62 61 73 65 20 3c    set database <
de70: 75 6e 6b 6e 6f 77 6e 3e 0d 0a 20 20 20 20 20 20  unknown>..      
de80: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
de90: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
dea0: 20 4e 4f 54 45 3a 20 53 68 6f 77 20 28 61 6e 64   NOTE: Show (and
deb0: 20 6c 6f 67 29 20 74 68 65 20 6c 6f 63 61 6c 20   log) the local 
dec0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
ded0: 20 61 6e 64 20 74 68 65 20 61 73 73 6f 63 69 61   and the associa
dee0: 74 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ted..      #    
def0: 20 20 20 64 61 74 61 20 73 6f 75 72 63 65 20 6f     data source o
df00: 72 20 66 69 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20  r file name...  
df10: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
df20: 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
df30: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
df40: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
df50: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
df60: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
df70: 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f   local connectio
df80: 6e 20 66 6c 61 67 73 20 66 6f 72 20 22 20 24 64  n flags for " $d
df90: 61 74 61 62 61 73 65 20 5c 0d 0a 20 20 20 20 20  atabase \..     
dfa0: 20 20 20 20 20 20 20 22 20 61 72 65 3a 20 22 20         " are: " 
dfb0: 5b 65 78 70 72 20 7b 5b 73 74 72 69 6e 67 20 6c  [expr {[string l
dfc0: 65 6e 67 74 68 20 24 66 6c 61 67 73 5d 20 3e 20  ength $flags] > 
dfd0: 30 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  0 ? \..         
dfe0: 20 20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c     [appendArgs \
dff0: 22 20 24 66 6c 61 67 73 20 5c 22 5d 20 3a 20 22  " $flags \"] : "
e000: 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20  <none>"}] \n].. 
e010: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
e020: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
e030: 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f 67 29 20   Show (and log) 
e040: 74 68 65 20 73 68 61 72 65 64 20 63 6f 6e 6e 65  the shared conne
e050: 63 74 69 6f 6e 20 66 6c 61 67 73 2e 0d 0a 20 20  ction flags...  
e060: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
e070: 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
e080: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
e090: 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
e0a0: 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
e0b0: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
e0c0: 74 65 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74  te.SQLiteConnect
e0d0: 69 6f 6e 20 53 68 61 72 65 64 46 6c 61 67 73 0d  ion SharedFlags.
e0e0: 0a 20 20 20 20 20 20 20 20 7d 20 73 68 61 72 65  .        } share
e0f0: 64 46 6c 61 67 73 5d 20 3d 3d 20 30 7d 20 74 68  dFlags] == 0} th
e100: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
e110: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
e120: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
e130: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
e140: 20 20 20 22 2d 2d 2d 2d 20 73 68 61 72 65 64 20     "---- shared 
e150: 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
e160: 20 66 6f 72 20 22 20 24 64 61 74 61 62 61 73 65   for " $database
e170: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
e180: 20 20 22 20 61 72 65 3a 20 22 20 5b 65 78 70 72    " are: " [expr
e190: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
e1a0: 20 24 73 68 61 72 65 64 46 6c 61 67 73 5d 20 3e   $sharedFlags] >
e1b0: 20 30 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20   0 && \..       
e1c0: 20 20 20 20 20 20 20 24 73 68 61 72 65 64 46 6c         $sharedFl
e1d0: 61 67 73 20 6e 65 20 22 4e 6f 6e 65 22 20 3f 20  ags ne "None" ? 
e1e0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
e1f0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20   [appendArgs \" 
e200: 24 73 68 61 72 65 64 46 6c 61 67 73 20 5c 22 5d  $sharedFlags \"]
e210: 20 3a 20 22 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e   : "<none>"}] \n
e220: 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  ]..        } els
e230: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  e {..          t
e240: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
e250: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
e260: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
e270: 20 20 22 2d 2d 2d 2d 20 73 68 61 72 65 64 20 63    "---- shared c
e280: 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20  onnection flags 
e290: 66 6f 72 20 22 20 24 64 61 74 61 62 61 73 65 20  for " $database 
e2a0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
e2b0: 20 22 20 61 72 65 3a 20 3c 75 6e 61 76 61 69 6c   " are: <unavail
e2c0: 61 62 6c 65 3e 5c 6e 22 5d 0d 0a 20 20 20 20 20  able>\n"]..     
e2d0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
e2e0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
e2f0: 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 72 65  # NOTE: If there
e300: 20 61 72 65 20 61 6e 79 20 67 6c 6f 62 61 6c 20   are any global 
e310: 28 70 65 72 20 74 65 73 74 20 72 75 6e 29 20 63  (per test run) c
e320: 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20  onnection flags 
e330: 63 75 72 72 65 6e 74 6c 79 0d 0a 20 20 20 20 20  currently..     
e340: 20 23 20 20 20 20 20 20 20 73 65 74 2c 20 75 73   #       set, us
e350: 65 20 74 68 65 6d 20 6e 6f 77 20 28 69 2e 65 2e  e them now (i.e.
e360: 20 62 79 20 63 6f 6d 62 69 6e 69 6e 67 20 74 68   by combining th
e370: 65 6d 20 77 69 74 68 20 74 68 65 20 6f 6e 65 73  em with the ones
e380: 20 66 6f 72 20 74 68 69 73 0d 0a 20 20 20 20 20   for this..     
e390: 20 23 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74   #       connect
e3a0: 69 6f 6e 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ion)...      #..
e3b0: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
e3c0: 65 78 69 73 74 73 20 3a 3a 63 6f 6e 6e 65 63 74  exists ::connect
e3d0: 69 6f 6e 5f 66 6c 61 67 73 5d 20 26 26 20 5c 0d  ion_flags] && \.
e3e0: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
e3f0: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 63 6f 6e  ng length $::con
e400: 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73 5d 20 3e  nection_flags] >
e410: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
e420: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
e430: 20 4e 4f 54 45 3a 20 53 68 6f 77 20 28 61 6e 64   NOTE: Show (and
e440: 20 6c 6f 67 29 20 74 68 65 20 64 65 74 65 63 74   log) the detect
e450: 65 64 20 67 6c 6f 62 61 6c 20 63 6f 6e 6e 65 63  ed global connec
e460: 74 69 6f 6e 20 66 6c 61 67 73 2e 0d 0a 20 20 20  tion flags...   
e470: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
e480: 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
e490: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
e4a0: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
e4b0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
e4c0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
e4d0: 20 20 22 2d 2d 2d 2d 20 67 6c 6f 62 61 6c 20 63    "---- global c
e4e0: 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20  onnection flags 
e4f0: 64 65 74 65 63 74 65 64 3a 20 22 20 5c 0d 0a 20  detected: " \.. 
e500: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 65 78               [ex
e510: 70 72 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  pr {[info exists
e520: 20 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c   ::connection_fl
e530: 61 67 73 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ags] && \..     
e540: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
e550: 20 6c 65 6e 67 74 68 20 24 3a 3a 63 6f 6e 6e 65   length $::conne
e560: 63 74 69 6f 6e 5f 66 6c 61 67 73 5d 20 3e 20 30  ction_flags] > 0
e570: 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   ? \..          
e580: 20 20 20 20 5b 61 70 70 65 6e 64 41 72 67 73 20      [appendArgs 
e590: 5c 22 20 24 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e  \" $::connection
e5a0: 5f 66 6c 61 67 73 20 5c 22 5d 20 3a 20 22 3c 6e  _flags \"] : "<n
e5b0: 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20 20 20  one>"}] \n]..   
e5c0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
e5d0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
e5e0: 4f 54 45 3a 20 43 6f 6d 62 69 6e 65 20 61 6e 64  OTE: Combine and
e5f0: 2f 6f 72 20 72 65 70 6c 61 63 65 20 74 68 65 20  /or replace the 
e600: 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
e610: 20 61 6e 64 20 74 68 65 6e 20 73 68 6f 77 20 74   and then show t
e620: 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  he..        #   
e630: 20 20 20 20 6e 65 77 20 76 61 6c 75 65 2e 0d 0a      new value...
e640: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
e650: 20 20 20 73 65 74 20 66 6c 61 67 73 20 5b 63 6f     set flags [co
e660: 6d 62 69 6e 65 46 6c 61 67 73 20 24 66 6c 61 67  mbineFlags $flag
e670: 73 20 24 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f  s $::connection_
e680: 66 6c 61 67 73 5d 0d 0a 0d 0a 20 20 20 20 20 20  flags]....      
e690: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
e6a0: 4f 54 45 3a 20 53 68 6f 77 20 28 61 6e 64 20 6c  OTE: Show (and l
e6b0: 6f 67 29 20 74 68 65 20 6e 65 77 20 65 66 66 65  og) the new effe
e6c0: 63 74 69 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  ctive connection
e6d0: 20 66 6c 61 67 73 2e 0d 0a 20 20 20 20 20 20 20   flags...       
e6e0: 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
e6f0: 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
e700: 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
e710: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
e720: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
e730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
e740: 2d 2d 2d 20 63 6f 6d 62 69 6e 65 64 20 63 6f 6e  --- combined con
e750: 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 66 6f  nection flags fo
e760: 72 20 22 20 24 64 61 74 61 62 61 73 65 20 5c 0d  r " $database \.
e770: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
e780: 20 61 72 65 3a 20 22 20 5b 65 78 70 72 20 7b 5b   are: " [expr {[
e790: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66  string length $f
e7a0: 6c 61 67 73 5d 20 3e 20 30 20 3f 20 5c 0d 0a 20  lags] > 0 ? \.. 
e7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 61 70               [ap
e7c0: 70 65 6e 64 41 72 67 73 20 5c 22 20 24 66 6c 61  pendArgs \" $fla
e7d0: 67 73 20 5c 22 5d 20 3a 20 22 3c 6e 6f 6e 65 3e  gs \"] : "<none>
e7e0: 22 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  "}] \n]..       
e7f0: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
e800: 20 20 20 20 20 72 65 74 75 72 6e 20 24 66 6c 61       return $fla
e810: 67 73 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  gs..    }.....  
e820: 20 20 70 72 6f 63 20 67 65 74 46 6c 61 67 73 50    proc getFlagsP
e830: 72 6f 70 65 72 74 79 20 7b 20 7b 66 6c 61 67 73  roperty { {flags
e840: 20 22 22 7d 20 7b 71 75 69 65 74 20 66 61 6c 73   ""} {quiet fals
e850: 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e} } {..      #.
e860: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44  .      # NOTE: D
e870: 65 74 65 72 6d 69 6e 65 20 77 68 61 74 20 74 68  etermine what th
e880: 65 20 63 6f 6d 62 69 6e 65 64 20 28 67 6c 6f 62  e combined (glob
e890: 61 6c 20 61 6e 64 20 6c 6f 63 61 6c 29 20 63 6f  al and local) co
e8a0: 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20  nnection..      
e8b0: 23 20 20 20 20 20 20 20 66 6c 61 67 73 20 73 68  #       flags sh
e8c0: 6f 75 6c 64 20 62 65 2c 20 70 6f 73 73 69 62 6c  ould be, possibl
e8d0: 79 20 71 75 69 65 74 6c 79 2e 0d 0a 20 20 20 20  y quietly...    
e8e0: 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 66    #..      set f
e8f0: 6c 61 67 73 20 5b 67 65 74 43 6f 6e 6e 65 63 74  lags [getConnect
e900: 69 6f 6e 46 6c 61 67 73 20 22 22 20 24 66 6c 61  ionFlags "" $fla
e910: 67 73 20 24 71 75 69 65 74 5d 0d 0a 0d 0a 20 20  gs $quiet]....  
e920: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
e930: 4f 54 45 3a 20 49 66 20 6e 6f 20 67 6c 6f 62 61  OTE: If no globa
e940: 6c 20 6f 72 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65  l or local conne
e950: 63 74 69 6f 6e 20 66 6c 61 67 73 20 77 65 72 65  ction flags were
e960: 20 73 70 65 63 69 66 69 65 64 2c 20 74 68 65 0d   specified, the.
e970: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64  .      #       d
e980: 65 66 61 75 6c 74 20 63 6f 6e 6e 65 63 74 69 6f  efault connectio
e990: 6e 20 66 6c 61 67 73 20 73 68 6f 75 6c 64 20 62  n flags should b
e9a0: 65 20 75 73 65 64 3b 20 74 68 65 72 65 66 6f 72  e used; therefor
e9b0: 65 2c 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20  e, return..     
e9c0: 20 23 20 20 20 20 20 20 20 61 6e 20 65 6d 70 74   #       an empt
e9d0: 79 20 73 74 72 69 6e 67 20 69 6e 20 74 68 61 74  y string in that
e9e0: 20 63 61 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d   case...      #.
e9f0: 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
ea00: 6e 67 20 6c 65 6e 67 74 68 20 24 66 6c 61 67 73  ng length $flags
ea10: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
ea20: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 22          return "
ea30: 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  "..      }....  
ea40: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
ea50: 4f 54 45 3a 20 49 6e 20 6f 72 64 65 72 20 74 6f  OTE: In order to
ea60: 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 64 65   check if the de
ea70: 66 61 75 6c 74 20 63 6f 6e 6e 65 63 74 69 6f 6e  fault connection
ea80: 20 66 6c 61 67 73 20 61 72 65 20 62 65 69 6e 67   flags are being
ea90: 20 75 73 65 64 0d 0a 20 20 20 20 20 20 23 20 20   used..      #  
eaa0: 20 20 20 20 20 69 74 20 69 73 20 6e 65 63 65 73       it is neces
eab0: 73 61 72 79 20 74 6f 20 61 74 74 65 6d 70 74 20  sary to attempt 
eac0: 61 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74 6f 20  a conversion to 
ead0: 74 68 65 20 61 63 74 75 61 6c 20 65 6e 75 6d 65  the actual enume
eae0: 72 61 74 65 64 0d 0a 20 20 20 20 20 20 23 20 20  rated..      #  
eaf0: 20 20 20 20 20 74 79 70 65 2e 20 20 46 61 69 6c       type.  Fail
eb00: 69 6e 67 20 74 68 61 74 2c 20 74 68 65 20 63 68  ing that, the ch
eb10: 65 63 6b 20 61 67 61 69 6e 73 74 20 74 68 65 20  eck against the 
eb20: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 77 69  default value wi
eb30: 6c 6c 20 62 65 0d 0a 20 20 20 20 20 20 23 20 20  ll be..      #  
eb40: 20 20 20 20 20 73 6b 69 70 70 65 64 2e 0d 0a 20       skipped... 
eb50: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65       #..      se
eb60: 74 20 65 72 72 6f 72 20 6e 75 6c 6c 3b 20 23 20  t error null; # 
eb70: 49 47 4e 4f 52 45 44 0d 0a 20 20 20 20 20 20 73  IGNORED..      s
eb80: 65 74 20 76 61 6c 75 65 20 5b 6f 62 6a 65 63 74  et value [object
eb90: 20 69 6e 76 6f 6b 65 20 55 74 69 6c 69 74 79 20   invoke Utility 
eba0: 54 72 79 50 61 72 73 65 46 6c 61 67 73 45 6e 75  TryParseFlagsEnu
ebb0: 6d 20 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  m "" \..        
ebc0: 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
ebd0: 4c 69 74 65 2e 53 51 4c 69 74 65 43 6f 6e 6e 65  Lite.SQLiteConne
ebe0: 63 74 69 6f 6e 46 6c 61 67 73 20 22 22 20 24 66  ctionFlags "" $f
ebf0: 6c 61 67 73 20 6e 75 6c 6c 20 74 72 75 65 20 5c  lags null true \
ec00: 0d 0a 20 20 20 20 20 20 20 20 20 20 74 72 75 65  ..          true
ec10: 20 65 72 72 6f 72 5d 0d 0a 0d 0a 20 20 20 20 20   error]....     
ec20: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
ec30: 3a 20 49 66 20 74 68 65 20 63 6f 6d 62 69 6e 65  : If the combine
ec40: 64 20 66 6c 61 67 73 20 73 74 72 69 6e 67 20 63  d flags string c
ec50: 6f 75 6c 64 20 6e 6f 74 20 61 63 74 75 61 6c 6c  ould not actuall
ec60: 79 20 62 65 20 63 6f 6e 76 65 72 74 65 64 0d 0a  y be converted..
ec70: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f        #       to
ec80: 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64 20   the enumerated 
ec90: 74 79 70 65 20 69 74 20 69 73 20 74 68 65 20 64  type it is the d
eca0: 65 66 61 75 6c 74 20 76 61 6c 75 65 2c 20 74 68  efault value, th
ecb0: 65 6e 20 6a 75 73 74 20 75 73 65 0d 0a 20 20 20  en just use..   
ecc0: 20 20 20 23 20 20 20 20 20 20 20 69 74 20 76 65     #       it ve
ecd0: 72 62 61 74 69 6d 3b 20 6f 74 68 65 72 77 69 73  rbatim; otherwis
ece0: 65 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20 61  e, just return a
ecf0: 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20  n empty string. 
ed00: 20 49 6e 20 74 68 61 74 0d 0a 20 20 20 20 20 20   In that..      
ed10: 23 20 20 20 20 20 20 20 63 61 73 65 2c 20 74 68  #       case, th
ed20: 65 20 64 65 66 61 75 6c 74 20 63 6f 6e 6e 65 63  e default connec
ed30: 74 69 6f 6e 20 66 6c 61 67 73 20 77 69 6c 6c 20  tion flags will 
ed40: 62 65 20 75 73 65 64 2e 0d 0a 20 20 20 20 20 20  be used...      
ed50: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  #..      if {[st
ed60: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 6c  ring length $val
ed70: 75 65 5d 20 3d 3d 20 30 20 7c 7c 20 24 76 61 6c  ue] == 0 || $val
ed80: 75 65 20 6e 65 20 22 44 65 66 61 75 6c 74 22 7d  ue ne "Default"}
ed90: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
eda0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 57 41   #..        # WA
edb0: 52 4e 49 4e 47 3a 20 54 68 69 73 20 72 65 74 75  RNING: This retu
edc0: 72 6e 73 20 74 68 65 20 73 74 72 69 6e 67 20 76  rns the string v
edd0: 61 6c 75 65 20 6f 66 20 74 68 65 20 63 6f 6d 62  alue of the comb
ede0: 69 6e 65 64 20 66 6c 61 67 73 2c 20 6e 6f 74 0d  ined flags, not.
edf0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
ee00: 20 20 20 20 74 68 65 20 65 6e 75 6d 65 72 61 74      the enumerat
ee10: 65 64 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20  ed value.  This 
ee20: 69 73 20 62 79 20 64 65 73 69 67 6e 20 61 6e 64  is by design and
ee30: 20 73 68 6f 75 6c 64 20 6e 6f 74 0d 0a 20 20 20   should not..   
ee40: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20       #          
ee50: 62 65 20 63 68 61 6e 67 65 64 20 77 69 74 68 6f  be changed witho
ee60: 75 74 20 63 61 72 65 66 75 6c 20 63 6f 6e 73 69  ut careful consi
ee70: 64 65 72 61 74 69 6f 6e 20 28 65 2e 67 2e 20 69  deration (e.g. i
ee80: 74 20 77 6f 75 6c 64 0d 0a 20 20 20 20 20 20 20  t would..       
ee90: 20 23 20 20 20 20 20 20 20 20 20 20 70 72 65 76   #          prev
eea0: 65 6e 74 20 74 68 65 20 53 51 4c 69 74 65 43 6f  ent the SQLiteCo
eeb0: 6e 6e 65 63 74 69 6f 6e 20 63 6c 61 73 73 20 66  nnection class f
eec0: 72 6f 6d 20 61 6c 6c 6f 77 69 6e 67 20 69 6e 76  rom allowing inv
eed0: 61 6c 69 64 0d 0a 20 20 20 20 20 20 20 20 23 20  alid..        # 
eee0: 20 20 20 20 20 20 20 20 20 5b 22 6d 61 67 69 63           ["magic
eef0: 61 6c 22 5d 20 6d 65 74 61 2d 66 6c 61 67 73 29  al"] meta-flags)
ef00: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
ef10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 61 70        return [ap
ef20: 70 65 6e 64 41 72 67 73 20 22 46 6c 61 67 73 3d  pendArgs "Flags=
ef30: 22 20 24 66 6c 61 67 73 20 5c 3b 5d 0d 0a 20 20  " $flags \;]..  
ef40: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72      }....      r
ef50: 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 7d 0d  eturn ""..    }.
ef60: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 65 6e 61  ....    proc ena
ef70: 62 6c 65 53 68 61 72 65 64 43 61 63 68 65 20 7b  bleSharedCache {
ef80: 20 63 68 61 6e 6e 65 6c 20 65 6e 61 62 6c 65 20   channel enable 
ef90: 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20  {quiet false} } 
efa0: 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  {..      if {[ca
efb0: 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f  tch {..        o
efc0: 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
efd0: 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
efe0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79  ..            Sy
eff0: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
f000: 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74  .UnsafeNativeMet
f010: 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  hods \..        
f020: 20 20 20 20 73 71 6c 69 74 65 33 5f 65 6e 61 62      sqlite3_enab
f030: 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65 20  le_shared_cache 
f040: 5b 65 78 70 72 20 69 6e 74 28 24 65 6e 61 62 6c  [expr int($enabl
f050: 65 29 5d 0d 0a 20 20 20 20 20 20 7d 20 72 65 73  e)]..      } res
f060: 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ult] == 0} then 
f070: 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  {..        if {!
f080: 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
f090: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
f0a0: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
f0b0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
f0c0: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c        "---- call
f0d0: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
f0e0: 73 68 61 72 65 64 5f 63 61 63 68 65 28 22 20 24  shared_cache(" $
f0f0: 65 6e 61 62 6c 65 20 5c 0d 0a 20 20 20 20 20 20  enable \..      
f100: 20 20 20 20 20 20 20 20 22 29 2e 2e 2e 20 6f 6b          ")... ok
f110: 3a 20 22 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d  : " $result \n].
f120: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
f130: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
f140: 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
f150: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
f160: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
f170: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
f180: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
f190: 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65  ---- call sqlite
f1a0: 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f  3_enable_shared_
f1b0: 63 61 63 68 65 28 22 20 24 65 6e 61 62 6c 65 20  cache(" $enable 
f1c0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
f1d0: 20 22 29 2e 2e 2e 20 65 72 72 6f 72 3a 20 22 20   ")... error: " 
f1e0: 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d  \n\t $result \n]
f1f0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
f200: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
f210: 20 20 20 20 70 72 6f 63 20 73 65 74 75 70 44 62      proc setupDb
f220: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
f230: 66 69 6c 65 4e 61 6d 65 20 7b 6d 6f 64 65 20 22  fileName {mode "
f240: 22 7d 20 7b 64 61 74 65 54 69 6d 65 46 6f 72 6d  "} {dateTimeForm
f250: 61 74 20 22 22 7d 20 7b 64 61 74 65 54 69 6d 65  at ""} {dateTime
f260: 4b 69 6e 64 20 22 22 7d 20 7b 66 6c 61 67 73 20  Kind ""} {flags 
f270: 22 22 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ""}..           
f280: 20 7b 65 78 74 72 61 20 22 22 7d 20 7b 71 75 61   {extra ""} {qua
f290: 6c 69 66 79 20 74 72 75 65 7d 20 7b 64 65 6c 65  lify true} {dele
f2a0: 74 65 20 74 72 75 65 7d 20 7b 75 72 69 20 66 61  te true} {uri fa
f2b0: 6c 73 65 7d 0d 0a 20 20 20 20 20 20 20 20 20 20  lse}..          
f2c0: 20 20 7b 74 65 6d 70 6f 72 61 72 79 20 74 72 75    {temporary tru
f2d0: 65 7d 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20  e} {varName db} 
f2e0: 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20  {quiet false} } 
f2f0: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
f300: 20 20 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c    # NOTE: First,
f310: 20 73 65 65 20 69 66 20 6f 75 72 20 63 61 6c 6c   see if our call
f320: 65 72 20 68 61 73 20 72 65 71 75 65 73 74 65 64  er has requested
f330: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
f340: 74 61 62 61 73 65 2e 0d 0a 20 20 20 20 20 20 23  tabase...      #
f350: 0d 0a 20 20 20 20 20 20 73 65 74 20 69 73 4d 65  ..      set isMe
f360: 6d 6f 72 79 20 5b 69 73 4d 65 6d 6f 72 79 44 62  mory [isMemoryDb
f370: 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20   $fileName].... 
f380: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
f390: 4e 4f 54 45 3a 20 46 6f 72 20 6e 6f 77 2c 20 61  NOTE: For now, a
f3a0: 6c 6c 20 74 65 73 74 20 64 61 74 61 62 61 73 65  ll test database
f3b0: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 74 65  s used by the te
f3c0: 73 74 20 73 75 69 74 65 20 61 72 65 20 70 6c 61  st suite are pla
f3d0: 63 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ced..      #    
f3e0: 20 20 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61     into the data
f3f0: 62 61 73 65 20 64 69 72 65 63 74 6f 72 79 2e 20  base directory. 
f400: 20 45 61 63 68 20 64 61 74 61 62 61 73 65 20 61   Each database a
f410: 6e 64 20 72 65 6c 61 74 65 64 20 66 69 6c 65 73  nd related files
f420: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
f430: 75 73 65 64 20 62 79 20 61 20 74 65 73 74 20 73  used by a test s
f440: 68 6f 75 6c 64 20 62 65 20 63 6c 65 61 6e 65 64  hould be cleaned
f450: 20 75 70 20 62 79 20 74 68 61 74 20 74 65 73 74   up by that test
f460: 20 75 73 69 6e 67 20 74 68 65 0d 0a 20 20 20 20   using the..    
f470: 20 20 23 20 20 20 20 20 20 20 22 63 6c 65 61 6e    #       "clean
f480: 75 70 44 62 22 20 70 72 6f 63 65 64 75 72 65 2c  upDb" procedure,
f490: 20 62 65 6c 6f 77 2e 0d 0a 20 20 20 20 20 20 23   below...      #
f4a0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 69 73  ..      if {!$is
f4b0: 4d 65 6d 6f 72 79 20 26 26 20 24 71 75 61 6c 69  Memory && $quali
f4c0: 66 79 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  fy} then {..    
f4d0: 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65      set fileName
f4e0: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74   [file join [get
f4f0: 44 61 74 61 62 61 73 65 44 69 72 65 63 74 6f 72  DatabaseDirector
f500: 79 5d 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66  y] [file tail $f
f510: 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 20  ileName]]..     
f520: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
f530: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 79 20       # NOTE: By 
f540: 64 65 66 61 75 6c 74 2c 20 64 65 6c 65 74 65 20  default, delete 
f550: 61 6e 79 20 70 72 65 2d 65 78 69 73 74 69 6e 67  any pre-existing
f560: 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74   database with t
f570: 68 65 20 73 61 6d 65 20 66 69 6c 65 0d 0a 20 20  he same file..  
f580: 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d 65      #       name
f590: 20 69 66 20 69 74 20 63 75 72 72 65 6e 74 6c 79   if it currently
f5a0: 20 65 78 69 73 74 73 2e 0d 0a 20 20 20 20 20 20   exists...      
f5b0: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 69  #..      if {!$i
f5c0: 73 4d 65 6d 6f 72 79 20 26 26 20 24 64 65 6c 65  sMemory && $dele
f5d0: 74 65 20 26 26 20 5b 66 69 6c 65 20 65 78 69 73  te && [file exis
f5e0: 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74  ts $fileName]} t
f5f0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
f600: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
f610: 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65 6c  : Attempt to del
f620: 65 74 65 20 61 6e 79 20 70 72 65 2d 65 78 69 73  ete any pre-exis
f630: 74 69 6e 67 20 64 61 74 61 62 61 73 65 20 77 69  ting database wi
f640: 74 68 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  th the same file
f650: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
f660: 20 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20    name...       
f670: 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
f680: 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c  [catch {file del
f690: 65 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d 20 65  ete $fileName} e
f6a0: 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  rror]} then {.. 
f6b0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
f6c0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65        # NOTE: We
f6d0: 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20   somehow failed 
f6e0: 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 66 69  to delete the fi
f6f0: 6c 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d  le, report why..
f700: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
f710: 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
f720: 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
f730: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
f740: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
f750: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
f760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
f770: 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
f780: 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 64 61  led to delete da
f790: 74 61 62 61 73 65 20 66 69 6c 65 20 5c 22 22 20  tabase file \"" 
f7a0: 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20  $fileName \..   
f7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22               "\"
f7c0: 20 64 75 72 69 6e 67 20 73 65 74 75 70 2c 20 65   during setup, e
f7d0: 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72  rror: " \n\t $er
f7e0: 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ror \n]..       
f7f0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
f800: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
f810: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
f820: 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65 20  E: Refer to the 
f830: 73 70 65 63 69 66 69 65 64 20 76 61 72 69 61 62  specified variab
f840: 6c 65 20 28 65 2e 67 2e 20 22 64 62 22 29 20 69  le (e.g. "db") i
f850: 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66  n the context of
f860: 20 6f 75 72 0d 0a 20 20 20 20 20 20 23 20 20 20   our..      #   
f870: 20 20 20 20 63 61 6c 6c 65 72 2e 20 20 54 68 65      caller.  The
f880: 20 68 61 6e 64 6c 65 20 74 6f 20 74 68 65 20 6f   handle to the o
f890: 70 65 6e 65 64 20 64 61 74 61 62 61 73 65 20 77  pened database w
f8a0: 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 74 68  ill be stored th
f8b0: 65 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ere...      #.. 
f8c0: 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61       upvar 1 $va
f8d0: 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20  rName db....    
f8e0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
f8f0: 45 3a 20 53 74 61 72 74 20 62 75 69 6c 64 69 6e  E: Start buildin
f900: 67 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  g the connection
f910: 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 6f 6e   string.  The on
f920: 6c 79 20 72 65 71 75 69 72 65 64 20 70 6f 72 74  ly required port
f930: 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ion..      #    
f940: 20 20 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63     of the connec
f950: 74 69 6f 6e 20 73 74 72 69 6e 67 20 69 73 20 74  tion string is t
f960: 68 65 20 64 61 74 61 20 73 6f 75 72 63 65 2c 20  he data source, 
f970: 77 68 69 63 68 20 63 6f 6e 74 61 69 6e 73 20 74  which contains t
f980: 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
f990: 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20    database file 
f9a0: 6e 61 6d 65 20 69 74 73 65 6c 66 2e 20 20 49 66  name itself.  If
f9b0: 20 6f 75 72 20 63 61 6c 6c 65 72 20 77 61 6e 74   our caller want
f9c0: 73 20 74 6f 20 75 73 65 20 61 20 55 52 49 20 61  s to use a URI a
f9d0: 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
f9e0: 20 74 68 65 20 64 61 74 61 20 73 6f 75 72 63 65   the data source
f9f0: 2c 20 75 73 65 20 74 68 65 20 46 75 6c 6c 55 72  , use the FullUr
fa00: 69 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72  i connection str
fa10: 69 6e 67 20 70 72 6f 70 65 72 74 79 20 74 6f 0d  ing property to.
fa20: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70  .      #       p
fa30: 72 65 76 65 6e 74 20 74 68 65 20 64 61 74 61 20  revent the data 
fa40: 73 6f 75 72 63 65 20 73 74 72 69 6e 67 20 66 72  source string fr
fa50: 6f 6d 20 62 65 69 6e 67 20 6d 61 6e 67 6c 65 64  om being mangled
fa60: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
fa70: 20 20 69 66 20 7b 24 75 72 69 7d 20 74 68 65 6e    if {$uri} then
fa80: 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
fa90: 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 46 75 6c 6c  connection {Full
faa0: 55 72 69 3d 24 7b 66 69 6c 65 4e 61 6d 65 7d 7d  Uri=${fileName}}
fab0: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
fac0: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f  ..        set co
fad0: 6e 6e 65 63 74 69 6f 6e 20 7b 44 61 74 61 20 53  nnection {Data S
fae0: 6f 75 72 63 65 3d 24 7b 66 69 6c 65 4e 61 6d 65  ource=${fileName
faf0: 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  }}..      }.... 
fb00: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
fb10: 4e 4f 54 45 3a 20 53 69 6e 63 65 20 74 68 69 73  NOTE: Since this
fb20: 20 70 72 6f 63 65 64 75 72 65 20 68 61 73 20 6e   procedure has n
fb30: 6f 20 73 70 65 63 69 61 6c 20 6b 6e 6f 77 6c 65  o special knowle
fb40: 64 67 65 20 6f 66 20 77 68 61 74 20 74 68 65 20  dge of what the 
fb50: 64 65 66 61 75 6c 74 0d 0a 20 20 20 20 20 20 23  default..      #
fb60: 20 20 20 20 20 20 20 73 65 74 74 69 6e 67 20 69         setting i
fb70: 73 20 66 6f 72 20 74 68 65 20 54 6f 46 75 6c 6c  s for the ToFull
fb80: 50 61 74 68 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  Path connection 
fb90: 73 74 72 69 6e 67 20 70 72 6f 70 65 72 79 2c 20  string propery, 
fba0: 61 6c 77 61 79 73 0d 0a 20 20 20 20 20 20 23 20  always..      # 
fbb0: 20 20 20 20 20 20 61 64 64 20 74 68 65 20 76 61        add the va
fbc0: 6c 75 65 20 77 65 20 6b 6e 6f 77 20 61 62 6f 75  lue we know abou
fbd0: 74 20 74 6f 20 74 68 65 20 63 6f 6e 6e 65 63 74  t to the connect
fbe0: 69 6f 6e 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20  ion string...   
fbf0: 20 20 20 23 0d 0a 20 20 20 20 20 20 61 70 70 65     #..      appe
fc00: 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b  nd connection {;
fc10: 54 6f 46 75 6c 6c 50 61 74 68 3d 24 7b 71 75 61  ToFullPath=${qua
fc20: 6c 69 66 79 7d 7d 0d 0a 0d 0a 20 20 20 20 20 20  lify}}....      
fc30: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
fc40: 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 73   If our caller s
fc50: 70 65 63 69 66 69 65 64 20 61 20 6a 6f 75 72 6e  pecified a journ
fc60: 61 6c 20 6d 6f 64 65 2c 20 61 64 64 20 74 68 65  al mode, add the
fc70: 20 6e 65 63 65 73 73 61 72 79 20 70 6f 72 74 69   necessary porti
fc80: 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  on..      #     
fc90: 20 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74    of the connect
fca0: 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d  ion string now..
fcb0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
fcc0: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
fcd0: 74 68 20 24 6d 6f 64 65 5d 20 3e 20 30 7d 20 74  th $mode] > 0} t
fce0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61  hen {..        a
fcf0: 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e  ppend connection
fd00: 20 7b 3b 4a 6f 75 72 6e 61 6c 20 4d 6f 64 65 3d   {;Journal Mode=
fd10: 24 7b 6d 6f 64 65 7d 7d 0d 0a 20 20 20 20 20 20  ${mode}}..      
fd20: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
fd30: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f      # NOTE: If o
fd40: 75 72 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66  ur caller specif
fd50: 69 65 64 20 61 20 44 61 74 65 54 69 6d 65 20 66  ied a DateTime f
fd60: 6f 72 6d 61 74 2c 20 61 64 64 20 74 68 65 20 6e  ormat, add the n
fd70: 65 63 65 73 73 61 72 79 0d 0a 20 20 20 20 20 20  ecessary..      
fd80: 23 20 20 20 20 20 20 20 70 6f 72 74 69 6f 6e 20  #       portion 
fd90: 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  of the connectio
fda0: 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20  n string now... 
fdb0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
fdc0: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
fdd0: 20 24 64 61 74 65 54 69 6d 65 46 6f 72 6d 61 74   $dateTimeFormat
fde0: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
fdf0: 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f         append co
fe00: 6e 6e 65 63 74 69 6f 6e 20 7b 3b 44 61 74 65 54  nnection {;DateT
fe10: 69 6d 65 46 6f 72 6d 61 74 3d 24 7b 64 61 74 65  imeFormat=${date
fe20: 54 69 6d 65 46 6f 72 6d 61 74 7d 7d 0d 0a 20 20  TimeFormat}}..  
fe30: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
fe40: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
fe50: 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 73 70  If our caller sp
fe60: 65 63 69 66 69 65 64 20 61 20 44 61 74 65 54 69  ecified a DateTi
fe70: 6d 65 4b 69 6e 64 2c 20 61 64 64 20 74 68 65 20  meKind, add the 
fe80: 6e 65 63 65 73 73 61 72 79 20 70 6f 72 74 69 6f  necessary portio
fe90: 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  n..      #      
fea0: 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   of the connecti
feb0: 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a  on string now...
fec0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
fed0: 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
fee0: 68 20 24 64 61 74 65 54 69 6d 65 4b 69 6e 64 5d  h $dateTimeKind]
fef0: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
ff00: 20 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e        append con
ff10: 6e 65 63 74 69 6f 6e 20 7b 3b 44 61 74 65 54 69  nection {;DateTi
ff20: 6d 65 4b 69 6e 64 3d 24 7b 64 61 74 65 54 69 6d  meKind=${dateTim
ff30: 65 4b 69 6e 64 7d 7d 0d 0a 20 20 20 20 20 20 7d  eKind}}..      }
ff40: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
ff50: 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72     # NOTE: Figur
ff60: 65 20 6f 75 74 20 77 68 61 74 20 74 68 65 20 66  e out what the f
ff70: 69 6e 61 6c 20 66 6c 61 67 73 20 66 6f 72 20 74  inal flags for t
ff80: 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e  his connection n
ff90: 65 65 64 20 74 6f 20 62 65 2e 0d 0a 20 20 20 20  eed to be...    
ffa0: 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 66    #..      set f
ffb0: 6c 61 67 73 20 5b 67 65 74 43 6f 6e 6e 65 63 74  lags [getConnect
ffc0: 69 6f 6e 46 6c 61 67 73 20 24 66 69 6c 65 4e 61  ionFlags $fileNa
ffd0: 6d 65 20 24 66 6c 61 67 73 20 24 71 75 69 65 74  me $flags $quiet
ffe0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ]....      #..  
fff0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f      # NOTE: If o
10000 75 72 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66  ur caller specif
10010 69 65 64 20 73 6f 6d 65 20 53 51 4c 69 74 65 43  ied some SQLiteC
10020 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 2c 20  onnectionFlags, 
10030 61 64 64 20 74 68 65 0d 0a 20 20 20 20 20 20 23  add the..      #
10040 20 20 20 20 20 20 20 6e 65 63 65 73 73 61 72 79         necessary
10050 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
10060 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e  connection strin
10070 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d  g now...      #.
10080 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
10090 6e 67 20 6c 65 6e 67 74 68 20 24 66 6c 61 67 73  ng length $flags
100a0 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
100b0 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f         append co
100c0 6e 6e 65 63 74 69 6f 6e 20 7b 3b 46 6c 61 67 73  nnection {;Flags
100d0 3d 24 7b 66 6c 61 67 73 7d 7d 0d 0a 20 20 20 20  =${flags}}..    
100e0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
100f0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
10100 20 6f 75 72 20 63 61 6c 6c 65 72 20 73 70 65 63   our caller spec
10110 69 66 69 65 64 20 61 6e 20 65 78 74 72 61 20 70  ified an extra p
10120 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 63 6f  ayload to the co
10130 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20  nnection..      
10140 23 20 20 20 20 20 20 20 73 74 72 69 6e 67 2c 20  #       string, 
10150 61 70 70 65 6e 64 20 69 74 20 6e 6f 77 2e 0d 0a  append it now...
10160 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
10170 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
10180 68 20 24 65 78 74 72 61 5d 20 3e 20 30 7d 20 74  h $extra] > 0} t
10190 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61  hen {..        a
101a0 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e  ppend connection
101b0 20 5c 3b 20 24 65 78 74 72 61 0d 0a 20 20 20 20   \; $extra..    
101c0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
101d0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4f 70        # NOTE: Op
101e0 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  en the database 
101f0 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 77 2c 20  connection now, 
10200 70 6c 61 63 69 6e 67 20 74 68 65 20 6f 70 61 71  placing the opaq
10210 75 65 20 68 61 6e 64 6c 65 20 76 61 6c 75 65 0d  ue handle value.
10220 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69  .      #       i
10230 6e 74 6f 20 74 68 65 20 76 61 72 69 61 62 6c 65  nto the variable
10240 20 73 70 65 63 69 66 69 65 64 20 62 79 20 6f 75   specified by ou
10250 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20  r caller...     
10260 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 64 62   #..      set db
10270 20 5b 73 71 6c 20 6f 70 65 6e 20 2d 74 79 70 65   [sql open -type
10280 20 53 51 4c 69 74 65 20 5b 73 75 62 73 74 20 24   SQLite [subst $
10290 63 6f 6e 6e 65 63 74 69 6f 6e 5d 5d 0d 0a 0d 0a  connection]]....
102a0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
102b0 20 4e 4f 54 45 3a 20 43 6f 6e 66 69 67 75 72 65   NOTE: Configure
102c0 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64   the temporary d
102d0 69 72 65 63 74 6f 72 79 20 66 6f 72 20 74 68 65  irectory for the
102e0 20 6e 65 77 6c 79 20 6f 70 65 6e 65 64 20 64 61   newly opened da
102f0 74 61 62 61 73 65 0d 0a 20 20 20 20 20 20 23 20  tabase..      # 
10300 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e        connection
10310 20 6e 6f 77 20 75 6e 6c 65 73 73 20 6f 75 72 20   now unless our 
10320 63 61 6c 6c 65 72 20 66 6f 72 62 69 64 73 20 69  caller forbids i
10330 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  t...      #..   
10340 20 20 20 69 66 20 7b 24 74 65 6d 70 6f 72 61 72     if {$temporar
10350 79 20 26 26 20 21 5b 69 6e 66 6f 20 65 78 69 73  y && ![info exis
10360 74 73 20 3a 3a 6e 6f 28 73 65 74 54 65 6d 70 6f  ts ::no(setTempo
10370 72 61 72 79 44 69 72 65 63 74 6f 72 79 29 5d 7d  raryDirectory)]}
10380 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
10390 20 73 71 6c 20 65 78 65 63 75 74 65 20 24 64 62   sql execute $db
103a0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
103b0 20 20 20 20 20 20 20 20 20 20 20 20 22 50 52 41              "PRA
103c0 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64  GMA temp_store_d
103d0 69 72 65 63 74 6f 72 79 20 3d 20 5c 22 22 20 5b  irectory = \"" [
103e0 67 65 74 54 65 6d 70 6f 72 61 72 79 44 69 72 65  getTemporaryDire
103f0 63 74 6f 72 79 5d 20 5c 22 5c 3b 5d 0d 0a 20 20  ctory] \"\;]..  
10400 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
10410 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
10420 50 65 72 66 6f 72 6d 20 61 6e 79 20 65 78 74 72  Perform any extr
10430 61 20 70 65 72 2d 63 6f 6e 6e 65 63 74 69 6f 6e  a per-connection
10440 20 73 65 74 75 70 20 66 6f 72 20 74 68 65 20 6e   setup for the n
10450 65 77 6c 79 20 6f 70 65 6e 65 64 0d 0a 20 20 20  ewly opened..   
10460 20 20 20 23 20 20 20 20 20 20 20 64 61 74 61 62     #       datab
10470 61 73 65 20 6e 6f 77 20 75 6e 6c 65 73 73 20 6f  ase now unless o
10480 75 72 20 63 61 6c 6c 65 72 20 66 6f 72 62 69 64  ur caller forbid
10490 73 20 69 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  s it...      #..
104a0 20 20 20 20 20 20 73 65 74 20 65 78 65 63 75 74        set execut
104b0 65 4f 6e 53 65 74 75 70 20 5b 67 65 74 45 78 65  eOnSetup [getExe
104c0 63 75 74 65 4f 6e 53 65 74 75 70 5d 0d 0a 0d 0a  cuteOnSetup]....
104d0 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
104e0 67 20 6c 65 6e 67 74 68 20 24 65 78 65 63 75 74  g length $execut
104f0 65 4f 6e 53 65 74 75 70 5d 20 3e 20 30 20 26 26  eOnSetup] > 0 &&
10500 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 21 5b   \..          ![
10510 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
10520 28 65 78 65 63 75 74 65 4f 6e 53 65 74 75 70 29  (executeOnSetup)
10530 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
10540 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
10550 4e 4f 54 45 3a 20 54 68 69 73 20 63 6f 6d 6d 61  NOTE: This comma
10560 6e 64 20 6d 61 79 20 72 61 69 73 65 20 61 6e 20  nd may raise an 
10570 65 72 72 6f 72 3b 20 69 66 20 73 6f 2c 20 74 68  error; if so, th
10580 61 74 20 69 73 20 66 69 6e 65 2c 20 61 73 0d 0a  at is fine, as..
10590 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
105a0 74 68 65 20 65 6e 63 6c 6f 73 69 6e 67 20 74 65  the enclosing te
105b0 73 74 20 77 69 6c 6c 20 74 68 65 6e 20 66 61 69  st will then fai
105c0 6c 2e 20 20 54 68 65 20 5b 73 75 62 73 74 5d 20  l.  The [subst] 
105d0 63 6f 6d 6d 61 6e 64 20 69 73 0d 0a 20 20 20 20  command is..    
105e0 20 20 20 20 23 20 20 20 20 20 20 20 75 73 65 64      #       used
105f0 20 6f 6e 20 74 68 65 20 53 51 4c 20 69 6e 20 63   on the SQL in c
10600 61 73 65 20 69 74 20 6e 65 65 64 73 20 74 6f 20  ase it needs to 
10610 72 65 66 65 72 20 74 6f 20 73 74 61 74 65 20 69  refer to state i
10620 6e 20 6f 75 72 0d 0a 20 20 20 20 20 20 20 20 23  n our..        #
10630 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2e 0d         context..
10640 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
10650 20 20 20 20 73 71 6c 20 65 78 65 63 75 74 65 20      sql execute 
10660 24 64 62 20 5b 73 75 62 73 74 20 24 65 78 65 63  $db [subst $exec
10670 75 74 65 4f 6e 53 65 74 75 70 5d 0d 0a 20 20 20  uteOnSetup]..   
10680 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
10690 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41  .      # NOTE: A
106a0 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74 68 65  lways return the
106b0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64   connection hand
106c0 6c 65 20 75 70 6f 6e 20 73 75 63 63 65 73 73 2e  le upon success.
106d0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
106e0 20 72 65 74 75 72 6e 20 24 64 62 0d 0a 20 20 20   return $db..   
106f0 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
10700 67 65 74 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20  getDbConnection 
10710 7b 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20 7d  { {varName db} }
10720 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
10730 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72     # NOTE: Refer
10740 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65   to the specifie
10750 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e  d variable (e.g.
10760 20 22 64 62 22 29 20 69 6e 20 74 68 65 20 63 6f   "db") in the co
10770 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20  ntext of our..  
10780 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c      #       call
10790 65 72 2e 20 20 54 68 65 20 68 61 6e 64 6c 65 20  er.  The handle 
107a0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
107b0 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65  previously opene
107c0 64 20 76 69 61 20 74 68 65 0d 0a 20 20 20 20 20  d via the..     
107d0 20 23 20 20 20 20 20 20 20 5b 73 65 74 75 70 44   #       [setupD
107e0 62 5d 20 70 72 6f 63 65 64 75 72 65 20 73 68 6f  b] procedure sho
107f0 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20 74 68  uld be stored th
10800 65 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ere...      #.. 
10810 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61       upvar 1 $va
10820 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20  rName db....    
10830 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
10840 45 3a 20 54 68 69 73 20 72 65 74 75 72 6e 73 20  E: This returns 
10850 74 68 65 20 41 44 4f 2e 4e 45 54 20 49 44 62 43  the ADO.NET IDbC
10860 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 6a 65 63 74  onnection object
10870 20 69 6e 73 74 61 6e 63 65 20 66 6f 72 20 74 68   instance for th
10880 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
10890 20 73 70 65 63 69 66 69 65 64 20 64 61 74 61 62   specified datab
108a0 73 65 20 68 61 6e 64 6c 65 2e 20 20 53 69 6e 63  se handle.  Sinc
108b0 65 20 67 65 74 74 69 6e 67 20 74 68 69 73 20 6f  e getting this o
108c0 62 6a 65 63 74 20 72 65 6c 69 65 73 20 75 70 6f  bject relies upo
108d0 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  n..      #      
108e0 20 45 61 67 6c 65 20 69 6e 74 65 72 6e 61 6c 73   Eagle internals
108f0 2c 20 67 72 65 61 74 20 63 61 72 65 20 73 68 6f  , great care sho
10900 75 6c 64 20 62 65 20 74 61 6b 65 6e 20 74 6f 20  uld be taken to 
10910 61 76 6f 69 64 20 64 69 73 70 6f 73 69 6e 67 20  avoid disposing 
10920 6f 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  of..      #     
10930 20 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72    this object or
10940 20 6f 74 68 65 72 77 69 73 65 20 70 75 74 74 69   otherwise putti
10950 6e 67 20 69 74 20 69 6e 74 6f 20 61 6e 20 69 6e  ng it into an in
10960 76 61 6c 69 64 20 73 74 61 74 65 2e 0d 0a 20 20  valid state...  
10970 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
10980 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 64 62  {[info exists db
10990 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
109a0 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
109b0 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
109c0 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
109d0 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d 6f 62 6a 65  +NonPublic -obje
109e0 63 74 66 6c 61 67 73 20 2b 4e 6f 44 69 73 70 6f  ctflags +NoDispo
109f0 73 65 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20  se -alias \..   
10a00 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 72             Inter
10a10 70 72 65 74 65 72 2e 47 65 74 41 63 74 69 76 65  preter.GetActive
10a20 2e 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 49 74 65  .connections Ite
10a30 6d 20 24 64 62 0d 0a 20 20 20 20 20 20 20 20 7d  m $db..        }
10a40 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74   result] == 0} t
10a50 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
10a60 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
10a70 4e 4f 54 45 3a 20 53 75 63 63 65 73 73 2c 20 72  NOTE: Success, r
10a80 65 74 75 72 6e 20 74 68 65 20 6f 70 61 71 75 65  eturn the opaque
10a90 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 2e 0d   object handle..
10aa0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
10ab0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
10ac0 72 65 73 75 6c 74 0d 0a 20 20 20 20 20 20 20 20  result..        
10ad0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
10ae0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
10af0 20 23 20 4e 4f 54 45 3a 20 46 61 69 6c 75 72 65   # NOTE: Failure
10b00 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20  , report why... 
10b10 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
10b20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
10b30 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
10b40 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
10b50 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
10b60 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
10b70 6f 20 67 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e  o get connection
10b80 20 68 61 6e 64 6c 65 20 66 6f 72 20 64 61 74 61   handle for data
10b90 62 61 73 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20  base \"" \..    
10ba0 20 20 20 20 20 20 20 20 20 20 24 64 62 20 22 5c            $db "\
10bb0 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  ", error: " \n\t
10bc0 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20   $result \n]..  
10bd0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
10be0 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
10bf0 70 72 6f 63 20 66 72 65 65 44 62 43 6f 6e 6e 65  proc freeDbConne
10c00 63 74 69 6f 6e 20 7b 20 7b 76 61 72 4e 61 6d 65  ction { {varName
10c10 20 63 6f 6e 6e 65 63 74 69 6f 6e 7d 20 7d 20 7b   connection} } {
10c20 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
10c30 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74   # NOTE: Refer t
10c40 6f 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  o the specified 
10c50 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22  variable (e.g. "
10c60 63 6f 6e 6e 65 63 74 69 6f 6e 22 29 20 69 6e 20  connection") in 
10c70 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
10c80 20 20 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75     context of ou
10c90 72 20 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 6f  r caller.  The o
10ca0 70 61 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e  paque object han
10cb0 64 6c 65 20 66 6f 72 20 61 6e 20 41 44 4f 2e 4e  dle for an ADO.N
10cc0 45 54 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ET..      #     
10cd0 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 65    connection pre
10ce0 76 69 6f 75 73 6c 79 20 72 65 74 75 72 6e 65 64  viously returned
10cf0 20 62 79 20 5b 67 65 74 44 62 43 6f 6e 6e 65 63   by [getDbConnec
10d00 74 69 6f 6e 5d 20 73 68 6f 75 6c 64 20 62 65 0d  tion] should be.
10d10 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
10d20 74 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a 20 20  tored there...  
10d30 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76      #..      upv
10d40 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 63 6f  ar 1 $varName co
10d50 6e 6e 65 63 74 69 6f 6e 0d 0a 0d 0a 20 20 20 20  nnection....    
10d60 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
10d70 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 72 65  E: Attempt to re
10d80 6d 6f 76 65 20 74 68 65 20 6f 70 61 71 75 65 20  move the opaque 
10d90 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 66 72  object handle fr
10da0 6f 6d 20 74 68 65 20 69 6e 74 65 72 70 72 65 74  om the interpret
10db0 65 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  er..      #     
10dc0 20 20 6e 6f 77 2e 20 20 54 68 69 73 20 5b 6f 62    now.  This [ob
10dd0 6a 65 63 74 20 64 69 73 70 6f 73 65 5d 20 63 61  ject dispose] ca
10de0 6c 6c 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75  ll will not actu
10df0 61 6c 6c 79 20 64 69 73 70 6f 73 65 20 6f 66 20  ally dispose of 
10e00 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
10e10 20 20 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 62     underlying ob
10e20 6a 65 63 74 20 62 65 63 61 75 73 65 20 74 68 65  ject because the
10e30 20 2b 4e 6f 44 69 73 70 6f 73 65 20 66 6c 61 67   +NoDispose flag
10e40 20 77 61 73 20 73 65 74 20 6f 6e 20 69 74 0d 0a   was set on it..
10e50 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 75        #       du
10e60 72 69 6e 67 20 63 72 65 61 74 69 6f 6e 20 6f 66  ring creation of
10e70 20 74 68 65 20 6f 70 61 71 75 65 20 6f 62 6a 65   the opaque obje
10e80 63 74 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20  ct handle...    
10e90 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
10ea0 69 6e 66 6f 20 65 78 69 73 74 73 20 63 6f 6e 6e  info exists conn
10eb0 65 63 74 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20 20  ection] && \..  
10ec0 20 20 20 20 20 20 20 20 5b 63 61 74 63 68 20 7b          [catch {
10ed0 6f 62 6a 65 63 74 20 64 69 73 70 6f 73 65 20 24  object dispose $
10ee0 63 6f 6e 6e 65 63 74 69 6f 6e 7d 20 65 72 72 6f  connection} erro
10ef0 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  r]} then {..    
10f00 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
10f10 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f   NOTE: We someho
10f20 77 20 66 61 69 6c 65 64 20 74 6f 20 72 65 6d 6f  w failed to remo
10f30 76 65 20 74 68 65 20 68 61 6e 64 6c 65 2c 20 72  ve the handle, r
10f40 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20  eport why...    
10f50 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74      #..        t
10f60 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
10f70 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
10f80 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
10f90 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
10fa0 61 69 6c 65 64 20 74 6f 20 72 65 6d 6f 76 65 20  ailed to remove 
10fb0 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c  connection handl
10fc0 65 20 5c 22 22 20 24 63 6f 6e 6e 65 63 74 69 6f  e \"" $connectio
10fd0 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
10fe0 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c   "\", error: " \
10ff0 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a  n\t $error \n]..
11000 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
11010 0c 0d 0a 20 20 20 20 70 72 6f 63 20 61 64 64 44  ...    proc addD
11020 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20 63 6f  bConnection { co
11030 6e 6e 65 63 74 69 6f 6e 20 7b 76 61 72 4e 61 6d  nnection {varNam
11040 65 20 64 62 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  e db} } {..     
11050 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
11060 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 73  : Refer to the s
11070 70 65 63 69 66 69 65 64 20 76 61 72 69 61 62 6c  pecified variabl
11080 65 20 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e  e (e.g. "db") in
11090 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20   the context of 
110a0 6f 75 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20  our..      #    
110b0 20 20 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20     caller...    
110c0 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72    #..      upvar
110d0 20 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a   1 $varName db..
110e0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
110f0 20 23 20 4e 4f 54 45 3a 20 43 72 65 61 74 65 20   # NOTE: Create 
11100 61 20 63 6f 72 72 65 63 74 6c 79 20 66 6f 72 6d  a correctly form
11110 61 74 74 65 64 20 6e 61 6d 65 20 66 6f 72 20 74  atted name for t
11120 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
11130 65 63 74 69 6f 6e 20 74 6f 0d 0a 20 20 20 20 20  ection to..     
11140 20 23 20 20 20 20 20 20 20 62 65 20 61 64 64 65   #       be adde
11150 64 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6d 61  d to the list ma
11160 6e 61 67 65 64 20 62 79 20 74 68 65 20 45 61 67  naged by the Eag
11170 6c 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d  le interpreter..
11180 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
11190 73 65 74 20 64 62 20 5b 6f 62 6a 65 63 74 20 69  set db [object i
111a0 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
111b0 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
111c0 20 20 20 20 20 45 61 67 6c 65 2e 5f 43 6f 6d 70       Eagle._Comp
111d0 6f 6e 65 6e 74 73 2e 50 72 69 76 61 74 65 2e 46  onents.Private.F
111e0 6f 72 6d 61 74 4f 70 73 20 44 61 74 61 62 61 73  ormatOps Databas
111f0 65 4f 62 6a 65 63 74 4e 61 6d 65 20 24 63 6f 6e  eObjectName $con
11200 6e 65 63 74 69 6f 6e 20 5c 0d 0a 20 20 20 20 20  nection \..     
11210 20 20 20 20 20 53 51 4c 69 74 65 43 6f 6e 6e 65       SQLiteConne
11220 63 74 69 6f 6e 20 5b 6f 62 6a 65 63 74 20 69 6e  ction [object in
11230 76 6f 6b 65 20 49 6e 74 65 72 70 72 65 74 65 72  voke Interpreter
11240 2e 47 65 74 41 63 74 69 76 65 20 4e 65 78 74 49  .GetActive NextI
11250 64 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  d]]....      #..
11260 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64        # NOTE: Ad
11270 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  d the database c
11280 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 76 69 64  onnection provid
11290 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72  ed by our caller
112a0 20 74 6f 20 74 68 65 20 6c 69 73 74 0d 0a 20 20   to the list..  
112b0 20 20 20 20 23 20 20 20 20 20 20 20 6f 66 20 74      #       of t
112c0 68 6f 73 65 20 6b 6e 6f 77 6e 20 74 6f 20 74 68  hose known to th
112d0 65 20 45 61 67 6c 65 20 69 6e 74 65 72 70 72 65  e Eagle interpre
112e0 74 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ter...      #.. 
112f0 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
11300 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
11310 62 6c 69 63 20 49 6e 74 65 72 70 72 65 74 65 72  blic Interpreter
11320 2e 47 65 74 41 63 74 69 76 65 2e 63 6f 6e 6e 65  .GetActive.conne
11330 63 74 69 6f 6e 73 20 41 64 64 20 5c 0d 0a 20 20  ctions Add \..  
11340 20 20 20 20 20 20 20 20 24 64 62 20 24 63 6f 6e          $db $con
11350 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20 7d 0d 0a  nection..    }..
11360 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 52  ...    proc getR
11370 6f 77 73 46 72 6f 6d 44 61 74 61 54 61 62 6c 65  owsFromDataTable
11380 20 7b 20 64 61 74 61 54 61 62 6c 65 20 7d 20 7b   { dataTable } {
11390 0d 0a 20 20 20 20 20 20 73 65 74 20 72 6f 77 73  ..      set rows
113a0 20 5b 6c 69 73 74 5d 0d 0a 20 20 20 20 20 20 73   [list]..      s
113b0 65 74 20 63 6f 75 6e 74 20 5b 24 64 61 74 61 54  et count [$dataT
113c0 61 62 6c 65 20 43 6f 6c 75 6d 6e 73 2e 43 6f 75  able Columns.Cou
113d0 6e 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72  nt]....      for
113e0 20 7b 73 65 74 20 69 6e 64 65 78 20 30 7d 20 7b   {set index 0} {
113f0 24 69 6e 64 65 78 20 3c 20 24 63 6f 75 6e 74 7d  $index < $count}
11400 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d   {incr index} {.
11410 0a 20 20 20 20 20 20 20 20 73 65 74 20 64 61 74  .        set dat
11420 61 43 6f 6c 75 6d 6e 20 5b 24 64 61 74 61 54 61  aColumn [$dataTa
11430 62 6c 65 20 2d 61 6c 69 61 73 20 43 6f 6c 75 6d  ble -alias Colum
11440 6e 73 2e 67 65 74 5f 49 74 65 6d 20 24 69 6e 64  ns.get_Item $ind
11450 65 78 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74  ex]..        set
11460 20 6e 61 6d 65 73 28 24 69 6e 64 65 78 29 20 5b   names($index) [
11470 24 64 61 74 61 43 6f 6c 75 6d 6e 20 43 6f 6c 75  $dataColumn Colu
11480 6d 6e 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 7d  mnName]..      }
11490 0d 0a 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63 74  ....      object
114a0 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20   foreach -alias 
114b0 64 61 74 61 52 6f 77 20 5b 73 65 74 20 64 61 74  dataRow [set dat
114c0 61 52 6f 77 73 20 5b 24 64 61 74 61 54 61 62 6c  aRows [$dataTabl
114d0 65 20 52 6f 77 73 5d 5d 20 7b 0d 0a 20 20 20 20  e Rows]] {..    
114e0 20 20 20 20 73 65 74 20 72 6f 77 20 5b 6c 69 73      set row [lis
114f0 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 66 6f  t]....        fo
11500 72 20 7b 73 65 74 20 69 6e 64 65 78 20 30 7d 20  r {set index 0} 
11510 7b 24 69 6e 64 65 78 20 3c 20 24 63 6f 75 6e 74  {$index < $count
11520 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b  } {incr index} {
11530 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
11540 76 61 6c 75 65 20 5b 24 64 61 74 61 52 6f 77 20  value [$dataRow 
11550 2d 63 72 65 61 74 65 20 2d 61 6c 69 61 73 20 67  -create -alias g
11560 65 74 5f 49 74 65 6d 20 24 69 6e 64 65 78 5d 0d  et_Item $index].
11570 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
11580 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
11590 24 76 61 6c 75 65 5d 20 3e 20 30 20 26 26 20 5c  $value] > 0 && \
115a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
115b0 21 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20  ![object invoke 
115c0 43 6f 6e 76 65 72 74 20 49 73 44 42 4e 75 6c 6c  Convert IsDBNull
115d0 20 24 76 61 6c 75 65 5d 7d 20 74 68 65 6e 20 7b   $value]} then {
115e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 61  ..            la
115f0 70 70 65 6e 64 20 72 6f 77 20 5b 6c 69 73 74 20  ppend row [list 
11600 24 6e 61 6d 65 73 28 24 69 6e 64 65 78 29 20 5b  $names($index) [
11610 24 76 61 6c 75 65 20 54 6f 53 74 72 69 6e 67 5d  $value ToString]
11620 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  ]..          } e
11630 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
11640 20 20 20 6c 61 70 70 65 6e 64 20 72 6f 77 20 5b     lappend row [
11650 6c 69 73 74 20 24 6e 61 6d 65 73 28 24 69 6e 64  list $names($ind
11660 65 78 29 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  ex)]..          
11670 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
11680 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
11690 72 6f 77 73 20 24 72 6f 77 0d 0a 20 20 20 20 20  rows $row..     
116a0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
116b0 72 6e 20 24 72 6f 77 73 0d 0a 20 20 20 20 7d 0d  rn $rows..    }.
116c0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 64 75 6d  ....    proc dum
116d0 70 52 6f 77 73 46 72 6f 6d 44 61 74 61 54 61 62  pRowsFromDataTab
116e0 6c 65 20 7b 20 63 68 61 6e 6e 65 6c 20 72 6f 77  le { channel row
116f0 73 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  s } {..      set
11700 20 73 65 71 75 65 6e 63 65 20 31 0d 0a 0d 0a 20   sequence 1.... 
11710 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
11720 20 24 72 6f 77 73 20 7b 0d 0a 20 20 20 20 20 20   $rows {..      
11730 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
11740 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
11750 20 20 20 20 20 20 20 20 20 20 20 20 5b 65 78 70              [exp
11760 72 20 7b 24 73 65 71 75 65 6e 63 65 20 3e 20 31  r {$sequence > 1
11770 20 3f 20 22 5c 6e 22 20 3a 20 22 22 7d 5d 20 22   ? "\n" : ""}] "
11780 2d 2d 2d 2d 20 52 4f 57 20 23 22 20 24 73 65 71  ---- ROW #" $seq
11790 75 65 6e 63 65 20 3a 5c 6e 5d 0d 0a 0d 0a 20 20  uence :\n]....  
117a0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 70 61        foreach pa
117b0 69 72 20 24 72 6f 77 20 7b 0d 0a 20 20 20 20 20  ir $row {..     
117c0 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74       if {[llengt
117d0 68 20 24 70 61 69 72 5d 20 3e 3d 20 32 7d 20 74  h $pair] >= 2} t
117e0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
117f0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
11800 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 74  l [appendArgs \t
11810 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
11820 20 20 20 20 5b 6c 69 73 74 20 5b 6c 69 6e 64 65      [list [linde
11830 78 20 24 70 61 69 72 20 30 5d 5d 20 22 3a 20 22  x $pair 0]] ": "
11840 20 5b 6c 69 73 74 20 5b 6c 69 6e 64 65 78 20 24   [list [lindex $
11850 70 61 69 72 20 31 5d 5d 20 5c 6e 5d 0d 0a 20 20  pair 1]] \n]..  
11860 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66          } elseif
11870 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 70 61 69 72   {[llength $pair
11880 5d 20 3d 3d 20 31 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 1} then {..
11890 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
118a0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
118b0 6e 64 41 72 67 73 20 5c 74 20 5c 0d 0a 20 20 20  ndArgs \t \..   
118c0 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 6c 69               [li
118d0 73 74 20 5b 6c 69 6e 64 65 78 20 24 70 61 69 72  st [lindex $pair
118e0 20 30 5d 5d 20 22 3a 20 3c 6e 75 6c 6c 3e 5c 6e   0]] ": <null>\n
118f0 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  "]..          } 
11900 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
11910 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
11920 65 6c 20 5c 74 3c 65 6d 70 74 79 3e 5c 6e 3b 20  el \t<empty>\n; 
11930 23 20 4e 4f 54 45 3a 20 4e 6f 20 64 61 74 61 3f  # NOTE: No data?
11940 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
11950 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
11960 20 20 20 20 69 6e 63 72 20 73 65 71 75 65 6e 63      incr sequenc
11970 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  e..      }..    
11980 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
11990 6c 65 61 6e 75 70 44 62 20 7b 20 66 69 6c 65 4e  leanupDb { fileN
119a0 61 6d 65 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d  ame {varName db}
119b0 20 7b 63 6f 6c 6c 65 63 74 20 74 72 75 65 7d 20   {collect true} 
119c0 7b 71 75 61 6c 69 66 79 20 74 72 75 65 7d 0d 0a  {qualify true}..
119d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119e0 20 20 20 20 20 7b 64 65 6c 65 74 65 20 74 72 75       {delete tru
119f0 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e} } {..      #.
11a00 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41  .      # NOTE: A
11a10 74 74 65 6d 70 74 20 74 6f 20 66 6f 72 63 65 20  ttempt to force 
11a20 61 6c 6c 20 70 65 6e 64 69 6e 67 20 22 67 61 72  all pending "gar
11a30 62 61 67 65 22 20 6f 62 6a 65 63 74 73 20 74 6f  bage" objects to
11a40 20 62 65 20 63 6f 6c 6c 65 63 74 65 64 2c 0d 0a   be collected,..
11a50 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e        #       in
11a60 63 6c 75 64 69 6e 67 20 53 51 4c 69 74 65 20 73  cluding SQLite s
11a70 74 61 74 65 6d 65 6e 74 73 20 61 6e 64 20 62 61  tatements and ba
11a80 63 6b 75 70 20 6f 62 6a 65 63 74 73 3b 20 74 68  ckup objects; th
11a90 69 73 20 73 68 6f 75 6c 64 20 61 6c 6c 6f 77 0d  is should allow.
11aa0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
11ab0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61  he underlying da
11ac0 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 62  tabase file to b
11ad0 65 20 64 65 6c 65 74 65 64 2e 0d 0a 20 20 20 20  e deleted...    
11ae0 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24    #..      if {$
11af0 63 6f 6c 6c 65 63 74 7d 20 74 68 65 6e 20 7b 0d  collect} then {.
11b00 0a 20 20 20 20 20 20 20 20 63 6f 6c 6c 65 63 74  .        collect
11b10 47 61 72 62 61 67 65 20 24 3a 3a 74 65 73 74 5f  Garbage $::test_
11b20 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20 20 7d  channel..      }
11b30 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
11b40 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72     # NOTE: Refer
11b50 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65   to the specifie
11b60 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e  d variable (e.g.
11b70 20 22 64 62 22 29 20 69 6e 20 74 68 65 20 63 6f   "db") in the co
11b80 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20  ntext of our..  
11b90 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c      #       call
11ba0 65 72 2e 20 20 54 68 65 20 68 61 6e 64 6c 65 20  er.  The handle 
11bb0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
11bc0 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65  previously opene
11bd0 64 20 76 69 61 20 74 68 65 0d 0a 20 20 20 20 20  d via the..     
11be0 20 23 20 20 20 20 20 20 20 5b 73 65 74 75 70 44   #       [setupD
11bf0 62 5d 20 70 72 6f 63 65 64 75 72 65 20 73 68 6f  b] procedure sho
11c00 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20 74 68  uld be stored th
11c10 65 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ere...      #.. 
11c20 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61       upvar 1 $va
11c30 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20  rName db....    
11c40 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
11c50 45 3a 20 43 6c 6f 73 65 20 74 68 65 20 63 6f 6e  E: Close the con
11c60 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 64  nection to the d
11c70 61 74 61 62 61 73 65 20 6e 6f 77 2e 20 20 54 68  atabase now.  Th
11c80 69 73 20 73 68 6f 75 6c 64 20 61 6c 6c 6f 77 20  is should allow 
11c90 75 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  us..      #     
11ca0 20 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20    to delete the 
11cb0 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62  underlying datab
11cc0 61 73 65 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20  ase file...     
11cd0 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
11ce0 6e 66 6f 20 65 78 69 73 74 73 20 64 62 5d 20 26  nfo exists db] &
11cf0 26 20 5b 63 61 74 63 68 20 7b 73 71 6c 20 63 6c  & [catch {sql cl
11d00 6f 73 65 20 24 64 62 7d 20 65 72 72 6f 72 5d 7d  ose $db} error]}
11d10 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
11d20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
11d30 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20 66  TE: We somehow f
11d40 61 69 6c 65 64 20 74 6f 20 63 6c 6f 73 65 20 74  ailed to close t
11d50 68 65 20 64 61 74 61 62 61 73 65 2c 20 72 65 70  he database, rep
11d60 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20  ort why...      
11d70 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75    #..        tpu
11d80 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
11d90 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
11da0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 3d  ..            "=
11db0 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
11dc0 6c 65 64 20 74 6f 20 63 6c 6f 73 65 20 64 61 74  led to close dat
11dd0 61 62 61 73 65 20 5c 22 22 20 24 64 62 20 22 5c  abase \"" $db "\
11de0 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20  ", error: " \.. 
11df0 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20             \n\t 
11e00 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20  $error \n]..    
11e10 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
11e20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69        # NOTE: Fi
11e30 72 73 74 2c 20 73 65 65 20 69 66 20 6f 75 72 20  rst, see if our 
11e40 63 61 6c 6c 65 72 20 68 61 73 20 72 65 71 75 65  caller has reque
11e50 73 74 65 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  sted an in-memor
11e60 79 20 64 61 74 61 62 61 73 65 2e 0d 0a 20 20 20  y database...   
11e70 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
11e80 69 73 4d 65 6d 6f 72 79 20 5b 69 73 4d 65 6d 6f  isMemory [isMemo
11e90 72 79 44 62 20 24 66 69 6c 65 4e 61 6d 65 5d 0d  ryDb $fileName].
11ea0 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
11eb0 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20    # NOTE: Build 
11ec0 74 68 65 20 66 75 6c 6c 20 70 61 74 68 20 74 6f  the full path to
11ed0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
11ee0 6c 65 20 6e 61 6d 65 2e 20 20 46 6f 72 20 6e 6f  le name.  For no
11ef0 77 2c 20 61 6c 6c 20 74 65 73 74 0d 0a 20 20 20  w, all test..   
11f00 20 20 20 23 20 20 20 20 20 20 20 64 61 74 61 62     #       datab
11f10 61 73 65 20 66 69 6c 65 73 20 61 72 65 20 73 74  ase files are st
11f20 6f 72 65 64 20 69 6e 20 74 68 65 20 74 65 6d 70  ored in the temp
11f30 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 2e  orary directory.
11f40 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
11f50 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72 79 20   if {!$isMemory 
11f60 26 26 20 24 71 75 61 6c 69 66 79 7d 20 74 68 65  && $qualify} the
11f70 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  n {..        set
11f80 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20   fileName [file 
11f90 6a 6f 69 6e 20 5b 67 65 74 44 61 74 61 62 61 73  join [getDatabas
11fa0 65 44 69 72 65 63 74 6f 72 79 5d 20 5b 66 69 6c  eDirectory] [fil
11fb0 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65  e tail $fileName
11fc0 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ]]..      }.... 
11fd0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
11fe0 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74  NOTE: Check if t
11ff0 68 65 20 66 69 6c 65 20 73 74 69 6c 6c 20 65 78  he file still ex
12000 69 73 74 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ists...      #..
12010 20 20 20 20 20 20 69 66 20 7b 21 24 69 73 4d 65        if {!$isMe
12020 6d 6f 72 79 20 26 26 20 24 64 65 6c 65 74 65 20  mory && $delete 
12030 26 26 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20  && [file exists 
12040 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  $fileName]} then
12050 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
12060 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
12070 6b 69 70 20 64 65 6c 65 74 69 6e 67 20 64 61 74  kip deleting dat
12080 61 62 61 73 65 20 66 69 6c 65 73 20 69 66 20 73  abase files if s
12090 6f 6d 65 62 6f 64 79 20 73 65 74 73 20 74 68 65  omebody sets the
120a0 20 67 6c 6f 62 61 6c 0d 0a 20 20 20 20 20 20 20   global..       
120b0 20 23 20 20 20 20 20 20 20 76 61 72 69 61 62 6c   #       variabl
120c0 65 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74 2e  e to prevent it.
120d0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
120e0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
120f0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6c 65 61  exists ::no(clea
12100 6e 75 70 44 62 46 69 6c 65 29 5d 7d 20 74 68 65  nupDbFile)]} the
12110 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  n {..          #
12120 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
12130 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 64  TE: Attempt to d
12140 65 6c 65 74 65 20 74 68 65 20 74 65 73 74 20 64  elete the test d
12150 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 6f 77  atabase file now
12160 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
12170 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73            if {[s
12180 65 74 20 63 6f 64 65 20 5b 63 61 74 63 68 20 7b  et code [catch {
12190 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66 69 6c  file delete $fil
121a0 65 4e 61 6d 65 7d 20 65 72 72 6f 72 5d 5d 7d 20  eName} error]]} 
121b0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
121c0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
121d0 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f     # NOTE: We so
121e0 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f 20  mehow failed to 
121f0 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 2c  delete the file,
12200 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20   report why...  
12210 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
12220 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
12230 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
12240 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
12250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
12260 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
12270 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 64 61  led to delete da
12280 74 61 62 61 73 65 20 66 69 6c 65 20 5c 22 22 20  tabase file \"" 
12290 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20  $fileName \..   
122a0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22               "\"
122b0 20 64 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 2c   during cleanup,
122c0 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24   error: " \n\t $
122d0 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20  error \n]..     
122e0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
122f0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
12300 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
12310 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68   # NOTE: Show th
12320 61 74 20 77 65 20 73 6b 69 70 70 65 64 20 64 65  at we skipped de
12330 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c 65 2e  leting the file.
12340 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
12350 20 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 64           set cod
12360 65 20 30 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  e 0....         
12370 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
12380 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
12390 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
123a0 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
123b0 47 3a 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74  G: skipped delet
123c0 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
123d0 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20  e \"" $fileName 
123e0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
123f0 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c 65 61   "\" during clea
12400 6e 75 70 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  nup\n"]..       
12410 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65   }..      } else
12420 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
12430 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54         # NOTE: T
12440 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
12450 20 65 78 69 73 74 2c 20 73 75 63 63 65 73 73 21   exist, success!
12460 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
12470 20 20 20 20 20 73 65 74 20 63 6f 64 65 20 30 0d       set code 0.
12480 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
12490 20 20 72 65 74 75 72 6e 20 24 63 6f 64 65 0d 0a    return $code..
124a0 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
124b0 6f 63 20 73 65 74 75 70 44 62 49 6e 74 65 72 72  oc setupDbInterr
124c0 75 70 74 43 61 6c 6c 62 61 63 6b 20 7b 20 63 68  uptCallback { ch
124d0 61 6e 6e 65 6c 20 6c 6f 67 20 7d 20 7b 0d 0a 20  annel log } {.. 
124e0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
124f0 6e 65 6c 20 22 2d 2d 2d 2d 20 73 65 74 74 69 6e  nel "---- settin
12500 67 20 75 70 20 64 65 62 75 67 67 65 72 20 69 6e  g up debugger in
12510 74 65 72 72 75 70 74 20 63 61 6c 6c 62 61 63 6b  terrupt callback
12520 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69  ... "....      i
12530 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
12540 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
12550 23 20 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75 72  # NOTE: Make sur
12560 65 20 74 68 65 20 73 63 72 69 70 74 20 64 65 62  e the script deb
12570 75 67 67 65 72 20 61 6e 64 20 74 68 65 20 69 73  ugger and the is
12580 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72 65 74  olated interpret
12590 65 72 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20  er are..        
125a0 23 20 20 20 20 20 20 20 73 65 74 75 70 20 61 6e  #       setup an
125b0 64 20 72 65 61 64 79 20 66 6f 72 20 75 73 65 2e  d ready for use.
125c0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
125d0 20 20 20 20 20 64 65 62 75 67 20 73 65 74 75 70       debug setup
125e0 20 74 72 75 65 20 74 72 75 65 0d 0a 0d 0a 20 20   true true....  
125f0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
12600 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 74 68   # NOTE: Load th
12610 65 20 6e 65 63 65 73 73 61 72 79 20 70 61 63 6b  e necessary pack
12620 61 67 65 73 20 69 6e 74 6f 20 74 68 65 20 69 73  ages into the is
12630 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72 65 74  olated interpret
12640 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  er...        #..
12650 20 20 20 20 20 20 20 20 64 65 62 75 67 20 65 76          debug ev
12660 61 6c 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  al {..          
12670 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20  package require 
12680 45 61 67 6c 65 0d 0a 20 20 20 20 20 20 20 20 20  Eagle..         
12690 20 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65   package require
126a0 20 45 61 67 6c 65 2e 4c 69 62 72 61 72 79 0d 0a   Eagle.Library..
126b0 20 20 20 20 20 20 20 20 20 20 70 61 63 6b 61 67            packag
126c0 65 20 72 65 71 75 69 72 65 20 45 61 67 6c 65 2e  e require Eagle.
126d0 54 65 73 74 0d 0a 20 20 20 20 20 20 20 20 7d 0d  Test..        }.
126e0 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
126f0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f        # NOTE: Co
12700 70 79 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  py the necessary
12710 20 76 61 72 69 61 62 6c 65 73 20 69 6e 74 6f 20   variables into 
12720 74 68 65 20 69 73 6f 6c 61 74 65 64 20 69 6e 74  the isolated int
12730 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20  erpreter...     
12740 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 64 65     #..        de
12750 62 75 67 20 69 6e 76 6f 6b 65 20 30 20 73 65 74  bug invoke 0 set
12760 20 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20   ::test_channel 
12770 24 63 68 61 6e 6e 65 6c 3b 20 23 20 4e 4f 54 45  $channel; # NOTE
12780 3a 20 46 6f 72 20 5b 74 70 75 74 73 5d 2e 0d 0a  : For [tputs]...
12790 20 20 20 20 20 20 20 20 64 65 62 75 67 20 69 6e          debug in
127a0 76 6f 6b 65 20 30 20 73 65 74 20 3a 3a 74 65 73  voke 0 set ::tes
127b0 74 5f 6c 6f 67 20 24 6c 6f 67 3b 20 23 20 4e 4f  t_log $log; # NO
127c0 54 45 3a 20 46 6f 72 20 5b 74 6c 6f 67 5d 2e 0d  TE: For [tlog]..
127d0 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
127e0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 6e        # NOTE: In
127f0 73 74 61 6c 6c 20 74 68 65 20 63 61 6c 6c 62 61  stall the callba
12800 63 6b 20 73 63 72 69 70 74 20 74 6f 20 62 65 20  ck script to be 
12810 65 76 61 6c 75 61 74 65 64 20 69 6e 20 74 68 65  evaluated in the
12820 20 69 73 6f 6c 61 74 65 64 0d 0a 20 20 20 20 20   isolated..     
12830 20 20 20 23 20 20 20 20 20 20 20 69 6e 74 65 72     #       inter
12840 70 72 65 74 65 72 20 77 68 65 6e 20 74 68 69 73  preter when this
12850 20 69 6e 74 65 72 70 72 65 74 65 72 20 69 73 20   interpreter is 
12860 69 6e 74 65 72 72 75 70 74 65 64 20 62 79 20 73  interrupted by s
12870 63 72 69 70 74 0d 0a 20 20 20 20 20 20 20 20 23  cript..        #
12880 20 20 20 20 20 20 20 63 61 6e 63 65 6c 6c 61 74         cancellat
12890 69 6f 6e 2c 20 65 74 63 2e 0d 0a 20 20 20 20 20  ion, etc...     
128a0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 64 65     #..        de
128b0 62 75 67 20 63 61 6c 6c 62 61 63 6b 20 61 70 70  bug callback app
128c0 6c 79 20 7b 7b 73 65 6e 64 65 72 20 65 7d 20 7b  ly {{sender e} {
128d0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
128e0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
128f0 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 63   Check if this c
12900 61 6c 6c 62 61 63 6b 20 69 73 20 6f 6e 65 20 74  allback is one t
12910 68 61 74 20 77 65 20 63 61 72 65 20 61 62 6f 75  hat we care abou
12920 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  t...          #.
12930 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 22  .          if {"
12940 43 61 6e 63 65 6c 65 64 22 20 69 6e 20 5b 73 70  Canceled" in [sp
12950 6c 69 74 20 5b 24 65 20 49 6e 74 65 72 72 75 70  lit [$e Interrup
12960 74 54 79 70 65 5d 20 22 2c 20 22 5d 7d 20 74 68  tType] ", "]} th
12970 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
12980 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
12990 20 23 20 4e 4f 54 45 3a 20 49 74 65 72 61 74 65   # NOTE: Iterate
129a0 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 64 61 74   through all dat
129b0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
129c0 73 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 65 0d 0a  s known to the..
129d0 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
129e0 20 20 20 20 70 61 72 65 6e 74 20 69 6e 74 65 72      parent inter
129f0 70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 20  preter...       
12a00 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
12a10 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61      object forea
12a20 63 68 20 2d 61 6c 69 61 73 20 70 61 69 72 20 5c  ch -alias pair \
12a30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
12a40 20 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65    [object invoke
12a50 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
12a60 69 63 20 24 65 20 49 6e 74 65 72 70 72 65 74 65  ic $e Interprete
12a70 72 2e 63 6f 6e 6e 65 63 74 69 6f 6e 73 5d 20 7b  r.connections] {
12a80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
12a90 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
12aa0 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
12ab0 20 74 6f 20 63 61 6e 63 65 6c 20 61 6e 79 20 53   to cancel any S
12ac0 51 4c 20 71 75 65 72 69 65 73 20 69 6e 20 70 72  QL queries in pr
12ad0 6f 67 72 65 73 73 20 6f 6e 20 74 68 69 73 0d 0a  ogress on this..
12ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
12af0 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 63        database c
12b00 6f 6e 6e 65 63 74 69 6f 6e 2e 0d 0a 20 20 20 20  onnection...    
12b10 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
12b20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
12b30 63 61 74 63 68 20 7b 24 70 61 69 72 20 56 61 6c  catch {$pair Val
12b40 75 65 2e 43 61 6e 63 65 6c 7d 20 65 72 72 6f 72  ue.Cancel} error
12b50 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
12b60 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
12b70 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
12b80 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 6e 20   [appendArgs \n 
12b90 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
12ba0 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
12bb0 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
12bc0 63 61 6e 63 65 6c 20 71 75 65 72 79 20 66 6f 72  cancel query for
12bd0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 22 22 20   connection \"" 
12be0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
12bf0 20 20 20 20 20 20 20 5b 24 70 61 69 72 20 4b 65         [$pair Ke
12c00 79 5d 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22  y] "\", error: "
12c10 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d   \n\t $error \n]
12c20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
12c30 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
12c40 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
12c50 20 20 20 20 20 20 20 7d 7d 0d 0a 20 20 20 20 20         }}..     
12c60 20 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d 20   } error] == 0} 
12c70 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
12c80 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 69 6e  addConstraint in
12c90 74 65 72 72 75 70 74 43 61 6c 6c 62 61 63 6b 2e  terruptCallback.
12ca0 73 71 6c 69 74 65 33 0d 0a 0d 0a 20 20 20 20 20  sqlite3....     
12cb0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
12cc0 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 7d  l yes\n..      }
12cd0 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
12ce0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
12cf0 5b 61 70 70 65 6e 64 41 72 67 73 20 22 6e 6f 2c  [appendArgs "no,
12d00 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24   error: " \n\t $
12d10 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20  error \n]..     
12d20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
12d30 20 20 70 72 6f 63 20 63 6c 65 61 6e 75 70 46 69    proc cleanupFi
12d40 6c 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 63  le { fileName {c
12d50 6f 6c 6c 65 63 74 20 74 72 75 65 7d 20 7b 66 6f  ollect true} {fo
12d60 72 63 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  rce false} } {..
12d70 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
12d80 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
12d90 6f 20 66 6f 72 63 65 20 61 6c 6c 20 70 65 6e 64  o force all pend
12da0 69 6e 67 20 22 67 61 72 62 61 67 65 22 20 6f 62  ing "garbage" ob
12db0 6a 65 63 74 73 20 74 6f 20 62 65 20 63 6f 6c 6c  jects to be coll
12dc0 65 63 74 65 64 2c 0d 0a 20 20 20 20 20 20 23 20  ected,..      # 
12dd0 20 20 20 20 20 20 69 6e 63 6c 75 64 69 6e 67 20        including 
12de0 53 51 4c 69 74 65 20 73 74 61 74 65 6d 65 6e 74  SQLite statement
12df0 73 20 61 6e 64 20 62 61 63 6b 75 70 20 6f 62 6a  s and backup obj
12e00 65 63 74 73 3b 20 74 68 69 73 20 73 68 6f 75 6c  ects; this shoul
12e10 64 20 61 6c 6c 6f 77 0d 0a 20 20 20 20 20 20 23  d allow..      #
12e20 20 20 20 20 20 20 20 74 68 65 20 75 6e 64 65 72         the under
12e30 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  lying database f
12e40 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65  ile to be delete
12e50 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  d...      #..   
12e60 20 20 20 69 66 20 7b 24 63 6f 6c 6c 65 63 74 7d     if {$collect}
12e70 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
12e80 20 63 6f 6c 6c 65 63 74 47 61 72 62 61 67 65 20   collectGarbage 
12e90 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d  $::test_channel.
12ea0 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
12eb0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
12ec0 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  E: Check if the 
12ed0 66 69 6c 65 20 73 74 69 6c 6c 20 65 78 69 73 74  file still exist
12ee0 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s...      #..   
12ef0 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69     if {[file exi
12f00 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20  sts $fileName]} 
12f10 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
12f20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
12f30 45 3a 20 53 6b 69 70 20 64 65 6c 65 74 69 6e 67  E: Skip deleting
12f40 20 74 65 73 74 20 66 69 6c 65 73 20 69 66 20 73   test files if s
12f50 6f 6d 65 62 6f 64 79 20 73 65 74 73 20 74 68 65  omebody sets the
12f60 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
12f70 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
12f80 20 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74 2e    to prevent it.
12f90 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
12fa0 20 20 20 20 20 69 66 20 7b 24 66 6f 72 63 65 20       if {$force 
12fb0 7c 7c 20 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  || ![info exists
12fc0 20 3a 3a 6e 6f 28 63 6c 65 61 6e 75 70 46 69 6c   ::no(cleanupFil
12fd0 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  e)]} then {..   
12fe0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
12ff0 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
13000 6d 70 74 20 74 6f 20 64 65 6c 65 74 65 20 74 68  mpt to delete th
13010 65 20 74 65 73 74 20 66 69 6c 65 20 6e 6f 77 2e  e test file now.
13020 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
13030 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 65           if {[se
13040 74 20 63 6f 64 65 20 5b 63 61 74 63 68 20 7b 66  t code [catch {f
13050 69 6c 65 20 64 65 6c 65 74 65 20 24 66 69 6c 65  ile delete $file
13060 4e 61 6d 65 7d 20 65 72 72 6f 72 5d 5d 7d 20 74  Name} error]]} t
13070 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
13080 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
13090 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d    # NOTE: We som
130a0 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f 20 64  ehow failed to d
130b0 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 2c 20  elete the file, 
130c0 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20  report why...   
130d0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
130e0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
130f0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
13100 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
13110 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
13120 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
13130 65 64 20 74 6f 20 64 65 6c 65 74 65 20 74 65 73  ed to delete tes
13140 74 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65  t file \"" $file
13150 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  Name \..        
13160 20 20 20 20 20 20 20 20 22 5c 22 20 64 75 72 69          "\" duri
13170 6e 67 20 63 6c 65 61 6e 75 70 2c 20 65 72 72 6f  ng cleanup, erro
13180 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72  r: " \n\t $error
13190 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
131a0 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  }..        } els
131b0 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  e {..          #
131c0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
131d0 54 45 3a 20 53 68 6f 77 20 74 68 61 74 20 77 65  TE: Show that we
131e0 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e   skipped deletin
131f0 67 20 74 68 65 20 66 69 6c 65 2e 0d 0a 20 20 20  g the file...   
13200 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
13210 20 20 20 20 73 65 74 20 63 6f 64 65 20 30 0d 0a      set code 0..
13220 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
13230 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
13240 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
13250 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
13260 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 73 6b  ==== WARNING: sk
13270 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20 74  ipped deleting t
13280 65 73 74 20 66 69 6c 65 20 5c 22 22 20 24 66 69  est file \"" $fi
13290 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  leName \..      
132a0 20 20 20 20 20 20 20 20 22 5c 22 20 64 75 72 69          "\" duri
132b0 6e 67 20 63 6c 65 61 6e 75 70 5c 6e 22 5d 0d 0a  ng cleanup\n"]..
132c0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
132d0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
132e0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
132f0 4e 4f 54 45 3a 20 54 68 65 20 66 69 6c 65 20 64  NOTE: The file d
13300 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 73  oes not exist, s
13310 75 63 63 65 73 73 21 0d 0a 20 20 20 20 20 20 20  uccess!..       
13320 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
13330 63 6f 64 65 20 30 0d 0a 20 20 20 20 20 20 7d 0d  code 0..      }.
13340 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
13350 24 63 6f 64 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  $code..    }....
13360 0a 20 20 20 20 70 72 6f 63 20 63 6f 6c 6c 65 63  .    proc collec
13370 74 47 61 72 62 61 67 65 20 7b 20 63 68 61 6e 6e  tGarbage { chann
13380 65 6c 20 7b 6d 69 6c 6c 69 73 65 63 6f 6e 64 73  el {milliseconds
13390 20 31 30 30 30 7d 20 7b 71 75 69 65 74 20 74 72   1000} {quiet tr
133a0 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69  ue} } {..      i
133b0 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63  f {[catch {objec
133c0 74 20 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54  t invoke GC GetT
133d0 6f 74 61 6c 4d 65 6d 6f 72 79 20 66 61 6c 73 65  otalMemory false
133e0 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20  } result] == 0} 
133f0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
13400 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
13410 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
13420 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
13430 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
13440 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
13450 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62   memory in use b
13460 79 20 74 68 65 20 43 4c 52 20 62 65 66 6f 72 65  y the CLR before
13470 20 63 6f 6c 6c 65 63 74 69 6f 6e 2e 2e 2e 20 22   collection... "
13480 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
13490 20 20 24 72 65 73 75 6c 74 20 22 20 62 79 74 65    $result " byte
134a0 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d  s\n"]..        }
134b0 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
134c0 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
134d0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
134e0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
134f0 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
13500 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74  G: failed to get
13510 20 43 4c 52 20 6d 65 6d 6f 72 79 20 75 73 61 67   CLR memory usag
13520 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20  e, error: " \.. 
13530 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20             \n\t 
13540 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
13550 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 23     }....      ##
13560 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13570 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13580 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13590 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
135a0 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20  #######....     
135b0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
135c0 3a 20 52 65 70 65 61 74 65 64 6c 79 20 61 74 74  : Repeatedly att
135d0 65 6d 70 74 20 74 6f 20 63 6f 6c 6c 65 63 74 20  empt to collect 
135e0 67 61 72 62 61 67 65 20 75 6e 74 69 6c 20 74 68  garbage until th
135f0 65 20 61 6c 6c 6f 74 74 65 64 20 6e 75 6d 62 65  e allotted numbe
13600 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  r..      #      
13610 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   of milliseconds
13620 20 68 61 73 20 65 6c 61 70 73 65 64 2e 20 20 41   has elapsed.  A
13630 6c 77 61 79 73 20 61 74 74 65 6d 70 74 20 74 6f  lways attempt to
13640 20 63 6f 6c 6c 65 63 74 20 67 61 72 62 61 67 65   collect garbage
13650 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
13660 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 0d 0a  at least once...
13670 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73        #..      s
13680 65 74 20 73 74 61 72 74 20 5b 63 6c 6f 63 6b 20  et start [clock 
13690 73 65 63 6f 6e 64 73 5d 0d 0a 20 20 20 20 20 20  seconds]..      
136a0 73 65 74 20 73 74 6f 70 20 5b 65 78 70 72 20 7b  set stop [expr {
136b0 24 73 74 61 72 74 20 2b 20 28 24 6d 69 6c 6c 69  $start + ($milli
136c0 73 65 63 6f 6e 64 73 20 2f 20 31 30 30 30 29 7d  seconds / 1000)}
136d0 5d 0d 0a 0d 0a 20 20 20 20 20 20 64 6f 20 7b 0d  ]....      do {.
136e0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
136f0 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
13700 6d 70 74 20 74 6f 20 66 6f 72 63 65 20 61 20 66  mpt to force a f
13710 75 6c 6c 20 67 61 72 62 61 67 65 20 63 6f 6c 6c  ull garbage coll
13720 65 63 74 69 6f 6e 20 6e 6f 77 2e 20 20 52 65 70  ection now.  Rep
13730 6f 72 74 20 61 6e 79 0d 0a 20 20 20 20 20 20 20  ort any..       
13740 20 23 20 20 20 20 20 20 20 65 72 72 6f 72 20 74   #       error t
13750 68 61 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  hat is encounter
13760 65 64 20 69 66 20 77 65 20 66 61 69 6c 2e 0d 0a  ed if we fail...
13770 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
13780 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f     if {[catch {o
13790 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47 43 20  bject invoke GC 
137a0 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 74  GetTotalMemory t
137b0 72 75 65 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65  rue} error]} the
137c0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
137d0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
137e0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
137f0 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
13800 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
13810 20 66 75 6c 6c 20 67 61 72 62 61 67 65 20 63 6f   full garbage co
13820 6c 6c 65 63 74 69 6f 6e 2c 20 65 72 72 6f 72 3a  llection, error:
13830 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
13840 20 20 20 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20      \n\t $error 
13850 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  \n]..        }..
13860 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 6f  ..        set no
13870 77 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73  w [clock seconds
13880 5d 0d 0a 20 20 20 20 20 20 7d 20 77 68 69 6c 65  ]..      } while
13890 20 7b 24 73 74 61 72 74 20 3c 3d 20 24 6e 6f 77   {$start <= $now
138a0 20 26 26 20 24 6e 6f 77 20 3c 20 24 73 74 6f 70   && $now < $stop
138b0 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 23 23 23 23  }....      #####
138c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
138d0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
138e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
138f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13900 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20 20 69 66  ####....      if
13910 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74   {[catch {object
13920 20 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54 6f   invoke GC GetTo
13930 74 61 6c 4d 65 6d 6f 72 79 20 66 61 6c 73 65 7d  talMemory false}
13940 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74   result] == 0} t
13950 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
13960 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
13970 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
13980 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
13990 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
139a0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
139b0 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79  memory in use by
139c0 20 74 68 65 20 43 4c 52 20 61 66 74 65 72 20 63   the CLR after c
139d0 6f 6c 6c 65 63 74 69 6f 6e 2e 2e 2e 20 22 20 5c  ollection... " \
139e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
139f0 24 72 65 73 75 6c 74 20 22 20 62 79 74 65 73 5c  $result " bytes\
13a00 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  n"]..        }..
13a10 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
13a20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
13a30 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
13a40 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
13a50 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
13a60 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 43   failed to get C
13a70 4c 52 20 6d 65 6d 6f 72 79 20 75 73 61 67 65 2c  LR memory usage,
13a80 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20   error: " \..   
13a90 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72           \n\t $r
13aa0 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20  esult \n]..     
13ab0 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
13ac0 20 20 70 72 6f 63 20 67 65 74 53 51 4c 69 74 65    proc getSQLite
13ad0 48 61 6e 64 6c 65 43 6f 75 6e 74 73 20 7b 20 63  HandleCounts { c
13ae0 68 61 6e 6e 65 6c 20 7b 71 75 69 65 74 20 66 61  hannel {quiet fa
13af0 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  lse} } {..      
13b00 73 65 74 20 72 65 73 75 6c 74 20 5b 6c 69 73 74  set result [list
13b10 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  ]....      if {[
13b20 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5c  haveConstraint \
13b30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
13b40 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 2e 53  defineConstant.S
13b50 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
13b60 65 2e 43 4f 55 4e 54 5f 48 41 4e 44 4c 45 5d 7d  e.COUNT_HANDLE]}
13b70 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
13b80 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
13b90 54 45 3a 20 41 64 64 20 65 61 63 68 20 63 72 69  TE: Add each cri
13ba0 74 69 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75  tical handle cou
13bb0 6e 74 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74  nt to the result
13bc0 69 6e 67 20 6c 69 73 74 2e 0d 0a 20 20 20 20 20  ing list...     
13bd0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 66 6f     #..        fo
13be0 72 65 61 63 68 20 6e 61 6d 65 20 5b 6c 69 73 74  reach name [list
13bf0 20 63 6f 6e 6e 65 63 74 69 6f 6e 43 6f 75 6e 74   connectionCount
13c00 20 73 74 61 74 65 6d 65 6e 74 43 6f 75 6e 74 20   statementCount 
13c10 62 61 63 6b 75 70 43 6f 75 6e 74 5d 20 7b 0d 0a  backupCount] {..
13c20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 76 61            set va
13c30 6c 75 65 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f  lue [object invo
13c40 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
13c50 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
13c60 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
13c70 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e  a.SQLite.UnsafeN
13c80 61 74 69 76 65 4d 65 74 68 6f 64 73 20 24 6e 61  ativeMethods $na
13c90 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  me]....         
13ca0 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
13cb0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
13cc0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
13cd0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
13ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cf0 22 2d 2d 2d 2d 20 63 72 69 74 69 63 61 6c 20 68  "---- critical h
13d00 61 6e 64 6c 65 20 63 6f 75 6e 74 20 5c 22 22 20  andle count \"" 
13d10 24 6e 61 6d 65 20 22 5c 22 20 69 73 20 22 20 24  $name "\" is " $
13d20 76 61 6c 75 65 20 5c 6e 5d 0d 0a 20 20 20 20 20  value \n]..     
13d30 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
13d40 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75      lappend resu
13d50 6c 74 20 24 76 61 6c 75 65 0d 0a 20 20 20 20 20  lt $value..     
13d60 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
13d70 73 65 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74  seif {!$quiet} t
13d80 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
13d90 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
13da0 3a 20 54 68 65 20 61 63 74 75 61 6c 20 68 61 6e  : The actual han
13db0 64 6c 65 20 63 6f 75 6e 74 73 20 61 72 65 20 6e  dle counts are n
13dc0 6f 74 20 61 76 61 69 6c 61 62 6c 65 3b 20 74 68  ot available; th
13dd0 65 72 65 66 6f 72 65 2c 20 6a 75 73 74 0d 0a 20  erefore, just.. 
13de0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72         #       r
13df0 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 6c  eturn an empty l
13e00 69 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ist...        #.
13e10 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
13e20 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 72  channel "---- cr
13e30 69 74 69 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f  itical handle co
13e40 75 6e 74 73 20 75 6e 61 76 61 69 6c 61 62 6c 65  unts unavailable
13e50 5c 6e 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  \n"..      }....
13e60 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65        return $re
13e70 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  sult..    }.....
13e80 20 20 20 20 70 72 6f 63 20 73 68 75 74 64 6f 77      proc shutdow
13e90 6e 53 51 4c 69 74 65 20 7b 20 63 68 61 6e 6e 65  nSQLite { channe
13ea0 6c 20 7b 66 6f 72 63 65 20 66 61 6c 73 65 7d 20  l {force false} 
13eb0 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20  {quiet false} } 
13ec0 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
13ed0 20 20 23 20 4e 4f 54 45 3a 20 4d 61 6b 65 20 73    # NOTE: Make s
13ee0 75 72 65 20 74 68 61 74 20 53 51 4c 69 74 65 20  ure that SQLite 
13ef0 63 6f 72 65 20 6c 69 62 72 61 72 79 20 69 73 20  core library is 
13f00 63 6f 6d 70 6c 65 74 65 6c 79 20 73 68 75 74 64  completely shutd
13f10 6f 77 6e 2e 20 20 54 68 69 73 0d 0a 20 20 20 20  own.  This..    
13f20 20 20 23 20 20 20 20 20 20 20 69 73 20 75 73 65    #       is use
13f30 64 20 62 79 20 74 65 73 74 73 20 74 68 61 74 20  d by tests that 
13f40 63 68 61 6e 67 65 20 63 6f 6e 66 69 67 75 72 61  change configura
13f50 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61 6e 64  tion options and
13f60 2f 6f 72 20 74 68 6f 73 65 0d 0a 20 20 20 20 20  /or those..     
13f70 20 23 20 20 20 20 20 20 20 74 68 61 74 20 6e 65   #       that ne
13f80 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ed to make sure 
13f90 6c 6f 67 67 69 6e 67 20 69 73 20 69 6e 69 74 69  logging is initi
13fa0 61 6c 69 7a 65 64 20 28 69 2e 65 2e 20 6a 75 73  alized (i.e. jus
13fb0 74 20 69 6e 20 63 61 73 65 0d 0a 20 20 20 20 20  t in case..     
13fc0 20 23 20 20 20 20 20 20 20 74 68 65 20 53 51 4c   #       the SQL
13fd0 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79  ite core library
13fe0 20 77 61 73 20 69 6e 69 74 69 61 6c 69 7a 65 64   was initialized
13ff0 20 69 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20   in the process 
14000 70 72 69 6f 72 20 74 6f 0d 0a 20 20 20 20 20 20  prior to..      
14010 23 20 20 20 20 20 20 20 74 68 65 20 53 51 4c 69  #       the SQLi
14020 74 65 4c 6f 67 20 63 6c 61 73 73 20 62 65 69 6e  teLog class bein
14030 67 20 61 62 6c 65 20 74 6f 20 73 65 74 75 70 20  g able to setup 
14040 69 74 73 20 6c 6f 67 67 69 6e 67 20 63 61 6c 6c  its logging call
14050 62 61 63 6b 29 2e 0d 0a 20 20 20 20 20 20 23 20  back)...      # 
14060 20 20 20 20 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20        Normally, 
14070 74 68 69 73 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  this should only
14080 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66   be performed if
14090 20 53 51 4c 69 74 65 20 69 73 20 6c 6f 61 64 65   SQLite is loade
140a0 64 20 61 6e 64 0d 0a 20 20 20 20 20 20 23 20 20  d and..      #  
140b0 20 20 20 20 20 72 65 61 64 79 20 66 6f 72 20 75       ready for u
140c0 73 65 20 62 79 20 74 68 65 20 74 65 73 74 20 73  se by the test s
140d0 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  uite...      #..
140e0 20 20 20 20 20 20 69 66 20 7b 24 66 6f 72 63 65        if {$force
140f0 20 7c 7c 20 5b 69 73 53 51 4c 69 74 65 52 65 61   || [isSQLiteRea
14100 64 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  dy]} then {..   
14110 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
14120 23 20 42 55 47 46 49 58 3a 20 4d 61 6b 65 20 73  # BUGFIX: Make s
14130 75 72 65 20 74 68 61 74 20 61 6e 79 20 22 6c 65  ure that any "le
14140 61 6b 65 64 22 20 74 72 61 6e 73 61 63 74 69 6f  aked" transactio
14150 6e 73 20 61 6e 64 2f 6f 72 20 63 6f 6e 6e 65 63  ns and/or connec
14160 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20 23  tions..        #
14170 20 20 20 20 20 20 20 20 20 61 72 65 20 63 6c 65           are cle
14180 61 6e 65 64 20 75 70 20 62 65 66 6f 72 65 20 63  aned up before c
14190 61 6c 6c 69 6e 67 20 74 68 65 20 6e 61 74 69 76  alling the nativ
141a0 65 20 73 68 75 74 64 6f 77 6e 20 66 75 6e 63 74  e shutdown funct
141b0 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ion...        #.
141c0 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  .        foreach
141d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 5b 69 6e   transaction [in
141e0 66 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 5d  fo transactions]
141f0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
14200 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20   {[string match 
14210 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
14220 20 53 79 73 74 65 6d 23 44 61 74 61 23 53 51 4c   System#Data#SQL
14230 69 74 65 23 53 51 4c 69 74 65 54 72 61 6e 73 61  ite#SQLiteTransa
14240 63 74 69 6f 6e 23 2a 20 24 74 72 61 6e 73 61 63  ction#* $transac
14250 74 69 6f 6e 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  tion]} then {.. 
14260 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
14270 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
14280 20 20 20 20 20 20 20 73 71 6c 20 74 72 61 6e 73         sql trans
14290 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20  action rollback 
142a0 24 74 72 61 6e 73 61 63 74 69 6f 6e 0d 0a 20 20  $transaction..  
142b0 20 20 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f            } erro
142c0 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  r] == 0} then {.
142d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
142e0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
142f0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
14300 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
14310 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
14320 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
14330 20 20 20 20 20 20 22 2d 2d 2d 2d 20 72 6f 6c 6c        "---- roll
14340 65 64 20 62 61 63 6b 20 6c 65 61 6b 65 64 20 74  ed back leaked t
14350 72 61 6e 73 61 63 74 69 6f 6e 20 5c 22 22 20 5c  ransaction \"" \
14360 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
14370 20 20 20 20 20 20 24 74 72 61 6e 73 61 63 74 69        $transacti
14380 6f 6e 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  on \"\n]..      
14390 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
143a0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
143b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
143c0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
143d0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
143e0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
143f0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
14400 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
14410 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
14420 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 72  ING: failed to r
14430 6f 6c 6c 62 61 63 6b 20 6c 65 61 6b 65 64 20 74  ollback leaked t
14440 72 61 6e 73 61 63 74 69 6f 6e 20 5c 22 22 20 5c  ransaction \"" \
14450 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
14460 20 20 20 20 20 20 24 74 72 61 6e 73 61 63 74 69        $transacti
14470 6f 6e 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22  on "\", error: "
14480 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d   \n\t $error \n]
14490 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
144a0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
144b0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
144c0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
144d0 20 20 20 20 66 6f 72 65 61 63 68 20 64 62 20 5b      foreach db [
144e0 69 6e 66 6f 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  info connections
144f0 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  ] {..          i
14500 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68  f {[string match
14510 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
14520 20 20 53 79 73 74 65 6d 23 44 61 74 61 23 53 51    System#Data#SQ
14530 4c 69 74 65 23 53 51 4c 69 74 65 43 6f 6e 6e 65  Lite#SQLiteConne
14540 63 74 69 6f 6e 23 2a 20 24 64 62 5d 7d 20 74 68  ction#* $db]} th
14550 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
14560 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 73 71    if {[catch {sq
14570 6c 20 63 6c 6f 73 65 20 24 64 62 7d 20 65 72 72  l close $db} err
14580 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  or] == 0} then {
14590 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
145a0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
145b0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
145c0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
145d0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
145e0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
145f0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6c 6f         "---- clo
14600 73 65 64 20 6c 65 61 6b 65 64 20 64 61 74 61 62  sed leaked datab
14610 61 73 65 20 5c 22 22 20 24 64 62 20 5c 22 5c 6e  ase \"" $db \"\n
14620 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]..             
14630 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
14640 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
14650 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
14660 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
14670 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
14680 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
14690 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
146a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
146b0 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
146c0 69 6c 65 64 20 74 6f 20 63 6c 6f 73 65 20 6c 65  iled to close le
146d0 61 6b 65 64 20 64 61 74 61 62 61 73 65 20 5c 22  aked database \"
146e0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
146f0 20 20 20 20 20 20 20 20 20 24 64 62 20 22 5c 22           $db "\"
14700 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  , error: " \n\t 
14710 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20  $error \n]..    
14720 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
14730 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
14740 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
14750 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
14760 0a 20 20 20 20 20 20 20 20 23 20 42 55 47 46 49  .        # BUGFI
14770 58 3a 20 42 65 66 6f 72 65 20 63 61 6c 6c 69 6e  X: Before callin
14780 67 20 74 68 65 20 6e 61 74 69 76 65 20 73 68 75  g the native shu
14790 74 64 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 2c 20  tdown function, 
147a0 6d 61 6b 65 20 73 75 72 65 20 62 6f 74 68 0d 0a  make sure both..
147b0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
147c0 20 20 6f 66 20 74 68 65 20 50 52 41 47 4d 41 20    of the PRAGMA 
147d0 72 65 6c 61 74 65 64 20 64 69 72 65 63 74 6f 72  related director
147e0 79 20 6e 61 6d 65 73 20 61 72 65 20 66 72 65 65  y names are free
147f0 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  d...        #.. 
14800 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53         checkForS
14810 51 4c 69 74 65 44 69 72 65 63 74 6f 72 69 65 73  QLiteDirectories
14820 20 24 63 68 61 6e 6e 65 6c 20 74 72 75 65 0d 0a   $channel true..
14830 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
14840 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
14850 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
14860 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
14870 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
14880 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
14890 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69  QLite.UnsafeNati
148a0 76 65 4d 65 74 68 6f 64 73 20 73 71 6c 69 74 65  veMethods sqlite
148b0 33 5f 73 68 75 74 64 6f 77 6e 0d 0a 20 20 20 20  3_shutdown..    
148c0 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d      } result] ==
148d0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
148e0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
148f0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
14900 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
14910 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
14920 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
14930 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20       "---- call 
14940 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e  sqlite3_shutdown
14950 28 29 2e 2e 2e 20 6f 6b 3a 20 22 20 24 72 65 73  ()... ok: " $res
14960 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ult \n]..       
14970 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
14980 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
14990 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
149a0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
149b0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
149c0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
149d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
149e0 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69   "---- call sqli
149f0 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 2e 2e  te3_shutdown()..
14a00 2e 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  . error: " \n\t 
14a10 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
14a20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
14a30 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
14a40 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
14a50 20 72 65 70 6f 72 74 53 51 4c 69 74 65 52 65 73   reportSQLiteRes
14a60 6f 75 72 63 65 73 20 7b 0d 0a 20 20 20 20 20 20  ources {..      
14a70 20 20 20 20 20 20 63 68 61 6e 6e 65 6c 20 7b 71        channel {q
14a80 75 69 65 74 20 66 61 6c 73 65 7d 20 7b 72 65 73  uiet false} {res
14a90 65 74 20 74 72 75 65 7d 20 7b 63 6f 6c 6c 65 63  et true} {collec
14aa0 74 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20  t true} } {..   
14ab0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
14ac0 54 45 3a 20 49 66 20 61 76 61 69 6c 61 62 6c 65  TE: If available
14ad0 2c 20 72 65 70 6f 72 74 20 6f 6e 20 28 61 6e 64  , report on (and
14ae0 20 70 6f 73 73 69 62 6c 79 20 72 65 73 65 74 29   possibly reset)
14af0 20 74 68 65 20 72 75 6e 74 69 6d 65 0d 0a 20 20   the runtime..  
14b00 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 66      #       conf
14b10 69 67 75 72 61 74 69 6f 6e 20 73 74 61 74 69 73  iguration statis
14b20 74 69 63 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  tics...      #..
14b30 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 43        if {[haveC
14b40 6f 6e 73 74 72 61 69 6e 74 20 62 75 69 6c 64 43  onstraint buildC
14b50 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 44 65 62  onfiguration.Deb
14b60 75 67 5d 20 26 26 20 5b 63 61 74 63 68 20 7b 0d  ug] && [catch {.
14b70 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20  .        object 
14b80 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
14b90 6f 6e 50 75 62 6c 69 63 20 2d 61 6c 69 61 73 20  onPublic -alias 
14ba0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  \..            S
14bb0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
14bc0 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  e.UnsafeNativeMe
14bd0 74 68 6f 64 73 20 73 65 74 74 69 6e 67 52 65 61  thods settingRea
14be0 64 43 6f 75 6e 74 73 0d 0a 20 20 20 20 20 20 7d  dCounts..      }
14bf0 20 73 65 74 74 69 6e 67 52 65 61 64 43 6f 75 6e   settingReadCoun
14c00 74 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  ts] == 0} then {
14c10 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 61  ..        set na
14c20 6d 65 43 6f 75 6e 74 20 5b 24 73 65 74 74 69 6e  meCount [$settin
14c30 67 52 65 61 64 43 6f 75 6e 74 73 20 43 6f 75 6e  gReadCounts Coun
14c40 74 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  t]..        set 
14c50 76 61 6c 75 65 43 6f 75 6e 74 20 30 0d 0a 0d 0a  valueCount 0....
14c60 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66          object f
14c70 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20 70 61  oreach -alias pa
14c80 69 72 20 24 73 65 74 74 69 6e 67 52 65 61 64 43  ir $settingReadC
14c90 6f 75 6e 74 73 20 7b 0d 0a 20 20 20 20 20 20 20  ounts {..       
14ca0 20 20 20 69 6e 63 72 20 76 61 6c 75 65 43 6f 75     incr valueCou
14cb0 6e 74 20 5b 24 70 61 69 72 20 56 61 6c 75 65 5d  nt [$pair Value]
14cc0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
14cd0 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
14ce0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
14cf0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
14d00 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
14d10 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
14d20 2d 2d 20 73 65 74 74 69 6e 67 20 5c 22 22 20 5b  -- setting \"" [
14d30 24 70 61 69 72 20 4b 65 79 5d 20 22 5c 22 20 77  $pair Key] "\" w
14d40 61 73 20 72 65 61 64 20 22 20 5c 0d 0a 20 20 20  as read " \..   
14d50 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 24 70               [$p
14d60 61 69 72 20 56 61 6c 75 65 5d 20 22 20 74 69 6d  air Value] " tim
14d70 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  es\n"]..        
14d80 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
14d90 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 72  ..        if {$r
14da0 65 73 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  eset} then {..  
14db0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
14dc0 63 68 20 7b 24 73 65 74 74 69 6e 67 52 65 61 64  ch {$settingRead
14dd0 43 6f 75 6e 74 73 20 43 6c 65 61 72 7d 20 65 72  Counts Clear} er
14de0 72 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ror] == 0} then 
14df0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
14e00 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
14e10 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
14e20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
14e30 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
14e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e50 20 20 22 2d 2d 2d 2d 20 72 65 73 65 74 20 73 65    "---- reset se
14e60 74 74 69 6e 67 20 73 74 61 74 69 73 74 69 63 73  tting statistics
14e70 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75   for the previou
14e80 73 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  s " \..         
14e90 20 20 20 20 20 20 20 20 20 24 6e 61 6d 65 43 6f           $nameCo
14ea0 75 6e 74 20 22 20 6e 61 6d 65 73 20 61 6e 64 20  unt " names and 
14eb0 22 20 24 76 61 6c 75 65 43 6f 75 6e 74 20 22 20  " $valueCount " 
14ec0 76 61 6c 75 65 73 20 72 65 61 64 5c 6e 22 5d 0d  values read\n"].
14ed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
14ee0 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
14ef0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
14f00 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
14f10 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
14f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
14f30 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
14f40 6c 65 64 20 74 6f 20 72 65 73 65 74 20 73 65 74  led to reset set
14f50 74 69 6e 67 20 73 74 61 74 69 73 74 69 63 73 20  ting statistics 
14f60 66 6f 72 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  for " \..       
14f70 20 20 20 20 20 20 20 20 20 22 74 68 65 20 70 72           "the pr
14f80 65 76 69 6f 75 73 20 22 20 24 6e 61 6d 65 43 6f  evious " $nameCo
14f90 75 6e 74 20 22 20 6e 61 6d 65 73 20 61 6e 64 20  unt " names and 
14fa0 22 20 24 76 61 6c 75 65 43 6f 75 6e 74 20 5c 0d  " $valueCount \.
14fb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14fc0 20 22 20 76 61 6c 75 65 73 20 72 65 61 64 2c 20   " values read, 
14fd0 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65  error: " \n\t $e
14fe0 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  rror \n]..      
14ff0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
15000 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
15010 20 20 20 69 66 20 7b 5b 68 61 76 65 43 6f 6e 73     if {[haveCons
15020 74 72 61 69 6e 74 20 5c 0d 0a 20 20 20 20 20 20  traint \..      
15030 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 43 6f          defineCo
15040 6e 73 74 61 6e 74 2e 53 79 73 74 65 6d 2e 44 61  nstant.System.Da
15050 74 61 2e 53 51 4c 69 74 65 2e 49 4e 54 45 52 4f  ta.SQLite.INTERO
15060 50 5f 56 49 52 54 55 41 4c 5f 54 41 42 4c 45 5d  P_VIRTUAL_TABLE]
15070 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
15080 20 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74   [haveConstraint
15090 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
150a0 20 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74    defineConstant
150b0 2e 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  .System.Data.SQL
150c0 69 74 65 2e 54 52 41 43 4b 5f 4d 45 4d 4f 52 59  ite.TRACK_MEMORY
150d0 5f 42 59 54 45 53 5d 7d 20 74 68 65 6e 20 7b 0d  _BYTES]} then {.
150e0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71  .        if {!$q
150f0 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
15100 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
15110 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 75 72  hannel "---- cur
15120 72 65 6e 74 20 6d 65 6d 6f 72 79 20 69 6e 20 75  rent memory in u
15130 73 65 20 62 79 20 53 51 4c 69 74 65 4d 65 6d 6f  se by SQLiteMemo
15140 72 79 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 20  ry... "..       
15150 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
15160 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
15170 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
15180 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
15190 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
151a0 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
151b0 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65  ta.SQLite.SQLite
151c0 4d 65 6d 6f 72 79 20 62 79 74 65 73 41 6c 6c 6f  Memory bytesAllo
151d0 63 61 74 65 64 0d 0a 20 20 20 20 20 20 20 20 7d  cated..        }
151e0 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74   memory] == 0} t
151f0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
15200 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
15210 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
15220 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
15230 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65   [appendArgs $me
15240 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e 22 5d  mory " bytes\n"]
15250 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
15260 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
15270 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6d  .          set m
15280 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d  emory unknown...
15290 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
152a0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
152b0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
152c0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
152d0 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c  ndArgs $memory \
152e0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
152f0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
15300 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
15310 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
15320 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
15330 6e 65 6c 20 22 2d 2d 2d 2d 20 6d 61 78 69 6d 75  nel "---- maximu
15340 6d 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20  m memory in use 
15350 62 79 20 53 51 4c 69 74 65 4d 65 6d 6f 72 79 2e  by SQLiteMemory.
15360 2e 2e 20 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d  .. "..        }.
15370 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  ...        if {[
15380 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
15390 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
153a0 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
153b0 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
153c0 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
153d0 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 4d 65 6d  SQLite.SQLiteMem
153e0 6f 72 79 20 6d 61 78 69 6d 75 6d 42 79 74 65 73  ory maximumBytes
153f0 41 6c 6c 6f 63 61 74 65 64 0d 0a 20 20 20 20 20  Allocated..     
15400 20 20 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20     } memory] == 
15410 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 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 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
15450 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
15460 20 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65 73   $memory " bytes
15470 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
15480 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  }..        } els
15490 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  e {..          s
154a0 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77  et memory unknow
154b0 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n....          i
154c0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
154d0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
154e0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
154f0 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f  appendArgs $memo
15500 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ry \n]..        
15510 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
15520 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
15530 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
15540 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  en {..        tp
15550 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d  uts $channel "--
15560 2d 2d 20 63 75 72 72 65 6e 74 20 6d 65 6d 6f 72  -- current memor
15570 79 20 69 6e 20 75 73 65 20 62 79 20 53 51 4c 69  y in use by SQLi
15580 74 65 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 7d  te... "..      }
15590 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63  ....      if {[c
155a0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
155b0 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
155c0 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
155d0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  \..            S
155e0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
155f0 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  e.UnsafeNativeMe
15600 74 68 6f 64 73 20 73 71 6c 69 74 65 33 5f 6d 65  thods sqlite3_me
15610 6d 6f 72 79 5f 75 73 65 64 0d 0a 20 20 20 20 20  mory_used..     
15620 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d   } memory] == 0}
15630 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
15640 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
15650 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
15660 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
15670 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f  appendArgs $memo
15680 72 79 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a  ry " bytes\n"]..
15690 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
156a0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
156b0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
156c0 4e 4f 54 45 3a 20 4d 61 79 62 65 20 74 68 65 20  NOTE: Maybe the 
156d0 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72  SQLite core libr
156e0 61 72 79 20 69 73 20 75 6e 61 76 61 69 6c 61 62  ary is unavailab
156f0 6c 65 3f 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  le?..        #..
15700 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f          set memo
15710 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20  ry unknown....  
15720 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
15730 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
15740 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
15750 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
15760 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20  $memory \n]..   
15770 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
15780 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 72 65 73  ...      set res
15790 75 6c 74 20 24 6d 65 6d 6f 72 79 3b 20 23 20 4e  ult $memory; # N
157a0 4f 54 45 3a 20 52 65 74 75 72 6e 20 6d 65 6d 6f  OTE: Return memo
157b0 72 79 20 69 6e 2d 75 73 65 20 74 6f 20 6f 75 72  ry in-use to our
157c0 20 63 61 6c 6c 65 72 2e 0d 0a 0d 0a 20 20 20 20   caller.....    
157d0 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
157e0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  hen {..        t
157f0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
15800 2d 2d 2d 20 6d 61 78 69 6d 75 6d 20 6d 65 6d 6f  --- maximum memo
15810 72 79 20 69 6e 20 75 73 65 20 62 79 20 53 51 4c  ry in use by SQL
15820 69 74 65 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20  ite... "..      
15830 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  }....      if {[
15840 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
15850 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
15860 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
15870 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
15880 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
15890 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d  te.UnsafeNativeM
158a0 65 74 68 6f 64 73 20 73 71 6c 69 74 65 33 5f 6d  ethods sqlite3_m
158b0 65 6d 6f 72 79 5f 68 69 67 68 77 61 74 65 72 20  emory_highwater 
158c0 30 0d 0a 20 20 20 20 20 20 7d 20 6d 65 6d 6f 72  0..      } memor
158d0 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  y] == 0} then {.
158e0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71  .        if {!$q
158f0 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
15900 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
15910 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
15920 67 73 20 24 6d 65 6d 6f 72 79 20 22 20 62 79 74  gs $memory " byt
15930 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  es\n"]..        
15940 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  }..      } else 
15950 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
15960 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61        # NOTE: Ma
15970 79 62 65 20 74 68 65 20 53 51 4c 69 74 65 20 63  ybe the SQLite c
15980 6f 72 65 20 6c 69 62 72 61 72 79 20 69 73 20 75  ore library is u
15990 6e 61 76 61 69 6c 61 62 6c 65 3f 0d 0a 20 20 20  navailable?..   
159a0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
159b0 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f  set memory unkno
159c0 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66  wn....        if
159d0 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
159e0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
159f0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
15a00 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20  endArgs $memory 
15a10 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  \n]..        }..
15a20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
15a30 20 69 66 20 7b 24 63 6f 6c 6c 65 63 74 7d 20 74   if {$collect} t
15a40 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 63  hen {..        c
15a50 6f 6c 6c 65 63 74 47 61 72 62 61 67 65 20 24 63  ollectGarbage $c
15a60 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20 20 7d 0d  hannel..      }.
15a70 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71  ...      if {!$q
15a80 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
15a90 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
15aa0 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 75 72 72 65  nnel "---- curre
15ab0 6e 74 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65  nt memory in use
15ac0 20 62 79 20 74 68 65 20 43 4c 52 2e 2e 2e 20 22   by the CLR... "
15ad0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
15ae0 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f     if {[catch {o
15af0 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47 43 20  bject invoke GC 
15b00 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 66  GetTotalMemory f
15b10 61 6c 73 65 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d  alse} memory] ==
15b20 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
15b30 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
15b40 69 73 20 69 6e 74 65 67 65 72 20 2d 73 74 72 69  is integer -stri
15b50 63 74 20 24 6d 65 6d 6f 72 79 5d 7d 20 74 68 65  ct $memory]} the
15b60 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
15b70 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
15b80 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
15b90 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
15ba0 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f  appendArgs $memo
15bb0 72 79 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a  ry " bytes\n"]..
15bc0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
15bd0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
15be0 20 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d           set mem
15bf0 6f 72 79 20 69 6e 76 61 6c 69 64 0d 0a 0d 0a 20  ory invalid.... 
15c00 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
15c10 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
15c20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
15c30 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
15c40 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d  Args $memory \n]
15c50 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
15c60 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
15c70 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
15c80 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b    set memory unk
15c90 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nown....        
15ca0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
15cb0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
15cc0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
15cd0 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72  ppendArgs $memor
15ce0 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d  y \n]..        }
15cf0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
15d00 20 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c     return $resul
15d10 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  t..    }.....   
15d20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51   proc checkForSQ
15d30 4c 69 74 65 44 69 72 65 63 74 6f 72 69 65 73 20  LiteDirectories 
15d40 7b 20 63 68 61 6e 6e 65 6c 20 7b 72 65 73 65 74  { channel {reset
15d50 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20   false} } {..   
15d60 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
15d70 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65  TE: Check if the
15d80 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
15d90 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66 75 6e  et_directory fun
15da0 63 74 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62  ction is availab
15db0 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  le...      #..  
15dc0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
15dd0 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  el \..          
15de0 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
15df0 6f 72 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69  or function sqli
15e00 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69  te3_win32_set_di
15e10 72 65 63 74 6f 72 79 2e 2e 2e 20 22 0d 0a 0d 0a  rectory... "....
15e20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
15e30 20 4e 4f 54 45 3a 20 54 68 69 73 20 63 61 6c 6c   NOTE: This call
15e40 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f   to the sqlite3_
15e50 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
15e60 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20 75 73 65  ory function use
15e70 73 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  s the..      #  
15e80 20 20 20 20 20 69 6e 76 61 6c 69 64 20 76 61 6c       invalid val
15e90 75 65 20 30 20 66 6f 72 20 74 68 65 20 66 69 72  ue 0 for the fir
15ea0 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68  st argument.  Th
15eb0 69 73 20 63 6f 64 65 20 69 73 20 64 65 73 69 67  is code is desig
15ec0 6e 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ned..      #    
15ed0 20 20 20 74 6f 20 63 68 65 63 6b 20 69 66 20 63     to check if c
15ee0 61 6c 6c 69 6e 67 20 74 68 65 20 66 75 6e 63 74  alling the funct
15ef0 69 6f 6e 20 77 69 6c 6c 20 72 61 69 73 65 20 61  ion will raise a
15f00 6e 20 65 78 63 65 70 74 69 6f 6e 20 28 69 2e 65  n exception (i.e
15f10 2e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  ...      #      
15f20 20 74 68 65 20 61 63 74 75 61 6c 20 72 65 73 75   the actual resu
15f30 6c 74 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69  lt of the functi
15f40 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74  on does not matt
15f50 65 72 20 61 73 20 6c 6f 6e 67 20 61 73 20 6e 6f  er as long as no
15f60 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
15f70 64 69 72 65 63 74 6f 72 79 20 69 73 20 63 68 61  directory is cha
15f80 6e 67 65 64 29 2e 0d 0a 20 20 20 20 20 20 23 0d  nged)...      #.
15f90 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63  .      if {[catc
15fa0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a  h {..        obj
15fb0 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
15fc0 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
15fd0 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
15fe0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55  em.Data.SQLite.U
15ff0 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
16000 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ds \..          
16010 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f    sqlite3_win32_
16020 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 30 20  set_directory 0 
16030 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 7d 5d 20 3d  null..      }] =
16040 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
16050 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
16060 23 20 4e 4f 54 45 3a 20 43 61 6c 6c 69 6e 67 20  # NOTE: Calling 
16070 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  the sqlite3_win3
16080 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20  2_set_directory 
16090 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
160a0 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
160b0 20 20 20 63 61 75 73 65 20 61 6e 20 65 78 63 65     cause an exce
160c0 70 74 69 6f 6e 3b 20 74 68 65 72 65 66 6f 72 65  ption; therefore
160d0 2c 20 69 74 20 6d 75 73 74 20 62 65 20 61 76 61  , it must be ava
160e0 69 6c 61 62 6c 65 20 28 69 2e 65 2e 0d 0a 20 20  ilable (i.e...  
160f0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65 76        #       ev
16100 65 6e 20 74 68 6f 75 67 68 20 69 74 20 73 68 6f  en though it sho
16110 75 6c 64 20 72 65 74 75 72 6e 20 61 20 66 61 69  uld return a fai
16120 6c 75 72 65 20 72 65 74 75 72 6e 20 63 6f 64 65  lure return code
16130 20 69 6e 20 74 68 69 73 0d 0a 20 20 20 20 20 20   in this..      
16140 20 20 23 20 20 20 20 20 20 20 63 61 73 65 29 2e    #       case).
16150 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
16160 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
16170 6e 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  nt sqlite3_win32
16180 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 0d 0a  _set_directory..
16190 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
161a0 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a  $channel yes\n..
161b0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
161c0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f 65       # NOTE: Doe
161d0 73 20 6f 75 72 20 63 61 6c 6c 65 72 20 77 61 6e  s our caller wan
161e0 74 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 64  t to reset the d
161f0 69 72 65 63 74 6f 72 69 65 73 3f 0d 0a 20 20 20  irectories?..   
16200 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
16210 69 66 20 7b 24 72 65 73 65 74 7d 20 74 68 65 6e  if {$reset} then
16220 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
16230 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
16240 45 3a 20 4e 6f 77 20 6d 61 6b 65 20 73 75 72 65  E: Now make sure
16250 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e   the database an
16260 64 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65  d temporary dire
16270 63 74 6f 72 69 65 73 20 61 72 65 0d 0a 20 20 20  ctories are..   
16280 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72         #       r
16290 65 73 65 74 20 74 68 65 69 72 20 64 65 66 61 75  eset their defau
162a0 6c 74 20 76 61 6c 75 65 73 2c 20 77 68 69 63 68  lt values, which
162b0 20 73 68 6f 75 6c 64 20 62 65 20 6e 75 6c 6c 20   should be null 
162c0 66 6f 72 20 62 6f 74 68 2e 0d 0a 20 20 20 20 20  for both...     
162d0 20 20 20 20 20 23 20 20 20 20 20 20 20 53 69 6e       #       Sin
162e0 63 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 77  ce the sqlite3_w
162f0 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
16300 72 79 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  ry function is a
16310 76 61 69 6c 61 62 6c 65 2c 0d 0a 20 20 20 20 20  vailable,..     
16320 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73 65       #       use
16330 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20   it...          
16340 23 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  #..          for
16350 20 7b 73 65 74 20 69 6e 64 65 78 20 31 7d 20 7b   {set index 1} {
16360 24 69 6e 64 65 78 20 3c 20 33 7d 20 7b 69 6e 63  $index < 3} {inc
16370 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20 20  r index} {..    
16380 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
16390 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
163a0 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
163b0 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
163c0 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
163d0 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
163e0 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61  Data.SQLite.Unsa
163f0 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20  feNativeMethods 
16400 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
16410 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e       sqlite3_win
16420 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79  32_set_directory
16430 20 24 69 6e 64 65 78 20 6e 75 6c 6c 0d 0a 20 20   $index null..  
16440 20 20 20 20 20 20 20 20 20 20 7d 20 72 65 73 75            } resu
16450 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  lt] == 0} then {
16460 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
16470 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
16480 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
16490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164a0 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74  "---- call sqlit
164b0 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72  e3_win32_set_dir
164c0 65 63 74 6f 72 79 28 22 20 24 69 6e 64 65 78 20  ectory(" $index 
164d0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
164e0 20 20 20 20 20 22 2c 20 6e 75 6c 6c 29 2e 2e 2e       ", null)...
164f0 20 6f 6b 3a 20 22 20 24 72 65 73 75 6c 74 20 5c   ok: " $result \
16500 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
16510 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
16520 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
16530 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
16540 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
16550 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61          "---- ca
16560 6c 6c 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  ll sqlite3_win32
16570 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28 22  _set_directory("
16580 20 24 69 6e 64 65 78 20 5c 0d 0a 20 20 20 20 20   $index \..     
16590 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2c 20               ", 
165a0 6e 75 6c 6c 29 2e 2e 2e 20 65 72 72 6f 72 3a 20  null)... error: 
165b0 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c  " \n\t $result \
165c0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
165d0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
165e0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
165f0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
16600 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
16610 6c 20 6e 6f 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20  l no\n....      
16620 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
16630 4f 54 45 3a 20 44 6f 65 73 20 6f 75 72 20 63 61  OTE: Does our ca
16640 6c 6c 65 72 20 77 61 6e 74 20 74 6f 20 72 65 73  ller want to res
16650 65 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 69  et the directori
16660 65 73 3f 20 20 54 68 69 73 20 63 61 6e 20 6f 6e  es?  This can on
16670 6c 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ly..        #   
16680 20 20 20 20 62 65 20 70 65 72 66 6f 72 6d 65 64      be performed
16690 20 69 66 20 53 51 4c 69 74 65 20 69 73 20 6c 6f   if SQLite is lo
166a0 61 64 65 64 20 61 6e 64 20 72 65 61 64 79 20 66  aded and ready f
166b0 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 74 65  or use by the te
166c0 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  st..        #   
166d0 20 20 20 20 73 75 69 74 65 2e 0d 0a 20 20 20 20      suite...    
166e0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
166f0 66 20 7b 24 72 65 73 65 74 20 26 26 20 5b 69 73  f {$reset && [is
16700 53 51 4c 69 74 65 52 65 61 64 79 5d 7d 20 74 68  SQLiteReady]} th
16710 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
16720 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
16730 4f 54 45 3a 20 4e 6f 77 20 6d 61 6b 65 20 73 75  OTE: Now make su
16740 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
16750 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 64 69  and temporary di
16760 72 65 63 74 6f 72 69 65 73 20 61 72 65 0d 0a 20  rectories are.. 
16770 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
16780 20 72 65 73 65 74 20 74 68 65 69 72 20 64 65 66   reset their def
16790 61 75 6c 74 20 76 61 6c 75 65 73 2c 20 77 68 69  ault values, whi
167a0 63 68 20 73 68 6f 75 6c 64 20 62 65 20 6e 75 6c  ch should be nul
167b0 6c 20 66 6f 72 20 62 6f 74 68 2e 0d 0a 20 20 20  l for both...   
167c0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 53         #       S
167d0 69 6e 63 65 20 74 68 65 20 73 71 6c 69 74 65 33  ince the sqlite3
167e0 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63  _win32_set_direc
167f0 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20 64 6f  tory function do
16800 65 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20  es not..        
16810 20 20 23 20 20 20 20 20 20 20 61 70 70 65 61 72    #       appear
16820 20 74 6f 20 62 65 20 61 76 61 69 6c 61 62 6c 65   to be available
16830 2c 20 75 73 65 20 74 68 65 20 61 73 73 6f 63 69  , use the associ
16840 61 74 65 64 20 50 52 41 47 4d 41 20 63 6f 6d 6d  ated PRAGMA comm
16850 61 6e 64 73 0d 0a 20 20 20 20 20 20 20 20 20 20  ands..          
16860 23 20 20 20 20 20 20 20 69 6e 73 74 65 61 64 2e  #       instead.
16870 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
16880 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
16890 20 64 69 72 65 63 74 6f 72 79 20 5b 6c 69 73 74   directory [list
168a0 20 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65   data_store_dire
168b0 63 74 6f 72 79 20 74 65 6d 70 5f 73 74 6f 72 65  ctory temp_store
168c0 5f 64 69 72 65 63 74 6f 72 79 5d 20 7b 0d 0a 20  _directory] {.. 
168d0 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73             set s
168e0 71 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  ql [appendArgs "
168f0 50 52 41 47 4d 41 20 22 20 24 64 69 72 65 63 74  PRAGMA " $direct
16900 6f 72 79 20 22 20 3d 20 5c 22 5c 22 3b 22 5d 0d  ory " = \"\";"].
16910 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
16920 66 20 7b 5b 63 61 74 63 68 20 7b 65 78 65 63 75  f {[catch {execu
16930 74 65 53 71 6c 20 24 73 71 6c 7d 20 72 65 73 75  teSql $sql} resu
16940 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  lt] == 0} then {
16950 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
16960 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
16970 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
16980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16990 22 2d 2d 2d 2d 20 65 78 65 63 75 74 65 20 50 52  "---- execute PR
169a0 41 47 4d 41 20 22 20 24 64 69 72 65 63 74 6f 72  AGMA " $director
169b0 79 20 22 2e 2e 2e 20 6f 6b 3a 20 5c 22 22 20 5c  y "... ok: \"" \
169c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
169d0 20 20 20 20 24 72 65 73 75 6c 74 20 5c 22 5c 6e      $result \"\n
169e0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
169f0 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
16a00 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
16a10 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
16a20 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
16a30 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 65 78 65         "---- exe
16a40 63 75 74 65 20 50 52 41 47 4d 41 20 22 20 24 64  cute PRAGMA " $d
16a50 69 72 65 63 74 6f 72 79 20 22 2e 2e 2e 20 65 72  irectory "... er
16a60 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20  ror: " \..      
16a70 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74              \n\t
16a80 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20   $result \n]..  
16a90 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
16aa0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
16ab0 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
16ac0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
16ad0 20 4e 4f 54 45 3a 20 46 69 6e 61 6c 6c 79 2c 20   NOTE: Finally, 
16ae0 73 68 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74  show the current
16af0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61   value of the da
16b00 74 61 62 61 73 65 20 61 6e 64 20 74 65 6d 70 6f  tabase and tempo
16b10 72 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20  rary..      #   
16b20 20 20 20 20 64 69 72 65 63 74 6f 72 69 65 73 2e      directories.
16b30 20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20    This can only 
16b40 62 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20  be performed if 
16b50 53 51 4c 69 74 65 20 69 73 20 6c 6f 61 64 65 64  SQLite is loaded
16b60 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
16b70 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20 75 73  and ready for us
16b80 65 20 62 79 20 74 68 65 20 74 65 73 74 20 73 75  e by the test su
16b90 69 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ite...      #.. 
16ba0 20 20 20 20 20 69 66 20 7b 5b 69 73 53 51 4c 69       if {[isSQLi
16bb0 74 65 52 65 61 64 79 5d 7d 20 74 68 65 6e 20 7b  teReady]} then {
16bc0 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  ..        foreac
16bd0 68 20 64 69 72 65 63 74 6f 72 79 20 5b 6c 69 73  h directory [lis
16be0 74 20 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72  t data_store_dir
16bf0 65 63 74 6f 72 79 20 74 65 6d 70 5f 73 74 6f 72  ectory temp_stor
16c00 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 7b 0d 0a  e_directory] {..
16c10 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
16c20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
16c30 41 72 67 73 20 22 2d 2d 2d 2d 20 63 68 65 63 6b  Args "---- check
16c40 69 6e 67 20 22 20 24 64 69 72 65 63 74 6f 72 79  ing " $directory
16c50 20 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20   "... "]....    
16c60 20 20 20 20 20 20 73 65 74 20 73 71 6c 20 5b 61        set sql [a
16c70 70 70 65 6e 64 41 72 67 73 20 22 50 52 41 47 4d  ppendArgs "PRAGM
16c80 41 20 22 20 24 64 69 72 65 63 74 6f 72 79 20 5c  A " $directory \
16c90 3b 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  ;]....          
16ca0 69 66 20 7b 5b 63 61 74 63 68 20 7b 65 78 65 63  if {[catch {exec
16cb0 75 74 65 53 71 6c 20 24 73 71 6c 20 73 63 61 6c  uteSql $sql scal
16cc0 61 72 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30  ar} result] == 0
16cd0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
16ce0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
16cf0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
16d00 20 22 6f 6b 3a 20 5c 22 22 20 24 72 65 73 75 6c   "ok: \"" $resul
16d10 74 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  t \"\n]..       
16d20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
16d30 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
16d40 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
16d50 72 67 73 20 22 65 72 72 6f 72 3a 20 22 20 5c 6e  rgs "error: " \n
16d60 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a  \t $result \n]..
16d70 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
16d80 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
16d90 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
16da0 72 6f 63 20 6c 6f 61 64 53 51 4c 69 74 65 54 65  roc loadSQLiteTe
16db0 73 74 53 65 74 74 69 6e 67 73 20 7b 20 63 68 61  stSettings { cha
16dc0 6e 6e 65 6c 20 7b 73 75 66 66 69 78 20 22 22 7d  nnel {suffix ""}
16dd0 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d   {quiet false} }
16de0 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
16df0 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20     # NOTE: Skip 
16e00 6c 6f 61 64 69 6e 67 20 74 68 65 20 73 65 74 74  loading the sett
16e10 69 6e 67 73 20 69 66 20 74 68 65 69 72 20 75 73  ings if their us
16e20 61 67 65 20 68 61 73 20 62 65 65 6e 20 64 69 73  age has been dis
16e30 61 62 6c 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d  abled...      #.
16e40 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66  .      if {![inf
16e50 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71  o exists ::no(sq
16e60 6c 69 74 65 54 65 73 74 53 65 74 74 69 6e 67 73  liteTestSettings
16e70 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
16e80 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
16e90 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 63 75 73 74   NOTE: Load cust
16ea0 6f 6d 20 70 65 72 2d 75 73 65 72 20 61 6e 64 2f  om per-user and/
16eb0 6f 72 20 70 65 72 2d 68 6f 73 74 20 74 65 73 74  or per-host test
16ec0 20 73 65 74 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a   settings now...
16ed0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
16ee0 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
16ef0 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f  sts ::tcl_platfo
16f00 72 6d 28 75 73 65 72 29 5d 7d 20 74 68 65 6e 20  rm(user)]} then 
16f10 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
16f20 20 75 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c   userSettingsFil
16f30 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  eName [file join
16f40 20 5b 67 65 74 43 6f 6d 6d 6f 6e 44 69 72 65 63   [getCommonDirec
16f50 74 6f 72 79 5d 20 5c 0d 0a 20 20 20 20 20 20 20  tory] \..       
16f60 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72         [appendAr
16f70 67 73 20 73 65 74 74 69 6e 67 73 20 24 73 75 66  gs settings $suf
16f80 66 69 78 20 2e 20 24 3a 3a 74 63 6c 5f 70 6c 61  fix . $::tcl_pla
16f90 74 66 6f 72 6d 28 75 73 65 72 29 20 2e 65 61 67  tform(user) .eag
16fa0 6c 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  le]]....        
16fb0 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73    if {[file exis
16fc0 74 73 20 24 75 73 65 72 53 65 74 74 69 6e 67 73  ts $userSettings
16fd0 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  FileName]} then 
16fe0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
16ff0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
17000 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
17010 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
17020 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
17030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17040 20 20 22 2d 2d 2d 2d 20 6c 6f 61 64 69 6e 67 20    "---- loading 
17050 70 65 72 2d 75 73 65 72 20 74 65 73 74 20 73 65  per-user test se
17060 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20  ttings file \"" 
17070 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
17080 20 20 20 20 20 24 75 73 65 72 53 65 74 74 69 6e       $userSettin
17090 67 73 46 69 6c 65 4e 61 6d 65 20 5c 22 2e 2e 2e  gsFileName \"...
170a0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n]..           
170b0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
170c0 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
170d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75 70                up
170e0 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 73 6f  level 1 [list so
170f0 75 72 63 65 20 24 75 73 65 72 53 65 74 74 69 6e  urce $userSettin
17100 67 73 46 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20  gsFileName]..   
17110 20 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f 72           } error
17120 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
17130 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
17140 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
17150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
17160 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
17170 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
17180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17190 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
171a0 61 69 6c 65 64 20 74 6f 20 6c 6f 61 64 20 70 65  ailed to load pe
171b0 72 2d 75 73 65 72 20 73 65 74 74 69 6e 67 73 20  r-user settings 
171c0 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20  file \"" \..    
171d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171e0 24 75 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c  $userSettingsFil
171f0 65 4e 61 6d 65 20 22 5c 22 2c 20 65 72 72 6f 72  eName "\", error
17200 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20  : " \n\t $error 
17210 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n]..           
17220 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
17230 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
17240 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
17250 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
17260 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
17270 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
17280 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
17290 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
172a0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b          "---- sk
172b0 69 70 70 65 64 20 6c 6f 61 64 69 6e 67 20 70 65  ipped loading pe
172c0 72 2d 75 73 65 72 20 74 65 73 74 20 73 65 74 74  r-user test sett
172d0 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d  ings file \"" \.
172e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
172f0 20 20 20 24 75 73 65 72 53 65 74 74 69 6e 67 73     $userSettings
17300 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 69 74  FileName "\", it
17310 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c   does not exist\
17320 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n"]..           
17330 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
17340 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
17350 20 20 20 20 20 20 23 23 23 23 23 23 23 23 23 23        ##########
17360 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
17370 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
17380 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
17390 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d  #############...
173a0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  .        if {[in
173b0 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f  fo exists ::tcl_
173c0 70 6c 61 74 66 6f 72 6d 28 68 6f 73 74 29 5d 7d  platform(host)]}
173d0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
173e0 20 20 20 73 65 74 20 68 6f 73 74 53 65 74 74 69     set hostSetti
173f0 6e 67 73 46 69 6c 65 4e 61 6d 65 20 5b 66 69 6c  ngsFileName [fil
17400 65 20 6a 6f 69 6e 20 5b 67 65 74 43 6f 6d 6d 6f  e join [getCommo
17410 6e 44 69 72 65 63 74 6f 72 79 5d 20 5c 0d 0a 20  nDirectory] \.. 
17420 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 61 70               [ap
17430 70 65 6e 64 41 72 67 73 20 73 65 74 74 69 6e 67  pendArgs setting
17440 73 20 24 73 75 66 66 69 78 20 2e 20 24 3a 3a 74  s $suffix . $::t
17450 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 68 6f 73 74  cl_platform(host
17460 29 20 2e 65 61 67 6c 65 5d 5d 0d 0a 0d 0a 20 20  ) .eagle]]....  
17470 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c          if {[fil
17480 65 20 65 78 69 73 74 73 20 24 68 6f 73 74 53 65  e exists $hostSe
17490 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 5d 7d  ttingsFileName]}
174a0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
174b0 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
174c0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
174d0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
174e0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
174f0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
17500 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 6f          "---- lo
17510 61 64 69 6e 67 20 70 65 72 2d 68 6f 73 74 20 74  ading per-host t
17520 65 73 74 20 73 65 74 74 69 6e 67 73 20 66 69 6c  est settings fil
17530 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  e \"" \..       
17540 20 20 20 20 20 20 20 20 20 20 20 24 68 6f 73 74             $host
17550 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65  SettingsFileName
17560 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 20 20 20 20 20   \"...\n]..     
17570 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
17580 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
17590 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
175a0 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c      uplevel 1 [l
175b0 69 73 74 20 73 6f 75 72 63 65 20 24 68 6f 73 74  ist source $host
175c0 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65  SettingsFileName
175d0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
175e0 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d   error]} then {.
175f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
17600 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
17610 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
17620 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
17630 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
17640 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17650 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
17660 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 6c  ING: failed to l
17670 6f 61 64 20 70 65 72 2d 68 6f 73 74 20 73 65 74  oad per-host set
17680 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c  tings file \"" \
17690 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
176a0 20 20 20 20 20 20 24 68 6f 73 74 53 65 74 74 69        $hostSetti
176b0 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c  ngsFileName "\",
176c0 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24   error: " \n\t $
176d0 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20  error \n]..     
176e0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
176f0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
17700 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
17710 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
17720 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
17730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
17740 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
17750 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
17760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
17770 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6c 6f 61 64  --- skipped load
17780 69 6e 67 20 70 65 72 2d 68 6f 73 74 20 74 65 73  ing per-host tes
17790 74 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20  t settings file 
177a0 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
177b0 20 20 20 20 20 20 20 20 20 24 68 6f 73 74 53 65           $hostSe
177c0 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22  ttingsFileName "
177d0 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  \", it does not 
177e0 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20  exist\n"]..     
177f0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
17800 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
17810 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
17820 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 75  .....    proc ru
17830 6e 53 51 4c 69 74 65 54 65 73 74 50 72 6f 6c 6f  nSQLiteTestProlo
17840 67 75 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  gue {} {..      
17850 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
17860 20 53 6b 69 70 20 72 75 6e 6e 69 6e 67 20 6f 75   Skip running ou
17870 72 20 63 75 73 74 6f 6d 20 70 72 6f 6c 6f 67 75  r custom prologu
17880 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20 6f 6e  e if the main on
17890 65 20 68 61 73 20 62 65 65 6e 0d 0a 20 20 20 20  e has been..    
178a0 20 20 23 20 20 20 20 20 20 20 73 6b 69 70 70 65    #       skippe
178b0 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  d...      #..   
178c0 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
178d0 69 73 74 73 20 3a 3a 6e 6f 28 70 72 6f 6c 6f 67  ists ::no(prolog
178e0 75 65 2e 65 61 67 6c 65 29 5d 7d 20 74 68 65 6e  ue.eagle)]} then
178f0 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
17900 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c         # NOTE: L
17910 6f 61 64 20 74 68 65 20 22 62 65 66 6f 72 65 2d  oad the "before-
17920 63 6f 6e 73 74 72 61 69 6e 74 73 22 20 63 75 73  constraints" cus
17930 74 6f 6d 20 70 65 72 2d 75 73 65 72 20 61 6e 64  tom per-user and
17940 2f 6f 72 20 70 65 72 2d 68 6f 73 74 0d 0a 20 20  /or per-host..  
17950 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65        #       te
17960 73 74 20 73 65 74 74 69 6e 67 73 20 6e 6f 77 2e  st settings now.
17970 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
17980 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b       uplevel 1 [
17990 6c 69 73 74 20 6c 6f 61 64 53 51 4c 69 74 65 54  list loadSQLiteT
179a0 65 73 74 53 65 74 74 69 6e 67 73 20 24 3a 3a 74  estSettings $::t
179b0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 2e 62 65 66  est_channel .bef
179c0 6f 72 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ore]....        
179d0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
179e0 45 3a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  E: Determine the
179f0 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 6e 61   names of the na
17a00 74 69 76 65 20 70 6c 61 74 66 6f 72 6d 20 61 6e  tive platform an
17a10 64 20 61 72 63 68 69 74 65 63 74 75 72 65 2e 0d  d architecture..
17a20 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
17a30 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d      set platform
17a40 20 5b 67 65 74 42 75 69 6c 64 50 6c 61 74 66 6f   [getBuildPlatfo
17a50 72 6d 20 74 72 75 65 5d 0d 0a 20 20 20 20 20 20  rm true]..      
17a60 20 20 73 65 74 20 61 72 63 68 69 74 65 63 74 75    set architectu
17a70 72 65 20 5b 61 72 63 68 69 74 65 63 74 75 72 65  re [architecture
17a80 46 6f 72 50 6c 61 74 66 6f 72 6d 20 24 70 6c 61  ForPlatform $pla
17a90 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20  tform]....      
17aa0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
17ab0 4f 54 45 3a 20 53 68 6f 77 20 74 68 65 20 70 6c  OTE: Show the pl
17ac0 61 74 66 6f 72 6d 20 61 6e 64 20 61 72 63 68 69  atform and archi
17ad0 74 65 63 74 75 72 65 20 75 73 65 64 20 74 6f 20  tecture used to 
17ae0 68 65 6c 70 20 6c 6f 63 61 74 65 20 74 68 65 0d  help locate the.
17af0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
17b00 20 6e 61 74 69 76 65 20 62 75 69 6c 64 20 66 69   native build fi
17b10 6c 65 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  les...        #.
17b20 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
17b30 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
17b40 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
17b50 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
17b60 70 6c 61 74 66 6f 72 6d 20 66 6f 72 20 6c 6f 63  platform for loc
17b70 61 74 69 6e 67 20 6e 61 74 69 76 65 20 62 75 69  ating native bui
17b80 6c 64 20 66 69 6c 65 73 20 69 73 20 5c 22 22 20  ld files is \"" 
17b90 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24  \..            $
17ba0 70 6c 61 74 66 6f 72 6d 20 5c 22 5c 6e 5d 0d 0a  platform \"\n]..
17bb0 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
17bc0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
17bd0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
17be0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
17bf0 20 61 72 63 68 69 74 65 63 74 75 72 65 20 66 6f   architecture fo
17c00 72 20 6c 6f 63 61 74 69 6e 67 20 6e 61 74 69 76  r locating nativ
17c10 65 20 62 75 69 6c 64 20 66 69 6c 65 73 20 69 73  e build files is
17c20 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
17c30 20 20 20 20 24 61 72 63 68 69 74 65 63 74 75 72      $architectur
17c40 65 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20  e \"\n]....     
17c50 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
17c60 4e 4f 54 45 3a 20 42 75 69 6c 64 20 61 20 6c 69  NOTE: Build a li
17c70 73 74 20 6f 66 20 63 6f 6e 66 69 67 75 72 61 74  st of configurat
17c80 69 6f 6e 20 66 69 6c 65 73 20 74 68 61 74 20 77  ion files that w
17c90 65 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20  e handle...     
17ca0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65     #..        se
17cb0 74 20 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65  t configFileName
17cc0 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20  s [list \..     
17cd0 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
17ce0 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 2e 63 6f  ta.SQLite.dll.co
17cf0 6e 66 69 67 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  nfig]....       
17d00 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
17d10 54 45 3a 20 42 75 69 6c 64 20 61 20 6c 69 73 74  TE: Build a list
17d20 20 6f 66 20 61 75 78 69 6c 69 61 72 79 20 4d 61   of auxiliary Ma
17d30 6e 61 67 65 64 20 44 65 62 75 67 67 69 6e 67 20  naged Debugging 
17d40 41 73 73 69 73 74 61 6e 74 73 20 28 4d 44 41 29  Assistants (MDA)
17d50 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
17d60 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20    configuration 
17d70 66 69 6c 65 73 20 74 68 61 74 20 77 65 20 68 61  files that we ha
17d80 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  ndle...        #
17d90 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d 64  ..        set md
17da0 61 43 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73  aConfigFileNames
17db0 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20   [list \..      
17dc0 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c        EagleShell
17dd0 33 32 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69  32.exe.mda.confi
17de0 67 20 49 6e 73 74 61 6c 6c 65 72 2e 65 78 65 2e  g Installer.exe.
17df0 6d 64 61 2e 63 6f 6e 66 69 67 20 5c 0d 0a 20 20  mda.config \..  
17e00 20 20 20 20 20 20 20 20 20 20 74 65 73 74 2e 65            test.e
17e10 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 74 65  xe.mda.config te
17e20 73 74 6c 69 6e 71 2e 65 78 65 2e 6d 64 61 2e 63  stlinq.exe.mda.c
17e30 6f 6e 66 69 67 20 5c 0d 0a 20 20 20 20 20 20 20  onfig \..       
17e40 20 20 20 20 20 74 65 73 74 65 66 36 2e 65 78 65       testef6.exe
17e50 2e 6d 64 61 2e 63 6f 6e 66 69 67 5d 0d 0a 0d 0a  .mda.config]....
17e60 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
17e70 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64     # NOTE: Build
17e80 20 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78 74   the list of ext
17e90 65 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61 74  ernal files that
17ea0 20 77 65 20 68 61 6e 64 6c 65 2e 20 20 53 6f 6d   we handle.  Som
17eb0 65 20 6f 66 0d 0a 20 20 20 20 20 20 20 20 23 20  e of..        # 
17ec0 20 20 20 20 20 20 74 68 65 73 65 20 66 69 6c 65        these file
17ed0 73 20 6d 61 79 20 62 65 20 6e 61 74 69 76 65 20  s may be native 
17ee0 61 6e 64 2f 6f 72 20 6d 61 6e 61 67 65 64 20 61  and/or managed a
17ef0 73 73 65 6d 62 6c 69 65 73 20 74 68 61 74 20 61  ssemblies that a
17f00 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  re..        #   
17f10 20 20 20 20 72 65 71 75 69 72 65 64 20 74 6f 20      required to 
17f20 70 65 72 66 6f 72 6d 20 76 61 72 69 6f 75 73 20  perform various 
17f30 74 65 73 74 73 2e 0d 0a 20 20 20 20 20 20 20 20  tests...        
17f40 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 65  #..        set e
17f50 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 73  xternalFileNames
17f60 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20   [list \..      
17f70 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e        [file join
17f80 20 45 6e 74 69 74 79 46 72 61 6d 65 77 6f 72 6b   EntityFramework
17f90 20 6c 69 62 20 5b 73 74 72 69 6e 67 20 6d 61 70   lib [string map
17fa0 20 5b 6c 69 73 74 20 46 78 20 22 22 5d 20 5b 73   [list Fx ""] [s
17fb0 74 72 69 6e 67 20 5c 0d 0a 20 20 20 20 20 20 20  tring \..       
17fc0 20 20 20 20 20 6d 61 70 20 5b 6c 69 73 74 20 6e       map [list n
17fd0 65 74 46 78 34 35 31 20 6e 65 74 46 78 34 35 5d  etFx451 netFx45]
17fe0 20 5b 67 65 74 42 75 69 6c 64 4e 65 74 46 78 5d   [getBuildNetFx]
17ff0 5d 5d 20 45 6e 74 69 74 79 46 72 61 6d 65 77 6f  ]] EntityFramewo
18000 72 6b 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20 20  rk.dll]]....    
18010 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
18020 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65   NOTE: Build the
18030 20 6c 69 73 74 20 6f 66 20 6e 61 74 69 76 65 20   list of native 
18040 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 73 20 74  assembly files t
18050 68 61 74 20 77 65 20 68 61 6e 64 6c 65 2e 20 20  hat we handle.  
18060 54 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  The..        #  
18070 20 20 20 20 20 72 65 61 73 6f 6e 20 74 68 65 20       reason the 
18080 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  "System.Data.SQL
18090 69 74 65 2e 64 6c 6c 22 20 66 69 6c 65 20 69 73  ite.dll" file is
180a0 20 69 6e 63 6c 75 64 65 64 20 68 65 72 65 20 69   included here i
180b0 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  s..        #    
180c0 20 20 20 62 65 63 61 75 73 65 20 69 74 20 63 6f     because it co
180d0 75 6c 64 20 62 65 20 74 68 65 20 6d 69 78 65 64  uld be the mixed
180e0 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 2e 0d  -mode assembly..
180f0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
18100 20 20 20 20 73 65 74 20 6e 61 74 69 76 65 46 69      set nativeFi
18110 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74 20 5c 0d  leNames [list \.
18120 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
18130 69 74 65 33 2e 64 6c 6c 20 53 51 4c 69 74 65 2e  ite3.dll SQLite.
18140 49 6e 74 65 72 6f 70 2e 64 6c 6c 20 53 79 73 74  Interop.dll Syst
18150 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
18160 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  ll]....        #
18170 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
18180 3a 20 42 75 69 6c 64 20 74 68 65 20 6c 69 73 74  : Build the list
18190 20 6f 66 20 6d 61 6e 61 67 65 64 20 61 73 73 65   of managed asse
181a0 6d 62 6c 79 20 66 69 6c 65 73 20 74 68 61 74 20  mbly files that 
181b0 77 65 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20  we handle...    
181c0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
181d0 65 74 20 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61  et managedFileNa
181e0 6d 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20  mes [list \..   
181f0 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
18200 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 20  Data.SQLite.dll 
18210 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
18220 74 65 2e 4c 69 6e 71 2e 64 6c 6c 20 5c 0d 0a 20  te.Linq.dll \.. 
18230 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
18240 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 45 46  m.Data.SQLite.EF
18250 36 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20  6.dll]....      
18260 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
18270 4f 54 45 3a 20 52 65 6d 6f 76 65 20 61 6e 79 20  OTE: Remove any 
18280 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 73  test constraints
18290 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74   that refer to t
182a0 68 65 20 6e 61 74 69 76 65 20 61 6e 64 2f 6f 72  he native and/or
182b0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
182c0 20 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62    managed assemb
182d0 6c 79 20 66 69 6c 65 73 20 74 68 61 74 20 77 65  ly files that we
182e0 20 68 61 6e 64 6c 65 20 75 6e 6c 65 73 73 20 66   handle unless f
182f0 6f 72 62 69 64 64 65 6e 20 66 72 6f 6d 0d 0a 20  orbidden from.. 
18300 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64         #       d
18310 6f 69 6e 67 20 73 6f 2e 0d 0a 20 20 20 20 20 20  oing so...      
18320 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
18330 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
18340 3a 6e 6f 28 73 71 6c 69 74 65 52 65 6d 6f 76 65  :no(sqliteRemove
18350 43 6f 6e 73 74 72 61 69 6e 74 73 29 5d 7d 20 74  Constraints)]} t
18360 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
18370 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
18380 65 20 24 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d  e $configFileNam
18390 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
183a0 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69    removeConstrai
183b0 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
183c0 69 6c 65 5f 20 24 66 69 6c 65 4e 61 6d 65 5d 0d  ile_ $fileName].
183d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
183e0 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
183f0 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 64 61 43  h fileName $mdaC
18400 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b  onfigFileNames {
18410 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
18420 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  moveConstraint [
18430 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
18440 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20   $fileName]..   
18450 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
18460 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
18470 6c 65 4e 61 6d 65 20 24 65 78 74 65 72 6e 61 6c  leName $external
18480 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
18490 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76 65 43           removeC
184a0 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
184b0 64 41 72 67 73 20 66 69 6c 65 5f 20 5b 66 69 6c  dArgs file_ [fil
184c0 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65  e tail $fileName
184d0 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  ]]..          }.
184e0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ...          for
184f0 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e  each fileName $n
18500 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b  ativeFileNames {
18510 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
18520 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  moveConstraint [
18530 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
18540 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20   $fileName]..   
18550 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
18560 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
18570 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64 46  leName $managedF
18580 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
18590 20 20 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f          removeCo
185a0 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
185b0 41 72 67 73 20 66 69 6c 65 5f 20 24 66 69 6c 65  Args file_ $file
185c0 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20  Name]..         
185d0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
185e0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
185f0 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70      # NOTE: Skip
18600 20 61 6c 6c 20 53 79 73 74 65 6d 2e 44 61 74 61   all System.Data
18610 2e 53 51 4c 69 74 65 20 72 65 6c 61 74 65 64 20  .SQLite related 
18620 66 69 6c 65 20 68 61 6e 64 6c 69 6e 67 20 28 64  file handling (d
18630 65 6c 65 74 69 6e 67 2c 0d 0a 20 20 20 20 20 20  eleting,..      
18640 20 20 23 20 20 20 20 20 20 20 63 6f 70 79 69 6e    #       copyin
18650 67 2c 20 61 6e 64 20 6c 6f 61 64 69 6e 67 29 20  g, and loading) 
18660 69 66 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a  if instructed...
18670 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
18680 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
18690 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65  ists ::no(sqlite
186a0 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
186b0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
186c0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
186d0 53 6b 69 70 20 74 72 79 69 6e 67 20 74 6f 20 64  Skip trying to d
186e0 65 6c 65 74 65 20 61 6e 79 20 66 69 6c 65 73 20  elete any files 
186f0 69 66 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a  if instructed...
18700 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
18710 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
18720 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65  o exists ::no(de
18730 6c 65 74 65 53 71 6c 69 74 65 46 69 6c 65 73 29  leteSqliteFiles)
18740 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
18750 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
18760 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65  o exists ::no(de
18770 6c 65 74 65 53 71 6c 69 74 65 43 6f 6e 66 69 67  leteSqliteConfig
18780 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
18790 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .              f
187a0 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
187b0 24 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73  $configFileNames
187c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
187d0 20 20 20 20 74 72 79 44 65 6c 65 74 65 42 69 6e      tryDeleteBin
187e0 61 72 79 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d  aryFile $fileNam
187f0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
18800 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
18810 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
18820 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
18830 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71  ts ::no(deleteSq
18840 6c 69 74 65 45 78 74 65 72 6e 61 6c 46 69 6c 65  liteExternalFile
18850 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
18860 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61             forea
18870 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 64 61  ch fileName $mda
18880 43 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20  ConfigFileNames 
18890 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
188a0 20 20 20 74 72 79 44 65 6c 65 74 65 42 75 69 6c     tryDeleteBuil
188b0 64 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d  dFile $fileName.
188c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
188d0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
188e0 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
188f0 6d 65 20 24 65 78 74 65 72 6e 61 6c 46 69 6c 65  me $externalFile
18900 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
18910 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c 65           tryDele
18920 74 65 42 69 6e 61 72 79 46 69 6c 65 20 24 66 69  teBinaryFile $fi
18930 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20  leName..        
18940 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
18950 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
18960 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
18970 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c   exists ::no(del
18980 65 74 65 53 71 6c 69 74 65 4e 61 74 69 76 65 46  eteSqliteNativeF
18990 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
189a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
189b0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
189c0 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74  ::no(deleteSqlit
189d0 65 49 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d  eImplicitFiles)]
189e0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
189f0 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
18a00 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69  h fileName $nati
18a10 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  veFileNames {.. 
18a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a30 20 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62   tryDeleteAssemb
18a40 6c 79 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20  ly $fileName..  
18a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
18a60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
18a70 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
18a80 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
18a90 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53  sts ::no(deleteS
18aa0 71 6c 69 74 65 4e 6f 6e 49 6d 70 6c 69 63 69 74  qliteNonImplicit
18ab0 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
18ac0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18ad0 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
18ae0 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71  ts ::no(deleteSq
18af0 6c 69 74 65 50 6c 61 74 66 6f 72 6d 46 69 6c 65  litePlatformFile
18b00 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  s)] && \..      
18b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73                [s
18b20 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c  tring length $pl
18b30 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65  atform] > 0} the
18b40 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
18b50 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
18b60 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46  ileName $nativeF
18b70 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
18b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b90 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c  tryDeleteAssembl
18ba0 79 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61  y $fileName $pla
18bb0 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20 20  tform..         
18bc0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
18bd0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
18be0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18bf0 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
18c00 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71  ts ::no(deleteSq
18c10 6c 69 74 65 41 72 63 68 69 74 65 63 74 75 72 65  liteArchitecture
18c20 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20  Files)] && \..  
18c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c40 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
18c50 20 24 61 72 63 68 69 74 65 63 74 75 72 65 5d 20   $architecture] 
18c60 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
18c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
18c80 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
18c90 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73  $nativeFileNames
18ca0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
18cb0 20 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74          tryDelet
18cc0 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e  eAssembly $fileN
18cd0 61 6d 65 20 24 61 72 63 68 69 74 65 63 74 75 72  ame $architectur
18ce0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
18cf0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
18d00 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
18d10 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
18d20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
18d30 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
18d40 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
18d50 64 65 6c 65 74 65 53 71 6c 69 74 65 4d 61 6e 61  deleteSqliteMana
18d60 67 65 64 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  gedFiles)]} then
18d70 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
18d80 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
18d90 6d 65 20 24 6d 61 6e 61 67 65 64 46 69 6c 65 4e  me $managedFileN
18da0 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
18db0 20 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74          tryDelet
18dc0 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e  eAssembly $fileN
18dd0 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ame..           
18de0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
18df0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
18e00 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  ....          #.
18e10 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
18e20 45 3a 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65  E: Check for the
18e30 20 22 61 75 74 6f 53 65 6c 65 63 74 22 20 72 75   "autoSelect" ru
18e40 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 2e 20 20 49  ntime option.  I
18e50 66 20 70 72 65 73 65 6e 74 2c 0d 0a 20 20 20 20  f present,..    
18e60 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 74        #       at
18e70 74 65 6d 70 74 20 74 6f 20 61 75 74 6f 6d 61 74  tempt to automat
18e80 69 63 61 6c 6c 79 20 73 65 6c 65 63 74 20 74 68  ically select th
18e90 65 20 66 69 72 73 74 20 61 76 61 69 6c 61 62 6c  e first availabl
18ea0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  e..          #  
18eb0 20 20 20 20 20 62 75 69 6c 64 20 28 6f 72 20 22       build (or "
18ec0 72 65 6c 65 61 73 65 22 29 20 6f 66 20 53 51 4c  release") of SQL
18ed0 69 74 65 20 61 6e 64 20 53 79 73 74 65 6d 2e 44  ite and System.D
18ee0 61 74 61 2e 53 51 4c 69 74 65 0d 0a 20 20 20 20  ata.SQLite..    
18ef0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66 6f        #       fo
18f00 72 20 75 73 65 20 77 69 74 68 20 74 68 65 20 74  r use with the t
18f10 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20  est suite...    
18f20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
18f30 20 20 20 69 66 20 7b 5b 68 61 73 52 75 6e 74 69     if {[hasRunti
18f40 6d 65 4f 70 74 69 6f 6e 20 61 75 74 6f 53 65 6c  meOption autoSel
18f50 65 63 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ect]} then {..  
18f60 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
18f70 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 42 75  checkForSQLiteBu
18f80 69 6c 64 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  ilds $::test_cha
18f90 6e 6e 65 6c 20 74 72 75 65 5d 7d 20 74 68 65 6e  nnel true]} then
18fa0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
18fb0 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65    checkForSQLite
18fc0 52 65 6c 65 61 73 65 73 20 24 3a 3a 74 65 73 74  Releases $::test
18fd0 5f 63 68 61 6e 6e 65 6c 20 74 72 75 65 0d 0a 20  _channel true.. 
18fe0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
18ff0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
19000 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
19010 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70      # NOTE: Skip
19020 20 74 72 79 69 6e 67 20 74 6f 20 76 65 72 69 66   trying to verif
19030 79 20 74 68 65 20 62 75 69 6c 64 20 64 69 72 65  y the build dire
19040 63 74 6f 72 79 20 69 66 20 69 6e 73 74 72 75 63  ctory if instruc
19050 74 65 64 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  ted;..          
19060 23 20 20 20 20 20 20 20 6f 74 68 65 72 77 69 73  #       otherwis
19070 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20  e, make sure it 
19080 61 63 74 75 61 6c 6c 79 20 65 78 69 73 74 73 20  actually exists 
19090 6f 72 20 68 61 6c 74 20 74 68 65 20 65 6e 74 69  or halt the enti
190a0 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  re..          # 
190b0 20 20 20 20 20 20 74 65 73 74 69 6e 67 20 70 72        testing pr
190c0 6f 63 65 73 73 20 69 66 20 69 74 20 64 6f 65 73  ocess if it does
190d0 20 6e 6f 74 20 65 78 69 73 74 2e 0d 0a 20 20 20   not exist...   
190e0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
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 76 65 72 69 66  xists ::no(verif
19110 79 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79 29  yBuildDirectory)
19120 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
19130 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
19140 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74        # NOTE: At
19150 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
19160 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79   build directory
19170 20 4d 55 53 54 20 65 78 69 73 74 20 61 73 20 61   MUST exist as a
19180 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
19190 20 20 20 20 20 20 76 61 6c 69 64 20 64 69 72 65        valid dire
191a0 63 74 6f 72 79 20 66 6f 72 20 74 68 65 20 74 65  ctory for the te
191b0 73 74 69 6e 67 20 70 72 6f 63 65 73 73 20 74 6f  sting process to
191c0 20 63 6f 6e 74 69 6e 75 65 2e 0d 0a 20 20 20 20   continue...    
191d0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
191e0 20 20 20 20 20 20 20 73 65 74 20 64 69 72 65 63         set direc
191f0 74 6f 72 79 20 5b 67 65 74 42 75 69 6c 64 44 69  tory [getBuildDi
19200 72 65 63 74 6f 72 79 5d 0d 0a 0d 0a 20 20 20 20  rectory]....    
19210 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69          if {![fi
19220 6c 65 20 65 78 69 73 74 73 20 24 64 69 72 65 63  le exists $direc
19230 74 6f 72 79 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20  tory] || \..    
19240 20 20 20 20 20 20 20 20 20 20 20 20 21 5b 66 69              ![fi
19250 6c 65 20 69 73 64 69 72 65 63 74 6f 72 79 20 24  le isdirectory $
19260 64 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e  directory]} then
19270 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
19280 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
19290 20 20 20 23 20 4e 4f 54 45 3a 20 4a 75 73 74 20     # NOTE: Just 
192a0 70 72 69 6f 72 20 74 6f 20 61 63 74 75 61 6c 6c  prior to actuall
192b0 79 20 68 61 6c 74 69 6e 67 20 74 68 65 20 74 65  y halting the te
192c0 73 74 69 6e 67 20 70 72 6f 63 65 73 73 2c 0d 0a  sting process,..
192d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
192e0 20 20 20 20 20 20 61 64 64 20 61 6e 20 65 72 72        add an err
192f0 6f 72 20 74 6f 20 74 68 65 20 74 65 73 74 20 6c  or to the test l
19300 6f 67 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20  og file...      
19310 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
19320 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
19330 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
19340 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
19350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19360 22 2d 2d 2d 2d 20 63 6f 75 6c 64 20 6e 6f 74 20  "---- could not 
19370 76 65 72 69 66 79 20 62 75 69 6c 64 20 64 69 72  verify build dir
19380 65 63 74 6f 72 79 20 5c 22 22 20 24 64 69 72 65  ectory \"" $dire
19390 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20  ctory \..       
193a0 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20             "\", 
193b0 61 6c 6c 20 74 65 73 74 69 6e 67 20 68 61 6c 74  all testing halt
193c0 65 64 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20  ed\n"]....      
193d0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
193e0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
193f0 20 52 61 69 73 69 6e 67 20 61 20 73 63 72 69 70   Raising a scrip
19400 74 20 65 72 72 6f 72 20 66 72 6f 6d 20 74 68 69  t error from thi
19410 73 20 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 68  s point should h
19420 61 6c 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20  alt..           
19430 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 74     #       the t
19440 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73 2e 0d  esting process..
19450 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
19460 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19470 65 72 72 6f 72 20 5b 61 70 70 65 6e 64 41 72 67  error [appendArg
19480 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
19490 20 20 20 20 20 20 20 22 63 6f 75 6c 64 20 6e 6f         "could no
194a0 74 20 76 65 72 69 66 79 20 62 75 69 6c 64 20 64  t verify build d
194b0 69 72 65 63 74 6f 72 79 20 5c 22 22 20 24 64 69  irectory \"" $di
194c0 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20  rectory \..     
194d0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22               "\"
194e0 2c 20 61 6c 6c 20 74 65 73 74 69 6e 67 20 68 61  , all testing ha
194f0 6c 74 65 64 22 5d 0d 0a 20 20 20 20 20 20 20 20  lted"]..        
19500 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
19510 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
19520 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
19530 4f 54 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67  OTE: Skip trying
19540 20 74 6f 20 63 6f 70 79 20 61 6e 79 20 66 69 6c   to copy any fil
19550 65 73 20 69 66 20 69 6e 73 74 72 75 63 74 65 64  es if instructed
19560 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
19570 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
19580 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
19590 28 63 6f 70 79 53 71 6c 69 74 65 46 69 6c 65 73  (copySqliteFiles
195a0 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
195b0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
195c0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63  fo exists ::no(c
195d0 6f 70 79 53 71 6c 69 74 65 43 6f 6e 66 69 67 46  opySqliteConfigF
195e0 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
195f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
19600 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
19610 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20  configFileNames 
19620 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
19630 20 20 20 74 72 79 43 6f 70 79 42 75 69 6c 64 46     tryCopyBuildF
19640 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20  ile $fileName.. 
19650 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
19660 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
19670 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
19680 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
19690 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 45 78  :no(copySqliteEx
196a0 74 65 72 6e 61 6c 46 69 6c 65 73 29 5d 7d 20 74  ternalFiles)]} t
196b0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
196c0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
196d0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f        # NOTE: Co
196e0 70 79 20 74 68 65 20 4d 61 6e 61 67 65 64 20 44  py the Managed D
196f0 65 62 75 67 67 69 6e 67 20 41 73 73 69 73 74 61  ebugging Assista
19700 6e 74 73 20 28 4d 44 41 29 20 63 6f 6e 66 69 67  nts (MDA) config
19710 75 72 61 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20  uration..       
19720 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66         #       f
19730 69 6c 65 20 66 6f 72 20 74 68 65 20 45 61 67 6c  ile for the Eagl
19740 65 20 73 68 65 6c 6c 20 74 6f 20 74 68 65 20 62  e shell to the b
19750 75 69 6c 64 20 6f 75 74 70 75 74 20 64 69 72 65  uild output dire
19760 63 74 6f 72 79 2c 0d 0a 20 20 20 20 20 20 20 20  ctory,..        
19770 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77 68        #       wh
19780 69 6c 65 20 75 73 69 6e 67 20 65 61 63 68 20 6f  ile using each o
19790 66 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74  f the names of t
197a0 68 65 20 76 61 72 69 6f 75 73 20 6c 65 67 61 63  he various legac
197b0 79 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20  y test..        
197c0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65 78        #       ex
197d0 65 63 75 74 61 62 6c 65 73 2e 20 20 54 68 69 73  ecutables.  This
197e0 20 77 69 6c 6c 20 68 65 6c 70 20 74 6f 20 6d 61   will help to ma
197f0 6b 65 20 73 75 72 65 20 74 68 61 74 20 61 6c 6c  ke sure that all
19800 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20   the..          
19810 20 20 20 20 23 20 20 20 20 20 20 20 6c 65 67 61      #       lega
19820 63 79 20 74 65 73 74 73 20 72 75 6e 20 77 69 74  cy tests run wit
19830 68 20 65 78 61 63 74 6c 79 20 74 68 65 20 73 61  h exactly the sa
19840 6d 65 20 73 65 74 20 6f 66 20 4d 61 6e 61 67 65  me set of Manage
19850 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d..             
19860 20 23 20 20 20 20 20 20 20 44 65 62 75 67 67 69   #       Debuggi
19870 6e 67 20 41 73 73 69 73 74 61 6e 74 73 20 63 6f  ng Assistants co
19880 6e 66 69 67 75 72 65 64 2e 0d 0a 20 20 20 20 20  nfigured...     
19890 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
198a0 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
198b0 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 64 61 43  h fileName $mdaC
198c0 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b  onfigFileNames {
198d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
198e0 20 20 74 72 79 43 6f 70 79 42 69 6e 61 72 79 46    tryCopyBinaryF
198f0 69 6c 65 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65  ile EagleShell.e
19900 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 22 22  xe.mda.config ""
19910 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20   $fileName..    
19920 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
19930 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
19940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
19950 4e 4f 54 45 3a 20 43 6f 70 79 20 74 68 65 20 65  NOTE: Copy the e
19960 78 74 65 72 6e 61 6c 20 62 69 6e 61 72 69 65 73  xternal binaries
19970 2c 20 69 66 20 61 6e 79 2c 20 74 6f 20 74 68 65  , if any, to the
19980 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 0d   directory that.
19990 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
199a0 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 73 20         contains 
199b0 74 68 65 20 45 61 67 6c 65 20 73 68 65 6c 6c 2e  the Eagle shell.
199c0 20 20 54 68 69 73 20 69 73 20 74 79 70 69 63 61    This is typica
199d0 6c 6c 79 20 75 73 65 64 20 74 6f 20 6d 61 6b 65  lly used to make
199e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
199f0 23 20 20 20 20 20 20 20 73 75 72 65 20 61 73 73  #       sure ass
19a00 65 6d 62 6c 69 65 73 20 72 65 66 65 72 65 6e 63  emblies referenc
19a10 65 64 20 62 79 20 74 68 65 20 6f 6e 65 73 20 62  ed by the ones b
19a20 65 69 6e 67 20 74 65 73 74 65 64 20 61 72 65 0d  eing tested are.
19a30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
19a40 20 20 20 20 20 20 20 61 76 61 69 6c 61 62 6c 65         available
19a50 20 64 75 72 69 6e 67 20 74 68 65 20 74 65 73 74   during the test
19a60 69 6e 67 20 70 72 6f 63 65 73 73 2e 0d 0a 20 20  ing process...  
19a70 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
19a80 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
19a90 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 65  each fileName $e
19aa0 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 73  xternalFileNames
19ab0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
19ac0 20 20 20 20 74 72 79 43 6f 70 79 45 78 74 65 72      tryCopyExter
19ad0 6e 61 6c 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d  nalFile $fileNam
19ae0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
19af0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
19b00 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
19b10 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
19b20 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69  ts ::no(copySqli
19b30 74 65 4e 61 74 69 76 65 46 69 6c 65 73 29 5d 7d  teNativeFiles)]}
19b40 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
19b50 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
19b60 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
19b70 49 66 20 74 68 65 20 74 65 73 74 20 70 6c 61 74  If the test plat
19b80 66 6f 72 6d 20 69 73 20 6c 69 6b 65 6c 79 20 74  form is likely t
19b90 68 65 20 64 65 66 61 75 6c 74 20 66 6f 72 20 74  he default for t
19ba0 68 69 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20  his..           
19bb0 20 20 20 23 20 20 20 20 20 20 20 6d 61 63 68 69     #       machi
19bc0 6e 65 2c 20 61 6c 73 6f 20 74 72 79 20 74 6f 20  ne, also try to 
19bd0 63 6f 70 79 20 74 68 65 20 6e 61 74 69 76 65 20  copy the native 
19be0 66 69 6c 65 73 20 74 6f 20 74 68 65 0d 0a 20 20  files to the..  
19bf0 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
19c00 20 20 20 20 62 69 6e 61 72 79 20 6c 6f 63 61 74      binary locat
19c10 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ion...          
19c20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
19c30 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
19c40 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79  exists ::no(copy
19c50 53 71 6c 69 74 65 49 6d 70 6c 69 63 69 74 46 69  SqliteImplicitFi
19c60 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20  les)] && \..    
19c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 69                [i
19c80 73 44 65 66 61 75 6c 74 42 75 69 6c 64 50 6c 61  sDefaultBuildPla
19c90 74 66 6f 72 6d 20 74 72 75 65 5d 7d 20 74 68 65  tform true]} the
19ca0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
19cb0 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
19cc0 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c  eName $nativeFil
19cd0 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
19ce0 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43              tryC
19cf0 6f 70 79 41 73 73 65 6d 62 6c 79 20 24 66 69 6c  opyAssembly $fil
19d00 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20  eName..         
19d10 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
19d20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
19d30 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
19d40 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
19d50 6f 28 63 6f 70 79 53 71 6c 69 74 65 4e 6f 6e 49  o(copySqliteNonI
19d60 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d 20  mplicitFiles)]} 
19d70 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
19d80 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
19d90 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63  fo exists ::no(c
19da0 6f 70 79 53 71 6c 69 74 65 50 6c 61 74 66 6f 72  opySqlitePlatfor
19db0 6d 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20  mFiles)] && \.. 
19dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19dd0 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
19de0 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30  h $platform] > 0
19df0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
19e00 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
19e10 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61  ach fileName $na
19e20 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  tiveFileNames {.
19e30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19e40 20 20 20 20 20 74 72 79 43 6f 70 79 41 73 73 65       tryCopyAsse
19e50 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 24  mbly $fileName $
19e60 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20  platform..      
19e70 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
19e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
19e90 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
19ea0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
19eb0 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53  xists ::no(copyS
19ec0 71 6c 69 74 65 41 72 63 68 69 74 65 63 74 75 72  qliteArchitectur
19ed0 65 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20  eFiles)] && \.. 
19ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ef0 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
19f00 68 20 24 61 72 63 68 69 74 65 63 74 75 72 65 5d  h $architecture]
19f10 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
19f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f30 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
19f40 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65   $nativeFileName
19f50 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
19f60 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79           tryCopy
19f70 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61  Assembly $fileNa
19f80 6d 65 20 24 61 72 63 68 69 74 65 63 74 75 72 65  me $architecture
19f90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19fa0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
19fb0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
19fc0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
19fd0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
19fe0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
19ff0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63  fo exists ::no(c
1a000 6f 70 79 53 71 6c 69 74 65 4d 61 6e 61 67 65 64  opySqliteManaged
1a010 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
1a020 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .              f
1a030 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
1a040 24 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65  $managedFileName
1a050 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
1a060 20 20 20 20 20 74 72 79 43 6f 70 79 41 73 73 65       tryCopyAsse
1a070 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 0d 0a  mbly $fileName..
1a080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
1a090 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
1a0a0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
1a0b0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1a0c0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b        # NOTE: Sk
1a0d0 69 70 20 74 72 79 69 6e 67 20 74 6f 20 6c 6f 61  ip trying to loa
1a0e0 64 20 61 6e 79 20 66 69 6c 65 73 20 69 66 20 69  d any files if i
1a0f0 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20  nstructed...    
1a100 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1a110 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
1a120 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71  ists ::no(loadSq
1a130 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20 74 68 65  liteFiles)]} the
1a140 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1a150 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
1a160 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69  ts ::no(loadSqli
1a170 74 65 49 6d 70 6c 69 63 69 74 46 69 6c 65 73 29  teImplicitFiles)
1a180 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1a190 20 20 20 20 20 20 20 20 20 74 72 79 4c 6f 61 64           tryLoad
1a1a0 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e  Assembly System.
1a1b0 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 0d  Data.SQLite.dll.
1a1c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
1a1d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
1a1e0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
1a1f0 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 4c  ::no(loadSqliteL
1a200 69 6e 71 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  inqFiles)]} then
1a210 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1a220 20 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c    tryLoadAssembl
1a230 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  y System.Data.SQ
1a240 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 0d 0a 20  Lite.Linq.dll.. 
1a250 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
1a260 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
1a270 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
1a280 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 45 66 36  no(loadSqliteEf6
1a290 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
1a2a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
1a2b0 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20 53  ryLoadAssembly S
1a2c0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
1a2d0 65 2e 45 46 36 2e 64 6c 6c 0d 0a 20 20 20 20 20  e.EF6.dll..     
1a2e0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1a2f0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
1a300 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c  fo exists ::no(l
1a310 6f 61 64 53 71 6c 69 74 65 4e 6f 6e 49 6d 70 6c  oadSqliteNonImpl
1a320 69 63 69 74 46 69 6c 65 73 29 5d 7d 20 74 68 65  icitFiles)]} the
1a330 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1a340 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
1a350 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71  ists ::no(loadSq
1a360 6c 69 74 65 50 6c 61 74 66 6f 72 6d 46 69 6c 65  litePlatformFile
1a370 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  s)] && \..      
1a380 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72              [str
1a390 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74  ing length $plat
1a3a0 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20  form] > 0} then 
1a3b0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1a3c0 20 20 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62     tryLoadAssemb
1a3d0 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  ly System.Data.S
1a3e0 51 4c 69 74 65 2e 64 6c 6c 20 24 70 6c 61 74 66  QLite.dll $platf
1a3f0 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  orm..           
1a400 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1a410 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
1a420 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61   exists ::no(loa
1a430 64 53 71 6c 69 74 65 41 72 63 68 69 74 65 63 74  dSqliteArchitect
1a440 75 72 65 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d  ureFiles)] && \.
1a450 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a460 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
1a470 68 20 24 61 72 63 68 69 74 65 63 74 75 72 65 5d  h $architecture]
1a480 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
1a490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
1a4a0 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20 53 79  yLoadAssembly Sy
1a4b0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
1a4c0 2e 64 6c 6c 20 24 61 72 63 68 69 74 65 63 74 75  .dll $architectu
1a4d0 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  re..            
1a4e0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
1a4f0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
1a500 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
1a510 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20        catch {.. 
1a520 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1a530 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
1a540 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1a550 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
1a560 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f  - file version o
1a570 66 20 5c 22 73 71 6c 69 74 65 33 2e 64 6c 6c 5c  f \"sqlite3.dll\
1a580 22 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20  "... " \..      
1a590 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 76 65          [file ve
1a5a0 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79  rsion [getBinary
1a5b0 46 69 6c 65 4e 61 6d 65 20 73 71 6c 69 74 65 33  FileName sqlite3
1a5c0 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20  .dll]] \n]..    
1a5d0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1a5e0 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20   catch {..      
1a5f0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
1a600 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
1a610 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1a620 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c         "---- fil
1a630 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53  e version of \"S
1a640 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c  QLite.Interop.dl
1a650 6c 5c 22 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20  l\"... " \..    
1a660 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
1a670 76 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61  version [getBina
1a680 72 79 46 69 6c 65 4e 61 6d 65 20 53 51 4c 69 74  ryFileName SQLit
1a690 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 5d 5d 20  e.Interop.dll]] 
1a6a0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  \n]..        }..
1a6b0 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20  ..        catch 
1a6c0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
1a6d0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
1a6e0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1a6f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1a700 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69  "---- file versi
1a710 6f 6e 20 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44  on of \"System.D
1a720 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c 22  ata.SQLite.dll\"
1a730 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  ... " \..       
1a740 20 20 20 20 20 20 20 5b 66 69 6c 65 20 76 65 72         [file ver
1a750 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79 46  sion [getBinaryF
1a760 69 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44  ileName System.D
1a770 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d 5d  ata.SQLite.dll]]
1a780 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d   \n]..        }.
1a790 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68  ...        catch
1a7a0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
1a7b0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
1a7c0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1a7d0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1a7e0 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73   "---- file vers
1a7f0 69 6f 6e 20 6f 66 20 5c 22 53 79 73 74 65 6d 2e  ion of \"System.
1a800 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71  Data.SQLite.Linq
1a810 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5c 0d 0a 20  .dll\"... " \.. 
1a820 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69               [fi
1a830 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67 65 74 42  le version [getB
1a840 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 53 79  inaryFileName Sy
1a850 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
1a860 2e 4c 69 6e 71 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d  .Linq.dll]] \n].
1a870 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
1a880 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20        catch {.. 
1a890 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1a8a0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
1a8b0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1a8c0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
1a8d0 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f  - file version o
1a8e0 66 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e  f \"System.Data.
1a8f0 53 51 4c 69 74 65 2e 45 46 36 2e 64 6c 6c 5c 22  SQLite.EF6.dll\"
1a900 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  ... " \..       
1a910 20 20 20 20 20 20 20 5b 66 69 6c 65 20 76 65 72         [file ver
1a920 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79 46  sion [getBinaryF
1a930 69 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44  ileName System.D
1a940 61 74 61 2e 53 51 4c 69 74 65 2e 45 46 36 2e 64  ata.SQLite.EF6.d
1a950 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  ll]] \n]..      
1a960 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69    }....        i
1a970 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
1a980 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30  h $platform] > 0
1a990 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1a9a0 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
1a9b0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1a9c0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
1a9d0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1a9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
1a9f0 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e  --- file version
1aa00 20 6f 66 20 5c 22 22 20 24 70 6c 61 74 66 6f 72   of \"" $platfor
1aa10 6d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  m \..           
1aa20 20 20 20 20 20 22 2f 73 71 6c 69 74 65 33 2e 64       "/sqlite3.d
1aa30 6c 6c 5c 22 2e 2e 2e 20 22 20 5b 66 69 6c 65 20  ll\"... " [file 
1aa40 76 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20  version \..     
1aa50 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42             [getB
1aa60 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 73 71  inaryFileName sq
1aa70 6c 69 74 65 33 2e 64 6c 6c 20 24 70 6c 61 74 66  lite3.dll $platf
1aa80 6f 72 6d 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20  orm]] \n]..     
1aa90 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1aaa0 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
1aab0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1aac0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
1aad0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1aae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
1aaf0 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e  --- file version
1ab00 20 6f 66 20 5c 22 22 20 24 70 6c 61 74 66 6f 72   of \"" $platfor
1ab10 6d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  m \..           
1ab20 20 20 20 20 20 22 2f 53 51 4c 69 74 65 2e 49 6e       "/SQLite.In
1ab30 74 65 72 6f 70 2e 64 6c 6c 5c 22 2e 2e 2e 20 22  terop.dll\"... "
1ab40 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c   [file version \
1ab50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1ab60 20 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65    [getBinaryFile
1ab70 4e 61 6d 65 20 53 51 4c 69 74 65 2e 49 6e 74 65  Name SQLite.Inte
1ab80 72 6f 70 2e 64 6c 6c 20 24 70 6c 61 74 66 6f 72  rop.dll $platfor
1ab90 6d 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  m]] \n]..       
1aba0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1abb0 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20    catch {..     
1abc0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
1abd0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
1abe0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
1abf0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
1ac00 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f  - file version o
1ac10 66 20 5c 22 22 20 24 70 6c 61 74 66 6f 72 6d 20  f \"" $platform 
1ac20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1ac30 20 20 20 22 2f 53 79 73 74 65 6d 2e 44 61 74 61     "/System.Data
1ac40 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e  .SQLite.dll\"...
1ac50 20 22 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e   " [file version
1ac60 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1ac70 20 20 20 20 5b 67 65 74 42 69 6e 61 72 79 46 69      [getBinaryFi
1ac80 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44 61  leName System.Da
1ac90 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 20 24 70  ta.SQLite.dll $p
1aca0 6c 61 74 66 6f 72 6d 5d 5d 20 5c 6e 5d 0d 0a 20  latform]] \n].. 
1acb0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1acc0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1acd0 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
1ace0 67 74 68 20 24 61 72 63 68 69 74 65 63 74 75 72  gth $architectur
1acf0 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
1ad00 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20            catch 
1ad10 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
1ad20 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
1ad30 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1ad40 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1ad50 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76      "---- file v
1ad60 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24 61  ersion of \"" $a
1ad70 72 63 68 69 74 65 63 74 75 72 65 20 5c 0d 0a 20  rchitecture \.. 
1ad80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1ad90 2f 73 71 6c 69 74 65 33 2e 64 6c 6c 5c 22 2e 2e  /sqlite3.dll\"..
1ada0 2e 20 22 20 5b 66 69 6c 65 20 76 65 72 73 69 6f  . " [file versio
1adb0 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
1adc0 20 20 20 20 20 5b 67 65 74 42 69 6e 61 72 79 46       [getBinaryF
1add0 69 6c 65 4e 61 6d 65 20 73 71 6c 69 74 65 33 2e  ileName sqlite3.
1ade0 64 6c 6c 20 24 61 72 63 68 69 74 65 63 74 75 72  dll $architectur
1adf0 65 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  e]] \n]..       
1ae00 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1ae10 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20    catch {..     
1ae20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
1ae30 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
1ae40 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
1ae50 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
1ae60 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f  - file version o
1ae70 66 20 5c 22 22 20 24 61 72 63 68 69 74 65 63 74  f \"" $architect
1ae80 75 72 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ure \..         
1ae90 20 20 20 20 20 20 20 22 2f 53 51 4c 69 74 65 2e         "/SQLite.
1aea0 49 6e 74 65 72 6f 70 2e 64 6c 6c 5c 22 2e 2e 2e  Interop.dll\"...
1aeb0 20 22 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e   " [file version
1aec0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1aed0 20 20 20 20 5b 67 65 74 42 69 6e 61 72 79 46 69      [getBinaryFi
1aee0 6c 65 4e 61 6d 65 20 53 51 4c 69 74 65 2e 49 6e  leName SQLite.In
1aef0 74 65 72 6f 70 2e 64 6c 6c 20 24 61 72 63 68 69  terop.dll $archi
1af00 74 65 63 74 75 72 65 5d 5d 20 5c 6e 5d 0d 0a 20  tecture]] \n].. 
1af10 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
1af20 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d          catch {.
1af30 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
1af40 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
1af50 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1af60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1af70 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72    "---- file ver
1af80 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24 61 72 63  sion of \"" $arc
1af90 68 69 74 65 63 74 75 72 65 20 5c 0d 0a 20 20 20  hitecture \..   
1afa0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2f 53               "/S
1afb0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
1afc0 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5b 66 69  e.dll\"... " [fi
1afd0 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20 20  le version \..  
1afe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67                [g
1aff0 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  etBinaryFileName
1b000 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
1b010 69 74 65 2e 64 6c 6c 20 24 61 72 63 68 69 74 65  ite.dll $archite
1b020 63 74 75 72 65 5d 5d 20 5c 6e 5d 0d 0a 20 20 20  cture]] \n]..   
1b030 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1b040 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
1b050 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1b060 3a 20 47 72 61 62 20 74 68 65 20 6c 69 73 74 20  : Grab the list 
1b070 6f 66 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d  of managed assem
1b080 62 6c 69 65 73 20 66 6f 72 20 74 68 65 20 63 75  blies for the cu
1b090 72 72 65 6e 74 20 70 72 6f 63 65 73 73 0d 0a 20  rrent process.. 
1b0a0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
1b0b0 6e 64 20 72 65 70 6f 72 74 20 6f 6e 20 74 68 65  nd report on the
1b0c0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
1b0d0 69 74 65 20 72 65 6c 61 74 65 64 20 6f 6e 65 73  ite related ones
1b0e0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1b0f0 20 20 20 20 20 20 73 65 74 20 61 73 73 65 6d 62        set assemb
1b100 6c 69 65 73 20 5b 6f 62 6a 65 63 74 20 69 6e 76  lies [object inv
1b110 6f 6b 65 20 41 70 70 44 6f 6d 61 69 6e 2e 43 75  oke AppDomain.Cu
1b120 72 72 65 6e 74 44 6f 6d 61 69 6e 20 47 65 74 41  rrentDomain GetA
1b130 73 73 65 6d 62 6c 69 65 73 5d 0d 0a 0d 0a 20 20  ssemblies]....  
1b140 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72        object for
1b150 65 61 63 68 20 61 73 73 65 6d 62 6c 79 20 24 61  each assembly $a
1b160 73 73 65 6d 62 6c 69 65 73 20 7b 0d 0a 20 20 20  ssemblies {..   
1b170 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
1b180 6e 67 20 6d 61 74 63 68 20 5c 7b 53 79 73 74 65  ng match \{Syste
1b190 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2a 20 24  m.Data.SQLite* $
1b1a0 61 73 73 65 6d 62 6c 79 5d 7d 20 74 68 65 6e 20  assembly]} then 
1b1b0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
1b1c0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
1b1d0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1b1e0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1b1f0 20 20 20 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20      "---- found 
1b200 6c 6f 61 64 65 64 20 61 73 73 65 6d 62 6c 79 3a  loaded assembly:
1b210 20 22 20 24 61 73 73 65 6d 62 6c 79 20 5c 6e 5d   " $assembly \n]
1b220 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1b230 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1b240 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
1b250 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
1b260 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a  test_channel \..
1b270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
1b280 2d 2d 2d 20 64 65 66 69 6e 65 20 63 6f 6e 73 74  --- define const
1b290 61 6e 74 73 20 66 6f 72 20 5c 22 53 79 73 74 65  ants for \"Syste
1b2a0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 5c 22 2e  m.Data.SQLite\".
1b2b0 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20  .. "....        
1b2c0 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
1b2d0 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65              obje
1b2e0 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
1b2f0 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
1b300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
1b310 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
1b320 65 2e 53 51 4c 69 74 65 33 20 44 65 66 69 6e 65  e.SQLite3 Define
1b330 43 6f 6e 73 74 61 6e 74 73 0d 0a 20 20 20 20 20  Constants..     
1b340 20 20 20 20 20 7d 20 64 65 66 69 6e 65 43 6f 6e       } defineCon
1b350 73 74 61 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68  stants] == 0} th
1b360 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1b370 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
1b380 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1b390 72 67 73 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20  rgs [formatList 
1b3a0 5b 6c 73 6f 72 74 20 5c 0d 0a 20 20 20 20 20 20  [lsort \..      
1b3b0 20 20 20 20 20 20 20 20 20 20 24 64 65 66 69 6e            $defin
1b3c0 65 43 6f 6e 73 74 61 6e 74 73 5d 20 3c 6e 6f 6e  eConstants] <non
1b3d0 65 3e 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  e>] \n]..       
1b3e0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1b3f0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1b400 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75  ::test_channel u
1b410 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20  nknown\n..      
1b420 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1b430 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63  ....        catc
1b440 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  h {..          t
1b450 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
1b460 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20  nnel \..        
1b470 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6f 75 72        "---- sour
1b480 63 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22  ce version of \"
1b490 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
1b4a0 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 0d 0a 0d  te.dll\"... "...
1b4b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
1b4c0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
1b4d0 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
1b4e0 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
1b4f0 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
1b500 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
1b510 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74  ata.SQLite.SQLit
1b520 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 50 72 6f 76  eConnection Prov
1b530 69 64 65 72 56 65 72 73 69 6f 6e 0d 0a 20 20 20  iderVersion..   
1b540 20 20 20 20 20 20 20 7d 20 76 65 72 73 69 6f 6e         } version
1b550 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
1b560 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
1b570 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
1b580 76 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74  version] == 0} t
1b590 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1b5a0 20 20 20 20 20 73 65 74 20 76 65 72 73 69 6f 6e       set version
1b5b0 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20   null..         
1b5c0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
1b5d0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
1b5e0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1b5f0 72 67 73 20 24 76 65 72 73 69 6f 6e 20 5c 6e 5d  rgs $version \n]
1b600 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
1b610 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
1b620 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
1b630 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c  channel unknown\
1b640 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  n..          }..
1b650 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1b660 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
1b670 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
1b680 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d  :test_channel \.
1b690 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
1b6a0 2d 2d 2d 2d 20 73 6f 75 72 63 65 20 63 68 65 63  ---- source chec
1b6b0 6b 6f 75 74 20 6f 66 20 5c 22 53 79 73 74 65 6d  kout of \"System
1b6c0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
1b6d0 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  \"... "....     
1b6e0 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
1b6f0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  {..            o
1b700 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
1b710 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
1b720 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1b730 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
1b740 4c 69 74 65 2e 53 51 4c 69 74 65 43 6f 6e 6e 65  Lite.SQLiteConne
1b750 63 74 69 6f 6e 20 50 72 6f 76 69 64 65 72 53 6f  ction ProviderSo
1b760 75 72 63 65 49 64 0d 0a 20 20 20 20 20 20 20 20  urceId..        
1b770 20 20 7d 20 73 6f 75 72 63 65 49 64 5d 20 3d 3d    } sourceId] ==
1b780 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1b790 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
1b7a0 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 6f 75 72  ing length $sour
1b7b0 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ceId] == 0} then
1b7c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1b7d0 20 20 73 65 74 20 73 6f 75 72 63 65 49 64 20 6e    set sourceId n
1b7e0 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ull..           
1b7f0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
1b800 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
1b810 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1b820 73 20 24 73 6f 75 72 63 65 49 64 20 5c 6e 5d 0d  s $sourceId \n].
1b830 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
1b840 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
1b850 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
1b860 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e  hannel unknown\n
1b870 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1b880 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1b890 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1b8a0 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65   NOTE: Check the
1b8b0 20 61 76 61 69 6c 61 62 6c 65 20 62 75 69 6c 64   available build
1b8c0 73 20 28 61 6e 64 20 22 72 65 6c 65 61 73 65 73  s (and "releases
1b8d0 22 29 20 6f 66 20 53 51 4c 69 74 65 20 61 6e 64  ") of SQLite and
1b8e0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1b8f0 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
1b900 4c 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  Lite...        #
1b910 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46  ..        checkF
1b920 6f 72 53 51 4c 69 74 65 42 75 69 6c 64 73 20 24  orSQLiteBuilds $
1b930 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a  ::test_channel..
1b940 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
1b950 53 51 4c 69 74 65 52 65 6c 65 61 73 65 73 20 24  SQLiteReleases $
1b960 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a  ::test_channel..
1b970 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1b980 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77       # NOTE: Now
1b990 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 6b 6e 6f  , we need to kno
1b9a0 77 20 69 66 20 74 68 65 20 53 51 4c 69 74 65 20  w if the SQLite 
1b9b0 63 6f 72 65 20 6c 69 62 72 61 72 79 20 69 73 20  core library is 
1b9c0 61 76 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20  available..     
1b9d0 20 20 20 23 20 20 20 20 20 20 20 28 69 2e 65 2e     #       (i.e.
1b9e0 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 61 6e   because the man
1b9f0 61 67 65 64 2d 6f 6e 6c 79 20 53 79 73 74 65 6d  aged-only System
1ba00 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 61 73 73  .Data.SQLite ass
1ba10 65 6d 62 6c 79 20 63 61 6e 0d 0a 20 20 20 20 20  embly can..     
1ba20 20 20 20 23 20 20 20 20 20 20 20 6c 6f 61 64 20     #       load 
1ba30 77 69 74 68 6f 75 74 20 69 74 3b 20 68 6f 77 65  without it; howe
1ba40 76 65 72 2c 20 69 74 20 63 61 6e 6e 6f 74 20 64  ver, it cannot d
1ba50 6f 20 61 6e 79 74 68 69 6e 67 20 75 73 65 66 75  o anything usefu
1ba60 6c 20 77 69 74 68 6f 75 74 0d 0a 20 20 20 20 20  l without..     
1ba70 20 20 20 23 20 20 20 20 20 20 20 69 74 29 2e 20     #       it). 
1ba80 20 49 66 20 77 65 20 61 72 65 20 75 73 69 6e 67   If we are using
1ba90 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20   the mixed-mode 
1baa0 61 73 73 65 6d 62 6c 79 20 61 6e 64 20 77 65 20  assembly and we 
1bab0 61 6c 72 65 61 64 79 0d 0a 20 20 20 20 20 20 20  already..       
1bac0 20 23 20 20 20 20 20 20 20 66 6f 75 6e 64 20 69   #       found i
1bad0 74 20 28 61 62 6f 76 65 29 2c 20 74 68 69 73 20  t (above), this 
1bae0 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 73 75  should always su
1baf0 63 63 65 65 64 2e 0d 0a 20 20 20 20 20 20 20 20  cceed...        
1bb00 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  #..        check
1bb10 46 6f 72 53 51 4c 69 74 65 4c 69 62 72 61 72 79  ForSQLiteLibrary
1bb20 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1bb30 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
1bb40 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
1bb50 68 65 63 6b 20 69 66 20 74 68 65 20 53 51 4c 69  heck if the SQLi
1bb60 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d  te interop assem
1bb70 62 6c 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65  bly is available
1bb80 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1bb90 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51        checkForSQ
1bba0 4c 69 74 65 49 6e 74 65 72 6f 70 20 24 3a 3a 74  LiteInterop $::t
1bbb0 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20  est_channel.... 
1bbc0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1bbd0 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
1bbe0 74 68 65 20 53 51 4c 69 74 65 20 64 61 74 61 62  the SQLite datab
1bbf0 61 73 65 20 61 6e 64 20 74 65 6d 70 6f 72 61 72  ase and temporar
1bc00 79 20 64 69 72 65 63 74 6f 72 69 65 73 2e 0d 0a  y directories...
1bc10 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1bc20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74     checkForSQLit
1bc30 65 44 69 72 65 63 74 6f 72 69 65 73 20 24 3a 3a  eDirectories $::
1bc40 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a  test_channel....
1bc50 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1bc60 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
1bc70 70 74 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  pt to determine 
1bc80 69 66 20 76 61 72 69 6f 75 73 20 63 6f 6d 70 69  if various compi
1bc90 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20  le-time options 
1bca0 6e 65 65 64 65 64 20 66 6f 72 0d 0a 20 20 20 20  needed for..    
1bcb0 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74      #       test
1bcc0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 65 72   constraints wer
1bcd0 65 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 68  e enabled for th
1bce0 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62  e managed assemb
1bcf0 6c 79 2e 20 20 54 68 65 72 65 0d 0a 20 20 20 20  ly.  There..    
1bd00 20 20 20 20 23 20 20 20 20 20 20 20 61 72 65 20      #       are 
1bd10 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  some compile-tim
1bd20 65 20 6f 70 74 69 6f 6e 73 20 74 68 61 74 20 6d  e options that m
1bd30 75 73 74 20 61 6c 73 6f 20 68 61 76 65 20 62 65  ust also have be
1bd40 65 6e 20 65 6e 61 62 6c 65 64 0d 0a 20 20 20 20  en enabled..    
1bd50 20 20 20 20 23 20 20 20 20 20 20 20 66 6f 72 20      #       for 
1bd60 74 68 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65  the interop asse
1bd70 6d 62 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f  mbly in order to
1bd80 20 62 65 20 65 66 66 65 63 74 69 76 65 2e 20 20   be effective.  
1bd90 46 6f 72 20 74 68 6f 73 65 0d 0a 20 20 20 20 20  For those..     
1bda0 20 20 20 23 20 20 20 20 20 20 20 6f 70 74 69 6f     #       optio
1bdb0 6e 73 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 61  ns, it will be a
1bdc0 73 73 75 6d 65 64 20 74 68 61 74 20 69 74 20 77  ssumed that it w
1bdd0 61 73 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74  as enabled for t
1bde0 68 65 20 69 6e 74 65 72 6f 70 0d 0a 20 20 20 20  he interop..    
1bdf0 20 20 20 20 23 20 20 20 20 20 20 20 61 73 73 65      #       asse
1be00 6d 62 6c 79 20 69 66 20 69 74 20 77 61 73 20 65  mbly if it was e
1be10 6e 61 62 6c 65 64 20 66 6f 72 20 74 68 65 20 6d  nabled for the m
1be20 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 2e  anaged assembly.
1be30 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1be40 20 20 20 20 20 66 6f 72 65 61 63 68 20 64 65 66       foreach def
1be50 69 6e 65 43 6f 6e 73 74 61 6e 74 20 5b 6c 69 73  ineConstant [lis
1be60 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
1be70 20 43 48 45 43 4b 5f 53 54 41 54 45 20 43 4f 55   CHECK_STATE COU
1be80 4e 54 5f 48 41 4e 44 4c 45 20 44 45 42 55 47 20  NT_HANDLE DEBUG 
1be90 49 4e 54 45 52 4f 50 5f 43 4f 44 45 43 20 49 4e  INTEROP_CODEC IN
1bea0 54 45 52 4f 50 5f 44 45 42 55 47 20 5c 0d 0a 20  TEROP_DEBUG \.. 
1beb0 20 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52             INTER
1bec0 4f 50 5f 45 58 54 45 4e 53 49 4f 4e 5f 46 55 4e  OP_EXTENSION_FUN
1bed0 43 54 49 4f 4e 53 20 49 4e 54 45 52 4f 50 5f 49  CTIONS INTEROP_I
1bee0 4e 43 4c 55 44 45 5f 43 45 52 4f 44 20 5c 0d 0a  NCLUDE_CEROD \..
1bef0 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 54 45              INTE
1bf00 52 4f 50 5f 49 4e 43 4c 55 44 45 5f 45 58 54 52  ROP_INCLUDE_EXTR
1bf10 41 20 49 4e 54 45 52 4f 50 5f 49 4e 43 4c 55 44  A INTEROP_INCLUD
1bf20 45 5f 53 45 45 20 49 4e 54 45 52 4f 50 5f 4c 45  E_SEE INTEROP_LE
1bf30 47 41 43 59 5f 43 4c 4f 53 45 20 5c 0d 0a 20 20  GACY_CLOSE \..  
1bf40 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f            INTERO
1bf50 50 5f 4c 4f 47 20 49 4e 54 45 52 4f 50 5f 54 45  P_LOG INTEROP_TE
1bf60 53 54 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54  ST_EXTENSION INT
1bf70 45 52 4f 50 5f 56 49 52 54 55 41 4c 5f 54 41 42  EROP_VIRTUAL_TAB
1bf80 4c 45 20 4e 45 54 5f 32 30 20 5c 0d 0a 20 20 20  LE NET_20 \..   
1bf90 20 20 20 20 20 20 20 20 20 4e 45 54 5f 33 35 20           NET_35 
1bfa0 4e 45 54 5f 34 30 20 4e 45 54 5f 34 35 20 4e 45  NET_40 NET_45 NE
1bfb0 54 5f 34 35 31 20 4e 45 54 5f 43 4f 4d 50 41 43  T_451 NET_COMPAC
1bfc0 54 5f 32 30 20 5c 0d 0a 20 20 20 20 20 20 20 20  T_20 \..        
1bfd0 20 20 20 20 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d      PLATFORM_COM
1bfe0 50 41 43 54 46 52 41 4d 45 57 4f 52 4b 20 50 52  PACTFRAMEWORK PR
1bff0 45 4c 4f 41 44 5f 4e 41 54 49 56 45 5f 4c 49 42  ELOAD_NATIVE_LIB
1c000 52 41 52 59 20 52 45 54 41 52 47 45 54 41 42 4c  RARY RETARGETABL
1c010 45 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  E \..           
1c020 20 53 51 4c 49 54 45 5f 53 54 41 4e 44 41 52 44   SQLITE_STANDARD
1c030 20 54 48 52 4f 57 5f 4f 4e 5f 44 49 53 50 4f 53   THROW_ON_DISPOS
1c040 45 44 20 54 52 41 43 45 20 54 52 41 43 45 5f 43  ED TRACE TRACE_C
1c050 4f 4e 4e 45 43 54 49 4f 4e 20 5c 0d 0a 20 20 20  ONNECTION \..   
1c060 20 20 20 20 20 20 20 20 20 54 52 41 43 45 5f 44           TRACE_D
1c070 45 54 45 43 54 49 4f 4e 20 54 52 41 43 45 5f 48  ETECTION TRACE_H
1c080 41 4e 44 4c 45 20 54 52 41 43 45 5f 50 52 45 4c  ANDLE TRACE_PREL
1c090 4f 41 44 20 54 52 41 43 45 5f 53 48 41 52 45 44  OAD TRACE_SHARED
1c0a0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1c0b0 54 52 41 43 45 5f 53 54 41 54 45 4d 45 4e 54 20  TRACE_STATEMENT 
1c0c0 54 52 41 43 45 5f 57 41 52 4e 49 4e 47 20 54 52  TRACE_WARNING TR
1c0d0 41 43 4b 5f 4d 45 4d 4f 52 59 5f 42 59 54 45 53  ACK_MEMORY_BYTES
1c0e0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1c0f0 55 53 45 5f 45 4e 54 49 54 59 5f 46 52 41 4d 45  USE_ENTITY_FRAME
1c100 57 4f 52 4b 5f 36 20 55 53 45 5f 49 4e 54 45 52  WORK_6 USE_INTER
1c110 4f 50 5f 44 4c 4c 20 55 53 45 5f 50 52 45 50 41  OP_DLL USE_PREPA
1c120 52 45 5f 56 32 20 57 49 4e 44 4f 57 53 5d 20 7b  RE_V2 WINDOWS] {
1c130 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
1c140 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
1c150 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 63 6f   Check if the co
1c160 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
1c170 6e 20 69 73 20 6c 69 73 74 65 64 20 69 6e 20 74  n is listed in t
1c180 68 65 20 6c 69 73 74 20 6f 66 0d 0a 20 20 20 20  he list of..    
1c190 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22 64        #       "d
1c1a0 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74 73 22  efine constants"
1c1b0 20 6b 65 70 74 20 74 72 61 63 6b 20 6f 66 20 62   kept track of b
1c1c0 79 20 74 68 65 20 6d 61 6e 61 67 65 64 20 61 73  y the managed as
1c1d0 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20  sembly...       
1c1e0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1c1f0 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 65  checkForSQLiteDe
1c200 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 24 3a 3a  fineConstant $::
1c210 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 64 65  test_channel $de
1c220 66 69 6e 65 43 6f 6e 73 74 61 6e 74 0d 0a 20 20  fineConstant..  
1c230 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1c240 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1c250 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74  NOTE: Check if t
1c260 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  he System.Data.S
1c270 51 4c 69 74 65 20 70 72 6f 76 69 64 65 72 20 77  QLite provider w
1c280 61 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  as compiled with
1c290 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1c2a0 20 20 73 75 70 70 6f 72 74 20 66 6f 72 20 61 6e    support for an
1c2b0 79 20 65 6e 63 72 79 70 74 65 64 20 64 61 74 61  y encrypted data
1c2c0 62 61 73 65 73 2e 0d 0a 20 20 20 20 20 20 20 20  bases...        
1c2d0 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  #..        if {[
1c2e0 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5c  haveConstraint \
1c2f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c300 20 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74    defineConstant
1c310 2e 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  .System.Data.SQL
1c320 69 74 65 2e 49 4e 54 45 52 4f 50 5f 43 4f 44 45  ite.INTEROP_CODE
1c330 43 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20  C] || \..       
1c340 20 20 20 20 20 5b 68 61 76 65 43 6f 6e 73 74 72       [haveConstr
1c350 61 69 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  aint \..        
1c360 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 43 6f          defineCo
1c370 6e 73 74 61 6e 74 2e 53 79 73 74 65 6d 2e 44 61  nstant.System.Da
1c380 74 61 2e 53 51 4c 69 74 65 2e 49 4e 54 45 52 4f  ta.SQLite.INTERO
1c390 50 5f 49 4e 43 4c 55 44 45 5f 53 45 45 5d 7d 20  P_INCLUDE_SEE]} 
1c3a0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1c3b0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
1c3c0 20 4e 4f 54 45 3a 20 59 65 73 2c 20 61 64 64 20   NOTE: Yes, add 
1c3d0 67 65 6e 65 72 69 63 20 63 6f 6e 73 74 72 61 69  generic constrai
1c3e0 6e 74 20 66 6f 72 20 75 73 65 20 62 79 20 74 68  nt for use by th
1c3f0 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20  e test suite... 
1c400 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1c410 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
1c420 69 6e 74 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  int System.Data.
1c430 53 51 4c 69 74 65 2e 45 6e 63 72 79 70 74 69 6f  SQLite.Encryptio
1c440 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  n..        }....
1c450 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1c460 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
1c470 20 74 68 65 20 63 75 72 72 65 6e 74 20 62 75 69   the current bui
1c480 6c 64 20 79 65 61 72 2e 20 20 42 61 73 69 63 61  ld year.  Basica
1c490 6c 6c 79 2c 20 74 68 69 73 20 69 6e 64 69 63 61  lly, this indica
1c4a0 74 65 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20  tes..        #  
1c4b0 20 20 20 20 20 77 68 69 63 68 20 76 65 72 73 69       which versi
1c4c0 6f 6e 20 6f 66 20 4d 53 42 75 69 6c 64 20 61 6e  on of MSBuild an
1c4d0 64 2f 6f 72 20 56 69 73 75 61 6c 20 53 74 75 64  d/or Visual Stud
1c4e0 69 6f 20 77 61 73 20 75 73 65 64 20 74 6f 0d 0a  io was used to..
1c4f0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1c500 63 6f 6d 70 69 6c 65 20 74 68 65 20 61 73 73 65  compile the asse
1c510 6d 62 6c 79 20 62 69 6e 61 72 69 65 73 20 75 6e  mbly binaries un
1c520 64 65 72 20 74 65 73 74 2e 0d 0a 20 20 20 20 20  der test...     
1c530 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70     #..        tp
1c540 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
1c550 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  nel \..         
1c560 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e     "---- checkin
1c570 67 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74  g for System.Dat
1c580 61 2e 53 51 4c 69 74 65 20 62 75 69 6c 64 20 79  a.SQLite build y
1c590 65 61 72 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  ear... "....    
1c5a0 20 20 20 20 73 65 74 20 79 65 61 72 20 5b 67 65      set year [ge
1c5b0 74 42 75 69 6c 64 59 65 61 72 5d 0d 0a 20 20 20  tBuildYear]..   
1c5c0 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
1c5d0 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 62  nt [appendArgs b
1c5e0 75 69 6c 64 59 65 61 72 2e 20 24 79 65 61 72 5d  uildYear. $year]
1c5f0 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
1c600 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
1c610 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24  [appendArgs \" $
1c620 79 65 61 72 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20  year \"\n]....  
1c630 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1c640 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74   # NOTE: Check t
1c650 68 65 20 63 75 72 72 65 6e 74 20 62 75 69 6c 64  he current build
1c660 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 2e   .NET Framework.
1c670 20 20 42 61 73 69 63 61 6c 6c 79 2c 20 74 68 69    Basically, thi
1c680 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  s..        #    
1c690 20 20 20 69 6e 64 69 63 61 74 65 73 20 77 68 69     indicates whi
1c6a0 63 68 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  ch version of th
1c6b0 65 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b  e .NET Framework
1c6c0 20 69 73 20 62 65 69 6e 67 0d 0a 20 20 20 20 20   is being..     
1c6d0 20 20 20 23 20 20 20 20 20 20 20 75 73 65 64 20     #       used 
1c6e0 62 79 20 74 68 65 20 61 73 73 65 6d 62 6c 79 20  by the assembly 
1c6f0 62 69 6e 61 72 69 65 73 20 75 6e 64 65 72 20 74  binaries under t
1c700 65 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  est...        #.
1c710 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
1c720 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c  ::test_channel \
1c730 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
1c740 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
1c750 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
1c760 69 74 65 20 62 75 69 6c 64 20 2e 4e 45 54 20 46  ite build .NET F
1c770 72 61 6d 65 77 6f 72 6b 2e 2e 2e 20 22 0d 0a 0d  ramework... "...
1c780 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 65 74  .        set net
1c790 46 78 20 5b 67 65 74 42 75 69 6c 64 4e 65 74 46  Fx [getBuildNetF
1c7a0 78 5d 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43  x]..        addC
1c7b0 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
1c7c0 64 41 72 67 73 20 62 75 69 6c 64 46 72 61 6d 65  dArgs buildFrame
1c7d0 77 6f 72 6b 2e 20 24 6e 65 74 46 78 5d 0d 0a 20  work. $netFx].. 
1c7e0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
1c7f0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
1c800 70 65 6e 64 41 72 67 73 20 5c 22 20 24 6e 65 74  pendArgs \" $net
1c810 46 78 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  Fx \"\n]....    
1c820 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1c830 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65   NOTE: Check the
1c840 20 63 75 72 72 65 6e 74 20 62 75 69 6c 64 20 63   current build c
1c850 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 20 54  onfiguration.  T
1c860 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61  his should norma
1c870 6c 6c 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20  lly..        #  
1c880 20 20 20 20 20 62 65 20 65 69 74 68 65 72 20 22       be either "
1c890 44 65 62 75 67 22 20 6f 72 20 22 52 65 6c 65 61  Debug" or "Relea
1c8a0 73 65 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  se"...        #.
1c8b0 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
1c8c0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c  ::test_channel \
1c8d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
1c8e0 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
1c8f0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
1c900 69 74 65 20 62 75 69 6c 64 20 63 6f 6e 66 69 67  ite build config
1c910 75 72 61 74 69 6f 6e 2e 2e 2e 20 22 0d 0a 0d 0a  uration... "....
1c920 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 6e 66          set conf
1c930 69 67 75 72 61 74 69 6f 6e 20 5b 67 65 74 42 75  iguration [getBu
1c940 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ildConfiguration
1c950 5d 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  ]..        addCo
1c960 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
1c970 41 72 67 73 20 62 75 69 6c 64 43 6f 6e 66 69 67  Args buildConfig
1c980 75 72 61 74 69 6f 6e 2e 20 24 63 6f 6e 66 69 67  uration. $config
1c990 75 72 61 74 69 6f 6e 5d 0d 0a 20 20 20 20 20 20  uration]..      
1c9a0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
1c9b0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1c9c0 72 67 73 20 5c 22 20 24 63 6f 6e 66 69 67 75 72  rgs \" $configur
1c9d0 61 74 69 6f 6e 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20  ation \"\n].... 
1c9e0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1c9f0 20 20 23 20 4e 4f 54 45 3a 20 54 72 79 20 74 6f    # NOTE: Try to
1ca00 20 73 65 74 75 70 20 61 6e 20 69 6e 74 65 72 72   setup an interr
1ca10 75 70 74 20 63 61 6c 6c 62 61 63 6b 20 75 73 69  upt callback usi
1ca20 6e 67 20 74 68 65 20 73 63 72 69 70 74 20 64 65  ng the script de
1ca30 62 75 67 67 65 72 0d 0a 20 20 20 20 20 20 20 20  bugger..        
1ca40 23 20 20 20 20 20 20 20 74 68 61 74 20 77 69 6c  #       that wil
1ca50 6c 20 63 61 6e 63 65 6c 20 61 6c 6c 20 53 51 4c  l cancel all SQL
1ca60 20 71 75 65 72 69 65 73 20 69 6e 20 70 72 6f 67   queries in prog
1ca70 72 65 73 73 20 66 6f 72 20 61 6c 6c 20 64 61 74  ress for all dat
1ca80 61 62 61 73 65 0d 0a 20 20 20 20 20 20 20 20 23  abase..        #
1ca90 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f         connectio
1caa0 6e 73 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 69 73  ns known to this
1cab0 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20   interpreter... 
1cac0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1cad0 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
1cae0 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 49  sts ::no(sqliteI
1caf0 6e 74 65 72 72 75 70 74 43 61 6c 6c 62 61 63 6b  nterruptCallback
1cb00 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
1cb10 20 20 20 20 20 20 73 65 74 75 70 44 62 49 6e 74        setupDbInt
1cb20 65 72 72 75 70 74 43 61 6c 6c 62 61 63 6b 20 24  erruptCallback $
1cb30 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24  ::test_channel $
1cb40 3a 3a 74 65 73 74 5f 6c 6f 67 0d 0a 20 20 20 20  ::test_log..    
1cb50 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1cb60 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1cb70 54 45 3a 20 43 68 65 63 6b 20 66 6f 72 20 74 68  TE: Check for th
1cb80 65 20 6e 61 74 69 76 65 20 72 75 6e 74 69 6d 65  e native runtime
1cb90 20 6f 70 74 69 6f 6e 2c 20 77 68 69 63 68 20 77   option, which w
1cba0 6f 75 6c 64 20 6d 65 61 6e 20 77 65 20 61 72 65  ould mean we are
1cbb0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1cbc0 20 20 75 73 69 6e 67 20 74 68 65 20 6d 69 78 65    using the mixe
1cbd0 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 2e  d-mode assembly.
1cbe0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1cbf0 20 20 20 20 20 63 68 65 63 6b 46 6f 72 52 75 6e       checkForRun
1cc00 74 69 6d 65 4f 70 74 69 6f 6e 20 24 3a 3a 74 65  timeOption $::te
1cc10 73 74 5f 63 68 61 6e 6e 65 6c 20 6e 61 74 69 76  st_channel nativ
1cc20 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e....        #..
1cc30 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1cc40 43 68 65 63 6b 20 69 66 20 74 68 65 20 74 65 73  Check if the tes
1cc50 74 20 73 75 69 74 65 20 73 68 6f 75 6c 64 20 63  t suite should c
1cc60 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
1cc70 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0d 0a  of connections..
1cc80 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1cc90 22 6f 70 65 6e 65 64 22 20 61 6e 64 20 22 63 6c  "opened" and "cl
1cca0 6f 73 65 64 22 20 66 72 6f 6d 20 74 68 65 20 70  osed" from the p
1ccb0 6f 6f 6c 20 77 68 65 6e 20 64 65 74 65 72 6d 69  ool when determi
1ccc0 6e 69 6e 67 20 69 66 20 61 20 74 65 73 74 0d 0a  ning if a test..
1ccd0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1cce0 70 61 73 73 65 64 2e 20 20 44 69 73 61 62 6c 69  passed.  Disabli
1ccf0 6e 67 20 74 68 69 73 20 62 65 68 61 76 69 6f 72  ng this behavior
1cd00 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 6e 65   is sometimes ne
1cd10 63 65 73 73 61 72 79 20 28 65 2e 67 2e 0d 0a 20  cessary (e.g... 
1cd20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64         #       d
1cd30 75 72 69 6e 67 20 74 68 65 20 72 65 6c 65 61 73  uring the releas
1cd40 65 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73  e testing proces
1cd50 73 29 20 62 65 63 61 75 73 65 20 74 68 65 72 65  s) because there
1cd60 20 61 72 65 20 73 65 76 65 72 61 6c 0d 0a 20 20   are several..  
1cd70 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65        #       te
1cd80 73 74 73 20 74 68 61 74 20 72 65 6c 79 20 6f 6e  sts that rely on
1cd90 20 74 68 65 20 22 6f 70 65 6e 65 64 20 66 72 6f   the "opened fro
1cda0 6d 20 70 6f 6f 6c 22 20 63 6f 75 6e 74 20 62 65  m pool" count be
1cdb0 69 6e 67 20 67 72 65 61 74 65 72 0d 0a 20 20 20  ing greater..   
1cdc0 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 61       #       tha
1cdd0 6e 20 7a 65 72 6f 2e 20 20 54 68 65 73 65 20 74  n zero.  These t
1cde0 65 73 74 73 20 6d 61 79 20 66 61 69 6c 20 64 75  ests may fail du
1cdf0 65 20 74 6f 20 74 68 65 20 6e 6f 6e 2d 64 65 74  e to the non-det
1ce00 65 72 6d 69 6e 69 73 74 69 63 0d 0a 20 20 20 20  erministic..    
1ce10 20 20 20 20 23 20 20 20 20 20 20 20 62 65 68 61      #       beha
1ce20 76 69 6f 72 20 6f 66 20 74 68 65 20 43 4c 52 20  vior of the CLR 
1ce30 47 43 2c 20 65 76 65 6e 20 77 68 65 6e 20 74 68  GC, even when th
1ce40 65 72 65 20 69 73 20 6e 6f 20 62 75 67 20 69 6e  ere is no bug in
1ce50 20 74 68 65 20 63 6f 64 65 0d 0a 20 20 20 20 20   the code..     
1ce60 20 20 20 23 20 20 20 20 20 20 20 62 65 69 6e 67     #       being
1ce70 20 74 65 73 74 65 64 2e 0d 0a 20 20 20 20 20 20   tested...      
1ce80 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65    #..        che
1ce90 63 6b 46 6f 72 52 75 6e 74 69 6d 65 4f 70 74 69  ckForRuntimeOpti
1cea0 6f 6e 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  on $::test_chann
1ceb0 65 6c 20 6e 6f 50 6f 6f 6c 43 6f 75 6e 74 73 0d  el noPoolCounts.
1cec0 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1ced0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
1cee0 65 63 6b 20 69 66 20 74 68 65 20 74 65 73 74 20  eck if the test 
1cef0 73 75 69 74 65 20 73 68 6f 75 6c 64 20 75 73 65  suite should use
1cf00 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f   shared-cache mo
1cf10 64 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  de...        #..
1cf20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
1cf30 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 24 3a  RuntimeOption $:
1cf40 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 73 68  :test_channel sh
1cf50 61 72 65 64 43 61 63 68 65 0d 0a 0d 0a 20 20 20  aredCache....   
1cf60 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1cf70 23 20 4e 4f 54 45 3a 20 52 65 70 6f 72 74 20 74  # NOTE: Report t
1cf80 68 65 20 72 65 73 6f 75 72 63 65 20 75 73 61 67  he resource usag
1cf90 65 20 70 72 69 6f 72 20 74 6f 20 72 75 6e 6e 69  e prior to runni
1cfa0 6e 67 20 61 6e 79 20 74 65 73 74 73 2e 0d 0a 20  ng any tests... 
1cfb0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1cfc0 20 20 72 65 70 6f 72 74 53 51 4c 69 74 65 52 65    reportSQLiteRe
1cfd0 73 6f 75 72 63 65 73 20 24 3a 3a 74 65 73 74 5f  sources $::test_
1cfe0 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20  channel....     
1cff0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1d000 4e 4f 54 45 3a 20 47 72 61 62 20 74 68 65 20 6c  NOTE: Grab the l
1d010 69 73 74 20 6f 66 20 6e 61 74 69 76 65 20 6d 6f  ist of native mo
1d020 64 75 6c 65 73 20 66 6f 72 20 74 68 65 20 63 75  dules for the cu
1d030 72 72 65 6e 74 20 70 72 6f 63 65 73 73 20 61 6e  rrent process an
1d040 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  d..        #    
1d050 20 20 20 72 65 70 6f 72 74 20 6f 6e 20 74 68 65     report on the
1d060 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
1d070 69 74 65 20 72 65 6c 61 74 65 64 20 6f 6e 65 73  ite related ones
1d080 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1d090 20 20 20 20 20 20 73 65 74 20 6d 6f 64 75 6c 65        set module
1d0a0 73 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65  s [object invoke
1d0b0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1d0c0 53 79 73 74 65 6d 2e 44 69 61 67 6e 6f 73 74 69  System.Diagnosti
1d0d0 63 73 2e 50 72 6f 63 65 73 73 2e 47 65 74 43 75  cs.Process.GetCu
1d0e0 72 72 65 6e 74 50 72 6f 63 65 73 73 20 4d 6f 64  rrentProcess Mod
1d0f0 75 6c 65 73 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  ules]....       
1d100 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20   object foreach 
1d110 2d 61 6c 69 61 73 20 6d 6f 64 75 6c 65 20 24 6d  -alias module $m
1d120 6f 64 75 6c 65 73 20 7b 0d 0a 20 20 20 20 20 20  odules {..      
1d130 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1d140 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6d 6f 64   # NOTE: The mod
1d150 75 6c 65 20 66 69 6c 65 20 6e 61 6d 65 20 68 65  ule file name he
1d160 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 72 6d 61  re must be norma
1d170 6c 69 7a 65 64 2e 0d 0a 20 20 20 20 20 20 20 20  lized...        
1d180 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73    #..          s
1d190 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c  et fileName [fil
1d1a0 65 20 6e 6f 72 6d 61 6c 69 7a 65 20 5b 24 6d 6f  e normalize [$mo
1d1b0 64 75 6c 65 20 46 69 6c 65 4e 61 6d 65 5d 5d 0d  dule FileName]].
1d1c0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
1d1d0 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2d  {[string match -
1d1e0 6e 6f 63 61 73 65 20 2a 2f 73 71 6c 69 74 65 33  nocase */sqlite3
1d1f0 2e 64 6c 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 7d  .dll $fileName]}
1d200 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1d210 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
1d220 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
1d230 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1d240 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
1d250 66 6f 75 6e 64 20 6c 6f 61 64 65 64 20 53 51 4c  found loaded SQL
1d260 69 74 65 20 6e 61 74 69 76 65 20 6c 69 62 72 61  ite native libra
1d270 72 79 20 6d 6f 64 75 6c 65 3a 20 22 20 5c 0d 0a  ry module: " \..
1d280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d290 24 66 69 6c 65 4e 61 6d 65 20 5c 6e 5d 0d 0a 20  $fileName \n].. 
1d2a0 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69           } elsei
1d2b0 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68  f {[string match
1d2c0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1d2d0 20 20 2d 6e 6f 63 61 73 65 20 2a 2f 53 51 4c 69    -nocase */SQLi
1d2e0 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 20 24  te.Interop.dll $
1d2f0 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  fileName]} then 
1d300 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
1d310 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
1d320 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1d330 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1d340 20 20 20 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20      "---- found 
1d350 6c 6f 61 64 65 64 20 53 51 4c 69 74 65 20 69 6e  loaded SQLite in
1d360 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 6d  terop assembly m
1d370 6f 64 75 6c 65 3a 20 22 20 5c 0d 0a 20 20 20 20  odule: " \..    
1d380 20 20 20 20 20 20 20 20 20 20 20 20 24 66 69 6c              $fil
1d390 65 4e 61 6d 65 20 5c 6e 5d 0d 0a 20 20 20 20 20  eName \n]..     
1d3a0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1d3b0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74  }....        cat
1d3c0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
1d3d0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
1d3e0 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20  annel \..       
1d3f0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 6d         "---- com
1d400 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
1d410 73 20 66 6f 72 20 53 51 4c 69 74 65 20 63 6f 72  s for SQLite cor
1d420 65 20 6c 69 62 72 61 72 79 2e 2e 2e 20 22 0d 0a  e library... "..
1d430 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
1d440 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
1d450 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
1d460 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
1d470 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
1d480 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
1d490 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69  Data.SQLite.SQLi
1d4a0 74 65 33 20 53 51 4c 69 74 65 43 6f 6d 70 69 6c  te3 SQLiteCompil
1d4b0 65 4f 70 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20  eOptions..      
1d4c0 20 20 20 20 7d 20 63 6f 6d 70 69 6c 65 4f 70 74      } compileOpt
1d4d0 69 6f 6e 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ions] == 0} then
1d4e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1d4f0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
1d500 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1d510 73 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c  s [formatList [l
1d520 73 6f 72 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  sort \..        
1d530 20 20 20 20 20 20 20 20 24 63 6f 6d 70 69 6c 65          $compile
1d540 4f 70 74 69 6f 6e 73 5d 20 3c 6e 6f 6e 65 3e 5d  Options] <none>]
1d550 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
1d560 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
1d570 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
1d580 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e  est_channel unkn
1d590 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20  own\n..         
1d5a0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
1d5b0 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b  .        catch {
1d5c0 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
1d5d0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1d5e0 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l \..           
1d5f0 20 20 20 22 2d 2d 2d 2d 20 63 6f 6d 70 69 6c 65     "---- compile
1d600 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 66 6f  -time options fo
1d610 72 20 53 51 4c 69 74 65 20 69 6e 74 65 72 6f 70  r SQLite interop
1d620 20 61 73 73 65 6d 62 6c 79 2e 2e 2e 20 22 0d 0a   assembly... "..
1d630 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
1d640 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
1d650 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
1d660 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
1d670 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
1d680 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
1d690 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69  Data.SQLite.SQLi
1d6a0 74 65 33 20 49 6e 74 65 72 6f 70 43 6f 6d 70 69  te3 InteropCompi
1d6b0 6c 65 4f 70 74 69 6f 6e 73 0d 0a 20 20 20 20 20  leOptions..     
1d6c0 20 20 20 20 20 7d 20 63 6f 6d 70 69 6c 65 4f 70       } compileOp
1d6d0 74 69 6f 6e 73 5d 20 3d 3d 20 30 7d 20 74 68 65  tions] == 0} the
1d6e0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1d6f0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
1d700 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1d710 67 73 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b  gs [formatList [
1d720 6c 73 6f 72 74 20 5c 0d 0a 20 20 20 20 20 20 20  lsort \..       
1d730 20 20 20 20 20 20 20 20 20 24 63 6f 6d 70 69 6c           $compil
1d740 65 4f 70 74 69 6f 6e 73 5d 20 3c 6e 6f 6e 65 3e  eOptions] <none>
1d750 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  ] \n]..         
1d760 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1d770 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
1d780 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b  test_channel unk
1d790 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20  nown\n..        
1d7a0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
1d7b0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1d7c0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f       # NOTE: Sho
1d7d0 77 20 74 68 65 20 61 63 74 69 76 65 20 74 65 73  w the active tes
1d7e0 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0d 0a  t constraints...
1d7f0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1d800 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
1d810 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
1d820 41 72 67 73 20 22 2d 2d 2d 2d 20 63 6f 6e 73 74  Args "---- const
1d830 72 61 69 6e 74 73 3a 20 22 20 5c 0d 0a 20 20 20  raints: " \..   
1d840 20 20 20 20 20 20 20 20 20 5b 66 6f 72 6d 61 74           [format
1d850 4c 69 73 74 20 5b 6c 73 6f 72 74 20 5b 67 65 74  List [lsort [get
1d860 43 6f 6e 73 74 72 61 69 6e 74 73 5d 5d 20 3c 6e  Constraints]] <n
1d870 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20  one>] \n]....   
1d880 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1d890 23 20 4e 4f 54 45 3a 20 53 61 76 65 20 74 68 65  # NOTE: Save the
1d8a0 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74   test constraint
1d8b0 73 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 72  s for use by thr
1d8c0 65 61 64 73 20 63 72 65 61 74 65 64 20 69 6e 20  eads created in 
1d8d0 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20  this..        # 
1d8e0 20 20 20 20 20 20 61 70 70 6c 69 63 61 74 69 6f        applicatio
1d8f0 6e 20 64 6f 6d 61 69 6e 2e 20 20 54 68 69 73 20  n domain.  This 
1d900 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65 63  is necessary bec
1d910 61 75 73 65 20 61 6c 6c 20 74 68 65 20 45 61 67  ause all the Eag
1d920 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  le..        #   
1d930 20 20 20 20 22 74 65 73 74 20 63 6f 6e 74 65 78      "test contex
1d940 74 22 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  t" information i
1d950 73 20 70 65 72 2d 74 68 72 65 61 64 2e 0d 0a 20  s per-thread... 
1d960 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1d970 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
1d980 73 74 73 20 3a 3a 74 65 73 74 5f 63 6f 6e 73 74  sts ::test_const
1d990 72 61 69 6e 74 73 5d 7d 20 74 68 65 6e 20 7b 0d  raints]} then {.
1d9a0 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a  .          set :
1d9b0 3a 74 65 73 74 5f 63 6f 6e 73 74 72 61 69 6e 74  :test_constraint
1d9c0 73 20 24 3a 3a 65 61 67 6c 65 5f 74 65 73 74 73  s $::eagle_tests
1d9d0 28 63 6f 6e 73 74 72 61 69 6e 74 73 29 0d 0a 20  (constraints).. 
1d9e0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1d9f0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1da00 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 74 68 65 20   NOTE: Load the 
1da10 22 61 66 74 65 72 2d 63 6f 6e 73 74 72 61 69 6e  "after-constrain
1da20 74 73 22 20 63 75 73 74 6f 6d 20 70 65 72 2d 75  ts" custom per-u
1da30 73 65 72 20 61 6e 64 2f 6f 72 20 70 65 72 2d 68  ser and/or per-h
1da40 6f 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ost..        #  
1da50 20 20 20 20 20 74 65 73 74 20 73 65 74 74 69 6e       test settin
1da60 67 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20  gs now...       
1da70 20 23 0d 0a 20 20 20 20 20 20 20 20 75 70 6c 65   #..        uple
1da80 76 65 6c 20 31 20 5b 6c 69 73 74 20 6c 6f 61 64  vel 1 [list load
1da90 53 51 4c 69 74 65 54 65 73 74 53 65 74 74 69 6e  SQLiteTestSettin
1daa0 67 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  gs $::test_chann
1dab0 65 6c 20 2e 61 66 74 65 72 5d 0d 0a 0d 0a 20 20  el .after]....  
1dac0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1dad0 20 23 20 4e 4f 54 45 3a 20 49 66 20 6e 65 63 65   # NOTE: If nece
1dae0 73 73 61 72 79 2c 20 65 6e 61 62 6c 65 20 73 68  ssary, enable sh
1daf0 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 20  ared-cache mode 
1db00 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  now...        #.
1db10 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61  .        if {[ha
1db20 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 73  sRuntimeOption s
1db30 68 61 72 65 64 43 61 63 68 65 5d 7d 20 74 68 65  haredCache]} the
1db40 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 65  n {..          e
1db50 6e 61 62 6c 65 53 68 61 72 65 64 43 61 63 68 65  nableSharedCache
1db60 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1db70 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 7d   true..        }
1db80 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
1db90 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
1dba0 68 6f 77 20 77 68 65 6e 20 6f 75 72 20 74 65 73  how when our tes
1dbb0 74 73 20 61 63 74 75 61 6c 6c 79 20 62 65 67 61  ts actually bega
1dbc0 6e 20 28 6e 6f 77 29 2e 0d 0a 20 20 20 20 20 20  n (now)...      
1dbd0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75    #..        tpu
1dbe0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
1dbf0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1dc00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
1dc10 2d 2d 2d 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  --- System.Data.
1dc20 53 51 4c 69 74 65 20 74 65 73 74 73 20 62 65 67  SQLite tests beg
1dc30 61 6e 20 61 74 20 22 20 5c 0d 0a 20 20 20 20 20  an at " \..     
1dc40 20 20 20 20 20 20 20 5b 63 6c 6f 63 6b 20 66 6f         [clock fo
1dc50 72 6d 61 74 20 5b 63 6c 6f 63 6b 20 73 65 63 6f  rmat [clock seco
1dc60 6e 64 73 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20  nds]] \n]..     
1dc70 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
1dc80 20 20 70 72 6f 63 20 72 75 6e 53 51 4c 69 74 65    proc runSQLite
1dc90 54 65 73 74 46 69 6c 65 73 50 72 6f 6c 6f 67 75  TestFilesPrologu
1dca0 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70  e {} {..      up
1dcb0 6c 65 76 65 6c 20 31 20 7b 0d 0a 20 20 20 20 20  level 1 {..     
1dcc0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1dcd0 4e 4f 54 45 3a 20 53 65 74 75 70 20 74 68 65 20  NOTE: Setup the 
1dce0 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 72  variables that r
1dcf0 65 66 65 72 20 74 6f 20 74 68 65 20 76 61 72 69  efer to the vari
1dd00 6f 75 73 20 6e 6f 6e 2d 64 61 74 61 20 66 69 6c  ous non-data fil
1dd10 65 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  es..        #   
1dd20 20 20 20 20 72 65 71 75 69 72 65 64 20 62 79 20      required by 
1dd30 74 68 65 20 74 65 73 74 73 20 69 6e 20 74 68 69  the tests in thi
1dd40 73 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20  s file...       
1dd50 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
1dd60 65 6e 74 69 74 79 46 72 61 6d 65 77 6f 72 6b 44  entityFrameworkD
1dd70 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20  llFile \..      
1dd80 20 20 20 20 20 20 5b 67 65 74 42 75 69 6c 64 46        [getBuildF
1dd90 69 6c 65 4e 61 6d 65 20 45 6e 74 69 74 79 46 72  ileName EntityFr
1dda0 61 6d 65 77 6f 72 6b 2e 64 6c 6c 5d 0d 0a 0d 0a  amework.dll]....
1ddb0 20 20 20 20 20 20 20 20 73 65 74 20 69 6e 73 74          set inst
1ddc0 61 6c 6c 65 72 45 78 65 46 69 6c 65 20 5b 67 65  allerExeFile [ge
1ddd0 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 49  tBuildFileName I
1dde0 6e 73 74 61 6c 6c 65 72 2e 65 78 65 5d 0d 0a 20  nstaller.exe].. 
1ddf0 20 20 20 20 20 20 20 73 65 74 20 73 71 6c 69 74         set sqlit
1de00 65 44 65 73 69 67 6e 65 72 44 6c 6c 46 69 6c 65  eDesignerDllFile
1de10 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61   [getBuildFileNa
1de20 6d 65 20 53 51 4c 69 74 65 2e 44 65 73 69 67 6e  me SQLite.Design
1de30 65 72 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20  er.dll]....     
1de40 20 20 20 73 65 74 20 73 79 73 74 65 6d 44 61 74     set systemDat
1de50 61 53 51 4c 69 74 65 44 6c 6c 46 69 6c 65 20 5c  aSQLiteDllFile \
1de60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67  ..            [g
1de70 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20  etBuildFileName 
1de80 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
1de90 74 65 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20  te.dll]....     
1dea0 20 20 20 73 65 74 20 73 79 73 74 65 6d 44 61 74     set systemDat
1deb0 61 53 51 4c 69 74 65 4c 69 6e 71 44 6c 6c 46 69  aSQLiteLinqDllFi
1dec0 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  le \..          
1ded0 20 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e    [getBuildFileN
1dee0 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  ame System.Data.
1def0 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 5d  SQLite.Linq.dll]
1df00 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
1df10 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65  systemDataSQLite
1df20 45 66 36 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20  Ef6DllFile \..  
1df30 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 75            [getBu
1df40 69 6c 64 46 69 6c 65 4e 61 6d 65 20 53 79 73 74  ildFileName Syst
1df50 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 45  em.Data.SQLite.E
1df60 46 36 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20  F6.dll]....     
1df70 20 20 20 73 65 74 20 74 65 73 74 45 78 65 46 69     set testExeFi
1df80 6c 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65  le [getBuildFile
1df90 4e 61 6d 65 20 74 65 73 74 2e 65 78 65 5d 0d 0a  Name test.exe]..
1dfa0 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74          set test
1dfb0 4c 69 6e 71 45 78 65 46 69 6c 65 20 5b 67 65 74  LinqExeFile [get
1dfc0 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 74 65  BuildFileName te
1dfd0 73 74 6c 69 6e 71 2e 65 78 65 5d 0d 0a 20 20 20  stlinq.exe]..   
1dfe0 20 20 20 20 20 73 65 74 20 74 65 73 74 45 66 36       set testEf6
1dff0 45 78 65 46 69 6c 65 20 5b 67 65 74 42 75 69 6c  ExeFile [getBuil
1e000 64 46 69 6c 65 4e 61 6d 65 20 74 65 73 74 65 66  dFileName testef
1e010 36 2e 65 78 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  6.exe]....      
1e020 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
1e030 4f 54 45 3a 20 53 65 74 75 70 20 74 68 65 20 76  OTE: Setup the v
1e040 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 72 65  ariables that re
1e050 66 65 72 20 74 6f 20 74 68 65 20 76 61 72 69 6f  fer to the vario
1e060 75 73 20 64 61 74 61 20 66 69 6c 65 73 0d 0a 20  us data files.. 
1e070 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72         #       r
1e080 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 74  equired by the t
1e090 65 73 74 73 20 69 6e 20 74 68 69 73 20 66 69 6c  ests in this fil
1e0a0 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
1e0b0 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74 4c         set testL
1e0c0 69 6e 71 4f 75 74 46 69 6c 65 20 5b 66 69 6c 65  inqOutFile [file
1e0d0 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
1e0e0 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20  e join \..      
1e0f0 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65        [getSQLite
1e100 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 74 65  TestDataPath] te
1e110 73 74 6c 69 6e 71 2e 6f 75 74 5d 5d 0d 0a 0d 0a  stlinq.out]]....
1e120 20 20 20 20 20 20 20 20 73 65 74 20 6e 6f 72 74          set nort
1e130 68 77 69 6e 64 45 66 44 62 46 69 6c 65 20 5b 66  hwindEfDbFile [f
1e140 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b  ile nativename [
1e150 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20  file join \..   
1e160 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 64           [file d
1e170 69 72 6e 61 6d 65 20 5b 66 69 6c 65 20 64 69 72  irname [file dir
1e180 6e 61 6d 65 20 5b 67 65 74 53 51 4c 69 74 65 54  name [getSQLiteT
1e190 65 73 74 44 61 74 61 50 61 74 68 5d 5d 5d 20 5c  estDataPath]]] \
1e1a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ..            te
1e1b0 73 74 6c 69 6e 71 20 6e 6f 72 74 68 77 69 6e 64  stlinq northwind
1e1c0 45 46 2e 64 62 5d 5d 0d 0a 0d 0a 20 20 20 20 20  EF.db]]....     
1e1d0 20 20 20 73 65 74 20 6e 6f 6e 57 61 6c 44 62 46     set nonWalDbF
1e1e0 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ile [file native
1e1f0 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
1e200 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
1e210 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74  getSQLiteTestDat
1e220 61 50 61 74 68 5d 20 6e 6f 6e 57 61 6c 2e 64 62  aPath] nonWal.db
1e230 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65  ]]....        se
1e240 74 20 77 61 6c 44 62 46 69 6c 65 20 5b 66 69 6c  t walDbFile [fil
1e250 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69  e nativename [fi
1e260 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20  le join \..     
1e270 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74         [getSQLit
1e280 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 77  eTestDataPath] w
1e290 61 6c 2e 64 62 5d 5d 0d 0a 0d 0a 20 20 20 20 20  al.db]]....     
1e2a0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1e2b0 4e 4f 54 45 3a 20 54 68 65 20 76 61 72 69 6f 75  NOTE: The variou
1e2c0 73 20 69 6e 73 74 61 6c 6c 2f 75 6e 69 6e 73 74  s install/uninst
1e2d0 61 6c 6c 20 6c 6f 67 20 66 69 6c 65 73 20 75 73  all log files us
1e2e0 65 64 20 74 6f 20 74 65 73 74 20 74 68 65 0d 0a  ed to test the..
1e2f0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1e300 64 65 73 69 67 6e 2d 74 69 6d 65 20 63 6f 6d 70  design-time comp
1e310 6f 6e 65 6e 74 20 69 6e 73 74 61 6c 6c 65 72 2e  onent installer.
1e320 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1e330 20 20 20 20 20 73 65 74 20 74 65 73 74 49 6e 73       set testIns
1e340 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c  tallVs2005LogFil
1e350 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
1e360 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d  me [file join \.
1e370 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65  .            [ge
1e380 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50  tSQLiteTestDataP
1e390 61 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54  ath] Installer_T
1e3a0 65 73 74 5f 56 73 32 30 30 35 2e 6c 6f 67 5d 5d  est_Vs2005.log]]
1e3b0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
1e3c0 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 30  testInstallVs200
1e3d0 38 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e  8LogFile [file n
1e3e0 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
1e3f0 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  join \..        
1e400 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65      [getSQLiteTe
1e410 73 74 44 61 74 61 50 61 74 68 5d 20 49 6e 73 74  stDataPath] Inst
1e420 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 30  aller_Test_Vs200
1e430 38 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20  8.log]]....     
1e440 20 20 20 73 65 74 20 74 65 73 74 49 6e 73 74 61     set testInsta
1e450 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65 20  llVs2010LogFile 
1e460 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
1e470 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20   [file join \.. 
1e480 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53             [getS
1e490 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74  QLiteTestDataPat
1e4a0 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54 65 73  h] Installer_Tes
1e4b0 74 5f 56 73 32 30 31 30 2e 6c 6f 67 5d 5d 0d 0a  t_Vs2010.log]]..
1e4c0 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 65  ..        set te
1e4d0 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c  stInstallVs2012L
1e4e0 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74  ogFile [file nat
1e4f0 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
1e500 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  in \..          
1e510 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74    [getSQLiteTest
1e520 44 61 74 61 50 61 74 68 5d 20 49 6e 73 74 61 6c  DataPath] Instal
1e530 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31 32 2e  ler_Test_Vs2012.
1e540 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  log]]....       
1e550 20 73 65 74 20 74 65 73 74 49 6e 73 74 61 6c 6c   set testInstall
1e560 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 20 5b 66  Vs2013LogFile [f
1e570 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b  ile nativename [
1e580 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20  file join \..   
1e590 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c           [getSQL
1e5a0 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d  iteTestDataPath]
1e5b0 20 49 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f   Installer_Test_
1e5c0 56 73 32 30 31 33 2e 6c 6f 67 5d 5d 0d 0a 0d 0a  Vs2013.log]]....
1e5d0 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74          set test
1e5e0 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c  UninstallVs2005L
1e5f0 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74  ogFile [file nat
1e600 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
1e610 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  in \..          
1e620 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74    [getSQLiteTest
1e630 44 61 74 61 50 61 74 68 5d 20 55 6e 69 6e 73 74  DataPath] Uninst
1e640 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 30  aller_Test_Vs200
1e650 35 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20  5.log]]....     
1e660 20 20 20 73 65 74 20 74 65 73 74 55 6e 69 6e 73     set testUnins
1e670 74 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c  tallVs2008LogFil
1e680 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
1e690 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d  me [file join \.
1e6a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65  .            [ge
1e6b0 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50  tSQLiteTestDataP
1e6c0 61 74 68 5d 20 55 6e 69 6e 73 74 61 6c 6c 65 72  ath] Uninstaller
1e6d0 5f 54 65 73 74 5f 56 73 32 30 30 38 2e 6c 6f 67  _Test_Vs2008.log
1e6e0 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65  ]]....        se
1e6f0 74 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56  t testUninstallV
1e700 73 32 30 31 30 4c 6f 67 46 69 6c 65 20 5b 66 69  s2010LogFile [fi
1e710 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
1e720 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20  ile join \..    
1e730 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69          [getSQLi
1e740 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20  teTestDataPath] 
1e750 55 6e 69 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74  Uninstaller_Test
1e760 5f 56 73 32 30 31 30 2e 6c 6f 67 5d 5d 0d 0a 0d  _Vs2010.log]]...
1e770 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73  .        set tes
1e780 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 32  tUninstallVs2012
1e790 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61  LogFile [file na
1e7a0 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a  tivename [file j
1e7b0 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  oin \..         
1e7c0 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73     [getSQLiteTes
1e7d0 74 44 61 74 61 50 61 74 68 5d 20 55 6e 69 6e 73  tDataPath] Unins
1e7e0 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30  taller_Test_Vs20
1e7f0 31 32 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20  12.log]]....    
1e800 20 20 20 20 73 65 74 20 74 65 73 74 55 6e 69 6e      set testUnin
1e810 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67 46 69  stallVs2013LogFi
1e820 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  le [file nativen
1e830 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c  ame [file join \
1e840 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67  ..            [g
1e850 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61  etSQLiteTestData
1e860 50 61 74 68 5d 20 55 6e 69 6e 73 74 61 6c 6c 65  Path] Uninstalle
1e870 72 5f 54 65 73 74 5f 56 73 32 30 31 33 2e 6c 6f  r_Test_Vs2013.lo
1e880 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  g]]....        #
1e890 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1e8a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1e8b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1e8c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1e8d0 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20 20  ######....      
1e8e0 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
1e8f0 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
1e900 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
1e910 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
1e920 69 6c 20 24 65 6e 74 69 74 79 46 72 61 6d 65 77  il $entityFramew
1e930 6f 72 6b 44 6c 6c 46 69 6c 65 5d 5d 5d 7d 20 74  orkDllFile]]]} t
1e940 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1e950 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
1e960 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 65 6e 74  est_channel $ent
1e970 69 74 79 46 72 61 6d 65 77 6f 72 6b 44 6c 6c 46  ityFrameworkDllF
1e980 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ile..        }..
1e990 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
1e9a0 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
1e9b0 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
1e9c0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1e9d0 5b 66 69 6c 65 20 74 61 69 6c 20 24 69 6e 73 74  [file tail $inst
1e9e0 61 6c 6c 65 72 45 78 65 46 69 6c 65 5d 5d 5d 7d  allerExeFile]]]}
1e9f0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1ea00 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20     checkForFile 
1ea10 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 69  $test_channel $i
1ea20 6e 73 74 61 6c 6c 65 72 45 78 65 46 69 6c 65 20  nstallerExeFile 
1ea30 49 6e 73 74 61 6c 6c 65 72 2e 65 78 65 0d 0a 20  Installer.exe.. 
1ea40 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1ea50 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f      if {![haveCo
1ea60 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
1ea70 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20  Args file_ \..  
1ea80 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
1ea90 74 61 69 6c 20 24 73 71 6c 69 74 65 44 65 73 69  tail $sqliteDesi
1eaa0 67 6e 65 72 44 6c 6c 46 69 6c 65 5d 5d 5d 7d 20  gnerDllFile]]]} 
1eab0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1eac0 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24    checkForFile $
1ead0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 73 71  test_channel $sq
1eae0 6c 69 74 65 44 65 73 69 67 6e 65 72 44 6c 6c 46  liteDesignerDllF
1eaf0 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ile..        }..
1eb00 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
1eb10 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
1eb20 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
1eb30 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1eb40 5b 66 69 6c 65 20 74 61 69 6c 20 24 73 79 73 74  [file tail $syst
1eb50 65 6d 44 61 74 61 53 51 4c 69 74 65 44 6c 6c 46  emDataSQLiteDllF
1eb60 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ile]]]} then {..
1eb70 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
1eb80 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
1eb90 6e 6e 65 6c 20 24 73 79 73 74 65 6d 44 61 74 61  nnel $systemData
1eba0 53 51 4c 69 74 65 44 6c 6c 46 69 6c 65 0d 0a 20  SQLiteDllFile.. 
1ebb0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1ebc0 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f      if {![haveCo
1ebd0 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
1ebe0 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20  Args file_ \..  
1ebf0 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
1ec00 74 61 69 6c 20 24 73 79 73 74 65 6d 44 61 74 61  tail $systemData
1ec10 53 51 4c 69 74 65 4c 69 6e 71 44 6c 6c 46 69 6c  SQLiteLinqDllFil
1ec20 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e]]]} then {..  
1ec30 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
1ec40 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e  File $test_chann
1ec50 65 6c 20 24 73 79 73 74 65 6d 44 61 74 61 53 51  el $systemDataSQ
1ec60 4c 69 74 65 4c 69 6e 71 44 6c 6c 46 69 6c 65 0d  LiteLinqDllFile.
1ec70 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
1ec80 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
1ec90 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
1eca0 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
1ecb0 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
1ecc0 65 20 74 61 69 6c 20 24 73 79 73 74 65 6d 44 61  e tail $systemDa
1ecd0 74 61 53 51 4c 69 74 65 45 66 36 44 6c 6c 46 69  taSQLiteEf6DllFi
1ece0 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  le]]]} then {.. 
1ecf0 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f           checkFo
1ed00 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e  rFile $test_chan
1ed10 6e 65 6c 20 24 73 79 73 74 65 6d 44 61 74 61 53  nel $systemDataS
1ed20 51 4c 69 74 65 45 66 36 44 6c 6c 46 69 6c 65 0d  QLiteEf6DllFile.
1ed30 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
1ed40 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
1ed50 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
1ed60 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
1ed70 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
1ed80 65 20 74 61 69 6c 20 24 74 65 73 74 45 78 65 46  e tail $testExeF
1ed90 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ile]]]} then {..
1eda0 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
1edb0 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
1edc0 6e 6e 65 6c 20 24 74 65 73 74 45 78 65 46 69 6c  nnel $testExeFil
1edd0 65 20 74 65 73 74 2e 65 78 65 0d 0a 20 20 20 20  e test.exe..    
1ede0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1edf0 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74   if {![haveConst
1ee00 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
1ee10 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20  s file_ \..     
1ee20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69         [file tai
1ee30 6c 20 24 74 65 73 74 4c 69 6e 71 45 78 65 46 69  l $testLinqExeFi
1ee40 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  le]]]} then {.. 
1ee50 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f           checkFo
1ee60 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e  rFile $test_chan
1ee70 6e 65 6c 20 24 74 65 73 74 4c 69 6e 71 45 78 65  nel $testLinqExe
1ee80 46 69 6c 65 20 74 65 73 74 6c 69 6e 71 2e 65 78  File testlinq.ex
1ee90 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  e..        }....
1eea0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61          if {![ha
1eeb0 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
1eec0 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c  pendArgs file_ \
1eed0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
1eee0 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74 45 66  ile tail $testEf
1eef0 36 45 78 65 46 69 6c 65 5d 5d 5d 7d 20 74 68 65  6ExeFile]]]} the
1ef00 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  n {..          c
1ef10 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
1ef20 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 45  t_channel $testE
1ef30 66 36 45 78 65 46 69 6c 65 20 74 65 73 74 65 66  f6ExeFile testef
1ef40 36 2e 65 78 65 0d 0a 20 20 20 20 20 20 20 20 7d  6.exe..        }
1ef50 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
1ef60 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
1ef70 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
1ef80 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
1ef90 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65    [file tail $te
1efa0 73 74 4c 69 6e 71 4f 75 74 46 69 6c 65 5d 5d 5d  stLinqOutFile]]]
1efb0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1efc0 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65      checkForFile
1efd0 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24   $test_channel $
1efe0 74 65 73 74 4c 69 6e 71 4f 75 74 46 69 6c 65 0d  testLinqOutFile.
1eff0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
1f000 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
1f010 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
1f020 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
1f030 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
1f040 65 20 74 61 69 6c 20 24 6e 6f 72 74 68 77 69 6e  e tail $northwin
1f050 64 45 66 44 62 46 69 6c 65 5d 5d 5d 7d 20 74 68  dEfDbFile]]]} th
1f060 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1f070 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
1f080 73 74 5f 63 68 61 6e 6e 65 6c 20 24 6e 6f 72 74  st_channel $nort
1f090 68 77 69 6e 64 45 66 44 62 46 69 6c 65 0d 0a 20  hwindEfDbFile.. 
1f0a0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1f0b0 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f      if {![haveCo
1f0c0 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
1f0d0 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20  Args file_ \..  
1f0e0 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
1f0f0 74 61 69 6c 20 24 6e 6f 6e 57 61 6c 44 62 46 69  tail $nonWalDbFi
1f100 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  le]]]} then {.. 
1f110 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f           checkFo
1f120 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e  rFile $test_chan
1f130 6e 65 6c 20 24 6e 6f 6e 57 61 6c 44 62 46 69 6c  nel $nonWalDbFil
1f140 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  e..        }....
1f150 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61          if {![ha
1f160 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
1f170 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c  pendArgs file_ \
1f180 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
1f190 69 6c 65 20 74 61 69 6c 20 24 77 61 6c 44 62 46  ile tail $walDbF
1f1a0 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ile]]]} then {..
1f1b0 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
1f1c0 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
1f1d0 6e 6e 65 6c 20 24 77 61 6c 44 62 46 69 6c 65 0d  nnel $walDbFile.
1f1e0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
1f1f0 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
1f200 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
1f210 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
1f220 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
1f230 65 20 74 61 69 6c 20 24 74 65 73 74 49 6e 73 74  e tail $testInst
1f240 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65  allVs2005LogFile
1f250 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
1f260 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
1f270 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
1f280 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73  l $testInstallVs
1f290 32 30 30 35 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2005LogFile..   
1f2a0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1f2b0 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
1f2c0 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
1f2d0 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
1f2e0 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
1f2f0 69 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56  il $testInstallV
1f300 73 32 30 30 38 4c 6f 67 46 69 6c 65 5d 5d 5d 7d  s2008LogFile]]]}
1f310 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1f320 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20     checkForFile 
1f330 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74  $test_channel $t
1f340 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 30 38  estInstallVs2008
1f350 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20  LogFile..       
1f360 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
1f370 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69   {![haveConstrai
1f380 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
1f390 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ile_ \..        
1f3a0 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
1f3b0 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31  testInstallVs201
1f3c0 30 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65  0LogFile]]]} the
1f3d0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  n {..          c
1f3e0 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
1f3f0 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 49  t_channel $testI
1f400 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46  nstallVs2010LogF
1f410 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ile..        }..
1f420 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
1f430 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
1f440 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
1f450 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1f460 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74  [file tail $test
1f470 49 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67  InstallVs2012Log
1f480 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d  File]]]} then {.
1f490 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b  .          check
1f4a0 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
1f4b0 61 6e 6e 65 6c 20 24 74 65 73 74 49 6e 73 74 61  annel $testInsta
1f4c0 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65 0d  llVs2012LogFile.
1f4d0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
1f4e0 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
1f4f0 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
1f500 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
1f510 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
1f520 65 20 74 61 69 6c 20 24 74 65 73 74 49 6e 73 74  e tail $testInst
1f530 61 6c 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65  allVs2013LogFile
1f540 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
1f550 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
1f560 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
1f570 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73  l $testInstallVs
1f580 32 30 31 33 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2013LogFile..   
1f590 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1f5a0 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
1f5b0 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
1f5c0 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
1f5d0 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
1f5e0 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c  il $testUninstal
1f5f0 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 5d 5d  lVs2005LogFile]]
1f600 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1f610 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
1f620 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
1f630 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
1f640 32 30 30 35 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2005LogFile..   
1f650 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1f660 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
1f670 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
1f680 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
1f690 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
1f6a0 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c  il $testUninstal
1f6b0 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c 65 5d 5d  lVs2008LogFile]]
1f6c0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1f6d0 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
1f6e0 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
1f6f0 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
1f700 32 30 30 38 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2008LogFile..   
1f710 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1f720 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
1f730 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
1f740 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
1f750 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
1f760 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c  il $testUninstal
1f770 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65 5d 5d  lVs2010LogFile]]
1f780 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1f790 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
1f7a0 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
1f7b0 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
1f7c0 32 30 31 30 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2010LogFile..   
1f7d0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1f7e0 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
1f7f0 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
1f800 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
1f810 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
1f820 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c  il $testUninstal
1f830 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65 5d 5d  lVs2012LogFile]]
1f840 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1f850 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
1f860 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
1f870 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
1f880 32 30 31 32 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2012LogFile..   
1f890 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1f8a0 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
1f8b0 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
1f8c0 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
1f8d0 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
1f8e0 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c  il $testUninstal
1f8f0 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 5d 5d  lVs2013LogFile]]
1f900 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1f910 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
1f920 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
1f930 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
1f940 32 30 31 33 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2013LogFile..   
1f950 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
1f960 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
1f970 72 6f 63 20 72 75 6e 53 51 4c 69 74 65 54 65 73  roc runSQLiteTes
1f980 74 46 69 6c 65 73 45 70 69 6c 6f 67 75 65 20 7b  tFilesEpilogue {
1f990 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 6c 65 76  } {..      uplev
1f9a0 65 6c 20 31 20 7b 0d 0a 20 20 20 20 20 20 20 20  el 1 {..        
1f9b0 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69  unset -nocomplai
1f9c0 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
1f9d0 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73   testUninstallVs
1f9e0 32 30 31 33 4c 6f 67 46 69 6c 65 20 74 65 73 74  2013LogFile test
1f9f0 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c  UninstallVs2012L
1fa00 6f 67 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20  ogFile \..      
1fa10 20 20 20 20 20 20 74 65 73 74 55 6e 69 6e 73 74        testUninst
1fa20 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65  allVs2010LogFile
1fa30 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73   testUninstallVs
1fa40 32 30 30 38 4c 6f 67 46 69 6c 65 20 5c 0d 0a 20  2008LogFile \.. 
1fa50 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 55             testU
1fa60 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f  ninstallVs2005Lo
1fa70 67 46 69 6c 65 20 74 65 73 74 49 6e 73 74 61 6c  gFile testInstal
1fa80 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 20 5c  lVs2013LogFile \
1fa90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ..            te
1faa0 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c  stInstallVs2012L
1fab0 6f 67 46 69 6c 65 20 74 65 73 74 49 6e 73 74 61  ogFile testInsta
1fac0 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65 20  llVs2010LogFile 
1fad0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  \..            t
1fae0 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 30 38  estInstallVs2008
1faf0 4c 6f 67 46 69 6c 65 20 74 65 73 74 49 6e 73 74  LogFile testInst
1fb00 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65  allVs2005LogFile
1fb10 0d 0a 0d 0a 20 20 20 20 20 20 20 20 75 6e 73 65  ....        unse
1fb20 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 5c 0d  t -nocomplain \.
1fb30 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 6f 72  .            nor
1fb40 74 68 77 69 6e 64 45 66 44 62 46 69 6c 65 20 74  thwindEfDbFile t
1fb50 65 73 74 4c 69 6e 71 4f 75 74 46 69 6c 65 20 5c  estLinqOutFile \
1fb60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 61  ..            wa
1fb70 6c 44 62 46 69 6c 65 20 6e 6f 6e 57 61 6c 44 62  lDbFile nonWalDb
1fb80 46 69 6c 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20  File....        
1fb90 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69  unset -nocomplai
1fba0 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
1fbb0 20 74 65 73 74 45 66 36 45 78 65 46 69 6c 65 20   testEf6ExeFile 
1fbc0 74 65 73 74 4c 69 6e 71 45 78 65 46 69 6c 65 20  testLinqExeFile 
1fbd0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  \..            t
1fbe0 65 73 74 45 78 65 46 69 6c 65 20 73 79 73 74 65  estExeFile syste
1fbf0 6d 44 61 74 61 53 51 4c 69 74 65 45 66 36 44 6c  mDataSQLiteEf6Dl
1fc00 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20  lFile \..       
1fc10 20 20 20 20 20 73 79 73 74 65 6d 44 61 74 61 53       systemDataS
1fc20 51 4c 69 74 65 4c 69 6e 71 44 6c 6c 46 69 6c 65  QLiteLinqDllFile
1fc30 20 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74   systemDataSQLit
1fc40 65 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20  eDllFile \..    
1fc50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 44 65          sqliteDe
1fc60 73 69 67 6e 65 72 44 6c 6c 46 69 6c 65 20 69 6e  signerDllFile in
1fc70 73 74 61 6c 6c 65 72 45 78 65 46 69 6c 65 20 5c  stallerExeFile \
1fc80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6e  ..            en
1fc90 74 69 74 79 46 72 61 6d 65 77 6f 72 6b 44 6c 6c  tityFrameworkDll
1fca0 46 69 6c 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  File..      }.. 
1fcb0 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
1fcc0 63 20 72 75 6e 53 51 4c 69 74 65 54 65 73 74 45  c runSQLiteTestE
1fcd0 70 69 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20 20  pilogue {} {..  
1fce0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
1fcf0 4f 54 45 3a 20 53 6b 69 70 20 72 75 6e 6e 69 6e  OTE: Skip runnin
1fd00 67 20 6f 75 72 20 63 75 73 74 6f 6d 20 65 70 69  g our custom epi
1fd10 6c 6f 67 75 65 20 69 66 20 74 68 65 20 6d 61 69  logue if the mai
1fd20 6e 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 0d 0a  n one has been..
1fd30 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6b        #       sk
1fd40 69 70 70 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d  ipped...      #.
1fd50 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66  .      if {![inf
1fd60 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 70  o exists ::no(ep
1fd70 69 6c 6f 67 75 65 2e 65 61 67 6c 65 29 5d 7d 20  ilogue.eagle)]} 
1fd80 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1fd90 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
1fda0 45 3a 20 53 68 6f 77 20 77 68 65 6e 20 6f 75 72  E: Show when our
1fdb0 20 74 65 73 74 73 20 61 63 74 75 61 6c 6c 79 20   tests actually 
1fdc0 65 6e 64 65 64 20 28 6e 6f 77 29 2e 0d 0a 20 20  ended (now)...  
1fdd0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1fde0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
1fdf0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1fe00 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1fe10 20 20 22 2d 2d 2d 2d 20 53 79 73 74 65 6d 2e 44    "---- System.D
1fe20 61 74 61 2e 53 51 4c 69 74 65 20 74 65 73 74 73  ata.SQLite tests
1fe30 20 65 6e 64 65 64 20 61 74 20 22 20 5c 0d 0a 20   ended at " \.. 
1fe40 20 20 20 20 20 20 20 20 20 20 20 5b 63 6c 6f 63             [cloc
1fe50 6b 20 66 6f 72 6d 61 74 20 5b 63 6c 6f 63 6b 20  k format [clock 
1fe60 73 65 63 6f 6e 64 73 5d 5d 20 5c 6e 5d 0d 0a 0d  seconds]] \n]...
1fe70 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1fe80 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64      # NOTE: Load
1fe90 20 74 68 65 20 22 65 70 69 6c 6f 67 75 65 22 20   the "epilogue" 
1fea0 63 75 73 74 6f 6d 20 70 65 72 2d 75 73 65 72 20  custom per-user 
1feb0 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74 20  and/or per-host 
1fec0 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20  test..        # 
1fed0 20 20 20 20 20 20 73 65 74 74 69 6e 67 73 20 6e        settings n
1fee0 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ow...        #..
1fef0 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20          uplevel 
1ff00 31 20 5b 6c 69 73 74 20 6c 6f 61 64 53 51 4c 69  1 [list loadSQLi
1ff10 74 65 54 65 73 74 53 65 74 74 69 6e 67 73 20 24  teTestSettings $
1ff20 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 2e  ::test_channel .
1ff30 65 70 69 6c 6f 67 75 65 5d 0d 0a 0d 0a 20 20 20  epilogue]....   
1ff40 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1ff50 23 20 42 55 47 46 49 58 3a 20 42 65 66 6f 72 65  # BUGFIX: Before
1ff60 20 63 68 65 63 6b 69 6e 67 20 74 68 65 20 66 69   checking the fi
1ff70 6e 61 6c 20 72 65 73 6f 75 72 63 65 73 20 69 6e  nal resources in
1ff80 20 75 73 65 20 62 79 20 53 51 4c 69 74 65 2c 20   use by SQLite, 
1ff90 6d 61 6b 65 0d 0a 20 20 20 20 20 20 20 20 23 20  make..        # 
1ffa0 20 20 20 20 20 20 20 20 73 75 72 65 20 62 6f 74          sure bot
1ffb0 68 20 6f 66 20 74 68 65 20 50 52 41 47 4d 41 20  h of the PRAGMA 
1ffc0 72 65 6c 61 74 65 64 20 64 69 72 65 63 74 6f 72  related director
1ffd0 79 20 6e 61 6d 65 73 20 61 72 65 20 66 72 65 65  y names are free
1ffe0 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  d...        #.. 
1fff0 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53         checkForS
20000 51 4c 69 74 65 44 69 72 65 63 74 6f 72 69 65 73  QLiteDirectories
20010 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
20020 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20 20   true....       
20030 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
20040 54 45 3a 20 41 6c 73 6f 20 72 65 70 6f 72 74 20  TE: Also report 
20050 74 68 65 20 72 65 73 6f 75 72 63 65 20 75 73 61  the resource usa
20060 67 65 20 61 66 74 65 72 20 72 75 6e 6e 69 6e 67  ge after running
20070 20 74 68 65 20 74 65 73 74 73 2e 0d 0a 20 20 20   the tests...   
20080 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
20090 72 65 70 6f 72 74 53 51 4c 69 74 65 52 65 73 6f  reportSQLiteReso
200a0 75 72 63 65 73 20 24 3a 3a 74 65 73 74 5f 63 68  urces $::test_ch
200b0 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20  annel....       
200c0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
200d0 54 45 3a 20 52 65 70 6f 72 74 20 74 68 65 20 63  TE: Report the c
200e0 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65 20 63  ritical handle c
200f0 6f 75 6e 74 73 20 61 66 74 65 72 20 72 75 6e 6e  ounts after runn
20100 69 6e 67 20 74 68 65 20 74 65 73 74 73 2e 0d 0a  ing the tests...
20110 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
20120 20 20 20 67 65 74 53 51 4c 69 74 65 48 61 6e 64     getSQLiteHand
20130 6c 65 43 6f 75 6e 74 73 20 24 3a 3a 74 65 73 74  leCounts $::test
20140 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20  _channel....    
20150 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
20160 20 4e 4f 54 45 3a 20 49 66 20 6e 65 63 65 73 73   NOTE: If necess
20170 61 72 79 2c 20 64 69 73 61 62 6c 65 20 73 68 61  ary, disable sha
20180 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 20 6e  red-cache mode n
20190 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ow...        #..
201a0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61 73          if {[has
201b0 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 73 68  RuntimeOption sh
201c0 61 72 65 64 43 61 63 68 65 5d 7d 20 74 68 65 6e  aredCache]} then
201d0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 65 6e   {..          en
201e0 61 62 6c 65 53 68 61 72 65 64 43 61 63 68 65 20  ableSharedCache 
201f0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
20200 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 7d  false..        }
20210 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
20220 0d 0a 0c 0d 0a 20 20 20 20 23 23 23 23 23 23 23  .....    #######
20230 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
20240 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
20250 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
20260 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
20270 23 23 23 23 0d 0a 20 20 20 20 23 23 23 23 23 23  ####..    ######
20280 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
20290 23 23 23 23 23 23 23 20 45 4e 44 20 45 61 67 6c  ####### END Eagl
202a0 65 20 4f 4e 4c 59 20 23 23 23 23 23 23 23 23 23  e ONLY #########
202b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
202c0 23 23 23 23 23 0d 0a 20 20 20 20 23 23 23 23 23  #####..    #####
202d0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
202e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
202f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
20300 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
20310 23 23 23 23 23 23 0d 0a 20 20 7d 0d 0a 0d 0a 20  ######..  }.... 
20320 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 53 61   #..  # NOTE: Sa
20330 76 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ve the name of t
20340 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e  he directory con
20350 74 61 69 6e 69 6e 67 20 74 68 69 73 20 66 69 6c  taining this fil
20360 65 2e 0d 0a 20 20 23 0d 0a 20 20 69 66 20 7b 21  e...  #..  if {!
20370 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 63 6f 6d  [info exists com
20380 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 7d 20  mon_directory]} 
20390 74 68 65 6e 20 7b 0d 0a 20 20 20 20 73 65 74 20  then {..    set 
203a0 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79  common_directory
203b0 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b   [file dirname [
203c0 69 6e 66 6f 20 73 63 72 69 70 74 5d 5d 0d 0a 20  info script]].. 
203d0 20 7d 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23 20 4e   }....  #..  # N
203e0 4f 54 45 3a 20 50 72 6f 76 69 64 65 20 74 68 65  OTE: Provide the
203f0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
20400 69 74 65 20 74 65 73 74 20 70 61 63 6b 61 67 65  ite test package
20410 20 74 6f 20 74 68 65 20 69 6e 74 65 72 70 72 65   to the interpre
20420 74 65 72 2e 0d 0a 20 20 23 0d 0a 20 20 70 61 63  ter...  #..  pac
20430 6b 61 67 65 20 70 72 6f 76 69 64 65 20 53 79 73  kage provide Sys
20440 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
20450 54 65 73 74 20 31 2e 30 0d 0a 7d 0d 0a           Test 1.0..}..