System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 56fdfb3652da115979bbabe3cb00a0f712c800a0:


0000: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0010: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0020: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0030: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0040: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
0050: 0a 23 0d 0a 23 20 63 6f 6d 6d 6f 6e 2e 65 61 67  .#..# common.eag
0060: 6c 65 20 2d 2d 0d 0a 23 0d 0a 23 20 57 72 69 74  le --..#..# Writ
0070: 74 65 6e 20 62 79 20 4a 6f 65 20 4d 69 73 74 61  ten by Joe Mista
0080: 63 68 6b 69 6e 2e 0d 0a 23 20 52 65 6c 65 61 73  chkin...# Releas
0090: 65 64 20 74 6f 20 74 68 65 20 70 75 62 6c 69 63  ed to the public
00a0: 20 64 6f 6d 61 69 6e 2c 20 75 73 65 20 61 74 20   domain, use at 
00b0: 79 6f 75 72 20 6f 77 6e 20 72 69 73 6b 21 0d 0a  your own risk!..
00c0: 23 0d 0a 23 23 23 23 23 23 23 23 23 23 23 23 23  #..#############
00d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
00e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
00f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0100: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0110: 23 23 0d 0a 0d 0a 23 0d 0a 23 20 4e 4f 54 45 3a  ##....#..# NOTE:
0120: 20 55 73 65 20 6f 75 72 20 6f 77 6e 20 6e 61 6d   Use our own nam
0130: 65 73 70 61 63 65 20 68 65 72 65 20 62 65 63 61  espace here beca
0140: 75 73 65 20 65 76 65 6e 20 74 68 6f 75 67 68 20  use even though 
0150: 77 65 20 64 6f 20 6e 6f 74 20 64 69 72 65 63 74  we do not direct
0160: 6c 79 0d 0a 23 20 20 20 20 20 20 20 73 75 70 70  ly..#       supp
0170: 6f 72 74 20 6e 61 6d 65 73 70 61 63 65 73 20 6f  ort namespaces o
0180: 75 72 73 65 6c 76 65 73 2c 20 77 65 20 64 6f 20  urselves, we do 
0190: 6e 6f 74 20 77 61 6e 74 20 74 6f 20 70 6f 6c 6c  not want to poll
01a0: 75 74 65 20 74 68 65 20 67 6c 6f 62 61 6c 0d 0a  ute the global..
01b0: 23 20 20 20 20 20 20 20 6e 61 6d 65 73 70 61 63  #       namespac
01c0: 65 20 69 66 20 74 68 69 73 20 73 63 72 69 70 74  e if this script
01d0: 20 61 63 74 75 61 6c 6c 79 20 65 6e 64 73 20 75   actually ends u
01e0: 70 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65  p being evaluate
01f0: 64 20 69 6e 20 54 63 6c 2e 0d 0a 23 0d 0a 6e 61  d in Tcl...#..na
0200: 6d 65 73 70 61 63 65 20 65 76 61 6c 20 3a 3a 45  mespace eval ::E
0210: 61 67 6c 65 20 7b 0d 0a 20 20 69 66 20 7b 5b 69  agle {..  if {[i
0220: 73 45 61 67 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d  sEagle]} then {.
0230: 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23  .    ###########
0240: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0250: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0260: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0270: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0280: 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23  ..    ##########
0290: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02a0: 23 23 20 42 45 47 49 4e 20 45 61 67 6c 65 20 4f  ## BEGIN Eagle O
02b0: 4e 4c 59 20 23 23 23 23 23 23 23 23 23 23 23 23  NLY ############
02c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02d0: 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23  #..    #########
02e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0300: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0310: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0320: 23 23 0d 0a 0d 0a 20 20 20 20 70 72 6f 63 20 67  ##....    proc g
0330: 65 74 42 75 69 6c 64 59 65 61 72 20 7b 7d 20 7b  etBuildYear {} {
0340: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
0350: 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66 20   # NOTE: See if 
0360: 74 68 65 20 22 79 65 61 72 22 20 73 65 74 74 69  the "year" setti
0370: 6e 67 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  ng has been over
0380: 72 69 64 64 65 6e 20 62 79 20 74 68 65 20 75 73  ridden by the us
0390: 65 72 20 28 65 2e 67 2e 0d 0a 20 20 20 20 20 20  er (e.g...      
03a0: 23 20 20 20 20 20 20 20 6f 6e 20 74 68 65 20 63  #       on the c
03b0: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 20 20 54  ommand line).  T
03c0: 68 69 73 20 68 65 6c 70 73 20 63 6f 6e 74 72 6f  his helps contro
03d0: 6c 20 65 78 61 63 74 6c 79 20 77 68 69 63 68 20  l exactly which 
03e0: 73 65 74 20 6f 66 0d 0a 20 20 20 20 20 20 23 20  set of..      # 
03f0: 20 20 20 20 20 20 62 69 6e 61 72 69 65 73 20 77        binaries w
0400: 65 20 61 72 65 20 74 65 73 74 69 6e 67 2c 20 74  e are testing, t
0410: 68 6f 73 65 20 70 72 6f 64 75 63 65 64 20 75 73  hose produced us
0420: 69 6e 67 20 74 68 65 20 56 69 73 75 61 6c 20 53  ing the Visual S
0430: 74 75 64 69 6f 0d 0a 20 20 20 20 20 20 23 20 20  tudio..      #  
0440: 20 20 20 20 20 32 30 30 35 2c 20 32 30 30 38 2c       2005, 2008,
0450: 20 32 30 31 30 2c 20 32 30 31 32 2c 20 6f 72 20   2010, 2012, or 
0460: 32 30 31 33 20 62 75 69 6c 64 20 73 79 73 74 65  2013 build syste
0470: 6d 73 2e 20 20 54 6f 20 6f 76 65 72 72 69 64 65  ms.  To override
0480: 20 74 68 69 73 0d 0a 20 20 20 20 20 20 23 20 20   this..      #  
0490: 20 20 20 20 20 76 61 6c 75 65 20 76 69 61 20 74       value via t
04a0: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2c  he command line,
04b0: 20 65 6e 74 65 72 20 61 20 63 6f 6d 6d 61 6e 64   enter a command
04c0: 20 73 69 6d 69 6c 61 72 20 74 6f 20 6f 6e 65 20   similar to one 
04d0: 6f 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  of..      #     
04e0: 20 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    the following 
04f0: 28 61 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65  (all on one line
0500: 29 3a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ):..      #..   
0510: 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65     #       Eagle
0520: 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e  Shell.exe -anyIn
0530: 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65  itialize "set te
0540: 73 74 5f 79 65 61 72 20 32 30 30 35 22 0d 0a 20  st_year 2005".. 
0550: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 2d       #         -
0560: 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61  file .\path\to\a
0570: 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20  ll.eagle..      
0580: 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  #..      #      
0590: 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20   EagleShell.exe 
05a0: 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20 22  -anyInitialize "
05b0: 73 65 74 20 74 65 73 74 5f 79 65 61 72 20 32 30  set test_year 20
05c0: 30 38 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20  08"..      #    
05d0: 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74       -file .\pat
05e0: 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a  h\to\all.eagle..
05f0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
0600: 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c         EagleShel
0610: 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61  l.exe -anyInitia
0620: 6c 69 7a 65 20 22 73 65 74 20 74 65 73 74 5f 79  lize "set test_y
0630: 65 61 72 20 32 30 31 30 22 0d 0a 20 20 20 20 20  ear 2010"..     
0640: 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65   #         -file
0650: 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65   .\path\to\all.e
0660: 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20  agle..      #.. 
0670: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
0680: 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79  leShell.exe -any
0690: 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20  Initialize "set 
06a0: 74 65 73 74 5f 79 65 61 72 20 32 30 31 32 22 0d  test_year 2012".
06b0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20  .      #        
06c0: 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f   -file .\path\to
06d0: 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20  \all.eagle..    
06e0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20    #..      #    
06f0: 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78     EagleShell.ex
0700: 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65  e -anyInitialize
0710: 20 22 73 65 74 20 74 65 73 74 5f 79 65 61 72 20   "set test_year 
0720: 32 30 31 33 22 0d 0a 20 20 20 20 20 20 23 20 20  2013"..      #  
0730: 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70         -file .\p
0740: 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65  ath\to\all.eagle
0750: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
0760: 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68   #       EagleSh
0770: 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74  ell.exe -anyInit
0780: 69 61 6c 69 7a 65 20 22 75 6e 73 65 74 20 2d 6e  ialize "unset -n
0790: 6f 63 6f 6d 70 6c 61 69 6e 20 74 65 73 74 5f 79  ocomplain test_y
07a0: 65 61 72 22 0d 0a 20 20 20 20 20 20 23 20 20 20  ear"..      #   
07b0: 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61        -file .\pa
07c0: 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d  th\to\all.eagle.
07d0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
07e0: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
07f0: 20 3a 3a 74 65 73 74 5f 79 65 61 72 5d 20 26 26   ::test_year] &&
0800: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
0810: 24 3a 3a 74 65 73 74 5f 79 65 61 72 5d 20 3e 20  $::test_year] > 
0820: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
0830: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
0840: 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70  NOTE: Use the sp
0850: 65 63 69 66 69 65 64 20 74 65 73 74 20 79 65 61  ecified test yea
0860: 72 2e 20 20 49 66 20 74 68 69 73 20 76 61 72 69  r.  If this vari
0870: 61 62 6c 65 20 69 73 20 6e 6f 74 20 73 65 74 2c  able is not set,
0880: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
0890: 20 20 20 20 20 20 64 65 66 61 75 6c 74 20 76 61        default va
08a0: 6c 75 65 20 77 69 6c 6c 20 62 65 20 62 61 73 65  lue will be base
08b0: 64 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  d on whether or 
08c0: 6e 6f 74 20 45 61 67 6c 65 20 68 61 73 20 62 65  not Eagle has be
08d0: 65 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  en..        #   
08e0: 20 20 20 20 63 6f 6d 70 69 6c 65 64 20 61 67 61      compiled aga
08f0: 69 6e 73 74 20 74 68 65 20 43 4c 52 20 76 32 2e  inst the CLR v2.
0900: 30 20 6f 72 20 43 4c 52 20 76 34 2e 30 2e 0d 0a  0 or CLR v4.0...
0910: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
0920: 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73     return $::tes
0930: 74 5f 79 65 61 72 0d 0a 20 20 20 20 20 20 7d 20  t_year..      } 
0940: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
0950: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
0960: 45 3a 20 49 66 20 45 61 67 6c 65 20 68 61 73 20  E: If Eagle has 
0970: 62 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20 61 67  been compiled ag
0980: 61 69 6e 73 74 20 74 68 65 20 43 4c 52 20 76 34  ainst the CLR v4
0990: 2e 30 2c 20 75 73 65 20 22 32 30 31 30 22 20 62  .0, use "2010" b
09a0: 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
09b0: 20 20 20 64 65 66 61 75 6c 74 20 28 77 65 20 63     default (we c
09c0: 6f 75 6c 64 20 75 73 65 20 22 32 30 31 32 22 20  ould use "2012" 
09d0: 6f 72 20 22 32 30 31 33 22 20 69 6e 20 74 68 61  or "2013" in tha
09e0: 74 20 63 61 73 65 20 61 73 20 77 65 6c 6c 29 20  t case as well) 
09f0: 61 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  as..        #   
0a00: 20 20 20 20 74 68 65 20 74 65 73 74 20 79 65 61      the test yea
0a10: 72 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 75 73  r; otherwise, us
0a20: 65 20 22 32 30 30 38 22 20 62 79 20 64 65 66 61  e "2008" by defa
0a30: 75 6c 74 20 28 77 65 20 63 6f 75 6c 64 20 75 73  ult (we could us
0a40: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
0a50: 20 20 20 22 32 30 30 35 22 20 69 6e 20 74 68 61     "2005" in tha
0a60: 74 20 63 61 73 65 20 61 73 20 77 65 6c 6c 29 2e  t case as well).
0a70: 20 20 49 66 20 61 6e 6f 74 68 65 72 20 6d 61 6a    If another maj
0a80: 6f 72 20 5b 69 6e 63 6f 6d 70 61 74 69 62 6c 65  or [incompatible
0a90: 5d 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ]..        #    
0aa0: 20 20 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68     version of th
0ab0: 65 20 43 4c 52 20 69 73 20 72 65 6c 65 61 73 65  e CLR is release
0ac0: 64 2c 20 74 68 69 73 20 63 68 65 63 6b 20 77 69  d, this check wi
0ad0: 6c 6c 20 68 61 76 65 20 74 6f 20 62 65 0d 0a 20  ll have to be.. 
0ae0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
0af0: 68 61 6e 67 65 64 2e 20 20 54 68 65 20 64 65 66  hanged.  The def
0b00: 61 75 6c 74 20 74 65 73 74 20 79 65 61 72 20 74  ault test year t
0b10: 6f 20 75 73 65 20 66 6f 72 20 61 20 70 61 72 74  o use for a part
0b20: 69 63 75 6c 61 72 20 43 4c 52 0d 0a 20 20 20 20  icular CLR..    
0b30: 20 20 20 20 23 20 20 20 20 20 20 20 76 65 72 73      #       vers
0b40: 69 6f 6e 20 6d 61 79 20 62 65 20 6f 76 65 72 72  ion may be overr
0b50: 69 64 64 65 6e 20 62 79 20 73 65 74 74 69 6e 67  idden by setting
0b60: 20 74 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 69   the global vari
0b70: 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20  able..        # 
0b80: 20 20 20 20 20 20 22 74 65 73 74 5f 79 65 61 72        "test_year
0b90: 5f 63 6c 72 5f 76 24 58 22 2c 20 77 68 65 72 65  _clr_v$X", where
0ba0: 20 22 24 58 22 20 6d 61 79 20 5b 63 75 72 72 65   "$X" may [curre
0bb0: 6e 74 6c 79 5d 20 62 65 20 65 69 74 68 65 72 20  ntly] be either 
0bc0: 22 32 22 0d 0a 20 20 20 20 20 20 20 20 23 20 20  "2"..        #  
0bd0: 20 20 20 20 20 6f 72 20 22 34 22 2e 0d 0a 20 20       or "4"...  
0be0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
0bf0: 20 69 66 20 7b 5b 68 61 76 65 43 6f 6e 73 74 72   if {[haveConstr
0c00: 61 69 6e 74 20 69 6d 61 67 65 52 75 6e 74 69 6d  aint imageRuntim
0c10: 65 34 30 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e40]} then {..  
0c20: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66          if {[inf
0c30: 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f  o exists ::test_
0c40: 79 65 61 72 5f 63 6c 72 5f 76 34 5d 20 26 26 20  year_clr_v4] && 
0c50: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
0c60: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
0c70: 24 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c 72  $::test_year_clr
0c80: 5f 76 34 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  _v4] > 0} then {
0c90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
0ca0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
0cb0: 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65  OTE: Use the spe
0cc0: 63 69 66 69 65 64 20 74 65 73 74 20 79 65 61 72  cified test year
0cd0: 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76 34 2e   for the CLR v4.
0ce0: 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  0...            
0cf0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  #..            r
0d00: 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 79 65  eturn $::test_ye
0d10: 61 72 5f 63 6c 72 5f 76 34 0d 0a 20 20 20 20 20  ar_clr_v4..     
0d20: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
0d30: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
0d40: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
0d50: 3a 20 55 73 65 20 74 68 65 20 64 65 66 61 75 6c  : Use the defaul
0d60: 74 20 74 65 73 74 20 79 65 61 72 20 66 6f 72 20  t test year for 
0d70: 74 68 65 20 43 4c 52 20 76 34 2e 30 2e 0d 0a 20  the CLR v4.0... 
0d80: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
0d90: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
0da0: 20 32 30 31 30 3b 20 23 20 54 4f 44 4f 3a 20 47   2010; # TODO: G
0db0: 6f 6f 64 20 22 66 61 6c 6c 62 61 63 6b 22 20 64  ood "fallback" d
0dc0: 65 66 61 75 6c 74 3f 0d 0a 20 20 20 20 20 20 20  efault?..       
0dd0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
0de0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
0df0: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
0e00: 74 73 20 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63  ts ::test_year_c
0e10: 6c 72 5f 76 32 5d 20 26 26 20 5c 0d 0a 20 20 20  lr_v2] && \..   
0e20: 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69             [stri
0e30: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73  ng length $::tes
0e40: 74 5f 79 65 61 72 5f 63 6c 72 5f 76 32 5d 20 3e  t_year_clr_v2] >
0e50: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
0e60: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
0e70: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55         # NOTE: U
0e80: 73 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64  se the specified
0e90: 20 74 65 73 74 20 79 65 61 72 20 66 6f 72 20 74   test year for t
0ea0: 68 65 20 43 4c 52 20 76 32 2e 30 2e 0d 0a 20 20  he CLR v2.0...  
0eb0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
0ec0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
0ed0: 24 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c 72  $::test_year_clr
0ee0: 5f 76 32 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  _v2..          }
0ef0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
0f00: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
0f10: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
0f20: 74 68 65 20 64 65 66 61 75 6c 74 20 74 65 73 74  the default test
0f30: 20 79 65 61 72 20 66 6f 72 20 74 68 65 20 43 4c   year for the CL
0f40: 52 20 76 32 2e 30 2e 0d 0a 20 20 20 20 20 20 20  R v2.0...       
0f50: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
0f60: 20 20 20 20 72 65 74 75 72 6e 20 32 30 30 38 3b      return 2008;
0f70: 20 23 20 54 4f 44 4f 3a 20 47 6f 6f 64 20 22 66   # TODO: Good "f
0f80: 61 6c 6c 62 61 63 6b 22 20 64 65 66 61 75 6c 74  allback" default
0f90: 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ?..          }..
0fa0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
0fb0: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
0fc0: 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 59    proc getBuildY
0fd0: 65 61 72 73 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  ears {} {..     
0fe0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
0ff0: 3a 20 53 65 65 20 69 66 20 74 68 65 20 6c 69 73  : See if the lis
1000: 74 20 6f 66 20 74 65 73 74 20 79 65 61 72 73 20  t of test years 
1010: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64  has been overrid
1020: 64 65 6e 20 62 79 20 74 68 65 20 75 73 65 72 0d  den by the user.
1030: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 28  .      #       (
1040: 65 2e 67 2e 20 6f 6e 20 74 68 65 20 63 6f 6d 6d  e.g. on the comm
1050: 61 6e 64 20 6c 69 6e 65 29 2e 0d 0a 20 20 20 20  and line)...    
1060: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
1070: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65  info exists ::te
1080: 73 74 5f 79 65 61 72 73 5d 20 26 26 20 5b 6c 6c  st_years] && [ll
1090: 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 79 65  ength $::test_ye
10a0: 61 72 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ars] > 0} then {
10b0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
10c0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65       # NOTE: Use
10d0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c   the specified l
10e0: 69 73 74 20 6f 66 20 74 65 73 74 20 79 65 61 72  ist of test year
10f0: 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  s...        #.. 
1100: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
1110: 3a 74 65 73 74 5f 79 65 61 72 73 0d 0a 20 20 20  :test_years..   
1120: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1130: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1140: 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20  # NOTE: Use the 
1150: 64 65 66 61 75 6c 74 20 6c 69 73 74 20 6f 66 20  default list of 
1160: 74 65 73 74 20 79 65 61 72 73 2e 0d 0a 20 20 20  test years...   
1170: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1180: 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 32 30 30  return [list 200
1190: 35 20 32 30 30 38 20 32 30 31 30 20 32 30 31 32  5 2008 2010 2012
11a0: 20 32 30 31 33 5d 0d 0a 20 20 20 20 20 20 7d 0d   2013]..      }.
11b0: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
11c0: 72 6f 63 20 67 65 74 42 75 69 6c 64 50 6c 61 74  roc getBuildPlat
11d0: 66 6f 72 6d 20 7b 20 6e 61 74 69 76 65 20 7d 20  form { native } 
11e0: 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  {..      if {[in
11f0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74  fo exists ::test
1200: 5f 70 6c 61 74 66 6f 72 6d 5d 20 26 26 20 5c 0d  _platform] && \.
1210: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
1220: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73  ng length $::tes
1230: 74 5f 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d  t_platform] > 0}
1240: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1250: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1260: 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63  TE: Use the spec
1270: 69 66 69 65 64 20 74 65 73 74 20 70 6c 61 74 66  ified test platf
1280: 6f 72 6d 2e 20 20 49 66 20 74 68 69 73 20 76 61  orm.  If this va
1290: 72 69 61 62 6c 65 20 69 73 20 6e 6f 74 20 73 65  riable is not se
12a0: 74 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  t,..        #   
12b0: 20 20 20 20 74 68 65 20 64 65 66 61 75 6c 74 20      the default 
12c0: 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 20 62 61  value will be ba
12d0: 73 65 64 20 6f 6e 20 74 68 65 20 6d 61 63 68 69  sed on the machi
12e0: 6e 65 20 61 72 63 68 69 74 65 63 74 75 72 65 2e  ne architecture.
12f0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1300: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70       return [exp
1310: 72 20 7b 24 6e 61 74 69 76 65 20 3f 20 24 3a 3a  r {$native ? $::
1320: 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d 20 3a 20  test_platform : 
1330: 22 22 7d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  ""}]..      } el
1340: 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73  seif {[info exis
1350: 74 73 20 3a 3a 74 65 73 74 5f 6d 61 63 68 69 6e  ts ::test_machin
1360: 65 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  e] && \..       
1370: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
1380: 68 20 24 3a 3a 74 65 73 74 5f 6d 61 63 68 69 6e  h $::test_machin
1390: 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
13a0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
13b0: 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 6e     # NOTE: For n
13c0: 61 74 69 76 65 20 62 75 69 6c 64 73 2c 20 72 65  ative builds, re
13d0: 74 75 72 6e 20 74 68 65 20 70 6c 61 74 66 6f 72  turn the platfor
13e0: 6d 20 6e 61 6d 65 20 63 6f 72 72 65 73 70 6f 6e  m name correspon
13f0: 64 69 6e 67 20 74 6f 0d 0a 20 20 20 20 20 20 20  ding to..       
1400: 20 23 20 20 20 20 20 20 20 74 68 65 20 74 65 73   #       the tes
1410: 74 20 6d 61 63 68 69 6e 65 20 61 72 63 68 69 74  t machine archit
1420: 65 63 74 75 72 65 3b 20 6f 74 68 65 72 77 69 73  ecture; otherwis
1430: 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70  e, return an emp
1440: 74 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ty..        #   
1450: 20 20 20 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20      string...   
1460: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1470: 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 24 6e  return [expr {$n
1480: 61 74 69 76 65 20 3f 20 5b 6d 61 63 68 69 6e 65  ative ? [machine
1490: 54 6f 50 6c 61 74 66 6f 72 6d 20 24 3a 3a 74 65  ToPlatform $::te
14a0: 73 74 5f 6d 61 63 68 69 6e 65 5d 20 3a 20 22 22  st_machine] : ""
14b0: 7d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  }]..      } else
14c0: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
14d0: 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28   ::tcl_platform(
14e0: 6d 61 63 68 69 6e 65 29 5d 7d 20 74 68 65 6e 20  machine)]} then 
14f0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
1500: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f        # NOTE: Fo
1510: 72 20 6e 61 74 69 76 65 20 62 75 69 6c 64 73 2c  r native builds,
1520: 20 72 65 74 75 72 6e 20 74 68 65 20 70 6c 61 74   return the plat
1530: 66 6f 72 6d 20 6e 61 6d 65 20 63 6f 72 72 65 73  form name corres
1540: 70 6f 6e 64 69 6e 67 20 74 6f 0d 0a 20 20 20 20  ponding to..    
1550: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
1560: 6d 61 63 68 69 6e 65 20 61 72 63 68 69 74 65 63  machine architec
1570: 74 75 72 65 3b 20 6f 74 68 65 72 77 69 73 65 2c  ture; otherwise,
1580: 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79   return an empty
1590: 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20   string...      
15a0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
15b0: 75 72 6e 20 5b 65 78 70 72 20 7b 24 6e 61 74 69  urn [expr {$nati
15c0: 76 65 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ve ? \..        
15d0: 20 20 20 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c      [machineToPl
15e0: 61 74 66 6f 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c  atform $::tcl_pl
15f0: 61 74 66 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d  atform(machine)]
1600: 20 3a 20 22 22 7d 5d 0d 0a 20 20 20 20 20 20 7d   : ""}]..      }
1610: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1620: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1630: 54 45 3a 20 4e 6f 20 6d 61 63 68 69 6e 65 20 61  TE: No machine a
1640: 72 63 68 69 74 65 63 74 75 72 65 20 69 73 20 61  rchitecture is a
1650: 76 61 69 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e  vailable, return
1660: 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   an empty string
1670: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1680: 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d        return "".
1690: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
16a0: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
16b0: 42 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69  BuildConfigurati
16c0: 6f 6e 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  on {} {..      #
16d0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
16e0: 53 65 65 20 69 66 20 74 68 65 20 22 63 6f 6e 66  See if the "conf
16f0: 69 67 75 72 61 74 69 6f 6e 22 20 73 65 74 74 69  iguration" setti
1700: 6e 67 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  ng has been over
1710: 72 69 64 64 65 6e 20 62 79 20 74 68 65 0d 0a 20  ridden by the.. 
1720: 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73 65       #       use
1730: 72 20 28 65 2e 67 2e 20 6f 6e 20 74 68 65 20 63  r (e.g. on the c
1740: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 20 20 54  ommand line).  T
1750: 68 69 73 20 68 65 6c 70 73 20 63 6f 6e 74 72 6f  his helps contro
1760: 6c 20 65 78 61 63 74 6c 79 0d 0a 20 20 20 20 20  l exactly..     
1770: 20 23 20 20 20 20 20 20 20 77 68 69 63 68 20 73   #       which s
1780: 65 74 20 6f 66 20 62 69 6e 61 72 69 65 73 20 77  et of binaries w
1790: 65 20 61 72 65 20 74 65 73 74 69 6e 67 20 28 69  e are testing (i
17a0: 2e 65 2e 20 74 68 6f 73 65 20 62 75 69 6c 74 20  .e. those built 
17b0: 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  in the..      # 
17c0: 20 20 20 20 20 20 22 44 65 62 75 67 22 20 6f 72        "Debug" or
17d0: 20 22 52 65 6c 65 61 73 65 22 20 62 75 69 6c 64   "Release" build
17e0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 29   configurations)
17f0: 2e 20 20 54 6f 20 6f 76 65 72 72 69 64 65 20 74  .  To override t
1800: 68 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20  his..      #    
1810: 20 20 20 76 61 6c 75 65 20 76 69 61 20 74 68 65     value via the
1820: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2c 20 65   command line, e
1830: 6e 74 65 72 20 61 20 63 6f 6d 6d 61 6e 64 20 73  nter a command s
1840: 69 6d 69 6c 61 72 20 74 6f 20 6f 6e 65 20 6f 66  imilar to one of
1850: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1860: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 28 61  the following (a
1870: 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65 29 3a  ll on one line):
1880: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1890: 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68   #       EagleSh
18a0: 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74  ell.exe -anyInit
18b0: 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65 73 74  ialize "set test
18c0: 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 44  _configuration D
18d0: 65 62 75 67 22 0d 0a 20 20 20 20 20 20 23 20 20  ebug"..      #  
18e0: 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70         -file .\p
18f0: 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65  ath\to\all.eagle
1900: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1910: 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68   #       EagleSh
1920: 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74  ell.exe -anyInit
1930: 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65 73 74  ialize "set test
1940: 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 52  _configuration R
1950: 65 6c 65 61 73 65 22 0d 0a 20 20 20 20 20 20 23  elease"..      #
1960: 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e           -file .
1970: 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67  \path\to\all.eag
1980: 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  le..      #..   
1990: 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65     #       Eagle
19a0: 53 68 65 6c 6c 2e 65 78 65 20 2d 66 69 6c 65 20  Shell.exe -file 
19b0: 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61  .\path\to\all.ea
19c0: 67 6c 65 20 2d 70 72 65 54 65 73 74 0d 0a 20 20  gle -preTest..  
19d0: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 22 75      #         "u
19e0: 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e  nset -nocomplain
19f0: 20 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74   test_configurat
1a00: 69 6f 6e 22 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ion"..      #.. 
1a10: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
1a20: 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 63 6f 6e  xists ::test_con
1a30: 66 69 67 75 72 61 74 69 6f 6e 5d 20 26 26 20 5c  figuration] && \
1a40: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
1a50: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65  ing length $::te
1a60: 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  st_configuration
1a70: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
1a80: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1a90: 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68    # NOTE: Use th
1aa0: 65 20 73 70 65 63 69 66 69 65 64 20 74 65 73 74  e specified test
1ab0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20   configuration. 
1ac0: 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   The default val
1ad0: 75 65 20 75 73 65 64 0d 0a 20 20 20 20 20 20 20  ue used..       
1ae0: 20 23 20 20 20 20 20 20 20 66 6f 72 20 74 68 69   #       for thi
1af0: 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 74 79  s variable is ty
1b00: 70 69 63 61 6c 6c 79 20 22 52 65 6c 65 61 73 65  pically "Release
1b10: 22 2c 20 61 73 20 73 65 74 20 62 79 20 74 68 65  ", as set by the
1b20: 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20 23   test..        #
1b30: 20 20 20 20 20 20 20 73 75 69 74 65 20 69 74 73         suite its
1b40: 65 6c 66 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  elf...        #.
1b50: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1b60: 24 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72  $::test_configur
1b70: 61 74 69 6f 6e 0d 0a 20 20 20 20 20 20 7d 20 65  ation..      } e
1b80: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
1b90: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1ba0: 3a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 77 65 20 77  : Normally, we w
1bb0: 69 6c 6c 20 6e 65 76 65 72 20 68 69 74 20 74 68  ill never hit th
1bc0: 69 73 20 63 61 73 65 20 62 65 63 61 75 73 65 20  is case because 
1bd0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
1be0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1bf0: 20 20 74 65 73 74 20 63 6f 6e 66 69 67 75 72 61    test configura
1c00: 74 69 6f 6e 20 76 61 72 69 61 62 6c 65 20 69 73  tion variable is
1c10: 20 61 6c 77 61 79 73 20 73 65 74 20 62 79 20 74   always set by t
1c20: 68 65 20 74 65 73 74 20 73 75 69 74 65 0d 0a 20  he test suite.. 
1c30: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69         #       i
1c40: 74 73 65 6c 66 3b 20 68 6f 77 65 76 65 72 2c 20  tself; however, 
1c50: 69 74 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69  it can be overri
1c60: 64 64 65 6e 20 75 73 69 6e 67 20 74 68 65 20 75  dden using the u
1c70: 6e 73 65 74 20 63 6f 6d 6d 61 6e 64 0d 0a 20 20  nset command..  
1c80: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66 72        #       fr
1c90: 6f 6d 20 74 68 65 20 2d 70 72 65 54 65 73 74 20  om the -preTest 
1ca0: 6f 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 74 65  option to the te
1cb0: 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20  st suite...     
1cc0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
1cd0: 74 75 72 6e 20 24 3a 3a 65 61 67 6c 65 5f 70 6c  turn $::eagle_pl
1ce0: 61 74 66 6f 72 6d 28 63 6f 6e 66 69 67 75 72 61  atform(configura
1cf0: 74 69 6f 6e 29 0d 0a 20 20 20 20 20 20 7d 0d 0a  tion)..      }..
1d00: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
1d10: 6f 63 20 67 65 74 42 75 69 6c 64 43 6f 6e 66 69  oc getBuildConfi
1d20: 67 75 72 61 74 69 6f 6e 73 20 7b 7d 20 7b 0d 0a  gurations {} {..
1d30: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
1d40: 20 4e 4f 54 45 3a 20 53 65 65 20 69 66 20 74 68   NOTE: See if th
1d50: 65 20 6c 69 73 74 20 6f 66 20 74 65 73 74 20 63  e list of test c
1d60: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 68 61  onfigurations ha
1d70: 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65  s been overridde
1d80: 6e 20 62 79 0d 0a 20 20 20 20 20 20 23 20 20 20  n by..      #   
1d90: 20 20 20 20 74 68 65 20 75 73 65 72 20 28 65 2e      the user (e.
1da0: 67 2e 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e  g. on the comman
1db0: 64 20 6c 69 6e 65 29 2e 0d 0a 20 20 20 20 20 20  d line)...      
1dc0: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
1dd0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74  fo exists ::test
1de0: 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 5d  _configurations]
1df0: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
1e00: 20 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73   [llength $::tes
1e10: 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  t_configurations
1e20: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
1e30: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1e40: 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68    # NOTE: Use th
1e50: 65 20 73 70 65 63 69 66 69 65 64 20 6c 69 73 74  e specified list
1e60: 20 6f 66 20 74 65 73 74 20 63 6f 6e 66 69 67 75   of test configu
1e70: 72 61 74 69 6f 6e 73 2e 0d 0a 20 20 20 20 20 20  rations...      
1e80: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
1e90: 75 72 6e 20 24 3a 3a 74 65 73 74 5f 63 6f 6e 66  urn $::test_conf
1ea0: 69 67 75 72 61 74 69 6f 6e 73 0d 0a 20 20 20 20  igurations..    
1eb0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1ec0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1ed0: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 64   NOTE: Use the d
1ee0: 65 66 61 75 6c 74 20 6c 69 73 74 20 6f 66 20 74  efault list of t
1ef0: 65 73 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  est configuratio
1f00: 6e 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ns...        #..
1f10: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
1f20: 6c 69 73 74 20 44 65 62 75 67 20 52 65 6c 65 61  list Debug Relea
1f30: 73 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  se]..      }..  
1f40: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
1f50: 20 67 65 74 42 75 69 6c 64 42 61 73 65 44 69 72   getBuildBaseDir
1f60: 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20  ectory {} {..   
1f70: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
1f80: 54 45 3a 20 46 69 67 75 72 65 20 6f 75 74 20 74  TE: Figure out t
1f90: 68 65 20 62 61 73 65 20 64 69 72 65 63 74 6f 72  he base director
1fa0: 79 20 77 68 65 72 65 20 61 6c 6c 20 74 68 65 20  y where all the 
1fb0: 62 75 69 6c 64 73 20 73 68 6f 75 6c 64 20 62 65  builds should be
1fc0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1fd0: 6c 6f 63 61 74 65 64 2e 20 20 54 68 69 73 20 77  located.  This w
1fe0: 69 6c 6c 20 62 65 20 74 68 65 20 64 69 72 65 63  ill be the direc
1ff0: 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69  tory that contai
2000: 6e 73 20 74 68 65 20 61 63 74 75 61 6c 0d 0a 20  ns the actual.. 
2010: 20 20 20 20 20 23 20 20 20 20 20 20 20 62 75 69       #       bui
2020: 6c 64 20 6f 75 74 70 75 74 20 64 69 72 65 63 74  ld output direct
2030: 6f 72 79 20 28 65 2e 67 2e 20 70 61 72 65 6e 74  ory (e.g. parent
2040: 20 6f 66 20 22 62 69 6e 22 29 2e 0d 0a 20 20 20   of "bin")...   
2050: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
2060: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 62  [info exists ::b
2070: 75 69 6c 64 5f 62 61 73 65 5f 64 69 72 65 63 74  uild_base_direct
2080: 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ory] && \..     
2090: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
20a0: 67 74 68 20 24 3a 3a 62 75 69 6c 64 5f 62 61 73  gth $::build_bas
20b0: 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30  e_directory] > 0
20c0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
20d0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
20e0: 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f  OTE: The locatio
20f0: 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 64 20 62  n of the build b
2100: 61 73 65 20 64 69 72 65 63 74 6f 72 79 20 68 61  ase directory ha
2110: 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65  s been overridde
2120: 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  n;..        #   
2130: 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75      therefore, u
2140: 73 65 20 69 74 20 76 65 72 62 61 74 69 6d 2e 0d  se it verbatim..
2150: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
2160: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 62 75      return $::bu
2170: 69 6c 64 5f 62 61 73 65 5f 64 69 72 65 63 74 6f  ild_base_directo
2180: 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ry..      } else
2190: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
21a0: 20 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74   ::common_direct
21b0: 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ory] && \..     
21c0: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
21d0: 67 74 68 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69  gth $::common_di
21e0: 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68  rectory] > 0} th
21f0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
2200: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
2210: 20 4e 65 78 74 2c 20 66 61 6c 6c 62 61 63 6b 20   Next, fallback 
2220: 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 64 69  to the parent di
2230: 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20 6f  rectory of the o
2240: 6e 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0d 0a 20  ne containing.. 
2250: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
2260: 68 69 73 20 66 69 6c 65 20 28 69 2e 65 2e 20 22  his file (i.e. "
2270: 63 6f 6d 6d 6f 6e 2e 65 61 67 6c 65 22 29 2c 20  common.eagle"), 
2280: 69 66 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20  if available... 
2290: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
22a0: 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 64    return [file d
22b0: 69 72 6e 61 6d 65 20 24 3a 3a 63 6f 6d 6d 6f 6e  irname $::common
22c0: 5f 64 69 72 65 63 74 6f 72 79 5d 0d 0a 20 20 20  _directory]..   
22d0: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e     } elseif {[in
22e0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 70 61 74 68  fo exists ::path
22f0: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
2300: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
2310: 20 24 3a 3a 70 61 74 68 5d 20 3e 20 30 7d 20 74   $::path] > 0} t
2320: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
2330: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
2340: 3a 20 46 69 6e 61 6c 6c 79 2c 20 66 61 6c 6c 62  : Finally, fallb
2350: 61 63 6b 20 74 6f 20 74 68 65 20 70 61 72 65 6e  ack to the paren
2360: 74 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74  t directory of t
2370: 68 65 20 45 61 67 6c 65 54 65 73 74 0d 0a 20 20  he EagleTest..  
2380: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 61        #       pa
2390: 74 68 2e 20 20 54 68 65 20 45 61 67 6c 65 54 65  th.  The EagleTe
23a0: 73 74 20 70 61 63 6b 61 67 65 20 67 75 61 72 61  st package guara
23b0: 6e 74 65 65 73 20 74 68 61 74 20 74 68 69 73 20  ntees that this 
23c0: 76 61 72 69 61 62 6c 65 0d 0a 20 20 20 20 20 20  variable..      
23d0: 20 20 23 20 20 20 20 20 20 20 77 69 6c 6c 20 62    #       will b
23e0: 65 20 73 65 74 20 74 6f 20 74 68 65 20 64 69 72  e set to the dir
23f0: 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e  ectory containin
2400: 67 20 74 68 65 20 66 69 72 73 74 20 66 69 6c 65  g the first file
2410: 20 74 6f 0d 0a 20 20 20 20 20 20 20 20 23 20 20   to..        #  
2420: 20 20 20 20 20 65 78 65 63 75 74 65 20 74 68 65       execute the
2430: 20 5b 72 75 6e 54 65 73 74 50 72 6f 6c 6f 67 75   [runTestPrologu
2440: 65 5d 20 73 63 72 69 70 74 20 6c 69 62 72 61 72  e] script librar
2450: 79 20 70 72 6f 63 65 64 75 72 65 2e 0d 0a 20 20  y procedure...  
2460: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2470: 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 64 69   return [file di
2480: 72 6e 61 6d 65 20 24 3a 3a 70 61 74 68 5d 0d 0a  rname $::path]..
2490: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
24a0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
24b0: 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 20 70 61     # NOTE: No pa
24c0: 74 68 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  th is available,
24d0: 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79   return an empty
24e0: 20 73 74 72 69 6e 67 2e 20 20 54 68 69 73 20 70   string.  This p
24f0: 6f 69 6e 74 0d 0a 20 20 20 20 20 20 20 20 23 20  oint..        # 
2500: 20 20 20 20 20 20 73 68 6f 75 6c 64 20 6e 6f 74        should not
2510: 20 62 65 20 72 65 61 63 68 65 64 2e 0d 0a 20 20   be reached...  
2520: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2530: 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20   return ""..    
2540: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
2550: 20 20 20 70 72 6f 63 20 69 73 4d 69 78 65 64 4d     proc isMixedM
2560: 6f 64 65 41 73 73 65 6d 62 6c 79 20 7b 20 66 69  odeAssembly { fi
2570: 6c 65 4e 61 6d 65 20 7b 76 61 72 4e 61 6d 65 20  leName {varName 
2580: 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ""} } {..      #
2590: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
25a0: 46 69 72 73 74 2c 20 6d 61 6b 65 20 73 75 72 65  First, make sure
25b0: 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20   the test suite 
25c0: 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 69  infrastructure i
25d0: 73 20 61 6c 6c 6f 77 65 64 20 74 6f 0d 0a 20 20  s allowed to..  
25e0: 20 20 20 20 23 20 20 20 20 20 20 20 75 73 65 20      #       use 
25f0: 74 68 65 20 5b 65 78 65 63 5d 20 63 6f 6d 6d 61  the [exec] comma
2600: 6e 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  nd...      #..  
2610: 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
2620: 78 69 73 74 73 20 3a 3a 6e 6f 28 65 78 65 63 29  xists ::no(exec)
2630: 5d 20 26 26 20 21 5b 69 6e 66 6f 20 65 78 69 73  ] && ![info exis
2640: 74 73 20 3a 3a 6e 6f 28 63 6f 72 46 6c 61 67 73  ts ::no(corFlags
2650: 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
2660: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
2670: 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 6c 6f   NOTE: If the lo
2680: 63 61 74 69 6f 6e 20 6f 66 20 43 6f 72 46 6c 61  cation of CorFla
2690: 67 73 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e  gs is present in
26a0: 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74   the environment
26b0: 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ,..        #    
26c0: 20 20 20 75 73 65 20 69 74 3b 20 6f 74 68 65 72     use it; other
26d0: 77 69 73 65 20 61 73 73 75 6d 65 20 69 74 20 69  wise assume it i
26e0: 73 20 69 6e 20 74 68 65 20 50 41 54 48 2e 0d 0a  s in the PATH...
26f0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2700: 20 20 20 73 65 74 20 63 6f 72 46 6c 61 67 73 20     set corFlags 
2710: 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20 20 20 20  [expr {..       
2720: 20 20 20 5b 69 6e 66 6f 20 65 78 69 73 74 73 20     [info exists 
2730: 3a 3a 65 6e 76 28 43 6f 72 46 6c 61 67 73 29 5d  ::env(CorFlags)]
2740: 20 3f 20 24 3a 3a 65 6e 76 28 43 6f 72 46 6c 61   ? $::env(CorFla
2750: 67 73 29 20 3a 20 22 43 6f 72 46 6c 61 67 73 22  gs) : "CorFlags"
2760: 0d 0a 20 20 20 20 20 20 20 20 7d 5d 0d 0a 0d 0a  ..        }]....
2770: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2780: 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
2790: 70 74 20 74 6f 20 65 78 65 63 75 74 65 20 43 6f  pt to execute Co
27a0: 72 46 6c 61 67 73 20 6f 6e 20 74 68 65 20 73 70  rFlags on the sp
27b0: 65 63 69 66 69 65 64 20 66 69 6c 65 2e 0d 0a 20  ecified file... 
27c0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
27d0: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
27e0: 20 20 20 20 20 20 20 20 20 20 65 78 65 63 20 2d            exec -
27f0: 2d 20 24 63 6f 72 46 6c 61 67 73 20 5b 66 69 6c  - $corFlags [fil
2800: 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 24 66 69  e nativename $fi
2810: 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20  leName]..       
2820: 20 7d 20 65 78 65 63 5d 20 3d 3d 20 30 7d 20 74   } exec] == 0} t
2830: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2840: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
2850: 4e 4f 54 45 3a 20 49 66 20 72 65 71 75 65 73 74  NOTE: If request
2860: 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72  ed by our caller
2870: 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 64 65 74  , attempt to det
2880: 65 72 6d 69 6e 65 20 74 68 65 0d 0a 20 20 20 20  ermine the..    
2890: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 6c        #       pl
28a0: 61 74 66 6f 72 6d 20 66 6f 72 20 74 68 65 20 73  atform for the s
28b0: 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 61 73  pecified file as
28c0: 20 77 65 6c 6c 2e 0d 0a 20 20 20 20 20 20 20 20   well...        
28d0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69    #..          i
28e0: 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
28f0: 68 20 24 76 61 72 4e 61 6d 65 5d 20 3e 20 30 7d  h $varName] > 0}
2900: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2910: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2920: 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 74 6f 72      # NOTE: Stor
2930: 65 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 20 69  e the platform i
2940: 6e 20 74 68 65 20 6e 61 6d 65 64 20 76 61 72 69  n the named vari
2950: 61 62 6c 65 20 69 6e 20 74 68 65 0d 0a 20 20 20  able in the..   
2960: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
2970: 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 20   context of our 
2980: 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 20  caller...       
2990: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
29a0: 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72      upvar 1 $var
29b0: 4e 61 6d 65 20 70 6c 61 74 66 6f 72 6d 0d 0a 0d  Name platform...
29c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
29e0: 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 65  TE: Attempt to e
29f0: 78 74 72 61 63 74 20 74 68 65 20 50 45 20 6c 69  xtract the PE li
2a00: 6e 65 20 66 72 6f 6d 20 74 68 65 20 63 61 70 74  ne from the capt
2a10: 75 72 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20  ured..          
2a20: 20 20 23 20 20 20 20 20 20 20 6f 75 74 70 75 74    #       output
2a30: 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65  .  If this value
2a40: 20 69 73 20 22 50 45 33 32 22 20 6f 72 20 22 50   is "PE32" or "P
2a50: 45 33 32 2b 22 2c 20 74 68 65 0d 0a 20 20 20 20  E32+", the..    
2a60: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2a70: 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 20 69 73  assembly file is
2a80: 20 33 32 2d 62 69 74 20 6f 72 20 36 34 2d 62 69   32-bit or 64-bi
2a90: 74 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 3b  t, respectively;
2aa0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
2ab0: 20 20 20 20 20 20 6f 74 68 65 72 77 69 73 65 2c        otherwise,
2ac0: 20 69 74 73 20 74 79 70 65 20 69 73 20 75 6e 6b   its type is unk
2ad0: 6e 6f 77 6e 2e 0d 0a 20 20 20 20 20 20 20 20 20  nown...         
2ae0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
2af0: 20 20 73 65 74 20 70 61 74 74 65 72 6e 20 7b 5e    set pattern {^
2b00: 50 45 20 20 20 20 20 20 20 20 3a 20 28 50 45 33  PE        : (PE3
2b10: 32 7c 50 45 33 32 5c 2b 29 5c 73 2b 24 7d 0d 0a  2|PE32\+)\s+$}..
2b20: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
2b30: 20 7b 5b 72 65 67 65 78 70 20 2d 6c 69 6e 65 20   {[regexp -line 
2b40: 2d 2d 20 24 70 61 74 74 65 72 6e 20 24 65 78 65  -- $pattern $exe
2b50: 63 20 64 75 6d 6d 79 20 70 65 33 32 5d 7d 20 74  c dummy pe32]} t
2b60: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2b70: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2b80: 20 20 20 20 20 20 23 20 48 41 43 4b 3a 20 54 68        # HACK: Th
2b90: 69 73 20 5b 73 77 69 74 63 68 5d 20 61 73 73 75  is [switch] assu
2ba0: 6d 65 73 20 74 68 61 74 20 33 32 2d 62 69 74 20  mes that 32-bit 
2bb0: 65 78 65 63 75 74 61 62 6c 65 73 20 61 72 65 0d  executables are.
2bc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
2bd0: 20 20 20 20 20 20 20 61 6c 77 61 79 73 20 78 38         always x8
2be0: 36 20 61 6e 64 20 74 68 61 74 20 36 34 2d 62 69  6 and that 64-bi
2bf0: 74 20 65 78 65 63 75 74 61 62 6c 65 73 20 61 72  t executables ar
2c00: 65 20 61 6c 77 61 79 73 0d 0a 20 20 20 20 20 20  e always..      
2c10: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2c20: 78 36 34 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  x64...          
2c30: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
2c40: 20 20 20 20 20 73 77 69 74 63 68 20 2d 65 78 61       switch -exa
2c50: 63 74 20 2d 2d 20 24 70 65 33 32 20 7b 0d 0a 20  ct -- $pe32 {.. 
2c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
2c70: 45 33 32 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  E32 {..         
2c80: 20 20 20 20 20 20 20 20 20 73 65 74 20 70 6c 61           set pla
2c90: 74 66 6f 72 6d 20 57 69 6e 33 32 0d 0a 20 20 20  tform Win32..   
2ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
2cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc0: 50 45 33 32 2b 20 7b 0d 0a 20 20 20 20 20 20 20  PE32+ {..       
2cd0: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 70             set p
2ce0: 6c 61 74 66 6f 72 6d 20 78 36 34 0d 0a 20 20 20  latform x64..   
2cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
2d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d10: 64 65 66 61 75 6c 74 20 7b 0d 0a 20 20 20 20 20  default {..     
2d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
2d30: 20 70 6c 61 74 66 6f 72 6d 20 22 22 0d 0a 20 20   platform ""..  
2d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
2d50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
2d60: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ..            } 
2d70: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
2d80: 20 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f        set platfo
2d90: 72 6d 20 22 22 0d 0a 20 20 20 20 20 20 20 20 20  rm ""..         
2da0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
2db0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23  }....          #
2dc0: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
2dd0: 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 65  TE: Attempt to e
2de0: 78 74 72 61 63 74 20 74 68 65 20 49 4c 4f 4e 4c  xtract the ILONL
2df0: 59 20 6c 69 6e 65 20 66 72 6f 6d 20 74 68 65 20  Y line from the 
2e00: 63 61 70 74 75 72 65 64 0d 0a 20 20 20 20 20 20  captured..      
2e10: 20 20 20 20 23 20 20 20 20 20 20 20 6f 75 74 70      #       outp
2e20: 75 74 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c  ut.  If this val
2e30: 75 65 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 20  ue is zero, the 
2e40: 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 6d  specified file m
2e50: 75 73 74 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ust..          #
2e60: 20 20 20 20 20 20 20 62 65 20 61 20 6d 69 78 65         be a mixe
2e70: 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 3b  d-mode assembly;
2e80: 20 6f 74 68 65 72 77 69 73 65 2c 20 69 74 20 63   otherwise, it c
2e90: 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 0d 0a 20 20  ontains only..  
2ea0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2eb0: 6d 61 6e 61 67 65 64 20 63 6f 6d 70 6f 6e 65 6e  managed componen
2ec0: 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ts...          #
2ed0: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
2ee0: 70 61 74 74 65 72 6e 20 7b 5e 49 4c 4f 4e 4c 59  pattern {^ILONLY
2ef0: 20 20 20 20 3a 20 28 30 7c 31 29 5c 73 2b 24 7d      : (0|1)\s+$}
2f00: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
2f10: 20 7b 21 5b 72 65 67 65 78 70 20 2d 6c 69 6e 65   {![regexp -line
2f20: 20 2d 2d 20 24 70 61 74 74 65 72 6e 20 24 65 78   -- $pattern $ex
2f30: 65 63 20 64 75 6d 6d 79 20 69 6c 4f 6e 6c 79 5d  ec dummy ilOnly]
2f40: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2f50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
2f60: 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  se..          }.
2f70: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
2f80: 7b 21 24 69 6c 4f 6e 6c 79 7d 20 74 68 65 6e 20  {!$ilOnly} then 
2f90: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  {..            r
2fa0: 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20  eturn true..    
2fb0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
2fc0: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
2fd0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
2fe0: 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 74 65 73  NOTE: If the tes
2ff0: 74 20 73 75 69 74 65 20 63 61 6e 6e 6f 74 20 75  t suite cannot u
3000: 73 65 20 5b 65 78 65 63 5d 20 6f 72 20 65 78 65  se [exec] or exe
3010: 63 75 74 69 6f 6e 20 6f 66 20 43 6f 72 46 6c 61  cution of CorFla
3020: 67 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  gs..      #     
3030: 20 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e    failed, return
3040: 20 66 61 6c 73 65 2e 0d 0a 20 20 20 20 20 20 23   false...      #
3050: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 66  ..      return f
3060: 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  alse..    }.....
3070: 20 20 20 20 70 72 6f 63 20 69 73 42 75 69 6c 64      proc isBuild
3080: 41 76 61 69 6c 61 62 6c 65 20 7b 20 6e 61 74 69  Available { nati
3090: 76 65 20 64 69 72 65 63 74 6f 72 79 20 7b 76 61  ve directory {va
30a0: 72 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20  rName ""} } {.. 
30b0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
30c0: 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20  NOTE: Build the 
30d0: 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20  fully qualified 
30e0: 66 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 74 68  file name for th
30f0: 65 20 70 72 69 6d 61 72 79 20 61 73 73 65 6d 62  e primary assemb
3100: 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ly..      #     
3110: 20 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65    containing the
3120: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
3130: 69 74 65 20 6d 61 6e 61 67 65 64 20 63 6f 6d 70  ite managed comp
3140: 6f 6e 65 6e 74 73 2e 20 20 49 74 0d 0a 20 20 20  onents.  It..   
3150: 20 20 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c     #       shoul
3160: 64 20 62 65 20 6e 6f 74 65 64 20 74 68 61 74 20  d be noted that 
3170: 74 68 69 73 20 61 73 73 65 6d 62 6c 79 20 66 69  this assembly fi
3180: 6c 65 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74  le may also cont
3190: 61 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23  ain the..      #
31a0: 20 20 20 20 20 20 20 6e 61 74 69 76 65 20 63 6f         native co
31b0: 6d 70 6f 6e 65 6e 74 73 2c 20 69 66 20 61 20 6e  mponents, if a n
31c0: 61 74 69 76 65 20 62 75 69 6c 64 20 69 73 20 69  ative build is i
31d0: 6e 20 75 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d  n use...      #.
31e0: 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e  .      set fileN
31f0: 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ame [file native
3200: 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
3210: 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20  $directory \..  
3220: 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
3230: 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d 5d  ata.SQLite.dll]]
3240: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b  ....      if {![
3250: 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c  file exists $fil
3260: 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
3270: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
3280: 61 6c 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  alse..      }...
3290: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
32a0: 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
32b0: 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  to automatically
32c0: 20 64 65 74 65 63 74 20 69 66 20 74 68 65 20 70   detect if the p
32d0: 72 69 6d 61 72 79 20 61 73 73 65 6d 62 6c 79 0d  rimary assembly.
32e0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
32f0: 6f 6e 74 61 69 6e 73 20 61 6e 79 20 6e 61 74 69  ontains any nati
3300: 76 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 2c 20 69  ve components, i
3310: 66 20 6e 65 63 65 73 73 61 72 79 2e 0d 0a 20 20  f necessary...  
3320: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
3330: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
3340: 24 6e 61 74 69 76 65 5d 20 3d 3d 20 30 7d 20 74  $native] == 0} t
3350: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
3360: 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
3370: 68 20 24 76 61 72 4e 61 6d 65 5d 20 3e 20 30 7d  h $varName] > 0}
3380: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
3390: 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e     upvar 1 $varN
33a0: 61 6d 65 20 24 76 61 72 4e 61 6d 65 0d 0a 20 20  ame $varName..  
33b0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
33c0: 20 20 20 73 65 74 20 6e 61 74 69 76 65 20 5b 69     set native [i
33d0: 73 4d 69 78 65 64 4d 6f 64 65 41 73 73 65 6d 62  sMixedModeAssemb
33e0: 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 24 76 61  ly $fileName $va
33f0: 72 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 0d  rName]..      }.
3400: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
3410: 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65    # NOTE: If the
3420: 20 70 72 69 6d 61 72 79 20 61 73 73 65 6d 62 6c   primary assembl
3430: 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20  y also contains 
3440: 74 68 65 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f  the native compo
3450: 6e 65 6e 74 73 2c 0d 0a 20 20 20 20 20 20 23 20  nents,..      # 
3460: 20 20 20 20 20 20 77 65 20 68 61 76 65 20 65 76        we have ev
3470: 65 72 79 74 68 69 6e 67 20 77 65 20 6e 65 65 64  erything we need
3480: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
3490: 20 20 69 66 20 7b 24 6e 61 74 69 76 65 7d 20 74    if {$native} t
34a0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
34b0: 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20  eturn true..    
34c0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
34d0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75        # NOTE: Bu
34e0: 69 6c 64 20 74 68 65 20 66 75 6c 6c 79 20 71 75  ild the fully qu
34f0: 61 6c 69 66 69 65 64 20 66 69 6c 65 20 6e 61 6d  alified file nam
3500: 65 20 66 6f 72 20 74 68 65 20 69 6e 74 65 72 6f  e for the intero
3510: 70 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20 20  p assembly..    
3520: 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74 61 69    #       contai
3530: 6e 69 6e 67 20 74 68 65 20 53 79 73 74 65 6d 2e  ning the System.
3540: 44 61 74 61 2e 53 51 4c 69 74 65 20 6e 61 74 69  Data.SQLite nati
3550: 76 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e 20 20  ve components.  
3560: 49 66 20 74 68 69 73 0d 0a 20 20 20 20 20 20 23  If this..      #
3570: 20 20 20 20 20 20 20 66 69 6c 65 20 65 78 69 73         file exis
3580: 74 73 2c 20 77 65 20 73 68 6f 75 6c 64 20 68 61  ts, we should ha
3590: 76 65 20 65 76 65 72 79 74 68 69 6e 67 20 77 65  ve everything we
35a0: 20 6e 65 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d   need...      #.
35b0: 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e  .      set fileN
35c0: 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ame [file native
35d0: 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
35e0: 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20  $directory \..  
35f0: 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 2e 49          SQLite.I
3600: 6e 74 65 72 6f 70 2e 64 6c 6c 5d 5d 0d 0a 0d 0a  nterop.dll]]....
3610: 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20        if {[file 
3620: 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65  exists $fileName
3630: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
3640: 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a     return true..
3650: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
3660: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
3670: 3a 20 42 75 69 6c 64 20 74 68 65 20 66 75 6c 6c  : Build the full
3680: 79 20 71 75 61 6c 69 66 69 65 64 20 66 69 6c 65  y qualified file
3690: 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 53 51   name for the SQ
36a0: 4c 69 74 65 20 63 6f 72 65 0d 0a 20 20 20 20 20  Lite core..     
36b0: 20 23 20 20 20 20 20 20 20 6c 69 62 72 61 72 79   #       library
36c0: 2e 20 20 49 66 20 74 68 69 73 20 66 69 6c 65 20  .  If this file 
36d0: 65 78 69 73 74 73 2c 20 77 65 20 73 68 6f 75 6c  exists, we shoul
36e0: 64 20 68 61 76 65 20 65 76 65 72 79 74 68 69 6e  d have everythin
36f0: 67 20 77 65 0d 0a 20 20 20 20 20 20 23 20 20 20  g we..      #   
3700: 20 20 20 20 6e 65 65 64 2e 0d 0a 20 20 20 20 20      need...     
3710: 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69   #..      set fi
3720: 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74  leName [file nat
3730: 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
3740: 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d  in $directory \.
3750: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
3760: 65 33 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20 20  e3.dll]]....    
3770: 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73    if {[file exis
3780: 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74  ts $fileName]} t
3790: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
37a0: 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20  eturn true..    
37b0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
37c0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4f 6e        # NOTE: On
37d0: 65 20 6f 72 20 6d 6f 72 65 20 6e 61 74 69 76 65  e or more native
37e0: 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 6e 65 65 64   components need
37f0: 65 64 20 62 79 20 53 79 73 74 65 6d 2e 44 61 74  ed by System.Dat
3800: 61 2e 53 51 4c 69 74 65 0d 0a 20 20 20 20 20 20  a.SQLite..      
3810: 23 20 20 20 20 20 20 20 61 72 65 20 6d 69 73 73  #       are miss
3820: 69 6e 67 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ing...      #.. 
3830: 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73       return fals
3840: 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  e..    }.....   
3850: 20 70 72 6f 63 20 69 73 52 65 6c 65 61 73 65 41   proc isReleaseA
3860: 76 61 69 6c 61 62 6c 65 20 7b 20 64 69 72 65 63  vailable { direc
3870: 74 6f 72 79 20 7b 76 61 72 4e 61 6d 65 20 22 22  tory {varName ""
3880: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20  } } {..      if 
3890: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
38a0: 24 76 61 72 4e 61 6d 65 5d 20 3e 20 30 7d 20 74  $varName] > 0} t
38b0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 75  hen {..        u
38c0: 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20  pvar 1 $varName 
38d0: 24 76 61 72 4e 61 6d 65 0d 0a 20 20 20 20 20 20  $varName..      
38e0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
38f0: 6e 20 5b 69 73 42 75 69 6c 64 41 76 61 69 6c 61  n [isBuildAvaila
3900: 62 6c 65 20 22 22 20 24 64 69 72 65 63 74 6f 72  ble "" $director
3910: 79 20 24 76 61 72 4e 61 6d 65 5d 0d 0a 20 20 20  y $varName]..   
3920: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
3930: 6a 6f 69 6e 42 75 69 6c 64 44 69 72 65 63 74 6f  joinBuildDirecto
3940: 72 79 20 7b 20 6e 61 74 69 76 65 20 70 61 74 68  ry { native path
3950: 20 79 65 61 72 20 70 6c 61 74 66 6f 72 6d 20 63   year platform c
3960: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 7d 20 7b  onfiguration } {
3970: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
3980: 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20   # NOTE: Figure 
3990: 6f 75 74 20 61 6e 64 20 74 68 65 6e 20 72 65 74  out and then ret
39a0: 75 72 6e 20 74 68 65 20 66 75 6c 6c 79 20 71 75  urn the fully qu
39b0: 61 6c 69 66 69 65 64 20 70 61 74 68 20 74 6f 20  alified path to 
39c0: 74 68 65 20 62 75 69 6c 64 0d 0a 20 20 20 20 20  the build..     
39d0: 20 23 20 20 20 20 20 20 20 64 69 72 65 63 74 6f   #       directo
39e0: 72 79 20 62 61 73 65 64 20 6f 6e 20 61 6c 6c 20  ry based on all 
39f0: 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 70 72  the arguments pr
3a00: 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20 63 61  ovided by our ca
3a10: 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ller...      #..
3a20: 20 20 20 20 20 20 69 66 20 7b 24 6e 61 74 69 76        if {$nativ
3a30: 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
3a40: 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20     return [file 
3a50: 6a 6f 69 6e 20 24 70 61 74 68 20 62 69 6e 20 24  join $path bin $
3a60: 79 65 61 72 20 24 70 6c 61 74 66 6f 72 6d 20 24  year $platform $
3a70: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a  configuration]..
3a80: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
3a90: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
3aa0: 66 69 6c 65 20 6a 6f 69 6e 20 24 70 61 74 68 20  file join $path 
3ab0: 62 69 6e 20 24 79 65 61 72 20 24 63 6f 6e 66 69  bin $year $confi
3ac0: 67 75 72 61 74 69 6f 6e 20 62 69 6e 5d 0d 0a 20  guration bin].. 
3ad0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
3ae0: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 75  ..    proc getBu
3af0: 69 6c 64 44 69 72 65 63 74 6f 72 79 20 7b 7d 20  ildDirectory {} 
3b00: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
3b10: 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66    # NOTE: See if
3b20: 20 74 68 65 20 22 6e 61 74 69 76 65 22 20 72 75   the "native" ru
3b30: 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 20 68 61 73  ntime option has
3b40: 20 62 65 65 6e 20 73 65 74 2e 20 20 49 66 20 73   been set.  If s
3b50: 6f 2c 20 75 73 65 20 74 68 65 0d 0a 20 20 20 20  o, use the..    
3b60: 20 20 23 20 20 20 20 20 20 20 64 69 72 65 63 74    #       direct
3b70: 6f 72 79 20 66 6f 72 20 74 68 65 20 6d 69 78 65  ory for the mixe
3b80: 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20  d-mode assembly 
3b90: 28 61 2e 6b 2e 61 2e 20 74 68 65 20 6e 61 74 69  (a.k.a. the nati
3ba0: 76 65 20 69 6e 74 65 72 6f 70 0d 0a 20 20 20 20  ve interop..    
3bb0: 20 20 23 20 20 20 20 20 20 20 61 73 73 65 6d 62    #       assemb
3bc0: 6c 79 29 2e 20 20 54 6f 20 65 6e 61 62 6c 65 20  ly).  To enable 
3bd0: 74 68 69 73 20 6f 70 74 69 6f 6e 20 76 69 61 20  this option via 
3be0: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
3bf0: 2c 20 65 6e 74 65 72 20 61 0d 0a 20 20 20 20 20  , enter a..     
3c00: 20 23 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64   #       command
3c10: 20 73 69 6d 69 6c 61 72 20 74 6f 20 6f 6e 65 20   similar to one 
3c20: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
3c30: 20 28 61 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e   (all on one lin
3c40: 65 29 3a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  e):..      #..  
3c50: 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c      #       Eagl
3c60: 65 53 68 65 6c 6c 2e 65 78 65 20 2d 69 6e 69 74  eShell.exe -init
3c70: 69 61 6c 69 7a 65 20 2d 72 75 6e 74 69 6d 65 4f  ialize -runtimeO
3c80: 70 74 69 6f 6e 20 6e 61 74 69 76 65 0d 0a 20 20  ption native..  
3c90: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 2d 66      #         -f
3ca0: 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c  ile .\path\to\al
3cb0: 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23  l.eagle..      #
3cc0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
3cd0: 54 6f 20 65 6e 61 62 6c 65 20 74 68 69 73 20 6f  To enable this o
3ce0: 70 74 69 6f 6e 20 76 69 61 20 74 68 65 20 63 6f  ption via the co
3cf0: 6d 6d 61 6e 64 20 6c 69 6e 65 20 70 72 69 6f 72  mmand line prior
3d00: 20 74 6f 20 74 68 65 20 22 62 65 74 61 20 31 36   to the "beta 16
3d10: 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  "..      #      
3d20: 20 72 65 6c 65 61 73 65 20 6f 66 20 45 61 67 6c   release of Eagl
3d30: 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e, the following
3d40: 20 63 6f 6d 6d 61 6e 64 20 6d 75 73 74 20 62 65   command must be
3d50: 20 75 73 65 64 20 69 6e 73 74 65 61 64 0d 0a 20   used instead.. 
3d60: 20 20 20 20 20 23 20 20 20 20 20 20 20 28 61 6c       #       (al
3d70: 73 6f 20 61 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69  so all on one li
3d80: 6e 65 29 3a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ne):..      #.. 
3d90: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
3da0: 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 69 6e 69  leShell.exe -ini
3db0: 74 69 61 6c 69 7a 65 20 2d 70 6f 73 74 49 6e 69  tialize -postIni
3dc0: 74 69 61 6c 69 7a 65 0d 0a 20 20 20 20 20 20 23  tialize..      #
3dd0: 20 20 20 20 20 20 20 20 20 22 6f 62 6a 65 63 74           "object
3de0: 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72 65   invoke Interpre
3df0: 74 65 72 2e 47 65 74 41 63 74 69 76 65 20 41 64  ter.GetActive Ad
3e00: 64 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e  dRuntimeOption n
3e10: 61 74 69 76 65 22 0d 0a 20 20 20 20 20 20 23 20  ative"..      # 
3e20: 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c          -file .\
3e30: 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c  path\to\all.eagl
3e40: 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  e..      #..    
3e50: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
3e60: 74 73 20 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63  ts ::build_direc
3e70: 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20  tory] && \..    
3e80: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
3e90: 6e 67 74 68 20 24 3a 3a 62 75 69 6c 64 5f 64 69  ngth $::build_di
3ea0: 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68  rectory] > 0} th
3eb0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
3ec0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
3ed0: 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   The location of
3ee0: 20 74 68 65 20 62 75 69 6c 64 20 64 69 72 65 63   the build direc
3ef0: 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76  tory has been ov
3f00: 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20  erridden;..     
3f10: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 72 65     #       there
3f20: 66 6f 72 65 2c 20 75 73 65 20 69 74 20 76 65 72  fore, use it ver
3f30: 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20  batim...        
3f40: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
3f50: 6e 20 24 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63  n $::build_direc
3f60: 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c  tory..      } el
3f70: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
3f80: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
3f90: 20 49 66 20 74 68 65 20 22 6e 61 74 69 76 65 22   If the "native"
3fa0: 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 20   runtime option 
3fb0: 69 73 20 73 65 74 2c 20 74 68 65 20 6d 69 78 65  is set, the mixe
3fc0: 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 0d  d-mode assembly.
3fd0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
3fe0: 20 69 73 20 62 65 69 6e 67 20 74 65 73 74 65 64   is being tested
3ff0: 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  .  In that case,
4000: 20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68 65   the path to the
4010: 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79   build directory
4020: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
4030: 20 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 74    will contain t
4040: 68 65 20 70 6c 61 74 66 6f 72 6d 20 6e 61 6d 65  he platform name
4050: 20 61 6e 64 20 61 6c 6c 20 74 68 65 20 62 69 6e   and all the bin
4060: 61 72 69 65 73 20 75 6e 64 65 72 20 74 65 73 74  aries under test
4070: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
4080: 20 20 73 68 6f 75 6c 64 20 62 65 20 70 72 65 73    should be pres
4090: 65 6e 74 20 69 6e 20 74 68 61 74 20 64 69 72 65  ent in that dire
40a0: 63 74 6f 72 79 2e 20 20 49 66 20 74 68 65 20 22  ctory.  If the "
40b0: 6e 61 74 69 76 65 22 20 72 75 6e 74 69 6d 65 0d  native" runtime.
40c0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
40d0: 20 6f 70 74 69 6f 6e 20 69 73 20 6e 6f 74 20 73   option is not s
40e0: 65 74 2c 20 74 68 65 20 62 75 69 6c 64 20 64 69  et, the build di
40f0: 72 65 63 74 6f 72 79 20 77 69 6c 6c 20 62 65 20  rectory will be 
4100: 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
4110: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
4120: 20 20 22 70 6c 61 74 66 6f 72 6d 2d 6e 65 75 74    "platform-neut
4130: 72 61 6c 22 2c 20 77 69 74 68 20 74 68 65 20 6e  ral", with the n
4140: 6f 74 61 62 6c 65 20 65 78 63 65 70 74 69 6f 6e  otable exception
4150: 20 6f 66 20 61 6e 79 20 6e 61 74 69 76 65 0d 0a   of any native..
4160: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
4170: 61 73 73 65 6d 62 6c 79 20 28 65 2e 67 2e 20 22  assembly (e.g. "
4180: 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64  SQLite.Interop.d
4190: 6c 6c 22 29 20 63 6f 70 69 65 64 20 74 68 65 72  ll") copied ther
41a0: 65 20 64 75 72 69 6e 67 20 74 68 65 0d 0a 20 20  e during the..  
41b0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 75        #       bu
41c0: 69 6c 64 20 70 72 6f 63 65 73 73 20 69 74 73 65  ild process itse
41d0: 6c 66 2e 20 20 49 66 20 74 68 65 20 62 75 69 6c  lf.  If the buil
41e0: 64 20 70 72 6f 63 65 73 73 20 73 6f 6d 65 68 6f  d process someho
41f0: 77 20 64 6f 65 73 20 6e 6f 74 0d 0a 20 20 20 20  w does not..    
4200: 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 70 79      #       copy
4210: 20 74 68 65 20 6e 61 74 69 76 65 20 61 73 73 65   the native asse
4220: 6d 62 6c 79 20 66 6f 72 20 74 68 69 73 20 70 6c  mbly for this pl
4230: 61 74 66 6f 72 6d 2c 20 6d 6f 73 74 20 6f 66 20  atform, most of 
4240: 74 68 65 20 74 65 73 74 73 0d 0a 20 20 20 20 20  the tests..     
4250: 20 20 20 23 20 20 20 20 20 20 20 69 6e 20 74 68     #       in th
4260: 65 20 73 75 69 74 65 20 77 69 6c 6c 20 73 69 6d  e suite will sim
4270: 70 6c 79 20 62 65 20 73 6b 69 70 70 65 64 2e 20  ply be skipped. 
4280: 20 47 65 6e 65 72 61 6c 6c 79 20 73 70 65 61 6b   Generally speak
4290: 69 6e 67 2c 20 74 68 65 72 65 0d 0a 20 20 20 20  ing, there..    
42a0: 20 20 20 20 23 20 20 20 20 20 20 20 61 72 65 20      #       are 
42b0: 74 77 6f 20 77 61 79 73 20 74 6f 20 62 75 69 6c  two ways to buil
42c0: 64 20 74 68 65 20 62 69 6e 61 72 69 65 73 20 77  d the binaries w
42d0: 68 65 6e 20 70 72 65 70 61 72 69 6e 67 20 74 6f  hen preparing to
42e0: 20 72 75 6e 20 74 68 65 0d 0a 20 20 20 20 20 20   run the..      
42f0: 20 20 23 20 20 20 20 20 20 20 74 65 73 74 20 73    #       test s
4300: 75 69 74 65 3a 0d 0a 20 20 20 20 20 20 20 20 23  uite:..        #
4310: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
4320: 20 20 31 2e 20 42 75 69 6c 64 20 74 68 65 20 73    1. Build the s
4330: 65 70 61 72 61 74 65 20 6d 61 6e 61 67 65 64 20  eparate managed 
4340: 61 6e 64 20 6e 61 74 69 76 65 20 61 73 73 65 6d  and native assem
4350: 62 6c 69 65 73 20 75 73 69 6e 67 20 73 6f 6d 65  blies using some
4360: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
4370: 20 20 20 20 20 63 6f 6d 6d 61 6e 64 73 20 73 69       commands si
4380: 6d 69 6c 61 72 20 74 6f 3a 0d 0a 20 20 20 20 20  milar to:..     
4390: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
43a0: 20 20 20 20 20 20 20 20 20 62 75 69 6c 64 2e 62           build.b
43b0: 61 74 20 24 7b 43 6f 6e 66 69 67 75 72 61 74 69  at ${Configurati
43c0: 6f 6e 7d 4d 61 6e 61 67 65 64 4f 6e 6c 79 20 24  on}ManagedOnly $
43d0: 7b 50 6c 61 74 66 6f 72 6d 7d 0d 0a 20 20 20 20  {Platform}..    
43e0: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 62      #          b
43f0: 75 69 6c 64 2e 62 61 74 20 24 7b 43 6f 6e 66 69  uild.bat ${Confi
4400: 67 75 72 61 74 69 6f 6e 7d 4e 61 74 69 76 65 4f  guration}NativeO
4410: 6e 6c 79 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 0d  nly ${Platform}.
4420: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
4430: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 57      #          W
4440: 68 65 72 65 20 24 7b 43 6f 6e 66 69 67 75 72 61  here ${Configura
4450: 74 69 6f 6e 7d 20 69 73 20 65 69 74 68 65 72 20  tion} is either 
4460: 22 44 65 62 75 67 22 20 6f 72 20 22 52 65 6c 65  "Debug" or "Rele
4470: 61 73 65 22 20 61 6e 64 0d 0a 20 20 20 20 20 20  ase" and..      
4480: 20 20 23 20 20 20 20 20 20 20 20 20 20 24 7b 50    #          ${P
4490: 6c 61 74 66 6f 72 6d 7d 20 69 73 20 65 69 74 68  latform} is eith
44a0: 65 72 20 22 57 69 6e 33 32 22 20 6f 72 20 22 78  er "Win32" or "x
44b0: 36 34 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  64"...        #.
44c0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
44d0: 20 32 2e 20 42 75 69 6c 64 20 74 68 65 20 6d 69   2. Build the mi
44e0: 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c  xed-mode assembl
44f0: 79 20 75 73 69 6e 67 20 61 20 63 6f 6d 6d 61 6e  y using a comman
4500: 64 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0d 0a 20  d similar to:.. 
4510: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4520: 20 20 23 20 20 20 20 20 20 20 20 20 20 62 75 69    #          bui
4530: 6c 64 2e 62 61 74 20 24 7b 43 6f 6e 66 69 67 75  ld.bat ${Configu
4540: 72 61 74 69 6f 6e 7d 20 24 7b 50 6c 61 74 66 6f  ration} ${Platfo
4550: 72 6d 7d 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  rm}..        #..
4560: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
4570: 20 20 20 57 68 65 72 65 20 24 7b 43 6f 6e 66 69     Where ${Confi
4580: 67 75 72 61 74 69 6f 6e 7d 20 69 73 20 65 69 74  guration} is eit
4590: 68 65 72 20 22 44 65 62 75 67 22 20 6f 72 20 22  her "Debug" or "
45a0: 52 65 6c 65 61 73 65 22 20 61 6e 64 0d 0a 20 20  Release" and..  
45b0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
45c0: 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 20 69 73 20   ${Platform} is 
45d0: 65 69 74 68 65 72 20 22 57 69 6e 33 32 22 20 6f  either "Win32" o
45e0: 72 20 22 78 36 34 22 2e 20 20 49 66 20 74 68 69  r "x64".  If thi
45f0: 73 20 63 6f 6d 6d 61 6e 64 20 69 73 0d 0a 20 20  s command is..  
4600: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
4610: 20 75 73 65 64 2c 20 76 61 72 69 6f 75 73 20 74   used, various t
4620: 65 73 74 73 20 74 68 61 74 20 72 65 71 75 69 72  ests that requir
4630: 65 20 73 75 70 70 6c 65 6d 65 6e 74 61 72 79 20  e supplementary 
4640: 6d 61 6e 61 67 65 64 0d 0a 20 20 20 20 20 20 20  managed..       
4650: 20 23 20 20 20 20 20 20 20 20 20 20 61 73 73 65   #          asse
4660: 6d 62 6c 69 65 73 20 28 65 2e 67 2e 20 4c 49 4e  mblies (e.g. LIN
4670: 51 29 20 6d 61 79 20 62 65 20 73 6b 69 70 70 65  Q) may be skippe
4680: 64 20 75 6e 6c 65 73 73 20 74 68 6f 73 65 20 62  d unless those b
4690: 69 6e 61 72 69 65 73 0d 0a 20 20 20 20 20 20 20  inaries..       
46a0: 20 23 20 20 20 20 20 20 20 20 20 20 61 72 65 20   #          are 
46b0: 73 75 62 73 65 71 75 65 6e 74 6c 79 20 63 6f 70  subsequently cop
46c0: 69 65 64 20 69 6e 74 6f 20 74 68 65 20 63 6f 72  ied into the cor
46d0: 72 65 63 74 20 64 69 72 65 63 74 6f 72 79 20 28  rect directory (
46e0: 69 2e 65 2e 20 62 79 0d 0a 20 20 20 20 20 20 20  i.e. by..       
46f0: 20 23 20 20 20 20 20 20 20 20 20 20 22 74 65 73   #          "tes
4700: 74 5f 61 6c 6c 2e 62 61 74 22 29 2e 0d 0a 20 20  t_all.bat")...  
4710: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
4720: 20 23 20 20 20 20 20 20 20 4e 6f 74 65 20 74 68   #       Note th
4730: 61 74 20 61 6c 6c 20 6f 66 20 74 68 65 20 62 75  at all of the bu
4740: 69 6c 64 20 63 6f 6d 6d 61 6e 64 73 20 61 62 6f  ild commands abo
4750: 76 65 20 77 69 6c 6c 20 64 65 66 61 75 6c 74 20  ve will default 
4760: 74 6f 20 75 73 69 6e 67 0d 0a 20 20 20 20 20 20  to using..      
4770: 20 20 23 20 20 20 20 20 20 20 74 68 65 20 6c 61    #       the la
4780: 74 65 73 74 20 76 65 72 73 69 6f 6e 20 6f 66 20  test version of 
4790: 4d 53 42 75 69 6c 64 20 61 76 61 69 6c 61 62 6c  MSBuild availabl
47a0: 65 20 61 6e 64 20 74 68 65 20 22 74 65 73 74 5f  e and the "test_
47b0: 79 65 61 72 22 20 6d 61 79 0d 0a 20 20 20 20 20  year" may..     
47c0: 20 20 20 23 20 20 20 20 20 20 20 6e 65 65 64 20     #       need 
47d0: 74 6f 20 62 65 20 61 64 6a 75 73 74 65 64 20 61  to be adjusted a
47e0: 63 63 6f 72 64 69 6e 67 6c 79 20 74 6f 20 61 63  ccordingly to ac
47f0: 74 75 61 6c 6c 79 20 72 75 6e 20 74 68 65 20 74  tually run the t
4800: 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20  est suite...    
4810: 20 20 20 20 23 20 20 20 20 20 20 20 52 65 66 65      #       Refe
4820: 72 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74  r to the comment
4830: 73 20 69 6e 20 5b 67 65 74 42 75 69 6c 64 59 65  s in [getBuildYe
4840: 61 72 5d 20 66 6f 72 20 6d 6f 72 65 20 69 6e 66  ar] for more inf
4850: 6f 72 6d 61 74 69 6f 6e 20 6f 6e 0d 0a 20 20 20  ormation on..   
4860: 20 20 20 20 20 23 20 20 20 20 20 20 20 68 6f 77       #       how
4870: 20 74 6f 20 73 65 74 20 74 68 69 73 20 76 61 72   to set this var
4880: 69 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  iable...        
4890: 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e  #..        set n
48a0: 61 74 69 76 65 20 5b 68 61 73 52 75 6e 74 69 6d  ative [hasRuntim
48b0: 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65 5d 0d  eOption native].
48c0: 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ...        retur
48d0: 6e 20 5b 6a 6f 69 6e 42 75 69 6c 64 44 69 72 65  n [joinBuildDire
48e0: 63 74 6f 72 79 20 24 6e 61 74 69 76 65 20 5b 67  ctory $native [g
48f0: 65 74 42 75 69 6c 64 42 61 73 65 44 69 72 65 63  etBuildBaseDirec
4900: 74 6f 72 79 5d 20 5c 0d 0a 20 20 20 20 20 20 20  tory] \..       
4910: 20 20 20 20 20 5b 67 65 74 42 75 69 6c 64 59 65       [getBuildYe
4920: 61 72 5d 20 5b 67 65 74 42 75 69 6c 64 50 6c 61  ar] [getBuildPla
4930: 74 66 6f 72 6d 20 24 6e 61 74 69 76 65 5d 20 5b  tform $native] [
4940: 67 65 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72  getBuildConfigur
4950: 61 74 69 6f 6e 5d 5d 0d 0a 20 20 20 20 20 20 7d  ation]]..      }
4960: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
4970: 70 72 6f 63 20 67 65 74 52 65 6c 65 61 73 65 56  proc getReleaseV
4980: 65 72 73 69 6f 6e 20 7b 7d 20 7b 0d 0a 20 20 20  ersion {} {..   
4990: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
49a0: 54 45 3a 20 46 69 67 75 72 65 20 6f 75 74 20 74  TE: Figure out t
49b0: 68 65 20 72 65 6c 65 61 73 65 20 76 65 72 73 69  he release versi
49c0: 6f 6e 20 66 6f 72 20 75 73 65 20 77 69 74 68 20  on for use with 
49d0: 74 68 65 20 62 75 69 6c 64 20 64 69 72 65 63 74  the build direct
49e0: 6f 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ory..      #    
49f0: 20 20 20 77 68 65 6e 20 63 68 65 63 6b 69 6e 67     when checking
4a00: 20 66 6f 72 20 61 76 61 69 6c 61 62 6c 65 20 72   for available r
4a10: 65 6c 65 61 73 65 73 2e 0d 0a 20 20 20 20 20 20  eleases...      
4a20: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
4a30: 66 6f 20 65 78 69 73 74 73 20 3a 3a 72 65 6c 65  fo exists ::rele
4a40: 61 73 65 5f 76 65 72 73 69 6f 6e 5d 20 26 26 20  ase_version] && 
4a50: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
4a60: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 72  ring length $::r
4a70: 65 6c 65 61 73 65 5f 76 65 72 73 69 6f 6e 5d 20  elease_version] 
4a80: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
4a90: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4aa0: 23 20 4e 4f 54 45 3a 20 54 68 65 20 72 65 6c 65  # NOTE: The rele
4ab0: 61 73 65 20 76 65 72 73 69 6f 6e 20 68 61 73 20  ase version has 
4ac0: 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b  been overridden;
4ad0: 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   therefore, use 
4ae0: 69 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  it..        #   
4af0: 20 20 20 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20      verbatim... 
4b00: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4b10: 20 20 72 65 74 75 72 6e 20 24 3a 3a 72 65 6c 65    return $::rele
4b20: 61 73 65 5f 76 65 72 73 69 6f 6e 0d 0a 20 20 20  ase_version..   
4b30: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
4b40: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4b50: 23 20 4e 4f 54 45 3a 20 4e 6f 20 72 65 6c 65 61  # NOTE: No relea
4b60: 73 65 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76  se version is av
4b70: 61 69 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e 20  ailable, return 
4b80: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e  an empty string.
4b90: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
4ba0: 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a       return ""..
4bb0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
4bc0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42  ...    proc getB
4bd0: 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 7b 20 66  uildFileName { f
4be0: 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72  ileName {platfor
4bf0: 6d 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  m ""} } {..     
4c00: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
4c10: 3a 20 52 65 74 75 72 6e 73 20 74 68 65 20 73 70  : Returns the sp
4c20: 65 63 69 66 69 65 64 20 66 69 6c 65 20 6e 61 6d  ecified file nam
4c30: 65 20 61 73 20 69 66 20 69 74 20 77 65 72 65 20  e as if it were 
4c40: 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65 0d 0a  located in the..
4c50: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 75        #       bu
4c60: 69 6c 64 20 64 69 72 65 63 74 6f 72 79 2c 20 64  ild directory, d
4c70: 69 73 63 61 72 64 69 6e 67 20 61 6e 79 20 64 69  iscarding any di
4c80: 72 65 63 74 6f 72 79 20 69 6e 66 6f 72 6d 61 74  rectory informat
4c90: 69 6f 6e 20 70 72 65 73 65 6e 74 0d 0a 20 20 20  ion present..   
4ca0: 20 20 20 23 20 20 20 20 20 20 20 69 6e 20 74 68     #       in th
4cb0: 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 70  e file name as p
4cc0: 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20 63  rovided by our c
4cd0: 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d  aller...      #.
4ce0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66  .      return [f
4cf0: 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c  ile nativename \
4d00: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c  ..          [fil
4d10: 65 20 6a 6f 69 6e 20 5b 67 65 74 42 75 69 6c 64  e join [getBuild
4d20: 44 69 72 65 63 74 6f 72 79 5d 20 24 70 6c 61 74  Directory] $plat
4d30: 66 6f 72 6d 20 5b 66 69 6c 65 20 74 61 69 6c 20  form [file tail 
4d40: 24 66 69 6c 65 4e 61 6d 65 5d 5d 5d 0d 0a 20 20  $fileName]]]..  
4d50: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
4d60: 20 67 65 74 42 69 6e 61 72 79 44 69 72 65 63 74   getBinaryDirect
4d70: 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  ory {} {..      
4d80: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
4d90: 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   This procedure 
4da0: 72 65 74 75 72 6e 73 20 74 68 65 20 64 69 72 65  returns the dire
4db0: 63 74 6f 72 79 20 77 68 65 72 65 20 74 68 65 20  ctory where the 
4dc0: 74 65 73 74 20 61 70 70 6c 69 63 61 74 69 6f 6e  test application
4dd0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
4de0: 69 74 73 65 6c 66 20 28 69 2e 65 2e 20 74 68 65  itself (i.e. the
4df0: 20 45 61 67 6c 65 20 73 68 65 6c 6c 29 20 69 73   Eagle shell) is
4e00: 20 6c 6f 63 61 74 65 64 2e 20 20 54 68 69 73 20   located.  This 
4e10: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 61 73 0d  will be used as.
4e20: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
4e30: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 66  he destination f
4e40: 6f 72 20 74 68 65 20 63 6f 70 69 65 64 20 53 79  or the copied Sy
4e50: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
4e60: 20 6e 61 74 69 76 65 20 61 6e 64 0d 0a 20 20 20   native and..   
4e70: 20 20 20 23 20 20 20 20 20 20 20 6d 61 6e 61 67     #       manag
4e80: 65 64 20 61 73 73 65 6d 62 6c 69 65 73 20 28 69  ed assemblies (i
4e90: 2e 65 2e 20 62 65 63 61 75 73 65 20 74 68 69 73  .e. because this
4ea0: 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 66   is one of the f
4eb0: 65 77 20 70 6c 61 63 65 73 0d 0a 20 20 20 20 20  ew places..     
4ec0: 20 23 20 20 20 20 20 20 20 77 68 65 72 65 20 74   #       where t
4ed0: 68 65 20 43 4c 52 20 77 69 6c 6c 20 61 63 74 75  he CLR will actu
4ee0: 61 6c 6c 79 20 66 69 6e 64 20 61 6e 64 20 6c 6f  ally find and lo
4ef0: 61 64 20 74 68 65 6d 20 70 72 6f 70 65 72 6c 79  ad them properly
4f00: 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  )...      #..   
4f10: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
4f20: 73 74 73 20 3a 3a 62 69 6e 61 72 79 5f 64 69 72  sts ::binary_dir
4f30: 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20  ectory] && \..  
4f40: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
4f50: 6c 65 6e 67 74 68 20 24 3a 3a 62 69 6e 61 72 79  length $::binary
4f60: 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d  _directory] > 0}
4f70: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
4f80: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
4f90: 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e  TE: The location
4fa0: 20 6f 66 20 74 68 65 20 62 69 6e 61 72 79 20 64   of the binary d
4fb0: 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
4fc0: 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20  n overridden;.. 
4fd0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
4fe0: 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
4ff0: 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20   verbatim...    
5000: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
5010: 65 74 75 72 6e 20 24 3a 3a 62 69 6e 61 72 79 5f  eturn $::binary_
5020: 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20  directory..     
5030: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
5040: 20 20 20 72 65 74 75 72 6e 20 5b 69 6e 66 6f 20     return [info 
5050: 62 69 6e 61 72 79 5d 0d 0a 20 20 20 20 20 20 7d  binary]..      }
5060: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
5070: 70 72 6f 63 20 67 65 74 42 69 6e 61 72 79 46 69  proc getBinaryFi
5080: 6c 65 4e 61 6d 65 20 7b 20 66 69 6c 65 4e 61 6d  leName { fileNam
5090: 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20  e {platform ""} 
50a0: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
50b0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75      # NOTE: Retu
50c0: 72 6e 73 20 74 68 65 20 73 70 65 63 69 66 69 65  rns the specifie
50d0: 64 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 69  d file name as i
50e0: 66 20 69 74 20 77 65 72 65 20 6c 6f 63 61 74 65  f it were locate
50f0: 64 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20  d in the..      
5100: 23 20 20 20 20 20 20 20 62 69 6e 61 72 79 20 64  #       binary d
5110: 69 72 65 63 74 6f 72 79 2c 20 64 69 73 63 61 72  irectory, discar
5120: 64 69 6e 67 20 61 6e 79 20 64 69 72 65 63 74 6f  ding any directo
5130: 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70  ry information p
5140: 72 65 73 65 6e 74 0d 0a 20 20 20 20 20 20 23 20  resent..      # 
5150: 20 20 20 20 20 20 69 6e 20 74 68 65 20 66 69 6c        in the fil
5160: 65 20 6e 61 6d 65 20 61 73 20 70 72 6f 76 69 64  e name as provid
5170: 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72  ed by our caller
5180: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
5190: 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e    return [file n
51a0: 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20  ativename \..   
51b0: 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69         [file joi
51c0: 6e 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65  n [getBinaryDire
51d0: 63 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d  ctory] $platform
51e0: 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c   [file tail $fil
51f0: 65 4e 61 6d 65 5d 5d 5d 0d 0a 20 20 20 20 7d 0d  eName]]]..    }.
5200: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
5210: 43 6f 72 65 42 69 6e 61 72 79 46 69 6c 65 4e 61  CoreBinaryFileNa
5220: 6d 65 20 7b 20 7b 70 6c 61 74 66 6f 72 6d 20 22  me { {platform "
5230: 22 7d 20 7b 73 74 61 6e 64 61 72 64 20 66 61 6c  "} {standard fal
5240: 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  se} } {..      #
5250: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
5260: 52 65 74 75 72 6e 73 20 74 68 65 20 66 75 6c 6c  Returns the full
5270: 20 70 61 74 68 20 66 6f 72 20 74 68 65 20 66 69   path for the fi
5280: 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
5290: 65 20 53 51 4c 69 74 65 20 63 6f 72 65 0d 0a 20  e SQLite core.. 
52a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 74       #       nat
52b0: 69 76 65 20 6c 69 62 72 61 72 79 20 63 6f 64 65  ive library code
52c0: 20 66 6f 72 20 74 68 69 73 20 70 6c 61 74 66 6f   for this platfo
52d0: 72 6d 2e 20 20 46 69 72 73 74 2c 20 63 68 65 63  rm.  First, chec
52e0: 6b 20 61 6e 64 20 73 65 65 20 69 66 0d 0a 20 20  k and see if..  
52f0: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
5300: 53 51 4c 69 74 65 20 63 6f 72 65 20 6e 61 74 69  SQLite core nati
5310: 76 65 20 6c 69 62 72 61 72 79 20 68 61 73 20 61  ve library has a
5320: 6c 72 65 61 64 79 20 62 65 65 6e 20 6c 6f 61 64  lready been load
5330: 65 64 2e 20 20 4e 65 78 74 2c 0d 0a 20 20 20 20  ed.  Next,..    
5340: 20 20 23 20 20 20 20 20 20 20 66 61 6c 6c 62 61    #       fallba
5350: 63 6b 20 74 6f 20 77 68 61 74 20 74 68 65 20 66  ck to what the f
5360: 75 6c 6c 20 70 61 74 68 20 73 68 6f 75 6c 64 20  ull path should 
5370: 62 65 2c 20 62 61 73 65 64 20 6f 6e 20 77 68 65  be, based on whe
5380: 74 68 65 72 20 74 68 65 0d 0a 20 20 20 20 20 20  ther the..      
5390: 23 20 20 20 20 20 20 20 6d 69 78 65 64 2d 6d 6f  #       mixed-mo
53a0: 64 65 20 61 73 73 65 6d 62 6c 79 20 69 73 20 62  de assembly is b
53b0: 65 69 6e 67 20 75 73 65 64 20 61 6e 64 20 74 68  eing used and th
53c0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 75  e name of the cu
53d0: 72 72 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20  rrent..      #  
53e0: 20 20 20 20 20 70 6c 61 74 66 6f 72 6d 2e 0d 0a       platform...
53f0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
5400: 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63  f {[catch {objec
5410: 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
5420: 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
5430: 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
5440: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55  em.Data.SQLite.U
5450: 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
5460: 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ds \..          
5470: 20 20 20 20 5f 53 51 4c 69 74 65 4e 61 74 69 76      _SQLiteNativ
5480: 65 4d 6f 64 75 6c 65 46 69 6c 65 4e 61 6d 65 7d  eModuleFileName}
5490: 20 66 69 6c 65 4e 61 6d 65 5d 20 3d 3d 20 30 20   fileName] == 0 
54a0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
54b0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
54c0: 66 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74  fileName] > 0} t
54d0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
54e0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
54f0: 3a 20 54 68 65 20 53 51 4c 69 74 65 20 63 6f 72  : The SQLite cor
5500: 65 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79  e native library
5510: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
5520: 6e 20 6c 6f 61 64 65 64 20 76 69 61 0d 0a 20 20  n loaded via..  
5530: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
5540: 65 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79  e native library
5550: 20 70 72 65 2d 6c 6f 61 64 65 72 2e 20 20 52 65   pre-loader.  Re
5560: 74 75 72 6e 20 74 68 61 74 20 66 69 6c 65 20 6e  turn that file n
5570: 61 6d 65 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  ame now...      
5580: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
5590: 75 72 6e 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20  urn $fileName.. 
55a0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
55b0: 69 66 20 7b 5b 68 61 73 52 75 6e 74 69 6d 65 4f  if {[hasRuntimeO
55c0: 70 74 69 6f 6e 20 6e 61 74 69 76 65 5d 7d 20 74  ption native]} t
55d0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
55e0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
55f0: 3a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 69 78  : Return the mix
5600: 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79  ed-mode assembly
5610: 20 66 69 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20 20   file name...   
5620: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
5630: 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74  return [file nat
5640: 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20  ivename \..     
5650: 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69         [file joi
5660: 6e 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65  n [getBinaryDire
5670: 63 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d  ctory] $platform
5680: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
5690: 69 74 65 2e 64 6c 6c 5d 5d 0d 0a 20 20 20 20 20  ite.dll]]..     
56a0: 20 7d 20 65 6c 73 65 69 66 20 7b 24 73 74 61 6e   } elseif {$stan
56b0: 64 61 72 64 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  dard} then {..  
56c0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
56d0: 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20   # NOTE: Return 
56e0: 74 68 65 20 6e 61 74 69 76 65 2d 6f 6e 6c 79 20  the native-only 
56f0: 73 74 61 6e 64 61 72 64 20 53 51 4c 69 74 65 20  standard SQLite 
5700: 6c 69 62 72 61 72 79 20 66 69 6c 65 20 6e 61 6d  library file nam
5710: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
5720: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66         return [f
5730: 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c  ile nativename \
5740: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
5750: 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e  ile join [getBin
5760: 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20 24 70  aryDirectory] $p
5770: 6c 61 74 66 6f 72 6d 20 73 71 6c 69 74 65 33 2e  latform sqlite3.
5780: 64 6c 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d 20 65  dll]]..      } e
5790: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
57a0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
57b0: 3a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 74  : Return the nat
57c0: 69 76 65 2d 6f 6e 6c 79 20 69 6e 74 65 72 6f 70  ive-only interop
57d0: 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 20 6e   assembly file n
57e0: 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ame...        #.
57f0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
5800: 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
5810: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
5820: 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42  [file join [getB
5830: 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20  inaryDirectory] 
5840: 24 70 6c 61 74 66 6f 72 6d 20 53 51 4c 69 74 65  $platform SQLite
5850: 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 5d 5d 0d 0a  .Interop.dll]]..
5860: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
5870: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 43  ...    proc getC
5880: 6f 6d 6d 6f 6e 44 69 72 65 63 74 6f 72 79 20 7b  ommonDirectory {
5890: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
58a0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73      # NOTE: This
58b0: 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72   procedure retur
58c0: 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ns the directory
58d0: 20 77 68 65 72 65 20 74 68 65 20 74 65 73 74 20   where the test 
58e0: 73 63 72 69 70 74 73 0d 0a 20 20 20 20 20 20 23  scripts..      #
58f0: 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65         should be
5900: 20 6c 6f 63 61 74 65 64 2e 20 20 42 79 20 64 65   located.  By de
5910: 66 61 75 6c 74 2c 20 74 68 69 73 20 6a 75 73 74  fault, this just
5920: 20 72 65 74 75 72 6e 73 20 74 68 65 20 45 61 67   returns the Eag
5930: 6c 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  le..      #     
5940: 20 20 62 69 6e 61 72 79 20 64 69 72 65 63 74 6f    binary directo
5950: 72 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ry...      #..  
5960: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
5970: 69 73 74 73 20 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69  ists ::common_di
5980: 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20  rectory] && \.. 
5990: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
59a0: 20 6c 65 6e 67 74 68 20 24 3a 3a 63 6f 6d 6d 6f   length $::commo
59b0: 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30  n_directory] > 0
59c0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
59d0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
59e0: 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f  OTE: The locatio
59f0: 6e 20 6f 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  n of the common 
5a00: 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
5a10: 65 6e 20 73 65 74 3b 0d 0a 20 20 20 20 20 20 20  en set;..       
5a20: 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f   #       therefo
5a30: 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20  re, use it...   
5a40: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
5a50: 72 65 74 75 72 6e 20 24 3a 3a 63 6f 6d 6d 6f 6e  return $::common
5a60: 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20  _directory..    
5a70: 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66    } elseif {[inf
5a80: 6f 20 65 78 69 73 74 73 20 3a 3a 76 65 6e 64 6f  o exists ::vendo
5a90: 72 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20  r_directory] && 
5aa0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
5ab0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 76  ring length $::v
5ac0: 65 6e 64 6f 72 5f 64 69 72 65 63 74 6f 72 79 5d  endor_directory]
5ad0: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
5ae0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
5af0: 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63   # NOTE: The loc
5b00: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 65 6e  ation of the ven
5b10: 64 6f 72 20 64 69 72 65 63 74 6f 72 79 20 68 61  dor directory ha
5b20: 73 20 62 65 65 6e 20 73 65 74 3b 0d 0a 20 20 20  s been set;..   
5b30: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
5b40: 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d  refore, use it..
5b50: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
5b60: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 76 65      return $::ve
5b70: 6e 64 6f 72 5f 64 69 72 65 63 74 6f 72 79 0d 0a  ndor_directory..
5b80: 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
5b90: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
5ba0: 63 6c 5f 6c 69 62 72 61 72 79 5d 20 26 26 20 5c  cl_library] && \
5bb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
5bc0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 63  ing length $::tc
5bd0: 6c 5f 6c 69 62 72 61 72 79 5d 20 3e 20 30 20 26  l_library] > 0 &
5be0: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
5bf0: 66 69 6c 65 20 69 73 64 69 72 65 63 74 6f 72 79  file isdirectory
5c00: 20 24 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79 5d   $::tcl_library]
5c10: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
5c20: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
5c30: 4f 54 45 3a 20 54 68 65 20 76 61 72 69 61 62 6c  OTE: The variabl
5c40: 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 61 74  e with the locat
5c50: 69 6f 6e 20 6f 66 20 74 68 65 20 73 63 72 69 70  ion of the scrip
5c60: 74 20 6c 69 62 72 61 72 79 20 69 73 0d 0a 20 20  t library is..  
5c70: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 65        #       se
5c80: 74 20 61 6e 64 20 61 70 70 65 61 72 73 20 74 6f  t and appears to
5c90: 20 62 65 20 61 20 72 65 61 6c 20 64 69 72 65 63   be a real direc
5ca0: 74 6f 72 79 20 28 69 2e 65 2e 20 6e 6f 74 20 65  tory (i.e. not e
5cb0: 6d 62 65 64 64 65 64 0d 0a 20 20 20 20 20 20 20  mbedded..       
5cc0: 20 23 20 20 20 20 20 20 20 77 69 74 68 69 6e 20   #       within 
5cd0: 61 20 66 69 6c 65 29 3b 20 74 68 65 72 65 66 6f  a file); therefo
5ce0: 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20  re, use it...   
5cf0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
5d00: 72 65 74 75 72 6e 20 24 3a 3a 74 63 6c 5f 6c 69  return $::tcl_li
5d10: 62 72 61 72 79 0d 0a 20 20 20 20 20 20 7d 20 65  brary..      } e
5d20: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
5d30: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
5d40: 3a 20 46 61 6c 6c 62 61 63 6b 20 74 6f 20 74 68  : Fallback to th
5d50: 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74  e directory cont
5d60: 61 69 6e 69 6e 67 20 74 68 65 20 65 78 65 63 75  aining the execu
5d70: 74 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  table...        
5d80: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
5d90: 6e 20 5b 69 6e 66 6f 20 62 69 6e 61 72 79 5d 0d  n [info binary].
5da0: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
5db0: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
5dc0: 44 61 74 61 62 61 73 65 44 69 72 65 63 74 6f 72  DatabaseDirector
5dd0: 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  y {} {..      #.
5de0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
5df0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65  his procedure re
5e00: 74 75 72 6e 73 20 74 68 65 20 64 69 72 65 63 74  turns the direct
5e10: 6f 72 79 20 77 68 65 72 65 20 74 68 65 20 74 65  ory where the te
5e20: 73 74 20 64 61 74 61 62 61 73 65 73 0d 0a 20 20  st databases..  
5e30: 20 20 20 20 23 20 20 20 20 20 20 20 73 68 6f 75      #       shou
5e40: 6c 64 20 62 65 20 6c 6f 63 61 74 65 64 2e 20 20  ld be located.  
5e50: 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69 73  By default, this
5e60: 20 6a 75 73 74 20 75 73 65 73 20 74 68 65 20 74   just uses the t
5e70: 65 6d 70 6f 72 61 72 79 0d 0a 20 20 20 20 20 20  emporary..      
5e80: 23 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72  #       director
5e90: 79 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72  y configured for
5ea0: 20 74 68 69 73 20 73 79 73 74 65 6d 2e 0d 0a 20   this system... 
5eb0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
5ec0: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
5ed0: 3a 64 61 74 61 62 61 73 65 5f 64 69 72 65 63 74  :database_direct
5ee0: 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ory] && \..     
5ef0: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
5f00: 67 74 68 20 24 3a 3a 64 61 74 61 62 61 73 65 5f  gth $::database_
5f10: 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20  directory] > 0} 
5f20: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
5f30: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
5f40: 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  E: The location 
5f50: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
5f60: 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
5f70: 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a  en overridden;..
5f80: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
5f90: 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  therefore, use i
5fa0: 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
5fb0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
5fc0: 3a 64 61 74 61 62 61 73 65 5f 64 69 72 65 63 74  :database_direct
5fd0: 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  ory..      } els
5fe0: 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74  eif {[info exist
5ff0: 73 20 3a 3a 73 63 72 61 74 63 68 5f 64 69 72 65  s ::scratch_dire
6000: 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20  ctory] && \..   
6010: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
6020: 65 6e 67 74 68 20 24 3a 3a 73 63 72 61 74 63 68  ength $::scratch
6030: 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d  _directory] > 0}
6040: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
6050: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
6060: 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e  TE: The location
6070: 20 6f 66 20 74 68 65 20 73 63 72 61 74 63 68 20   of the scratch 
6080: 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
6090: 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a  en overridden;..
60a0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
60b0: 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  therefore, use i
60c0: 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
60d0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
60e0: 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63 74 6f  :scratch_directo
60f0: 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ry..      } else
6100: 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
6110: 72 6e 20 5b 67 65 74 54 65 6d 70 6f 72 61 72 79  rn [getTemporary
6120: 50 61 74 68 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  Path]..      }..
6130: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
6140: 6f 63 20 67 65 74 54 65 6d 70 6f 72 61 72 79 44  oc getTemporaryD
6150: 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20  irectory {} {.. 
6160: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
6170: 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65  NOTE: This proce
6180: 64 75 72 65 20 72 65 74 75 72 6e 73 20 74 68 65  dure returns the
6190: 20 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65   directory where
61a0: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
61b0: 69 6c 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20  iles..      #   
61c0: 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 6c 6f      should be lo
61d0: 63 61 74 65 64 2e 20 20 42 79 20 64 65 66 61 75  cated.  By defau
61e0: 6c 74 2c 20 74 68 69 73 20 6a 75 73 74 20 75 73  lt, this just us
61f0: 65 73 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  es the temporary
6200: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
6210: 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 66 69 67  directory config
6220: 75 72 65 64 20 66 6f 72 20 74 68 69 73 20 73 79  ured for this sy
6230: 73 74 65 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  stem...      #..
6240: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
6250: 65 78 69 73 74 73 20 3a 3a 74 65 6d 70 6f 72 61  exists ::tempora
6260: 72 79 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26  ry_directory] &&
6270: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
6280: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
6290: 74 65 6d 70 6f 72 61 72 79 5f 64 69 72 65 63 74  temporary_direct
62a0: 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ory] > 0} then {
62b0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
62c0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
62d0: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
62e0: 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63   temporary direc
62f0: 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76  tory has been ov
6300: 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20  erridden;..     
6310: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 72 65     #       there
6320: 66 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20  fore, use it... 
6330: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
6340: 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 6d 70    return $::temp
6350: 6f 72 61 72 79 5f 64 69 72 65 63 74 6f 72 79 0d  orary_directory.
6360: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20  .      } elseif 
6370: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
6380: 73 63 72 61 74 63 68 5f 64 69 72 65 63 74 6f 72  scratch_director
6390: 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  y] && \..       
63a0: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
63b0: 68 20 24 3a 3a 73 63 72 61 74 63 68 5f 64 69 72  h $::scratch_dir
63c0: 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65  ectory] > 0} the
63d0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
63e0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
63f0: 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  The location of 
6400: 74 68 65 20 73 63 72 61 74 63 68 20 64 69 72 65  the scratch dire
6410: 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 6f  ctory has been o
6420: 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20  verridden;..    
6430: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 72      #       ther
6440: 65 66 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a  efore, use it...
6450: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
6460: 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 73 63 72     return $::scr
6470: 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79 0d 0a  atch_directory..
6480: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
6490: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
64a0: 67 65 74 54 65 6d 70 6f 72 61 72 79 50 61 74 68  getTemporaryPath
64b0: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
64c0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
64d0: 65 74 54 65 73 74 4f 76 65 72 72 69 64 65 73 50  etTestOverridesP
64e0: 72 65 61 6d 62 6c 65 20 7b 20 7b 65 78 74 72 61  reamble { {extra
64f0: 56 61 72 4e 61 6d 65 73 20 22 22 7d 20 7d 20 7b  VarNames ""} } {
6500: 0d 0a 20 20 20 20 20 20 73 65 74 20 76 61 72 4e  ..      set varN
6510: 61 6d 65 73 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20  ames [list].... 
6520: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
6530: 4e 4f 54 45 3a 20 49 66 20 61 76 61 69 6c 61 62  NOTE: If availab
6540: 6c 65 2c 20 73 74 61 72 74 20 77 69 74 68 20 74  le, start with t
6550: 68 65 20 6d 61 73 74 65 72 20 6c 69 73 74 20 6f  he master list o
6560: 66 20 74 65 73 74 20 6f 76 65 72 72 69 64 65 0d  f test override.
6570: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76  .      #       v
6580: 61 72 69 61 62 6c 65 73 2e 0d 0a 20 20 20 20 20  ariables...     
6590: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
65a0: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73  nfo exists ::tes
65b0: 74 5f 6f 76 65 72 72 69 64 65 73 5d 20 26 26 20  t_overrides] && 
65c0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 6c 6c  \..          [ll
65d0: 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 6f 76  ength $::test_ov
65e0: 65 72 72 69 64 65 73 5d 20 3e 20 30 7d 20 74 68  errides] > 0} th
65f0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 65 76  en {..        ev
6600: 61 6c 20 6c 61 70 70 65 6e 64 20 76 61 72 4e 61  al lappend varNa
6610: 6d 65 73 20 24 3a 3a 74 65 73 74 5f 6f 76 65 72  mes $::test_over
6620: 72 69 64 65 73 0d 0a 20 20 20 20 20 20 7d 0d 0a  rides..      }..
6630: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
6640: 20 23 20 4e 4f 54 45 3a 20 49 66 20 72 65 71 75   # NOTE: If requ
6650: 65 73 74 65 64 20 62 79 20 6f 75 72 20 63 61 6c  ested by our cal
6660: 6c 65 72 2c 20 61 64 64 20 61 6e 79 20 61 64 64  ler, add any add
6670: 69 74 69 6f 6e 61 6c 20 76 61 72 69 61 62 6c 65  itional variable
6680: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
6690: 6e 61 6d 65 73 20 74 6f 20 63 6f 70 79 20 6e 6f  names to copy no
66a0: 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  w...      #..   
66b0: 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20     if {[llength 
66c0: 24 65 78 74 72 61 56 61 72 4e 61 6d 65 73 5d 20  $extraVarNames] 
66d0: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
66e0: 20 20 20 20 20 65 76 61 6c 20 6c 61 70 70 65 6e       eval lappen
66f0: 64 20 76 61 72 4e 61 6d 65 73 20 24 65 78 74 72  d varNames $extr
6700: 61 56 61 72 4e 61 6d 65 73 0d 0a 20 20 20 20 20  aVarNames..     
6710: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
6720: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69       # NOTE: Bui
6730: 6c 64 20 74 68 65 20 73 63 72 69 70 74 20 66 72  ld the script fr
6740: 61 67 6d 65 6e 74 20 74 6f 20 62 65 20 72 65 74  agment to be ret
6750: 75 72 6e 65 64 20 62 79 20 70 72 6f 63 65 73 73  urned by process
6760: 69 6e 67 20 65 61 63 68 0d 0a 20 20 20 20 20 20  ing each..      
6770: 23 20 20 20 20 20 20 20 76 61 72 69 61 62 6c 65  #       variable
6780: 20 6e 61 6d 65 20 61 6e 64 20 61 64 64 69 6e 67   name and adding
6790: 20 74 68 65 20 6e 65 63 65 63 65 73 73 61 72 79   the nececessary
67a0: 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74   script fragment
67b0: 73 20 66 6f 72 0d 0a 20 20 20 20 20 20 23 20 20  s for..      #  
67c0: 20 20 20 20 20 65 61 63 68 20 6f 6e 65 2e 0d 0a       each one...
67d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73        #..      s
67e0: 65 74 20 72 65 73 75 6c 74 20 22 22 0d 0a 0d 0a  et result ""....
67f0: 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 76 61        foreach va
6800: 72 4e 61 6d 65 20 24 76 61 72 4e 61 6d 65 73 20  rName $varNames 
6810: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
6820: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75        # NOTE: Bu
6830: 69 6c 64 20 74 68 65 20 71 75 61 6c 69 66 69 65  ild the qualifie
6840: 64 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  d global variabl
6850: 65 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20  e name...       
6860: 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
6870: 66 75 6c 6c 56 61 72 4e 61 6d 65 20 5b 61 70 70  fullVarName [app
6880: 65 6e 64 41 72 67 73 20 3a 3a 20 24 76 61 72 4e  endArgs :: $varN
6890: 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ame]....        
68a0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
68b0: 45 3a 20 44 6f 65 73 20 74 68 65 20 76 61 72 69  E: Does the vari
68c0: 61 62 6c 65 20 65 78 69 73 74 20 69 6e 20 74 68  able exist in th
68d0: 69 73 20 69 6e 74 65 72 70 72 65 74 65 72 20 63  is interpreter c
68e0: 6f 6e 74 65 78 74 3f 0d 0a 20 20 20 20 20 20 20  ontext?..       
68f0: 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
6900: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 24 66 75  [info exists $fu
6910: 6c 6c 56 61 72 4e 61 6d 65 5d 7d 20 74 68 65 6e  llVarName]} then
6920: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
6930: 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
6940: 45 3a 20 41 70 70 65 6e 64 20 61 20 73 63 72 69  E: Append a scri
6950: 70 74 20 66 72 61 67 6d 65 6e 74 20 74 6f 20 74  pt fragment to t
6960: 68 65 20 72 65 73 75 6c 74 20 74 68 61 74 20 77  he result that w
6970: 69 6c 6c 20 63 6f 72 72 65 63 74 6c 79 0d 0a 20  ill correctly.. 
6980: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
6990: 20 63 6f 70 79 20 61 6e 79 20 63 6f 6e 74 61 69   copy any contai
69a0: 6e 65 64 20 76 61 6c 75 65 20 74 6f 20 61 6e 6f  ned value to ano
69b0: 74 68 65 72 20 69 6e 74 65 72 70 72 65 74 65 72  ther interpreter
69c0: 20 63 6f 6e 74 65 78 74 2e 0d 0a 20 20 20 20 20   context...     
69d0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
69e0: 20 20 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20    append result 
69f0: 5c 6e 20 22 73 65 74 20 22 20 24 66 75 6c 6c 56  \n "set " $fullV
6a00: 61 72 4e 61 6d 65 20 22 20 5c 7b 22 20 5b 73 65  arName " \{" [se
6a10: 74 20 24 66 75 6c 6c 56 61 72 4e 61 6d 65 5d 20  t $fullVarName] 
6a20: 5c 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  \}..        }.. 
6a30: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
6a40: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
6a50: 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 63   If the result c
6a60: 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
6a70: 6f 72 65 20 73 63 72 69 70 74 20 66 72 61 67 6d  ore script fragm
6a80: 65 6e 74 73 2c 20 61 70 70 65 6e 64 20 61 0d 0a  ents, append a..
6a90: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 65        #       ne
6aa0: 77 6c 69 6e 65 2e 0d 0a 20 20 20 20 20 20 23 0d  wline...      #.
6ab0: 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
6ac0: 6e 67 20 6c 65 6e 67 74 68 20 24 72 65 73 75 6c  ng length $resul
6ad0: 74 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  t] > 0} then {..
6ae0: 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 72          append r
6af0: 65 73 75 6c 74 20 5c 6e 0d 0a 20 20 20 20 20 20  esult \n..      
6b00: 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
6b10: 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d  n $result..    }
6b20: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
6b30: 74 41 70 70 44 6f 6d 61 69 6e 50 72 65 61 6d 62  tAppDomainPreamb
6b40: 6c 65 20 7b 20 7b 70 72 65 66 69 78 20 22 22 7d  le { {prefix ""}
6b50: 20 7b 73 75 66 66 69 78 20 22 22 7d 20 7d 20 7b   {suffix ""} } {
6b60: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
6b70: 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72   # NOTE: This pr
6b80: 6f 63 65 64 75 72 65 20 72 65 74 75 72 6e 73 20  ocedure returns 
6b90: 61 20 74 65 73 74 20 73 65 74 75 70 20 73 63 72  a test setup scr
6ba0: 69 70 74 20 66 72 61 67 6d 65 6e 74 20 73 75 69  ipt fragment sui
6bb0: 74 61 62 6c 65 20 66 6f 72 0d 0a 20 20 20 20 20  table for..     
6bc0: 20 23 20 20 20 20 20 20 20 65 76 61 6c 75 61 74   #       evaluat
6bd0: 69 6f 6e 20 62 79 20 61 6e 20 69 6e 74 65 72 70  ion by an interp
6be0: 72 65 74 65 72 20 63 72 65 61 74 65 64 20 69 6e  reter created in
6bf0: 20 61 6e 20 69 73 6f 6c 61 74 65 64 20 61 70 70   an isolated app
6c00: 6c 69 63 61 74 69 6f 6e 0d 0a 20 20 20 20 20 20  lication..      
6c10: 23 20 20 20 20 20 20 20 64 6f 6d 61 69 6e 2e 20  #       domain. 
6c20: 20 54 68 65 20 73 63 72 69 70 74 20 66 72 61 67   The script frag
6c30: 6d 65 6e 74 20 62 65 69 6e 67 20 72 65 74 75 72  ment being retur
6c40: 6e 65 64 20 77 69 6c 6c 20 62 65 20 73 75 72 72  ned will be surr
6c50: 6f 75 6e 64 65 64 20 62 79 0d 0a 20 20 20 20 20  ounded by..     
6c60: 20 23 20 20 20 20 20 20 20 74 68 65 20 70 72 65   #       the pre
6c70: 66 69 78 20 61 6e 64 20 73 75 66 66 69 78 20 22  fix and suffix "
6c80: 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 73  script fragments
6c90: 22 20 73 70 65 63 69 66 69 65 64 20 62 79 20 6f  " specified by o
6ca0: 75 72 20 63 61 6c 6c 65 72 2c 0d 0a 20 20 20 20  ur caller,..    
6cb0: 20 20 23 20 20 20 20 20 20 20 69 66 20 61 6e 79    #       if any
6cc0: 2e 20 20 54 68 65 20 65 6e 74 69 72 65 20 73 63  .  The entire sc
6cd0: 72 69 70 74 20 62 65 69 6e 67 20 72 65 74 75 72  ript being retur
6ce0: 6e 65 64 20 77 69 6c 6c 20 62 65 20 73 75 62 73  ned will be subs
6cf0: 74 69 74 75 74 65 64 20 76 69 61 0d 0a 20 20 20  tituted via..   
6d00: 20 20 20 23 20 20 20 20 20 20 20 5b 73 75 62 73     #       [subs
6d10: 74 5d 2c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  t], in the conte
6d20: 78 74 20 6f 66 20 6f 75 72 20 63 61 6c 6c 65 72  xt of our caller
6d30: 2c 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 72  , before being r
6d40: 65 74 75 72 6e 65 64 2e 0d 0a 20 20 20 20 20 20  eturned...      
6d50: 23 20 20 20 20 20 20 20 54 68 69 73 20 73 74 65  #       This ste
6d60: 70 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 73  p is necessary s
6d70: 6f 20 74 68 61 74 20 73 6f 6d 65 20 6c 69 6d 69  o that some limi
6d80: 74 65 64 20 63 6f 6e 74 65 78 74 20 69 6e 66 6f  ted context info
6d90: 72 6d 61 74 69 6f 6e 2c 0d 0a 20 20 20 20 20 20  rmation,..      
6da0: 23 20 20 20 20 20 20 20 70 72 69 6d 61 72 69 6c  #       primaril
6db0: 79 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65  y related to the
6dc0: 20 74 65 73 74 69 6e 67 20 64 69 72 65 63 74 6f   testing directo
6dd0: 72 69 65 73 2c 20 63 61 6e 20 62 65 20 74 72 61  ries, can be tra
6de0: 6e 73 66 65 72 72 65 64 0d 0a 20 20 20 20 20 20  nsferred..      
6df0: 23 20 20 20 20 20 20 20 74 6f 20 74 68 65 20 69  #       to the i
6e00: 6e 74 65 72 70 72 65 74 65 72 20 69 6e 20 74 68  nterpreter in th
6e10: 65 20 69 73 6f 6c 61 74 65 64 20 61 70 70 6c 69  e isolated appli
6e20: 63 61 74 69 6f 6e 20 64 6f 6d 61 69 6e 2c 20 6d  cation domain, m
6e30: 61 6b 69 6e 67 20 69 74 0d 0a 20 20 20 20 20 20  aking it..      
6e40: 23 20 20 20 20 20 20 20 61 62 6c 65 20 74 6f 20  #       able to 
6e50: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 75 6e  successfully run
6e60: 20 74 65 73 74 73 20 74 68 61 74 20 72 65 71 75   tests that requ
6e70: 69 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ire one or more 
6e80: 6f 66 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  of the..      # 
6e90: 20 20 20 20 20 20 66 69 6c 65 73 20 69 6e 20 6f        files in o
6ea0: 6e 65 20 6f 66 20 74 68 65 20 74 65 73 74 69 6e  ne of the testin
6eb0: 67 20 64 69 72 65 63 74 6f 72 69 65 73 2e 20 20  g directories.  
6ec0: 43 61 6c 6c 65 72 73 20 73 68 6f 75 6c 64 20 6b  Callers should k
6ed0: 65 65 70 20 69 6e 0d 0a 20 20 20 20 20 20 23 20  eep in..      # 
6ee0: 20 20 20 20 20 20 6d 69 6e 64 20 74 68 61 74 20        mind that 
6ef0: 74 68 65 20 74 65 73 74 20 73 63 72 69 70 74 20  the test script 
6f00: 66 72 61 67 6d 65 6e 74 20 62 65 69 6e 67 20 72  fragment being r
6f10: 65 74 75 72 6e 65 64 20 63 61 6e 6e 6f 74 20 72  eturned cannot r
6f20: 65 6c 79 20 6f 6e 0d 0a 20 20 20 20 20 20 23 20  ely on..      # 
6f30: 20 20 20 20 20 20 61 6e 79 20 73 63 72 69 70 74        any script
6f40: 20 6c 69 62 72 61 72 79 20 70 72 6f 63 65 64 75   library procedu
6f50: 72 65 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74  res that are not
6f60: 20 70 72 6f 76 69 64 65 64 20 62 79 20 74 68 65   provided by the
6f70: 20 45 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 20   Eagle..      # 
6f80: 20 20 20 20 20 20 6c 69 62 72 61 72 79 20 70 61        library pa
6f90: 63 6b 61 67 65 20 28 69 2e 65 2e 20 22 69 6e 69  ckage (i.e. "ini
6fa0: 74 2e 65 61 67 6c 65 22 29 2c 20 69 6e 63 6c 75  t.eagle"), inclu
6fb0: 64 69 6e 67 20 74 68 6f 73 65 20 70 72 6f 76 69  ding those provi
6fc0: 64 65 64 20 62 79 0d 0a 20 20 20 20 20 20 23 20  ded by..      # 
6fd0: 20 20 20 20 20 20 74 68 65 20 45 61 67 6c 65 20        the Eagle 
6fe0: 74 65 73 74 20 70 61 63 6b 61 67 65 2c 20 75 6e  test package, un
6ff0: 6c 65 73 73 20 74 68 65 20 66 69 6c 65 20 63 6f  less the file co
7000: 6e 74 61 69 6e 69 6e 67 20 74 68 65 6d 20 69 73  ntaining them is
7010: 20 6c 6f 61 64 65 64 0d 0a 20 20 20 20 20 20 23   loaded..      #
7020: 20 20 20 20 20 20 20 6d 61 6e 75 61 6c 6c 79 20         manually 
7030: 76 69 61 20 73 6f 6d 65 20 6f 74 68 65 72 20 6d  via some other m
7040: 65 63 68 61 6e 69 73 6d 20 28 65 2e 67 2e 20 62  echanism (e.g. b
7050: 79 20 69 6e 63 6c 75 64 69 6e 67 20 61 70 70 72  y including appr
7060: 6f 70 72 69 61 74 65 0d 0a 20 20 20 20 20 20 23  opriate..      #
7070: 20 20 20 20 20 20 20 5b 70 61 63 6b 61 67 65 20         [package 
7080: 72 65 71 75 69 72 65 5d 20 6f 72 20 5b 73 6f 75  require] or [sou
7090: 72 63 65 5d 20 63 6f 6d 6d 61 6e 64 73 20 69 6e  rce] commands in
70a0: 20 74 68 65 20 70 72 65 66 69 78 20 6f 72 20 73   the prefix or s
70b0: 75 66 66 69 78 0d 0a 20 20 20 20 20 20 23 20 20  uffix..      #  
70c0: 20 20 20 20 20 73 63 72 69 70 74 20 66 72 61 67       script frag
70d0: 6d 65 6e 74 73 29 2e 20 20 41 6c 73 6f 2c 20 61  ments).  Also, a
70e0: 6c 6c 20 76 61 72 69 61 62 6c 65 20 72 65 66 65  ll variable refe
70f0: 72 65 6e 63 65 73 20 61 6e 64 20 61 6c 6c 20 6e  rences and all n
7100: 65 73 74 65 64 0d 0a 20 20 20 20 20 20 23 20 20  ested..      #  
7110: 20 20 20 20 20 63 6f 6d 6d 61 6e 64 73 20 28 69       commands (i
7120: 2e 65 2e 20 74 68 6f 73 65 20 69 6e 20 73 71 75  .e. those in squ
7130: 61 72 65 20 62 72 61 63 6b 65 74 73 29 20 63 6f  are brackets) co
7140: 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 66  ntained in the f
7150: 69 6e 61 6c 0d 0a 20 20 20 20 20 20 23 20 20 20  inal..      #   
7160: 20 20 20 20 73 63 72 69 70 74 20 66 72 61 67 6d      script fragm
7170: 65 6e 74 20 77 69 6c 6c 20 65 6e 64 20 75 70 20  ent will end up 
7180: 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64 20  being evaluated 
7190: 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f  in the context o
71a0: 66 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  f the..      #  
71b0: 20 20 20 20 20 63 61 6c 6c 69 6e 67 20 69 6e 74       calling int
71c0: 65 72 70 72 65 74 65 72 20 61 6e 64 20 6e 6f 74  erpreter and not
71d0: 20 74 68 65 20 74 61 72 67 65 74 20 69 6e 74 65   the target inte
71e0: 72 70 72 65 74 65 72 20 63 72 65 61 74 65 64 20  rpreter created 
71f0: 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  in the..      # 
7200: 20 20 20 20 20 20 69 73 6f 6c 61 74 65 64 20 61        isolated a
7210: 70 70 6c 69 63 61 74 69 6f 6e 20 64 6f 6d 61 69  pplication domai
7220: 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 64 6f 6c  n unless the dol
7230: 6c 61 72 20 73 69 67 6e 73 20 61 6e 64 2f 6f 72  lar signs and/or
7240: 20 73 71 75 61 72 65 0d 0a 20 20 20 20 20 20 23   square..      #
7250: 20 20 20 20 20 20 20 62 72 61 63 6b 65 74 73 20         brackets 
7260: 61 72 65 20 73 70 65 63 69 61 6c 6c 79 20 71 75  are specially qu
7270: 6f 74 65 64 20 77 69 74 68 20 62 61 63 6b 73 6c  oted with backsl
7280: 61 73 68 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d  ashes...      #.
7290: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 75  .      return [u
72a0: 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 73  plevel 1 [list s
72b0: 75 62 73 74 20 5b 61 70 70 65 6e 64 41 72 67 73  ubst [appendArgs
72c0: 20 24 70 72 65 66 69 78 20 7b 0d 0a 20 20 20 20   $prefix {..    
72d0: 20 20 20 20 69 66 20 7b 5b 68 61 73 52 75 6e 74      if {[hasRunt
72e0: 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65  imeOption native
72f0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
7300: 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
7310: 6b 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47  ke Interpreter.G
7320: 65 74 41 63 74 69 76 65 20 41 64 64 52 75 6e 74  etActive AddRunt
7330: 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65  imeOption native
7340: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
7350: 20 20 20 7d 20 5b 67 65 74 54 65 73 74 4f 76 65     } [getTestOve
7360: 72 72 69 64 65 73 50 72 65 61 6d 62 6c 65 20 5b  rridesPreamble [
7370: 6c 69 73 74 20 70 61 74 68 20 74 65 73 74 5f 63  list path test_c
7380: 68 61 6e 6e 65 6c 5d 5d 20 24 73 75 66 66 69 78  hannel]] $suffix
7390: 5d 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  ]]]..    }..... 
73a0: 20 20 20 70 72 6f 63 20 74 72 79 43 6f 70 79 42     proc tryCopyB
73b0: 69 6e 61 72 79 46 69 6c 65 20 7b 20 66 69 6c 65  inaryFile { file
73c0: 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22  Name {platform "
73d0: 22 7d 20 7b 6e 65 77 46 69 6c 65 4e 61 6d 65 20  "} {newFileName 
73e0: 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73  ""} } {..      s
73f0: 65 74 20 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  et sourceFileNam
7400: 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65  e [getBinaryFile
7410: 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24  Name $fileName $
7420: 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20  platform]....   
7430: 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78     if {![file ex
7440: 69 73 74 73 20 24 73 6f 75 72 63 65 46 69 6c 65  ists $sourceFile
7450: 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
7460: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
7470: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
7480: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
7490: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b          "---- sk
74a0: 69 70 70 65 64 20 63 6f 70 79 69 6e 67 20 62 69  ipped copying bi
74b0: 6e 61 72 79 20 66 69 6c 65 20 5c 22 22 20 24 73  nary file \"" $s
74c0: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d  ourceFileName \.
74d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22  .            "\"
74e0: 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78  , it does not ex
74f0: 69 73 74 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20  ist\n"]....     
7500: 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20     return..     
7510: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   }....      if {
7520: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
7530: 6e 65 77 46 69 6c 65 4e 61 6d 65 5d 20 3e 20 30  newFileName] > 0
7540: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
7550: 20 20 73 65 74 20 74 61 72 67 65 74 46 69 6c 65    set targetFile
7560: 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c 64 46 69  Name [getBuildFi
7570: 6c 65 4e 61 6d 65 20 24 6e 65 77 46 69 6c 65 4e  leName $newFileN
7580: 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a  ame $platform]..
7590: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
75a0: 20 20 20 20 20 20 20 20 73 65 74 20 74 61 72 67          set targ
75b0: 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42  etFileName [getB
75c0: 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 24 66 69  uildFileName $fi
75d0: 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d  leName $platform
75e0: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ]..      }....  
75f0: 20 20 20 20 73 65 74 20 74 61 72 67 65 74 44 69      set targetDi
7600: 72 65 63 74 6f 72 79 20 5b 66 69 6c 65 20 64 69  rectory [file di
7610: 72 6e 61 6d 65 20 24 74 61 72 67 65 74 46 69 6c  rname $targetFil
7620: 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  eName]....      
7630: 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
7640: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
7650: 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 74  ![file exists $t
7660: 61 72 67 65 74 44 69 72 65 63 74 6f 72 79 5d 7d  argetDirectory]}
7670: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
7680: 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 6d 6b           file mk
7690: 64 69 72 20 24 74 61 72 67 65 74 44 69 72 65 63  dir $targetDirec
76a0: 74 6f 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20  tory..          
76b0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
76c0: 20 20 20 20 20 66 69 6c 65 20 63 6f 70 79 20 2d       file copy -
76d0: 66 6f 72 63 65 20 24 73 6f 75 72 63 65 46 69 6c  force $sourceFil
76e0: 65 4e 61 6d 65 20 24 74 61 72 67 65 74 46 69 6c  eName $targetFil
76f0: 65 4e 61 6d 65 7d 5d 20 3d 3d 20 30 7d 20 74 68  eName}] == 0} th
7700: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  en {..        tp
7710: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
7720: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
7730: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
7740: 2d 2d 2d 2d 20 63 6f 70 69 65 64 20 62 69 6e 61  ---- copied bina
7750: 72 79 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22  ry file from \""
7760: 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65   $sourceFileName
7770: 20 22 5c 22 20 74 6f 20 5c 22 22 20 5c 0d 0a 20   "\" to \"" \.. 
7780: 20 20 20 20 20 20 20 20 20 20 20 24 74 61 72 67             $targ
7790: 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d  etFileName \"\n]
77a0: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
77b0: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
77c0: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
77d0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
77e0: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
77f0: 20 66 61 69 6c 65 64 20 74 6f 20 63 6f 70 79 20   failed to copy 
7800: 62 69 6e 61 72 79 20 66 69 6c 65 20 66 72 6f 6d  binary file from
7810: 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65   \"" $sourceFile
7820: 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  Name \..        
7830: 20 20 20 20 22 5c 22 20 74 6f 20 5c 22 22 20 24      "\" to \"" $
7840: 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5c  targetFileName \
7850: 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  "\n]..      }.. 
7860: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
7870: 63 20 74 72 79 43 6f 70 79 42 75 69 6c 64 46 69  c tryCopyBuildFi
7880: 6c 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 70  le { fileName {p
7890: 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 6e 65 77  latform ""} {new
78a0: 46 69 6c 65 4e 61 6d 65 20 22 22 7d 20 7d 20 7b  FileName ""} } {
78b0: 0d 0a 20 20 20 20 20 20 73 65 74 20 73 6f 75 72  ..      set sour
78c0: 63 65 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42  ceFileName [getB
78d0: 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 24 66 69  uildFileName $fi
78e0: 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d  leName $platform
78f0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21  ]....      if {!
7900: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 73 6f  [file exists $so
7910: 75 72 63 65 46 69 6c 65 4e 61 6d 65 5d 7d 20 74  urceFileName]} t
7920: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  hen {..        t
7930: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
7940: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
7950: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
7960: 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 63 6f  "---- skipped co
7970: 70 79 69 6e 67 20 62 75 69 6c 64 20 66 69 6c 65  pying build file
7980: 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65   \"" $sourceFile
7990: 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  Name \..        
79a0: 20 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73      "\", it does
79b0: 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a   not exist\n"]..
79c0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
79d0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
79e0: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
79f0: 65 6e 67 74 68 20 24 6e 65 77 46 69 6c 65 4e 61  ength $newFileNa
7a00: 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  me] > 0} then {.
7a10: 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 61 72  .        set tar
7a20: 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74  getFileName [get
7a30: 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24  BinaryFileName $
7a40: 6e 65 77 46 69 6c 65 4e 61 6d 65 20 24 70 6c 61  newFileName $pla
7a50: 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 7d 20  tform]..      } 
7a60: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
7a70: 73 65 74 20 74 61 72 67 65 74 46 69 6c 65 4e 61  set targetFileNa
7a80: 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c  me [getBinaryFil
7a90: 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20  eName $fileName 
7aa0: 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20  $platform]..    
7ab0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74    }....      set
7ac0: 20 74 61 72 67 65 74 44 69 72 65 63 74 6f 72 79   targetDirectory
7ad0: 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24   [file dirname $
7ae0: 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 5d 0d  targetFileName].
7af0: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  ...      if {[ca
7b00: 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
7b10: 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20       if {![file 
7b20: 65 78 69 73 74 73 20 24 74 61 72 67 65 74 44 69  exists $targetDi
7b30: 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b  rectory]} then {
7b40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7b50: 20 20 66 69 6c 65 20 6d 6b 64 69 72 20 24 74 61    file mkdir $ta
7b60: 72 67 65 74 44 69 72 65 63 74 6f 72 79 0d 0a 20  rgetDirectory.. 
7b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
7b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
7b90: 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63 65 20 24  le copy -force $
7ba0: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 24  sourceFileName $
7bb0: 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 7d 5d  targetFileName}]
7bc0: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
7bd0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
7be0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
7bf0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
7c00: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f          "---- co
7c10: 70 69 65 64 20 62 75 69 6c 64 20 66 69 6c 65 20  pied build file 
7c20: 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63 65  from \"" $source
7c30: 46 69 6c 65 4e 61 6d 65 20 22 5c 22 20 74 6f 20  FileName "\" to 
7c40: 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
7c50: 20 20 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61     $targetFileNa
7c60: 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  me \"\n]..      
7c70: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
7c80: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
7c90: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
7ca0: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
7cb0: 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20     "---- failed 
7cc0: 74 6f 20 63 6f 70 79 20 62 75 69 6c 64 20 66 69  to copy build fi
7cd0: 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75  le from \"" $sou
7ce0: 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  rceFileName \.. 
7cf0: 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 74             "\" t
7d00: 6f 20 5c 22 22 20 24 74 61 72 67 65 74 46 69 6c  o \"" $targetFil
7d10: 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  eName \"\n]..   
7d20: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
7d30: 20 20 20 20 70 72 6f 63 20 74 72 79 44 65 6c 65      proc tryDele
7d40: 74 65 42 69 6e 61 72 79 46 69 6c 65 20 7b 20 66  teBinaryFile { f
7d50: 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72  ileName {platfor
7d60: 6d 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  m ""} } {..     
7d70: 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 67   set fileName [g
7d80: 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  etBinaryFileName
7d90: 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74   $fileName $plat
7da0: 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69  form]....      i
7db0: 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73  f {![file exists
7dc0: 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65   $fileName]} the
7dd0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  n {..        tpu
7de0: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
7df0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
7e00: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
7e10: 2d 2d 2d 20 73 6b 69 70 70 65 64 20 64 65 6c 65  --- skipped dele
7e20: 74 69 6e 67 20 62 69 6e 61 72 79 20 66 69 6c 65  ting binary file
7e30: 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c   \"" $fileName \
7e40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 5c  ..            "\
7e50: 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65  ", it does not e
7e60: 78 69 73 74 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20  xist\n"]....    
7e70: 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20      return..    
7e80: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
7e90: 7b 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64 65  {[catch {file de
7ea0: 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d 5d  lete $fileName}]
7eb0: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
7ec0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
7ed0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
7ee0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
7ef0: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 64 65          "---- de
7f00: 6c 65 74 65 64 20 62 69 6e 61 72 79 20 66 69 6c  leted binary fil
7f10: 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20  e \"" $fileName 
7f20: 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65  \"\n]..      } e
7f30: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
7f40: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
7f50: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
7f60: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
7f70: 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20  "---- failed to 
7f80: 64 65 6c 65 74 65 20 62 69 6e 61 72 79 20 66 69  delete binary fi
7f90: 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65  le \"" $fileName
7fa0: 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d   \"\n]..      }.
7fb0: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
7fc0: 72 6f 63 20 74 72 79 44 65 6c 65 74 65 42 75 69  roc tryDeleteBui
7fd0: 6c 64 46 69 6c 65 20 7b 20 66 69 6c 65 4e 61 6d  ldFile { fileNam
7fe0: 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20  e {platform ""} 
7ff0: 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 66  } {..      set f
8000: 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c  ileName [getBuil
8010: 64 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e  dFileName $fileN
8020: 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a  ame $platform]..
8030: 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69  ..      if {![fi
8040: 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e  le exists $fileN
8050: 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
8060: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
8070: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
8080: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
8090: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69         "---- ski
80a0: 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20 62 75  pped deleting bu
80b0: 69 6c 64 20 66 69 6c 65 20 5c 22 22 20 24 66 69  ild file \"" $fi
80c0: 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  leName \..      
80d0: 20 20 20 20 20 20 22 5c 22 2c 20 69 74 20 64 6f        "\", it do
80e0: 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d  es not exist\n"]
80f0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75  ....        retu
8100: 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  rn..      }.... 
8110: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
8120: 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66 69  {file delete $fi
8130: 6c 65 4e 61 6d 65 7d 5d 20 3d 3d 20 30 7d 20 74  leName}] == 0} t
8140: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  hen {..        t
8150: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
8160: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
8170: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
8180: 22 2d 2d 2d 2d 20 64 65 6c 65 74 65 64 20 62 75  "---- deleted bu
8190: 69 6c 64 20 66 69 6c 65 20 5c 22 22 20 24 66 69  ild file \"" $fi
81a0: 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20  leName \"\n]..  
81b0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
81c0: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
81d0: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
81e0: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
81f0: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69         "---- fai
8200: 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 62 75  led to delete bu
8210: 69 6c 64 20 66 69 6c 65 20 5c 22 22 20 24 66 69  ild file \"" $fi
8220: 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20  leName \"\n]..  
8230: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
8240: 0a 20 20 20 20 70 72 6f 63 20 74 72 79 43 6f 70  .    proc tryCop
8250: 79 41 73 73 65 6d 62 6c 79 20 7b 20 66 69 6c 65  yAssembly { file
8260: 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22  Name {platform "
8270: 22 7d 20 7b 70 64 62 20 74 72 75 65 7d 20 7d 20  "} {pdb true} } 
8280: 7b 0d 0a 20 20 20 20 20 20 74 72 79 43 6f 70 79  {..      tryCopy
8290: 42 75 69 6c 64 46 69 6c 65 20 24 66 69 6c 65 4e  BuildFile $fileN
82a0: 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 0d  ame $platform...
82b0: 0a 20 20 20 20 20 20 69 66 20 7b 24 70 64 62 7d  .      if {$pdb}
82c0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
82d0: 20 74 72 79 43 6f 70 79 42 75 69 6c 64 46 69 6c   tryCopyBuildFil
82e0: 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  e [appendArgs \.
82f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69  .            [fi
8300: 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 24 66 69 6c  le rootname $fil
8310: 65 4e 61 6d 65 5d 20 2e 70 64 62 5d 20 24 70 6c  eName] .pdb] $pl
8320: 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 7d 0d  atform..      }.
8330: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
8340: 72 6f 63 20 74 72 79 44 65 6c 65 74 65 41 73 73  roc tryDeleteAss
8350: 65 6d 62 6c 79 20 7b 20 66 69 6c 65 4e 61 6d 65  embly { fileName
8360: 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b   {platform ""} {
8370: 70 64 62 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20  pdb true} } {.. 
8380: 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 42 69       tryDeleteBi
8390: 6e 61 72 79 46 69 6c 65 20 24 66 69 6c 65 4e 61  naryFile $fileNa
83a0: 6d 65 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 0d 0a  me $platform....
83b0: 20 20 20 20 20 20 69 66 20 7b 24 70 64 62 7d 20        if {$pdb} 
83c0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
83d0: 74 72 79 44 65 6c 65 74 65 42 69 6e 61 72 79 46  tryDeleteBinaryF
83e0: 69 6c 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20  ile [appendArgs 
83f0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
8400: 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 24 66  file rootname $f
8410: 69 6c 65 4e 61 6d 65 5d 20 2e 70 64 62 5d 20 24  ileName] .pdb] $
8420: 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20  platform..      
8430: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
8440: 20 70 72 6f 63 20 74 72 79 4c 6f 61 64 41 73 73   proc tryLoadAss
8450: 65 6d 62 6c 79 20 7b 20 66 69 6c 65 4e 61 6d 65  embly { fileName
8460: 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7d   {platform ""} }
8470: 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69   {..      set fi
8480: 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72  leName [getBinar
8490: 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e  yFileName $fileN
84a0: 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a  ame $platform]..
84b0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74  ..      if {[cat
84c0: 63 68 20 7b 73 65 74 20 61 73 73 65 6d 62 6c 79  ch {set assembly
84d0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
84e0: 20 20 5b 6f 62 6a 65 63 74 20 6c 6f 61 64 20 2d    [object load -
84f0: 6c 6f 61 64 74 79 70 65 20 46 69 6c 65 20 2d 61  loadtype File -a
8500: 6c 69 61 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d  lias $fileName]}
8510: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
8520: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
8530: 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 2c 20     # NOTE: Now, 
8540: 61 64 64 20 74 68 65 20 6e 65 63 65 73 73 61 72  add the necessar
8550: 79 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e  y test constrain
8560: 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
8570: 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
8580: 61 69 6e 74 20 5b 66 69 6c 65 20 72 6f 6f 74 6e  aint [file rootn
8590: 61 6d 65 20 5b 66 69 6c 65 20 74 61 69 6c 20 24  ame [file tail $
85a0: 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 0d 0a 20 20  fileName]]....  
85b0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
85c0: 20 23 20 4e 4f 54 45 3a 20 47 72 61 62 20 74 68   # NOTE: Grab th
85d0: 65 20 69 6d 61 67 65 20 72 75 6e 74 69 6d 65 20  e image runtime 
85e0: 76 65 72 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65  version from the
85f0: 20 61 73 73 65 6d 62 6c 79 20 62 65 63 61 75 73   assembly becaus
8600: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
8610: 20 20 20 73 65 76 65 72 61 6c 20 74 65 73 74 73     several tests
8620: 20 72 65 6c 79 20 6f 6e 20 69 74 20 68 61 76 69   rely on it havi
8630: 6e 67 20 61 20 63 65 72 74 61 69 6e 20 76 61 6c  ng a certain val
8640: 75 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ue...        #..
8650: 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
8660: 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
8670: 73 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69  s [file tail $fi
8680: 6c 65 4e 61 6d 65 5d 20 5f 20 5c 0d 0a 20 20 20  leName] _ \..   
8690: 20 20 20 20 20 20 20 20 20 5b 24 61 73 73 65 6d           [$assem
86a0: 62 6c 79 20 49 6d 61 67 65 52 75 6e 74 69 6d 65  bly ImageRuntime
86b0: 56 65 72 73 69 6f 6e 5d 5d 0d 0a 0d 0a 20 20 20  Version]]....   
86c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
86d0: 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74  # NOTE: Return t
86e0: 68 65 20 66 75 6c 6c 20 70 61 74 68 20 6f 66 20  he full path of 
86f0: 74 68 65 20 6c 6f 61 64 65 64 20 66 69 6c 65 2e  the loaded file.
8700: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
8710: 20 20 20 20 20 72 65 74 75 72 6e 20 24 66 69 6c       return $fil
8720: 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 0d 0a  eName..      }..
8730: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 22  ..      return "
8740: 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  "..    }.....   
8750: 20 70 72 6f 63 20 69 73 53 51 4c 69 74 65 52 65   proc isSQLiteRe
8760: 61 64 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  ady {} {..      
8770: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
8780: 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   This procedure 
8790: 6d 75 73 74 20 72 65 74 75 72 6e 20 6e 6f 6e 2d  must return non-
87a0: 7a 65 72 6f 20 6f 6e 6c 79 20 69 66 20 74 68 65  zero only if the
87b0: 20 53 51 4c 69 74 65 20 6e 61 74 69 76 65 0d 0a   SQLite native..
87c0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6c 69        #       li
87d0: 62 72 61 72 79 20 61 6e 64 20 74 68 65 20 53 79  brary and the Sy
87e0: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
87f0: 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c   managed assembl
8800: 79 20 61 72 65 20 6c 6f 61 64 65 64 0d 0a 20 20  y are loaded..  
8810: 20 20 20 20 23 20 20 20 20 20 20 20 61 6e 64 20      #       and 
8820: 72 65 61 64 79 20 66 6f 72 20 75 73 65 20 62 79  ready for use by
8830: 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e   the test suite.
8840: 20 20 43 75 72 72 65 6e 74 6c 79 2c 20 74 68 69    Currently, thi
8850: 73 20 70 72 6f 63 65 64 75 72 65 0d 0a 20 20 20  s procedure..   
8860: 20 20 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c     #       shoul
8870: 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 6c 79  d be called only
8880: 20 61 66 74 65 72 20 74 68 65 20 5b 74 72 79 4c   after the [tryL
8890: 6f 61 64 41 73 73 65 6d 62 6c 79 5d 20 70 72 6f  oadAssembly] pro
88a0: 63 65 64 75 72 65 20 68 61 73 0d 0a 20 20 20 20  cedure has..    
88b0: 20 20 23 20 20 20 20 20 20 20 62 65 65 6e 20 63    #       been c
88c0: 61 6c 6c 65 64 20 74 6f 20 70 72 6f 62 65 20 66  alled to probe f
88d0: 6f 72 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61  or the System.Da
88e0: 74 61 2e 53 51 4c 69 74 65 20 6d 61 6e 61 67 65  ta.SQLite manage
88f0: 64 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20 20  d assembly..    
8900: 20 20 23 20 20 20 20 20 20 20 61 6e 64 20 74 68    #       and th
8910: 65 20 5b 63 68 65 63 6b 46 6f 72 53 51 4c 69 74  e [checkForSQLit
8920: 65 5d 20 70 72 6f 63 65 64 75 72 65 20 68 61 73  e] procedure has
8930: 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20   been called to 
8940: 70 72 6f 62 65 20 66 6f 72 0d 0a 20 20 20 20 20  probe for..     
8950: 20 23 20 20 20 20 20 20 20 74 68 65 20 53 51 4c   #       the SQL
8960: 69 74 65 20 6e 61 74 69 76 65 20 6c 69 62 72 61  ite native libra
8970: 72 79 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 74  ry; otherwise, t
8980: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 77 69  his procedure wi
8990: 6c 6c 20 73 69 6d 70 6c 79 0d 0a 20 20 20 20 20  ll simply..     
89a0: 20 23 20 20 20 20 20 20 20 61 6c 77 61 79 73 20   #       always 
89b0: 72 65 74 75 72 6e 20 7a 65 72 6f 2e 0d 0a 20 20  return zero...  
89c0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74      #..      ret
89d0: 75 72 6e 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20  urn [expr {..   
89e0: 20 20 20 20 20 20 20 5b 68 61 76 65 43 6f 6e 73         [haveCons
89f0: 74 72 61 69 6e 74 20 53 79 73 74 65 6d 2e 44 61  traint System.Da
8a00: 74 61 2e 53 51 4c 69 74 65 5d 20 26 26 20 5b 68  ta.SQLite] && [h
8a10: 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 53 51  aveConstraint SQ
8a20: 4c 69 74 65 5d 0d 0a 20 20 20 20 20 20 7d 5d 0d  Lite]..      }].
8a30: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
8a40: 72 6f 63 20 6d 61 74 63 68 4d 61 63 68 69 6e 65  roc matchMachine
8a50: 20 7b 20 70 6c 61 74 66 6f 72 6d 20 7d 20 7b 0d   { platform } {.
8a60: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
8a70: 23 20 4e 4f 54 45 3a 20 41 6e 20 65 6d 70 74 79  # NOTE: An empty
8a80: 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65 20   string for the 
8a90: 70 6c 61 74 66 6f 72 6d 20 6d 65 61 6e 73 20 74  platform means t
8aa0: 68 61 74 20 74 68 65 20 62 75 69 6c 64 20 69 73  hat the build is
8ab0: 20 6e 6f 74 0d 0a 20 20 20 20 20 20 23 20 20 20   not..      #   
8ac0: 20 20 20 20 5b 70 72 69 6d 61 72 69 6c 79 5d 20      [primarily] 
8ad0: 61 20 6e 61 74 69 76 65 20 62 75 69 6c 64 3b 20  a native build; 
8ae0: 74 68 65 72 65 66 6f 72 65 2c 20 69 74 20 61 6c  therefore, it al
8af0: 77 61 79 73 20 6d 61 74 63 68 65 73 2e 0d 0a 20  ways matches... 
8b00: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
8b10: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
8b20: 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3d 3d 20 30   $platform] == 0
8b30: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
8b40: 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20    return true.. 
8b50: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
8b60: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
8b70: 20 44 6f 65 73 20 74 68 65 20 73 70 65 63 69 66   Does the specif
8b80: 69 65 64 20 70 6c 61 74 66 6f 72 6d 20 6d 61 74  ied platform mat
8b90: 63 68 20 75 70 20 74 6f 20 74 68 65 20 63 75 72  ch up to the cur
8ba0: 72 65 6e 74 20 70 72 6f 63 65 73 73 3f 0d 0a 20  rent process?.. 
8bb0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
8bc0: 20 7b 24 70 6c 61 74 66 6f 72 6d 20 65 71 20 5b   {$platform eq [
8bd0: 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72  machineToPlatfor
8be0: 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72  m $::tcl_platfor
8bf0: 6d 28 6d 61 63 68 69 6e 65 29 5d 7d 20 74 68 65  m(machine)]} the
8c00: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  n {..        ret
8c10: 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
8c20: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
8c30: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
8c40: 73 70 65 63 69 66 69 65 64 20 70 6c 61 74 66 6f  specified platfo
8c50: 72 6d 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  rm does not matc
8c60: 68 20 75 70 20 77 69 74 68 20 74 68 65 20 70 6c  h up with the pl
8c70: 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 23 20  atform..      # 
8c80: 20 20 20 20 20 20 66 6f 72 20 74 68 65 20 63 75        for the cu
8c90: 72 72 65 6e 74 20 70 72 6f 63 65 73 73 2e 0d 0a  rrent process...
8ca0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72        #..      r
8cb0: 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20  eturn false..   
8cc0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
8cd0: 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 42 75  checkForSQLiteBu
8ce0: 69 6c 64 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b  ilds { channel {
8cf0: 73 65 6c 65 63 74 20 66 61 6c 73 65 7d 20 7d 20  select false} } 
8d00: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
8d10: 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
8d20: 66 6f 72 20 65 76 65 72 79 20 70 6f 73 73 69 62  for every possib
8d30: 6c 65 20 76 61 6c 69 64 20 63 6f 6d 62 69 6e 61  le valid combina
8d40: 74 69 6f 6e 20 6f 66 20 76 61 6c 75 65 73 20 75  tion of values u
8d50: 73 65 64 20 77 68 65 6e 0d 0a 20 20 20 20 20 20  sed when..      
8d60: 23 20 20 20 20 20 20 20 6c 6f 63 61 74 69 6e 67  #       locating
8d70: 20 6f 75 74 20 74 68 65 20 62 75 69 6c 64 20 6f   out the build o
8d80: 75 74 70 75 74 20 64 69 72 65 63 74 6f 72 79 2c  utput directory,
8d90: 20 73 68 6f 77 69 6e 67 20 65 61 63 68 20 61 76   showing each av
8da0: 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20 23  ailable..      #
8db0: 20 20 20 20 20 20 20 62 75 69 6c 64 20 76 61 72         build var
8dc0: 69 61 74 69 6f 6e 20 61 6c 6f 6e 67 20 74 68 65  iation along the
8dd0: 20 77 61 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a   way...      #..
8de0: 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 6e 61        foreach na
8df0: 74 69 76 65 20 5b 6c 69 73 74 20 66 61 6c 73 65  tive [list false
8e00: 20 74 72 75 65 5d 20 7b 0d 0a 20 20 20 20 20 20   true] {..      
8e10: 20 20 66 6f 72 65 61 63 68 20 79 65 61 72 20 5b    foreach year [
8e20: 67 65 74 42 75 69 6c 64 59 65 61 72 73 5d 20 7b  getBuildYears] {
8e30: 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65  ..          fore
8e40: 61 63 68 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ach configuratio
8e50: 6e 20 5b 67 65 74 42 75 69 6c 64 43 6f 6e 66 69  n [getBuildConfi
8e60: 67 75 72 61 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20  gurations] {..  
8e70: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
8e80: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
8e90: 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
8ea0: 65 66 66 65 63 74 69 76 65 20 62 75 69 6c 64 20  effective build 
8eb0: 70 6c 61 74 66 6f 72 6d 2e 20 20 54 68 69 73 20  platform.  This 
8ec0: 69 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  is..            
8ed0: 23 20 20 20 20 20 20 20 62 61 73 65 64 20 6f 6e  #       based on
8ee0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
8ef0: 61 20 5b 70 72 69 6d 61 72 69 6c 79 5d 20 6e 61  a [primarily] na
8f00: 74 69 76 65 20 62 75 69 6c 64 0d 0a 20 20 20 20  tive build..    
8f10: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
8f20: 69 73 20 62 65 69 6e 67 20 75 73 65 64 2e 20 20  is being used.  
8f30: 46 6f 72 20 5b 70 72 69 6d 61 72 69 6c 79 5d 20  For [primarily] 
8f40: 6e 6f 6e 2d 6e 61 74 69 76 65 20 62 75 69 6c 64  non-native build
8f50: 73 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  s,..            
8f60: 23 20 20 20 20 20 20 20 74 68 69 73 20 77 69 6c  #       this wil
8f70: 6c 20 62 65 20 61 6e 20 65 6d 70 74 79 20 73 74  l be an empty st
8f80: 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 20  ring...         
8f90: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
8fa0: 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 5b    set platform [
8fb0: 67 65 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d  getBuildPlatform
8fc0: 20 24 6e 61 74 69 76 65 5d 0d 0a 0d 0a 20 20 20   $native]....   
8fd0: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
8fe0: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
8ff0: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
9000: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65         "---- che
9010: 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d  cking for System
9020: 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75 69  .Data.SQLite bui
9030: 6c 64 20 5c 22 22 20 5b 65 78 70 72 20 5c 0d 0a  ld \"" [expr \..
9040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9050: 7b 24 6e 61 74 69 76 65 20 3f 20 22 6e 61 74 69  {$native ? "nati
9060: 76 65 2f 22 20 3a 20 22 22 7d 5d 20 5b 65 78 70  ve/" : ""}] [exp
9070: 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  r {[string lengt
9080: 68 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h \..           
9090: 20 20 20 20 20 24 70 6c 61 74 66 6f 72 6d 5d 20       $platform] 
90a0: 3e 20 30 20 3f 20 5b 61 70 70 65 6e 64 41 72 67  > 0 ? [appendArg
90b0: 73 20 24 70 6c 61 74 66 6f 72 6d 20 2f 5d 20 3a  s $platform /] :
90c0: 20 22 22 7d 5d 20 24 79 65 61 72 20 5c 0d 0a 20   ""}] $year \.. 
90d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
90e0: 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20   $configuration 
90f0: 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20  "\"... "]....   
9100: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
9110: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
9120: 42 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 79 20  Build the fully 
9130: 71 75 61 6c 69 66 69 65 64 20 64 69 72 65 63 74  qualified direct
9140: 6f 72 79 20 77 68 65 72 65 20 74 68 65 20 6e 65  ory where the ne
9150: 63 65 73 73 61 72 79 0d 0a 20 20 20 20 20 20 20  cessary..       
9160: 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6d       #       com
9170: 70 6f 6e 65 6e 74 73 20 66 6f 72 20 53 79 73 74  ponents for Syst
9180: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 73  em.Data.SQLite s
9190: 68 6f 75 6c 64 20 62 65 20 66 6f 75 6e 64 2e 0d  hould be found..
91a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
91b0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
91c0: 64 69 72 65 63 74 6f 72 79 20 5b 6a 6f 69 6e 42  directory [joinB
91d0: 75 69 6c 64 44 69 72 65 63 74 6f 72 79 20 24 6e  uildDirectory $n
91e0: 61 74 69 76 65 20 5c 0d 0a 20 20 20 20 20 20 20  ative \..       
91f0: 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 75 69           [getBui
9200: 6c 64 42 61 73 65 44 69 72 65 63 74 6f 72 79 5d  ldBaseDirectory]
9210: 20 24 79 65 61 72 20 24 70 6c 61 74 66 6f 72 6d   $year $platform
9220: 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d   $configuration]
9230: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
9240: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  #..            #
9250: 20 4e 4f 54 45 3a 20 44 6f 20 74 68 65 20 6e 65   NOTE: Do the ne
9260: 63 65 73 73 61 72 79 20 66 69 6c 65 73 20 65 78  cessary files ex
9270: 69 73 74 3f 20 20 43 75 72 72 65 6e 74 6c 79 2c  ist?  Currently,
9280: 20 6e 6f 20 6f 74 68 65 72 20 73 74 65 70 73 0d   no other steps.
9290: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20  .            #  
92a0: 20 20 20 20 20 61 72 65 20 74 61 6b 65 6e 20 74       are taken t
92b0: 6f 20 76 65 72 69 66 79 20 74 68 69 73 20 62 75  o verify this bu
92c0: 69 6c 64 20 69 73 20 61 63 74 75 61 6c 6c 79 20  ild is actually 
92d0: 76 69 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20  viable...       
92e0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
92f0: 20 20 20 20 69 66 20 7b 5b 69 73 42 75 69 6c 64      if {[isBuild
9300: 41 76 61 69 6c 61 62 6c 65 20 24 6e 61 74 69 76  Available $nativ
9310: 65 20 24 64 69 72 65 63 74 6f 72 79 5d 7d 20 74  e $directory]} t
9320: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
9330: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
9340: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 68        # NOTE: Wh
9350: 65 6e 20 69 6e 20 22 73 65 6c 65 63 74 22 20 6d  en in "select" m
9360: 6f 64 65 2c 20 61 75 74 6f 6d 61 74 69 63 61 6c  ode, automatical
9370: 6c 79 20 73 65 6c 65 63 74 20 74 68 65 20 66 69  ly select the fi
9380: 72 73 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20  rst..           
9390: 20 20 20 23 20 20 20 20 20 20 20 61 76 61 69 6c     #       avail
93a0: 61 62 6c 65 20 62 75 69 6c 64 20 6f 66 20 53 79  able build of Sy
93b0: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
93c0: 20 61 6e 64 20 74 68 65 6e 20 72 65 74 75 72 6e   and then return
93d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
93e0: 23 20 20 20 20 20 20 20 69 6d 6d 65 64 69 61 74  #       immediat
93f0: 65 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ely...          
9400: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
9410: 20 20 20 20 20 69 66 20 7b 24 73 65 6c 65 63 74       if {$select
9420: 20 26 26 20 5b 6d 61 74 63 68 4d 61 63 68 69 6e   && [matchMachin
9430: 65 20 24 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68  e $platform]} th
9440: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
9450: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
9460: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
9470: 20 4d 61 6e 75 61 6c 6c 79 20 6f 76 65 72 72 69   Manually overri
9480: 64 65 20 61 6c 6c 20 74 68 65 20 62 75 69 6c 64  de all the build
9490: 20 64 69 72 65 63 74 6f 72 79 20 73 65 6c 65 63   directory selec
94a0: 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  tion..          
94b0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65        #       re
94c0: 6c 61 74 65 64 20 74 65 73 74 20 73 65 74 74 69  lated test setti
94d0: 6e 67 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ngs in order to 
94e0: 66 6f 72 63 65 20 74 68 69 73 20 62 75 69 6c 64  force this build
94f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
9500: 20 20 23 20 20 20 20 20 20 20 6f 66 20 53 79 73    #       of Sys
9510: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
9520: 74 6f 20 62 65 20 75 73 65 64 2e 0d 0a 20 20 20  to be used...   
9530: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
9540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9550: 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49 6e  object invoke In
9560: 74 65 72 70 72 65 74 65 72 2e 47 65 74 41 63 74  terpreter.GetAct
9570: 69 76 65 20 5b 65 78 70 72 20 7b 24 6e 61 74 69  ive [expr {$nati
9580: 76 65 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ve ? \..        
9590: 20 20 20 20 20 20 20 20 20 20 20 20 22 41 64 64              "Add
95a0: 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 22 20 3a  RuntimeOption" :
95b0: 20 22 52 65 6d 6f 76 65 52 75 6e 74 69 6d 65 4f   "RemoveRuntimeO
95c0: 70 74 69 6f 6e 22 7d 5d 20 20 6e 61 74 69 76 65  ption"}]  native
95d0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
95e0: 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74 5f 79      set ::test_y
95f0: 65 61 72 20 24 79 65 61 72 0d 0a 20 20 20 20 20  ear $year..     
9600: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a             set :
9610: 3a 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d 20 24  :test_platform $
9620: 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20  platform..      
9630: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a            set ::
9640: 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69  test_configurati
9650: 6f 6e 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f  on $configuratio
9660: 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n....           
9670: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
9680: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
9690: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
96a0: 20 20 20 20 20 20 20 22 79 65 73 2c 20 73 65 6c         "yes, sel
96b0: 65 63 74 65 64 20 28 22 20 5b 65 78 70 72 20 7b  ected (" [expr {
96c0: 24 6e 61 74 69 76 65 20 3f 20 22 6e 61 74 69 76  $native ? "nativ
96d0: 65 2f 22 20 3a 20 22 22 7d 5d 20 5c 0d 0a 20 20  e/" : ""}] \..  
96e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96f0: 20 20 5b 65 78 70 72 20 7b 5b 73 74 72 69 6e 67    [expr {[string
9700: 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72   length $platfor
9710: 6d 5d 20 3e 20 30 20 3f 20 5b 61 70 70 65 6e 64  m] > 0 ? [append
9720: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
9730: 20 20 20 20 20 20 20 20 20 20 20 20 24 70 6c 61              $pla
9740: 74 66 6f 72 6d 20 2f 5d 20 3a 20 22 22 7d 5d 20  tform /] : ""}] 
9750: 24 79 65 61 72 20 2f 20 24 63 6f 6e 66 69 67 75  $year / $configu
9760: 72 61 74 69 6f 6e 20 22 29 5c 6e 22 5d 0d 0a 0d  ration ")\n"]...
9770: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9780: 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20   return true..  
9790: 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
97a0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
97b0: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
97c0: 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20  nnel yes\n..    
97d0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
97e0: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
97f0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
9800: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
9810: 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  no\n..          
9820: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
9830: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
9840: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
9850: 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20  turn false..    
9860: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
9870: 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 52 65 6c  heckForSQLiteRel
9880: 65 61 73 65 73 20 7b 20 63 68 61 6e 6e 65 6c 20  eases { channel 
9890: 7b 73 65 6c 65 63 74 20 66 61 6c 73 65 7d 20 7d  {select false} }
98a0: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
98b0: 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
98c0: 20 66 6f 72 20 70 61 73 74 20 72 65 6c 65 61 73   for past releas
98d0: 65 73 20 6f 66 20 53 79 73 74 65 6d 2e 44 61 74  es of System.Dat
98e0: 61 2e 53 51 4c 69 74 65 20 69 6e 20 74 68 65 20  a.SQLite in the 
98f0: 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20  directory..     
9900: 20 23 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e   #       contain
9910: 65 64 20 69 6e 20 74 68 65 20 22 53 79 73 74 65  ed in the "Syste
9920: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 22 20 65  m.Data.SQLite" e
9930: 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61  nvironment varia
9940: 62 6c 65 2c 20 69 66 0d 0a 20 20 20 20 20 20 23  ble, if..      #
9950: 20 20 20 20 20 20 20 70 72 65 73 65 6e 74 2e 0d         present..
9960: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
9970: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
9980: 20 3a 3a 65 6e 76 28 53 79 73 74 65 6d 2e 44 61   ::env(System.Da
9990: 74 61 2e 53 51 4c 69 74 65 29 5d 20 26 26 20 5c  ta.SQLite)] && \
99a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
99b0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 65 6e  ing length $::en
99c0: 76 28 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  v(System.Data.SQ
99d0: 4c 69 74 65 29 5d 20 3e 20 30 7d 20 74 68 65 6e  Lite)] > 0} then
99e0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
99f0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42         # NOTE: B
9a00: 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 79 20 71  uild the fully q
9a10: 75 61 6c 69 66 69 65 64 20 64 69 72 65 63 74 6f  ualified directo
9a20: 72 79 20 77 68 65 72 65 20 74 68 65 20 6e 65 63  ry where the nec
9a30: 65 73 73 61 72 79 0d 0a 20 20 20 20 20 20 20 20  essary..        
9a40: 23 20 20 20 20 20 20 20 63 6f 6d 70 6f 6e 65 6e  #       componen
9a50: 74 73 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61  ts for System.Da
9a60: 74 61 2e 53 51 4c 69 74 65 20 73 68 6f 75 6c 64  ta.SQLite should
9a70: 20 62 65 20 66 6f 75 6e 64 2e 0d 0a 20 20 20 20   be found...    
9a80: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
9a90: 65 74 20 64 69 72 65 63 74 6f 72 79 20 5b 66 69  et directory [fi
9aa0: 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
9ab0: 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20  ile join \..    
9ac0: 20 20 20 20 20 20 20 20 24 3a 3a 65 6e 76 28 53          $::env(S
9ad0: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
9ae0: 65 29 20 5b 67 65 74 52 65 6c 65 61 73 65 56 65  e) [getReleaseVe
9af0: 72 73 69 6f 6e 5d 5d 5d 0d 0a 0d 0a 20 20 20 20  rsion]]]....    
9b00: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
9b10: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
9b20: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
9b30: 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
9b40: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
9b50: 69 74 65 20 72 65 6c 65 61 73 65 20 5c 22 22 20  ite release \"" 
9b60: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24  \..            $
9b70: 64 69 72 65 63 74 6f 72 79 20 22 5c 22 2e 2e 2e  directory "\"...
9b80: 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69   "]....        i
9b90: 66 20 7b 5b 69 73 52 65 6c 65 61 73 65 41 76 61  f {[isReleaseAva
9ba0: 69 6c 61 62 6c 65 20 24 64 69 72 65 63 74 6f 72  ilable $director
9bb0: 79 20 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65  y platform]} the
9bc0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
9bd0: 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
9be0: 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3d 3d 20  h $platform] == 
9bf0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
9c00: 20 20 20 20 20 20 20 73 65 74 20 70 6c 61 74 66         set platf
9c10: 6f 72 6d 20 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20  orm unknown..   
9c20: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
9c30: 20 20 20 20 20 20 69 66 20 7b 24 73 65 6c 65 63        if {$selec
9c40: 74 20 26 26 20 5b 6d 61 74 63 68 4d 61 63 68 69  t && [matchMachi
9c50: 6e 65 20 24 70 6c 61 74 66 6f 72 6d 5d 7d 20 74  ne $platform]} t
9c60: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
9c70: 20 20 20 73 65 74 20 3a 3a 62 75 69 6c 64 5f 64     set ::build_d
9c80: 69 72 65 63 74 6f 72 79 20 24 64 69 72 65 63 74  irectory $direct
9c90: 6f 72 79 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ory....         
9ca0: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
9cb0: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79  l [appendArgs "y
9cc0: 65 73 2c 20 73 65 6c 65 63 74 65 64 20 28 22 20  es, selected (" 
9cd0: 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d  $platform ")\n"]
9ce0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
9cf0: 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20  return true..   
9d00: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
9d10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
9d20: 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
9d30: 65 6e 64 41 72 67 73 20 22 79 65 73 20 28 22 20  endArgs "yes (" 
9d40: 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d  $platform ")\n"]
9d50: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
9d60: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
9d70: 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
9d80: 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a   $channel no\n..
9d90: 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65  ..          fore
9da0: 61 63 68 20 70 61 74 68 20 5b 6c 73 6f 72 74 20  ach path [lsort 
9db0: 2d 64 65 63 72 65 61 73 69 6e 67 20 5b 66 69 6c  -decreasing [fil
9dc0: 65 20 6c 69 73 74 20 24 64 69 72 65 63 74 6f 72  e list $director
9dd0: 79 20 2a 5d 5d 20 7b 0d 0a 20 20 20 20 20 20 20  y *]] {..       
9de0: 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65       if {[file e
9df0: 78 69 73 74 73 20 24 70 61 74 68 5d 20 26 26 20  xists $path] && 
9e00: 5b 66 69 6c 65 20 69 73 64 69 72 65 63 74 6f 72  [file isdirector
9e10: 79 20 24 70 61 74 68 5d 7d 20 74 68 65 6e 20 7b  y $path]} then {
9e20: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
9e30: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
9e40: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
9e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e60: 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
9e70: 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  or System.Data.S
9e80: 51 4c 69 74 65 20 72 65 6c 65 61 73 65 20 5c 22  QLite release \"
9e90: 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
9ea0: 20 20 20 20 20 20 20 24 70 61 74 68 20 22 5c 22         $path "\"
9eb0: 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20  ... "]....      
9ec0: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 73 52          if {[isR
9ed0: 65 6c 65 61 73 65 41 76 61 69 6c 61 62 6c 65 20  eleaseAvailable 
9ee0: 24 70 61 74 68 20 70 6c 61 74 66 6f 72 6d 5d 7d  $path platform]}
9ef0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
9f00: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74           if {[st
9f10: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61  ring length $pla
9f20: 74 66 6f 72 6d 5d 20 3d 3d 20 30 7d 20 74 68 65  tform] == 0} the
9f30: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
9f40: 20 20 20 20 20 20 20 73 65 74 20 70 6c 61 74 66         set platf
9f50: 6f 72 6d 20 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20  orm unknown..   
9f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
9f70: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
9f80: 20 20 69 66 20 7b 24 73 65 6c 65 63 74 20 26 26    if {$select &&
9f90: 20 5b 6d 61 74 63 68 4d 61 63 68 69 6e 65 20 24   [matchMachine $
9fa0: 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20  platform]} then 
9fb0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
9fc0: 20 20 20 20 20 73 65 74 20 3a 3a 62 75 69 6c 64       set ::build
9fd0: 5f 64 69 72 65 63 74 6f 72 79 20 24 70 61 74 68  _directory $path
9fe0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
9ff0: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
a000: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
a010: 20 22 79 65 73 2c 20 73 65 6c 65 63 74 65 64 20   "yes, selected 
a020: 28 22 20 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c  (" $platform ")\
a030: 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  n"]....         
a040: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
a050: 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20  true..          
a060: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
a070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a080: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
a090: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79 65   [appendArgs "ye
a0a0: 73 20 28 22 20 24 70 6c 61 74 66 6f 72 6d 20 22  s (" $platform "
a0b0: 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  )\n"]..         
a0c0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
a0d0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
a0e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a0f0: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
a100: 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20   no\n..         
a110: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
a120: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
a130: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
a140: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
a150: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
a160: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
a170: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
a180: 20 22 2d 2d 2d 2d 20 65 6e 76 69 72 6f 6e 6d 65   "---- environme
a190: 6e 74 20 76 61 72 69 61 62 6c 65 20 5c 22 53 79  nt variable \"Sy
a1a0: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
a1b0: 5c 22 20 69 73 20 6e 6f 74 20 22 20 5c 0d 0a 20  \" is not " \.. 
a1c0: 20 20 20 20 20 20 20 20 20 20 20 22 73 65 74 2c             "set,
a1d0: 20 73 6b 69 70 70 69 6e 67 20 63 68 65 63 6b 20   skipping check 
a1e0: 66 6f 72 20 72 65 6c 65 61 73 65 73 2e 2e 2e 5c  for releases...\
a1f0: 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  n"]..      }....
a200: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
a210: 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  se..    }.....  
a220: 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53    proc checkForS
a230: 51 4c 69 74 65 4c 69 62 72 61 72 79 20 7b 20 63  QLiteLibrary { c
a240: 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20  hannel } {..    
a250: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
a260: 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20   "---- checking 
a270: 66 6f 72 20 53 51 4c 69 74 65 20 63 6f 72 65 20  for SQLite core 
a280: 6c 69 62 72 61 72 79 2e 2e 2e 20 22 0d 0a 0d 0a  library... "....
a290: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
a2a0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
a2b0: 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
a2c0: 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
a2d0: 63 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  c System.Data.SQ
a2e0: 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 5c 0d 0a  Lite.SQLite3 \..
a2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
a300: 4c 69 74 65 56 65 72 73 69 6f 6e 7d 20 76 65 72  LiteVersion} ver
a310: 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sion] == 0} then
a320: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
a330: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
a340: 68 65 63 6b 20 69 66 20 74 68 65 20 72 65 74 75  heck if the retu
a350: 72 6e 65 64 20 76 65 72 73 69 6f 6e 20 77 61 73  rned version was
a360: 20 6e 75 6c 6c 2e 20 20 49 66 20 73 6f 2c 20 6d   null.  If so, m
a370: 61 6b 65 20 69 74 20 65 61 73 79 0d 0a 20 20 20  ake it easy..   
a380: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20       #       to 
a390: 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  spot...        #
a3a0: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73  ..        if {[s
a3b0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65  tring length $ve
a3c0: 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65  rsion] == 0} the
a3d0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
a3e0: 65 74 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d  et version null.
a3f0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
a400: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
a410: 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
a420: 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f   to query the Fo
a430: 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e  ssil source iden
a440: 74 69 66 69 65 72 20 66 6f 72 20 74 68 65 20 53  tifier for the S
a450: 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 20 20 23  QLite..        #
a460: 20 20 20 20 20 20 20 63 6f 72 65 20 6c 69 62 72         core libr
a470: 61 72 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ary...        #.
a480: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
a490: 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
a4a0: 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
a4b0: 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
a4c0: 50 75 62 6c 69 63 20 53 79 73 74 65 6d 2e 44 61  Public System.Da
a4d0: 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65  ta.SQLite.SQLite
a4e0: 33 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  3 \..           
a4f0: 20 20 20 20 20 53 51 4c 69 74 65 53 6f 75 72 63       SQLiteSourc
a500: 65 49 64 7d 20 73 6f 75 72 63 65 49 64 5d 7d 20  eId} sourceId]} 
a510: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
a520: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
a530: 20 4e 4f 54 45 3a 20 57 65 20 66 61 69 6c 65 64   NOTE: We failed
a540: 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f   to query the Fo
a550: 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e  ssil source iden
a560: 74 69 66 69 65 72 2e 0d 0a 20 20 20 20 20 20 20  tifier...       
a570: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
a580: 73 65 74 20 73 6f 75 72 63 65 49 64 20 75 6e 6b  set sourceId unk
a590: 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d  nown..        }.
a5a0: 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
a5b0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
a5c0: 65 63 6b 20 69 66 20 74 68 65 20 72 65 74 75 72  eck if the retur
a5d0: 6e 65 64 20 46 6f 73 73 69 6c 20 73 6f 75 72 63  ned Fossil sourc
a5e0: 65 20 69 64 65 6e 74 69 66 69 65 72 20 77 61 73  e identifier was
a5f0: 20 6e 75 6c 6c 2e 20 20 49 66 0d 0a 20 20 20 20   null.  If..    
a600: 20 20 20 20 23 20 20 20 20 20 20 20 73 6f 2c 20      #       so, 
a610: 6d 61 6b 65 20 69 74 20 65 61 73 79 20 74 6f 20  make it easy to 
a620: 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  spot...        #
a630: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73  ..        if {[s
a640: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 6f  tring length $so
a650: 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68  urceId] == 0} th
a660: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
a670: 73 65 74 20 73 6f 75 72 63 65 49 64 20 6e 75 6c  set sourceId nul
a680: 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  l..        }....
a690: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
a6a0: 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20     # NOTE: Yes, 
a6b0: 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20  the SQLite core 
a6c0: 6c 69 62 72 61 72 79 20 61 70 70 65 61 72 73 20  library appears 
a6d0: 74 6f 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2e  to be available.
a6e0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
a6f0: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
a700: 6e 74 20 53 51 4c 69 74 65 0d 0a 0d 0a 20 20 20  nt SQLite....   
a710: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
a720: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
a730: 22 79 65 73 20 28 22 20 24 76 65 72 73 69 6f 6e  "yes (" $version
a740: 20 22 20 22 20 24 73 6f 75 72 63 65 49 64 20 22   " " $sourceId "
a750: 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65  )\n"]..      } e
a760: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
a770: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
a780: 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  \n..      }..   
a790: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
a7a0: 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 49 6e  checkForSQLiteIn
a7b0: 74 65 72 6f 70 20 7b 20 63 68 61 6e 6e 65 6c 20  terop { channel 
a7c0: 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73  } {..      tputs
a7d0: 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
a7e0: 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 51 4c  checking for SQL
a7f0: 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65  ite interop asse
a800: 6d 62 6c 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  mbly... "....   
a810: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
a820: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  .              o
a830: 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
a840: 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 53  ags +NonPublic S
a850: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
a860: 65 2e 53 51 4c 69 74 65 33 20 5c 0d 0a 20 20 20  e.SQLite3 \..   
a870: 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 72             Inter
a880: 6f 70 56 65 72 73 69 6f 6e 7d 20 76 65 72 73 69  opVersion} versi
a890: 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  on] == 0} then {
a8a0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
a8b0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
a8c0: 63 6b 20 69 66 20 74 68 65 20 72 65 74 75 72 6e  ck if the return
a8d0: 65 64 20 76 65 72 73 69 6f 6e 20 77 61 73 20 6e  ed version was n
a8e0: 75 6c 6c 2e 20 20 49 66 20 73 6f 2c 20 6d 61 6b  ull.  If so, mak
a8f0: 65 20 69 74 20 65 61 73 79 0d 0a 20 20 20 20 20  e it easy..     
a900: 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 73 70     #       to sp
a910: 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ot...        #..
a920: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
a930: 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72 73  ing length $vers
a940: 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ion] == 0} then 
a950: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
a960: 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20   version null.. 
a970: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
a980: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
a990: 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
a9a0: 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f 73 73  o query the Foss
a9b0: 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69  il source identi
a9c0: 66 69 65 72 20 66 6f 72 20 74 68 65 20 53 51 4c  fier for the SQL
a9d0: 69 74 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ite..        #  
a9e0: 20 20 20 20 20 63 6f 72 65 20 6c 69 62 72 61 72       core librar
a9f0: 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  y...        #.. 
aa00: 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
aa10: 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
aa20: 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
aa30: 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
aa40: 62 6c 69 63 20 53 79 73 74 65 6d 2e 44 61 74 61  blic System.Data
aa50: 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20  .SQLite.SQLite3 
aa60: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
aa70: 20 20 20 49 6e 74 65 72 6f 70 53 6f 75 72 63 65     InteropSource
aa80: 49 64 7d 20 73 6f 75 72 63 65 49 64 5d 7d 20 74  Id} sourceId]} t
aa90: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
aaa0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
aab0: 4e 4f 54 45 3a 20 57 65 20 66 61 69 6c 65 64 20  NOTE: We failed 
aac0: 74 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f 73  to query the Fos
aad0: 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74  sil source ident
aae0: 69 66 69 65 72 2e 0d 0a 20 20 20 20 20 20 20 20  ifier...        
aaf0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73    #..          s
ab00: 65 74 20 73 6f 75 72 63 65 49 64 20 75 6e 6b 6e  et sourceId unkn
ab10: 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  own..        }..
ab20: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
ab30: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
ab40: 63 6b 20 69 66 20 74 68 65 20 72 65 74 75 72 6e  ck if the return
ab50: 65 64 20 46 6f 73 73 69 6c 20 73 6f 75 72 63 65  ed Fossil source
ab60: 20 69 64 65 6e 74 69 66 69 65 72 20 77 61 73 20   identifier was 
ab70: 6e 75 6c 6c 2e 20 20 49 66 0d 0a 20 20 20 20 20  null.  If..     
ab80: 20 20 20 23 20 20 20 20 20 20 20 73 6f 2c 20 6d     #       so, m
ab90: 61 6b 65 20 69 74 20 65 61 73 79 20 74 6f 20 73  ake it easy to s
aba0: 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  pot...        #.
abb0: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74  .        if {[st
abc0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 6f 75  ring length $sou
abd0: 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65  rceId] == 0} the
abe0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
abf0: 65 74 20 73 6f 75 72 63 65 49 64 20 6e 75 6c 6c  et sourceId null
ac00: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
ac10: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
ac20: 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 74    # NOTE: Yes, t
ac30: 68 65 20 53 51 4c 69 74 65 20 69 6e 74 65 72 6f  he SQLite intero
ac40: 70 20 61 73 73 65 6d 62 6c 79 20 61 70 70 65 61  p assembly appea
ac50: 72 73 20 74 6f 20 62 65 20 61 76 61 69 6c 61 62  rs to be availab
ac60: 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  le...        #..
ac70: 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
ac80: 72 61 69 6e 74 20 53 51 4c 69 74 65 49 6e 74 65  raint SQLiteInte
ac90: 72 6f 70 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74  rop....        t
aca0: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
acb0: 70 70 65 6e 64 41 72 67 73 20 22 79 65 73 20 28  ppendArgs "yes (
acc0: 22 20 24 76 65 72 73 69 6f 6e 20 22 20 22 20 24  " $version " " $
acd0: 73 6f 75 72 63 65 49 64 20 22 29 5c 6e 22 5d 0d  sourceId ")\n"].
ace0: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
acf0: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
ad00: 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20  channel no\n..  
ad10: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
ad20: 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46  .    proc checkF
ad30: 6f 72 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f  orSQLiteDefineCo
ad40: 6e 73 74 61 6e 74 20 7b 20 63 68 61 6e 6e 65 6c  nstant { channel
ad50: 20 6e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20   name } {..     
ad60: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
ad70: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
ad80: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
ad90: 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74  hecking for Syst
ada0: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 64  em.Data.SQLite d
adb0: 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74 20 5c  efine constant \
adc0: 22 22 20 24 6e 61 6d 65 20 5c 0d 0a 20 20 20 20  "" $name \..    
add0: 20 20 20 20 20 20 22 5c 22 2e 2e 2e 20 22 5d 0d        "\"... "].
ade0: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  ...      if {[ca
adf0: 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
ae00: 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
ae10: 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
ae20: 62 6c 69 63 20 53 79 73 74 65 6d 2e 44 61 74 61  blic System.Data
ae30: 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20  .SQLite.SQLite3 
ae40: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
ae50: 20 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73   DefineConstants
ae60: 7d 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74  } defineConstant
ae70: 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  s] == 0} then {.
ae80: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 73  .        if {[ls
ae90: 65 61 72 63 68 20 2d 65 78 61 63 74 20 2d 6e 6f  earch -exact -no
aea0: 63 61 73 65 20 24 64 65 66 69 6e 65 43 6f 6e 73  case $defineCons
aeb0: 74 61 6e 74 73 20 24 6e 61 6d 65 5d 20 21 3d 20  tants $name] != 
aec0: 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  -1} then {..    
aed0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
aee0: 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20     # NOTE: Yes, 
aef0: 74 68 69 73 20 64 65 66 69 6e 65 20 63 6f 6e 73  this define cons
af00: 74 61 6e 74 20 77 61 73 20 65 6e 61 62 6c 65 64  tant was enabled
af10: 20 77 68 65 6e 20 74 68 65 20 6d 61 6e 61 67 65   when the manage
af20: 64 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  d..          #  
af30: 20 20 20 20 20 61 73 73 65 6d 62 6c 79 20 77 61       assembly wa
af40: 73 20 63 6f 6d 70 69 6c 65 64 2e 0d 0a 20 20 20  s compiled...   
af50: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
af60: 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
af70: 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 64 65  t [appendArgs de
af80: 66 69 6e 65 43 6f 6e 73 74 61 6e 74 2e 53 79 73  fineConstant.Sys
af90: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
afa0: 20 24 6e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20   $name]....     
afb0: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
afc0: 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20  nel yes\n..     
afd0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
afe0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
aff0: 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20  annel no\n..    
b000: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65      }..      } e
b010: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
b020: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 65 72  puts $channel er
b030: 72 6f 72 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a  ror\n..      }..
b040: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
b050: 6f 63 20 67 65 74 44 61 74 65 54 69 6d 65 46 6f  oc getDateTimeFo
b060: 72 6d 61 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  rmat {} {..     
b070: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
b080: 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  : This procedure
b090: 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 73 20   simply returns 
b0a0: 74 68 65 20 22 64 65 66 61 75 6c 74 22 20 44 61  the "default" Da
b0b0: 74 65 54 69 6d 65 20 66 6f 72 6d 61 74 20 75 73  teTime format us
b0c0: 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ed..      #     
b0d0: 20 20 62 79 20 74 68 65 20 74 65 73 74 20 73 75    by the test su
b0e0: 69 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ite...      #.. 
b0f0: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
b100: 78 69 73 74 73 20 3a 3a 64 61 74 65 74 69 6d 65  xists ::datetime
b110: 5f 66 6f 72 6d 61 74 5d 20 26 26 20 5c 0d 0a 20  _format] && \.. 
b120: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
b130: 20 6c 65 6e 67 74 68 20 24 3a 3a 64 61 74 65 74   length $::datet
b140: 69 6d 65 5f 66 6f 72 6d 61 74 5d 20 3e 20 30 7d  ime_format] > 0}
b150: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
b160: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
b170: 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65 20 6d  TE: Return the m
b180: 61 6e 75 61 6c 6c 79 20 6f 76 65 72 72 69 64 64  anually overridd
b190: 65 6e 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  en value for the
b1a0: 20 44 61 74 65 54 69 6d 65 20 66 6f 72 6d 61 74   DateTime format
b1b0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
b1c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
b1d0: 64 61 74 65 74 69 6d 65 5f 66 6f 72 6d 61 74 0d  datetime_format.
b1e0: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
b1f0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
b200: 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75      # NOTE: Retu
b210: 72 6e 20 61 6e 20 49 53 4f 38 36 30 31 20 44 61  rn an ISO8601 Da
b220: 74 65 54 69 6d 65 20 66 6f 72 6d 61 74 20 63 6f  teTime format co
b230: 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 53 51  mpatible with SQ
b240: 4c 69 74 65 2c 0d 0a 20 20 20 20 20 20 20 20 23  Lite,..        #
b250: 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
b260: 74 61 2e 53 51 4c 69 74 65 2c 20 61 6e 64 20 73  ta.SQLite, and s
b270: 75 69 74 61 62 6c 65 20 66 6f 72 20 72 6f 75 6e  uitable for roun
b280: 64 2d 74 72 69 70 70 69 6e 67 20 77 69 74 68 20  d-tripping with 
b290: 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  the..        #  
b2a0: 20 20 20 20 20 44 61 74 65 54 69 6d 65 20 63 6c       DateTime cl
b2b0: 61 73 73 20 6f 66 20 74 68 65 20 66 72 61 6d 65  ass of the frame
b2c0: 77 6f 72 6b 2e 20 20 49 66 20 74 68 69 73 20 76  work.  If this v
b2d0: 61 6c 75 65 20 69 73 20 63 68 61 6e 67 65 64 2c  alue is changed,
b2e0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
b2f0: 20 20 76 61 72 69 6f 75 73 20 74 65 73 74 73 20    various tests 
b300: 6d 61 79 20 66 61 69 6c 2e 0d 0a 20 20 20 20 20  may fail...     
b310: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
b320: 74 75 72 6e 20 22 79 79 79 79 2d 4d 4d 2d 64 64  turn "yyyy-MM-dd
b330: 20 48 48 3a 6d 6d 3a 73 73 2e 46 46 46 46 46 46   HH:mm:ss.FFFFFF
b340: 46 4b 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  FK"..      }..  
b350: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
b360: 20 65 6e 75 6d 65 72 61 62 6c 65 54 6f 4c 69 73   enumerableToLis
b370: 74 20 7b 20 65 6e 75 6d 65 72 61 62 6c 65 20 7d  t { enumerable }
b380: 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 72 65   {..      set re
b390: 73 75 6c 74 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20  sult [list].... 
b3a0: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
b3b0: 20 6c 65 6e 67 74 68 20 24 65 6e 75 6d 65 72 61   length $enumera
b3c0: 62 6c 65 5d 20 3d 3d 20 30 20 7c 7c 20 24 65 6e  ble] == 0 || $en
b3d0: 75 6d 65 72 61 62 6c 65 20 65 71 20 22 6e 75 6c  umerable eq "nul
b3e0: 6c 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  l"} then {..    
b3f0: 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73 75      return $resu
b400: 6c 74 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  lt..      }.... 
b410: 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65       object fore
b420: 61 63 68 20 2d 61 6c 69 61 73 20 69 74 65 6d 20  ach -alias item 
b430: 24 65 6e 75 6d 65 72 61 62 6c 65 20 7b 0d 0a 20  $enumerable {.. 
b440: 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
b450: 6e 67 20 6c 65 6e 67 74 68 20 24 69 74 65 6d 5d  ng length $item]
b460: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
b470: 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
b480: 72 65 73 75 6c 74 20 5b 24 69 74 65 6d 20 54 6f  result [$item To
b490: 53 74 72 69 6e 67 5d 0d 0a 20 20 20 20 20 20 20  String]..       
b4a0: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
b4b0: 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73       return $res
b4c0: 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  ult..    }..... 
b4d0: 20 20 20 70 72 6f 63 20 63 61 74 63 68 41 6e 64     proc catchAnd
b4e0: 52 65 74 75 72 6e 20 7b 20 73 63 72 69 70 74 20  Return { script 
b4f0: 7b 73 74 61 63 6b 54 72 61 63 65 20 66 61 6c 73  {stackTrace fals
b500: 65 7d 20 7b 73 74 72 69 63 74 20 74 72 75 65 7d  e} {strict true}
b510: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
b520: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 45 76 61       # NOTE: Eva
b530: 6c 75 61 74 65 20 74 68 65 20 73 63 72 69 70 74  luate the script
b540: 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72   provided by our
b550: 20 63 61 6c 6c 65 72 20 69 6e 20 74 68 65 69 72   caller in their
b560: 20 63 6f 6e 74 65 78 74 2c 0d 0a 20 20 20 20 20   context,..     
b570: 20 23 20 20 20 20 20 20 20 63 61 70 74 75 72 69   #       capturi
b580: 6e 67 20 62 6f 74 68 20 74 68 65 20 72 65 73 75  ng both the resu
b590: 6c 74 20 61 6e 64 20 74 68 65 20 72 65 74 75 72  lt and the retur
b5a0: 6e 20 63 6f 64 65 2e 0d 0a 20 20 20 20 20 20 23  n code...      #
b5b0: 0d 0a 20 20 20 20 20 20 73 65 74 20 63 6f 64 65  ..      set code
b5c0: 20 5b 63 61 74 63 68 20 7b 75 70 6c 65 76 65 6c   [catch {uplevel
b5d0: 20 31 20 24 73 63 72 69 70 74 7d 20 72 65 73 75   1 $script} resu
b5e0: 6c 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  lt]....      #..
b5f0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 69        # NOTE: Di
b600: 64 20 74 68 65 20 73 63 72 69 70 74 20 70 72 6f  d the script pro
b610: 76 69 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c  vided by our cal
b620: 6c 65 72 20 4e 4f 54 20 72 61 69 73 65 20 61 6e  ler NOT raise an
b630: 20 65 72 72 6f 72 3f 0d 0a 20 20 20 20 20 20 23   error?..      #
b640: 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 73 74 72  ..      if {$str
b650: 69 63 74 20 26 26 20 24 63 6f 64 65 20 3d 3d 20  ict && $code == 
b660: 30 20 7c 7c 20 21 24 73 74 72 69 63 74 20 26 26  0 || !$strict &&
b670: 20 24 63 6f 64 65 20 21 3d 20 31 7d 20 74 68 65   $code != 1} the
b680: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
b690: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
b6a0: 53 75 63 63 65 73 73 2e 20 20 52 65 74 75 72 6e  Success.  Return
b6b0: 20 61 20 6c 69 73 74 20 77 69 74 68 20 74 68 65   a list with the
b6c0: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64   return code and
b6d0: 20 74 68 65 20 72 65 73 75 6c 74 2e 0d 0a 20 20   the result...  
b6e0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
b6f0: 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 24 63   return [list $c
b700: 6f 64 65 20 24 72 65 73 75 6c 74 5d 0d 0a 20 20  ode $result]..  
b710: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 73      } elseif {$s
b720: 74 61 63 6b 54 72 61 63 65 7d 20 74 68 65 6e 20  tackTrace} then 
b730: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
b740: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61        # NOTE: Fa
b750: 69 6c 75 72 65 2e 20 20 4f 75 72 20 63 61 6c 6c  ilure.  Our call
b760: 65 72 20 77 61 6e 74 73 20 61 20 66 75 6c 6c 20  er wants a full 
b770: 73 74 61 63 6b 20 74 72 61 63 65 20 28 69 66 20  stack trace (if 
b780: 61 70 70 6c 69 63 61 62 6c 65 29 2c 0d 0a 20 20  applicable),..  
b790: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65        #       re
b7a0: 74 75 72 6e 20 61 20 6c 69 73 74 20 77 69 74 68  turn a list with
b7b0: 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
b7c0: 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 20   and the result 
b7d0: 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20  verbatim...     
b7e0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
b7f0: 74 75 72 6e 20 5b 6c 69 73 74 20 24 63 6f 64 65  turn [list $code
b800: 20 24 72 65 73 75 6c 74 5d 0d 0a 20 20 20 20 20   $result]..     
b810: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
b820: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
b830: 4e 4f 54 45 3a 20 46 61 69 6c 75 72 65 2e 20 20  NOTE: Failure.  
b840: 4f 75 72 20 63 61 6c 6c 65 72 20 64 6f 65 73 20  Our caller does 
b850: 6e 6f 74 20 77 61 6e 74 20 61 20 66 75 6c 6c 20  not want a full 
b860: 73 74 61 63 6b 20 74 72 61 63 65 20 28 69 66 0d  stack trace (if.
b870: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
b880: 20 61 70 70 6c 69 63 61 62 6c 65 29 2c 20 72 65   applicable), re
b890: 74 75 72 6e 20 61 20 6c 69 73 74 20 77 69 74 68  turn a list with
b8a0: 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
b8b0: 2c 20 74 68 65 20 65 72 72 6f 72 0d 0a 20 20 20  , the error..   
b8c0: 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 64       #       cod
b8d0: 65 20 66 6f 72 20 74 68 65 20 69 6e 74 65 72 70  e for the interp
b8e0: 72 65 74 65 72 2c 20 61 6e 64 20 74 68 65 20 65  reter, and the e
b8f0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 75 70 20  rror message up 
b900: 74 6f 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  to the..        
b910: 23 20 20 20 20 20 20 20 70 6f 69 6e 74 20 77 68  #       point wh
b920: 65 72 65 20 74 68 65 20 73 74 61 63 6b 20 74 72  ere the stack tr
b930: 61 63 65 20 73 68 6f 75 6c 64 20 73 74 61 72 74  ace should start
b940: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
b950: 20 20 20 20 20 20 73 65 74 20 69 6e 64 65 78 20        set index 
b960: 5b 73 74 72 69 6e 67 20 66 69 72 73 74 20 22 20  [string first " 
b970: 20 20 61 74 20 22 20 24 72 65 73 75 6c 74 5d 3b    at " $result];
b980: 20 23 20 48 41 43 4b 3a 20 52 65 6c 69 61 62 6c   # HACK: Reliabl
b990: 65 3f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72 65  e?....        re
b9a0: 74 75 72 6e 20 5b 6c 69 73 74 20 24 63 6f 64 65  turn [list $code
b9b0: 20 24 3a 3a 65 72 72 6f 72 43 6f 64 65 20 5b 65   $::errorCode [e
b9c0: 78 70 72 20 7b 24 69 6e 64 65 78 20 21 3d 20 2d  xpr {$index != -
b9d0: 31 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  1 ? \..         
b9e0: 20 20 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20     [string trim 
b9f0: 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24 72  [string range $r
ba00: 65 73 75 6c 74 20 30 20 24 69 6e 64 65 78 5d 5d  esult 0 $index]]
ba10: 20 3a 20 24 72 65 73 75 6c 74 7d 5d 5d 0d 0a 20   : $result}]].. 
ba20: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
ba30: 0d 0a 20 20 20 20 70 72 6f 63 20 63 6f 6d 70 69  ..    proc compi
ba40: 6c 65 43 53 68 61 72 70 57 69 74 68 20 7b 0d 0a  leCSharpWith {..
ba50: 20 20 20 20 20 20 20 20 20 20 20 20 74 65 78 74              text
ba60: 20 6d 65 6d 6f 72 79 20 73 79 6d 62 6f 6c 73 20   memory symbols 
ba70: 73 74 72 69 63 74 20 72 65 73 75 6c 74 73 56 61  strict resultsVa
ba80: 72 4e 61 6d 65 20 65 72 72 6f 72 73 56 61 72 4e  rName errorsVarN
ba90: 61 6d 65 20 66 69 6c 65 4e 61 6d 65 73 0d 0a 20  ame fileNames.. 
baa0: 20 20 20 20 20 20 20 20 20 20 20 61 72 67 73 20             args 
bab0: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
bac0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 69 6e 63      # NOTE: Sinc
bad0: 65 20 77 65 20 61 72 65 20 67 6f 69 6e 67 20 74  e we are going t
bae0: 6f 20 75 73 65 20 74 68 69 73 20 6d 65 74 68 6f  o use this metho
baf0: 64 20 6e 61 6d 65 20 61 20 6c 6f 74 2c 20 61 73  d name a lot, as
bb00: 73 69 67 6e 20 69 74 20 74 6f 20 61 0d 0a 20 20  sign it to a..  
bb10: 20 20 20 20 23 20 20 20 20 20 20 20 76 61 72 69      #       vari
bb20: 61 62 6c 65 20 66 69 72 73 74 2e 0d 0a 20 20 20  able first...   
bb30: 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
bb40: 61 64 64 20 52 65 66 65 72 65 6e 63 65 64 41 73  add ReferencedAs
bb50: 73 65 6d 62 6c 69 65 73 2e 41 64 64 0d 0a 0d 0a  semblies.Add....
bb60: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
bb70: 20 4e 4f 54 45 3a 20 43 72 65 61 74 65 20 74 68   NOTE: Create th
bb80: 65 20 62 61 73 65 20 63 6f 6d 6d 61 6e 64 20 74  e base command t
bb90: 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 64 20 61  o evaluate and a
bba0: 64 64 20 74 68 65 20 70 72 6f 70 65 72 74 79 20  dd the property 
bbb0: 73 65 74 74 69 6e 67 73 0d 0a 20 20 20 20 20 20  settings..      
bbc0: 23 20 20 20 20 20 20 20 74 68 61 74 20 61 72 65  #       that are
bbd0: 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 6e   almost always n
bbe0: 65 65 64 65 64 20 62 79 20 6f 75 72 20 75 6e 69  eeded by our uni
bbf0: 74 20 74 65 73 74 73 20 28 69 2e 65 2e 20 74 68  t tests (i.e. th
bc00: 65 20 53 79 73 74 65 6d 0d 0a 20 20 20 20 20 20  e System..      
bc10: 23 20 20 20 20 20 20 20 61 6e 64 20 53 79 73 74  #       and Syst
bc20: 65 6d 2e 44 61 74 61 20 61 73 73 65 6d 62 6c 79  em.Data assembly
bc30: 20 72 65 66 65 72 65 6e 63 65 73 29 2e 0d 0a 20   references)... 
bc40: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65       #..      se
bc50: 74 20 63 6f 6d 6d 61 6e 64 20 5b 6c 69 73 74 20  t command [list 
bc60: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6d  \..          com
bc70: 70 69 6c 65 43 53 68 61 72 70 20 24 74 65 78 74  pileCSharp $text
bc80: 20 24 6d 65 6d 6f 72 79 20 24 73 79 6d 62 6f 6c   $memory $symbol
bc90: 73 20 24 73 74 72 69 63 74 20 72 65 73 75 6c 74  s $strict result
bca0: 73 20 65 72 72 6f 72 73 20 5c 0d 0a 20 20 20 20  s errors \..    
bcb0: 20 20 20 20 20 20 24 61 64 64 20 53 79 73 74 65        $add Syste
bcc0: 6d 2e 64 6c 6c 20 24 61 64 64 20 53 79 73 74 65  m.dll $add Syste
bcd0: 6d 2e 44 61 74 61 2e 64 6c 6c 20 24 61 64 64 20  m.Data.dll $add 
bce0: 53 79 73 74 65 6d 2e 54 72 61 6e 73 61 63 74 69  System.Transacti
bcf0: 6f 6e 73 2e 64 6c 6c 20 5c 0d 0a 20 20 20 20 20  ons.dll \..     
bd00: 20 20 20 20 20 24 61 64 64 20 53 79 73 74 65 6d       $add System
bd10: 2e 58 6d 6c 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20  .Xml.dll]....   
bd20: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
bd30: 54 45 3a 20 41 64 64 20 61 6c 6c 20 74 68 65 20  TE: Add all the 
bd40: 70 72 6f 76 69 64 65 64 20 66 69 6c 65 20 6e 61  provided file na
bd50: 6d 65 73 20 61 73 20 61 73 73 65 6d 62 6c 79 20  mes as assembly 
bd60: 72 65 66 65 72 65 6e 63 65 73 2e 0d 0a 20 20 20  references...   
bd70: 20 20 20 23 0d 0a 20 20 20 20 20 20 66 6f 72 65     #..      fore
bd80: 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 66 69  ach fileName $fi
bd90: 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
bda0: 20 20 20 6c 61 70 70 65 6e 64 20 63 6f 6d 6d 61     lappend comma
bdb0: 6e 64 20 24 61 64 64 20 5b 67 65 74 42 69 6e 61  nd $add [getBina
bdc0: 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  ryFileName $file
bdd0: 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  Name]..      }..
bde0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
bdf0: 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 74 68 65   # NOTE: Add the
be00: 20 65 78 74 72 61 20 61 72 67 75 6d 65 6e 74 73   extra arguments
be10: 2c 20 69 66 20 61 6e 79 2c 20 74 6f 20 74 68 65  , if any, to the
be20: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c   command to eval
be30: 75 61 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  uate...      #..
be40: 20 20 20 20 20 20 65 76 61 6c 20 6c 61 70 70 65        eval lappe
be50: 6e 64 20 63 6f 6d 6d 61 6e 64 20 24 61 72 67 73  nd command $args
be60: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
be70: 20 20 20 23 20 4e 4f 54 45 3a 20 41 6c 69 61 73     # NOTE: Alias
be80: 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 6c 6f   the compiler lo
be90: 63 61 6c 20 72 65 73 75 6c 74 73 20 61 6e 64 20  cal results and 
bea0: 65 72 72 6f 72 73 20 76 61 72 69 61 62 6c 65 73  errors variables
beb0: 20 74 6f 20 74 68 65 0d 0a 20 20 20 20 20 20 23   to the..      #
bec0: 20 20 20 20 20 20 20 76 61 72 69 61 62 6c 65 20         variable 
bed0: 6e 61 6d 65 73 20 70 72 6f 76 69 64 65 64 20 62  names provided b
bee0: 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20  y our caller... 
bef0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70       #..      up
bf00: 76 61 72 20 31 20 24 72 65 73 75 6c 74 73 56 61  var 1 $resultsVa
bf10: 72 4e 61 6d 65 20 72 65 73 75 6c 74 73 0d 0a 20  rName results.. 
bf20: 20 20 20 20 20 75 70 76 61 72 20 31 20 24 65 72       upvar 1 $er
bf30: 72 6f 72 73 56 61 72 4e 61 6d 65 20 65 72 72 6f  rorsVarName erro
bf40: 72 73 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  rs....      #.. 
bf50: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 45 76 61       # NOTE: Eva
bf60: 6c 75 61 74 65 20 74 68 65 20 63 6f 6e 73 74 72  luate the constr
bf70: 75 63 74 65 64 20 5b 63 6f 6d 70 69 6c 65 43 53  ucted [compileCS
bf80: 68 61 72 70 5d 20 63 6f 6d 6d 61 6e 64 20 61 6e  harp] command an
bf90: 64 20 72 65 74 75 72 6e 20 74 68 65 0d 0a 20 20  d return the..  
bfa0: 20 20 20 20 23 20 20 20 20 20 20 20 72 65 73 75      #       resu
bfb0: 6c 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  lt...      #..  
bfc0: 20 20 20 20 65 76 61 6c 20 24 63 6f 6d 6d 61 6e      eval $comman
bfd0: 64 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  d..    }.....   
bfe0: 20 70 72 6f 63 20 69 73 4d 65 6d 6f 72 79 44 62   proc isMemoryDb
bff0: 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d   { fileName } {.
c000: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
c010: 23 20 4e 4f 54 45 3a 20 49 73 20 74 68 65 20 73  # NOTE: Is the s
c020: 70 65 63 69 66 69 65 64 20 64 61 74 61 62 61 73  pecified databas
c030: 65 20 66 69 6c 65 20 6e 61 6d 65 20 72 65 61 6c  e file name real
c040: 6c 79 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  ly an in-memory 
c050: 64 61 74 61 62 61 73 65 3f 0d 0a 20 20 20 20 20  database?..     
c060: 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   #..      return
c070: 20 5b 65 78 70 72 20 7b 24 66 69 6c 65 4e 61 6d   [expr {$fileNam
c080: 65 20 65 71 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e eq ":memory:" 
c090: 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  || \..          
c0a0: 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24 66  [string range $f
c0b0: 69 6c 65 4e 61 6d 65 20 30 20 31 32 5d 20 65 71  ileName 0 12] eq
c0c0: 20 22 66 69 6c 65 3a 3a 6d 65 6d 6f 72 79 3a 22   "file::memory:"
c0d0: 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  }]..    }.....  
c0e0: 20 20 70 72 6f 63 20 69 73 54 61 62 6c 65 49 6e    proc isTableIn
c0f0: 44 62 20 7b 20 6e 61 6d 65 20 7b 76 61 72 4e 61  Db { name {varNa
c100: 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a 20 20 20 20  me db} } {..    
c110: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
c120: 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65 20  E: Refer to the 
c130: 73 70 65 63 69 66 69 65 64 20 76 61 72 69 61 62  specified variab
c140: 6c 65 20 28 65 2e 67 2e 20 22 64 62 22 29 20 69  le (e.g. "db") i
c150: 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66  n the context of
c160: 20 6f 75 72 0d 0a 20 20 20 20 20 20 23 20 20 20   our..      #   
c170: 20 20 20 20 63 61 6c 6c 65 72 2e 20 20 49 74 20      caller.  It 
c180: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74  contains the dat
c190: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
c1a0: 20 68 61 6e 64 6c 65 20 74 68 61 74 20 77 69 6c   handle that wil
c1b0: 6c 20 62 65 0d 0a 20 20 20 20 20 20 23 20 20 20  l be..      #   
c1c0: 20 20 20 20 75 73 65 64 20 74 6f 20 65 78 65 63      used to exec
c1d0: 75 74 65 20 74 68 65 20 71 75 65 72 79 20 75 73  ute the query us
c1e0: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
c1f0: 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62  if the named tab
c200: 6c 65 20 69 73 0d 0a 20 20 20 20 20 20 23 20 20  le is..      #  
c210: 20 20 20 20 20 70 72 65 73 65 6e 74 20 69 6e 20       present in 
c220: 74 68 61 74 20 64 61 74 61 62 61 73 65 2e 0d 0a  that database...
c230: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75        #..      u
c240: 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20  pvar 1 $varName 
c250: 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  db....      #.. 
c260: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 45 78 65       # NOTE: Exe
c270: 63 75 74 65 20 74 68 65 20 53 51 4c 20 71 75 65  cute the SQL que
c280: 72 79 20 61 67 61 69 6e 73 74 20 74 68 65 20 73  ry against the s
c290: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
c2a0: 6c 65 20 74 6f 20 63 68 65 63 6b 20 69 66 0d 0a  le to check if..
c2b0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
c2c0: 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73  e named table is
c2d0: 20 70 72 65 73 65 6e 74 20 61 6e 64 20 72 65 74   present and ret
c2e0: 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  urn non-zero if 
c2f0: 69 74 20 69 73 2e 0d 0a 20 20 20 20 20 20 23 0d  it is...      #.
c300: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65  .      return [e
c310: 78 70 72 20 7b 5b 73 71 6c 20 65 78 65 63 75 74  xpr {[sql execut
c320: 65 20 2d 65 78 65 63 75 74 65 20 73 63 61 6c 61  e -execute scala
c330: 72 20 24 64 62 20 5c 0d 0a 20 20 20 20 20 20 20  r $db \..       
c340: 20 20 20 22 53 45 4c 45 43 54 20 43 4f 55 4e 54     "SELECT COUNT
c350: 28 2a 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  (*) FROM sqlite_
c360: 6d 61 73 74 65 72 20 57 48 45 52 45 20 74 79 70  master WHERE typ
c370: 65 20 3d 20 27 74 61 62 6c 65 27 20 41 4e 44 20  e = 'table' AND 
c380: 6e 61 6d 65 20 3d 20 3f 3b 22 20 5c 0d 0a 20 20  name = ?;" \..  
c390: 20 20 20 20 20 20 20 20 5b 6c 69 73 74 20 70 61          [list pa
c3a0: 72 61 6d 31 20 53 74 72 69 6e 67 20 24 6e 61 6d  ram1 String $nam
c3b0: 65 5d 5d 20 3e 20 30 7d 5d 0d 0a 20 20 20 20 7d  e]] > 0}]..    }
c3c0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72  .....    proc tr
c3d0: 69 6d 53 71 6c 20 7b 20 73 71 6c 20 7d 20 7b 0d  imSql { sql } {.
c3e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 72  .      return [r
c3f0: 65 67 73 75 62 20 2d 61 6c 6c 20 2d 2d 20 7b 5c  egsub -all -- {\
c400: 73 2b 7d 20 5b 73 74 72 69 6e 67 20 74 72 69 6d  s+} [string trim
c410: 20 24 73 71 6c 5d 20 22 20 22 5d 0d 0a 20 20 20   $sql] " "]..   
c420: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
c430: 65 78 65 63 75 74 65 53 71 6c 20 7b 20 73 71 6c  executeSql { sql
c440: 20 7b 65 78 65 63 75 74 65 20 6e 6f 6e 65 7d 20   {execute none} 
c450: 7b 66 69 6c 65 4e 61 6d 65 20 22 22 7d 20 7d 20  {fileName ""} } 
c460: 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  {..      if {[st
c470: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 69 6c  ring length $fil
c480: 65 4e 61 6d 65 5d 20 3d 3d 20 30 7d 20 74 68 65  eName] == 0} the
c490: 6e 20 7b 73 65 74 20 66 69 6c 65 4e 61 6d 65 20  n {set fileName 
c4a0: 3a 6d 65 6d 6f 72 79 3a 7d 0d 0a 20 20 20 20 20  :memory:}..     
c4b0: 20 73 65 74 75 70 44 62 20 24 66 69 6c 65 4e 61   setupDb $fileNa
c4c0: 6d 65 20 22 22 20 22 22 20 22 22 20 22 22 20 22  me "" "" "" "" "
c4d0: 22 20 66 61 6c 73 65 20 66 61 6c 73 65 20 66 61  " false false fa
c4e0: 6c 73 65 20 66 61 6c 73 65 20 6d 65 6d 44 62 0d  lse false memDb.
c4f0: 0a 0d 0a 20 20 20 20 20 20 74 72 79 20 7b 0d 0a  ...      try {..
c500: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
c510: 73 71 6c 20 65 78 65 63 75 74 65 20 2d 65 78 65  sql execute -exe
c520: 63 75 74 65 20 24 65 78 65 63 75 74 65 20 24 6d  cute $execute $m
c530: 65 6d 44 62 20 24 73 71 6c 5d 0d 0a 20 20 20 20  emDb $sql]..    
c540: 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0d 0a 20    } finally {.. 
c550: 20 20 20 20 20 20 20 63 6c 65 61 6e 75 70 44 62         cleanupDb
c560: 20 24 66 69 6c 65 4e 61 6d 65 20 6d 65 6d 44 62   $fileName memDb
c570: 20 66 61 6c 73 65 20 66 61 6c 73 65 0d 0a 20 20   false false..  
c580: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
c590: 0a 20 20 20 20 70 72 6f 63 20 73 65 74 75 70 44  .    proc setupD
c5a0: 62 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  b {..           
c5b0: 20 66 69 6c 65 4e 61 6d 65 20 7b 6d 6f 64 65 20   fileName {mode 
c5c0: 22 22 7d 20 7b 64 61 74 65 54 69 6d 65 46 6f 72  ""} {dateTimeFor
c5d0: 6d 61 74 20 22 22 7d 20 7b 64 61 74 65 54 69 6d  mat ""} {dateTim
c5e0: 65 4b 69 6e 64 20 22 22 7d 20 7b 66 6c 61 67 73  eKind ""} {flags
c5f0: 20 22 22 7d 0d 0a 20 20 20 20 20 20 20 20 20 20   ""}..          
c600: 20 20 7b 65 78 74 72 61 20 22 22 7d 20 7b 71 75    {extra ""} {qu
c610: 61 6c 69 66 79 20 74 72 75 65 7d 20 7b 64 65 6c  alify true} {del
c620: 65 74 65 20 74 72 75 65 7d 20 7b 75 72 69 20 66  ete true} {uri f
c630: 61 6c 73 65 7d 0d 0a 20 20 20 20 20 20 20 20 20  alse}..         
c640: 20 20 20 7b 74 65 6d 70 6f 72 61 72 79 20 74 72     {temporary tr
c650: 75 65 7d 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d  ue} {varName db}
c660: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
c670: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 72       # NOTE: Fir
c680: 73 74 2c 20 73 65 65 20 69 66 20 6f 75 72 20 63  st, see if our c
c690: 61 6c 6c 65 72 20 68 61 73 20 72 65 71 75 65 73  aller has reques
c6a0: 74 65 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ted an in-memory
c6b0: 20 64 61 74 61 62 61 73 65 2e 0d 0a 20 20 20 20   database...    
c6c0: 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 69    #..      set i
c6d0: 73 4d 65 6d 6f 72 79 20 5b 69 73 4d 65 6d 6f 72  sMemory [isMemor
c6e0: 79 44 62 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a  yDb $fileName]..
c6f0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
c700: 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 6e 6f 77   # NOTE: For now
c710: 2c 20 61 6c 6c 20 74 65 73 74 20 64 61 74 61 62  , all test datab
c720: 61 73 65 73 20 75 73 65 64 20 62 79 20 74 68 65  ases used by the
c730: 20 74 65 73 74 20 73 75 69 74 65 20 61 72 65 20   test suite are 
c740: 70 6c 61 63 65 64 0d 0a 20 20 20 20 20 20 23 20  placed..      # 
c750: 20 20 20 20 20 20 69 6e 74 6f 20 74 68 65 20 64        into the d
c760: 61 74 61 62 61 73 65 20 64 69 72 65 63 74 6f 72  atabase director
c770: 79 2e 20 20 45 61 63 68 20 64 61 74 61 62 61 73  y.  Each databas
c780: 65 20 61 6e 64 20 72 65 6c 61 74 65 64 20 66 69  e and related fi
c790: 6c 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20  les..      #    
c7a0: 20 20 20 75 73 65 64 20 62 79 20 61 20 74 65 73     used by a tes
c7b0: 74 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 65 61  t should be clea
c7c0: 6e 65 64 20 75 70 20 62 79 20 74 68 61 74 20 74  ned up by that t
c7d0: 65 73 74 20 75 73 69 6e 67 20 74 68 65 0d 0a 20  est using the.. 
c7e0: 20 20 20 20 20 23 20 20 20 20 20 20 20 22 63 6c       #       "cl
c7f0: 65 61 6e 75 70 44 62 22 20 70 72 6f 63 65 64 75  eanupDb" procedu
c800: 72 65 2c 20 62 65 6c 6f 77 2e 0d 0a 20 20 20 20  re, below...    
c810: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21    #..      if {!
c820: 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24 71 75  $isMemory && $qu
c830: 61 6c 69 66 79 7d 20 74 68 65 6e 20 7b 0d 0a 20  alify} then {.. 
c840: 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e         set fileN
c850: 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b  ame [file join [
c860: 67 65 74 44 61 74 61 62 61 73 65 44 69 72 65 63  getDatabaseDirec
c870: 74 6f 72 79 5d 20 5b 66 69 6c 65 20 74 61 69 6c  tory] [file tail
c880: 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20   $fileName]]..  
c890: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
c8a0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
c8b0: 42 79 20 64 65 66 61 75 6c 74 2c 20 64 65 6c 65  By default, dele
c8c0: 74 65 20 61 6e 79 20 70 72 65 2d 65 78 69 73 74  te any pre-exist
c8d0: 69 6e 67 20 64 61 74 61 62 61 73 65 20 77 69 74  ing database wit
c8e0: 68 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 0d  h the same file.
c8f0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e  .      #       n
c900: 61 6d 65 20 69 66 20 69 74 20 63 75 72 72 65 6e  ame if it curren
c910: 74 6c 79 20 65 78 69 73 74 73 2e 0d 0a 20 20 20  tly exists...   
c920: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
c930: 21 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24 64  !$isMemory && $d
c940: 65 6c 65 74 65 20 26 26 20 5b 66 69 6c 65 20 65  elete && [file e
c950: 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d  xists $fileName]
c960: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
c970: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
c980: 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20  OTE: Attempt to 
c990: 64 65 6c 65 74 65 20 61 6e 79 20 70 72 65 2d 65  delete any pre-e
c9a0: 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65  xisting database
c9b0: 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 66   with the same f
c9c0: 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ile..        #  
c9d0: 20 20 20 20 20 6e 61 6d 65 2e 0d 0a 20 20 20 20       name...    
c9e0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
c9f0: 66 20 7b 5b 63 61 74 63 68 20 7b 66 69 6c 65 20  f {[catch {file 
ca00: 64 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65  delete $fileName
ca10: 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b  } error]} then {
ca20: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
ca30: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
ca40: 20 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c   We somehow fail
ca50: 65 64 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  ed to delete the
ca60: 20 66 69 6c 65 2c 20 72 65 70 6f 72 74 20 77 68   file, report wh
ca70: 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  y...          #.
ca80: 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
ca90: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
caa0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
cab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
cac0: 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
cad0: 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 64 61  led to delete da
cae0: 74 61 62 61 73 65 20 66 69 6c 65 20 5c 22 22 20  tabase file \"" 
caf0: 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20  $fileName \..   
cb00: 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 64             "\" d
cb10: 75 72 69 6e 67 20 73 65 74 75 70 2c 20 65 72 72  uring setup, err
cb20: 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f  or: " \n\t $erro
cb30: 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d  r \n]..        }
cb40: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
cb50: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
cb60: 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65  TE: Refer to the
cb70: 20 73 70 65 63 69 66 69 65 64 20 76 61 72 69 61   specified varia
cb80: 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22 29 20  ble (e.g. "db") 
cb90: 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f  in the context o
cba0: 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23 20 20  f our..      #  
cbb0: 20 20 20 20 20 63 61 6c 6c 65 72 2e 20 20 54 68       caller.  Th
cbc0: 65 20 68 61 6e 64 6c 65 20 74 6f 20 74 68 65 20  e handle to the 
cbd0: 6f 70 65 6e 65 64 20 64 61 74 61 62 61 73 65 20  opened database 
cbe0: 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 74  will be stored t
cbf0: 68 65 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  here...      #..
cc00: 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76        upvar 1 $v
cc10: 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20  arName db....   
cc20: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
cc30: 54 45 3a 20 53 74 61 72 74 20 62 75 69 6c 64 69  TE: Start buildi
cc40: 6e 67 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ng the connectio
cc50: 6e 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 6f  n string.  The o
cc60: 6e 6c 79 20 72 65 71 75 69 72 65 64 20 70 6f 72  nly required por
cc70: 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  tion..      #   
cc80: 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65      of the conne
cc90: 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 69 73 20  ction string is 
cca0: 74 68 65 20 64 61 74 61 20 73 6f 75 72 63 65 2c  the data source,
ccb0: 20 77 68 69 63 68 20 63 6f 6e 74 61 69 6e 73 20   which contains 
ccc0: 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
ccd0: 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65     database file
cce0: 20 6e 61 6d 65 20 69 74 73 65 6c 66 2e 20 20 49   name itself.  I
ccf0: 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 77 61 6e  f our caller wan
cd00: 74 73 20 74 6f 20 75 73 65 20 61 20 55 52 49 20  ts to use a URI 
cd10: 61 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  as..      #     
cd20: 20 20 74 68 65 20 64 61 74 61 20 73 6f 75 72 63    the data sourc
cd30: 65 2c 20 75 73 65 20 74 68 65 20 46 75 6c 6c 55  e, use the FullU
cd40: 72 69 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74  ri connection st
cd50: 72 69 6e 67 20 70 72 6f 70 65 72 74 79 20 74 6f  ring property to
cd60: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
cd70: 70 72 65 76 65 6e 74 20 74 68 65 20 64 61 74 61  prevent the data
cd80: 20 73 6f 75 72 63 65 20 73 74 72 69 6e 67 20 66   source string f
cd90: 72 6f 6d 20 62 65 69 6e 67 20 6d 61 6e 67 6c 65  rom being mangle
cda0: 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  d...      #..   
cdb0: 20 20 20 69 66 20 7b 24 75 72 69 7d 20 74 68 65     if {$uri} the
cdc0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  n {..        set
cdd0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 46 75 6c   connection {Ful
cde0: 6c 55 72 69 3d 24 7b 66 69 6c 65 4e 61 6d 65 7d  lUri=${fileName}
cdf0: 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  }..      } else 
ce00: 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63  {..        set c
ce10: 6f 6e 6e 65 63 74 69 6f 6e 20 7b 44 61 74 61 20  onnection {Data 
ce20: 53 6f 75 72 63 65 3d 24 7b 66 69 6c 65 4e 61 6d  Source=${fileNam
ce30: 65 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  e}}..      }....
ce40: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
ce50: 20 4e 4f 54 45 3a 20 53 69 6e 63 65 20 74 68 69   NOTE: Since thi
ce60: 73 20 70 72 6f 63 65 64 75 72 65 20 68 61 73 20  s procedure has 
ce70: 6e 6f 20 73 70 65 63 69 61 6c 20 6b 6e 6f 77 6c  no special knowl
ce80: 65 64 67 65 20 6f 66 20 77 68 61 74 20 74 68 65  edge of what the
ce90: 20 64 65 66 61 75 6c 74 0d 0a 20 20 20 20 20 20   default..      
cea0: 23 20 20 20 20 20 20 20 73 65 74 74 69 6e 67 20  #       setting 
ceb0: 69 73 20 66 6f 72 20 74 68 65 20 54 6f 46 75 6c  is for the ToFul
cec0: 6c 50 61 74 68 20 63 6f 6e 6e 65 63 74 69 6f 6e  lPath connection
ced0: 20 73 74 72 69 6e 67 20 70 72 6f 70 65 72 79 2c   string propery,
cee0: 20 61 6c 77 61 79 73 0d 0a 20 20 20 20 20 20 23   always..      #
cef0: 20 20 20 20 20 20 20 61 64 64 20 74 68 65 20 76         add the v
cf00: 61 6c 75 65 20 77 65 20 6b 6e 6f 77 20 61 62 6f  alue we know abo
cf10: 75 74 20 74 6f 20 74 68 65 20 63 6f 6e 6e 65 63  ut to the connec
cf20: 74 69 6f 6e 20 73 74 72 69 6e 67 2e 0d 0a 20 20  tion string...  
cf30: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 61 70 70      #..      app
cf40: 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b  end connection {
cf50: 3b 54 6f 46 75 6c 6c 50 61 74 68 3d 24 7b 71 75  ;ToFullPath=${qu
cf60: 61 6c 69 66 79 7d 7d 0d 0a 0d 0a 20 20 20 20 20  alify}}....     
cf70: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
cf80: 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20  : If our caller 
cf90: 73 70 65 63 69 66 69 65 64 20 61 20 6a 6f 75 72  specified a jour
cfa0: 6e 61 6c 20 6d 6f 64 65 2c 20 61 64 64 20 74 68  nal mode, add th
cfb0: 65 20 6e 65 63 65 73 73 61 72 79 20 70 6f 72 74  e necessary port
cfc0: 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ion..      #    
cfd0: 20 20 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63     of the connec
cfe0: 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e  tion string now.
cff0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
d000: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
d010: 67 74 68 20 24 6d 6f 64 65 5d 20 3e 20 30 7d 20  gth $mode] > 0} 
d020: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
d030: 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f  append connectio
d040: 6e 20 7b 3b 4a 6f 75 72 6e 61 6c 20 4d 6f 64 65  n {;Journal Mode
d050: 3d 24 7b 6d 6f 64 65 7d 7d 0d 0a 20 20 20 20 20  =${mode}}..     
d060: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
d070: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
d080: 6f 75 72 20 63 61 6c 6c 65 72 20 73 70 65 63 69  our caller speci
d090: 66 69 65 64 20 61 20 44 61 74 65 54 69 6d 65 20  fied a DateTime 
d0a0: 66 6f 72 6d 61 74 2c 20 61 64 64 20 74 68 65 20  format, add the 
d0b0: 6e 65 63 65 73 73 61 72 79 0d 0a 20 20 20 20 20  necessary..     
d0c0: 20 23 20 20 20 20 20 20 20 70 6f 72 74 69 6f 6e   #       portion
d0d0: 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   of the connecti
d0e0: 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a  on string now...
d0f0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
d100: 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
d110: 68 20 24 64 61 74 65 54 69 6d 65 46 6f 72 6d 61  h $dateTimeForma
d120: 74 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  t] > 0} then {..
d130: 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 63          append c
d140: 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 44 61 74 65  onnection {;Date
d150: 54 69 6d 65 46 6f 72 6d 61 74 3d 24 7b 64 61 74  TimeFormat=${dat
d160: 65 54 69 6d 65 46 6f 72 6d 61 74 7d 7d 0d 0a 20  eTimeFormat}}.. 
d170: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
d180: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
d190: 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 73   If our caller s
d1a0: 70 65 63 69 66 69 65 64 20 61 20 44 61 74 65 54  pecified a DateT
d1b0: 69 6d 65 4b 69 6e 64 2c 20 61 64 64 20 74 68 65  imeKind, add the
d1c0: 20 6e 65 63 65 73 73 61 72 79 20 70 6f 72 74 69   necessary porti
d1d0: 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  on..      #     
d1e0: 20 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74    of the connect
d1f0: 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d  ion string now..
d200: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
d210: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
d220: 74 68 20 24 64 61 74 65 54 69 6d 65 4b 69 6e 64  th $dateTimeKind
d230: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
d240: 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f         append co
d250: 6e 6e 65 63 74 69 6f 6e 20 7b 3b 44 61 74 65 54  nnection {;DateT
d260: 69 6d 65 4b 69 6e 64 3d 24 7b 64 61 74 65 54 69  imeKind=${dateTi
d270: 6d 65 4b 69 6e 64 7d 7d 0d 0a 20 20 20 20 20 20  meKind}}..      
d280: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
d290: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74      # NOTE: If t
d2a0: 68 65 72 65 20 61 72 65 20 61 6e 79 20 67 6c 6f  here are any glo
d2b0: 62 61 6c 20 28 70 65 72 20 74 65 73 74 20 72 75  bal (per test ru
d2c0: 6e 29 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c  n) connection fl
d2d0: 61 67 73 20 63 75 72 72 65 6e 74 6c 79 0d 0a 20  ags currently.. 
d2e0: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 65 74       #       set
d2f0: 2c 20 75 73 65 20 74 68 65 6d 20 6e 6f 77 20 28  , use them now (
d300: 69 2e 65 2e 20 62 79 20 63 6f 6d 62 69 6e 69 6e  i.e. by combinin
d310: 67 20 74 68 65 6d 20 77 69 74 68 20 74 68 65 20  g them with the 
d320: 6f 6e 65 73 20 66 6f 72 20 74 68 69 73 0d 0a 20  ones for this.. 
d330: 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e       #       con
d340: 6e 65 63 74 69 6f 6e 29 2e 0d 0a 20 20 20 20 20  nection)...     
d350: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
d360: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f 6e  nfo exists ::con
d370: 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73 5d 20 26  nection_flags] &
d380: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
d390: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
d3a0: 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67  :connection_flag
d3b0: 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  s] > 0} then {..
d3c0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
d3d0: 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20     # NOTE: Show 
d3e0: 28 61 6e 64 20 6c 6f 67 29 20 74 68 61 74 20 77  (and log) that w
d3f0: 65 20 64 65 74 65 63 74 65 64 20 73 6f 6d 65 20  e detected some 
d400: 67 6c 6f 62 61 6c 20 63 6f 6e 6e 65 63 74 69 6f  global connectio
d410: 6e 20 66 6c 61 67 73 2e 0d 0a 20 20 20 20 20 20  n flags...      
d420: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75    #..        tpu
d430: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
d440: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
d450: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
d460: 2d 2d 2d 20 67 6c 6f 62 61 6c 20 63 6f 6e 6e 65  --- global conne
d470: 63 74 69 6f 6e 20 66 6c 61 67 73 20 64 65 74 65  ction flags dete
d480: 63 74 65 64 3a 20 22 20 24 3a 3a 63 6f 6e 6e 65  cted: " $::conne
d490: 63 74 69 6f 6e 5f 66 6c 61 67 73 20 5c 6e 5d 0d  ction_flags \n].
d4a0: 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
d4b0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f        # NOTE: Co
d4c0: 6d 62 69 6e 65 20 61 6e 64 2f 6f 72 20 72 65 70  mbine and/or rep
d4d0: 6c 61 63 65 20 74 68 65 20 63 6f 6e 6e 65 63 74  lace the connect
d4e0: 69 6f 6e 20 66 6c 61 67 73 20 61 6e 64 20 74 68  ion flags and th
d4f0: 65 6e 20 73 68 6f 77 20 74 68 65 0d 0a 20 20 20  en show the..   
d500: 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 65 77       #       new
d510: 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20   value...       
d520: 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
d530: 66 6c 61 67 73 20 5b 63 6f 6d 62 69 6e 65 46 6c  flags [combineFl
d540: 61 67 73 20 24 66 6c 61 67 73 20 24 3a 3a 63 6f  ags $flags $::co
d550: 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73 5d 0d  nnection_flags].
d560: 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  ...        tputs
d570: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
d580: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
d590: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
d5a0: 2d 20 63 6f 6d 62 69 6e 65 64 20 63 6f 6e 6e 65  - combined conne
d5b0: 63 74 69 6f 6e 20 66 6c 61 67 73 20 61 72 65 3a  ction flags are:
d5c0: 20 22 20 24 66 6c 61 67 73 20 5c 6e 5d 0d 0a 20   " $flags \n].. 
d5d0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
d5e0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
d5f0: 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 73   If our caller s
d600: 70 65 63 69 66 69 65 64 20 73 6f 6d 65 20 53 51  pecified some SQ
d610: 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c  LiteConnectionFl
d620: 61 67 73 2c 20 61 64 64 20 74 68 65 0d 0a 20 20  ags, add the..  
d630: 20 20 20 20 23 20 20 20 20 20 20 20 6e 65 63 65      #       nece
d640: 73 73 61 72 79 20 70 6f 72 74 69 6f 6e 20 6f 66  ssary portion of
d650: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
d660: 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20  string now...   
d670: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
d680: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
d690: 66 6c 61 67 73 5d 20 3e 20 30 7d 20 74 68 65 6e  flags] > 0} then
d6a0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65   {..        appe
d6b0: 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b  nd connection {;
d6c0: 46 6c 61 67 73 3d 24 7b 66 6c 61 67 73 7d 7d 0d  Flags=${flags}}.
d6d0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
d6e0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
d6f0: 45 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72  E: If our caller
d700: 20 73 70 65 63 69 66 69 65 64 20 61 6e 20 65 78   specified an ex
d710: 74 72 61 20 70 61 79 6c 6f 61 64 20 74 6f 20 74  tra payload to t
d720: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20  he connection.. 
d730: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 74 72       #       str
d740: 69 6e 67 2c 20 61 70 70 65 6e 64 20 69 74 20 6e  ing, append it n
d750: 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ow...      #..  
d760: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
d770: 6c 65 6e 67 74 68 20 24 65 78 74 72 61 5d 20 3e  length $extra] >
d780: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
d790: 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65      append conne
d7a0: 63 74 69 6f 6e 20 5c 3b 20 24 65 78 74 72 61 0d  ction \; $extra.
d7b0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
d7c0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
d7d0: 45 3a 20 4f 70 65 6e 20 74 68 65 20 64 61 74 61  E: Open the data
d7e0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
d7f0: 6e 6f 77 2c 20 70 6c 61 63 69 6e 67 20 74 68 65  now, placing the
d800: 20 6f 70 61 71 75 65 20 68 61 6e 64 6c 65 20 76   opaque handle v
d810: 61 6c 75 65 0d 0a 20 20 20 20 20 20 23 20 20 20  alue..      #   
d820: 20 20 20 20 69 6e 74 6f 20 74 68 65 20 76 61 72      into the var
d830: 69 61 62 6c 65 20 73 70 65 63 69 66 69 65 64 20  iable specified 
d840: 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a  by our caller...
d850: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73        #..      s
d860: 65 74 20 64 62 20 5b 73 71 6c 20 6f 70 65 6e 20  et db [sql open 
d870: 2d 74 79 70 65 20 53 51 4c 69 74 65 20 5b 73 75  -type SQLite [su
d880: 62 73 74 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 5d  bst $connection]
d890: 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ]....      #..  
d8a0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 6e 66      # NOTE: Conf
d8b0: 69 67 75 72 65 20 74 68 65 20 74 65 6d 70 6f 72  igure the tempor
d8c0: 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 66 6f  ary directory fo
d8d0: 72 20 74 68 65 20 6e 65 77 6c 79 20 6f 70 65 6e  r the newly open
d8e0: 65 64 20 64 61 74 61 62 61 73 65 0d 0a 20 20 20  ed database..   
d8f0: 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 6e 65     #       conne
d900: 63 74 69 6f 6e 20 6e 6f 77 20 75 6e 6c 65 73 73  ction now unless
d910: 20 6f 75 72 20 63 61 6c 6c 65 72 20 66 6f 72 62   our caller forb
d920: 69 64 73 20 69 74 2e 0d 0a 20 20 20 20 20 20 23  ids it...      #
d930: 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 74 65 6d  ..      if {$tem
d940: 70 6f 72 61 72 79 20 26 26 20 21 5b 69 6e 66 6f  porary && ![info
d950: 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 65 74   exists ::no(set
d960: 54 65 6d 70 6f 72 61 72 79 44 69 72 65 63 74 6f  TemporaryDirecto
d970: 72 79 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ry)]} then {..  
d980: 20 20 20 20 20 20 73 71 6c 20 65 78 65 63 75 74        sql execut
d990: 65 20 24 64 62 20 5b 61 70 70 65 6e 64 41 72 67  e $db [appendArg
d9a0: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
d9b0: 20 22 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74   "PRAGMA temp_st
d9c0: 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  ore_directory = 
d9d0: 5c 22 22 20 5b 67 65 74 54 65 6d 70 6f 72 61 72  \"" [getTemporar
d9e0: 79 44 69 72 65 63 74 6f 72 79 5d 20 5c 22 5c 3b  yDirectory] \"\;
d9f0: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ]..      }....  
da00: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
da10: 4f 54 45 3a 20 41 6c 77 61 79 73 20 72 65 74 75  OTE: Always retu
da20: 72 6e 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  rn the connectio
da30: 6e 20 68 61 6e 64 6c 65 20 75 70 6f 6e 20 73 75  n handle upon su
da40: 63 63 65 73 73 2e 0d 0a 20 20 20 20 20 20 23 0d  ccess...      #.
da50: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 64  .      return $d
da60: 62 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  b..    }.....   
da70: 20 70 72 6f 63 20 67 65 74 44 62 43 6f 6e 6e 65   proc getDbConne
da80: 63 74 69 6f 6e 20 7b 20 7b 76 61 72 4e 61 6d 65  ction { {varName
da90: 20 64 62 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20   db} } {..      
daa0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
dab0: 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 73 70   Refer to the sp
dac0: 65 63 69 66 69 65 64 20 76 61 72 69 61 62 6c 65  ecified variable
dad0: 20 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20   (e.g. "db") in 
dae0: 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f  the context of o
daf0: 75 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ur..      #     
db00: 20 20 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 68    caller.  The h
db10: 61 6e 64 6c 65 20 74 6f 20 74 68 65 20 64 61 74  andle to the dat
db20: 61 62 61 73 65 20 70 72 65 76 69 6f 75 73 6c 79  abase previously
db30: 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 65 0d   opened via the.
db40: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 5b  .      #       [
db50: 73 65 74 75 70 44 62 5d 20 70 72 6f 63 65 64 75  setupDb] procedu
db60: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f  re should be sto
db70: 72 65 64 20 74 68 65 72 65 2e 0d 0a 20 20 20 20  red there...    
db80: 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72    #..      upvar
db90: 20 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a   1 $varName db..
dba0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
dbb0: 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 72 65   # NOTE: This re
dbc0: 74 75 72 6e 73 20 74 68 65 20 41 44 4f 2e 4e 45  turns the ADO.NE
dbd0: 54 20 49 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20  T IDbConnection 
dbe0: 6f 62 6a 65 63 74 20 69 6e 73 74 61 6e 63 65 20  object instance 
dbf0: 66 6f 72 20 74 68 65 0d 0a 20 20 20 20 20 20 23  for the..      #
dc00: 20 20 20 20 20 20 20 73 70 65 63 69 66 69 65 64         specified
dc10: 20 64 61 74 61 62 73 65 20 68 61 6e 64 6c 65 2e   databse handle.
dc20: 20 20 53 69 6e 63 65 20 67 65 74 74 69 6e 67 20    Since getting 
dc30: 74 68 69 73 20 6f 62 6a 65 63 74 20 72 65 6c 69  this object reli
dc40: 65 73 20 75 70 6f 6e 0d 0a 20 20 20 20 20 20 23  es upon..      #
dc50: 20 20 20 20 20 20 20 45 61 67 6c 65 20 69 6e 74         Eagle int
dc60: 65 72 6e 61 6c 73 2c 20 67 72 65 61 74 20 63 61  ernals, great ca
dc70: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 74 61 6b  re should be tak
dc80: 65 6e 20 74 6f 20 61 76 6f 69 64 20 64 69 73 70  en to avoid disp
dc90: 6f 73 69 6e 67 20 6f 66 0d 0a 20 20 20 20 20 20  osing of..      
dca0: 23 20 20 20 20 20 20 20 74 68 69 73 20 6f 62 6a  #       this obj
dcb0: 65 63 74 20 6f 72 20 6f 74 68 65 72 77 69 73 65  ect or otherwise
dcc0: 20 70 75 74 74 69 6e 67 20 69 74 20 69 6e 74 6f   putting it into
dcd0: 20 61 6e 20 69 6e 76 61 6c 69 64 20 73 74 61 74   an invalid stat
dce0: 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
dcf0: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
dd00: 73 74 73 20 64 62 5d 7d 20 74 68 65 6e 20 7b 0d  sts db]} then {.
dd10: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
dd20: 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
dd30: 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
dd40: 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
dd50: 50 75 62 6c 69 63 20 2d 6f 62 6a 65 63 74 66 6c  Public -objectfl
dd60: 61 67 73 20 2b 4e 6f 44 69 73 70 6f 73 65 20 5c  ags +NoDispose \
dd70: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
dd80: 20 20 2d 61 6c 69 61 73 20 49 6e 74 65 72 70 72    -alias Interpr
dd90: 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 2e 63  eter.GetActive.c
dda0: 6f 6e 6e 65 63 74 69 6f 6e 73 20 49 74 65 6d 20  onnections Item 
ddb0: 24 64 62 7d 20 5c 0d 0a 20 20 20 20 20 20 20 20  $db} \..        
ddc0: 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 5d 20          result] 
ddd0: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
dde0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
ddf0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 75 63       # NOTE: Suc
de00: 63 65 73 73 2c 20 72 65 74 75 72 6e 20 74 68 65  cess, return the
de10: 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74 20 68   opaque object h
de20: 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  andle...        
de30: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 72    #..          r
de40: 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20  eturn $result.. 
de50: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
de60: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
de70: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
de80: 46 61 69 6c 75 72 65 2c 20 72 65 70 6f 72 74 20  Failure, report 
de90: 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  why...          
dea0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  #..          tpu
deb0: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
dec0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
ded0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
dee0: 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
def0: 61 69 6c 65 64 20 74 6f 20 67 65 74 20 63 6f 6e  ailed to get con
df00: 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 66  nection handle f
df10: 6f 72 20 64 61 74 61 62 61 73 65 20 5c 22 22 20  or database \"" 
df20: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
df30: 20 24 64 62 20 22 5c 22 2c 20 65 72 72 6f 72 3a   $db "\", error:
df40: 20 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20   " \n\t $result 
df50: 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  \n]..        }..
df60: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
df70: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 66 72 65 65  ...    proc free
df80: 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20 7b  DbConnection { {
df90: 76 61 72 4e 61 6d 65 20 63 6f 6e 6e 65 63 74 69  varName connecti
dfa0: 6f 6e 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  on} } {..      #
dfb0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
dfc0: 52 65 66 65 72 20 74 6f 20 74 68 65 20 73 70 65  Refer to the spe
dfd0: 63 69 66 69 65 64 20 76 61 72 69 61 62 6c 65 20  cified variable 
dfe0: 28 65 2e 67 2e 20 22 63 6f 6e 6e 65 63 74 69 6f  (e.g. "connectio
dff0: 6e 22 29 20 69 6e 20 74 68 65 0d 0a 20 20 20 20  n") in the..    
e000: 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74 65 78    #       contex
e010: 74 20 6f 66 20 6f 75 72 20 63 61 6c 6c 65 72 2e  t of our caller.
e020: 20 20 54 68 65 20 6f 70 61 71 75 65 20 6f 62 6a    The opaque obj
e030: 65 63 74 20 68 61 6e 64 6c 65 20 66 6f 72 20 61  ect handle for a
e040: 6e 20 41 44 4f 2e 4e 45 54 0d 0a 20 20 20 20 20  n ADO.NET..     
e050: 20 23 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74   #       connect
e060: 69 6f 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 72  ion previously r
e070: 65 74 75 72 6e 65 64 20 62 79 20 5b 67 65 74 44  eturned by [getD
e080: 62 43 6f 6e 6e 65 63 74 69 6f 6e 5d 20 73 68 6f  bConnection] sho
e090: 75 6c 64 20 62 65 0d 0a 20 20 20 20 20 20 23 20  uld be..      # 
e0a0: 20 20 20 20 20 20 73 74 6f 72 65 64 20 74 68 65        stored the
e0b0: 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  re...      #..  
e0c0: 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72      upvar 1 $var
e0d0: 4e 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d  Name connection.
e0e0: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
e0f0: 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
e100: 74 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20  t to remove the 
e110: 6f 70 61 71 75 65 20 6f 62 6a 65 63 74 20 68 61  opaque object ha
e120: 6e 64 6c 65 20 66 72 6f 6d 20 74 68 65 20 69 6e  ndle from the in
e130: 74 65 72 70 72 65 74 65 72 0d 0a 20 20 20 20 20  terpreter..     
e140: 20 23 20 20 20 20 20 20 20 6e 6f 77 2e 20 20 54   #       now.  T
e150: 68 69 73 20 5b 6f 62 6a 65 63 74 20 64 69 73 70  his [object disp
e160: 6f 73 65 5d 20 63 61 6c 6c 20 77 69 6c 6c 20 6e  ose] call will n
e170: 6f 74 20 61 63 74 75 61 6c 6c 79 20 64 69 73 70  ot actually disp
e180: 6f 73 65 20 6f 66 20 74 68 65 0d 0a 20 20 20 20  ose of the..    
e190: 20 20 23 20 20 20 20 20 20 20 75 6e 64 65 72 6c    #       underl
e1a0: 79 69 6e 67 20 6f 62 6a 65 63 74 20 62 65 63 61  ying object beca
e1b0: 75 73 65 20 74 68 65 20 2b 4e 6f 44 69 73 70 6f  use the +NoDispo
e1c0: 73 65 20 66 6c 61 67 20 77 61 73 20 73 65 74 20  se flag was set 
e1d0: 6f 6e 20 69 74 0d 0a 20 20 20 20 20 20 23 20 20  on it..      #  
e1e0: 20 20 20 20 20 64 75 72 69 6e 67 20 63 72 65 61       during crea
e1f0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70 61 71  tion of the opaq
e200: 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65  ue object handle
e210: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
e220: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
e230: 74 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 5d 20 26  ts connection] &
e240: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
e250: 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20 64 69  catch {object di
e260: 73 70 6f 73 65 20 24 63 6f 6e 6e 65 63 74 69 6f  spose $connectio
e270: 6e 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20  n} error]} then 
e280: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
e290: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65        # NOTE: We
e2a0: 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20   somehow failed 
e2b0: 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 68 61  to remove the ha
e2c0: 6e 64 6c 65 2c 20 72 65 70 6f 72 74 20 77 68 79  ndle, report why
e2d0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
e2e0: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
e2f0: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
e300: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
e310: 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
e320: 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
e330: 72 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f  remove connectio
e340: 6e 20 68 61 6e 64 6c 65 20 5c 22 22 20 24 63 6f  n handle \"" $co
e350: 6e 6e 65 63 74 69 6f 6e 20 5c 0d 0a 20 20 20 20  nnection \..    
e360: 20 20 20 20 20 20 20 20 22 5c 22 2c 20 65 72 72          "\", err
e370: 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f  or: " \n\t $erro
e380: 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  r \n]..      }..
e390: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
e3a0: 6f 63 20 61 64 64 44 62 43 6f 6e 6e 65 63 74 69  oc addDbConnecti
e3b0: 6f 6e 20 7b 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  on { connection 
e3c0: 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b  {varName db} } {
e3d0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
e3e0: 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74   # NOTE: Refer t
e3f0: 6f 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  o the specified 
e400: 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22  variable (e.g. "
e410: 64 62 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74  db") in the cont
e420: 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20  ext of our..    
e430: 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72    #       caller
e440: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
e450: 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
e460: 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23  me db....      #
e470: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
e480: 43 72 65 61 74 65 20 61 20 63 6f 72 72 65 63 74  Create a correct
e490: 6c 79 20 66 6f 72 6d 61 74 74 65 64 20 6e 61 6d  ly formatted nam
e4a0: 65 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  e for the databa
e4b0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  se connection to
e4c0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
e4d0: 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
e4e0: 6c 69 73 74 20 6d 61 6e 61 67 65 64 20 62 79 20  list managed by 
e4f0: 74 68 65 20 45 61 67 6c 65 20 69 6e 74 65 72 70  the Eagle interp
e500: 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d  reter...      #.
e510: 0a 20 20 20 20 20 20 73 65 74 20 64 62 20 5b 6f  .      set db [o
e520: 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
e530: 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
e540: 0d 0a 20 20 20 20 20 20 20 20 20 20 45 61 67 6c  ..          Eagl
e550: 65 2e 5f 43 6f 6d 70 6f 6e 65 6e 74 73 2e 50 72  e._Components.Pr
e560: 69 76 61 74 65 2e 46 6f 72 6d 61 74 4f 70 73 20  ivate.FormatOps 
e570: 44 61 74 61 62 61 73 65 4f 62 6a 65 63 74 4e 61  DatabaseObjectNa
e580: 6d 65 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c  me $connection \
e590: 0d 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 69  ..          SQLi
e5a0: 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 5b 6f 62  teConnection [ob
e5b0: 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49 6e 74 65  ject invoke Inte
e5c0: 72 70 72 65 74 65 72 2e 47 65 74 41 63 74 69 76  rpreter.GetActiv
e5d0: 65 20 4e 65 78 74 49 64 5d 5d 0d 0a 0d 0a 20 20  e NextId]]....  
e5e0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
e5f0: 4f 54 45 3a 20 41 64 64 20 74 68 65 20 64 61 74  OTE: Add the dat
e600: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
e610: 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72   provided by our
e620: 20 63 61 6c 6c 65 72 20 74 6f 20 74 68 65 20 6c   caller to the l
e630: 69 73 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ist..      #    
e640: 20 20 20 6f 66 20 74 68 6f 73 65 20 6b 6e 6f 77     of those know
e650: 6e 20 74 6f 20 74 68 65 20 45 61 67 6c 65 20 69  n to the Eagle i
e660: 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20  nterpreter...   
e670: 20 20 20 23 0d 0a 20 20 20 20 20 20 6f 62 6a 65     #..      obje
e680: 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
e690: 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 49 6e 74 65   +NonPublic Inte
e6a0: 72 70 72 65 74 65 72 2e 47 65 74 41 63 74 69 76  rpreter.GetActiv
e6b0: 65 2e 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 41 64  e.connections Ad
e6c0: 64 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 24  d \..          $
e6d0: 64 62 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a  db $connection..
e6e0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
e6f0: 6f 63 20 63 6c 65 61 6e 75 70 44 62 20 7b 20 66  oc cleanupDb { f
e700: 69 6c 65 4e 61 6d 65 20 7b 76 61 72 4e 61 6d 65  ileName {varName
e710: 20 64 62 7d 20 7b 63 6f 6c 6c 65 63 74 20 74 72   db} {collect tr
e720: 75 65 7d 20 7b 71 75 61 6c 69 66 79 20 74 72 75  ue} {qualify tru
e730: 65 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e}..            
e740: 20 20 20 20 20 20 20 20 20 7b 64 65 6c 65 74 65           {delete
e750: 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20   true} } {..    
e760: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
e770: 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 66 6f  E: Attempt to fo
e780: 72 63 65 20 61 6c 6c 20 70 65 6e 64 69 6e 67 20  rce all pending 
e790: 22 67 61 72 62 61 67 65 22 20 6f 62 6a 65 63 74  "garbage" object
e7a0: 73 20 74 6f 20 62 65 20 63 6f 6c 6c 65 63 74 65  s to be collecte
e7b0: 64 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  d,..      #     
e7c0: 20 20 69 6e 63 6c 75 64 69 6e 67 20 53 51 4c 69    including SQLi
e7d0: 74 65 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6e  te statements an
e7e0: 64 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73  d backup objects
e7f0: 3b 20 74 68 69 73 20 73 68 6f 75 6c 64 20 61 6c  ; this should al
e800: 6c 6f 77 0d 0a 20 20 20 20 20 20 23 20 20 20 20  low..      #    
e810: 20 20 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e     the underlyin
e820: 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
e830: 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 0d 0a  to be deleted...
e840: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
e850: 66 20 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65  f {$collect} the
e860: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c  n {..        col
e870: 6c 65 63 74 47 61 72 62 61 67 65 20 24 3a 3a 74  lectGarbage $::t
e880: 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20  est_channel..   
e890: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
e8a0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
e8b0: 65 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63  efer to the spec
e8c0: 69 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28  ified variable (
e8d0: 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68  e.g. "db") in th
e8e0: 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72  e context of our
e8f0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
e900: 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 68 61 6e  caller.  The han
e910: 64 6c 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  dle to the datab
e920: 61 73 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6f  ase previously o
e930: 70 65 6e 65 64 20 76 69 61 20 74 68 65 0d 0a 20  pened via the.. 
e940: 20 20 20 20 20 23 20 20 20 20 20 20 20 5b 73 65       #       [se
e950: 74 75 70 44 62 5d 20 70 72 6f 63 65 64 75 72 65  tupDb] procedure
e960: 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65   should be store
e970: 64 20 74 68 65 72 65 2e 0d 0a 20 20 20 20 20 20  d there...      
e980: 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31  #..      upvar 1
e990: 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a   $varName db....
e9a0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
e9b0: 20 4e 4f 54 45 3a 20 43 6c 6f 73 65 20 74 68 65   NOTE: Close the
e9c0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74   connection to t
e9d0: 68 65 20 64 61 74 61 62 61 73 65 20 6e 6f 77 2e  he database now.
e9e0: 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 61 6c    This should al
e9f0: 6c 6f 77 20 75 73 0d 0a 20 20 20 20 20 20 23 20  low us..      # 
ea00: 20 20 20 20 20 20 74 6f 20 64 65 6c 65 74 65 20        to delete 
ea10: 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  the underlying d
ea20: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0d 0a 20  atabase file... 
ea30: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
ea40: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 64   {[info exists d
ea50: 62 5d 20 26 26 20 5b 63 61 74 63 68 20 7b 73 71  b] && [catch {sq
ea60: 6c 20 63 6c 6f 73 65 20 24 64 62 7d 20 65 72 72  l close $db} err
ea70: 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
ea80: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
ea90: 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68  # NOTE: We someh
eaa0: 6f 77 20 66 61 69 6c 65 64 20 74 6f 20 63 6c 6f  ow failed to clo
eab0: 73 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  se the database,
eac0: 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20   report why...  
ead0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
eae0: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
eaf0: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
eb00: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
eb10: 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
eb20: 20 66 61 69 6c 65 64 20 74 6f 20 63 6c 6f 73 65   failed to close
eb30: 20 64 61 74 61 62 61 73 65 20 5c 22 22 20 24 64   database \"" $d
eb40: 62 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20  b "\", error: " 
eb50: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5c  \..            \
eb60: 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a  n\t $error \n]..
eb70: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
eb80: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
eb90: 3a 20 46 69 72 73 74 2c 20 73 65 65 20 69 66 20  : First, see if 
eba0: 6f 75 72 20 63 61 6c 6c 65 72 20 68 61 73 20 72  our caller has r
ebb0: 65 71 75 65 73 74 65 64 20 61 6e 20 69 6e 2d 6d  equested an in-m
ebc0: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0d  emory database..
ebd0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
ebe0: 73 65 74 20 69 73 4d 65 6d 6f 72 79 20 5b 69 73  set isMemory [is
ebf0: 4d 65 6d 6f 72 79 44 62 20 24 66 69 6c 65 4e 61  MemoryDb $fileNa
ec00: 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  me]....      #..
ec10: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75        # NOTE: Bu
ec20: 69 6c 64 20 74 68 65 20 66 75 6c 6c 20 70 61 74  ild the full pat
ec30: 68 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  h to the databas
ec40: 65 20 66 69 6c 65 20 6e 61 6d 65 2e 20 20 46 6f  e file name.  Fo
ec50: 72 20 6e 6f 77 2c 20 61 6c 6c 20 74 65 73 74 0d  r now, all test.
ec60: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64  .      #       d
ec70: 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 61 72  atabase files ar
ec80: 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
ec90: 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
eca0: 6f 72 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ory...      #.. 
ecb0: 20 20 20 20 20 69 66 20 7b 21 24 69 73 4d 65 6d       if {!$isMem
ecc0: 6f 72 79 20 26 26 20 24 71 75 61 6c 69 66 79 7d  ory && $qualify}
ecd0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
ece0: 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66   set fileName [f
ecf0: 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 44 61 74  ile join [getDat
ed00: 61 62 61 73 65 44 69 72 65 63 74 6f 72 79 5d 20  abaseDirectory] 
ed10: 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65  [file tail $file
ed20: 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d  Name]]..      }.
ed30: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
ed40: 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
ed50: 69 66 20 74 68 65 20 66 69 6c 65 20 73 74 69 6c  if the file stil
ed60: 6c 20 65 78 69 73 74 73 2e 0d 0a 20 20 20 20 20  l exists...     
ed70: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24   #..      if {!$
ed80: 69 73 4d 65 6d 6f 72 79 20 26 26 20 24 64 65 6c  isMemory && $del
ed90: 65 74 65 20 26 26 20 5b 66 69 6c 65 20 65 78 69  ete && [file exi
eda0: 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20  sts $fileName]} 
edb0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
edc0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
edd0: 45 3a 20 53 6b 69 70 20 64 65 6c 65 74 69 6e 67  E: Skip deleting
ede0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
edf0: 69 66 20 73 6f 6d 65 62 6f 64 79 20 73 65 74 73  if somebody sets
ee00: 20 74 68 65 20 67 6c 6f 62 61 6c 0d 0a 20 20 20   the global..   
ee10: 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61 72       #       var
ee20: 69 61 62 6c 65 20 74 6f 20 70 72 65 76 65 6e 74  iable to prevent
ee30: 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d   it...        #.
ee40: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69  .        if {![i
ee50: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
ee60: 63 6c 65 61 6e 75 70 44 62 46 69 6c 65 29 5d 7d  cleanupDbFile)]}
ee70: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
ee80: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
ee90: 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
eea0: 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  to delete the te
eeb0: 73 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  st database file
eec0: 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 20   now...         
eed0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   #..          if
eee0: 20 7b 5b 73 65 74 20 63 6f 64 65 20 5b 63 61 74   {[set code [cat
eef0: 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20  ch {file delete 
ef00: 24 66 69 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72  $fileName} error
ef10: 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
ef20: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
ef30: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57         # NOTE: W
ef40: 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64  e somehow failed
ef50: 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 66   to delete the f
ef60: 69 6c 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e  ile, report why.
ef70: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
ef80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
ef90: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
efa0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
efb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
efc0: 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
efd0: 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74   failed to delet
efe0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
eff0: 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d  \"" $fileName \.
f000: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f010: 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c 65 61   "\" during clea
f020: 6e 75 70 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e  nup, error: " \n
f030: 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20  \t $error \n].. 
f040: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
f050: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
f060: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
f070: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f       # NOTE: Sho
f080: 77 20 74 68 61 74 20 77 65 20 73 6b 69 70 70 65  w that we skippe
f090: 64 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66  d deleting the f
f0a0: 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ile...          
f0b0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  #..          set
f0c0: 20 63 6f 64 65 20 30 0d 0a 0d 0a 20 20 20 20 20   code 0....     
f0d0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
f0e0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
f0f0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
f100: 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
f110: 52 4e 49 4e 47 3a 20 73 6b 69 70 70 65 64 20 64  RNING: skipped d
f120: 65 6c 65 74 69 6e 67 20 64 61 74 61 62 61 73 65  eleting database
f130: 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e   file \"" $fileN
f140: 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
f150: 20 20 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20       "\" during 
f160: 63 6c 65 61 6e 75 70 5c 6e 22 5d 0d 0a 20 20 20  cleanup\n"]..   
f170: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20       }..      } 
f180: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
f190: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
f1a0: 45 3a 20 54 68 65 20 66 69 6c 65 20 64 6f 65 73  E: The file does
f1b0: 20 6e 6f 74 20 65 78 69 73 74 2c 20 73 75 63 63   not exist, succ
f1c0: 65 73 73 21 0d 0a 20 20 20 20 20 20 20 20 23 0d  ess!..        #.
f1d0: 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 64  .        set cod
f1e0: 65 20 30 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  e 0..      }....
f1f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 63 6f        return $co
f200: 64 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  de..    }.....  
f210: 20 20 70 72 6f 63 20 73 65 74 75 70 44 62 49 6e    proc setupDbIn
f220: 74 65 72 72 75 70 74 43 61 6c 6c 62 61 63 6b 20  terruptCallback 
f230: 7b 20 63 68 61 6e 6e 65 6c 20 6c 6f 67 20 7d 20  { channel log } 
f240: 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24  {..      tputs $
f250: 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 73 65  channel "---- se
f260: 74 74 69 6e 67 20 75 70 20 64 65 62 75 67 67 65  tting up debugge
f270: 72 20 69 6e 74 65 72 72 75 70 74 20 63 61 6c 6c  r interrupt call
f280: 62 61 63 6b 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  back... "....   
f290: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
f2a0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
f2b0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 6b 65      # NOTE: Make
f2c0: 20 73 75 72 65 20 74 68 65 20 73 63 72 69 70 74   sure the script
f2d0: 20 64 65 62 75 67 67 65 72 20 61 6e 64 20 74 68   debugger and th
f2e0: 65 20 69 73 6f 6c 61 74 65 64 20 69 6e 74 65 72  e isolated inter
f2f0: 70 72 65 74 65 72 20 61 72 65 0d 0a 20 20 20 20  preter are..    
f300: 20 20 20 20 23 20 20 20 20 20 20 20 73 65 74 75      #       setu
f310: 70 20 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20  p and ready for 
f320: 75 73 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  use...        #.
f330: 0a 20 20 20 20 20 20 20 20 64 65 62 75 67 20 73  .        debug s
f340: 65 74 75 70 20 74 72 75 65 20 74 72 75 65 0d 0a  etup true true..
f350: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
f360: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61       # NOTE: Loa
f370: 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  d the necessary 
f380: 70 61 63 6b 61 67 65 73 20 69 6e 74 6f 20 74 68  packages into th
f390: 65 20 69 73 6f 6c 61 74 65 64 20 69 6e 74 65 72  e isolated inter
f3a0: 70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 20  preter...       
f3b0: 20 23 0d 0a 20 20 20 20 20 20 20 20 64 65 62 75   #..        debu
f3c0: 67 20 65 76 61 6c 20 7b 0d 0a 20 20 20 20 20 20  g eval {..      
f3d0: 20 20 20 20 70 61 63 6b 61 67 65 20 72 65 71 75      package requ
f3e0: 69 72 65 20 45 61 67 6c 65 0d 0a 20 20 20 20 20  ire Eagle..     
f3f0: 20 20 20 20 20 70 61 63 6b 61 67 65 20 72 65 71       package req
f400: 75 69 72 65 20 45 61 67 6c 65 2e 4c 69 62 72 61  uire Eagle.Libra
f410: 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20 70 61  ry..          pa
f420: 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 45 61  ckage require Ea
f430: 67 6c 65 2e 54 65 73 74 0d 0a 20 20 20 20 20 20  gle.Test..      
f440: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
f450: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
f460: 3a 20 43 6f 70 79 20 74 68 65 20 6e 65 63 65 73  : Copy the neces
f470: 73 61 72 79 20 76 61 72 69 61 62 6c 65 73 20 69  sary variables i
f480: 6e 74 6f 20 74 68 65 20 69 73 6f 6c 61 74 65 64  nto the isolated
f490: 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20   interpreter... 
f4a0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
f4b0: 20 20 64 65 62 75 67 20 69 6e 76 6f 6b 65 20 30    debug invoke 0
f4c0: 20 73 65 74 20 3a 3a 74 65 73 74 5f 63 68 61 6e   set ::test_chan
f4d0: 6e 65 6c 20 24 63 68 61 6e 6e 65 6c 3b 20 23 20  nel $channel; # 
f4e0: 4e 4f 54 45 3a 20 46 6f 72 20 5b 74 70 75 74 73  NOTE: For [tputs
f4f0: 5d 2e 0d 0a 20 20 20 20 20 20 20 20 64 65 62 75  ]...        debu
f500: 67 20 69 6e 76 6f 6b 65 20 30 20 73 65 74 20 3a  g invoke 0 set :
f510: 3a 74 65 73 74 5f 6c 6f 67 20 24 6c 6f 67 3b 20  :test_log $log; 
f520: 23 20 4e 4f 54 45 3a 20 46 6f 72 20 5b 74 6c 6f  # NOTE: For [tlo
f530: 67 5d 2e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  g].....        #
f540: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
f550: 3a 20 49 6e 73 74 61 6c 6c 20 74 68 65 20 63 61  : Install the ca
f560: 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 20 74 6f  llback script to
f570: 20 62 65 20 65 76 61 6c 75 61 74 65 64 20 69 6e   be evaluated in
f580: 20 74 68 65 20 69 73 6f 6c 61 74 65 64 0d 0a 20   the isolated.. 
f590: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69         #       i
f5a0: 6e 74 65 72 70 72 65 74 65 72 20 77 68 65 6e 20  nterpreter when 
f5b0: 74 68 69 73 20 69 6e 74 65 72 70 72 65 74 65 72  this interpreter
f5c0: 20 69 73 20 69 6e 74 65 72 72 75 70 74 65 64 20   is interrupted 
f5d0: 62 79 20 73 63 72 69 70 74 0d 0a 20 20 20 20 20  by script..     
f5e0: 20 20 20 23 20 20 20 20 20 20 20 63 61 6e 63 65     #       cance
f5f0: 6c 6c 61 74 69 6f 6e 2c 20 65 74 63 2e 0d 0a 20  llation, etc... 
f600: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
f610: 20 20 64 65 62 75 67 20 63 61 6c 6c 62 61 63 6b    debug callback
f620: 20 61 70 70 6c 79 20 7b 7b 73 65 6e 64 65 72 20   apply {{sender 
f630: 65 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  e} {..          
f640: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
f650: 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68  OTE: Check if th
f660: 69 73 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 6f  is callback is o
f670: 6e 65 20 74 68 61 74 20 77 65 20 63 61 72 65 20  ne that we care 
f680: 61 62 6f 75 74 2e 0d 0a 20 20 20 20 20 20 20 20  about...        
f690: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69    #..          i
f6a0: 66 20 7b 22 43 61 6e 63 65 6c 65 64 22 20 69 6e  f {"Canceled" in
f6b0: 20 5b 73 70 6c 69 74 20 5b 24 65 20 49 6e 74 65   [split [$e Inte
f6c0: 72 72 75 70 74 54 79 70 65 5d 20 22 2c 20 22 5d  rruptType] ", "]
f6d0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
f6e0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
f6f0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 74 65       # NOTE: Ite
f700: 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 6c 6c  rate through all
f710: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
f720: 74 69 6f 6e 73 20 6b 6e 6f 77 6e 20 74 6f 20 74  tions known to t
f730: 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  he..            
f740: 23 20 20 20 20 20 20 20 70 61 72 65 6e 74 20 69  #       parent i
f750: 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20  nterpreter...   
f760: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
f770: 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66          object f
f780: 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20 70 61  oreach -alias pa
f790: 69 72 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ir \..          
f7a0: 20 20 20 20 20 20 5b 6f 62 6a 65 63 74 20 69 6e        [object in
f7b0: 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
f7c0: 50 75 62 6c 69 63 20 24 65 20 49 6e 74 65 72 70  Public $e Interp
f7d0: 72 65 74 65 72 2e 63 6f 6e 6e 65 63 74 69 6f 6e  reter.connection
f7e0: 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  s] {..          
f7f0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
f800: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74       # NOTE: Att
f810: 65 6d 70 74 20 74 6f 20 63 61 6e 63 65 6c 20 61  empt to cancel a
f820: 6e 79 20 53 51 4c 20 71 75 65 72 69 65 73 20 69  ny SQL queries i
f830: 6e 20 70 72 6f 67 72 65 73 73 20 6f 6e 20 74 68  n progress on th
f840: 69 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  is..            
f850: 20 20 23 20 20 20 20 20 20 20 64 61 74 61 62 61    #       databa
f860: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0d 0a  se connection...
f870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
f880: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
f890: 66 20 7b 5b 63 61 74 63 68 20 7b 24 70 61 69 72  f {[catch {$pair
f8a0: 20 56 61 6c 75 65 2e 43 61 6e 63 65 6c 7d 20 65   Value.Cancel} e
f8b0: 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  rror]} then {.. 
f8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
f8d0: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
f8e0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
f8f0: 20 5c 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   \n \..         
f900: 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
f910: 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
f920: 20 74 6f 20 63 61 6e 63 65 6c 20 71 75 65 72 79   to cancel query
f930: 20 66 6f 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   for connection 
f940: 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
f950: 20 20 20 20 20 20 20 20 20 20 20 5b 24 70 61 69             [$pai
f960: 72 20 4b 65 79 5d 20 22 5c 22 2c 20 65 72 72 6f  r Key] "\", erro
f970: 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72  r: " \n\t $error
f980: 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
f990: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
f9a0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
f9b0: 7d 0d 0a 20 20 20 20 20 20 20 20 7d 7d 0d 0a 20  }..        }}.. 
f9c0: 20 20 20 20 20 7d 20 65 72 72 6f 72 5d 20 3d 3d       } error] ==
f9d0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
f9e0: 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
f9f0: 74 20 69 6e 74 65 72 72 75 70 74 43 61 6c 6c 62  t interruptCallb
fa00: 61 63 6b 2e 73 71 6c 69 74 65 33 0d 0a 0d 0a 20  ack.sqlite3.... 
fa10: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
fa20: 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20  annel yes\n..   
fa30: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
fa40: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
fa50: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
fa60: 22 6e 6f 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e  "no, error: " \n
fa70: 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20  \t $error \n].. 
fa80: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
fa90: 0d 0a 20 20 20 20 70 72 6f 63 20 63 6c 65 61 6e  ..    proc clean
faa0: 75 70 46 69 6c 65 20 7b 20 66 69 6c 65 4e 61 6d  upFile { fileNam
fab0: 65 20 7b 63 6f 6c 6c 65 63 74 20 74 72 75 65 7d  e {collect true}
fac0: 20 7b 66 6f 72 63 65 20 66 61 6c 73 65 7d 20 7d   {force false} }
fad0: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
fae0: 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
faf0: 70 74 20 74 6f 20 66 6f 72 63 65 20 61 6c 6c 20  pt to force all 
fb00: 70 65 6e 64 69 6e 67 20 22 67 61 72 62 61 67 65  pending "garbage
fb10: 22 20 6f 62 6a 65 63 74 73 20 74 6f 20 62 65 20  " objects to be 
fb20: 63 6f 6c 6c 65 63 74 65 64 2c 0d 0a 20 20 20 20  collected,..    
fb30: 20 20 23 20 20 20 20 20 20 20 69 6e 63 6c 75 64    #       includ
fb40: 69 6e 67 20 53 51 4c 69 74 65 20 73 74 61 74 65  ing SQLite state
fb50: 6d 65 6e 74 73 20 61 6e 64 20 62 61 63 6b 75 70  ments and backup
fb60: 20 6f 62 6a 65 63 74 73 3b 20 74 68 69 73 20 73   objects; this s
fb70: 68 6f 75 6c 64 20 61 6c 6c 6f 77 0d 0a 20 20 20  hould allow..   
fb80: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 75     #       the u
fb90: 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
fba0: 73 65 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65  se file to be de
fbb0: 6c 65 74 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d  leted...      #.
fbc0: 0a 20 20 20 20 20 20 69 66 20 7b 24 63 6f 6c 6c  .      if {$coll
fbd0: 65 63 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ect} then {..   
fbe0: 20 20 20 20 20 63 6f 6c 6c 65 63 74 47 61 72 62       collectGarb
fbf0: 61 67 65 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  age $::test_chan
fc00: 6e 65 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  nel..      }....
fc10: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
fc20: 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20   NOTE: Check if 
fc30: 74 68 65 20 66 69 6c 65 20 73 74 69 6c 6c 20 65  the file still e
fc40: 78 69 73 74 73 2e 0d 0a 20 20 20 20 20 20 23 0d  xists...      #.
fc50: 0a 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65  .      if {[file
fc60: 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d   exists $fileNam
fc70: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
fc80: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
fc90: 20 4e 4f 54 45 3a 20 53 6b 69 70 20 64 65 6c 65   NOTE: Skip dele
fca0: 74 69 6e 67 20 74 65 73 74 20 66 69 6c 65 73 20  ting test files 
fcb0: 69 66 20 73 6f 6d 65 62 6f 64 79 20 73 65 74 73  if somebody sets
fcc0: 20 74 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 69   the global vari
fcd0: 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20  able..        # 
fce0: 20 20 20 20 20 20 74 6f 20 70 72 65 76 65 6e 74        to prevent
fcf0: 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d   it...        #.
fd00: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 66 6f  .        if {$fo
fd10: 72 63 65 20 7c 7c 20 21 5b 69 6e 66 6f 20 65 78  rce || ![info ex
fd20: 69 73 74 73 20 3a 3a 6e 6f 28 63 6c 65 61 6e 75  ists ::no(cleanu
fd30: 70 46 69 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d  pFile)]} then {.
fd40: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
fd50: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
fd60: 41 74 74 65 6d 70 74 20 74 6f 20 64 65 6c 65 74  Attempt to delet
fd70: 65 20 74 68 65 20 74 65 73 74 20 66 69 6c 65 20  e the test file 
fd80: 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  now...          
fd90: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  #..          if 
fda0: 7b 5b 73 65 74 20 63 6f 64 65 20 5b 63 61 74 63  {[set code [catc
fdb0: 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24  h {file delete $
fdc0: 66 69 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72 5d  fileName} error]
fdd0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
fde0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
fdf0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65        # NOTE: We
fe00: 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20   somehow failed 
fe10: 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 66 69  to delete the fi
fe20: 6c 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d  le, report why..
fe30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
fe40: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
fe50: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
fe60: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
fe70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
fe80: 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
fe90: 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65  failed to delete
fea0: 20 74 65 73 74 20 66 69 6c 65 20 5c 22 22 20 24   test file \"" $
feb0: 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20  fileName \..    
fec0: 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20              "\" 
fed0: 64 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 2c 20  during cleanup, 
fee0: 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65  error: " \n\t $e
fef0: 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  rror \n]..      
ff00: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
ff10: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
ff20: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
ff30: 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68 61  # NOTE: Show tha
ff40: 74 20 77 65 20 73 6b 69 70 70 65 64 20 64 65 6c  t we skipped del
ff50: 65 74 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0d  eting the file..
ff60: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
ff70: 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 64 65          set code
ff80: 20 30 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   0....          
ff90: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
ffa0: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
ffb0: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
ffc0: 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
ffd0: 3a 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69  : skipped deleti
ffe0: 6e 67 20 74 65 73 74 20 66 69 6c 65 20 5c 22 22  ng test file \""
fff0: 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20   $fileName \..  
10000 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20              "\" 
10010 64 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 5c 6e  during cleanup\n
10020 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  "]..        }.. 
10030 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
10040 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
10050 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 66 69    # NOTE: The fi
10060 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  le does not exis
10070 74 2c 20 73 75 63 63 65 73 73 21 0d 0a 20 20 20  t, success!..   
10080 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
10090 73 65 74 20 63 6f 64 65 20 30 0d 0a 20 20 20 20  set code 0..    
100a0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74    }....      ret
100b0 75 72 6e 20 24 63 6f 64 65 0d 0a 20 20 20 20 7d  urn $code..    }
100c0 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 6f  .....    proc co
100d0 6c 6c 65 63 74 47 61 72 62 61 67 65 20 7b 20 63  llectGarbage { c
100e0 68 61 6e 6e 65 6c 20 7b 6d 69 6c 6c 69 73 65 63  hannel {millisec
100f0 6f 6e 64 73 20 31 30 30 30 7d 20 7b 71 75 69 65  onds 1000} {quie
10100 74 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20  t true} } {..   
10110 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f     if {[catch {o
10120 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47 43 20  bject invoke GC 
10130 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 66  GetTotalMemory f
10140 61 6c 73 65 7d 20 72 65 73 75 6c 74 5d 20 3d 3d  alse} result] ==
10150 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
10160 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
10170 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
10180 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
10190 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
101a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
101b0 2d 2d 2d 2d 20 6d 65 6d 6f 72 79 20 69 6e 20 75  ---- memory in u
101c0 73 65 20 62 79 20 74 68 65 20 43 4c 52 20 62 65  se by the CLR be
101d0 66 6f 72 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 2e  fore collection.
101e0 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  .. " \..        
101f0 20 20 20 20 20 20 24 72 65 73 75 6c 74 20 22 20        $result " 
10200 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20  bytes\n"]..     
10210 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
10220 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  se {..        tp
10230 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
10240 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
10250 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
10260 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
10270 20 67 65 74 20 43 4c 52 20 6d 65 6d 6f 72 79 20   get CLR memory 
10280 75 73 61 67 65 2c 20 65 72 72 6f 72 3a 20 22 20  usage, error: " 
10290 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5c  \..            \
102a0 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d  n\t $result \n].
102b0 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
102c0 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
102d0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
102e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
102f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
10300 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20  ###########.... 
10310 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
10320 4e 4f 54 45 3a 20 52 65 70 65 61 74 65 64 6c 79  NOTE: Repeatedly
10330 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6f 6c 6c   attempt to coll
10340 65 63 74 20 67 61 72 62 61 67 65 20 75 6e 74 69  ect garbage unti
10350 6c 20 74 68 65 20 61 6c 6c 6f 74 74 65 64 20 6e  l the allotted n
10360 75 6d 62 65 72 0d 0a 20 20 20 20 20 20 23 20 20  umber..      #  
10370 20 20 20 20 20 6f 66 20 6d 69 6c 6c 69 73 65 63       of millisec
10380 6f 6e 64 73 20 68 61 73 20 65 6c 61 70 73 65 64  onds has elapsed
10390 2e 20 20 41 6c 77 61 79 73 20 61 74 74 65 6d 70  .  Always attemp
103a0 74 20 74 6f 20 63 6f 6c 6c 65 63 74 20 67 61 72  t to collect gar
103b0 62 61 67 65 0d 0a 20 20 20 20 20 20 23 20 20 20  bage..      #   
103c0 20 20 20 20 61 74 20 6c 65 61 73 74 20 6f 6e 63      at least onc
103d0 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
103e0 20 20 20 73 65 74 20 73 74 61 72 74 20 5b 63 6c     set start [cl
103f0 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 0d 0a 20 20  ock seconds]..  
10400 20 20 20 20 73 65 74 20 73 74 6f 70 20 5b 65 78      set stop [ex
10410 70 72 20 7b 24 73 74 61 72 74 20 2b 20 28 24 6d  pr {$start + ($m
10420 69 6c 6c 69 73 65 63 6f 6e 64 73 20 2f 20 31 30  illiseconds / 10
10430 30 30 29 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20 64  00)}]....      d
10440 6f 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  o {..        #..
10450 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
10460 41 74 74 65 6d 70 74 20 74 6f 20 66 6f 72 63 65  Attempt to force
10470 20 61 20 66 75 6c 6c 20 67 61 72 62 61 67 65 20   a full garbage 
10480 63 6f 6c 6c 65 63 74 69 6f 6e 20 6e 6f 77 2e 20  collection now. 
10490 20 52 65 70 6f 72 74 20 61 6e 79 0d 0a 20 20 20   Report any..   
104a0 20 20 20 20 20 23 20 20 20 20 20 20 20 65 72 72       #       err
104b0 6f 72 20 74 68 61 74 20 69 73 20 65 6e 63 6f 75  or that is encou
104c0 6e 74 65 72 65 64 20 69 66 20 77 65 20 66 61 69  ntered if we fai
104d0 6c 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  l...        #.. 
104e0 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
104f0 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65  h {object invoke
10500 20 47 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f   GC GetTotalMemo
10510 72 79 20 74 72 75 65 7d 20 65 72 72 6f 72 5d 7d  ry true} error]}
10520 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
10530 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
10540 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
10550 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
10560 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
10570 69 6c 65 64 20 66 75 6c 6c 20 67 61 72 62 61 67  iled full garbag
10580 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 2c 20 65 72  e collection, er
10590 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20  ror: " \..      
105a0 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 65 72          \n\t $er
105b0 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ror \n]..       
105c0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65   }....        se
105d0 74 20 6e 6f 77 20 5b 63 6c 6f 63 6b 20 73 65 63  t now [clock sec
105e0 6f 6e 64 73 5d 0d 0a 20 20 20 20 20 20 7d 20 77  onds]..      } w
105f0 68 69 6c 65 20 7b 24 73 74 61 72 74 20 3c 3d 20  hile {$start <= 
10600 24 6e 6f 77 20 26 26 20 24 6e 6f 77 20 3c 20 24  $now && $now < $
10610 73 74 6f 70 7d 0d 0a 0d 0a 20 20 20 20 20 20 23  stop}....      #
10620 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
10630 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
10640 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
10650 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
10660 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20  ########....    
10670 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62    if {[catch {ob
10680 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47 43 20 47  ject invoke GC G
10690 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 66 61  etTotalMemory fa
106a0 6c 73 65 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20  lse} result] == 
106b0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
106c0 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
106d0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
106e0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
106f0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
10700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
10710 2d 2d 2d 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73  --- memory in us
10720 65 20 62 79 20 74 68 65 20 43 4c 52 20 61 66 74  e by the CLR aft
10730 65 72 20 63 6f 6c 6c 65 63 74 69 6f 6e 2e 2e 2e  er collection...
10740 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
10750 20 20 20 20 24 72 65 73 75 6c 74 20 22 20 62 79      $result " by
10760 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  tes\n"]..       
10770 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65   }..      } else
10780 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
10790 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
107a0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
107b0 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
107c0 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 67  ING: failed to g
107d0 65 74 20 43 4c 52 20 6d 65 6d 6f 72 79 20 75 73  et CLR memory us
107e0 61 67 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d  age, error: " \.
107f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c  .            \n\
10800 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20  t $result \n].. 
10810 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
10820 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 53 51  ..    proc getSQ
10830 4c 69 74 65 48 61 6e 64 6c 65 43 6f 75 6e 74 73  LiteHandleCounts
10840 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 71 75 69 65   { channel {quie
10850 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20  t false} } {..  
10860 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b      set result [
10870 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 69  list]....      i
10880 66 20 7b 5b 68 61 76 65 43 6f 6e 73 74 72 61 69  f {[haveConstrai
10890 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  nt \..          
108a0 20 20 20 20 64 65 66 69 6e 65 43 6f 6e 73 74 61      defineConsta
108b0 6e 74 2e 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  nt.System.Data.S
108c0 51 4c 69 74 65 2e 43 4f 55 4e 54 5f 48 41 4e 44  QLite.COUNT_HAND
108d0 4c 45 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  LE]} then {..   
108e0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
108f0 23 20 4e 4f 54 45 3a 20 41 64 64 20 65 61 63 68  # NOTE: Add each
10900 20 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65   critical handle
10910 20 63 6f 75 6e 74 20 74 6f 20 74 68 65 20 72 65   count to the re
10920 73 75 6c 74 69 6e 67 20 6c 69 73 74 2e 0d 0a 20  sulting list... 
10930 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
10940 20 20 66 6f 72 65 61 63 68 20 6e 61 6d 65 20 5b    foreach name [
10950 6c 69 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 43  list connectionC
10960 6f 75 6e 74 20 73 74 61 74 65 6d 65 6e 74 43 6f  ount statementCo
10970 75 6e 74 20 62 61 63 6b 75 70 43 6f 75 6e 74 5d  unt backupCount]
10980 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
10990 74 20 76 61 6c 75 65 20 5b 6f 62 6a 65 63 74 20  t value [object 
109a0 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
109b0 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
109c0 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
109d0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73  .Data.SQLite.Uns
109e0 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
109f0 20 24 6e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20   $name]....     
10a00 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
10a10 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
10a20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
10a30 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
10a40 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
10a50 20 20 20 20 22 2d 2d 2d 2d 20 63 72 69 74 69 63      "---- critic
10a60 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 20  al handle count 
10a70 5c 22 22 20 24 6e 61 6d 65 20 22 5c 22 20 69 73  \"" $name "\" is
10a80 20 22 20 24 76 61 6c 75 65 20 5c 6e 5d 0d 0a 20   " $value \n].. 
10a90 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
10aa0 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
10ab0 72 65 73 75 6c 74 20 24 76 61 6c 75 65 0d 0a 20  result $value.. 
10ac0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
10ad0 7d 20 65 6c 73 65 69 66 20 7b 21 24 71 75 69 65  } elseif {!$quie
10ae0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
10af0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
10b00 4e 4f 54 45 3a 20 54 68 65 20 61 63 74 75 61 6c  NOTE: The actual
10b10 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 73 20 61   handle counts a
10b20 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  re not available
10b30 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 6a 75 73  ; therefore, jus
10b40 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
10b50 20 20 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70     return an emp
10b60 74 79 20 6c 69 73 74 2e 0d 0a 20 20 20 20 20 20  ty list...      
10b70 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75    #..        tpu
10b80 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  ts $channel "---
10b90 2d 20 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c  - critical handl
10ba0 65 20 63 6f 75 6e 74 73 20 75 6e 61 76 61 69 6c  e counts unavail
10bb0 61 62 6c 65 5c 6e 22 0d 0a 20 20 20 20 20 20 7d  able\n"..      }
10bc0 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ....      return
10bd0 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d   $result..    }.
10be0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 68 75  ....    proc shu
10bf0 74 64 6f 77 6e 53 51 4c 69 74 65 20 7b 20 63 68  tdownSQLite { ch
10c00 61 6e 6e 65 6c 20 7b 66 6f 72 63 65 20 66 61 6c  annel {force fal
10c10 73 65 7d 20 7b 71 75 69 65 74 20 66 61 6c 73 65  se} {quiet false
10c20 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
10c30 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61        # NOTE: Ma
10c40 6b 65 20 73 75 72 65 20 74 68 61 74 20 53 51 4c  ke sure that SQL
10c50 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79  ite core library
10c60 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 73   is completely s
10c70 68 75 74 64 6f 77 6e 2e 20 20 54 68 69 73 0d 0a  hutdown.  This..
10c80 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 73        #       is
10c90 20 75 73 65 64 20 62 79 20 74 65 73 74 73 20 74   used by tests t
10ca0 68 61 74 20 63 68 61 6e 67 65 20 63 6f 6e 66 69  hat change confi
10cb0 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73  guration options
10cc0 20 61 6e 64 2f 6f 72 20 74 68 6f 73 65 0d 0a 20   and/or those.. 
10cd0 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 61       #       tha
10ce0 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73  t need to make s
10cf0 75 72 65 20 6c 6f 67 67 69 6e 67 20 69 73 20 69  ure logging is i
10d00 6e 69 74 69 61 6c 69 7a 65 64 20 28 69 2e 65 2e  nitialized (i.e.
10d10 20 6a 75 73 74 20 69 6e 20 63 61 73 65 0d 0a 20   just in case.. 
10d20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
10d30 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62   SQLite core lib
10d40 72 61 72 79 20 77 61 73 20 69 6e 69 74 69 61 6c  rary was initial
10d50 69 7a 65 64 20 69 6e 20 74 68 65 20 70 72 6f 63  ized in the proc
10d60 65 73 73 20 70 72 69 6f 72 20 74 6f 0d 0a 20 20  ess prior to..  
10d70 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
10d80 53 51 4c 69 74 65 4c 6f 67 20 63 6c 61 73 73 20  SQLiteLog class 
10d90 62 65 69 6e 67 20 61 62 6c 65 20 74 6f 20 73 65  being able to se
10da0 74 75 70 20 69 74 73 20 6c 6f 67 67 69 6e 67 20  tup its logging 
10db0 63 61 6c 6c 62 61 63 6b 29 2e 0d 0a 20 20 20 20  callback)...    
10dc0 20 20 23 20 20 20 20 20 20 20 4e 6f 72 6d 61 6c    #       Normal
10dd0 6c 79 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20  ly, this should 
10de0 6f 6e 6c 79 20 62 65 20 70 65 72 66 6f 72 6d 65  only be performe
10df0 64 20 69 66 20 53 51 4c 69 74 65 20 69 73 20 6c  d if SQLite is l
10e00 6f 61 64 65 64 20 61 6e 64 0d 0a 20 20 20 20 20  oaded and..     
10e10 20 23 20 20 20 20 20 20 20 72 65 61 64 79 20 66   #       ready f
10e20 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 74 65  or use by the te
10e30 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20  st suite...     
10e40 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 66   #..      if {$f
10e50 6f 72 63 65 20 7c 7c 20 5b 69 73 53 51 4c 69 74  orce || [isSQLit
10e60 65 52 65 61 64 79 5d 7d 20 74 68 65 6e 20 7b 0d  eReady]} then {.
10e70 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
10e80 20 20 20 20 23 20 42 55 47 46 49 58 3a 20 42 65      # BUGFIX: Be
10e90 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 65  fore calling the
10ea0 20 6e 61 74 69 76 65 20 73 68 75 74 64 6f 77 6e   native shutdown
10eb0 20 66 75 6e 63 74 69 6f 6e 2c 20 6d 61 6b 65 20   function, make 
10ec0 73 75 72 65 20 62 6f 74 68 0d 0a 20 20 20 20 20  sure both..     
10ed0 20 20 20 23 20 20 20 20 20 20 20 20 20 6f 66 20     #         of 
10ee0 74 68 65 20 50 52 41 47 4d 41 20 72 65 6c 61 74  the PRAGMA relat
10ef0 65 64 20 64 69 72 65 63 74 6f 72 79 20 6e 61 6d  ed directory nam
10f00 65 73 20 61 72 65 20 66 72 65 65 64 2e 0d 0a 20  es are freed... 
10f10 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
10f20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65    checkForSQLite
10f30 44 69 72 65 63 74 6f 72 69 65 73 20 24 63 68 61  Directories $cha
10f40 6e 6e 65 6c 20 74 72 75 65 0d 0a 0d 0a 20 20 20  nnel true....   
10f50 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
10f60 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d  {object invoke -
10f70 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
10f80 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
10f90 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
10fa0 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74  SQLite.UnsafeNat
10fb0 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20  iveMethods \..  
10fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
10fd0 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 7d 20  lite3_shutdown} 
10fe0 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68  result] == 0} th
10ff0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
11000 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
11010 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
11020 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
11030 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
11040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
11050 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65  ---- call sqlite
11060 33 5f 73 68 75 74 64 6f 77 6e 28 29 2e 2e 2e 20  3_shutdown()... 
11070 6f 6b 3a 20 22 20 24 72 65 73 75 6c 74 20 5c 6e  ok: " $result \n
11080 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
11090 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
110a0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
110b0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
110c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
110d0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
110e0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
110f0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
11100 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 73 68   call sqlite3_sh
11110 75 74 64 6f 77 6e 28 29 2e 2e 2e 20 65 72 72 6f  utdown()... erro
11120 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c  r: " \n\t $resul
11130 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  t \n]..         
11140 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
11150 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
11160 0d 0a 20 20 20 20 70 72 6f 63 20 72 65 70 6f 72  ..    proc repor
11170 74 53 51 4c 69 74 65 52 65 73 6f 75 72 63 65 73  tSQLiteResources
11180 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 71 75 69 65   { channel {quie
11190 74 20 66 61 6c 73 65 7d 20 7b 63 6f 6c 6c 65 63  t false} {collec
111a0 74 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20  t true} } {..   
111b0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
111c0 54 45 3a 20 53 6b 69 70 20 61 6c 6c 20 6f 75 74  TE: Skip all out
111d0 70 75 74 20 69 66 20 77 65 20 61 72 65 20 72 75  put if we are ru
111e0 6e 6e 69 6e 67 20 69 6e 20 22 71 75 69 65 74 22  nning in "quiet"
111f0 20 6d 6f 64 65 2e 0d 0a 20 20 20 20 20 20 23 0d   mode...      #.
11200 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65  .      if {[have
11210 43 6f 6e 73 74 72 61 69 6e 74 20 5c 0d 0a 20 20  Constraint \..  
11220 20 20 20 20 20 20 20 20 20 20 20 20 64 65 66 69              defi
11230 6e 65 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74 65  neConstant.Syste
11240 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 49 4e  m.Data.SQLite.IN
11250 54 45 52 4f 50 5f 56 49 52 54 55 41 4c 5f 54 41  TEROP_VIRTUAL_TA
11260 42 4c 45 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  BLE] && \..     
11270 20 20 20 20 20 5b 68 61 76 65 43 6f 6e 73 74 72       [haveConstr
11280 61 69 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  aint \..        
11290 20 20 20 20 20 20 64 65 66 69 6e 65 43 6f 6e 73        defineCons
112a0 74 61 6e 74 2e 53 79 73 74 65 6d 2e 44 61 74 61  tant.System.Data
112b0 2e 53 51 4c 69 74 65 2e 54 52 41 43 4b 5f 4d 45  .SQLite.TRACK_ME
112c0 4d 4f 52 59 5f 42 59 54 45 53 5d 7d 20 74 68 65  MORY_BYTES]} the
112d0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
112e0 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
112f0 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
11300 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
11310 20 63 75 72 72 65 6e 74 20 6d 65 6d 6f 72 79 20   current memory 
11320 69 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74 65  in use by SQLite
11330 4d 65 6d 6f 72 79 2e 2e 2e 20 22 0d 0a 20 20 20  Memory... "..   
11340 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
11350 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62    if {[catch {ob
11360 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
11370 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
11380 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11390 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
113a0 69 74 65 2e 53 51 4c 69 74 65 4d 65 6d 6f 72 79  ite.SQLiteMemory
113b0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
113c0 20 20 20 20 62 79 74 65 73 41 6c 6c 6f 63 61 74      bytesAllocat
113d0 65 64 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30  ed} memory] == 0
113e0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
113f0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
11400 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
11410 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
11420 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
11430 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c  $memory " bytes\
11440 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  n"]..          }
11450 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
11460 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
11470 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e  t memory unknown
11480 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
11490 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
114a0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
114b0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
114c0 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72  ppendArgs $memor
114d0 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  y \n]..         
114e0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
114f0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71  .        if {!$q
11500 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
11510 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
11520 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 6d 61 78  hannel "---- max
11530 69 6d 75 6d 20 6d 65 6d 6f 72 79 20 69 6e 20 75  imum memory in u
11540 73 65 20 62 79 20 53 51 4c 69 74 65 4d 65 6d 6f  se by SQLiteMemo
11550 72 79 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 20  ry... "..       
11560 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
11570 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74   {[catch {object
11580 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
11590 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
115a0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
115b0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
115c0 53 51 4c 69 74 65 4d 65 6d 6f 72 79 20 5c 0d 0a  SQLiteMemory \..
115d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115e0 6d 61 78 69 6d 75 6d 42 79 74 65 73 41 6c 6c 6f  maximumBytesAllo
115f0 63 61 74 65 64 7d 20 6d 65 6d 6f 72 79 5d 20 3d  cated} memory] =
11600 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
11610 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
11620 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
11630 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
11640 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
11650 67 73 20 24 6d 65 6d 6f 72 79 20 22 20 62 79 74  gs $memory " byt
11660 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  es\n"]..        
11670 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65    }..        } e
11680 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
11690 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e   set memory unkn
116a0 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  own....         
116b0 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
116c0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
116d0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
116e0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65   [appendArgs $me
116f0 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  mory \n]..      
11700 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
11710 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
11720 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
11730 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
11740 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
11750 2d 2d 2d 2d 20 63 75 72 72 65 6e 74 20 6d 65 6d  ---- current mem
11760 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 53 51  ory in use by SQ
11770 4c 69 74 65 2e 2e 2e 20 22 0d 0a 20 20 20 20 20  Lite... "..     
11780 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   }....      if {
11790 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20 69  [catch {object i
117a0 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
117b0 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
117c0 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
117d0 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61  Data.SQLite.Unsa
117e0 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20  feNativeMethods 
117f0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
11800 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f   sqlite3_memory_
11810 75 73 65 64 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d  used} memory] ==
11820 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
11830 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
11840 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
11850 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
11860 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
11870 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e 22  emory " bytes\n"
11880 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
11890 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
118a0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
118b0 20 23 20 4e 4f 54 45 3a 20 4d 61 79 62 65 20 74   # NOTE: Maybe t
118c0 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c  he SQLite core l
118d0 69 62 72 61 72 79 20 69 73 20 75 6e 61 76 61 69  ibrary is unavai
118e0 6c 61 62 6c 65 3f 0d 0a 20 20 20 20 20 20 20 20  lable?..        
118f0 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d  #..        set m
11900 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d  emory unknown...
11910 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71  .        if {!$q
11920 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
11930 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
11940 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
11950 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a  gs $memory \n]..
11960 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
11970 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20   }....      set 
11980 72 65 73 75 6c 74 20 24 6d 65 6d 6f 72 79 3b 20  result $memory; 
11990 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 6d  # NOTE: Return m
119a0 65 6d 6f 72 79 20 69 6e 2d 75 73 65 20 74 6f 20  emory in-use to 
119b0 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 0d 0a 20  our caller..... 
119c0 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
119d0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
119e0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
119f0 20 22 2d 2d 2d 2d 20 6d 61 78 69 6d 75 6d 20 6d   "---- maximum m
11a00 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20  emory in use by 
11a10 53 51 4c 69 74 65 2e 2e 2e 20 22 0d 0a 20 20 20  SQLite... "..   
11a20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
11a30 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74   {[catch {object
11a40 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
11a50 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
11a60 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
11a70 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e  m.Data.SQLite.Un
11a80 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
11a90 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
11aa0 20 20 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72     sqlite3_memor
11ab0 79 5f 68 69 67 68 77 61 74 65 72 20 30 7d 20 6d  y_highwater 0} m
11ac0 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65  emory] == 0} the
11ad0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
11ae0 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
11af0 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
11b00 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
11b10 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22  ndArgs $memory "
11b20 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20   bytes\n"]..    
11b30 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65      }..      } e
11b40 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
11b50 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
11b60 3a 20 4d 61 79 62 65 20 74 68 65 20 53 51 4c 69  : Maybe the SQLi
11b70 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20  te core library 
11b80 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 3f 0d  is unavailable?.
11b90 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
11ba0 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75      set memory u
11bb0 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20  nknown....      
11bc0 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
11bd0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
11be0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
11bf0 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d  [appendArgs $mem
11c00 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ory \n]..       
11c10 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
11c20 20 20 20 20 20 69 66 20 7b 24 63 6f 6c 6c 65 63       if {$collec
11c30 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
11c40 20 20 20 63 6f 6c 6c 65 63 74 47 61 72 62 61 67     collectGarbag
11c50 65 20 24 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20  e $channel..    
11c60 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
11c70 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
11c80 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
11c90 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63  $channel "---- c
11ca0 75 72 72 65 6e 74 20 6d 65 6d 6f 72 79 20 69 6e  urrent memory in
11cb0 20 75 73 65 20 62 79 20 74 68 65 20 43 4c 52 2e   use by the CLR.
11cc0 2e 2e 20 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  .. "..      }...
11cd0 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63  .      if {[catc
11ce0 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65  h {object invoke
11cf0 20 47 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f   GC GetTotalMemo
11d00 72 79 20 66 61 6c 73 65 7d 20 6d 65 6d 6f 72 79  ry false} memory
11d10 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
11d20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
11d30 69 6e 67 20 69 73 20 69 6e 74 65 67 65 72 20 2d  ing is integer -
11d40 73 74 72 69 63 74 20 24 6d 65 6d 6f 72 79 5d 7d  strict $memory]}
11d50 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
11d60 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
11d70 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
11d80 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
11d90 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  el [appendArgs $
11da0 6d 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e  memory " bytes\n
11db0 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  "]..          }.
11dc0 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
11dd0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
11de0 20 6d 65 6d 6f 72 79 20 69 6e 76 61 6c 69 64 0d   memory invalid.
11df0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
11e00 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
11e10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
11e20 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
11e30 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79  pendArgs $memory
11e40 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
11e50 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
11e60 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
11e70 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79        set memory
11e80 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20   unknown....    
11e90 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
11ea0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
11eb0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
11ec0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
11ed0 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20  emory \n]..     
11ee0 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
11ef0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72  .      return $r
11f00 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  esult..    }....
11f10 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46  .    proc checkF
11f20 6f 72 53 51 4c 69 74 65 44 69 72 65 63 74 6f 72  orSQLiteDirector
11f30 69 65 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 72  ies { channel {r
11f40 65 73 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  eset false} } {.
11f50 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
11f60 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66  # NOTE: Check if
11f70 20 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e   the sqlite3_win
11f80 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79  32_set_directory
11f90 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 76 61   function is ava
11fa0 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 23  ilable...      #
11fb0 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63  ..      tputs $c
11fc0 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20  hannel \..      
11fd0 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69      "---- checki
11fe0 6e 67 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20  ng for function 
11ff0 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
12000 74 5f 64 69 72 65 63 74 6f 72 79 2e 2e 2e 20 22  t_directory... "
12010 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
12020 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20     # NOTE: This 
12030 63 61 6c 6c 20 74 6f 20 74 68 65 20 73 71 6c 69  call to the sqli
12040 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69  te3_win32_set_di
12050 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e  rectory function
12060 20 75 73 65 73 20 74 68 65 0d 0a 20 20 20 20 20   uses the..     
12070 20 23 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64   #       invalid
12080 20 76 61 6c 75 65 20 30 20 66 6f 72 20 74 68 65   value 0 for the
12090 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
120a0 20 20 54 68 69 73 20 63 6f 64 65 20 69 73 20 64    This code is d
120b0 65 73 69 67 6e 65 64 0d 0a 20 20 20 20 20 20 23  esigned..      #
120c0 20 20 20 20 20 20 20 74 6f 20 63 68 65 63 6b 20         to check 
120d0 69 66 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 66  if calling the f
120e0 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 61 69  unction will rai
120f0 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20  se an exception 
12100 28 69 2e 65 2e 0d 0a 20 20 20 20 20 20 23 20 20  (i.e...      #  
12110 20 20 20 20 20 74 68 65 20 61 63 74 75 61 6c 20       the actual 
12120 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 66 75  result of the fu
12130 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
12140 6d 61 74 74 65 72 20 61 73 20 6c 6f 6e 67 20 61  matter as long a
12150 73 20 6e 6f 0d 0a 20 20 20 20 20 20 23 20 20 20  s no..      #   
12160 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 69 73      directory is
12170 20 63 68 61 6e 67 65 64 29 2e 0d 0a 20 20 20 20   changed)...    
12180 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
12190 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
121a0 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
121b0 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
121c0 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
121d0 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
121e0 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66  ata.SQLite.Unsaf
121f0 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20 5c  eNativeMethods \
12200 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
12210 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
12220 74 5f 64 69 72 65 63 74 6f 72 79 20 30 20 6e 75  t_directory 0 nu
12230 6c 6c 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ll}] == 0} then 
12240 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
12250 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 61        # NOTE: Ca
12260 6c 6c 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  lling the sqlite
12270 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65  3_win32_set_dire
12280 63 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20 64  ctory function d
12290 6f 65 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20  oes not..       
122a0 20 23 20 20 20 20 20 20 20 63 61 75 73 65 20 61   #       cause a
122b0 6e 20 65 78 63 65 70 74 69 6f 6e 3b 20 74 68 65  n exception; the
122c0 72 65 66 6f 72 65 2c 20 69 74 20 6d 75 73 74 20  refore, it must 
122d0 62 65 20 61 76 61 69 6c 61 62 6c 65 20 28 69 2e  be available (i.
122e0 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  e...        #   
122f0 20 20 20 20 65 76 65 6e 20 74 68 6f 75 67 68 20      even though 
12300 69 74 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e  it should return
12310 20 61 20 66 61 69 6c 75 72 65 20 72 65 74 75 72   a failure retur
12320 6e 20 63 6f 64 65 20 69 6e 20 74 68 69 73 0d 0a  n code in this..
12330 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
12340 63 61 73 65 29 2e 0d 0a 20 20 20 20 20 20 20 20  case)...        
12350 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  #..        addCo
12360 6e 73 74 72 61 69 6e 74 20 73 71 6c 69 74 65 33  nstraint sqlite3
12370 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63  _win32_set_direc
12380 74 6f 72 79 0d 0a 0d 0a 20 20 20 20 20 20 20 20  tory....        
12390 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79  tputs $channel y
123a0 65 73 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  es\n....        
123b0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
123c0 45 3a 20 44 6f 65 73 20 6f 75 72 20 63 61 6c 6c  E: Does our call
123d0 65 72 20 77 61 6e 74 20 74 6f 20 72 65 73 65 74  er want to reset
123e0 20 74 68 65 20 64 69 72 65 63 74 6f 72 69 65 73   the directories
123f0 3f 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ?..        #..  
12400 20 20 20 20 20 20 69 66 20 7b 24 72 65 73 65 74        if {$reset
12410 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
12420 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
12430 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 20 6d 61 6b   # NOTE: Now mak
12440 65 20 73 75 72 65 20 74 68 65 20 64 61 74 61 62  e sure the datab
12450 61 73 65 20 61 6e 64 20 74 65 6d 70 6f 72 61 72  ase and temporar
12460 79 20 64 69 72 65 63 74 6f 72 69 65 73 20 61 72  y directories ar
12470 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  e..          #  
12480 20 20 20 20 20 72 65 73 65 74 20 74 68 65 69 72       reset their
12490 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 2c   default values,
124a0 20 77 68 69 63 68 20 73 68 6f 75 6c 64 20 62 65   which should be
124b0 20 6e 75 6c 6c 20 66 6f 72 20 62 6f 74 68 2e 0d   null for both..
124c0 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
124d0 20 20 20 53 69 6e 63 65 20 74 68 65 20 73 71 6c     Since the sql
124e0 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
124f0 69 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f  irectory functio
12500 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 0d  n is available,.
12510 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
12520 20 20 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20     use it...    
12530 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
12540 20 20 20 66 6f 72 20 7b 73 65 74 20 69 6e 64 65     for {set inde
12550 78 20 31 7d 20 7b 24 69 6e 64 65 78 20 3c 20 33  x 1} {$index < 3
12560 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b  } {incr index} {
12570 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
12580 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
12590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125a0 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
125b0 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
125c0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
125d0 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
125e0 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65  ta.SQLite.Unsafe
125f0 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d  NativeMethods \.
12600 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12610 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e       sqlite3_win
12620 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79  32_set_directory
12630 20 24 69 6e 64 65 78 20 6e 75 6c 6c 7d 20 5c 0d   $index null} \.
12640 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12650 20 20 20 20 20 72 65 73 75 6c 74 5d 20 3d 3d 20       result] == 
12660 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
12670 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
12680 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
12690 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
126a0 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
126b0 61 6c 6c 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  all sqlite3_win3
126c0 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28  2_set_directory(
126d0 22 20 24 69 6e 64 65 78 20 5c 0d 0a 20 20 20 20  " $index \..    
126e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2c                ",
126f0 20 6e 75 6c 6c 29 2e 2e 2e 20 6f 6b 3a 20 22 20   null)... ok: " 
12700 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
12710 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
12720 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
12730 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
12740 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
12750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12760 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69   "---- call sqli
12770 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69  te3_win32_set_di
12780 72 65 63 74 6f 72 79 28 22 20 24 69 6e 64 65 78  rectory(" $index
12790 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
127a0 20 20 20 20 20 20 22 2c 20 6e 75 6c 6c 29 2e 2e        ", null)..
127b0 2e 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  . error: " \n\t 
127c0 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
127d0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
127e0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
127f0 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65   }..      } else
12800 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
12810 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d  s $channel no\n.
12820 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
12830 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f        # NOTE: Do
12840 65 73 20 6f 75 72 20 63 61 6c 6c 65 72 20 77 61  es our caller wa
12850 6e 74 20 74 6f 20 72 65 73 65 74 20 74 68 65 20  nt to reset the 
12860 64 69 72 65 63 74 6f 72 69 65 73 3f 20 20 54 68  directories?  Th
12870 69 73 20 63 61 6e 20 6f 6e 6c 79 0d 0a 20 20 20  is can only..   
12880 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65 20       #       be 
12890 70 65 72 66 6f 72 6d 65 64 20 69 66 20 53 51 4c  performed if SQL
128a0 69 74 65 20 69 73 20 6c 6f 61 64 65 64 20 61 6e  ite is loaded an
128b0 64 20 72 65 61 64 79 20 66 6f 72 20 75 73 65 20  d ready for use 
128c0 62 79 20 74 68 65 20 74 65 73 74 0d 0a 20 20 20  by the test..   
128d0 20 20 20 20 20 23 20 20 20 20 20 20 20 73 75 69       #       sui
128e0 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  te...        #..
128f0 20 20 20 20 20 20 20 20 69 66 20 7b 24 72 65 73          if {$res
12900 65 74 20 26 26 20 5b 69 73 53 51 4c 69 74 65 52  et && [isSQLiteR
12910 65 61 64 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  eady]} then {.. 
12920 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
12930 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f        # NOTE: No
12940 77 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  w make sure the 
12950 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 65 6d  database and tem
12960 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 69  porary directori
12970 65 73 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20  es are..        
12980 20 20 23 20 20 20 20 20 20 20 72 65 73 65 74 20    #       reset 
12990 74 68 65 69 72 20 64 65 66 61 75 6c 74 20 76 61  their default va
129a0 6c 75 65 73 2c 20 77 68 69 63 68 20 73 68 6f 75  lues, which shou
129b0 6c 64 20 62 65 20 6e 75 6c 6c 20 66 6f 72 20 62  ld be null for b
129c0 6f 74 68 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  oth...          
129d0 23 20 20 20 20 20 20 20 53 69 6e 63 65 20 74 68  #       Since th
129e0 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  e sqlite3_win32_
129f0 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66 75  set_directory fu
12a00 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 0d  nction does not.
12a10 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
12a20 20 20 20 61 70 70 65 61 72 20 74 6f 20 62 65 20     appear to be 
12a30 61 76 61 69 6c 61 62 6c 65 2c 20 75 73 65 20 74  available, use t
12a40 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 50 52  he associated PR
12a50 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 73 0d 0a 20  AGMA commands.. 
12a60 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
12a70 20 69 6e 73 74 65 61 64 2e 0d 0a 20 20 20 20 20   instead...     
12a80 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
12a90 20 20 66 6f 72 65 61 63 68 20 64 69 72 65 63 74    foreach direct
12aa0 6f 72 79 20 5b 6c 69 73 74 20 64 61 74 61 5f 73  ory [list data_s
12ab0 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20 74  tore_directory t
12ac0 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74  emp_store_direct
12ad0 6f 72 79 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20  ory] {..        
12ae0 20 20 20 20 73 65 74 20 73 71 6c 20 5b 61 70 70      set sql [app
12af0 65 6e 64 41 72 67 73 20 22 50 52 41 47 4d 41 20  endArgs "PRAGMA 
12b00 22 20 24 64 69 72 65 63 74 6f 72 79 20 22 20 3d  " $directory " =
12b10 20 5c 22 5c 22 3b 22 5d 0d 0a 0d 0a 20 20 20 20   \"\";"]....    
12b20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
12b30 63 68 20 7b 65 78 65 63 75 74 65 53 71 6c 20 24  ch {executeSql $
12b40 73 71 6c 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20  sql} result] == 
12b50 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
12b60 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
12b70 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
12b80 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
12b90 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 65           "---- e
12ba0 78 65 63 75 74 65 20 50 52 41 47 4d 41 20 22 20  xecute PRAGMA " 
12bb0 24 64 69 72 65 63 74 6f 72 79 20 22 2e 2e 2e 20  $directory "... 
12bc0 6f 6b 3a 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ok: \"" \..     
12bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 24 72 65               $re
12be0 73 75 6c 74 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20  sult \"\n]..    
12bf0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
12c00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
12c10 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
12c20 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
12c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c40 22 2d 2d 2d 2d 20 65 78 65 63 75 74 65 20 50 52  "---- execute PR
12c50 41 47 4d 41 20 22 20 24 64 69 72 65 63 74 6f 72  AGMA " $director
12c60 79 20 22 2e 2e 2e 20 65 72 72 6f 72 3a 20 22 20  y "... error: " 
12c70 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
12c80 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c       \n\t $resul
12c90 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  t \n]..         
12ca0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
12cb0 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
12cc0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
12cd0 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
12ce0 46 69 6e 61 6c 6c 79 2c 20 73 68 6f 77 20 74 68  Finally, show th
12cf0 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
12d00 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
12d10 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 0d 0a 20  and temporary.. 
12d20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 69 72       #       dir
12d30 65 63 74 6f 72 69 65 73 2e 20 20 54 68 69 73 20  ectories.  This 
12d40 63 61 6e 20 6f 6e 6c 79 20 62 65 20 70 65 72 66  can only be perf
12d50 6f 72 6d 65 64 20 69 66 20 53 51 4c 69 74 65 20  ormed if SQLite 
12d60 69 73 20 6c 6f 61 64 65 64 0d 0a 20 20 20 20 20  is loaded..     
12d70 20 23 20 20 20 20 20 20 20 61 6e 64 20 72 65 61   #       and rea
12d80 64 79 20 66 6f 72 20 75 73 65 20 62 79 20 74 68  dy for use by th
12d90 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20  e test suite... 
12da0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
12db0 20 7b 5b 69 73 53 51 4c 69 74 65 52 65 61 64 79   {[isSQLiteReady
12dc0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
12dd0 20 20 20 66 6f 72 65 61 63 68 20 64 69 72 65 63     foreach direc
12de0 74 6f 72 79 20 5b 6c 69 73 74 20 64 61 74 61 5f  tory [list data_
12df0 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20  store_directory 
12e00 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63  temp_store_direc
12e10 74 6f 72 79 5d 20 7b 0d 0a 20 20 20 20 20 20 20  tory] {..       
12e20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
12e30 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 2d  l [appendArgs "-
12e40 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 22 20 24  --- checking " $
12e50 64 69 72 65 63 74 6f 72 79 20 22 2e 2e 2e 20 22  directory "... "
12e60 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73  ]....          s
12e70 65 74 20 73 71 6c 20 5b 61 70 70 65 6e 64 41 72  et sql [appendAr
12e80 67 73 20 22 50 52 41 47 4d 41 20 22 20 24 64 69  gs "PRAGMA " $di
12e90 72 65 63 74 6f 72 79 20 5c 3b 5d 0d 0a 0d 0a 20  rectory \;].... 
12ea0 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
12eb0 74 63 68 20 7b 65 78 65 63 75 74 65 53 71 6c 20  tch {executeSql 
12ec0 24 73 71 6c 20 73 63 61 6c 61 72 7d 20 72 65 73  $sql scalar} res
12ed0 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ult] == 0} then 
12ee0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
12ef0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
12f00 70 70 65 6e 64 41 72 67 73 20 22 6f 6b 3a 20 5c  ppendArgs "ok: \
12f10 22 22 20 24 72 65 73 75 6c 74 20 5c 22 5c 6e 5d  "" $result \"\n]
12f20 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
12f30 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
12f40 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
12f50 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 65 72   [appendArgs "er
12f60 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65 73  ror: " \n\t $res
12f70 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ult \n]..       
12f80 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
12f90 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
12fa0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 6c 6f 61  ....    proc loa
12fb0 64 53 51 4c 69 74 65 54 65 73 74 53 65 74 74 69  dSQLiteTestSetti
12fc0 6e 67 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 73  ngs { channel {s
12fd0 75 66 66 69 78 20 22 22 7d 20 7b 71 75 69 65 74  uffix ""} {quiet
12fe0 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20   false} } {..   
12ff0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
13000 54 45 3a 20 53 6b 69 70 20 6c 6f 61 64 69 6e 67  TE: Skip loading
13010 20 74 68 65 20 73 65 74 74 69 6e 67 73 20 69 66   the settings if
13020 20 74 68 65 69 72 20 75 73 61 67 65 20 68 61 73   their usage has
13030 20 62 65 65 6e 20 64 69 73 61 62 6c 65 64 2e 0d   been disabled..
13040 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
13050 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
13060 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 54 65 73  s ::no(sqliteTes
13070 74 53 65 74 74 69 6e 67 73 29 5d 7d 20 74 68 65  tSettings)]} the
13080 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
13090 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
130a0 4c 6f 61 64 20 63 75 73 74 6f 6d 20 70 65 72 2d  Load custom per-
130b0 75 73 65 72 20 61 6e 64 2f 6f 72 20 70 65 72 2d  user and/or per-
130c0 68 6f 73 74 20 74 65 73 74 20 73 65 74 74 69 6e  host test settin
130d0 67 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20  gs now...       
130e0 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
130f0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
13100 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 75 73 65 72  cl_platform(user
13110 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
13120 20 20 20 20 20 20 73 65 74 20 75 73 65 72 53 65        set userSe
13130 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 5b  ttingsFileName [
13140 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 43 6f  file join [getCo
13150 6d 6d 6f 6e 44 69 72 65 63 74 6f 72 79 5d 20 5c  mmonDirectory] \
13160 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
13170 5b 61 70 70 65 6e 64 41 72 67 73 20 73 65 74 74  [appendArgs sett
13180 69 6e 67 73 20 24 73 75 66 66 69 78 20 2e 20 24  ings $suffix . $
13190 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 75  ::tcl_platform(u
131a0 73 65 72 29 20 2e 65 61 67 6c 65 5d 5d 0d 0a 0d  ser) .eagle]]...
131b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
131c0 66 69 6c 65 20 65 78 69 73 74 73 20 24 75 73 65  file exists $use
131d0 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d  rSettingsFileNam
131e0 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
131f0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
13200 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
13210 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
13220 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
13230 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
13240 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
13250 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d 75 73 65   loading per-use
13260 72 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20  r test settings 
13270 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20  file \"" \..    
13280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 75                $u
13290 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e  serSettingsFileN
132a0 61 6d 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 20 20  ame \"...\n]..  
132b0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
132c0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
132d0 63 61 74 63 68 20 7b 75 70 6c 65 76 65 6c 20 31  catch {uplevel 1
132e0 20 5b 6c 69 73 74 20 73 6f 75 72 63 65 20 24 75   [list source $u
132f0 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e  serSettingsFileN
13300 61 6d 65 5d 7d 20 5c 0d 0a 20 20 20 20 20 20 20  ame]} \..       
13310 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72               err
13320 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
13330 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
13340 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
13350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13360 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
13370 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
13380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13390 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
133a0 20 66 61 69 6c 65 64 20 74 6f 20 6c 6f 61 64 20   failed to load 
133b0 70 65 72 2d 75 73 65 72 20 73 65 74 74 69 6e 67  per-user setting
133c0 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20  s file \"" \..  
133d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133e0 20 20 24 75 73 65 72 53 65 74 74 69 6e 67 73 46    $userSettingsF
133f0 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 65 72 72  ileName "\", err
13400 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f  or: " \n\t $erro
13410 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  r \n]..         
13420 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
13430 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
13440 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
13450 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
13460 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
13470 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
13480 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
13490 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
134a0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
134b0 73 6b 69 70 70 65 64 20 6c 6f 61 64 69 6e 67 20  skipped loading 
134c0 70 65 72 2d 75 73 65 72 20 74 65 73 74 20 73 65  per-user test se
134d0 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20  ttings file \"" 
134e0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
134f0 20 20 20 20 20 24 75 73 65 72 53 65 74 74 69 6e       $userSettin
13500 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20  gsFileName "\", 
13510 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  it does not exis
13520 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  t\n"]..         
13530 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
13540 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
13550 20 20 20 20 20 20 20 20 23 23 23 23 23 23 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 0d  ###############.
135a0 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  ...        if {[
135b0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63  info exists ::tc
135c0 6c 5f 70 6c 61 74 66 6f 72 6d 28 68 6f 73 74 29  l_platform(host)
135d0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
135e0 20 20 20 20 20 73 65 74 20 68 6f 73 74 53 65 74       set hostSet
135f0 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 5b 66  tingsFileName [f
13600 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 43 6f 6d  ile join [getCom
13610 6d 6f 6e 44 69 72 65 63 74 6f 72 79 5d 20 5c 0d  monDirectory] \.
13620 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
13630 61 70 70 65 6e 64 41 72 67 73 20 73 65 74 74 69  appendArgs setti
13640 6e 67 73 20 24 73 75 66 66 69 78 20 2e 20 24 3a  ngs $suffix . $:
13650 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 68 6f  :tcl_platform(ho
13660 73 74 29 20 2e 65 61 67 6c 65 5d 5d 0d 0a 0d 0a  st) .eagle]]....
13670 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66            if {[f
13680 69 6c 65 20 65 78 69 73 74 73 20 24 68 6f 73 74  ile exists $host
13690 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65  SettingsFileName
136a0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
136b0 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
136c0 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
136d0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
136e0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
136f0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
13700 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
13710 6c 6f 61 64 69 6e 67 20 70 65 72 2d 68 6f 73 74  loading per-host
13720 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 66   test settings f
13730 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ile \"" \..     
13740 20 20 20 20 20 20 20 20 20 20 20 20 20 24 68 6f               $ho
13750 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61  stSettingsFileNa
13760 6d 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 20 20 20  me \"...\n]..   
13770 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
13780 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63            if {[c
13790 61 74 63 68 20 7b 75 70 6c 65 76 65 6c 20 31 20  atch {uplevel 1 
137a0 5b 6c 69 73 74 20 73 6f 75 72 63 65 20 24 68 6f  [list source $ho
137b0 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61  stSettingsFileNa
137c0 6d 65 5d 7d 20 5c 0d 0a 20 20 20 20 20 20 20 20  me]} \..        
137d0 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f              erro
137e0 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  r]} then {..    
137f0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
13800 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
13810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
13820 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
13830 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
13840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13850 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
13860 66 61 69 6c 65 64 20 74 6f 20 6c 6f 61 64 20 70  failed to load p
13870 65 72 2d 68 6f 73 74 20 73 65 74 74 69 6e 67 73  er-host settings
13880 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20   file \"" \..   
13890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138a0 20 24 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69   $hostSettingsFi
138b0 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 65 72 72 6f  leName "\", erro
138c0 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72  r: " \n\t $error
138d0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
138e0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
138f0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
13900 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
13910 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
13920 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
13930 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
13940 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
13950 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
13960 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
13970 6b 69 70 70 65 64 20 6c 6f 61 64 69 6e 67 20 70  kipped loading p
13980 65 72 2d 68 6f 73 74 20 74 65 73 74 20 73 65 74  er-host test set
13990 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c  tings file \"" \
139a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
139b0 20 20 20 20 24 68 6f 73 74 53 65 74 74 69 6e 67      $hostSetting
139c0 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 69  sFileName "\", i
139d0 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
139e0 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
139f0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
13a00 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
13a10 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
13a20 20 20 20 20 70 72 6f 63 20 72 75 6e 53 51 4c 69      proc runSQLi
13a30 74 65 54 65 73 74 50 72 6f 6c 6f 67 75 65 20 7b  teTestPrologue {
13a40 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
13a50 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70      # NOTE: Skip
13a60 20 72 75 6e 6e 69 6e 67 20 6f 75 72 20 63 75 73   running our cus
13a70 74 6f 6d 20 70 72 6f 6c 6f 67 75 65 20 69 66 20  tom prologue if 
13a80 74 68 65 20 6d 61 69 6e 20 6f 6e 65 20 68 61 73  the main one has
13a90 20 62 65 65 6e 0d 0a 20 20 20 20 20 20 23 20 20   been..      #  
13aa0 20 20 20 20 20 73 6b 69 70 70 65 64 2e 0d 0a 20       skipped... 
13ab0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
13ac0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
13ad0 3a 3a 6e 6f 28 70 72 6f 6c 6f 67 75 65 2e 65 61  ::no(prologue.ea
13ae0 67 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  gle)]} then {.. 
13af0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
13b00 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 74    # NOTE: Load t
13b10 68 65 20 22 62 65 66 6f 72 65 2d 63 6f 6e 73 74  he "before-const
13b20 72 61 69 6e 74 73 22 20 63 75 73 74 6f 6d 20 70  raints" custom p
13b30 65 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20 70  er-user and/or p
13b40 65 72 2d 68 6f 73 74 0d 0a 20 20 20 20 20 20 20  er-host..       
13b50 20 23 20 20 20 20 20 20 20 74 65 73 74 20 73 65   #       test se
13b60 74 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20 20  ttings now...   
13b70 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
13b80 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20  uplevel 1 [list 
13b90 6c 6f 61 64 53 51 4c 69 74 65 54 65 73 74 53 65  loadSQLiteTestSe
13ba0 74 74 69 6e 67 73 20 24 3a 3a 74 65 73 74 5f 63  ttings $::test_c
13bb0 68 61 6e 6e 65 6c 20 2e 62 65 66 6f 72 65 5d 0d  hannel .before].
13bc0 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
13bd0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 65        # NOTE: De
13be0 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 61 6d 65  termine the name
13bf0 73 20 6f 66 20 74 68 65 20 6e 61 74 69 76 65 20  s of the native 
13c00 70 6c 61 74 66 6f 72 6d 20 61 6e 64 20 61 72 63  platform and arc
13c10 68 69 74 65 63 74 75 72 65 2e 0d 0a 20 20 20 20  hitecture...    
13c20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
13c30 65 74 20 70 6c 61 74 66 6f 72 6d 20 5b 67 65 74  et platform [get
13c40 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20 74 72  BuildPlatform tr
13c50 75 65 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74  ue]..        set
13c60 20 61 72 63 68 69 74 65 63 74 75 72 65 20 5b 61   architecture [a
13c70 72 63 68 69 74 65 63 74 75 72 65 46 6f 72 50 6c  rchitectureForPl
13c80 61 74 66 6f 72 6d 20 24 70 6c 61 74 66 6f 72 6d  atform $platform
13c90 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
13ca0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
13cb0 53 68 6f 77 20 74 68 65 20 70 6c 61 74 66 6f 72  Show the platfor
13cc0 6d 20 61 6e 64 20 61 72 63 68 69 74 65 63 74 75  m and architectu
13cd0 72 65 20 75 73 65 64 20 74 6f 20 68 65 6c 70 20  re used to help 
13ce0 6c 6f 63 61 74 65 20 74 68 65 0d 0a 20 20 20 20  locate the..    
13cf0 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 74 69      #       nati
13d00 76 65 20 62 75 69 6c 64 20 66 69 6c 65 73 2e 0d  ve build files..
13d10 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
13d20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
13d30 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
13d40 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
13d50 20 20 20 20 20 22 2d 2d 2d 2d 20 70 6c 61 74 66       "---- platf
13d60 6f 72 6d 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67  orm for locating
13d70 20 6e 61 74 69 76 65 20 62 75 69 6c 64 20 66 69   native build fi
13d80 6c 65 73 20 69 73 20 5c 22 22 20 5c 0d 0a 20 20  les is \"" \..  
13d90 20 20 20 20 20 20 20 20 20 20 24 70 6c 61 74 66            $platf
13da0 6f 72 6d 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20  orm \"\n]....   
13db0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
13dc0 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
13dd0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
13de0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 61 72 63 68        "---- arch
13df0 69 74 65 63 74 75 72 65 20 66 6f 72 20 6c 6f 63  itecture for loc
13e00 61 74 69 6e 67 20 6e 61 74 69 76 65 20 62 75 69  ating native bui
13e10 6c 64 20 66 69 6c 65 73 20 69 73 20 5c 22 22 20  ld files is \"" 
13e20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24  \..            $
13e30 61 72 63 68 69 74 65 63 74 75 72 65 20 5c 22 5c  architecture \"\
13e40 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  n]....        #.
13e50 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
13e60 20 42 75 69 6c 64 20 61 20 6c 69 73 74 20 6f 66   Build a list of
13e70 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66   configuration f
13e80 69 6c 65 73 20 74 68 61 74 20 77 65 20 68 61 6e  iles that we han
13e90 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  dle...        #.
13ea0 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 6e  .        set con
13eb0 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69  figFileNames [li
13ec0 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  st \..          
13ed0 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
13ee0 4c 69 74 65 2e 64 6c 6c 2e 63 6f 6e 66 69 67 5d  Lite.dll.config]
13ef0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
13f00 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42         # NOTE: B
13f10 75 69 6c 64 20 61 20 6c 69 73 74 20 6f 66 20 61  uild a list of a
13f20 75 78 69 6c 69 61 72 79 20 4d 61 6e 61 67 65 64  uxiliary Managed
13f30 20 44 65 62 75 67 67 69 6e 67 20 41 73 73 69 73   Debugging Assis
13f40 74 61 6e 74 73 20 28 4d 44 41 29 0d 0a 20 20 20  tants (MDA)..   
13f50 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e       #       con
13f60 66 69 67 75 72 61 74 69 6f 6e 20 66 69 6c 65 73  figuration files
13f70 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65 2e   that we handle.
13f80 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
13f90 20 20 20 20 20 73 65 74 20 6d 64 61 43 6f 6e 66       set mdaConf
13fa0 69 67 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73  igFileNames [lis
13fb0 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
13fc0 20 49 6e 73 74 61 6c 6c 65 72 2e 65 78 65 2e 6d   Installer.exe.m
13fd0 64 61 2e 63 6f 6e 66 69 67 20 74 65 73 74 2e 65  da.config test.e
13fe0 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 5c 0d  xe.mda.config \.
13ff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
14000 74 6c 69 6e 71 2e 65 78 65 2e 6d 64 61 2e 63 6f  tlinq.exe.mda.co
14010 6e 66 69 67 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  nfig]....       
14020 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
14030 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 6c 69  TE: Build the li
14040 73 74 20 6f 66 20 6e 61 74 69 76 65 20 61 73 73  st of native ass
14050 65 6d 62 6c 79 20 66 69 6c 65 73 20 74 68 61 74  embly files that
14060 20 77 65 20 68 61 6e 64 6c 65 2e 20 20 54 68 65   we handle.  The
14070 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
14080 20 20 72 65 61 73 6f 6e 20 74 68 65 20 22 53 79    reason the "Sy
14090 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
140a0 2e 64 6c 6c 22 20 66 69 6c 65 20 69 73 20 69 6e  .dll" file is in
140b0 63 6c 75 64 65 64 20 68 65 72 65 20 69 73 0d 0a  cluded here is..
140c0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
140d0 62 65 63 61 75 73 65 20 69 74 20 63 6f 75 6c 64  because it could
140e0 20 62 65 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f   be the mixed-mo
140f0 64 65 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20  de assembly...  
14100 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
14110 20 73 65 74 20 6e 61 74 69 76 65 46 69 6c 65 4e   set nativeFileN
14120 61 6d 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20  ames [list \..  
14130 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14140 33 2e 64 6c 6c 20 53 51 4c 69 74 65 2e 49 6e 74  3.dll SQLite.Int
14150 65 72 6f 70 2e 64 6c 6c 20 53 79 73 74 65 6d 2e  erop.dll System.
14160 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d  Data.SQLite.dll]
14170 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
14180 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42         # NOTE: B
14190 75 69 6c 64 20 74 68 65 20 6c 69 73 74 20 6f 66  uild the list of
141a0 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c   managed assembl
141b0 79 20 66 69 6c 65 73 20 74 68 61 74 20 77 65 20  y files that we 
141c0 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20  handle...       
141d0 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
141e0 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73  managedFileNames
141f0 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20   [list \..      
14200 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
14210 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 20 53 79 73  a.SQLite.dll Sys
14220 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
14230 4c 69 6e 71 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20  Linq.dll]....   
14240 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
14250 23 20 4e 4f 54 45 3a 20 52 65 6d 6f 76 65 20 61  # NOTE: Remove a
14260 6e 79 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69  ny test constrai
14270 6e 74 73 20 74 68 61 74 20 72 65 66 65 72 20 74  nts that refer t
14280 6f 20 74 68 65 20 6e 61 74 69 76 65 20 61 6e 64  o the native and
14290 2f 6f 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20  /or..        #  
142a0 20 20 20 20 20 6d 61 6e 61 67 65 64 20 61 73 73       managed ass
142b0 65 6d 62 6c 79 20 66 69 6c 65 73 20 74 68 61 74  embly files that
142c0 20 77 65 20 68 61 6e 64 6c 65 20 75 6e 6c 65 73   we handle unles
142d0 73 20 66 6f 72 62 69 64 64 65 6e 20 66 72 6f 6d  s forbidden from
142e0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
142f0 20 20 64 6f 69 6e 67 20 73 6f 2e 0d 0a 20 20 20    doing so...   
14300 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
14310 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
14320 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 52 65 6d  s ::no(sqliteRem
14330 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 73 29 5d  oveConstraints)]
14340 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
14350 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
14360 4e 61 6d 65 20 24 63 6f 6e 66 69 67 46 69 6c 65  Name $configFile
14370 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
14380 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74       removeConst
14390 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
143a0 73 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61 6d  s file_ $fileNam
143b0 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  e]..          }.
143c0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ...          for
143d0 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d  each fileName $m
143e0 64 61 43 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65  daConfigFileName
143f0 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
14400 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e   removeConstrain
14410 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
14420 6c 65 5f 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a  le_ $fileName]..
14430 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
14440 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
14450 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76   fileName $nativ
14460 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  eFileNames {..  
14470 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76 65            remove
14480 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
14490 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 24 66 69  ndArgs file_ $fi
144a0 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20  leName]..       
144b0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
144c0 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
144d0 6d 65 20 24 6d 61 6e 61 67 65 64 46 69 6c 65 4e  me $managedFileN
144e0 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
144f0 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72      removeConstr
14500 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
14510 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61 6d 65   file_ $fileName
14520 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
14530 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
14540 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
14550 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 61 6c 6c  # NOTE: Skip all
14560 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
14570 69 74 65 20 72 65 6c 61 74 65 64 20 66 69 6c 65  ite related file
14580 20 68 61 6e 64 6c 69 6e 67 20 28 64 65 6c 65 74   handling (delet
14590 69 6e 67 2c 0d 0a 20 20 20 20 20 20 20 20 23 20  ing,..        # 
145a0 20 20 20 20 20 20 63 6f 70 79 69 6e 67 2c 20 61        copying, a
145b0 6e 64 20 6c 6f 61 64 69 6e 67 29 20 69 66 20 69  nd loading) if i
145c0 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20  nstructed...    
145d0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
145e0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
145f0 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 46 69 6c 65   ::no(sqliteFile
14600 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
14610 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
14620 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70      # NOTE: Skip
14630 20 74 72 79 69 6e 67 20 74 6f 20 64 65 6c 65 74   trying to delet
14640 65 20 61 6e 79 20 66 69 6c 65 73 20 69 66 20 69  e any files if i
14650 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20  nstructed...    
14660 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
14670 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
14680 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65  ists ::no(delete
14690 53 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20 74  SqliteFiles)]} t
146a0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
146b0 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
146c0 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65  ists ::no(delete
146d0 53 71 6c 69 74 65 43 6f 6e 66 69 67 46 69 6c 65  SqliteConfigFile
146e0 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
146f0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61             forea
14700 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 63 6f 6e  ch fileName $con
14710 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  figFileNames {..
14720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14730 74 72 79 44 65 6c 65 74 65 42 69 6e 61 72 79 46  tryDeleteBinaryF
14740 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20  ile $fileName.. 
14750 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
14760 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
14770 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
14780 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
14790 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65  :no(deleteSqlite
147a0 4e 61 74 69 76 65 46 69 6c 65 73 29 5d 7d 20 74  NativeFiles)]} t
147b0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
147c0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
147d0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65  exists ::no(dele
147e0 74 65 53 71 6c 69 74 65 49 6d 70 6c 69 63 69 74  teSqliteImplicit
147f0 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
14800 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14810 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
14820 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d  e $nativeFileNam
14830 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
14840 20 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74          tryDelet
14850 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e  eAssembly $fileN
14860 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ame..           
14870 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
14880 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
14890 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
148a0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
148b0 64 65 6c 65 74 65 53 71 6c 69 74 65 50 6c 61 74  deleteSqlitePlat
148c0 66 6f 72 6d 46 69 6c 65 73 29 5d 20 26 26 20 5c  formFiles)] && \
148d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
148e0 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
148f0 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20  th $platform] > 
14900 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
14910 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61             forea
14920 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74  ch fileName $nat
14930 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  iveFileNames {..
14940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14950 20 20 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d    tryDeleteAssem
14960 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 24 70  bly $fileName $p
14970 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20  latform..       
14980 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
14990 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
149a0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
149b0 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
149c0 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65  :no(deleteSqlite
149d0 41 72 63 68 69 74 65 63 74 75 72 65 46 69 6c 65  ArchitectureFile
149e0 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  s)] && \..      
149f0 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72              [str
14a00 69 6e 67 20 6c 65 6e 67 74 68 20 24 61 72 63 68  ing length $arch
14a10 69 74 65 63 74 75 72 65 5d 20 3e 20 30 7d 20 74  itecture] > 0} t
14a20 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
14a30 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
14a40 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46  ileName $nativeF
14a50 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
14a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
14a70 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79 20  yDeleteAssembly 
14a80 24 66 69 6c 65 4e 61 6d 65 20 24 61 72 63 68 69  $fileName $archi
14a90 74 65 63 74 75 72 65 0d 0a 20 20 20 20 20 20 20  tecture..       
14aa0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
14ab0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
14ac0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
14ad0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
14ae0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
14af0 28 64 65 6c 65 74 65 53 71 6c 69 74 65 4d 61 6e  (deleteSqliteMan
14b00 61 67 65 64 46 69 6c 65 73 29 5d 7d 20 74 68 65  agedFiles)]} the
14b10 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
14b20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
14b30 61 6d 65 20 24 6d 61 6e 61 67 65 64 46 69 6c 65  ame $managedFile
14b40 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
14b50 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c 65           tryDele
14b60 74 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65  teAssembly $file
14b70 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Name..          
14b80 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
14b90 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
14ba0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23  }....          #
14bb0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
14bc0 54 45 3a 20 43 68 65 63 6b 20 66 6f 72 20 74 68  TE: Check for th
14bd0 65 20 22 61 75 74 6f 53 65 6c 65 63 74 22 20 72  e "autoSelect" r
14be0 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 2e 20 20  untime option.  
14bf0 49 66 20 70 72 65 73 65 6e 74 2c 0d 0a 20 20 20  If present,..   
14c00 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
14c10 74 74 65 6d 70 74 20 74 6f 20 61 75 74 6f 6d 61  ttempt to automa
14c20 74 69 63 61 6c 6c 79 20 73 65 6c 65 63 74 20 74  tically select t
14c30 68 65 20 66 69 72 73 74 20 61 76 61 69 6c 61 62  he first availab
14c40 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  le..          # 
14c50 20 20 20 20 20 20 62 75 69 6c 64 20 28 6f 72 20        build (or 
14c60 22 72 65 6c 65 61 73 65 22 29 20 6f 66 20 53 51  "release") of SQ
14c70 4c 69 74 65 20 61 6e 64 20 53 79 73 74 65 6d 2e  Lite and System.
14c80 44 61 74 61 2e 53 51 4c 69 74 65 0d 0a 20 20 20  Data.SQLite..   
14c90 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66         #       f
14ca0 6f 72 20 75 73 65 20 77 69 74 68 20 74 68 65 20  or use with the 
14cb0 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20  test suite...   
14cc0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
14cd0 20 20 20 20 69 66 20 7b 5b 68 61 73 52 75 6e 74      if {[hasRunt
14ce0 69 6d 65 4f 70 74 69 6f 6e 20 61 75 74 6f 53 65  imeOption autoSe
14cf0 6c 65 63 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  lect]} then {.. 
14d00 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
14d10 5b 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 42  [checkForSQLiteB
14d20 75 69 6c 64 73 20 24 3a 3a 74 65 73 74 5f 63 68  uilds $::test_ch
14d30 61 6e 6e 65 6c 20 74 72 75 65 5d 7d 20 74 68 65  annel true]} the
14d40 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
14d50 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74     checkForSQLit
14d60 65 52 65 6c 65 61 73 65 73 20 24 3a 3a 74 65 73  eReleases $::tes
14d70 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75 65 0d 0a  t_channel true..
14d80 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
14d90 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
14da0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
14db0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69       # NOTE: Ski
14dc0 70 20 74 72 79 69 6e 67 20 74 6f 20 76 65 72 69  p trying to veri
14dd0 66 79 20 74 68 65 20 62 75 69 6c 64 20 64 69 72  fy the build dir
14de0 65 63 74 6f 72 79 20 69 66 20 69 6e 73 74 72 75  ectory if instru
14df0 63 74 65 64 3b 0d 0a 20 20 20 20 20 20 20 20 20  cted;..         
14e00 20 23 20 20 20 20 20 20 20 6f 74 68 65 72 77 69   #       otherwi
14e10 73 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 69 74  se, make sure it
14e20 20 61 63 74 75 61 6c 6c 79 20 65 78 69 73 74 73   actually exists
14e30 20 6f 72 20 68 61 6c 74 20 74 68 65 20 65 6e 74   or halt the ent
14e40 69 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ire..          #
14e50 20 20 20 20 20 20 20 74 65 73 74 69 6e 67 20 70         testing p
14e60 72 6f 63 65 73 73 20 69 66 20 69 74 20 64 6f 65  rocess if it doe
14e70 73 20 6e 6f 74 20 65 78 69 73 74 2e 0d 0a 20 20  s not exist...  
14e80 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
14e90 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
14ea0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 76 65 72 69  exists ::no(veri
14eb0 66 79 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79  fyBuildDirectory
14ec0 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
14ed0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
14ee0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41         # NOTE: A
14ef0 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  t this point, th
14f00 65 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72  e build director
14f10 79 20 4d 55 53 54 20 65 78 69 73 74 20 61 73 20  y MUST exist as 
14f20 61 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  a..            #
14f30 20 20 20 20 20 20 20 76 61 6c 69 64 20 64 69 72         valid dir
14f40 65 63 74 6f 72 79 20 66 6f 72 20 74 68 65 20 74  ectory for the t
14f50 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73 20 74  esting process t
14f60 6f 20 63 6f 6e 74 69 6e 75 65 2e 0d 0a 20 20 20  o continue...   
14f70 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
14f80 20 20 20 20 20 20 20 20 73 65 74 20 64 69 72 65          set dire
14f90 63 74 6f 72 79 20 5b 67 65 74 42 75 69 6c 64 44  ctory [getBuildD
14fa0 69 72 65 63 74 6f 72 79 5d 0d 0a 0d 0a 20 20 20  irectory]....   
14fb0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 66           if {![f
14fc0 69 6c 65 20 65 78 69 73 74 73 20 24 64 69 72 65  ile exists $dire
14fd0 63 74 6f 72 79 5d 20 7c 7c 20 5c 0d 0a 20 20 20  ctory] || \..   
14fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 21 5b 66               ![f
14ff0 69 6c 65 20 69 73 64 69 72 65 63 74 6f 72 79 20  ile isdirectory 
15000 24 64 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65  $directory]} the
15010 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
15020 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
15030 20 20 20 20 23 20 4e 4f 54 45 3a 20 4a 75 73 74      # NOTE: Just
15040 20 70 72 69 6f 72 20 74 6f 20 61 63 74 75 61 6c   prior to actual
15050 6c 79 20 68 61 6c 74 69 6e 67 20 74 68 65 20 74  ly halting the t
15060 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73 2c 0d  esting process,.
15070 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
15080 20 20 20 20 20 20 20 61 64 64 20 61 6e 20 65 72         add an er
15090 72 6f 72 20 74 6f 20 74 68 65 20 74 65 73 74 20  ror to the test 
150a0 6c 6f 67 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20  log file...     
150b0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
150c0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
150d0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
150e0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
150f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15100 20 22 2d 2d 2d 2d 20 63 6f 75 6c 64 20 6e 6f 74   "---- could not
15110 20 76 65 72 69 66 79 20 62 75 69 6c 64 20 64 69   verify build di
15120 72 65 63 74 6f 72 79 20 5c 22 22 20 24 64 69 72  rectory \"" $dir
15130 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20  ectory \..      
15140 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c              "\",
15150 20 61 6c 6c 20 74 65 73 74 69 6e 67 20 68 61 6c   all testing hal
15160 74 65 64 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20  ted\n"]....     
15170 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
15180 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
15190 3a 20 52 61 69 73 69 6e 67 20 61 20 73 63 72 69  : Raising a scri
151a0 70 74 20 65 72 72 6f 72 20 66 72 6f 6d 20 74 68  pt error from th
151b0 69 73 20 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20  is point should 
151c0 68 61 6c 74 0d 0a 20 20 20 20 20 20 20 20 20 20  halt..          
151d0 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
151e0 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73 2e  testing process.
151f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
15200 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
15210 20 65 72 72 6f 72 20 5b 61 70 70 65 6e 64 41 72   error [appendAr
15220 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
15230 20 20 20 20 20 20 20 20 22 63 6f 75 6c 64 20 6e          "could n
15240 6f 74 20 76 65 72 69 66 79 20 62 75 69 6c 64 20  ot verify build 
15250 64 69 72 65 63 74 6f 72 79 20 5c 22 22 20 24 64  directory \"" $d
15260 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20  irectory \..    
15270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c                "\
15280 22 2c 20 61 6c 6c 20 74 65 73 74 69 6e 67 20 68  ", all testing h
15290 61 6c 74 65 64 22 5d 0d 0a 20 20 20 20 20 20 20  alted"]..       
152a0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
152b0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
152c0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
152d0 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72 79 69 6e  NOTE: Skip tryin
152e0 67 20 74 6f 20 63 6f 70 79 20 61 6e 79 20 66 69  g to copy any fi
152f0 6c 65 73 20 69 66 20 69 6e 73 74 72 75 63 74 65  les if instructe
15300 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  d...          #.
15310 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
15320 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
15330 6f 28 63 6f 70 79 53 71 6c 69 74 65 46 69 6c 65  o(copySqliteFile
15340 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
15350 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
15360 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
15370 63 6f 70 79 53 71 6c 69 74 65 43 6f 6e 66 69 67  copySqliteConfig
15380 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
15390 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .              f
153a0 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
153b0 24 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73  $configFileNames
153c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
153d0 20 20 20 20 74 72 79 43 6f 70 79 42 75 69 6c 64      tryCopyBuild
153e0 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a  File $fileName..
153f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
15400 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
15410 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
15420 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
15430 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 4e  ::no(copySqliteN
15440 61 74 69 76 65 46 69 6c 65 73 29 5d 7d 20 74 68  ativeFiles)]} th
15450 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
15460 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
15470 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53  xists ::no(copyS
15480 71 6c 69 74 65 49 6d 70 6c 69 63 69 74 46 69 6c  qliteImplicitFil
15490 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
154a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
154b0 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
154c0 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20  nativeFileNames 
154d0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
154e0 20 20 20 20 20 74 72 79 43 6f 70 79 41 73 73 65       tryCopyAsse
154f0 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 0d 0a  mbly $fileName..
15500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15510 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
15520 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
15530 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
15540 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53  xists ::no(copyS
15550 71 6c 69 74 65 50 6c 61 74 66 6f 72 6d 46 69 6c  qlitePlatformFil
15560 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  es)] && \..     
15570 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74               [st
15580 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61  ring length $pla
15590 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e  tform] > 0} then
155a0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
155b0 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
155c0 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65  Name $nativeFile
155d0 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
155e0 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f             tryCo
155f0 70 79 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65  pyAssembly $file
15600 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 0d 0a  Name $platform..
15610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15620 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
15630 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
15640 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
15650 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53  xists ::no(copyS
15660 71 6c 69 74 65 41 72 63 68 69 74 65 63 74 75 72  qliteArchitectur
15670 65 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20  eFiles)] && \.. 
15680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15690 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
156a0 24 61 72 63 68 69 74 65 63 74 75 72 65 5d 20 3e  $architecture] >
156b0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
156c0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
156d0 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61  ach fileName $na
156e0 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  tiveFileNames {.
156f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15700 20 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62     tryCopyAssemb
15710 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 24 61 72  ly $fileName $ar
15720 63 68 69 74 65 63 74 75 72 65 0d 0a 20 20 20 20  chitecture..    
15730 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
15740 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
15750 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
15760 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
15770 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
15780 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 4d 61  :no(copySqliteMa
15790 6e 61 67 65 64 46 69 6c 65 73 29 5d 7d 20 74 68  nagedFiles)]} th
157a0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
157b0 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
157c0 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64 46 69 6c  Name $managedFil
157d0 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
157e0 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70            tryCop
157f0 79 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e  yAssembly $fileN
15800 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ame..           
15810 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
15820 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
15830 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  ....          #.
15840 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
15850 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74  E: Skip trying t
15860 6f 20 6c 6f 61 64 20 61 6e 79 20 66 69 6c 65 73  o load any files
15870 20 69 66 20 69 6e 73 74 72 75 63 74 65 64 2e 0d   if instructed..
15880 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
15890 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
158a0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c  fo exists ::no(l
158b0 6f 61 64 53 71 6c 69 74 65 46 69 6c 65 73 29 5d  oadSqliteFiles)]
158c0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
158d0 20 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73        tryLoadAss
158e0 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74  embly System.Dat
158f0 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 0d 0a 20 20  a.SQLite.dll..  
15900 20 20 20 20 20 20 20 20 20 20 74 72 79 4c 6f 61            tryLoa
15910 64 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65 6d  dAssembly System
15920 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e  .Data.SQLite.Lin
15930 71 2e 64 6c 6c 0d 0a 0d 0a 20 20 20 20 20 20 20  q.dll....       
15940 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
15950 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64  exists ::no(load
15960 53 71 6c 69 74 65 50 6c 61 74 66 6f 72 6d 46 69  SqlitePlatformFi
15970 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20  les)] && \..    
15980 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72              [str
15990 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74  ing length $plat
159a0 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20  form] > 0} then 
159b0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
159c0 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79   tryLoadAssembly
159d0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
159e0 69 74 65 2e 64 6c 6c 20 24 70 6c 61 74 66 6f 72  ite.dll $platfor
159f0 6d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  m..            }
15a00 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
15a10 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
15a20 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74  s ::no(loadSqlit
15a30 65 41 72 63 68 69 74 65 63 74 75 72 65 46 69 6c  eArchitectureFil
15a40 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  es)] && \..     
15a50 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69             [stri
15a60 6e 67 20 6c 65 6e 67 74 68 20 24 61 72 63 68 69  ng length $archi
15a70 74 65 63 74 75 72 65 5d 20 3e 20 30 7d 20 74 68  tecture] > 0} th
15a80 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
15a90 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73 65 6d      tryLoadAssem
15aa0 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  bly System.Data.
15ab0 53 51 4c 69 74 65 2e 64 6c 6c 20 24 61 72 63 68  SQLite.dll $arch
15ac0 69 74 65 63 74 75 72 65 0d 0a 20 20 20 20 20 20  itecture..      
15ad0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
15ae0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
15af0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
15b00 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72 79 69   NOTE: Skip tryi
15b10 6e 67 20 74 6f 20 64 65 6c 65 74 65 20 65 78 74  ng to delete ext
15b20 65 72 6e 61 6c 20 66 69 6c 65 73 20 69 66 20 69  ernal files if i
15b30 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20  nstructed...    
15b40 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
15b50 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
15b60 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65  ists ::no(delete
15b70 53 71 6c 69 74 65 45 78 74 65 72 6e 61 6c 46 69  SqliteExternalFi
15b80 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
15b90 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61             forea
15ba0 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 64 61  ch fileName $mda
15bb0 43 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20  ConfigFileNames 
15bc0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
15bd0 20 74 72 79 44 65 6c 65 74 65 42 75 69 6c 64 46   tryDeleteBuildF
15be0 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20  ile $fileName.. 
15bf0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
15c00 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
15c10 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
15c20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70      # NOTE: Skip
15c30 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 70 79 20   trying to copy 
15c40 65 78 74 65 72 6e 61 6c 20 66 69 6c 65 73 20 69  external files i
15c50 66 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20  f instructed... 
15c60 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
15c70 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
15c80 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70   exists ::no(cop
15c90 79 53 71 6c 69 74 65 45 78 74 65 72 6e 61 6c 46  ySqliteExternalF
15ca0 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
15cb0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
15cc0 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
15cd0 45 3a 20 43 6f 70 79 20 74 68 65 20 4d 61 6e 61  E: Copy the Mana
15ce0 67 65 64 20 44 65 62 75 67 67 69 6e 67 20 41 73  ged Debugging As
15cf0 73 69 73 74 61 6e 74 73 20 28 4d 44 41 29 20 63  sistants (MDA) c
15d00 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0d 0a 20 20  onfiguration..  
15d10 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
15d20 20 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 45    file for the E
15d30 61 67 6c 65 20 73 68 65 6c 6c 20 74 6f 20 74 68  agle shell to th
15d40 65 20 62 75 69 6c 64 20 6f 75 74 70 75 74 20 64  e build output d
15d50 69 72 65 63 74 6f 72 79 2c 0d 0a 20 20 20 20 20  irectory,..     
15d60 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77         #       w
15d70 68 69 6c 65 20 75 73 69 6e 67 20 65 61 63 68 20  hile using each 
15d80 6f 66 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  of the names of 
15d90 74 68 65 20 76 61 72 69 6f 75 73 20 6c 65 67 61  the various lega
15da0 63 79 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20  cy test..       
15db0 20 20 20 20 20 23 20 20 20 20 20 20 20 65 78 65       #       exe
15dc0 63 75 74 61 62 6c 65 73 2e 20 20 54 68 69 73 20  cutables.  This 
15dd0 77 69 6c 6c 20 68 65 6c 70 20 74 6f 20 6d 61 6b  will help to mak
15de0 65 20 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20  e sure that all 
15df0 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  the..           
15e00 20 23 20 20 20 20 20 20 20 6c 65 67 61 63 79 20   #       legacy 
15e10 74 65 73 74 73 20 72 75 6e 20 77 69 74 68 20 65  tests run with e
15e20 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20  xactly the same 
15e30 73 65 74 20 6f 66 20 4d 61 6e 61 67 65 64 0d 0a  set of Managed..
15e40 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
15e50 20 20 20 20 44 65 62 75 67 67 69 6e 67 20 41 73      Debugging As
15e60 73 69 73 74 61 6e 74 73 20 63 6f 6e 66 69 67 75  sistants configu
15e70 72 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  red...          
15e80 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
15e90 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
15ea0 65 20 24 6d 64 61 43 6f 6e 66 69 67 46 69 6c 65  e $mdaConfigFile
15eb0 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
15ec0 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 42 69         tryCopyBi
15ed0 6e 61 72 79 46 69 6c 65 20 45 61 67 6c 65 53 68  naryFile EagleSh
15ee0 65 6c 6c 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66  ell.exe.mda.conf
15ef0 69 67 20 22 22 20 24 66 69 6c 65 4e 61 6d 65 0d  ig "" $fileName.
15f00 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
15f10 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
15f20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
15f30 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20    catch {..     
15f40 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
15f50 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
15f60 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
15f70 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69          "---- fi
15f80 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22  le version of \"
15f90 73 71 6c 69 74 65 33 2e 64 6c 6c 5c 22 2e 2e 2e  sqlite3.dll\"...
15fa0 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
15fb0 20 20 20 20 5b 66 69 6c 65 20 76 65 72 73 69 6f      [file versio
15fc0 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65  n [getBinaryFile
15fd0 4e 61 6d 65 20 73 71 6c 69 74 65 33 2e 64 6c 6c  Name sqlite3.dll
15fe0 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ]] \n]..        
15ff0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74  }....        cat
16000 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
16010 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
16020 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
16030 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
16040 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65     "---- file ve
16050 72 73 69 6f 6e 20 6f 66 20 5c 22 53 51 4c 69 74  rsion of \"SQLit
16060 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 5c 22 2e  e.Interop.dll\".
16070 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  .. " \..        
16080 20 20 20 20 20 20 5b 66 69 6c 65 20 76 65 72 73        [file vers
16090 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69  ion [getBinaryFi
160a0 6c 65 4e 61 6d 65 20 53 51 4c 69 74 65 2e 49 6e  leName SQLite.In
160b0 74 65 72 6f 70 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d  terop.dll]] \n].
160c0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
160d0 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20        catch {.. 
160e0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
160f0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
16100 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
16110 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
16120 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f  - file version o
16130 66 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e  f \"System.Data.
16140 53 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20  SQLite.dll\"... 
16150 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
16160 20 20 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e     [file version
16170 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
16180 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  ame System.Data.
16190 53 51 4c 69 74 65 2e 64 6c 6c 5d 5d 20 5c 6e 5d  SQLite.dll]] \n]
161a0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
161b0 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a         catch {..
161c0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
161d0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
161e0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
161f0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
16200 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20  -- file version 
16210 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61  of \"System.Data
16220 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c  .SQLite.Linq.dll
16230 5c 22 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20  \"... " \..     
16240 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 76           [file v
16250 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72  ersion [getBinar
16260 79 46 69 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d  yFileName System
16270 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e  .Data.SQLite.Lin
16280 71 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20 20  q.dll]] \n]..   
16290 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
162a0 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
162b0 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20  ngth $platform] 
162c0 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
162d0 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a         catch {..
162e0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
162f0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
16300 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
16310 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16320 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73   "---- file vers
16330 69 6f 6e 20 6f 66 20 5c 22 22 20 24 70 6c 61 74  ion of \"" $plat
16340 66 6f 72 6d 20 5c 0d 0a 20 20 20 20 20 20 20 20  form \..        
16350 20 20 20 20 20 20 20 20 22 2f 73 71 6c 69 74 65          "/sqlite
16360 33 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5b 66 69  3.dll\"... " [fi
16370 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20 20  le version \..  
16380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67                [g
16390 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  etBinaryFileName
163a0 20 73 71 6c 69 74 65 33 2e 64 6c 6c 20 24 70 6c   sqlite3.dll $pl
163b0 61 74 66 6f 72 6d 5d 5d 20 5c 6e 5d 0d 0a 20 20  atform]] \n]..  
163c0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
163d0 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a         catch {..
163e0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
163f0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
16400 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
16410 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16420 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73   "---- file vers
16430 69 6f 6e 20 6f 66 20 5c 22 22 20 24 70 6c 61 74  ion of \"" $plat
16440 66 6f 72 6d 20 5c 0d 0a 20 20 20 20 20 20 20 20  form \..        
16450 20 20 20 20 20 20 20 20 22 2f 53 51 4c 69 74 65          "/SQLite
16460 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 5c 22 2e 2e  .Interop.dll\"..
16470 2e 20 22 20 5b 66 69 6c 65 20 76 65 72 73 69 6f  . " [file versio
16480 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
16490 20 20 20 20 20 5b 67 65 74 42 69 6e 61 72 79 46       [getBinaryF
164a0 69 6c 65 4e 61 6d 65 20 53 51 4c 69 74 65 2e 49  ileName SQLite.I
164b0 6e 74 65 72 6f 70 2e 64 6c 6c 20 24 70 6c 61 74  nterop.dll $plat
164c0 66 6f 72 6d 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20  form]] \n]..    
164d0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
164e0 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
164f0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
16500 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
16510 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
16520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
16530 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f  ---- file versio
16540 6e 20 6f 66 20 5c 22 22 20 24 70 6c 61 74 66 6f  n of \"" $platfo
16550 72 6d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  rm \..          
16560 20 20 20 20 20 20 22 2f 53 79 73 74 65 6d 2e 44        "/System.D
16570 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c 22  ata.SQLite.dll\"
16580 2e 2e 2e 20 22 20 5b 66 69 6c 65 20 76 65 72 73  ... " [file vers
16590 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ion \..         
165a0 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61 72         [getBinar
165b0 79 46 69 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d  yFileName System
165c0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
165d0 20 24 70 6c 61 74 66 6f 72 6d 5d 5d 20 5c 6e 5d   $platform]] \n]
165e0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
165f0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
16600 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
16610 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74 65 63  length $architec
16620 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ture] > 0} then 
16630 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61 74  {..          cat
16640 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
16650 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
16660 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
16670 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
16680 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c         "---- fil
16690 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22  e version of \""
166a0 20 24 61 72 63 68 69 74 65 63 74 75 72 65 20 5c   $architecture \
166b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
166c0 20 20 22 2f 73 71 6c 69 74 65 33 2e 64 6c 6c 5c    "/sqlite3.dll\
166d0 22 2e 2e 2e 20 22 20 5b 66 69 6c 65 20 76 65 72  "... " [file ver
166e0 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  sion \..        
166f0 20 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61          [getBina
16700 72 79 46 69 6c 65 4e 61 6d 65 20 73 71 6c 69 74  ryFileName sqlit
16710 65 33 2e 64 6c 6c 20 24 61 72 63 68 69 74 65 63  e3.dll $architec
16720 74 75 72 65 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20  ture]] \n]..    
16730 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
16740 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
16750 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
16760 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
16770 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
16780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
16790 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f  ---- file versio
167a0 6e 20 6f 66 20 5c 22 22 20 24 61 72 63 68 69 74  n of \"" $archit
167b0 65 63 74 75 72 65 20 5c 0d 0a 20 20 20 20 20 20  ecture \..      
167c0 20 20 20 20 20 20 20 20 20 20 22 2f 53 51 4c 69            "/SQLi
167d0 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 5c 22  te.Interop.dll\"
167e0 2e 2e 2e 20 22 20 5b 66 69 6c 65 20 76 65 72 73  ... " [file vers
167f0 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ion \..         
16800 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61 72         [getBinar
16810 79 46 69 6c 65 4e 61 6d 65 20 53 51 4c 69 74 65  yFileName SQLite
16820 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 20 24 61 72  .Interop.dll $ar
16830 63 68 69 74 65 63 74 75 72 65 5d 5d 20 5c 6e 5d  chitecture]] \n]
16840 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
16850 0a 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68  .          catch
16860 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
16870 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
16880 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
16890 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
168a0 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20       "---- file 
168b0 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24  version of \"" $
168c0 61 72 63 68 69 74 65 63 74 75 72 65 20 5c 0d 0a  architecture \..
168d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168e0 22 2f 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  "/System.Data.SQ
168f0 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20  Lite.dll\"... " 
16900 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d  [file version \.
16910 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16920 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
16930 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  ame System.Data.
16940 53 51 4c 69 74 65 2e 64 6c 6c 20 24 61 72 63 68  SQLite.dll $arch
16950 69 74 65 63 74 75 72 65 5d 5d 20 5c 6e 5d 0d 0a  itecture]] \n]..
16960 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
16970 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
16980 20 20 73 65 74 20 61 73 73 65 6d 62 6c 69 65 73    set assemblies
16990 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   [object invoke 
169a0 41 70 70 44 6f 6d 61 69 6e 2e 43 75 72 72 65 6e  AppDomain.Curren
169b0 74 44 6f 6d 61 69 6e 20 47 65 74 41 73 73 65 6d  tDomain GetAssem
169c0 62 6c 69 65 73 5d 0d 0a 0d 0a 20 20 20 20 20 20  blies]....      
169d0 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68    object foreach
169e0 20 61 73 73 65 6d 62 6c 79 20 24 61 73 73 65 6d   assembly $assem
169f0 62 6c 69 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  blies {..       
16a00 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d     if {[string m
16a10 61 74 63 68 20 5c 7b 53 79 73 74 65 6d 2e 44 61  atch \{System.Da
16a20 74 61 2e 53 51 4c 69 74 65 2a 20 24 61 73 73 65  ta.SQLite* $asse
16a30 6d 62 6c 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  mbly]} then {.. 
16a40 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
16a50 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
16a60 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
16a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a80 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20 61 73 73 65  "---- found asse
16a90 6d 62 6c 79 3a 20 22 20 24 61 73 73 65 6d 62 6c  mbly: " $assembl
16aa0 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  y \n]..         
16ab0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
16ac0 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b  .        catch {
16ad0 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
16ae0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
16af0 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l \..           
16b00 20 20 20 22 2d 2d 2d 2d 20 64 65 66 69 6e 65 20     "---- define 
16b10 63 6f 6e 73 74 61 6e 74 73 20 66 6f 72 20 5c 22  constants for \"
16b20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
16b30 74 65 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  te\"... "....   
16b40 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
16b50 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65  h {object invoke
16b60 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
16b70 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
16b80 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
16b90 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74  ata.SQLite.SQLit
16ba0 65 33 20 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e  e3 DefineConstan
16bb0 74 73 7d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ts} \..         
16bc0 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 43           defineC
16bd0 6f 6e 73 74 61 6e 74 73 5d 20 3d 3d 20 30 7d 20  onstants] == 0} 
16be0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
16bf0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
16c00 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
16c10 64 41 72 67 73 20 5b 66 6f 72 6d 61 74 4c 69 73  dArgs [formatLis
16c20 74 20 5b 6c 73 6f 72 74 20 5c 0d 0a 20 20 20 20  t [lsort \..    
16c30 20 20 20 20 20 20 20 20 20 20 20 20 24 64 65 66              $def
16c40 69 6e 65 43 6f 6e 73 74 61 6e 74 73 5d 20 3c 6e  ineConstants] <n
16c50 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20  one>] \n]..     
16c60 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
16c70 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
16c80 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
16c90 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20   unknown\n..    
16ca0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
16cb0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61   }....        ca
16cc0 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
16cd0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
16ce0 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20  hannel \..      
16cf0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6f          "---- so
16d00 75 72 63 65 20 76 65 72 73 69 6f 6e 20 6f 66 20  urce version of 
16d10 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  \"System.Data.SQ
16d20 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 0d  Lite.dll\"... ".
16d30 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
16d40 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20  {[catch {object 
16d50 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
16d60 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
16d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
16d80 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
16d90 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f  .SQLiteConnectio
16da0 6e 20 50 72 6f 76 69 64 65 72 56 65 72 73 69 6f  n ProviderVersio
16db0 6e 7d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  n} \..          
16dc0 20 20 20 20 20 20 20 20 76 65 72 73 69 6f 6e 5d          version]
16dd0 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
16de0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
16df0 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76  string length $v
16e00 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68  ersion] == 0} th
16e10 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
16e20 20 20 20 20 73 65 74 20 76 65 72 73 69 6f 6e 20      set version 
16e30 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20  null..          
16e40 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
16e50 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
16e60 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
16e70 67 73 20 24 76 65 72 73 69 6f 6e 20 5c 6e 5d 0d  gs $version \n].
16e80 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
16e90 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
16ea0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
16eb0 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e  hannel unknown\n
16ec0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
16ed0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
16ee0 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
16ef0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
16f00 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a  test_channel \..
16f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
16f20 2d 2d 2d 20 73 6f 75 72 63 65 20 63 68 65 63 6b  --- source check
16f30 6f 75 74 20 6f 66 20 5c 22 53 79 73 74 65 6d 2e  out of \"System.
16f40 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c  Data.SQLite.dll\
16f50 22 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  "... "....      
16f60 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
16f70 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
16f80 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
16f90 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
16fa0 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
16fb0 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 43 6f  .SQLite.SQLiteCo
16fc0 6e 6e 65 63 74 69 6f 6e 20 50 72 6f 76 69 64 65  nnection Provide
16fd0 72 53 6f 75 72 63 65 49 64 7d 20 5c 0d 0a 20 20  rSourceId} \..  
16fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ff0 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20  sourceId] == 0} 
17000 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
17010 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
17020 6c 65 6e 67 74 68 20 24 73 6f 75 72 63 65 49 64  length $sourceId
17030 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
17040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
17050 74 20 73 6f 75 72 63 65 49 64 20 6e 75 6c 6c 0d  t sourceId null.
17060 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
17070 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
17080 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
17090 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 73  l [appendArgs $s
170a0 6f 75 72 63 65 49 64 20 5c 6e 5d 0d 0a 20 20 20  ourceId \n]..   
170b0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
170c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
170d0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
170e0 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20  el unknown\n..  
170f0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
17100 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
17110 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
17120 45 3a 20 43 68 65 63 6b 20 74 68 65 20 61 76 61  E: Check the ava
17130 69 6c 61 62 6c 65 20 62 75 69 6c 64 73 20 28 61  ilable builds (a
17140 6e 64 20 22 72 65 6c 65 61 73 65 73 22 29 20 6f  nd "releases") o
17150 66 20 53 51 4c 69 74 65 20 61 6e 64 0d 0a 20 20  f SQLite and..  
17160 20 20 20 20 20 20 23 20 20 20 20 20 20 20 53 79        #       Sy
17170 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
17180 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
17190 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51        checkForSQ
171a0 4c 69 74 65 42 75 69 6c 64 73 20 24 3a 3a 74 65  LiteBuilds $::te
171b0 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20  st_channel..    
171c0 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69      checkForSQLi
171d0 74 65 52 65 6c 65 61 73 65 73 20 24 3a 3a 74 65  teReleases $::te
171e0 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20  st_channel....  
171f0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
17200 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 2c 20 77 65   # NOTE: Now, we
17210 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 66   need to know if
17220 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65   the SQLite core
17230 20 6c 69 62 72 61 72 79 20 69 73 20 61 76 61 69   library is avai
17240 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 23  lable..        #
17250 20 20 20 20 20 20 20 28 69 2e 65 2e 20 62 65 63         (i.e. bec
17260 61 75 73 65 20 74 68 65 20 6d 61 6e 61 67 65 64  ause the managed
17270 2d 6f 6e 6c 79 20 53 79 73 74 65 6d 2e 44 61 74  -only System.Dat
17280 61 2e 53 51 4c 69 74 65 20 61 73 73 65 6d 62 6c  a.SQLite assembl
17290 79 20 63 61 6e 0d 0a 20 20 20 20 20 20 20 20 23  y can..        #
172a0 20 20 20 20 20 20 20 6c 6f 61 64 20 77 69 74 68         load with
172b0 6f 75 74 20 69 74 3b 20 68 6f 77 65 76 65 72 2c  out it; however,
172c0 20 69 74 20 63 61 6e 6e 6f 74 20 64 6f 20 61 6e   it cannot do an
172d0 79 74 68 69 6e 67 20 75 73 65 66 75 6c 20 77 69  ything useful wi
172e0 74 68 6f 75 74 0d 0a 20 20 20 20 20 20 20 20 23  thout..        #
172f0 20 20 20 20 20 20 20 69 74 29 2e 20 20 49 66 20         it).  If 
17300 77 65 20 61 72 65 20 75 73 69 6e 67 20 74 68 65  we are using the
17310 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65   mixed-mode asse
17320 6d 62 6c 79 20 61 6e 64 20 77 65 20 61 6c 72 65  mbly and we alre
17330 61 64 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ady..        #  
17340 20 20 20 20 20 66 6f 75 6e 64 20 69 74 20 28 61       found it (a
17350 62 6f 76 65 29 2c 20 74 68 69 73 20 73 68 6f 75  bove), this shou
17360 6c 64 20 61 6c 77 61 79 73 20 73 75 63 63 65 65  ld always succee
17370 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  d...        #.. 
17380 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53         checkForS
17390 51 4c 69 74 65 4c 69 62 72 61 72 79 20 24 3a 3a  QLiteLibrary $::
173a0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a  test_channel....
173b0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
173c0 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
173d0 20 69 66 20 74 68 65 20 53 51 4c 69 74 65 20 69   if the SQLite i
173e0 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20  nterop assembly 
173f0 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20  is available... 
17400 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
17410 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65    checkForSQLite
17420 49 6e 74 65 72 6f 70 20 24 3a 3a 74 65 73 74 5f  Interop $::test_
17430 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20  channel....     
17440 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
17450 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20  NOTE: Check the 
17460 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20  SQLite database 
17470 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 64 69  and temporary di
17480 72 65 63 74 6f 72 69 65 73 2e 0d 0a 20 20 20 20  rectories...    
17490 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63      #..        c
174a0 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 69 72  heckForSQLiteDir
174b0 65 63 74 6f 72 69 65 73 20 24 3a 3a 74 65 73 74  ectories $::test
174c0 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20  _channel....    
174d0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
174e0 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
174f0 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 76  o determine if v
17500 61 72 69 6f 75 73 20 63 6f 6d 70 69 6c 65 2d 74  arious compile-t
17510 69 6d 65 20 6f 70 74 69 6f 6e 73 20 6e 65 65 64  ime options need
17520 65 64 20 66 6f 72 0d 0a 20 20 20 20 20 20 20 20  ed for..        
17530 23 20 20 20 20 20 20 20 74 65 73 74 20 63 6f 6e  #       test con
17540 73 74 72 61 69 6e 74 73 20 77 65 72 65 20 65 6e  straints were en
17550 61 62 6c 65 64 20 66 6f 72 20 74 68 65 20 6d 61  abled for the ma
17560 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 2e 20  naged assembly. 
17570 20 54 68 65 72 65 0d 0a 20 20 20 20 20 20 20 20   There..        
17580 23 20 20 20 20 20 20 20 61 72 65 20 73 6f 6d 65  #       are some
17590 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
175a0 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20  tions that must 
175b0 61 6c 73 6f 20 68 61 76 65 20 62 65 65 6e 20 65  also have been e
175c0 6e 61 62 6c 65 64 0d 0a 20 20 20 20 20 20 20 20  nabled..        
175d0 23 20 20 20 20 20 20 20 66 6f 72 20 74 68 65 20  #       for the 
175e0 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79  interop assembly
175f0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20   in order to be 
17600 65 66 66 65 63 74 69 76 65 2e 20 20 46 6f 72 20  effective.  For 
17610 74 68 6f 73 65 0d 0a 20 20 20 20 20 20 20 20 23  those..        #
17620 20 20 20 20 20 20 20 6f 70 74 69 6f 6e 73 2c 20         options, 
17630 69 74 20 77 69 6c 6c 20 62 65 20 61 73 73 75 6d  it will be assum
17640 65 64 20 74 68 61 74 20 69 74 20 77 61 73 20 65  ed that it was e
17650 6e 61 62 6c 65 64 20 66 6f 72 20 74 68 65 20 69  nabled for the i
17660 6e 74 65 72 6f 70 0d 0a 20 20 20 20 20 20 20 20  nterop..        
17670 23 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79  #       assembly
17680 20 69 66 20 69 74 20 77 61 73 20 65 6e 61 62 6c   if it was enabl
17690 65 64 20 66 6f 72 20 74 68 65 20 6d 61 6e 61 67  ed for the manag
176a0 65 64 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20  ed assembly...  
176b0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
176c0 20 66 6f 72 65 61 63 68 20 64 65 66 69 6e 65 43   foreach defineC
176d0 6f 6e 73 74 61 6e 74 20 5b 6c 69 73 74 20 5c 0d  onstant [list \.
176e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 43 48 45  .            CHE
176f0 43 4b 5f 53 54 41 54 45 20 43 4f 55 4e 54 5f 48  CK_STATE COUNT_H
17700 41 4e 44 4c 45 20 44 45 42 55 47 20 49 4e 54 45  ANDLE DEBUG INTE
17710 52 4f 50 5f 43 4f 44 45 43 20 49 4e 54 45 52 4f  ROP_CODEC INTERO
17720 50 5f 44 45 42 55 47 20 5c 0d 0a 20 20 20 20 20  P_DEBUG \..     
17730 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 45         INTEROP_E
17740 58 54 45 4e 53 49 4f 4e 5f 46 55 4e 43 54 49 4f  XTENSION_FUNCTIO
17750 4e 53 20 49 4e 54 45 52 4f 50 5f 4c 45 47 41 43  NS INTEROP_LEGAC
17760 59 5f 43 4c 4f 53 45 20 49 4e 54 45 52 4f 50 5f  Y_CLOSE INTEROP_
17770 4c 4f 47 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  LOG \..         
17780 20 20 20 49 4e 54 45 52 4f 50 5f 54 45 53 54 5f     INTEROP_TEST_
17790 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54 45 52 4f  EXTENSION INTERO
177a0 50 5f 56 49 52 54 55 41 4c 5f 54 41 42 4c 45 20  P_VIRTUAL_TABLE 
177b0 4e 45 54 5f 32 30 20 4e 45 54 5f 33 35 20 5c 0d  NET_20 NET_35 \.
177c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 4e 45 54  .            NET
177d0 5f 34 30 20 4e 45 54 5f 34 35 20 4e 45 54 5f 34  _40 NET_45 NET_4
177e0 35 31 20 4e 45 54 5f 43 4f 4d 50 41 43 54 5f 32  51 NET_COMPACT_2
177f0 30 20 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50 41  0 PLATFORM_COMPA
17800 43 54 46 52 41 4d 45 57 4f 52 4b 20 5c 0d 0a 20  CTFRAMEWORK \.. 
17810 20 20 20 20 20 20 20 20 20 20 20 50 52 45 4c 4f             PRELO
17820 41 44 5f 4e 41 54 49 56 45 5f 4c 49 42 52 41 52  AD_NATIVE_LIBRAR
17830 59 20 52 45 54 41 52 47 45 54 41 42 4c 45 20 53  Y RETARGETABLE S
17840 51 4c 49 54 45 5f 53 54 41 4e 44 41 52 44 20 5c  QLITE_STANDARD \
17850 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 48  ..            TH
17860 52 4f 57 5f 4f 4e 5f 44 49 53 50 4f 53 45 44 20  ROW_ON_DISPOSED 
17870 54 52 41 43 45 20 54 52 41 43 45 5f 43 4f 4e 4e  TRACE TRACE_CONN
17880 45 43 54 49 4f 4e 20 54 52 41 43 45 5f 48 41 4e  ECTION TRACE_HAN
17890 44 4c 45 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  DLE \..         
178a0 20 20 20 54 52 41 43 45 5f 50 52 45 4c 4f 41 44     TRACE_PRELOAD
178b0 20 54 52 41 43 45 5f 53 48 41 52 45 44 20 54 52   TRACE_SHARED TR
178c0 41 43 45 5f 53 54 41 54 45 4d 45 4e 54 20 54 52  ACE_STATEMENT TR
178d0 41 43 45 5f 57 41 52 4e 49 4e 47 20 5c 0d 0a 20  ACE_WARNING \.. 
178e0 20 20 20 20 20 20 20 20 20 20 20 54 52 41 43 4b             TRACK
178f0 5f 4d 45 4d 4f 52 59 5f 42 59 54 45 53 20 55 53  _MEMORY_BYTES US
17900 45 5f 49 4e 54 45 52 4f 50 5f 44 4c 4c 20 55 53  E_INTEROP_DLL US
17910 45 5f 50 52 45 50 41 52 45 5f 56 32 20 57 49 4e  E_PREPARE_V2 WIN
17920 44 4f 57 53 5d 20 7b 0d 0a 20 20 20 20 20 20 20  DOWS] {..       
17930 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
17940 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66  # NOTE: Check if
17950 20 74 68 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d   the compile-tim
17960 65 20 6f 70 74 69 6f 6e 20 69 73 20 6c 69 73 74  e option is list
17970 65 64 20 69 6e 20 74 68 65 20 6c 69 73 74 20 6f  ed in the list o
17980 66 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  f..          #  
17990 20 20 20 20 20 22 64 65 66 69 6e 65 20 63 6f 6e       "define con
179a0 73 74 61 6e 74 73 22 20 6b 65 70 74 20 74 72 61  stants" kept tra
179b0 63 6b 20 6f 66 20 62 79 20 74 68 65 20 6d 61 6e  ck of by the man
179c0 61 67 65 64 20 61 73 73 65 6d 62 6c 79 2e 0d 0a  aged assembly...
179d0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
179e0 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53         checkForS
179f0 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74  QLiteDefineConst
17a00 61 6e 74 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  ant $::test_chan
17a10 6e 65 6c 20 24 64 65 66 69 6e 65 43 6f 6e 73 74  nel $defineConst
17a20 61 6e 74 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ant..        }..
17a30 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
17a40 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
17a50 63 6b 20 74 68 65 20 63 75 72 72 65 6e 74 20 62  ck the current b
17a60 75 69 6c 64 20 79 65 61 72 2e 20 20 42 61 73 69  uild year.  Basi
17a70 63 61 6c 6c 79 2c 20 74 68 69 73 20 69 6e 64 69  cally, this indi
17a80 63 61 74 65 73 0d 0a 20 20 20 20 20 20 20 20 23  cates..        #
17a90 20 20 20 20 20 20 20 77 68 69 63 68 20 76 65 72         which ver
17aa0 73 69 6f 6e 20 6f 66 20 4d 53 42 75 69 6c 64 20  sion of MSBuild 
17ab0 61 6e 64 2f 6f 72 20 56 69 73 75 61 6c 20 53 74  and/or Visual St
17ac0 75 64 69 6f 20 77 61 73 20 75 73 65 64 20 74 6f  udio was used to
17ad0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
17ae0 20 20 63 6f 6d 70 69 6c 65 20 74 68 65 20 61 73    compile the as
17af0 73 65 6d 62 6c 79 20 62 69 6e 61 72 69 65 73 20  sembly binaries 
17b00 75 6e 64 65 72 20 74 65 73 74 2e 0d 0a 20 20 20  under test...   
17b10 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
17b20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
17b30 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20  annel \..       
17b40 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b       "---- check
17b50 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e 44  ing for System.D
17b60 61 74 61 2e 53 51 4c 69 74 65 20 62 75 69 6c 64  ata.SQLite build
17b70 20 79 65 61 72 2e 2e 2e 20 22 0d 0a 0d 0a 20 20   year... "....  
17b80 20 20 20 20 20 20 73 65 74 20 79 65 61 72 20 5b        set year [
17b90 67 65 74 42 75 69 6c 64 59 65 61 72 5d 0d 0a 20  getBuildYear].. 
17ba0 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
17bb0 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
17bc0 20 62 75 69 6c 64 59 65 61 72 2e 20 24 79 65 61   buildYear. $yea
17bd0 72 5d 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74  r]..        tput
17be0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
17bf0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22  l [appendArgs \"
17c00 20 24 79 65 61 72 20 5c 22 5c 6e 5d 0d 0a 0d 0a   $year \"\n]....
17c10 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
17c20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
17c30 20 74 68 65 20 63 75 72 72 65 6e 74 20 62 75 69   the current bui
17c40 6c 64 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ld configuration
17c50 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e  .  This should n
17c60 6f 72 6d 61 6c 6c 79 0d 0a 20 20 20 20 20 20 20  ormally..       
17c70 20 23 20 20 20 20 20 20 20 62 65 20 65 69 74 68   #       be eith
17c80 65 72 20 22 44 65 62 75 67 22 20 6f 72 20 22 52  er "Debug" or "R
17c90 65 6c 65 61 73 65 22 2e 0d 0a 20 20 20 20 20 20  elease"...      
17ca0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75    #..        tpu
17cb0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
17cc0 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  el \..          
17cd0 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67    "---- checking
17ce0 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61   for System.Data
17cf0 2e 53 51 4c 69 74 65 20 62 75 69 6c 64 20 63 6f  .SQLite build co
17d00 6e 66 69 67 75 72 61 74 69 6f 6e 2e 2e 2e 20 22  nfiguration... "
17d10 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
17d20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 5b 67  configuration [g
17d30 65 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72 61  etBuildConfigura
17d40 74 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 20 20 61  tion]..        a
17d50 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  ddConstraint [ap
17d60 70 65 6e 64 41 72 67 73 20 62 75 69 6c 64 43 6f  pendArgs buildCo
17d70 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 24 63 6f  nfiguration. $co
17d80 6e 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 20 20  nfiguration]..  
17d90 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
17da0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
17db0 65 6e 64 41 72 67 73 20 5c 22 20 24 63 6f 6e 66  endArgs \" $conf
17dc0 69 67 75 72 61 74 69 6f 6e 20 5c 22 5c 6e 5d 0d  iguration \"\n].
17dd0 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
17de0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 72        # NOTE: Tr
17df0 79 20 74 6f 20 73 65 74 75 70 20 61 6e 20 69 6e  y to setup an in
17e00 74 65 72 72 75 70 74 20 63 61 6c 6c 62 61 63 6b  terrupt callback
17e10 20 75 73 69 6e 67 20 74 68 65 20 73 63 72 69 70   using the scrip
17e20 74 20 64 65 62 75 67 67 65 72 0d 0a 20 20 20 20  t debugger..    
17e30 20 20 20 20 23 20 20 20 20 20 20 20 74 68 61 74      #       that
17e40 20 77 69 6c 6c 20 63 61 6e 63 65 6c 20 61 6c 6c   will cancel all
17e50 20 53 51 4c 20 71 75 65 72 69 65 73 20 69 6e 20   SQL queries in 
17e60 70 72 6f 67 72 65 73 73 20 66 6f 72 20 61 6c 6c  progress for all
17e70 20 64 61 74 61 62 61 73 65 0d 0a 20 20 20 20 20   database..     
17e80 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 6e 65     #       conne
17e90 63 74 69 6f 6e 73 20 6b 6e 6f 77 6e 20 74 6f 20  ctions known to 
17ea0 74 68 69 73 20 69 6e 74 65 72 70 72 65 74 65 72  this interpreter
17eb0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
17ec0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
17ed0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c   exists ::no(sql
17ee0 69 74 65 49 6e 74 65 72 72 75 70 74 43 61 6c 6c  iteInterruptCall
17ef0 62 61 63 6b 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  back)]} then {..
17f00 20 20 20 20 20 20 20 20 20 20 73 65 74 75 70 44            setupD
17f10 62 49 6e 74 65 72 72 75 70 74 43 61 6c 6c 62 61  bInterruptCallba
17f20 63 6b 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ck $::test_chann
17f30 65 6c 20 24 3a 3a 74 65 73 74 5f 6c 6f 67 0d 0a  el $::test_log..
17f40 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
17f50 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
17f60 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f  # NOTE: Check fo
17f70 72 20 74 68 65 20 6e 61 74 69 76 65 20 72 75 6e  r the native run
17f80 74 69 6d 65 20 6f 70 74 69 6f 6e 2c 20 77 68 69  time option, whi
17f90 63 68 20 77 6f 75 6c 64 20 6d 65 61 6e 20 77 65  ch would mean we
17fa0 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20   are..        # 
17fb0 20 20 20 20 20 20 75 73 69 6e 67 20 74 68 65 20        using the 
17fc0 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d  mixed-mode assem
17fd0 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  bly...        #.
17fe0 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f  .        checkFo
17ff0 72 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 24  rRuntimeOption $
18000 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 6e  ::test_channel n
18010 61 74 69 76 65 0d 0a 0d 0a 20 20 20 20 20 20 20  ative....       
18020 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
18030 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65  TE: Check if the
18040 20 74 65 73 74 20 73 75 69 74 65 20 73 68 6f 75   test suite shou
18050 6c 64 20 63 6f 75 6e 74 20 74 68 65 20 6e 75 6d  ld count the num
18060 62 65 72 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f  ber of connectio
18070 6e 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ns..        #   
18080 20 20 20 20 22 6f 70 65 6e 65 64 22 20 61 6e 64      "opened" and
18090 20 22 63 6c 6f 73 65 64 22 20 66 72 6f 6d 20 74   "closed" from t
180a0 68 65 20 70 6f 6f 6c 20 77 68 65 6e 20 64 65 74  he pool when det
180b0 65 72 6d 69 6e 69 6e 67 20 69 66 20 61 20 74 65  ermining if a te
180c0 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  st..        #   
180d0 20 20 20 20 70 61 73 73 65 64 2e 20 20 44 69 73      passed.  Dis
180e0 61 62 6c 69 6e 67 20 74 68 69 73 20 62 65 68 61  abling this beha
180f0 76 69 6f 72 20 69 73 20 73 6f 6d 65 74 69 6d 65  vior is sometime
18100 73 20 6e 65 63 65 73 73 61 72 79 20 28 65 2e 67  s necessary (e.g
18110 2e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ...        #    
18120 20 20 20 64 75 72 69 6e 67 20 74 68 65 20 72 65     during the re
18130 6c 65 61 73 65 20 74 65 73 74 69 6e 67 20 70 72  lease testing pr
18140 6f 63 65 73 73 29 20 62 65 63 61 75 73 65 20 74  ocess) because t
18150 68 65 72 65 20 61 72 65 20 73 65 76 65 72 61 6c  here are several
18160 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
18170 20 20 74 65 73 74 73 20 74 68 61 74 20 72 65 6c    tests that rel
18180 79 20 6f 6e 20 74 68 65 20 22 6f 70 65 6e 65 64  y on the "opened
18190 20 66 72 6f 6d 20 70 6f 6f 6c 22 20 63 6f 75 6e   from pool" coun
181a0 74 20 62 65 69 6e 67 20 67 72 65 61 74 65 72 0d  t being greater.
181b0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
181c0 20 74 68 61 6e 20 7a 65 72 6f 2e 20 20 54 68 65   than zero.  The
181d0 73 65 20 74 65 73 74 73 20 6d 61 79 20 66 61 69  se tests may fai
181e0 6c 20 64 75 65 20 74 6f 20 74 68 65 20 6e 6f 6e  l due to the non
181f0 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 0d 0a  -deterministic..
18200 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
18210 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20  behavior of the 
18220 43 4c 52 20 47 43 2c 20 65 76 65 6e 20 77 68 65  CLR GC, even whe
18230 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 62 75  n there is no bu
18240 67 20 69 6e 20 74 68 65 20 63 6f 64 65 0d 0a 20  g in the code.. 
18250 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62         #       b
18260 65 69 6e 67 20 74 65 73 74 65 64 2e 0d 0a 20 20  eing tested...  
18270 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
18280 20 63 68 65 63 6b 46 6f 72 52 75 6e 74 69 6d 65   checkForRuntime
18290 4f 70 74 69 6f 6e 20 24 3a 3a 74 65 73 74 5f 63  Option $::test_c
182a0 68 61 6e 6e 65 6c 20 6e 6f 50 6f 6f 6c 43 6f 75  hannel noPoolCou
182b0 6e 74 73 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  nts....        #
182c0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
182d0 3a 20 52 65 70 6f 72 74 20 74 68 65 20 72 65 73  : Report the res
182e0 6f 75 72 63 65 20 75 73 61 67 65 20 70 72 69 6f  ource usage prio
182f0 72 20 74 6f 20 72 75 6e 6e 69 6e 67 20 61 6e 79  r to running any
18300 20 74 65 73 74 73 2e 0d 0a 20 20 20 20 20 20 20   tests...       
18310 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 70 6f   #..        repo
18320 72 74 53 51 4c 69 74 65 52 65 73 6f 75 72 63 65  rtSQLiteResource
18330 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
18340 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  l....        #..
18350 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
18360 53 68 6f 77 20 74 68 65 20 61 63 74 69 76 65 20  Show the active 
18370 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 73  test constraints
18380 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
18390 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
183a0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
183b0 65 6e 64 41 72 67 73 20 22 2d 2d 2d 2d 20 63 6f  endArgs "---- co
183c0 6e 73 74 72 61 69 6e 74 73 3a 20 22 20 5c 0d 0a  nstraints: " \..
183d0 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 6f 72              [for
183e0 6d 61 74 4c 69 73 74 20 5b 6c 73 6f 72 74 20 5b  matList [lsort [
183f0 67 65 74 43 6f 6e 73 74 72 61 69 6e 74 73 5d 5d  getConstraints]]
18400 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a 0d 0a   <none>] \n]....
18410 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
18420 20 20 20 23 20 4e 4f 54 45 3a 20 53 61 76 65 20     # NOTE: Save 
18430 74 68 65 20 74 65 73 74 20 63 6f 6e 73 74 72 61  the test constra
18440 69 6e 74 73 20 66 6f 72 20 75 73 65 20 62 79 20  ints for use by 
18450 74 68 72 65 61 64 73 20 63 72 65 61 74 65 64 20  threads created 
18460 69 6e 20 74 68 69 73 0d 0a 20 20 20 20 20 20 20  in this..       
18470 20 23 20 20 20 20 20 20 20 61 70 70 6c 69 63 61   #       applica
18480 74 69 6f 6e 20 64 6f 6d 61 69 6e 2e 20 20 54 68  tion domain.  Th
18490 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
184a0 62 65 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20  because all the 
184b0 45 61 67 6c 65 0d 0a 20 20 20 20 20 20 20 20 23  Eagle..        #
184c0 20 20 20 20 20 20 20 22 74 65 73 74 20 63 6f 6e         "test con
184d0 74 65 78 74 22 20 69 6e 66 6f 72 6d 61 74 69 6f  text" informatio
184e0 6e 20 69 73 20 70 65 72 2d 74 68 72 65 61 64 2e  n is per-thread.
184f0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
18500 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
18510 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 63 6f  exists ::test_co
18520 6e 73 74 72 61 69 6e 74 73 5d 7d 20 74 68 65 6e  nstraints]} then
18530 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
18540 74 20 3a 3a 74 65 73 74 5f 63 6f 6e 73 74 72 61  t ::test_constra
18550 69 6e 74 73 20 24 3a 3a 65 61 67 6c 65 5f 74 65  ints $::eagle_te
18560 73 74 73 28 63 6f 6e 73 74 72 61 69 6e 74 73 29  sts(constraints)
18570 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
18580 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
18590 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 74    # NOTE: Load t
185a0 68 65 20 22 61 66 74 65 72 2d 63 6f 6e 73 74 72  he "after-constr
185b0 61 69 6e 74 73 22 20 63 75 73 74 6f 6d 20 70 65  aints" custom pe
185c0 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20 70 65  r-user and/or pe
185d0 72 2d 68 6f 73 74 0d 0a 20 20 20 20 20 20 20 20  r-host..        
185e0 23 20 20 20 20 20 20 20 74 65 73 74 20 73 65 74  #       test set
185f0 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20 20 20  tings now...    
18600 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 75      #..        u
18610 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 6c  plevel 1 [list l
18620 6f 61 64 53 51 4c 69 74 65 54 65 73 74 53 65 74  oadSQLiteTestSet
18630 74 69 6e 67 73 20 24 3a 3a 74 65 73 74 5f 63 68  tings $::test_ch
18640 61 6e 6e 65 6c 20 2e 61 66 74 65 72 5d 0d 0a 0d  annel .after]...
18650 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
18660 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77      # NOTE: Show
18670 20 77 68 65 6e 20 6f 75 72 20 74 65 73 74 73 20   when our tests 
18680 61 63 74 75 61 6c 6c 79 20 62 65 67 61 6e 20 28  actually began (
18690 6e 6f 77 29 2e 0d 0a 20 20 20 20 20 20 20 20 23  now)...        #
186a0 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
186b0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
186c0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
186d0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
186e0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
186f0 69 74 65 20 74 65 73 74 73 20 62 65 67 61 6e 20  ite tests began 
18700 61 74 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  at " \..        
18710 20 20 20 20 5b 63 6c 6f 63 6b 20 66 6f 72 6d 61      [clock forma
18720 74 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73  t [clock seconds
18730 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d  ]] \n]..      }.
18740 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
18750 72 6f 63 20 72 75 6e 53 51 4c 69 74 65 54 65 73  roc runSQLiteTes
18760 74 45 70 69 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a  tEpilogue {} {..
18770 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
18780 20 4e 4f 54 45 3a 20 53 6b 69 70 20 72 75 6e 6e   NOTE: Skip runn
18790 69 6e 67 20 6f 75 72 20 63 75 73 74 6f 6d 20 65  ing our custom e
187a0 70 69 6c 6f 67 75 65 20 69 66 20 74 68 65 20 6d  pilogue if the m
187b0 61 69 6e 20 6f 6e 65 20 68 61 73 20 62 65 65 6e  ain one has been
187c0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
187d0 73 6b 69 70 70 65 64 2e 0d 0a 20 20 20 20 20 20  skipped...      
187e0 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69  #..      if {![i
187f0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
18800 65 70 69 6c 6f 67 75 65 2e 65 61 67 6c 65 29 5d  epilogue.eagle)]
18810 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
18820 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
18830 4f 54 45 3a 20 53 68 6f 77 20 77 68 65 6e 20 6f  OTE: Show when o
18840 75 72 20 74 65 73 74 73 20 61 63 74 75 61 6c 6c  ur tests actuall
18850 79 20 65 6e 64 65 64 20 28 6e 6f 77 29 2e 0d 0a  y ended (now)...
18860 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
18870 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
18880 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
18890 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
188a0 20 20 20 20 22 2d 2d 2d 2d 20 53 79 73 74 65 6d      "---- System
188b0 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 74 65 73  .Data.SQLite tes
188c0 74 73 20 65 6e 64 65 64 20 61 74 20 22 20 5c 0d  ts ended at " \.
188d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 63 6c  .            [cl
188e0 6f 63 6b 20 66 6f 72 6d 61 74 20 5b 63 6c 6f 63  ock format [cloc
188f0 6b 20 73 65 63 6f 6e 64 73 5d 5d 20 5c 6e 5d 0d  k seconds]] \n].
18900 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
18910 20 20 20 20 20 20 23 20 42 55 47 46 49 58 3a 20        # BUGFIX: 
18920 42 65 66 6f 72 65 20 63 68 65 63 6b 69 6e 67 20  Before checking 
18930 74 68 65 20 66 69 6e 61 6c 20 72 65 73 6f 75 72  the final resour
18940 63 65 73 20 69 6e 20 75 73 65 20 62 79 20 53 51  ces in use by SQ
18950 4c 69 74 65 2c 20 6d 61 6b 65 0d 0a 20 20 20 20  Lite, make..    
18960 20 20 20 20 23 20 20 20 20 20 20 20 20 20 73 75      #         su
18970 72 65 20 62 6f 74 68 20 6f 66 20 74 68 65 20 50  re both of the P
18980 52 41 47 4d 41 20 72 65 6c 61 74 65 64 20 64 69  RAGMA related di
18990 72 65 63 74 6f 72 79 20 6e 61 6d 65 73 20 61 72  rectory names ar
189a0 65 20 66 72 65 65 64 2e 0d 0a 20 20 20 20 20 20  e freed...      
189b0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65    #..        che
189c0 63 6b 46 6f 72 53 51 4c 69 74 65 44 69 72 65 63  ckForSQLiteDirec
189d0 74 6f 72 69 65 73 20 24 3a 3a 74 65 73 74 5f 63  tories $::test_c
189e0 68 61 6e 6e 65 6c 20 74 72 75 65 0d 0a 0d 0a 20  hannel true.... 
189f0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
18a00 20 20 23 20 4e 4f 54 45 3a 20 41 6c 73 6f 20 72    # NOTE: Also r
18a10 65 70 6f 72 74 20 74 68 65 20 72 65 73 6f 75 72  eport the resour
18a20 63 65 20 75 73 61 67 65 20 61 66 74 65 72 20 72  ce usage after r
18a30 75 6e 6e 69 6e 67 20 74 68 65 20 74 65 73 74 73  unning the tests
18a40 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
18a50 20 20 20 20 20 20 72 65 70 6f 72 74 53 51 4c 69        reportSQLi
18a60 74 65 52 65 73 6f 75 72 63 65 73 20 24 3a 3a 74  teResources $::t
18a70 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20  est_channel.... 
18a80 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
18a90 20 20 23 20 4e 4f 54 45 3a 20 52 65 70 6f 72 74    # NOTE: Report
18aa0 20 74 68 65 20 63 72 69 74 69 63 61 6c 20 68 61   the critical ha
18ab0 6e 64 6c 65 20 63 6f 75 6e 74 73 20 61 66 74 65  ndle counts afte
18ac0 72 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 74 65  r running the te
18ad0 73 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  sts...        #.
18ae0 0a 20 20 20 20 20 20 20 20 67 65 74 53 51 4c 69  .        getSQLi
18af0 74 65 48 61 6e 64 6c 65 43 6f 75 6e 74 73 20 24  teHandleCounts $
18b00 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a  ::test_channel..
18b10 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
18b20 0c 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23  ...    #########
18b30 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18b40 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18b50 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18b60 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18b70 23 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23  ##..    ########
18b80 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18b90 23 23 23 23 23 20 45 4e 44 20 45 61 67 6c 65 20  ##### END Eagle 
18ba0 4f 4e 4c 59 20 23 23 23 23 23 23 23 23 23 23 23  ONLY ###########
18bb0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18bc0 23 23 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23  ###..    #######
18bd0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18be0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18bf0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18c00 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18c10 23 23 23 23 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23  ####..  }....  #
18c20 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 53 61 76 65  ..  # NOTE: Save
18c30 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
18c40 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61   directory conta
18c50 69 6e 69 6e 67 20 74 68 69 73 20 66 69 6c 65 2e  ining this file.
18c60 0d 0a 20 20 23 0d 0a 20 20 69 66 20 7b 21 5b 69  ..  #..  if {![i
18c70 6e 66 6f 20 65 78 69 73 74 73 20 63 6f 6d 6d 6f  nfo exists commo
18c80 6e 5f 64 69 72 65 63 74 6f 72 79 5d 7d 20 74 68  n_directory]} th
18c90 65 6e 20 7b 0d 0a 20 20 20 20 73 65 74 20 63 6f  en {..    set co
18ca0 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 20 5b  mmon_directory [
18cb0 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b 69 6e  file dirname [in
18cc0 66 6f 20 73 63 72 69 70 74 5d 5d 0d 0a 20 20 7d  fo script]]..  }
18cd0 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54  ....  #..  # NOT
18ce0 45 3a 20 50 72 6f 76 69 64 65 20 74 68 65 20 53  E: Provide the S
18cf0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
18d00 65 20 74 65 73 74 20 70 61 63 6b 61 67 65 20 74  e test package t
18d10 6f 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65  o the interprete
18d20 72 2e 0d 0a 20 20 23 0d 0a 20 20 70 61 63 6b 61  r...  #..  packa
18d30 67 65 20 70 72 6f 76 69 64 65 20 53 79 73 74 65  ge provide Syste
18d40 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 54 65  m.Data.SQLite.Te
18d50 73 74 20 31 2e 30 0d 0a 7d 0d 0a                 st 1.0..}..