System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact a599371f839d0699dd9c5f65c61c0a2b806b892b:


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 0d 0a  return [expr {..
1480: 20 20 20 20 20 20 20 20 20 20 24 6e 61 74 69 76            $nativ
1490: 65 20 3f 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c  e ? [machineToPl
14a0: 61 74 66 6f 72 6d 20 24 3a 3a 74 65 73 74 5f 6d  atform $::test_m
14b0: 61 63 68 69 6e 65 5d 20 3a 20 22 22 0d 0a 20 20  achine] : ""..  
14c0: 20 20 20 20 20 20 7d 5d 0d 0a 20 20 20 20 20 20        }]..      
14d0: 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20  } elseif {[info 
14e0: 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61  exists ::tcl_pla
14f0: 74 66 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 7d  tform(machine)]}
1500: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1510: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1520: 54 45 3a 20 46 6f 72 20 6e 61 74 69 76 65 20 62  TE: For native b
1530: 75 69 6c 64 73 2c 20 72 65 74 75 72 6e 20 74 68  uilds, return th
1540: 65 20 70 6c 61 74 66 6f 72 6d 20 6e 61 6d 65 20  e platform name 
1550: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
1560: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1570: 20 20 74 68 65 20 6d 61 63 68 69 6e 65 20 61 72    the machine ar
1580: 63 68 69 74 65 63 74 75 72 65 3b 20 6f 74 68 65  chitecture; othe
1590: 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e  rwise, return an
15a0: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0d 0a   empty string...
15b0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
15c0: 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20     return [expr 
15d0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 24 6e 61  {..          $na
15e0: 74 69 76 65 20 3f 20 5b 6d 61 63 68 69 6e 65 54  tive ? [machineT
15f0: 6f 50 6c 61 74 66 6f 72 6d 20 24 3a 3a 74 63 6c  oPlatform $::tcl
1600: 5f 70 6c 61 74 66 6f 72 6d 28 6d 61 63 68 69 6e  _platform(machin
1610: 65 29 5d 20 3a 20 22 22 0d 0a 20 20 20 20 20 20  e)] : ""..      
1620: 20 20 7d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c    }]..      } el
1630: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
1640: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
1650: 20 4e 6f 20 6d 61 63 68 69 6e 65 20 61 72 63 68   No machine arch
1660: 69 74 65 63 74 75 72 65 20 69 73 20 61 76 61 69  itecture is avai
1670: 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 6e  lable, return an
1680: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0d 0a   empty string...
1690: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
16a0: 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20     return ""..  
16b0: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
16c0: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 75 69  .    proc getBui
16d0: 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  ldConfiguration 
16e0: 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
16f0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 65       # NOTE: See
1700: 20 69 66 20 74 68 65 20 22 63 6f 6e 66 69 67 75   if the "configu
1710: 72 61 74 69 6f 6e 22 20 73 65 74 74 69 6e 67 20  ration" setting 
1720: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64  has been overrid
1730: 64 65 6e 20 62 79 20 74 68 65 0d 0a 20 20 20 20  den by the..    
1740: 20 20 23 20 20 20 20 20 20 20 75 73 65 72 20 28    #       user (
1750: 65 2e 67 2e 20 6f 6e 20 74 68 65 20 63 6f 6d 6d  e.g. on the comm
1760: 61 6e 64 20 6c 69 6e 65 29 2e 20 20 54 68 69 73  and line).  This
1770: 20 68 65 6c 70 73 20 63 6f 6e 74 72 6f 6c 20 65   helps control e
1780: 78 61 63 74 6c 79 0d 0a 20 20 20 20 20 20 23 20  xactly..      # 
1790: 20 20 20 20 20 20 77 68 69 63 68 20 73 65 74 20        which set 
17a0: 6f 66 20 62 69 6e 61 72 69 65 73 20 77 65 20 61  of binaries we a
17b0: 72 65 20 74 65 73 74 69 6e 67 20 28 69 2e 65 2e  re testing (i.e.
17c0: 20 74 68 6f 73 65 20 62 75 69 6c 74 20 69 6e 20   those built in 
17d0: 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
17e0: 20 20 20 22 44 65 62 75 67 22 20 6f 72 20 22 52     "Debug" or "R
17f0: 65 6c 65 61 73 65 22 20 62 75 69 6c 64 20 63 6f  elease" build co
1800: 6e 66 69 67 75 72 61 74 69 6f 6e 73 29 2e 20 20  nfigurations).  
1810: 54 6f 20 6f 76 65 72 72 69 64 65 20 74 68 69 73  To override this
1820: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1830: 76 61 6c 75 65 20 76 69 61 20 74 68 65 20 63 6f  value via the co
1840: 6d 6d 61 6e 64 20 6c 69 6e 65 2c 20 65 6e 74 65  mmand line, ente
1850: 72 20 61 20 63 6f 6d 6d 61 6e 64 20 73 69 6d 69  r a command simi
1860: 6c 61 72 20 74 6f 20 6f 6e 65 20 6f 66 0d 0a 20  lar to one of.. 
1870: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
1880: 20 66 6f 6c 6c 6f 77 69 6e 67 20 28 61 6c 6c 20   following (all 
1890: 6f 6e 20 6f 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20  on one line):.. 
18a0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
18b0: 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c        EagleShell
18c0: 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c  .exe -anyInitial
18d0: 69 7a 65 20 22 73 65 74 20 74 65 73 74 5f 63 6f  ize "set test_co
18e0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 44 65 62 75  nfiguration Debu
18f0: 67 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  g"..      #     
1900: 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68      -file .\path
1910: 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20  \to\all.eagle.. 
1920: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
1930: 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c        EagleShell
1940: 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c  .exe -anyInitial
1950: 69 7a 65 20 22 73 65 74 20 74 65 73 74 5f 63 6f  ize "set test_co
1960: 6e 66 69 67 75 72 61 74 69 6f 6e 20 52 65 6c 65  nfiguration Rele
1970: 61 73 65 22 0d 0a 20 20 20 20 20 20 23 20 20 20  ase"..      #   
1980: 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61        -file .\pa
1990: 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d  th\to\all.eagle.
19a0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
19b0: 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65  #       EagleShe
19c0: 6c 6c 2e 65 78 65 20 2d 66 69 6c 65 20 2e 5c 70  ll.exe -file .\p
19d0: 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65  ath\to\all.eagle
19e0: 20 2d 70 72 65 54 65 73 74 0d 0a 20 20 20 20 20   -preTest..     
19f0: 20 23 20 20 20 20 20 20 20 20 20 22 75 6e 73 65   #         "unse
1a00: 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 74 65  t -nocomplain te
1a10: 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  st_configuration
1a20: 22 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  "..      #..    
1a30: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
1a40: 74 73 20 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67  ts ::test_config
1a50: 75 72 61 74 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20  uration] && \.. 
1a60: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
1a70: 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f   length $::test_
1a80: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 20 3e  configuration] >
1a90: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1aa0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1ab0: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73   NOTE: Use the s
1ac0: 70 65 63 69 66 69 65 64 20 74 65 73 74 20 63 6f  pecified test co
1ad0: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 20 54 68  nfiguration.  Th
1ae0: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
1af0: 75 73 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20  used..        # 
1b00: 20 20 20 20 20 20 66 6f 72 20 74 68 69 73 20 76        for this v
1b10: 61 72 69 61 62 6c 65 20 69 73 20 74 79 70 69 63  ariable is typic
1b20: 61 6c 6c 79 20 22 52 65 6c 65 61 73 65 22 2c 20  ally "Release", 
1b30: 61 73 20 73 65 74 20 62 79 20 74 68 65 20 74 65  as set by the te
1b40: 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  st..        #   
1b50: 20 20 20 20 73 75 69 74 65 20 69 74 73 65 6c 66      suite itself
1b60: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1b70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
1b80: 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69  test_configurati
1b90: 6f 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  on..      } else
1ba0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
1bb0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e         # NOTE: N
1bc0: 6f 72 6d 61 6c 6c 79 2c 20 77 65 20 77 69 6c 6c  ormally, we will
1bd0: 20 6e 65 76 65 72 20 68 69 74 20 74 68 69 73 20   never hit this 
1be0: 63 61 73 65 20 62 65 63 61 75 73 65 20 74 68 65  case because the
1bf0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0d 0a 20   value of the.. 
1c00: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
1c10: 65 73 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  est configuratio
1c20: 6e 20 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c  n variable is al
1c30: 77 61 79 73 20 73 65 74 20 62 79 20 74 68 65 20  ways set by the 
1c40: 74 65 73 74 20 73 75 69 74 65 0d 0a 20 20 20 20  test suite..    
1c50: 20 20 20 20 23 20 20 20 20 20 20 20 69 74 73 65      #       itse
1c60: 6c 66 3b 20 68 6f 77 65 76 65 72 2c 20 69 74 20  lf; however, it 
1c70: 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65  can be overridde
1c80: 6e 20 75 73 69 6e 67 20 74 68 65 20 75 6e 73 65  n using the unse
1c90: 74 20 63 6f 6d 6d 61 6e 64 0d 0a 20 20 20 20 20  t command..     
1ca0: 20 20 20 23 20 20 20 20 20 20 20 66 72 6f 6d 20     #       from 
1cb0: 74 68 65 20 2d 70 72 65 54 65 73 74 20 6f 70 74  the -preTest opt
1cc0: 69 6f 6e 20 74 6f 20 74 68 65 20 74 65 73 74 20  ion to the test 
1cd0: 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20  suite...        
1ce0: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
1cf0: 6e 20 24 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66  n $::eagle_platf
1d00: 6f 72 6d 28 63 6f 6e 66 69 67 75 72 61 74 69 6f  orm(configuratio
1d10: 6e 29 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  n)..      }..   
1d20: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
1d30: 67 65 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72  getBuildConfigur
1d40: 61 74 69 6f 6e 73 20 7b 7d 20 7b 0d 0a 20 20 20  ations {} {..   
1d50: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
1d60: 54 45 3a 20 53 65 65 20 69 66 20 74 68 65 20 6c  TE: See if the l
1d70: 69 73 74 20 6f 66 20 74 65 73 74 20 63 6f 6e 66  ist of test conf
1d80: 69 67 75 72 61 74 69 6f 6e 73 20 68 61 73 20 62  igurations has b
1d90: 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 20 62  een overridden b
1da0: 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
1db0: 20 74 68 65 20 75 73 65 72 20 28 65 2e 67 2e 20   the user (e.g. 
1dc0: 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c  on the command l
1dd0: 69 6e 65 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ine)...      #..
1de0: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
1df0: 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 63 6f  exists ::test_co
1e00: 6e 66 69 67 75 72 61 74 69 6f 6e 73 5d 20 26 26  nfigurations] &&
1e10: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 6c   \..          [l
1e20: 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 63  length $::test_c
1e30: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 5d 20 3e  onfigurations] >
1e40: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1e50: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1e60: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73   NOTE: Use the s
1e70: 70 65 63 69 66 69 65 64 20 6c 69 73 74 20 6f 66  pecified list of
1e80: 20 74 65 73 74 20 63 6f 6e 66 69 67 75 72 61 74   test configurat
1e90: 69 6f 6e 73 2e 0d 0a 20 20 20 20 20 20 20 20 23  ions...        #
1ea0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
1eb0: 20 24 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75   $::test_configu
1ec0: 72 61 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 7d  rations..      }
1ed0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1ee0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1ef0: 54 45 3a 20 55 73 65 20 74 68 65 20 64 65 66 61  TE: Use the defa
1f00: 75 6c 74 20 6c 69 73 74 20 6f 66 20 74 65 73 74  ult list of test
1f10: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 2e   configurations.
1f20: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1f30: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73       return [lis
1f40: 74 20 44 65 62 75 67 20 52 65 6c 65 61 73 65 5d  t Debug Release]
1f50: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
1f60: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
1f70: 74 42 75 69 6c 64 42 61 73 65 44 69 72 65 63 74  tBuildBaseDirect
1f80: 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  ory {} {..      
1f90: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
1fa0: 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
1fb0: 62 61 73 65 20 64 69 72 65 63 74 6f 72 79 20 77  base directory w
1fc0: 68 65 72 65 20 61 6c 6c 20 74 68 65 20 62 75 69  here all the bui
1fd0: 6c 64 73 20 73 68 6f 75 6c 64 20 62 65 0d 0a 20  lds should be.. 
1fe0: 20 20 20 20 20 23 20 20 20 20 20 20 20 6c 6f 63       #       loc
1ff0: 61 74 65 64 2e 20 20 54 68 69 73 20 77 69 6c 6c  ated.  This will
2000: 20 62 65 20 74 68 65 20 64 69 72 65 63 74 6f 72   be the director
2010: 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  y that contains 
2020: 74 68 65 20 61 63 74 75 61 6c 0d 0a 20 20 20 20  the actual..    
2030: 20 20 23 20 20 20 20 20 20 20 62 75 69 6c 64 20    #       build 
2040: 6f 75 74 70 75 74 20 64 69 72 65 63 74 6f 72 79  output directory
2050: 20 28 65 2e 67 2e 20 70 61 72 65 6e 74 20 6f 66   (e.g. parent of
2060: 20 22 62 69 6e 22 29 2e 0d 0a 20 20 20 20 20 20   "bin")...      
2070: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
2080: 66 6f 20 65 78 69 73 74 73 20 3a 3a 62 75 69 6c  fo exists ::buil
2090: 64 5f 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79  d_base_directory
20a0: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
20b0: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
20c0: 20 24 3a 3a 62 75 69 6c 64 5f 62 61 73 65 5f 64   $::build_base_d
20d0: 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74  irectory] > 0} t
20e0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
20f0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
2100: 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f  : The location o
2110: 66 20 74 68 65 20 62 75 69 6c 64 20 62 61 73 65  f the build base
2120: 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
2130: 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d  een overridden;.
2140: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
2150: 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   therefore, use 
2160: 69 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20  it verbatim...  
2170: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2180: 20 72 65 74 75 72 6e 20 24 3a 3a 62 75 69 6c 64   return $::build
2190: 5f 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79 0d  _base_directory.
21a0: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20  .      } elseif 
21b0: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
21c0: 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79  common_directory
21d0: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
21e0: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
21f0: 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63   $::common_direc
2200: 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20  tory] > 0} then 
2210: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
2220: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 65        # NOTE: Ne
2230: 78 74 2c 20 66 61 6c 6c 62 61 63 6b 20 74 6f 20  xt, fallback to 
2240: 74 68 65 20 70 61 72 65 6e 74 20 64 69 72 65 63  the parent direc
2250: 74 6f 72 79 20 6f 66 20 74 68 65 20 6f 6e 65 20  tory of the one 
2260: 63 6f 6e 74 61 69 6e 69 6e 67 0d 0a 20 20 20 20  containing..    
2270: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 69 73      #       this
2280: 20 66 69 6c 65 20 28 69 2e 65 2e 20 22 63 6f 6d   file (i.e. "com
2290: 6d 6f 6e 2e 65 61 67 6c 65 22 29 2c 20 69 66 20  mon.eagle"), if 
22a0: 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20  available...    
22b0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
22c0: 65 74 75 72 6e 20 5b 66 69 6c 65 20 64 69 72 6e  eturn [file dirn
22d0: 61 6d 65 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69  ame $::common_di
22e0: 72 65 63 74 6f 72 79 5d 0d 0a 20 20 20 20 20 20  rectory]..      
22f0: 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20  } elseif {[info 
2300: 65 78 69 73 74 73 20 3a 3a 70 61 74 68 5d 20 26  exists ::path] &
2310: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
2320: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
2330: 3a 70 61 74 68 5d 20 3e 20 30 7d 20 74 68 65 6e  :path] > 0} then
2340: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
2350: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46         # NOTE: F
2360: 69 6e 61 6c 6c 79 2c 20 66 61 6c 6c 62 61 63 6b  inally, fallback
2370: 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 64   to the parent d
2380: 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20  irectory of the 
2390: 45 61 67 6c 65 54 65 73 74 0d 0a 20 20 20 20 20  EagleTest..     
23a0: 20 20 20 23 20 20 20 20 20 20 20 70 61 74 68 2e     #       path.
23b0: 20 20 54 68 65 20 45 61 67 6c 65 54 65 73 74 20    The EagleTest 
23c0: 70 61 63 6b 61 67 65 20 67 75 61 72 61 6e 74 65  package guarante
23d0: 65 73 20 74 68 61 74 20 74 68 69 73 20 76 61 72  es that this var
23e0: 69 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 23  iable..        #
23f0: 20 20 20 20 20 20 20 77 69 6c 6c 20 62 65 20 73         will be s
2400: 65 74 20 74 6f 20 74 68 65 20 64 69 72 65 63 74  et to the direct
2410: 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ory containing t
2420: 68 65 20 66 69 72 73 74 20 66 69 6c 65 20 74 6f  he first file to
2430: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
2440: 20 20 65 78 65 63 75 74 65 20 74 68 65 20 5b 72    execute the [r
2450: 75 6e 54 65 73 74 50 72 6f 6c 6f 67 75 65 5d 20  unTestPrologue] 
2460: 73 63 72 69 70 74 20 6c 69 62 72 61 72 79 20 70  script library p
2470: 72 6f 63 65 64 75 72 65 2e 0d 0a 20 20 20 20 20  rocedure...     
2480: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
2490: 74 75 72 6e 20 5b 66 69 6c 65 20 64 69 72 6e 61  turn [file dirna
24a0: 6d 65 20 24 3a 3a 70 61 74 68 5d 0d 0a 20 20 20  me $::path]..   
24b0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
24c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
24d0: 23 20 4e 4f 54 45 3a 20 4e 6f 20 70 61 74 68 20  # NOTE: No path 
24e0: 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65  is available, re
24f0: 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74  turn an empty st
2500: 72 69 6e 67 2e 20 20 54 68 69 73 20 70 6f 69 6e  ring.  This poin
2510: 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
2520: 20 20 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65     should not be
2530: 20 72 65 61 63 68 65 64 2e 0d 0a 20 20 20 20 20   reached...     
2540: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
2550: 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 20 20 7d  turn ""..      }
2560: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
2570: 70 72 6f 63 20 69 73 4d 69 78 65 64 4d 6f 64 65  proc isMixedMode
2580: 41 73 73 65 6d 62 6c 79 20 7b 20 66 69 6c 65 4e  Assembly { fileN
2590: 61 6d 65 20 7b 76 61 72 4e 61 6d 65 20 22 22 7d  ame {varName ""}
25a0: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
25b0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 72       # NOTE: Fir
25c0: 73 74 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  st, make sure th
25d0: 65 20 74 65 73 74 20 73 75 69 74 65 20 69 6e 66  e test suite inf
25e0: 72 61 73 74 72 75 63 74 75 72 65 20 69 73 20 61  rastructure is a
25f0: 6c 6c 6f 77 65 64 20 74 6f 0d 0a 20 20 20 20 20  llowed to..     
2600: 20 23 20 20 20 20 20 20 20 75 73 65 20 74 68 65   #       use the
2610: 20 5b 65 78 65 63 5d 20 63 6f 6d 6d 61 6e 64 2e   [exec] command.
2620: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
2630: 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
2640: 74 73 20 3a 3a 6e 6f 28 65 78 65 63 29 5d 20 26  ts ::no(exec)] &
2650: 26 20 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  & ![info exists 
2660: 3a 3a 6e 6f 28 63 6f 72 46 6c 61 67 73 29 5d 7d  ::no(corFlags)]}
2670: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2680: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
2690: 54 45 3a 20 49 66 20 74 68 65 20 6c 6f 63 61 74  TE: If the locat
26a0: 69 6f 6e 20 6f 66 20 43 6f 72 46 6c 61 67 73 20  ion of CorFlags 
26b0: 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  is present in th
26c0: 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 2c 0d 0a  e environment,..
26d0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
26e0: 75 73 65 20 69 74 3b 20 6f 74 68 65 72 77 69 73  use it; otherwis
26f0: 65 20 61 73 73 75 6d 65 20 69 74 20 69 73 20 69  e assume it is i
2700: 6e 20 74 68 65 20 50 41 54 48 2e 0d 0a 20 20 20  n the PATH...   
2710: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2720: 73 65 74 20 63 6f 72 46 6c 61 67 73 20 5b 65 78  set corFlags [ex
2730: 70 72 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  pr {..          
2740: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65  [info exists ::e
2750: 6e 76 28 43 6f 72 46 6c 61 67 73 29 5d 20 3f 20  nv(CorFlags)] ? 
2760: 24 3a 3a 65 6e 76 28 43 6f 72 46 6c 61 67 73 29  $::env(CorFlags)
2770: 20 3a 20 22 43 6f 72 46 6c 61 67 73 22 0d 0a 20   : "CorFlags".. 
2780: 20 20 20 20 20 20 20 7d 5d 0d 0a 0d 0a 20 20 20         }]....   
2790: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
27a0: 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
27b0: 74 6f 20 65 78 65 63 75 74 65 20 43 6f 72 46 6c  to execute CorFl
27c0: 61 67 73 20 6f 6e 20 74 68 65 20 73 70 65 63 69  ags on the speci
27d0: 66 69 65 64 20 66 69 6c 65 2e 0d 0a 20 20 20 20  fied file...    
27e0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
27f0: 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
2800: 20 20 20 20 20 20 20 65 78 65 63 20 2d 2d 20 24         exec -- $
2810: 63 6f 72 46 6c 61 67 73 20 5b 66 69 6c 65 20 6e  corFlags [file n
2820: 61 74 69 76 65 6e 61 6d 65 20 24 66 69 6c 65 4e  ativename $fileN
2830: 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20  ame]..        } 
2840: 65 78 65 63 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  exec] == 0} then
2850: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
2860: 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
2870: 45 3a 20 49 66 20 72 65 71 75 65 73 74 65 64 20  E: If requested 
2880: 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2c 20 61  by our caller, a
2890: 74 74 65 6d 70 74 20 74 6f 20 64 65 74 65 72 6d  ttempt to determ
28a0: 69 6e 65 20 74 68 65 0d 0a 20 20 20 20 20 20 20  ine the..       
28b0: 20 20 20 23 20 20 20 20 20 20 20 70 6c 61 74 66     #       platf
28c0: 6f 72 6d 20 66 6f 72 20 74 68 65 20 73 70 65 63  orm for the spec
28d0: 69 66 69 65 64 20 66 69 6c 65 20 61 73 20 77 65  ified file as we
28e0: 6c 6c 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ll...          #
28f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
2900: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
2910: 76 61 72 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68  varName] > 0} th
2920: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
2930: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
2940: 20 23 20 4e 4f 54 45 3a 20 53 74 6f 72 65 20 74   # NOTE: Store t
2950: 68 65 20 70 6c 61 74 66 6f 72 6d 20 69 6e 20 74  he platform in t
2960: 68 65 20 6e 61 6d 65 64 20 76 61 72 69 61 62 6c  he named variabl
2970: 65 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20  e in the..      
2980: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
2990: 6e 74 65 78 74 20 6f 66 20 6f 75 72 20 63 61 6c  ntext of our cal
29a0: 6c 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ler...          
29b0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
29c0: 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d   upvar 1 $varNam
29d0: 65 20 70 6c 61 74 66 6f 72 6d 0d 0a 0d 0a 20 20  e platform....  
29e0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
29f0: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
2a00: 20 41 74 74 65 6d 70 74 20 74 6f 20 65 78 74 72   Attempt to extr
2a10: 61 63 74 20 74 68 65 20 50 45 20 6c 69 6e 65 20  act the PE line 
2a20: 66 72 6f 6d 20 74 68 65 20 63 61 70 74 75 72 65  from the capture
2a30: 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  d..            #
2a40: 20 20 20 20 20 20 20 6f 75 74 70 75 74 2e 20 20         output.  
2a50: 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73  If this value is
2a60: 20 22 50 45 33 32 22 20 6f 72 20 22 50 45 33 32   "PE32" or "PE32
2a70: 2b 22 2c 20 74 68 65 0d 0a 20 20 20 20 20 20 20  +", the..       
2a80: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 73 73       #       ass
2a90: 65 6d 62 6c 79 20 66 69 6c 65 20 69 73 20 33 32  embly file is 32
2aa0: 2d 62 69 74 20 6f 72 20 36 34 2d 62 69 74 2c 20  -bit or 64-bit, 
2ab0: 72 65 73 70 65 63 74 69 76 65 6c 79 3b 0d 0a 20  respectively;.. 
2ac0: 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
2ad0: 20 20 20 6f 74 68 65 72 77 69 73 65 2c 20 69 74     otherwise, it
2ae0: 73 20 74 79 70 65 20 69 73 20 75 6e 6b 6e 6f 77  s type is unknow
2af0: 6e 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n...            
2b00: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  #..            s
2b10: 65 74 20 70 61 74 74 65 72 6e 20 7b 5e 50 45 20  et pattern {^PE 
2b20: 20 20 20 20 20 20 20 3a 20 28 50 45 33 32 7c 50         : (PE32|P
2b30: 45 33 32 5c 2b 29 5c 73 2b 24 7d 0d 0a 0d 0a 20  E32\+)\s+$}.... 
2b40: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
2b50: 72 65 67 65 78 70 20 2d 6c 69 6e 65 20 2d 2d 20  regexp -line -- 
2b60: 24 70 61 74 74 65 72 6e 20 24 65 78 65 63 20 64  $pattern $exec d
2b70: 75 6d 6d 79 20 70 65 33 32 5d 7d 20 74 68 65 6e  ummy pe32]} then
2b80: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2b90: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
2ba0: 20 20 20 23 20 48 41 43 4b 3a 20 54 68 69 73 20     # HACK: This 
2bb0: 5b 73 77 69 74 63 68 5d 20 61 73 73 75 6d 65 73  [switch] assumes
2bc0: 20 74 68 61 74 20 33 32 2d 62 69 74 20 65 78 65   that 32-bit exe
2bd0: 63 75 74 61 62 6c 65 73 20 61 72 65 0d 0a 20 20  cutables are..  
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
2bf0: 20 20 20 20 61 6c 77 61 79 73 20 78 38 36 20 61      always x86 a
2c00: 6e 64 20 74 68 61 74 20 36 34 2d 62 69 74 20 65  nd that 64-bit e
2c10: 78 65 63 75 74 61 62 6c 65 73 20 61 72 65 20 61  xecutables are a
2c20: 6c 77 61 79 73 0d 0a 20 20 20 20 20 20 20 20 20  lways..         
2c30: 20 20 20 20 20 23 20 20 20 20 20 20 20 78 36 34       #       x64
2c40: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
2c50: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
2c60: 20 20 73 77 69 74 63 68 20 2d 65 78 61 63 74 20    switch -exact 
2c70: 2d 2d 20 24 70 65 33 32 20 7b 0d 0a 20 20 20 20  -- $pe32 {..    
2c80: 20 20 20 20 20 20 20 20 20 20 20 20 50 45 33 32              PE32
2c90: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2ca0: 20 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f        set platfo
2cb0: 72 6d 20 57 69 6e 33 32 0d 0a 20 20 20 20 20 20  rm Win32..      
2cc0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
2cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 50 45 33               PE3
2ce0: 32 2b 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  2+ {..          
2cf0: 20 20 20 20 20 20 20 20 73 65 74 20 70 6c 61 74          set plat
2d00: 66 6f 72 6d 20 78 36 34 0d 0a 20 20 20 20 20 20  form x64..      
2d10: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
2d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65 66               def
2d30: 61 75 6c 74 20 7b 0d 0a 20 20 20 20 20 20 20 20  ault {..        
2d40: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 70 6c            set pl
2d50: 61 74 66 6f 72 6d 20 22 22 0d 0a 20 20 20 20 20  atform ""..     
2d60: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
2d70: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
2d80: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
2d90: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
2da0: 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20     set platform 
2db0: 22 22 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ""..            
2dc0: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
2dd0: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
2de0: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
2df0: 20 41 74 74 65 6d 70 74 20 74 6f 20 65 78 74 72   Attempt to extr
2e00: 61 63 74 20 74 68 65 20 49 4c 4f 4e 4c 59 20 6c  act the ILONLY l
2e10: 69 6e 65 20 66 72 6f 6d 20 74 68 65 20 63 61 70  ine from the cap
2e20: 74 75 72 65 64 0d 0a 20 20 20 20 20 20 20 20 20  tured..         
2e30: 20 23 20 20 20 20 20 20 20 6f 75 74 70 75 74 2e   #       output.
2e40: 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20    If this value 
2e50: 69 73 20 7a 65 72 6f 2c 20 74 68 65 20 73 70 65  is zero, the spe
2e60: 63 69 66 69 65 64 20 66 69 6c 65 20 6d 75 73 74  cified file must
2e70: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
2e80: 20 20 20 20 62 65 20 61 20 6d 69 78 65 64 2d 6d      be a mixed-m
2e90: 6f 64 65 20 61 73 73 65 6d 62 6c 79 3b 20 6f 74  ode assembly; ot
2ea0: 68 65 72 77 69 73 65 2c 20 69 74 20 63 6f 6e 74  herwise, it cont
2eb0: 61 69 6e 73 20 6f 6e 6c 79 0d 0a 20 20 20 20 20  ains only..     
2ec0: 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 61 6e       #       man
2ed0: 61 67 65 64 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e  aged components.
2ee0: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
2ef0: 20 20 20 20 20 20 20 20 20 73 65 74 20 70 61 74           set pat
2f00: 74 65 72 6e 20 7b 5e 49 4c 4f 4e 4c 59 20 20 20  tern {^ILONLY   
2f10: 20 3a 20 28 30 7c 31 29 5c 73 2b 24 7d 0d 0a 0d   : (0|1)\s+$}...
2f20: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
2f30: 5b 72 65 67 65 78 70 20 2d 6c 69 6e 65 20 2d 2d  [regexp -line --
2f40: 20 24 70 61 74 74 65 72 6e 20 24 65 78 65 63 20   $pattern $exec 
2f50: 64 75 6d 6d 79 20 69 6c 4f 6e 6c 79 5d 7d 20 74  dummy ilOnly]} t
2f60: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2f70: 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d     return false.
2f80: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
2f90: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
2fa0: 69 6c 4f 6e 6c 79 7d 20 74 68 65 6e 20 7b 0d 0a  ilOnly} then {..
2fb0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2fc0: 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20  rn true..       
2fd0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
2fe0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
2ff0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
3000: 45 3a 20 49 66 20 74 68 65 20 74 65 73 74 20 73  E: If the test s
3010: 75 69 74 65 20 63 61 6e 6e 6f 74 20 75 73 65 20  uite cannot use 
3020: 5b 65 78 65 63 5d 20 6f 72 20 65 78 65 63 75 74  [exec] or execut
3030: 69 6f 6e 20 6f 66 20 43 6f 72 46 6c 61 67 73 0d  ion of CorFlags.
3040: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66  .      #       f
3050: 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 20 66 61  ailed, return fa
3060: 6c 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  lse...      #.. 
3070: 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73       return fals
3080: 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  e..    }.....   
3090: 20 70 72 6f 63 20 69 73 42 75 69 6c 64 41 76 61   proc isBuildAva
30a0: 69 6c 61 62 6c 65 20 7b 20 6e 61 74 69 76 65 20  ilable { native 
30b0: 64 69 72 65 63 74 6f 72 79 20 7b 76 61 72 4e 61  directory {varNa
30c0: 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20  me ""} } {..    
30d0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
30e0: 45 3a 20 42 75 69 6c 64 20 74 68 65 20 66 75 6c  E: Build the ful
30f0: 6c 79 20 71 75 61 6c 69 66 69 65 64 20 66 69 6c  ly qualified fil
3100: 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 70  e name for the p
3110: 72 69 6d 61 72 79 20 61 73 73 65 6d 62 6c 79 0d  rimary assembly.
3120: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
3130: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 53 79  ontaining the Sy
3140: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
3150: 20 6d 61 6e 61 67 65 64 20 63 6f 6d 70 6f 6e 65   managed compone
3160: 6e 74 73 2e 20 20 49 74 0d 0a 20 20 20 20 20 20  nts.  It..      
3170: 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62  #       should b
3180: 65 20 6e 6f 74 65 64 20 74 68 61 74 20 74 68 69  e noted that thi
3190: 73 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 20  s assembly file 
31a0: 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e  may also contain
31b0: 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
31c0: 20 20 20 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f      native compo
31d0: 6e 65 6e 74 73 2c 20 69 66 20 61 20 6e 61 74 69  nents, if a nati
31e0: 76 65 20 62 75 69 6c 64 20 69 73 20 69 6e 20 75  ve build is in u
31f0: 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  se...      #..  
3200: 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65      set fileName
3210: 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
3220: 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69  e [file join $di
3230: 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20  rectory \..     
3240: 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
3250: 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d 5d 0d 0a 0d  .SQLite.dll]]...
3260: 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c  .      if {![fil
3270: 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61  e exists $fileNa
3280: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
3290: 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73       return fals
32a0: 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  e..      }....  
32b0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
32c0: 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20  OTE: Attempt to 
32d0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
32e0: 74 65 63 74 20 69 66 20 74 68 65 20 70 72 69 6d  tect if the prim
32f0: 61 72 79 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20  ary assembly..  
3300: 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74      #       cont
3310: 61 69 6e 73 20 61 6e 79 20 6e 61 74 69 76 65 20  ains any native 
3320: 63 6f 6d 70 6f 6e 65 6e 74 73 2c 20 69 66 20 6e  components, if n
3330: 65 63 65 73 73 61 72 79 2e 0d 0a 20 20 20 20 20  ecessary...     
3340: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   #..      if {[s
3350: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e 61  tring length $na
3360: 74 69 76 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  tive] == 0} then
3370: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
3380: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
3390: 76 61 72 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68  varName] > 0} th
33a0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
33b0: 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65  upvar 1 $varName
33c0: 20 24 76 61 72 4e 61 6d 65 0d 0a 20 20 20 20 20   $varName..     
33d0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
33e0: 73 65 74 20 6e 61 74 69 76 65 20 5b 69 73 4d 69  set native [isMi
33f0: 78 65 64 4d 6f 64 65 41 73 73 65 6d 62 6c 79 20  xedModeAssembly 
3400: 24 66 69 6c 65 4e 61 6d 65 20 24 76 61 72 4e 61  $fileName $varNa
3410: 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  me]..      }....
3420: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
3430: 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 70 72   NOTE: If the pr
3440: 69 6d 61 72 79 20 61 73 73 65 6d 62 6c 79 20 61  imary assembly a
3450: 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  lso contains the
3460: 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e 65 6e   native componen
3470: 74 73 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ts,..      #    
3480: 20 20 20 77 65 20 68 61 76 65 20 65 76 65 72 79     we have every
3490: 74 68 69 6e 67 20 77 65 20 6e 65 65 64 2e 0d 0a  thing we need...
34a0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
34b0: 66 20 7b 24 6e 61 74 69 76 65 7d 20 74 68 65 6e  f {$native} then
34c0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
34d0: 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 7d  rn true..      }
34e0: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
34f0: 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64     # NOTE: Build
3500: 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69   the fully quali
3510: 66 69 65 64 20 66 69 6c 65 20 6e 61 6d 65 20 66  fied file name f
3520: 6f 72 20 74 68 65 20 69 6e 74 65 72 6f 70 20 61  or the interop a
3530: 73 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 23  ssembly..      #
3540: 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 69 6e         containin
3550: 67 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74  g the System.Dat
3560: 61 2e 53 51 4c 69 74 65 20 6e 61 74 69 76 65 20  a.SQLite native 
3570: 63 6f 6d 70 6f 6e 65 6e 74 73 2e 20 20 49 66 20  components.  If 
3580: 74 68 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20  this..      #   
3590: 20 20 20 20 66 69 6c 65 20 65 78 69 73 74 73 2c      file exists,
35a0: 20 77 65 20 73 68 6f 75 6c 64 20 68 61 76 65 20   we should have 
35b0: 65 76 65 72 79 74 68 69 6e 67 20 77 65 20 6e 65  everything we ne
35c0: 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ed...      #..  
35d0: 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65      set fileName
35e0: 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
35f0: 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69  e [file join $di
3600: 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20  rectory \..     
3610: 20 20 20 20 20 53 51 4c 69 74 65 2e 49 6e 74 65       SQLite.Inte
3620: 72 6f 70 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20  rop.dll]]....   
3630: 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69     if {[file exi
3640: 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20  sts $fileName]} 
3650: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
3660: 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20  return true..   
3670: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
3680: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42  .      # NOTE: B
3690: 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 79 20 71  uild the fully q
36a0: 75 61 6c 69 66 69 65 64 20 66 69 6c 65 20 6e 61  ualified file na
36b0: 6d 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69 74  me for the SQLit
36c0: 65 20 63 6f 72 65 0d 0a 20 20 20 20 20 20 23 20  e core..      # 
36d0: 20 20 20 20 20 20 6c 69 62 72 61 72 79 2e 20 20        library.  
36e0: 49 66 20 74 68 69 73 20 66 69 6c 65 20 65 78 69  If this file exi
36f0: 73 74 73 2c 20 77 65 20 73 68 6f 75 6c 64 20 68  sts, we should h
3700: 61 76 65 20 65 76 65 72 79 74 68 69 6e 67 20 77  ave everything w
3710: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
3720: 20 6e 65 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d   need...      #.
3730: 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e  .      set fileN
3740: 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ame [file native
3750: 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
3760: 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20  $directory \..  
3770: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 2e          sqlite3.
3780: 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69  dll]]....      i
3790: 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20  f {[file exists 
37a0: 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  $fileName]} then
37b0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
37c0: 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 7d  rn true..      }
37d0: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
37e0: 20 20 20 23 20 4e 4f 54 45 3a 20 4f 6e 65 20 6f     # NOTE: One o
37f0: 72 20 6d 6f 72 65 20 6e 61 74 69 76 65 20 63 6f  r more native co
3800: 6d 70 6f 6e 65 6e 74 73 20 6e 65 65 64 65 64 20  mponents needed 
3810: 62 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  by System.Data.S
3820: 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 23 20 20  QLite..      #  
3830: 20 20 20 20 20 61 72 65 20 6d 69 73 73 69 6e 67       are missing
3840: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
3850: 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a    return false..
3860: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
3870: 6f 63 20 69 73 52 65 6c 65 61 73 65 41 76 61 69  oc isReleaseAvai
3880: 6c 61 62 6c 65 20 7b 20 64 69 72 65 63 74 6f 72  lable { director
3890: 79 20 7b 76 61 72 4e 61 6d 65 20 22 22 7d 20 7d  y {varName ""} }
38a0: 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   {..      if {[s
38b0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61  tring length $va
38c0: 72 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e  rName] > 0} then
38d0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 70 76 61   {..        upva
38e0: 72 20 31 20 24 76 61 72 4e 61 6d 65 20 24 76 61  r 1 $varName $va
38f0: 72 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 0d 0a  rName..      }..
3900: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b  ..      return [
3910: 69 73 42 75 69 6c 64 41 76 61 69 6c 61 62 6c 65  isBuildAvailable
3920: 20 22 22 20 24 64 69 72 65 63 74 6f 72 79 20 24   "" $directory $
3930: 76 61 72 4e 61 6d 65 5d 0d 0a 20 20 20 20 7d 0d  varName]..    }.
3940: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 6a 6f 69  ....    proc joi
3950: 6e 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79 20  nBuildDirectory 
3960: 7b 20 6e 61 74 69 76 65 20 70 61 74 68 20 79 65  { native path ye
3970: 61 72 20 70 6c 61 74 66 6f 72 6d 20 63 6f 6e 66  ar platform conf
3980: 69 67 75 72 61 74 69 6f 6e 20 7d 20 7b 0d 0a 20  iguration } {.. 
3990: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
39a0: 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f 75 74  NOTE: Figure out
39b0: 20 61 6e 64 20 74 68 65 6e 20 72 65 74 75 72 6e   and then return
39c0: 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69   the fully quali
39d0: 66 69 65 64 20 70 61 74 68 20 74 6f 20 74 68 65  fied path to the
39e0: 20 62 75 69 6c 64 0d 0a 20 20 20 20 20 20 23 20   build..      # 
39f0: 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20        directory 
3a00: 62 61 73 65 64 20 6f 6e 20 61 6c 6c 20 74 68 65  based on all the
3a10: 20 61 72 67 75 6d 65 6e 74 73 20 70 72 6f 76 69   arguments provi
3a20: 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65  ded by our calle
3a30: 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  r...      #..   
3a40: 20 20 20 69 66 20 7b 24 6e 61 74 69 76 65 7d 20     if {$native} 
3a50: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
3a60: 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6a 6f 69  return [file joi
3a70: 6e 20 24 70 61 74 68 20 62 69 6e 20 24 79 65 61  n $path bin $yea
3a80: 72 20 24 70 6c 61 74 66 6f 72 6d 20 24 63 6f 6e  r $platform $con
3a90: 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 20 20 20  figuration]..   
3aa0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
3ab0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c       return [fil
3ac0: 65 20 6a 6f 69 6e 20 24 70 61 74 68 20 62 69 6e  e join $path bin
3ad0: 20 24 79 65 61 72 20 24 63 6f 6e 66 69 67 75 72   $year $configur
3ae0: 61 74 69 6f 6e 20 62 69 6e 5d 0d 0a 20 20 20 20  ation bin]..    
3af0: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
3b00: 20 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64     proc getBuild
3b10: 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a  Directory {} {..
3b20: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
3b30: 20 4e 4f 54 45 3a 20 53 65 65 20 69 66 20 74 68   NOTE: See if th
3b40: 65 20 22 6e 61 74 69 76 65 22 20 72 75 6e 74 69  e "native" runti
3b50: 6d 65 20 6f 70 74 69 6f 6e 20 68 61 73 20 62 65  me option has be
3b60: 65 6e 20 73 65 74 2e 20 20 49 66 20 73 6f 2c 20  en set.  If so, 
3b70: 75 73 65 20 74 68 65 0d 0a 20 20 20 20 20 20 23  use the..      #
3b80: 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79         directory
3b90: 20 66 6f 72 20 74 68 65 20 6d 69 78 65 64 2d 6d   for the mixed-m
3ba0: 6f 64 65 20 61 73 73 65 6d 62 6c 79 20 28 61 2e  ode assembly (a.
3bb0: 6b 2e 61 2e 20 74 68 65 20 6e 61 74 69 76 65 20  k.a. the native 
3bc0: 69 6e 74 65 72 6f 70 0d 0a 20 20 20 20 20 20 23  interop..      #
3bd0: 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 29         assembly)
3be0: 2e 20 20 54 6f 20 65 6e 61 62 6c 65 20 74 68 69  .  To enable thi
3bf0: 73 20 6f 70 74 69 6f 6e 20 76 69 61 20 74 68 65  s option via the
3c00: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2c 20 65   command line, e
3c10: 6e 74 65 72 20 61 0d 0a 20 20 20 20 20 20 23 20  nter a..      # 
3c20: 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64 20 73 69        command si
3c30: 6d 69 6c 61 72 20 74 6f 20 6f 6e 65 20 6f 66 20  milar to one of 
3c40: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 28 61  the following (a
3c50: 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65 29 3a  ll on one line):
3c60: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
3c70: 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68   #       EagleSh
3c80: 65 6c 6c 2e 65 78 65 20 2d 69 6e 69 74 69 61 6c  ell.exe -initial
3c90: 69 7a 65 20 2d 72 75 6e 74 69 6d 65 4f 70 74 69  ize -runtimeOpti
3ca0: 6f 6e 20 6e 61 74 69 76 65 0d 0a 20 20 20 20 20  on native..     
3cb0: 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65   #         -file
3cc0: 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65   .\path\to\all.e
3cd0: 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20  agle..      #.. 
3ce0: 20 20 20 20 20 23 20 20 20 20 20 20 20 54 6f 20       #       To 
3cf0: 65 6e 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69  enable this opti
3d00: 6f 6e 20 76 69 61 20 74 68 65 20 63 6f 6d 6d 61  on via the comma
3d10: 6e 64 20 6c 69 6e 65 20 70 72 69 6f 72 20 74 6f  nd line prior to
3d20: 20 74 68 65 20 22 62 65 74 61 20 31 36 22 0d 0a   the "beta 16"..
3d30: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65        #       re
3d40: 6c 65 61 73 65 20 6f 66 20 45 61 67 6c 65 2c 20  lease of Eagle, 
3d50: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  the following co
3d60: 6d 6d 61 6e 64 20 6d 75 73 74 20 62 65 20 75 73  mmand must be us
3d70: 65 64 20 69 6e 73 74 65 61 64 0d 0a 20 20 20 20  ed instead..    
3d80: 20 20 23 20 20 20 20 20 20 20 28 61 6c 73 6f 20    #       (also 
3d90: 61 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65 29  all on one line)
3da0: 3a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  :..      #..    
3db0: 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53    #       EagleS
3dc0: 68 65 6c 6c 2e 65 78 65 20 2d 69 6e 69 74 69 61  hell.exe -initia
3dd0: 6c 69 7a 65 20 2d 70 6f 73 74 49 6e 69 74 69 61  lize -postInitia
3de0: 6c 69 7a 65 0d 0a 20 20 20 20 20 20 23 20 20 20  lize..      #   
3df0: 20 20 20 20 20 20 22 6f 62 6a 65 63 74 20 69 6e        "object in
3e00: 76 6f 6b 65 20 49 6e 74 65 72 70 72 65 74 65 72  voke Interpreter
3e10: 2e 47 65 74 41 63 74 69 76 65 20 41 64 64 52 75  .GetActive AddRu
3e20: 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69  ntimeOption nati
3e30: 76 65 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ve"..      #    
3e40: 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74       -file .\pat
3e50: 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a  h\to\all.eagle..
3e60: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
3e70: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
3e80: 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63 74 6f 72  ::build_director
3e90: 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  y] && \..       
3ea0: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
3eb0: 68 20 24 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63  h $::build_direc
3ec0: 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20  tory] > 0} then 
3ed0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
3ee0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
3ef0: 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  e location of th
3f00: 65 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72  e build director
3f10: 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  y has been overr
3f20: 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20  idden;..        
3f30: 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72  #       therefor
3f40: 65 2c 20 75 73 65 20 69 74 20 76 65 72 62 61 74  e, use it verbat
3f50: 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  im...        #..
3f60: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
3f70: 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63 74 6f 72  ::build_director
3f80: 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  y..      } else 
3f90: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
3fa0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
3fb0: 20 74 68 65 20 22 6e 61 74 69 76 65 22 20 72 75   the "native" ru
3fc0: 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20  ntime option is 
3fd0: 73 65 74 2c 20 74 68 65 20 6d 69 78 65 64 2d 6d  set, the mixed-m
3fe0: 6f 64 65 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20  ode assembly..  
3ff0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 73        #       is
4000: 20 62 65 69 6e 67 20 74 65 73 74 65 64 2e 20 20   being tested.  
4010: 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68  In that case, th
4020: 65 20 70 61 74 68 20 74 6f 20 74 68 65 20 62 75  e path to the bu
4030: 69 6c 64 20 64 69 72 65 63 74 6f 72 79 0d 0a 20  ild directory.. 
4040: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77         #       w
4050: 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 74 68 65 20  ill contain the 
4060: 70 6c 61 74 66 6f 72 6d 20 6e 61 6d 65 20 61 6e  platform name an
4070: 64 20 61 6c 6c 20 74 68 65 20 62 69 6e 61 72 69  d all the binari
4080: 65 73 20 75 6e 64 65 72 20 74 65 73 74 0d 0a 20  es under test.. 
4090: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73         #       s
40a0: 68 6f 75 6c 64 20 62 65 20 70 72 65 73 65 6e 74  hould be present
40b0: 20 69 6e 20 74 68 61 74 20 64 69 72 65 63 74 6f   in that directo
40c0: 72 79 2e 20 20 49 66 20 74 68 65 20 22 6e 61 74  ry.  If the "nat
40d0: 69 76 65 22 20 72 75 6e 74 69 6d 65 0d 0a 20 20  ive" runtime..  
40e0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 70        #       op
40f0: 74 69 6f 6e 20 69 73 20 6e 6f 74 20 73 65 74 2c  tion is not set,
4100: 20 74 68 65 20 62 75 69 6c 64 20 64 69 72 65 63   the build direc
4110: 74 6f 72 79 20 77 69 6c 6c 20 62 65 20 63 6f 6e  tory will be con
4120: 73 69 64 65 72 65 64 20 74 6f 20 62 65 0d 0a 20  sidered to be.. 
4130: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22         #       "
4140: 70 6c 61 74 66 6f 72 6d 2d 6e 65 75 74 72 61 6c  platform-neutral
4150: 22 2c 20 77 69 74 68 20 74 68 65 20 6e 6f 74 61  ", with the nota
4160: 62 6c 65 20 65 78 63 65 70 74 69 6f 6e 20 6f 66  ble exception of
4170: 20 61 6e 79 20 6e 61 74 69 76 65 0d 0a 20 20 20   any native..   
4180: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 73 73       #       ass
4190: 65 6d 62 6c 79 20 28 65 2e 67 2e 20 22 53 51 4c  embly (e.g. "SQL
41a0: 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 22  ite.Interop.dll"
41b0: 29 20 63 6f 70 69 65 64 20 74 68 65 72 65 20 64  ) copied there d
41c0: 75 72 69 6e 67 20 74 68 65 0d 0a 20 20 20 20 20  uring the..     
41d0: 20 20 20 23 20 20 20 20 20 20 20 62 75 69 6c 64     #       build
41e0: 20 70 72 6f 63 65 73 73 20 69 74 73 65 6c 66 2e   process itself.
41f0: 20 20 49 66 20 74 68 65 20 62 75 69 6c 64 20 70    If the build p
4200: 72 6f 63 65 73 73 20 73 6f 6d 65 68 6f 77 20 64  rocess somehow d
4210: 6f 65 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20  oes not..       
4220: 20 23 20 20 20 20 20 20 20 63 6f 70 79 20 74 68   #       copy th
4230: 65 20 6e 61 74 69 76 65 20 61 73 73 65 6d 62 6c  e native assembl
4240: 79 20 66 6f 72 20 74 68 69 73 20 70 6c 61 74 66  y for this platf
4250: 6f 72 6d 2c 20 6d 6f 73 74 20 6f 66 20 74 68 65  orm, most of the
4260: 20 74 65 73 74 73 0d 0a 20 20 20 20 20 20 20 20   tests..        
4270: 23 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 73  #       in the s
4280: 75 69 74 65 20 77 69 6c 6c 20 73 69 6d 70 6c 79  uite will simply
4290: 20 62 65 20 73 6b 69 70 70 65 64 2e 20 20 47 65   be skipped.  Ge
42a0: 6e 65 72 61 6c 6c 79 20 73 70 65 61 6b 69 6e 67  nerally speaking
42b0: 2c 20 74 68 65 72 65 0d 0a 20 20 20 20 20 20 20  , there..       
42c0: 20 23 20 20 20 20 20 20 20 61 72 65 20 74 77 6f   #       are two
42d0: 20 77 61 79 73 20 74 6f 20 62 75 69 6c 64 20 74   ways to build t
42e0: 68 65 20 62 69 6e 61 72 69 65 73 20 77 68 65 6e  he binaries when
42f0: 20 70 72 65 70 61 72 69 6e 67 20 74 6f 20 72 75   preparing to ru
4300: 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23  n the..        #
4310: 20 20 20 20 20 20 20 74 65 73 74 20 73 75 69 74         test suit
4320: 65 3a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e:..        #.. 
4330: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 31         #       1
4340: 2e 20 42 75 69 6c 64 20 74 68 65 20 73 65 70 61  . Build the sepa
4350: 72 61 74 65 20 6d 61 6e 61 67 65 64 20 61 6e 64  rate managed and
4360: 20 6e 61 74 69 76 65 20 61 73 73 65 6d 62 6c 69   native assembli
4370: 65 73 20 75 73 69 6e 67 20 73 6f 6d 65 0d 0a 20  es using some.. 
4380: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
4390: 20 20 63 6f 6d 6d 61 6e 64 73 20 73 69 6d 69 6c    commands simil
43a0: 61 72 20 74 6f 3a 0d 0a 20 20 20 20 20 20 20 20  ar to:..        
43b0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  #..        #    
43c0: 20 20 20 20 20 20 62 75 69 6c 64 2e 62 61 74 20        build.bat 
43d0: 24 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d  ${Configuration}
43e0: 4d 61 6e 61 67 65 64 4f 6e 6c 79 20 24 7b 50 6c  ManagedOnly ${Pl
43f0: 61 74 66 6f 72 6d 7d 0d 0a 20 20 20 20 20 20 20  atform}..       
4400: 20 23 20 20 20 20 20 20 20 20 20 20 62 75 69 6c   #          buil
4410: 64 2e 62 61 74 20 24 7b 43 6f 6e 66 69 67 75 72  d.bat ${Configur
4420: 61 74 69 6f 6e 7d 4e 61 74 69 76 65 4f 6e 6c 79  ation}NativeOnly
4430: 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 0d 0a 20 20   ${Platform}..  
4440: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
4450: 20 23 20 20 20 20 20 20 20 20 20 20 57 68 65 72   #          Wher
4460: 65 20 24 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f  e ${Configuratio
4470: 6e 7d 20 69 73 20 65 69 74 68 65 72 20 22 44 65  n} is either "De
4480: 62 75 67 22 20 6f 72 20 22 52 65 6c 65 61 73 65  bug" or "Release
4490: 22 20 61 6e 64 0d 0a 20 20 20 20 20 20 20 20 23  " and..        #
44a0: 20 20 20 20 20 20 20 20 20 20 24 7b 50 6c 61 74            ${Plat
44b0: 66 6f 72 6d 7d 20 69 73 20 65 69 74 68 65 72 20  form} is either 
44c0: 22 57 69 6e 33 32 22 20 6f 72 20 22 78 36 34 22  "Win32" or "x64"
44d0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
44e0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 32 2e        #       2.
44f0: 20 42 75 69 6c 64 20 74 68 65 20 6d 69 78 65 64   Build the mixed
4500: 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20 75  -mode assembly u
4510: 73 69 6e 67 20 61 20 63 6f 6d 6d 61 6e 64 20 73  sing a command s
4520: 69 6d 69 6c 61 72 20 74 6f 3a 0d 0a 20 20 20 20  imilar to:..    
4530: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
4540: 20 20 20 20 20 20 20 20 20 20 62 75 69 6c 64 2e            build.
4550: 62 61 74 20 24 7b 43 6f 6e 66 69 67 75 72 61 74  bat ${Configurat
4560: 69 6f 6e 7d 20 24 7b 50 6c 61 74 66 6f 72 6d 7d  ion} ${Platform}
4570: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
4580: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20       #          
4590: 57 68 65 72 65 20 24 7b 43 6f 6e 66 69 67 75 72  Where ${Configur
45a0: 61 74 69 6f 6e 7d 20 69 73 20 65 69 74 68 65 72  ation} is either
45b0: 20 22 44 65 62 75 67 22 20 6f 72 20 22 52 65 6c   "Debug" or "Rel
45c0: 65 61 73 65 22 20 61 6e 64 0d 0a 20 20 20 20 20  ease" and..     
45d0: 20 20 20 23 20 20 20 20 20 20 20 20 20 20 24 7b     #          ${
45e0: 50 6c 61 74 66 6f 72 6d 7d 20 69 73 20 65 69 74  Platform} is eit
45f0: 68 65 72 20 22 57 69 6e 33 32 22 20 6f 72 20 22  her "Win32" or "
4600: 78 36 34 22 2e 20 20 49 66 20 74 68 69 73 20 63  x64".  If this c
4610: 6f 6d 6d 61 6e 64 20 69 73 0d 0a 20 20 20 20 20  ommand is..     
4620: 20 20 20 23 20 20 20 20 20 20 20 20 20 20 75 73     #          us
4630: 65 64 2c 20 76 61 72 69 6f 75 73 20 74 65 73 74  ed, various test
4640: 73 20 74 68 61 74 20 72 65 71 75 69 72 65 20 73  s that require s
4650: 75 70 70 6c 65 6d 65 6e 74 61 72 79 20 6d 61 6e  upplementary man
4660: 61 67 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20  aged..        # 
4670: 20 20 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c           assembl
4680: 69 65 73 20 28 65 2e 67 2e 20 4c 49 4e 51 29 20  ies (e.g. LINQ) 
4690: 6d 61 79 20 62 65 20 73 6b 69 70 70 65 64 20 75  may be skipped u
46a0: 6e 6c 65 73 73 20 74 68 6f 73 65 20 62 69 6e 61  nless those bina
46b0: 72 69 65 73 0d 0a 20 20 20 20 20 20 20 20 23 20  ries..        # 
46c0: 20 20 20 20 20 20 20 20 20 61 72 65 20 73 75 62           are sub
46d0: 73 65 71 75 65 6e 74 6c 79 20 63 6f 70 69 65 64  sequently copied
46e0: 20 69 6e 74 6f 20 74 68 65 20 63 6f 72 72 65 63   into the correc
46f0: 74 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65  t directory (i.e
4700: 2e 20 62 79 0d 0a 20 20 20 20 20 20 20 20 23 20  . by..        # 
4710: 20 20 20 20 20 20 20 20 20 22 74 65 73 74 5f 61           "test_a
4720: 6c 6c 2e 62 61 74 22 29 2e 0d 0a 20 20 20 20 20  ll.bat")...     
4730: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
4740: 20 20 20 20 20 20 4e 6f 74 65 20 74 68 61 74 20        Note that 
4750: 61 6c 6c 20 6f 66 20 74 68 65 20 62 75 69 6c 64  all of the build
4760: 20 63 6f 6d 6d 61 6e 64 73 20 61 62 6f 76 65 20   commands above 
4770: 77 69 6c 6c 20 64 65 66 61 75 6c 74 20 74 6f 20  will default to 
4780: 75 73 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 23  using..        #
4790: 20 20 20 20 20 20 20 74 68 65 20 6c 61 74 65 73         the lates
47a0: 74 20 76 65 72 73 69 6f 6e 20 6f 66 20 4d 53 42  t version of MSB
47b0: 75 69 6c 64 20 61 76 61 69 6c 61 62 6c 65 20 61  uild available a
47c0: 6e 64 20 74 68 65 20 22 74 65 73 74 5f 79 65 61  nd the "test_yea
47d0: 72 22 20 6d 61 79 0d 0a 20 20 20 20 20 20 20 20  r" may..        
47e0: 23 20 20 20 20 20 20 20 6e 65 65 64 20 74 6f 20  #       need to 
47f0: 62 65 20 61 64 6a 75 73 74 65 64 20 61 63 63 6f  be adjusted acco
4800: 72 64 69 6e 67 6c 79 20 74 6f 20 61 63 74 75 61  rdingly to actua
4810: 6c 6c 79 20 72 75 6e 20 74 68 65 20 74 65 73 74  lly run the test
4820: 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20   suite...       
4830: 20 23 20 20 20 20 20 20 20 52 65 66 65 72 20 74   #       Refer t
4840: 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 73 20 69  o the comments i
4850: 6e 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72 5d  n [getBuildYear]
4860: 20 66 6f 72 20 6d 6f 72 65 20 69 6e 66 6f 72 6d   for more inform
4870: 61 74 69 6f 6e 20 6f 6e 0d 0a 20 20 20 20 20 20  ation on..      
4880: 20 20 23 20 20 20 20 20 20 20 68 6f 77 20 74 6f    #       how to
4890: 20 73 65 74 20 74 68 69 73 20 76 61 72 69 61 62   set this variab
48a0: 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  le...        #..
48b0: 20 20 20 20 20 20 20 20 73 65 74 20 6e 61 74 69          set nati
48c0: 76 65 20 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70  ve [hasRuntimeOp
48d0: 74 69 6f 6e 20 6e 61 74 69 76 65 5d 0d 0a 0d 0a  tion native]....
48e0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
48f0: 6a 6f 69 6e 42 75 69 6c 64 44 69 72 65 63 74 6f  joinBuildDirecto
4900: 72 79 20 24 6e 61 74 69 76 65 20 5b 67 65 74 42  ry $native [getB
4910: 75 69 6c 64 42 61 73 65 44 69 72 65 63 74 6f 72  uildBaseDirector
4920: 79 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  y] \..          
4930: 20 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72 5d    [getBuildYear]
4940: 20 5b 67 65 74 42 75 69 6c 64 50 6c 61 74 66 6f   [getBuildPlatfo
4950: 72 6d 20 24 6e 61 74 69 76 65 5d 20 5b 67 65 74  rm $native] [get
4960: 42 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69  BuildConfigurati
4970: 6f 6e 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  on]]..      }.. 
4980: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
4990: 63 20 67 65 74 52 65 6c 65 61 73 65 56 65 72 73  c getReleaseVers
49a0: 69 6f 6e 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  ion {} {..      
49b0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
49c0: 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
49d0: 72 65 6c 65 61 73 65 20 76 65 72 73 69 6f 6e 20  release version 
49e0: 66 6f 72 20 75 73 65 20 77 69 74 68 20 74 68 65  for use with the
49f0: 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79   build directory
4a00: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
4a10: 77 68 65 6e 20 63 68 65 63 6b 69 6e 67 20 66 6f  when checking fo
4a20: 72 20 61 76 61 69 6c 61 62 6c 65 20 72 65 6c 65  r available rele
4a30: 61 73 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ases...      #..
4a40: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
4a50: 65 78 69 73 74 73 20 3a 3a 72 65 6c 65 61 73 65  exists ::release
4a60: 5f 76 65 72 73 69 6f 6e 5d 20 26 26 20 5c 0d 0a  _version] && \..
4a70: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
4a80: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 72 65 6c 65  g length $::rele
4a90: 61 73 65 5f 76 65 72 73 69 6f 6e 5d 20 3e 20 30  ase_version] > 0
4aa0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
4ab0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
4ac0: 4f 54 45 3a 20 54 68 65 20 72 65 6c 65 61 73 65  OTE: The release
4ad0: 20 76 65 72 73 69 6f 6e 20 68 61 73 20 62 65 65   version has bee
4ae0: 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 20 74 68  n overridden; th
4af0: 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 0d  erefore, use it.
4b00: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
4b10: 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20   verbatim...    
4b20: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
4b30: 65 74 75 72 6e 20 24 3a 3a 72 65 6c 65 61 73 65  eturn $::release
4b40: 5f 76 65 72 73 69 6f 6e 0d 0a 20 20 20 20 20 20  _version..      
4b50: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
4b60: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
4b70: 4f 54 45 3a 20 4e 6f 20 72 65 6c 65 61 73 65 20  OTE: No release 
4b80: 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c  version is avail
4b90: 61 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 6e 20  able, return an 
4ba0: 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0d 0a 20  empty string... 
4bb0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4bc0: 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20    return ""..   
4bd0: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
4be0: 20 20 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c      proc getBuil
4bf0: 64 46 69 6c 65 4e 61 6d 65 20 7b 20 66 69 6c 65  dFileName { file
4c00: 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22  Name {platform "
4c10: 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  "} } {..      #.
4c20: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
4c30: 65 74 75 72 6e 73 20 74 68 65 20 73 70 65 63 69  eturns the speci
4c40: 66 69 65 64 20 66 69 6c 65 20 6e 61 6d 65 20 61  fied file name a
4c50: 73 20 69 66 20 69 74 20 77 65 72 65 20 6c 6f 63  s if it were loc
4c60: 61 74 65 64 20 69 6e 20 74 68 65 0d 0a 20 20 20  ated in the..   
4c70: 20 20 20 23 20 20 20 20 20 20 20 62 75 69 6c 64     #       build
4c80: 20 64 69 72 65 63 74 6f 72 79 2c 20 64 69 73 63   directory, disc
4c90: 61 72 64 69 6e 67 20 61 6e 79 20 64 69 72 65 63  arding any direc
4ca0: 74 6f 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tory information
4cb0: 20 70 72 65 73 65 6e 74 0d 0a 20 20 20 20 20 20   present..      
4cc0: 23 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 66  #       in the f
4cd0: 69 6c 65 20 6e 61 6d 65 20 61 73 20 70 72 6f 76  ile name as prov
4ce0: 69 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c  ided by our call
4cf0: 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  er...      #..  
4d00: 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65      return [file
4d10: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20   nativename \.. 
4d20: 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a           [file j
4d30: 6f 69 6e 20 5b 67 65 74 42 75 69 6c 64 44 69 72  oin [getBuildDir
4d40: 65 63 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72  ectory] $platfor
4d50: 6d 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69  m [file tail $fi
4d60: 6c 65 4e 61 6d 65 5d 5d 5d 0d 0a 20 20 20 20 7d  leName]]]..    }
4d70: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
4d80: 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79  tBinaryDirectory
4d90: 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
4da0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
4db0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74  is procedure ret
4dc0: 75 72 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f  urns the directo
4dd0: 72 79 20 77 68 65 72 65 20 74 68 65 20 74 65 73  ry where the tes
4de0: 74 20 61 70 70 6c 69 63 61 74 69 6f 6e 0d 0a 20  t application.. 
4df0: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 74 73       #       its
4e00: 65 6c 66 20 28 69 2e 65 2e 20 74 68 65 20 45 61  elf (i.e. the Ea
4e10: 67 6c 65 20 73 68 65 6c 6c 29 20 69 73 20 6c 6f  gle shell) is lo
4e20: 63 61 74 65 64 2e 20 20 54 68 69 73 20 77 69 6c  cated.  This wil
4e30: 6c 20 62 65 20 75 73 65 64 20 61 73 0d 0a 20 20  l be used as..  
4e40: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
4e50: 64 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20  destination for 
4e60: 74 68 65 20 63 6f 70 69 65 64 20 53 79 73 74 65  the copied Syste
4e70: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 6e 61  m.Data.SQLite na
4e80: 74 69 76 65 20 61 6e 64 0d 0a 20 20 20 20 20 20  tive and..      
4e90: 23 20 20 20 20 20 20 20 6d 61 6e 61 67 65 64 20  #       managed 
4ea0: 61 73 73 65 6d 62 6c 69 65 73 20 28 69 2e 65 2e  assemblies (i.e.
4eb0: 20 62 65 63 61 75 73 65 20 74 68 69 73 20 69 73   because this is
4ec0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 65 77 20   one of the few 
4ed0: 70 6c 61 63 65 73 0d 0a 20 20 20 20 20 20 23 20  places..      # 
4ee0: 20 20 20 20 20 20 77 68 65 72 65 20 74 68 65 20        where the 
4ef0: 43 4c 52 20 77 69 6c 6c 20 61 63 74 75 61 6c 6c  CLR will actuall
4f00: 79 20 66 69 6e 64 20 61 6e 64 20 6c 6f 61 64 20  y find and load 
4f10: 74 68 65 6d 20 70 72 6f 70 65 72 6c 79 29 2e 0d  them properly)..
4f20: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
4f30: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
4f40: 20 3a 3a 62 69 6e 61 72 79 5f 64 69 72 65 63 74   ::binary_direct
4f50: 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ory] && \..     
4f60: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
4f70: 67 74 68 20 24 3a 3a 62 69 6e 61 72 79 5f 64 69  gth $::binary_di
4f80: 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68  rectory] > 0} th
4f90: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
4fa0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
4fb0: 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   The location of
4fc0: 20 74 68 65 20 62 69 6e 61 72 79 20 64 69 72 65   the binary dire
4fd0: 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 6f  ctory has been o
4fe0: 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20  verridden;..    
4ff0: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 72      #       ther
5000: 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 76 65  efore, use it ve
5010: 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20  rbatim...       
5020: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
5030: 72 6e 20 24 3a 3a 62 69 6e 61 72 79 5f 64 69 72  rn $::binary_dir
5040: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20  ectory..      } 
5050: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
5060: 72 65 74 75 72 6e 20 5b 69 6e 66 6f 20 62 69 6e  return [info bin
5070: 61 72 79 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  ary]..      }.. 
5080: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
5090: 63 20 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e  c getBinaryFileN
50a0: 61 6d 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b  ame { fileName {
50b0: 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7d 20 7b  platform ""} } {
50c0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
50d0: 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 73   # NOTE: Returns
50e0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
50f0: 69 6c 65 20 6e 61 6d 65 20 61 73 20 69 66 20 69  ile name as if i
5100: 74 20 77 65 72 65 20 6c 6f 63 61 74 65 64 20 69  t were located i
5110: 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  n the..      #  
5120: 20 20 20 20 20 62 69 6e 61 72 79 20 64 69 72 65       binary dire
5130: 63 74 6f 72 79 2c 20 64 69 73 63 61 72 64 69 6e  ctory, discardin
5140: 67 20 61 6e 79 20 64 69 72 65 63 74 6f 72 79 20  g any directory 
5150: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 72 65 73  information pres
5160: 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ent..      #    
5170: 20 20 20 69 6e 20 74 68 65 20 66 69 6c 65 20 6e     in the file n
5180: 61 6d 65 20 61 73 20 70 72 6f 76 69 64 65 64 20  ame as provided 
5190: 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a  by our caller...
51a0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72        #..      r
51b0: 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69  eturn [file nati
51c0: 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  vename \..      
51d0: 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b      [file join [
51e0: 67 65 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f  getBinaryDirecto
51f0: 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d 20 5b 66  ry] $platform [f
5200: 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61  ile tail $fileNa
5210: 6d 65 5d 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  me]]]..    }....
5220: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 43 6f 72  .    proc getCor
5230: 65 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  eBinaryFileName 
5240: 7b 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20  { {platform ""} 
5250: 7b 73 74 61 6e 64 61 72 64 20 66 61 6c 73 65 7d  {standard false}
5260: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
5270: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74       # NOTE: Ret
5280: 75 72 6e 73 20 74 68 65 20 66 75 6c 6c 20 70 61  urns the full pa
5290: 74 68 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20  th for the file 
52a0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 53  containing the S
52b0: 51 4c 69 74 65 20 63 6f 72 65 0d 0a 20 20 20 20  QLite core..    
52c0: 20 20 23 20 20 20 20 20 20 20 6e 61 74 69 76 65    #       native
52d0: 20 6c 69 62 72 61 72 79 20 63 6f 64 65 20 66 6f   library code fo
52e0: 72 20 74 68 69 73 20 70 6c 61 74 66 6f 72 6d 2e  r this platform.
52f0: 20 20 46 69 72 73 74 2c 20 63 68 65 63 6b 20 61    First, check a
5300: 6e 64 20 73 65 65 20 69 66 0d 0a 20 20 20 20 20  nd see if..     
5310: 20 23 20 20 20 20 20 20 20 74 68 65 20 53 51 4c   #       the SQL
5320: 69 74 65 20 63 6f 72 65 20 6e 61 74 69 76 65 20  ite core native 
5330: 6c 69 62 72 61 72 79 20 68 61 73 20 61 6c 72 65  library has alre
5340: 61 64 79 20 62 65 65 6e 20 6c 6f 61 64 65 64 2e  ady been loaded.
5350: 20 20 4e 65 78 74 2c 0d 0a 20 20 20 20 20 20 23    Next,..      #
5360: 20 20 20 20 20 20 20 66 61 6c 6c 62 61 63 6b 20         fallback 
5370: 74 6f 20 77 68 61 74 20 74 68 65 20 66 75 6c 6c  to what the full
5380: 20 70 61 74 68 20 73 68 6f 75 6c 64 20 62 65 2c   path should be,
5390: 20 62 61 73 65 64 20 6f 6e 20 77 68 65 74 68 65   based on whethe
53a0: 72 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  r the..      #  
53b0: 20 20 20 20 20 6d 69 78 65 64 2d 6d 6f 64 65 20       mixed-mode 
53c0: 61 73 73 65 6d 62 6c 79 20 69 73 20 62 65 69 6e  assembly is bein
53d0: 67 20 75 73 65 64 20 61 6e 64 20 74 68 65 20 6e  g used and the n
53e0: 61 6d 65 20 6f 66 20 74 68 65 20 63 75 72 72 65  ame of the curre
53f0: 6e 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  nt..      #     
5400: 20 20 70 6c 61 74 66 6f 72 6d 2e 0d 0a 20 20 20    platform...   
5410: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
5420: 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20 69  [catch {object i
5430: 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
5440: 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
5450: 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
5460: 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61  Data.SQLite.Unsa
5470: 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20  feNativeMethods 
5480: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
5490: 20 5f 53 51 4c 69 74 65 4e 61 74 69 76 65 4d 6f   _SQLiteNativeMo
54a0: 64 75 6c 65 46 69 6c 65 4e 61 6d 65 7d 20 66 69  duleFileName} fi
54b0: 6c 65 4e 61 6d 65 5d 20 3d 3d 20 30 20 26 26 20  leName] == 0 && 
54c0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
54d0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 69 6c  ring length $fil
54e0: 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e  eName] > 0} then
54f0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
5500: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54         # NOTE: T
5510: 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6e  he SQLite core n
5520: 61 74 69 76 65 20 6c 69 62 72 61 72 79 20 68 61  ative library ha
5530: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6c  s already been l
5540: 6f 61 64 65 64 20 76 69 61 0d 0a 20 20 20 20 20  oaded via..     
5550: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 6e     #       the n
5560: 61 74 69 76 65 20 6c 69 62 72 61 72 79 20 70 72  ative library pr
5570: 65 2d 6c 6f 61 64 65 72 2e 20 20 52 65 74 75 72  e-loader.  Retur
5580: 6e 20 74 68 61 74 20 66 69 6c 65 20 6e 61 6d 65  n that file name
5590: 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23   now...        #
55a0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
55b0: 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20   $fileName..    
55c0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
55d0: 7b 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74 69  {[hasRuntimeOpti
55e0: 6f 6e 20 6e 61 74 69 76 65 5d 7d 20 74 68 65 6e  on native]} then
55f0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
5600: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52         # NOTE: R
5610: 65 74 75 72 6e 20 74 68 65 20 6d 69 78 65 64 2d  eturn the mixed-
5620: 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20 66 69  mode assembly fi
5630: 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20  le name...      
5640: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
5650: 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  urn [file native
5660: 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  name \..        
5670: 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b      [file join [
5680: 67 65 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f  getBinaryDirecto
5690: 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d 20 53 79  ry] $platform Sy
56a0: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
56b0: 2e 64 6c 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d 20  .dll]]..      } 
56c0: 65 6c 73 65 69 66 20 7b 24 73 74 61 6e 64 61 72  elseif {$standar
56d0: 64 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  d} then {..     
56e0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
56f0: 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65  NOTE: Return the
5700: 20 6e 61 74 69 76 65 2d 6f 6e 6c 79 20 73 74 61   native-only sta
5710: 6e 64 61 72 64 20 53 51 4c 69 74 65 20 6c 69 62  ndard SQLite lib
5720: 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 2e 0d  rary file name..
5730: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
5740: 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65      return [file
5750: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20   nativename \.. 
5760: 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
5770: 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e 61 72 79   join [getBinary
5780: 44 69 72 65 63 74 6f 72 79 5d 20 24 70 6c 61 74  Directory] $plat
5790: 66 6f 72 6d 20 73 71 6c 69 74 65 33 2e 64 6c 6c  form sqlite3.dll
57a0: 5d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ]]..      } else
57b0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
57c0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52         # NOTE: R
57d0: 65 74 75 72 6e 20 74 68 65 20 6e 61 74 69 76 65  eturn the native
57e0: 2d 6f 6e 6c 79 20 69 6e 74 65 72 6f 70 20 61 73  -only interop as
57f0: 73 65 6d 62 6c 79 20 66 69 6c 65 20 6e 61 6d 65  sembly file name
5800: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
5810: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69        return [fi
5820: 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d  le nativename \.
5830: 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69  .            [fi
5840: 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e 61  le join [getBina
5850: 72 79 44 69 72 65 63 74 6f 72 79 5d 20 24 70 6c  ryDirectory] $pl
5860: 61 74 66 6f 72 6d 20 53 51 4c 69 74 65 2e 49 6e  atform SQLite.In
5870: 74 65 72 6f 70 2e 64 6c 6c 5d 5d 0d 0a 20 20 20  terop.dll]]..   
5880: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
5890: 20 20 20 20 70 72 6f 63 20 67 65 74 43 6f 6d 6d      proc getComm
58a0: 6f 6e 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b  onDirectory {} {
58b0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
58c0: 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72   # NOTE: This pr
58d0: 6f 63 65 64 75 72 65 20 72 65 74 75 72 6e 73 20  ocedure returns 
58e0: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 77 68  the directory wh
58f0: 65 72 65 20 74 68 65 20 74 65 73 74 20 73 63 72  ere the test scr
5900: 69 70 74 73 0d 0a 20 20 20 20 20 20 23 20 20 20  ipts..      #   
5910: 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 6c 6f      should be lo
5920: 63 61 74 65 64 2e 20 20 42 79 20 64 65 66 61 75  cated.  By defau
5930: 6c 74 2c 20 74 68 69 73 20 6a 75 73 74 20 72 65  lt, this just re
5940: 74 75 72 6e 73 20 74 68 65 20 45 61 67 6c 65 0d  turns the Eagle.
5950: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62  .      #       b
5960: 69 6e 61 72 79 20 64 69 72 65 63 74 6f 72 79 2e  inary directory.
5970: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
5980: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
5990: 73 20 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63  s ::common_direc
59a0: 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20  tory] && \..    
59b0: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
59c0: 6e 67 74 68 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64  ngth $::common_d
59d0: 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74  irectory] > 0} t
59e0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
59f0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
5a00: 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f  : The location o
5a10: 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 64 69 72  f the common dir
5a20: 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
5a30: 73 65 74 3b 0d 0a 20 20 20 20 20 20 20 20 23 20  set;..        # 
5a40: 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c        therefore,
5a50: 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20   use it...      
5a60: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
5a70: 75 72 6e 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69  urn $::common_di
5a80: 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d  rectory..      }
5a90: 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65   elseif {[info e
5aa0: 78 69 73 74 73 20 3a 3a 76 65 6e 64 6f 72 5f 64  xists ::vendor_d
5ab0: 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a  irectory] && \..
5ac0: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
5ad0: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 76 65 6e 64  g length $::vend
5ae0: 6f 72 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20  or_directory] > 
5af0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
5b00: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
5b10: 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69  NOTE: The locati
5b20: 6f 6e 20 6f 66 20 74 68 65 20 76 65 6e 64 6f 72  on of the vendor
5b30: 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
5b40: 65 65 6e 20 73 65 74 3b 0d 0a 20 20 20 20 20 20  een set;..      
5b50: 20 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66    #       theref
5b60: 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20  ore, use it...  
5b70: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
5b80: 20 72 65 74 75 72 6e 20 24 3a 3a 76 65 6e 64 6f   return $::vendo
5b90: 72 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  r_directory..   
5ba0: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e     } elseif {[in
5bb0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f  fo exists ::tcl_
5bc0: 6c 69 62 72 61 72 79 5d 20 26 26 20 5c 0d 0a 20  library] && \.. 
5bd0: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
5be0: 20 6c 65 6e 67 74 68 20 24 3a 3a 74 63 6c 5f 6c   length $::tcl_l
5bf0: 69 62 72 61 72 79 5d 20 3e 20 30 20 26 26 20 5c  ibrary] > 0 && \
5c00: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c  ..          [fil
5c10: 65 20 69 73 64 69 72 65 63 74 6f 72 79 20 24 3a  e isdirectory $:
5c20: 3a 74 63 6c 5f 6c 69 62 72 61 72 79 5d 7d 20 74  :tcl_library]} t
5c30: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
5c40: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
5c50: 3a 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 77  : The variable w
5c60: 69 74 68 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e  ith the location
5c70: 20 6f 66 20 74 68 65 20 73 63 72 69 70 74 20 6c   of the script l
5c80: 69 62 72 61 72 79 20 69 73 0d 0a 20 20 20 20 20  ibrary is..     
5c90: 20 20 20 23 20 20 20 20 20 20 20 73 65 74 20 61     #       set a
5ca0: 6e 64 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  nd appears to be
5cb0: 20 61 20 72 65 61 6c 20 64 69 72 65 63 74 6f 72   a real director
5cc0: 79 20 28 69 2e 65 2e 20 6e 6f 74 20 65 6d 62 65  y (i.e. not embe
5cd0: 64 64 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20  dded..        # 
5ce0: 20 20 20 20 20 20 77 69 74 68 69 6e 20 61 20 66        within a f
5cf0: 69 6c 65 29 3b 20 74 68 65 72 65 66 6f 72 65 2c  ile); therefore,
5d00: 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20   use it...      
5d10: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
5d20: 75 72 6e 20 24 3a 3a 74 63 6c 5f 6c 69 62 72 61  urn $::tcl_libra
5d30: 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ry..      } else
5d40: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
5d50: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46         # NOTE: F
5d60: 61 6c 6c 62 61 63 6b 20 74 6f 20 74 68 65 20 64  allback to the d
5d70: 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e  irectory contain
5d80: 69 6e 67 20 74 68 65 20 65 78 65 63 75 74 61 62  ing the executab
5d90: 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  le...        #..
5da0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
5db0: 69 6e 66 6f 20 62 69 6e 61 72 79 5d 0d 0a 20 20  info binary]..  
5dc0: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
5dd0: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 44 61 74  .    proc getDat
5de0: 61 62 61 73 65 44 69 72 65 63 74 6f 72 79 20 7b  abaseDirectory {
5df0: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
5e00: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73      # NOTE: This
5e10: 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72   procedure retur
5e20: 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ns the directory
5e30: 20 77 68 65 72 65 20 74 68 65 20 74 65 73 74 20   where the test 
5e40: 64 61 74 61 62 61 73 65 73 0d 0a 20 20 20 20 20  databases..     
5e50: 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20   #       should 
5e60: 62 65 20 6c 6f 63 61 74 65 64 2e 20 20 42 79 20  be located.  By 
5e70: 64 65 66 61 75 6c 74 2c 20 74 68 69 73 20 6a 75  default, this ju
5e80: 73 74 20 75 73 65 73 20 74 68 65 20 74 65 6d 70  st uses the temp
5e90: 6f 72 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20  orary..      #  
5ea0: 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 63       directory c
5eb0: 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 74 68  onfigured for th
5ec0: 69 73 20 73 79 73 74 65 6d 2e 0d 0a 20 20 20 20  is system...    
5ed0: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
5ee0: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 64 61  info exists ::da
5ef0: 74 61 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79  tabase_directory
5f00: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
5f10: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
5f20: 20 24 3a 3a 64 61 74 61 62 61 73 65 5f 64 69 72   $::database_dir
5f30: 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65  ectory] > 0} the
5f40: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
5f50: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
5f60: 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  The location of 
5f70: 74 68 65 20 64 61 74 61 62 61 73 65 20 64 69 72  the database dir
5f80: 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
5f90: 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20  overridden;..   
5fa0: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
5fb0: 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d  refore, use it..
5fc0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
5fd0: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 64 61      return $::da
5fe0: 74 61 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79  tabase_directory
5ff0: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66  ..      } elseif
6000: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
6010: 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63 74 6f  :scratch_directo
6020: 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  ry] && \..      
6030: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
6040: 74 68 20 24 3a 3a 73 63 72 61 74 63 68 5f 64 69  th $::scratch_di
6050: 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68  rectory] > 0} th
6060: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
6070: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
6080: 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   The location of
6090: 20 74 68 65 20 73 63 72 61 74 63 68 20 64 69 72   the scratch dir
60a0: 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
60b0: 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20  overridden;..   
60c0: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
60d0: 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d  refore, use it..
60e0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
60f0: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 73 63      return $::sc
6100: 72 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79 0d  ratch_directory.
6110: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
6120: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
6130: 5b 67 65 74 54 65 6d 70 6f 72 61 72 79 50 61 74  [getTemporaryPat
6140: 68 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  h]..      }..   
6150: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
6160: 67 65 74 54 65 6d 70 6f 72 61 72 79 44 69 72 65  getTemporaryDire
6170: 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20  ctory {} {..    
6180: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
6190: 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72  E: This procedur
61a0: 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 64 69  e returns the di
61b0: 72 65 63 74 6f 72 79 20 77 68 65 72 65 20 74 68  rectory where th
61c0: 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
61d0: 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
61e0: 20 73 68 6f 75 6c 64 20 62 65 20 6c 6f 63 61 74   should be locat
61f0: 65 64 2e 20 20 42 79 20 64 65 66 61 75 6c 74 2c  ed.  By default,
6200: 20 74 68 69 73 20 6a 75 73 74 20 75 73 65 73 20   this just uses 
6210: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0d 0a 20  the temporary.. 
6220: 20 20 20 20 20 23 20 20 20 20 20 20 20 64 69 72       #       dir
6230: 65 63 74 6f 72 79 20 63 6f 6e 66 69 67 75 72 65  ectory configure
6240: 64 20 66 6f 72 20 74 68 69 73 20 73 79 73 74 65  d for this syste
6250: 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  m...      #..   
6260: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
6270: 73 74 73 20 3a 3a 74 65 6d 70 6f 72 61 72 79 5f  sts ::temporary_
6280: 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d  directory] && \.
6290: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
62a0: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 6d  ng length $::tem
62b0: 70 6f 72 61 72 79 5f 64 69 72 65 63 74 6f 72 79  porary_directory
62c0: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
62d0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
62e0: 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f    # NOTE: The lo
62f0: 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 65  cation of the te
6300: 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72  mporary director
6310: 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  y has been overr
6320: 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20  idden;..        
6330: 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72  #       therefor
6340: 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20  e, use it...    
6350: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
6360: 65 74 75 72 6e 20 24 3a 3a 74 65 6d 70 6f 72 61  eturn $::tempora
6370: 72 79 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20  ry_directory..  
6380: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69      } elseif {[i
6390: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 73 63 72  nfo exists ::scr
63a0: 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79 5d 20  atch_directory] 
63b0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
63c0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
63d0: 3a 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63 74  ::scratch_direct
63e0: 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ory] > 0} then {
63f0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
6400: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
6410: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
6420: 20 73 63 72 61 74 63 68 20 64 69 72 65 63 74 6f   scratch directo
6430: 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  ry has been over
6440: 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20  ridden;..       
6450: 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f   #       therefo
6460: 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20  re, use it...   
6470: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
6480: 72 65 74 75 72 6e 20 24 3a 3a 73 63 72 61 74 63  return $::scratc
6490: 68 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  h_directory..   
64a0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
64b0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 67 65 74       return [get
64c0: 54 65 6d 70 6f 72 61 72 79 50 61 74 68 5d 0d 0a  TemporaryPath]..
64d0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
64e0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 54  ...    proc getT
64f0: 65 73 74 4f 76 65 72 72 69 64 65 73 50 72 65 61  estOverridesPrea
6500: 6d 62 6c 65 20 7b 20 7b 65 78 74 72 61 56 61 72  mble { {extraVar
6510: 4e 61 6d 65 73 20 22 22 7d 20 7d 20 7b 0d 0a 20  Names ""} } {.. 
6520: 20 20 20 20 20 73 65 74 20 76 61 72 4e 61 6d 65       set varName
6530: 73 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20  s [list]....    
6540: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
6550: 45 3a 20 49 66 20 61 76 61 69 6c 61 62 6c 65 2c  E: If available,
6560: 20 73 74 61 72 74 20 77 69 74 68 20 74 68 65 20   start with the 
6570: 6d 61 73 74 65 72 20 6c 69 73 74 20 6f 66 20 74  master list of t
6580: 65 73 74 20 6f 76 65 72 72 69 64 65 0d 0a 20 20  est override..  
6590: 20 20 20 20 23 20 20 20 20 20 20 20 76 61 72 69      #       vari
65a0: 61 62 6c 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d  ables...      #.
65b0: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
65c0: 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 6f   exists ::test_o
65d0: 76 65 72 72 69 64 65 73 5d 20 26 26 20 5c 0d 0a  verrides] && \..
65e0: 20 20 20 20 20 20 20 20 20 20 5b 6c 6c 65 6e 67            [lleng
65f0: 74 68 20 24 3a 3a 74 65 73 74 5f 6f 76 65 72 72  th $::test_overr
6600: 69 64 65 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ides] > 0} then 
6610: 7b 0d 0a 20 20 20 20 20 20 20 20 65 76 61 6c 20  {..        eval 
6620: 6c 61 70 70 65 6e 64 20 76 61 72 4e 61 6d 65 73  lappend varNames
6630: 20 24 3a 3a 74 65 73 74 5f 6f 76 65 72 72 69 64   $::test_overrid
6640: 65 73 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  es..      }.... 
6650: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
6660: 4e 4f 54 45 3a 20 49 66 20 72 65 71 75 65 73 74  NOTE: If request
6670: 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72  ed by our caller
6680: 2c 20 61 64 64 20 61 6e 79 20 61 64 64 69 74 69  , add any additi
6690: 6f 6e 61 6c 20 76 61 72 69 61 62 6c 65 0d 0a 20  onal variable.. 
66a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d       #       nam
66b0: 65 73 20 74 6f 20 63 6f 70 79 20 6e 6f 77 2e 0d  es to copy now..
66c0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
66d0: 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 65 78  if {[llength $ex
66e0: 74 72 61 56 61 72 4e 61 6d 65 73 5d 20 3e 20 30  traVarNames] > 0
66f0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
6700: 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 76    eval lappend v
6710: 61 72 4e 61 6d 65 73 20 24 65 78 74 72 61 56 61  arNames $extraVa
6720: 72 4e 61 6d 65 73 0d 0a 20 20 20 20 20 20 7d 0d  rNames..      }.
6730: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
6740: 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20    # NOTE: Build 
6750: 74 68 65 20 73 63 72 69 70 74 20 66 72 61 67 6d  the script fragm
6760: 65 6e 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e  ent to be return
6770: 65 64 20 62 79 20 70 72 6f 63 65 73 73 69 6e 67  ed by processing
6780: 20 65 61 63 68 0d 0a 20 20 20 20 20 20 23 20 20   each..      #  
6790: 20 20 20 20 20 76 61 72 69 61 62 6c 65 20 6e 61       variable na
67a0: 6d 65 20 61 6e 64 20 61 64 64 69 6e 67 20 74 68  me and adding th
67b0: 65 20 6e 65 63 65 63 65 73 73 61 72 79 20 73 63  e nececessary sc
67c0: 72 69 70 74 20 66 72 61 67 6d 65 6e 74 73 20 66  ript fragments f
67d0: 6f 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  or..      #     
67e0: 20 20 65 61 63 68 20 6f 6e 65 2e 0d 0a 20 20 20    each one...   
67f0: 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
6800: 72 65 73 75 6c 74 20 22 22 0d 0a 0d 0a 20 20 20  result ""....   
6810: 20 20 20 66 6f 72 65 61 63 68 20 76 61 72 4e 61     foreach varNa
6820: 6d 65 20 24 76 61 72 4e 61 6d 65 73 20 7b 0d 0a  me $varNames {..
6830: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
6840: 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64     # NOTE: Build
6850: 20 74 68 65 20 71 75 61 6c 69 66 69 65 64 20 67   the qualified g
6860: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 6e  lobal variable n
6870: 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ame...        #.
6880: 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 75 6c  .        set ful
6890: 6c 56 61 72 4e 61 6d 65 20 5b 61 70 70 65 6e 64  lVarName [append
68a0: 41 72 67 73 20 3a 3a 20 24 76 61 72 4e 61 6d 65  Args :: $varName
68b0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
68c0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
68d0: 44 6f 65 73 20 74 68 65 20 76 61 72 69 61 62 6c  Does the variabl
68e0: 65 20 65 78 69 73 74 20 69 6e 20 74 68 69 73 20  e exist in this 
68f0: 69 6e 74 65 72 70 72 65 74 65 72 20 63 6f 6e 74  interpreter cont
6900: 65 78 74 3f 0d 0a 20 20 20 20 20 20 20 20 23 0d  ext?..        #.
6910: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  .        if {[in
6920: 66 6f 20 65 78 69 73 74 73 20 24 66 75 6c 6c 56  fo exists $fullV
6930: 61 72 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  arName]} then {.
6940: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
6950: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
6960: 41 70 70 65 6e 64 20 61 20 73 63 72 69 70 74 20  Append a script 
6970: 66 72 61 67 6d 65 6e 74 20 74 6f 20 74 68 65 20  fragment to the 
6980: 72 65 73 75 6c 74 20 74 68 61 74 20 77 69 6c 6c  result that will
6990: 20 63 6f 72 72 65 63 74 6c 79 0d 0a 20 20 20 20   correctly..    
69a0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
69b0: 70 79 20 61 6e 79 20 63 6f 6e 74 61 69 6e 65 64  py any contained
69c0: 20 76 61 6c 75 65 20 74 6f 20 61 6e 6f 74 68 65   value to anothe
69d0: 72 20 69 6e 74 65 72 70 72 65 74 65 72 20 63 6f  r interpreter co
69e0: 6e 74 65 78 74 2e 0d 0a 20 20 20 20 20 20 20 20  ntext...        
69f0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 61    #..          a
6a00: 70 70 65 6e 64 20 72 65 73 75 6c 74 20 5c 6e 20  ppend result \n 
6a10: 22 73 65 74 20 22 20 24 66 75 6c 6c 56 61 72 4e  "set " $fullVarN
6a20: 61 6d 65 20 22 20 5c 7b 22 20 5b 73 65 74 20 24  ame " \{" [set $
6a30: 66 75 6c 6c 56 61 72 4e 61 6d 65 5d 20 5c 7d 0d  fullVarName] \}.
6a40: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
6a50: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
6a60: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
6a70: 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6e 74   the result cont
6a80: 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
6a90: 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74   script fragment
6aa0: 73 2c 20 61 70 70 65 6e 64 20 61 0d 0a 20 20 20  s, append a..   
6ab0: 20 20 20 23 20 20 20 20 20 20 20 6e 65 77 6c 69     #       newli
6ac0: 6e 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ne...      #..  
6ad0: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
6ae0: 6c 65 6e 67 74 68 20 24 72 65 73 75 6c 74 5d 20  length $result] 
6af0: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
6b00: 20 20 20 20 20 61 70 70 65 6e 64 20 72 65 73 75       append resu
6b10: 6c 74 20 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a  lt \n..      }..
6b20: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24  ..      return $
6b30: 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c  result..    }...
6b40: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 41 70  ..    proc getAp
6b50: 70 44 6f 6d 61 69 6e 50 72 65 61 6d 62 6c 65 20  pDomainPreamble 
6b60: 7b 20 7b 70 72 65 66 69 78 20 22 22 7d 20 7b 73  { {prefix ""} {s
6b70: 75 66 66 69 78 20 22 22 7d 20 7d 20 7b 0d 0a 20  uffix ""} } {.. 
6b80: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
6b90: 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65  NOTE: This proce
6ba0: 64 75 72 65 20 72 65 74 75 72 6e 73 20 61 20 74  dure returns a t
6bb0: 65 73 74 20 73 65 74 75 70 20 73 63 72 69 70 74  est setup script
6bc0: 20 66 72 61 67 6d 65 6e 74 20 73 75 69 74 61 62   fragment suitab
6bd0: 6c 65 20 66 6f 72 0d 0a 20 20 20 20 20 20 23 20  le for..      # 
6be0: 20 20 20 20 20 20 65 76 61 6c 75 61 74 69 6f 6e        evaluation
6bf0: 20 62 79 20 61 6e 20 69 6e 74 65 72 70 72 65 74   by an interpret
6c00: 65 72 20 63 72 65 61 74 65 64 20 69 6e 20 61 6e  er created in an
6c10: 20 69 73 6f 6c 61 74 65 64 20 61 70 70 6c 69 63   isolated applic
6c20: 61 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20  ation..      #  
6c30: 20 20 20 20 20 64 6f 6d 61 69 6e 2e 20 20 54 68       domain.  Th
6c40: 65 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e  e script fragmen
6c50: 74 20 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64  t being returned
6c60: 20 77 69 6c 6c 20 62 65 20 73 75 72 72 6f 75 6e   will be surroun
6c70: 64 65 64 20 62 79 0d 0a 20 20 20 20 20 20 23 20  ded by..      # 
6c80: 20 20 20 20 20 20 74 68 65 20 70 72 65 66 69 78        the prefix
6c90: 20 61 6e 64 20 73 75 66 66 69 78 20 22 73 63 72   and suffix "scr
6ca0: 69 70 74 20 66 72 61 67 6d 65 6e 74 73 22 20 73  ipt fragments" s
6cb0: 70 65 63 69 66 69 65 64 20 62 79 20 6f 75 72 20  pecified by our 
6cc0: 63 61 6c 6c 65 72 2c 0d 0a 20 20 20 20 20 20 23  caller,..      #
6cd0: 20 20 20 20 20 20 20 69 66 20 61 6e 79 2e 20 20         if any.  
6ce0: 54 68 65 20 65 6e 74 69 72 65 20 73 63 72 69 70  The entire scrip
6cf0: 74 20 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64  t being returned
6d00: 20 77 69 6c 6c 20 62 65 20 73 75 62 73 74 69 74   will be substit
6d10: 75 74 65 64 20 76 69 61 0d 0a 20 20 20 20 20 20  uted via..      
6d20: 23 20 20 20 20 20 20 20 5b 73 75 62 73 74 5d 2c  #       [subst],
6d30: 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20   in the context 
6d40: 6f 66 20 6f 75 72 20 63 61 6c 6c 65 72 2c 20 62  of our caller, b
6d50: 65 66 6f 72 65 20 62 65 69 6e 67 20 72 65 74 75  efore being retu
6d60: 72 6e 65 64 2e 0d 0a 20 20 20 20 20 20 23 20 20  rned...      #  
6d70: 20 20 20 20 20 54 68 69 73 20 73 74 65 70 20 69       This step i
6d80: 73 20 6e 65 63 65 73 73 61 72 79 20 73 6f 20 74  s necessary so t
6d90: 68 61 74 20 73 6f 6d 65 20 6c 69 6d 69 74 65 64  hat some limited
6da0: 20 63 6f 6e 74 65 78 74 20 69 6e 66 6f 72 6d 61   context informa
6db0: 74 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 23 20 20  tion,..      #  
6dc0: 20 20 20 20 20 70 72 69 6d 61 72 69 6c 79 20 72       primarily r
6dd0: 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20 74 65  elated to the te
6de0: 73 74 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65  sting directorie
6df0: 73 2c 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66  s, can be transf
6e00: 65 72 72 65 64 0d 0a 20 20 20 20 20 20 23 20 20  erred..      #  
6e10: 20 20 20 20 20 74 6f 20 74 68 65 20 69 6e 74 65       to the inte
6e20: 72 70 72 65 74 65 72 20 69 6e 20 74 68 65 20 69  rpreter in the i
6e30: 73 6f 6c 61 74 65 64 20 61 70 70 6c 69 63 61 74  solated applicat
6e40: 69 6f 6e 20 64 6f 6d 61 69 6e 2c 20 6d 61 6b 69  ion domain, maki
6e50: 6e 67 20 69 74 0d 0a 20 20 20 20 20 20 23 20 20  ng it..      #  
6e60: 20 20 20 20 20 61 62 6c 65 20 74 6f 20 73 75 63       able to suc
6e70: 63 65 73 73 66 75 6c 6c 79 20 72 75 6e 20 74 65  cessfully run te
6e80: 73 74 73 20 74 68 61 74 20 72 65 71 75 69 72 65  sts that require
6e90: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   one or more of 
6ea0: 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
6eb0: 20 20 20 66 69 6c 65 73 20 69 6e 20 6f 6e 65 20     files in one 
6ec0: 6f 66 20 74 68 65 20 74 65 73 74 69 6e 67 20 64  of the testing d
6ed0: 69 72 65 63 74 6f 72 69 65 73 2e 20 20 43 61 6c  irectories.  Cal
6ee0: 6c 65 72 73 20 73 68 6f 75 6c 64 20 6b 65 65 70  lers should keep
6ef0: 20 69 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20   in..      #    
6f00: 20 20 20 6d 69 6e 64 20 74 68 61 74 20 74 68 65     mind that the
6f10: 20 74 65 73 74 20 73 63 72 69 70 74 20 66 72 61   test script fra
6f20: 67 6d 65 6e 74 20 62 65 69 6e 67 20 72 65 74 75  gment being retu
6f30: 72 6e 65 64 20 63 61 6e 6e 6f 74 20 72 65 6c 79  rned cannot rely
6f40: 20 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20   on..      #    
6f50: 20 20 20 61 6e 79 20 73 63 72 69 70 74 20 6c 69     any script li
6f60: 62 72 61 72 79 20 70 72 6f 63 65 64 75 72 65 73  brary procedures
6f70: 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 70 72   that are not pr
6f80: 6f 76 69 64 65 64 20 62 79 20 74 68 65 20 45 61  ovided by the Ea
6f90: 67 6c 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  gle..      #    
6fa0: 20 20 20 6c 69 62 72 61 72 79 20 70 61 63 6b 61     library packa
6fb0: 67 65 20 28 69 2e 65 2e 20 22 69 6e 69 74 2e 65  ge (i.e. "init.e
6fc0: 61 67 6c 65 22 29 2c 20 69 6e 63 6c 75 64 69 6e  agle"), includin
6fd0: 67 20 74 68 6f 73 65 20 70 72 6f 76 69 64 65 64  g those provided
6fe0: 20 62 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20   by..      #    
6ff0: 20 20 20 74 68 65 20 45 61 67 6c 65 20 74 65 73     the Eagle tes
7000: 74 20 70 61 63 6b 61 67 65 2c 20 75 6e 6c 65 73  t package, unles
7010: 73 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61  s the file conta
7020: 69 6e 69 6e 67 20 74 68 65 6d 20 69 73 20 6c 6f  ining them is lo
7030: 61 64 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20  aded..      #   
7040: 20 20 20 20 6d 61 6e 75 61 6c 6c 79 20 76 69 61      manually via
7050: 20 73 6f 6d 65 20 6f 74 68 65 72 20 6d 65 63 68   some other mech
7060: 61 6e 69 73 6d 20 28 65 2e 67 2e 20 62 79 20 69  anism (e.g. by i
7070: 6e 63 6c 75 64 69 6e 67 20 61 70 70 72 6f 70 72  ncluding appropr
7080: 69 61 74 65 0d 0a 20 20 20 20 20 20 23 20 20 20  iate..      #   
7090: 20 20 20 20 5b 70 61 63 6b 61 67 65 20 72 65 71      [package req
70a0: 75 69 72 65 5d 20 6f 72 20 5b 73 6f 75 72 63 65  uire] or [source
70b0: 5d 20 63 6f 6d 6d 61 6e 64 73 20 69 6e 20 74 68  ] commands in th
70c0: 65 20 70 72 65 66 69 78 20 6f 72 20 73 75 66 66  e prefix or suff
70d0: 69 78 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ix..      #     
70e0: 20 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e    script fragmen
70f0: 74 73 29 2e 20 20 41 6c 73 6f 2c 20 61 6c 6c 20  ts).  Also, all 
7100: 76 61 72 69 61 62 6c 65 20 72 65 66 65 72 65 6e  variable referen
7110: 63 65 73 20 61 6e 64 20 61 6c 6c 20 6e 65 73 74  ces and all nest
7120: 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ed..      #     
7130: 20 20 63 6f 6d 6d 61 6e 64 73 20 28 69 2e 65 2e    commands (i.e.
7140: 20 74 68 6f 73 65 20 69 6e 20 73 71 75 61 72 65   those in square
7150: 20 62 72 61 63 6b 65 74 73 29 20 63 6f 6e 74 61   brackets) conta
7160: 69 6e 65 64 20 69 6e 20 74 68 65 20 66 69 6e 61  ined in the fina
7170: 6c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  l..      #      
7180: 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74   script fragment
7190: 20 77 69 6c 6c 20 65 6e 64 20 75 70 20 62 65 69   will end up bei
71a0: 6e 67 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20  ng evaluated in 
71b0: 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 74  the context of t
71c0: 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
71d0: 20 20 63 61 6c 6c 69 6e 67 20 69 6e 74 65 72 70    calling interp
71e0: 72 65 74 65 72 20 61 6e 64 20 6e 6f 74 20 74 68  reter and not th
71f0: 65 20 74 61 72 67 65 74 20 69 6e 74 65 72 70 72  e target interpr
7200: 65 74 65 72 20 63 72 65 61 74 65 64 20 69 6e 20  eter created in 
7210: 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
7220: 20 20 20 69 73 6f 6c 61 74 65 64 20 61 70 70 6c     isolated appl
7230: 69 63 61 74 69 6f 6e 20 64 6f 6d 61 69 6e 20 75  ication domain u
7240: 6e 6c 65 73 73 20 74 68 65 20 64 6f 6c 6c 61 72  nless the dollar
7250: 20 73 69 67 6e 73 20 61 6e 64 2f 6f 72 20 73 71   signs and/or sq
7260: 75 61 72 65 0d 0a 20 20 20 20 20 20 23 20 20 20  uare..      #   
7270: 20 20 20 20 62 72 61 63 6b 65 74 73 20 61 72 65      brackets are
7280: 20 73 70 65 63 69 61 6c 6c 79 20 71 75 6f 74 65   specially quote
7290: 64 20 77 69 74 68 20 62 61 63 6b 73 6c 61 73 68  d with backslash
72a0: 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  es...      #..  
72b0: 20 20 20 20 72 65 74 75 72 6e 20 5b 75 70 6c 65      return [uple
72c0: 76 65 6c 20 31 20 5b 6c 69 73 74 20 73 75 62 73  vel 1 [list subs
72d0: 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 70  t [appendArgs $p
72e0: 72 65 66 69 78 20 7b 0d 0a 20 20 20 20 20 20 20  refix {..       
72f0: 20 69 66 20 7b 5b 68 61 73 52 75 6e 74 69 6d 65   if {[hasRuntime
7300: 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65 5d 7d 20  Option native]} 
7310: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
7320: 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
7330: 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74 41  Interpreter.GetA
7340: 63 74 69 76 65 20 41 64 64 52 75 6e 74 69 6d 65  ctive AddRuntime
7350: 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65 0d 0a 20  Option native.. 
7360: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
7370: 7d 20 5b 67 65 74 54 65 73 74 4f 76 65 72 72 69  } [getTestOverri
7380: 64 65 73 50 72 65 61 6d 62 6c 65 20 5b 6c 69 73  desPreamble [lis
7390: 74 20 70 61 74 68 20 74 65 73 74 5f 63 68 61 6e  t path test_chan
73a0: 6e 65 6c 5d 5d 20 24 73 75 66 66 69 78 5d 5d 5d  nel]] $suffix]]]
73b0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
73c0: 70 72 6f 63 20 74 72 79 43 6f 70 79 42 69 6e 61  proc tryCopyBina
73d0: 72 79 46 69 6c 65 20 7b 20 66 69 6c 65 4e 61 6d  ryFile { fileNam
73e0: 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20  e {platform ""} 
73f0: 7b 6e 65 77 46 69 6c 65 4e 61 6d 65 20 22 22 7d  {newFileName ""}
7400: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20   } {..      set 
7410: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5b  sourceFileName [
7420: 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
7430: 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61  e $fileName $pla
7440: 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20  tform]....      
7450: 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74  if {![file exist
7460: 73 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  s $sourceFileNam
7470: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
7480: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
7490: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
74a0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
74b0: 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70       "---- skipp
74c0: 65 64 20 63 6f 70 79 69 6e 67 20 62 69 6e 61 72  ed copying binar
74d0: 79 20 66 69 6c 65 20 5c 22 22 20 24 73 6f 75 72  y file \"" $sour
74e0: 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20  ceFileName \..  
74f0: 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69            "\", i
7500: 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
7510: 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  \n"]....        
7520: 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d  return..      }.
7530: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  ...      if {[st
7540: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e 65 77  ring length $new
7550: 46 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74  FileName] > 0} t
7560: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  hen {..        s
7570: 65 74 20 74 61 72 67 65 74 46 69 6c 65 4e 61 6d  et targetFileNam
7580: 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e  e [getBuildFileN
7590: 61 6d 65 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65  ame $newFileName
75a0: 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20   $platform]..   
75b0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
75c0: 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74 46       set targetF
75d0: 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c  ileName [getBuil
75e0: 64 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e  dFileName $fileN
75f0: 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a  ame $platform]..
7600: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
7610: 20 73 65 74 20 74 61 72 67 65 74 44 69 72 65 63   set targetDirec
7620: 74 6f 72 79 20 5b 66 69 6c 65 20 64 69 72 6e 61  tory [file dirna
7630: 6d 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61  me $targetFileNa
7640: 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  me]....      if 
7650: 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
7660: 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 66           if {![f
7670: 69 6c 65 20 65 78 69 73 74 73 20 24 74 61 72 67  ile exists $targ
7680: 65 74 44 69 72 65 63 74 6f 72 79 5d 7d 20 74 68  etDirectory]} th
7690: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
76a0: 20 20 20 20 20 20 66 69 6c 65 20 6d 6b 64 69 72        file mkdir
76b0: 20 24 74 61 72 67 65 74 44 69 72 65 63 74 6f 72   $targetDirector
76c0: 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y..             
76d0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
76e0: 20 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72    file copy -for
76f0: 63 65 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61  ce $sourceFileNa
7700: 6d 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61  me $targetFileNa
7710: 6d 65 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  me}] == 0} then 
7720: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
7730: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
7740: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
7750: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
7760: 2d 20 63 6f 70 69 65 64 20 62 69 6e 61 72 79 20  - copied binary 
7770: 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73  file from \"" $s
7780: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 22 5c  ourceFileName "\
7790: 22 20 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20  " to \"" \..    
77a0: 20 20 20 20 20 20 20 20 24 74 61 72 67 65 74 46          $targetF
77b0: 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20  ileName \"\n].. 
77c0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
77d0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
77e0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
77f0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
7800: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61          "---- fa
7810: 69 6c 65 64 20 74 6f 20 63 6f 70 79 20 62 69 6e  iled to copy bin
7820: 61 72 79 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22  ary file from \"
7830: 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  " $sourceFileNam
7840: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
7850: 20 22 5c 22 20 74 6f 20 5c 22 22 20 24 74 61 72   "\" to \"" $tar
7860: 67 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e  getFileName \"\n
7870: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
7880: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74  }.....    proc t
7890: 72 79 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20  ryCopyBuildFile 
78a0: 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74  { fileName {plat
78b0: 66 6f 72 6d 20 22 22 7d 20 7b 6e 65 77 46 69 6c  form ""} {newFil
78c0: 65 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20  eName ""} } {.. 
78d0: 20 20 20 20 20 73 65 74 20 73 6f 75 72 63 65 46       set sourceF
78e0: 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c  ileName [getBuil
78f0: 64 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e  dFileName $fileN
7900: 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a  ame $platform]..
7910: 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69  ..      if {![fi
7920: 6c 65 20 65 78 69 73 74 73 20 24 73 6f 75 72 63  le exists $sourc
7930: 65 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  eFileName]} then
7940: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
7950: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
7960: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
7970: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
7980: 2d 2d 20 73 6b 69 70 70 65 64 20 63 6f 70 79 69  -- skipped copyi
7990: 6e 67 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22  ng build file \"
79a0: 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  " $sourceFileNam
79b0: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
79c0: 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f   "\", it does no
79d0: 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 0d 0a 20  t exist\n"].... 
79e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20         return.. 
79f0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
7a00: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
7a10: 74 68 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65 5d  th $newFileName]
7a20: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
7a30: 20 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74        set target
7a40: 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e  FileName [getBin
7a50: 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 6e 65 77  aryFileName $new
7a60: 46 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f  FileName $platfo
7a70: 72 6d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  rm]..      } els
7a80: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  e {..        set
7a90: 20 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20   targetFileName 
7aa0: 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61  [getBinaryFileNa
7ab0: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c  me $fileName $pl
7ac0: 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 7d  atform]..      }
7ad0: 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 74 61  ....      set ta
7ae0: 72 67 65 74 44 69 72 65 63 74 6f 72 79 20 5b 66  rgetDirectory [f
7af0: 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 74 61 72  ile dirname $tar
7b00: 67 65 74 46 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a  getFileName]....
7b10: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
7b20: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
7b30: 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69    if {![file exi
7b40: 73 74 73 20 24 74 61 72 67 65 74 44 69 72 65 63  sts $targetDirec
7b50: 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  tory]} then {.. 
7b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
7b70: 69 6c 65 20 6d 6b 64 69 72 20 24 74 61 72 67 65  ile mkdir $targe
7b80: 74 44 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20  tDirectory..    
7b90: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
7ba0: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20             file 
7bb0: 63 6f 70 79 20 2d 66 6f 72 63 65 20 24 73 6f 75  copy -force $sou
7bc0: 72 63 65 46 69 6c 65 4e 61 6d 65 20 24 74 61 72  rceFileName $tar
7bd0: 67 65 74 46 69 6c 65 4e 61 6d 65 7d 5d 20 3d 3d  getFileName}] ==
7be0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
7bf0: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
7c00: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
7c10: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
7c20: 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 69 65       "---- copie
7c30: 64 20 62 75 69 6c 64 20 66 69 6c 65 20 66 72 6f  d build file fro
7c40: 6d 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c  m \"" $sourceFil
7c50: 65 4e 61 6d 65 20 22 5c 22 20 74 6f 20 5c 22 22  eName "\" to \""
7c60: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
7c70: 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20  $targetFileName 
7c80: 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65  \"\n]..      } e
7c90: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
7ca0: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
7cb0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
7cc0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
7cd0: 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20  "---- failed to 
7ce0: 63 6f 70 79 20 62 75 69 6c 64 20 66 69 6c 65 20  copy build file 
7cf0: 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63 65  from \"" $source
7d00: 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20  FileName \..    
7d10: 20 20 20 20 20 20 20 20 22 5c 22 20 74 6f 20 5c          "\" to \
7d20: 22 22 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61  "" $targetFileNa
7d30: 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  me \"\n]..      
7d40: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
7d50: 20 70 72 6f 63 20 74 72 79 44 65 6c 65 74 65 42   proc tryDeleteB
7d60: 69 6e 61 72 79 46 69 6c 65 20 7b 20 66 69 6c 65  inaryFile { file
7d70: 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22  Name {platform "
7d80: 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  "} } {..      se
7d90: 74 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42  t fileName [getB
7da0: 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66  inaryFileName $f
7db0: 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72  ileName $platfor
7dc0: 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  m]....      if {
7dd0: 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66  ![file exists $f
7de0: 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
7df0: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
7e00: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
7e10: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
7e20: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
7e30: 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e   skipped deletin
7e40: 67 20 62 69 6e 61 72 79 20 66 69 6c 65 20 5c 22  g binary file \"
7e50: 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  " $fileName \.. 
7e60: 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20             "\", 
7e70: 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  it does not exis
7e80: 74 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  t\n"]....       
7e90: 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d   return..      }
7ea0: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63  ....      if {[c
7eb0: 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74  atch {file delet
7ec0: 65 20 24 66 69 6c 65 4e 61 6d 65 7d 5d 20 3d 3d  e $fileName}] ==
7ed0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
7ee0: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
7ef0: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
7f00: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
7f10: 20 20 20 20 20 22 2d 2d 2d 2d 20 64 65 6c 65 74       "---- delet
7f20: 65 64 20 62 69 6e 61 72 79 20 66 69 6c 65 20 5c  ed binary file \
7f30: 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c  "" $fileName \"\
7f40: 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  n]..      } else
7f50: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
7f60: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
7f70: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
7f80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
7f90: 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c  -- failed to del
7fa0: 65 74 65 20 62 69 6e 61 72 79 20 66 69 6c 65 20  ete binary file 
7fb0: 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22  \"" $fileName \"
7fc0: 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  \n]..      }..  
7fd0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
7fe0: 20 74 72 79 44 65 6c 65 74 65 42 75 69 6c 64 46   tryDeleteBuildF
7ff0: 69 6c 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b  ile { fileName {
8000: 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7d 20 7b  platform ""} } {
8010: 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65  ..      set file
8020: 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c 64 46 69  Name [getBuildFi
8030: 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  leName $fileName
8040: 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20   $platform].... 
8050: 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20       if {![file 
8060: 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65  exists $fileName
8070: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
8080: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
8090: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
80a0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
80b0: 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65      "---- skippe
80c0: 64 20 64 65 6c 65 74 69 6e 67 20 62 75 69 6c 64  d deleting build
80d0: 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e   file \"" $fileN
80e0: 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
80f0: 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20     "\", it does 
8100: 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 0d  not exist\n"]...
8110: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d  .        return.
8120: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
8130: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 66 69    if {[catch {fi
8140: 6c 65 20 64 65 6c 65 74 65 20 24 66 69 6c 65 4e  le delete $fileN
8150: 61 6d 65 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ame}] == 0} then
8160: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
8170: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
8180: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
8190: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
81a0: 2d 2d 20 64 65 6c 65 74 65 64 20 62 75 69 6c 64  -- deleted build
81b0: 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e   file \"" $fileN
81c0: 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  ame \"\n]..     
81d0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
81e0: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
81f0: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
8200: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
8210: 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64      "---- failed
8220: 20 74 6f 20 64 65 6c 65 74 65 20 62 75 69 6c 64   to delete build
8230: 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e   file \"" $fileN
8240: 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  ame \"\n]..     
8250: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
8260: 20 20 70 72 6f 63 20 74 72 79 43 6f 70 79 41 73    proc tryCopyAs
8270: 73 65 6d 62 6c 79 20 7b 20 66 69 6c 65 4e 61 6d  sembly { fileNam
8280: 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20  e {platform ""} 
8290: 7b 70 64 62 20 74 72 75 65 7d 20 7d 20 7b 0d 0a  {pdb true} } {..
82a0: 20 20 20 20 20 20 74 72 79 43 6f 70 79 42 75 69        tryCopyBui
82b0: 6c 64 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65  ldFile $fileName
82c0: 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 0d 0a 20 20   $platform....  
82d0: 20 20 20 20 69 66 20 7b 24 70 64 62 7d 20 74 68      if {$pdb} th
82e0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 72  en {..        tr
82f0: 79 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20 5b  yCopyBuildFile [
8300: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
8310: 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
8320: 72 6f 6f 74 6e 61 6d 65 20 24 66 69 6c 65 4e 61  rootname $fileNa
8330: 6d 65 5d 20 2e 70 64 62 5d 20 24 70 6c 61 74 66  me] .pdb] $platf
8340: 6f 72 6d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  orm..      }..  
8350: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
8360: 20 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62   tryDeleteAssemb
8370: 6c 79 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 70  ly { fileName {p
8380: 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 70 64 62  latform ""} {pdb
8390: 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20   true} } {..    
83a0: 20 20 74 72 79 44 65 6c 65 74 65 42 69 6e 61 72    tryDeleteBinar
83b0: 79 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 20  yFile $fileName 
83c0: 24 70 6c 61 74 66 6f 72 6d 0d 0a 0d 0a 20 20 20  $platform....   
83d0: 20 20 20 69 66 20 7b 24 70 64 62 7d 20 74 68 65     if {$pdb} the
83e0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 72 79  n {..        try
83f0: 44 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65  DeleteBinaryFile
8400: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
8410: 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
8420: 65 20 72 6f 6f 74 6e 61 6d 65 20 24 66 69 6c 65  e rootname $file
8430: 4e 61 6d 65 5d 20 2e 70 64 62 5d 20 24 70 6c 61  Name] .pdb] $pla
8440: 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 7d 0d 0a  tform..      }..
8450: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
8460: 6f 63 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62  oc tryLoadAssemb
8470: 6c 79 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 70  ly { fileName {p
8480: 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7d 20 7b 0d  latform ""} } {.
8490: 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e  .      set fileN
84a0: 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69  ame [getBinaryFi
84b0: 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  leName $fileName
84c0: 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20   $platform].... 
84d0: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
84e0: 7b 73 65 74 20 61 73 73 65 6d 62 6c 79 20 5c 0d  {set assembly \.
84f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
8500: 6f 62 6a 65 63 74 20 6c 6f 61 64 20 2d 6c 6f 61  object load -loa
8510: 64 74 79 70 65 20 46 69 6c 65 20 2d 61 6c 69 61  dtype File -alia
8520: 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 5d 20 3d  s $fileName]}] =
8530: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
8540: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
8550: 23 20 4e 4f 54 45 3a 20 4e 6f 77 2c 20 61 64 64  # NOTE: Now, add
8560: 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 74   the necessary t
8570: 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0d  est constraint..
8580: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
8590: 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
85a0: 74 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65  t [file rootname
85b0: 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c   [file tail $fil
85c0: 65 4e 61 6d 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20  eName]]....     
85d0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
85e0: 4e 4f 54 45 3a 20 47 72 61 62 20 74 68 65 20 69  NOTE: Grab the i
85f0: 6d 61 67 65 20 72 75 6e 74 69 6d 65 20 76 65 72  mage runtime ver
8600: 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 61 73  sion from the as
8610: 73 65 6d 62 6c 79 20 62 65 63 61 75 73 65 0d 0a  sembly because..
8620: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
8630: 73 65 76 65 72 61 6c 20 74 65 73 74 73 20 72 65  several tests re
8640: 6c 79 20 6f 6e 20 69 74 20 68 61 76 69 6e 67 20  ly on it having 
8650: 61 20 63 65 72 74 61 69 6e 20 76 61 6c 75 65 2e  a certain value.
8660: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
8670: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
8680: 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b  nt [appendArgs [
8690: 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e  file tail $fileN
86a0: 61 6d 65 5d 20 5f 20 5c 0d 0a 20 20 20 20 20 20  ame] _ \..      
86b0: 20 20 20 20 20 20 5b 24 61 73 73 65 6d 62 6c 79        [$assembly
86c0: 20 49 6d 61 67 65 52 75 6e 74 69 6d 65 56 65 72   ImageRuntimeVer
86d0: 73 69 6f 6e 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  sion]]....      
86e0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
86f0: 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65 20  OTE: Return the 
8700: 66 75 6c 6c 20 70 61 74 68 20 6f 66 20 74 68 65  full path of the
8710: 20 6c 6f 61 64 65 64 20 66 69 6c 65 2e 0d 0a 20   loaded file... 
8720: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
8730: 20 20 72 65 74 75 72 6e 20 24 66 69 6c 65 4e 61    return $fileNa
8740: 6d 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  me..      }.... 
8750: 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a       return ""..
8760: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
8770: 6f 63 20 69 73 53 51 4c 69 74 65 52 65 61 64 79  oc isSQLiteReady
8780: 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
8790: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
87a0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 6d 75 73  is procedure mus
87b0: 74 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  t return non-zer
87c0: 6f 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 53 51  o only if the SQ
87d0: 4c 69 74 65 20 6e 61 74 69 76 65 0d 0a 20 20 20  Lite native..   
87e0: 20 20 20 23 20 20 20 20 20 20 20 6c 69 62 72 61     #       libra
87f0: 72 79 20 61 6e 64 20 74 68 65 20 53 79 73 74 65  ry and the Syste
8800: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 6d 61  m.Data.SQLite ma
8810: 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 20 61  naged assembly a
8820: 72 65 20 6c 6f 61 64 65 64 0d 0a 20 20 20 20 20  re loaded..     
8830: 20 23 20 20 20 20 20 20 20 61 6e 64 20 72 65 61   #       and rea
8840: 64 79 20 66 6f 72 20 75 73 65 20 62 79 20 74 68  dy for use by th
8850: 65 20 74 65 73 74 20 73 75 69 74 65 2e 20 20 43  e test suite.  C
8860: 75 72 72 65 6e 74 6c 79 2c 20 74 68 69 73 20 70  urrently, this p
8870: 72 6f 63 65 64 75 72 65 0d 0a 20 20 20 20 20 20  rocedure..      
8880: 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62  #       should b
8890: 65 20 63 61 6c 6c 65 64 20 6f 6e 6c 79 20 61 66  e called only af
88a0: 74 65 72 20 74 68 65 20 5b 74 72 79 4c 6f 61 64  ter the [tryLoad
88b0: 41 73 73 65 6d 62 6c 79 5d 20 70 72 6f 63 65 64  Assembly] proced
88c0: 75 72 65 20 68 61 73 0d 0a 20 20 20 20 20 20 23  ure has..      #
88d0: 20 20 20 20 20 20 20 62 65 65 6e 20 63 61 6c 6c         been call
88e0: 65 64 20 74 6f 20 70 72 6f 62 65 20 66 6f 72 20  ed to probe for 
88f0: 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  the System.Data.
8900: 53 51 4c 69 74 65 20 6d 61 6e 61 67 65 64 20 61  SQLite managed a
8910: 73 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 23  ssembly..      #
8920: 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 5b         and the [
8930: 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 5d 20  checkForSQLite] 
8940: 70 72 6f 63 65 64 75 72 65 20 68 61 73 20 62 65  procedure has be
8950: 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f  en called to pro
8960: 62 65 20 66 6f 72 0d 0a 20 20 20 20 20 20 23 20  be for..      # 
8970: 20 20 20 20 20 20 74 68 65 20 53 51 4c 69 74 65        the SQLite
8980: 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79 3b   native library;
8990: 20 6f 74 68 65 72 77 69 73 65 2c 20 74 68 69 73   otherwise, this
89a0: 20 70 72 6f 63 65 64 75 72 65 20 77 69 6c 6c 20   procedure will 
89b0: 73 69 6d 70 6c 79 0d 0a 20 20 20 20 20 20 23 20  simply..      # 
89c0: 20 20 20 20 20 20 61 6c 77 61 79 73 20 72 65 74        always ret
89d0: 75 72 6e 20 7a 65 72 6f 2e 0d 0a 20 20 20 20 20  urn zero...     
89e0: 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   #..      return
89f0: 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20 20 20   [expr {..      
8a00: 20 20 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e    [haveConstrain
8a10: 74 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  t System.Data.SQ
8a20: 4c 69 74 65 5d 20 26 26 20 5b 68 61 76 65 43 6f  Lite] && [haveCo
8a30: 6e 73 74 72 61 69 6e 74 20 53 51 4c 69 74 65 5d  nstraint SQLite]
8a40: 0d 0a 20 20 20 20 20 20 7d 5d 0d 0a 20 20 20 20  ..      }]..    
8a50: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 6d  }.....    proc m
8a60: 61 74 63 68 4d 61 63 68 69 6e 65 20 7b 20 70 6c  atchMachine { pl
8a70: 61 74 66 6f 72 6d 20 7d 20 7b 0d 0a 20 20 20 20  atform } {..    
8a80: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
8a90: 45 3a 20 41 6e 20 65 6d 70 74 79 20 73 74 72 69  E: An empty stri
8aa0: 6e 67 20 66 6f 72 20 74 68 65 20 70 6c 61 74 66  ng for the platf
8ab0: 6f 72 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 74  orm means that t
8ac0: 68 65 20 62 75 69 6c 64 20 69 73 20 6e 6f 74 0d  he build is not.
8ad0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 5b  .      #       [
8ae0: 70 72 69 6d 61 72 69 6c 79 5d 20 61 20 6e 61 74  primarily] a nat
8af0: 69 76 65 20 62 75 69 6c 64 3b 20 74 68 65 72 65  ive build; there
8b00: 66 6f 72 65 2c 20 69 74 20 61 6c 77 61 79 73 20  fore, it always 
8b10: 6d 61 74 63 68 65 73 2e 0d 0a 20 20 20 20 20 20  matches...      
8b20: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  #..      if {[st
8b30: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61  ring length $pla
8b40: 74 66 6f 72 6d 5d 20 3d 3d 20 30 7d 20 74 68 65  tform] == 0} the
8b50: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  n {..        ret
8b60: 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
8b70: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
8b80: 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73      # NOTE: Does
8b90: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
8ba0: 6c 61 74 66 6f 72 6d 20 6d 61 74 63 68 20 75 70  latform match up
8bb0: 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
8bc0: 70 72 6f 63 65 73 73 3f 0d 0a 20 20 20 20 20 20  process?..      
8bd0: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 70 6c  #..      if {$pl
8be0: 61 74 66 6f 72 6d 20 65 71 20 5b 6d 61 63 68 69  atform eq [machi
8bf0: 6e 65 54 6f 50 6c 61 74 66 6f 72 6d 20 24 3a 3a  neToPlatform $::
8c00: 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61 63  tcl_platform(mac
8c10: 68 69 6e 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  hine)]} then {..
8c20: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
8c30: 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  rue..      }....
8c40: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
8c50: 20 4e 4f 54 45 3a 20 54 68 65 20 73 70 65 63 69   NOTE: The speci
8c60: 66 69 65 64 20 70 6c 61 74 66 6f 72 6d 20 64 6f  fied platform do
8c70: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 75 70 20  es not match up 
8c80: 77 69 74 68 20 74 68 65 20 70 6c 61 74 66 6f 72  with the platfor
8c90: 6d 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  m..      #      
8ca0: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
8cb0: 20 70 72 6f 63 65 73 73 2e 0d 0a 20 20 20 20 20   process...     
8cc0: 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   #..      return
8cd0: 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c   false..    }...
8ce0: 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b  ..    proc check
8cf0: 46 6f 72 53 51 4c 69 74 65 42 75 69 6c 64 73 20  ForSQLiteBuilds 
8d00: 7b 20 63 68 61 6e 6e 65 6c 20 7b 73 65 6c 65 63  { channel {selec
8d10: 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20  t false} } {..  
8d20: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
8d30: 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f 72 20 65  OTE: Check for e
8d40: 76 65 72 79 20 70 6f 73 73 69 62 6c 65 20 76 61  very possible va
8d50: 6c 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  lid combination 
8d60: 6f 66 20 76 61 6c 75 65 73 20 75 73 65 64 20 77  of values used w
8d70: 68 65 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  hen..      #    
8d80: 20 20 20 6c 6f 63 61 74 69 6e 67 20 6f 75 74 20     locating out 
8d90: 74 68 65 20 62 75 69 6c 64 20 6f 75 74 70 75 74  the build output
8da0: 20 64 69 72 65 63 74 6f 72 79 2c 20 73 68 6f 77   directory, show
8db0: 69 6e 67 20 65 61 63 68 20 61 76 61 69 6c 61 62  ing each availab
8dc0: 6c 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  le..      #     
8dd0: 20 20 62 75 69 6c 64 20 76 61 72 69 61 74 69 6f    build variatio
8de0: 6e 20 61 6c 6f 6e 67 20 74 68 65 20 77 61 79 2e  n along the way.
8df0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
8e00: 20 66 6f 72 65 61 63 68 20 6e 61 74 69 76 65 20   foreach native 
8e10: 5b 6c 69 73 74 20 66 61 6c 73 65 20 74 72 75 65  [list false true
8e20: 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 66 6f 72  ] {..        for
8e30: 65 61 63 68 20 79 65 61 72 20 5b 67 65 74 42 75  each year [getBu
8e40: 69 6c 64 59 65 61 72 73 5d 20 7b 0d 0a 20 20 20  ildYears] {..   
8e50: 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 63         foreach c
8e60: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 5b 67 65  onfiguration [ge
8e70: 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74  tBuildConfigurat
8e80: 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20  ions] {..       
8e90: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
8ea0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75      # NOTE: Figu
8eb0: 72 65 20 6f 75 74 20 74 68 65 20 65 66 66 65 63  re out the effec
8ec0: 74 69 76 65 20 62 75 69 6c 64 20 70 6c 61 74 66  tive build platf
8ed0: 6f 72 6d 2e 20 20 54 68 69 73 20 69 73 0d 0a 20  orm.  This is.. 
8ee0: 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
8ef0: 20 20 20 62 61 73 65 64 20 6f 6e 20 77 68 65 74     based on whet
8f00: 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 5b 70 72  her or not a [pr
8f10: 69 6d 61 72 69 6c 79 5d 20 6e 61 74 69 76 65 20  imarily] native 
8f20: 62 75 69 6c 64 0d 0a 20 20 20 20 20 20 20 20 20  build..         
8f30: 20 20 20 23 20 20 20 20 20 20 20 69 73 20 62 65     #       is be
8f40: 69 6e 67 20 75 73 65 64 2e 20 20 46 6f 72 20 5b  ing used.  For [
8f50: 70 72 69 6d 61 72 69 6c 79 5d 20 6e 6f 6e 2d 6e  primarily] non-n
8f60: 61 74 69 76 65 20 62 75 69 6c 64 73 2c 0d 0a 20  ative builds,.. 
8f70: 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
8f80: 20 20 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20     this will be 
8f90: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e  an empty string.
8fa0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
8fb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
8fc0: 20 70 6c 61 74 66 6f 72 6d 20 5b 67 65 74 42 75   platform [getBu
8fd0: 69 6c 64 50 6c 61 74 66 6f 72 6d 20 24 6e 61 74  ildPlatform $nat
8fe0: 69 76 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ive]....        
8ff0: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
9000: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
9010: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
9020: 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67    "---- checking
9030: 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61   for System.Data
9040: 2e 53 51 4c 69 74 65 20 62 75 69 6c 64 20 5c 22  .SQLite build \"
9050: 22 20 5b 65 78 70 72 20 5c 0d 0a 20 20 20 20 20  " [expr \..     
9060: 20 20 20 20 20 20 20 20 20 20 20 7b 24 6e 61 74             {$nat
9070: 69 76 65 20 3f 20 22 6e 61 74 69 76 65 2f 22 20  ive ? "native/" 
9080: 3a 20 22 22 7d 5d 20 5b 65 78 70 72 20 7b 5b 73  : ""}] [expr {[s
9090: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 5c 0d 0a  tring length \..
90a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90b0: 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 20 3f  $platform] > 0 ?
90c0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 70 6c   [appendArgs $pl
90d0: 61 74 66 6f 72 6d 20 2f 5d 20 3a 20 22 22 7d 5d  atform /] : ""}]
90e0: 20 24 79 65 61 72 20 5c 0d 0a 20 20 20 20 20 20   $year \..      
90f0: 20 20 20 20 20 20 20 20 20 20 2f 20 24 63 6f 6e            / $con
9100: 66 69 67 75 72 61 74 69 6f 6e 20 22 5c 22 2e 2e  figuration "\"..
9110: 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  . "]....        
9120: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
9130: 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64     # NOTE: Build
9140: 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69   the fully quali
9150: 66 69 65 64 20 64 69 72 65 63 74 6f 72 79 20 77  fied directory w
9160: 68 65 72 65 20 74 68 65 20 6e 65 63 65 73 73 61  here the necessa
9170: 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ry..            
9180: 23 20 20 20 20 20 20 20 63 6f 6d 70 6f 6e 65 6e  #       componen
9190: 74 73 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61  ts for System.Da
91a0: 74 61 2e 53 51 4c 69 74 65 20 73 68 6f 75 6c 64  ta.SQLite should
91b0: 20 62 65 20 66 6f 75 6e 64 2e 0d 0a 20 20 20 20   be found...    
91c0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
91d0: 20 20 20 20 20 20 20 73 65 74 20 64 69 72 65 63         set direc
91e0: 74 6f 72 79 20 5b 6a 6f 69 6e 42 75 69 6c 64 44  tory [joinBuildD
91f0: 69 72 65 63 74 6f 72 79 20 24 6e 61 74 69 76 65  irectory $native
9200: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
9210: 20 20 20 20 5b 67 65 74 42 75 69 6c 64 42 61 73      [getBuildBas
9220: 65 44 69 72 65 63 74 6f 72 79 5d 20 24 79 65 61  eDirectory] $yea
9230: 72 20 24 70 6c 61 74 66 6f 72 6d 20 24 63 6f 6e  r $platform $con
9240: 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 0d 0a 20  figuration].... 
9250: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
9260: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
9270: 3a 20 44 6f 20 74 68 65 20 6e 65 63 65 73 73 61  : Do the necessa
9280: 72 79 20 66 69 6c 65 73 20 65 78 69 73 74 3f 20  ry files exist? 
9290: 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 6f   Currently, no o
92a0: 74 68 65 72 20 73 74 65 70 73 0d 0a 20 20 20 20  ther steps..    
92b0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
92c0: 61 72 65 20 74 61 6b 65 6e 20 74 6f 20 76 65 72  are taken to ver
92d0: 69 66 79 20 74 68 69 73 20 62 75 69 6c 64 20 69  ify this build i
92e0: 73 20 61 63 74 75 61 6c 6c 79 20 76 69 61 62 6c  s actually viabl
92f0: 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e...            
9300: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  #..            i
9310: 66 20 7b 5b 69 73 42 75 69 6c 64 41 76 61 69 6c  f {[isBuildAvail
9320: 61 62 6c 65 20 24 6e 61 74 69 76 65 20 24 64 69  able $native $di
9330: 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b  rectory]} then {
9340: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
9350: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
9360: 20 23 20 4e 4f 54 45 3a 20 57 68 65 6e 20 69 6e   # NOTE: When in
9370: 20 22 73 65 6c 65 63 74 22 20 6d 6f 64 65 2c 20   "select" mode, 
9380: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65  automatically se
9390: 6c 65 63 74 20 74 68 65 20 66 69 72 73 74 0d 0a  lect the first..
93a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
93b0: 20 20 20 20 20 20 61 76 61 69 6c 61 62 6c 65 20        available 
93c0: 62 75 69 6c 64 20 6f 66 20 53 79 73 74 65 6d 2e  build of System.
93d0: 44 61 74 61 2e 53 51 4c 69 74 65 20 61 6e 64 20  Data.SQLite and 
93e0: 74 68 65 6e 20 72 65 74 75 72 6e 0d 0a 20 20 20  then return..   
93f0: 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
9400: 20 20 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0d     immediately..
9410: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
9420: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
9430: 69 66 20 7b 24 73 65 6c 65 63 74 20 26 26 20 5b  if {$select && [
9440: 6d 61 74 63 68 4d 61 63 68 69 6e 65 20 24 70 6c  matchMachine $pl
9450: 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d  atform]} then {.
9460: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9470: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
9480: 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 6e 75      # NOTE: Manu
9490: 61 6c 6c 79 20 6f 76 65 72 72 69 64 65 20 61 6c  ally override al
94a0: 6c 20 74 68 65 20 62 75 69 6c 64 20 64 69 72 65  l the build dire
94b0: 63 74 6f 72 79 20 73 65 6c 65 63 74 69 6f 6e 0d  ctory selection.
94c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
94d0: 20 23 20 20 20 20 20 20 20 72 65 6c 61 74 65 64   #       related
94e0: 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 69   test settings i
94f0: 6e 20 6f 72 64 65 72 20 74 6f 20 66 6f 72 63 65  n order to force
9500: 20 74 68 69 73 20 62 75 69 6c 64 0d 0a 20 20 20   this build..   
9510: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
9520: 20 20 20 20 20 6f 66 20 53 79 73 74 65 6d 2e 44       of System.D
9530: 61 74 61 2e 53 51 4c 69 74 65 20 74 6f 20 62 65  ata.SQLite to be
9540: 20 75 73 65 64 2e 0d 0a 20 20 20 20 20 20 20 20   used...        
9550: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
9560: 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63             objec
9570: 74 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72  t invoke Interpr
9580: 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 20 5b  eter.GetActive [
9590: 65 78 70 72 20 7b 24 6e 61 74 69 76 65 20 3f 20  expr {$native ? 
95a0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
95b0: 20 20 20 20 20 20 20 22 41 64 64 52 75 6e 74 69         "AddRunti
95c0: 6d 65 4f 70 74 69 6f 6e 22 20 3a 20 22 52 65 6d  meOption" : "Rem
95d0: 6f 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  oveRuntimeOption
95e0: 22 7d 5d 20 20 6e 61 74 69 76 65 0d 0a 0d 0a 20  "}]  native.... 
95f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
9600: 65 74 20 3a 3a 74 65 73 74 5f 79 65 61 72 20 24  et ::test_year $
9610: 79 65 61 72 0d 0a 20 20 20 20 20 20 20 20 20 20  year..          
9620: 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74        set ::test
9630: 5f 70 6c 61 74 66 6f 72 6d 20 24 70 6c 61 74 66  _platform $platf
9640: 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  orm..           
9650: 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74 5f       set ::test_
9660: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 24 63  configuration $c
9670: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0d 0a 0d 0a  onfiguration....
9680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9690: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
96a0: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
96b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96c0: 20 20 22 79 65 73 2c 20 73 65 6c 65 63 74 65 64    "yes, selected
96d0: 20 28 22 20 5b 65 78 70 72 20 7b 24 6e 61 74 69   (" [expr {$nati
96e0: 76 65 20 3f 20 22 6e 61 74 69 76 65 2f 22 20 3a  ve ? "native/" :
96f0: 20 22 22 7d 5d 20 5c 0d 0a 20 20 20 20 20 20 20   ""}] \..       
9700: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 65 78               [ex
9710: 70 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  pr {[string leng
9720: 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20  th $platform] > 
9730: 30 20 3f 20 5b 61 70 70 65 6e 64 41 72 67 73 20  0 ? [appendArgs 
9740: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
9750: 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72 6d         $platform
9760: 20 2f 5d 20 3a 20 22 22 7d 5d 20 24 79 65 61 72   /] : ""}] $year
9770: 20 2f 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f   / $configuratio
9780: 6e 20 22 29 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20  n ")\n"]....    
9790: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
97a0: 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20  rn true..       
97b0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
97c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
97d0: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
97e0: 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20  yes\n..         
97f0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
9800: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
9810: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
9820: 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d  s $channel no\n.
9830: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
9840: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
9850: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
9860: 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
9870: 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  false..    }....
9880: 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46  .    proc checkF
9890: 6f 72 53 51 4c 69 74 65 52 65 6c 65 61 73 65 73  orSQLiteReleases
98a0: 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 73 65 6c 65   { channel {sele
98b0: 63 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  ct false} } {.. 
98c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
98d0: 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f 72 20  NOTE: Check for 
98e0: 70 61 73 74 20 72 65 6c 65 61 73 65 73 20 6f 66  past releases of
98f0: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
9900: 69 74 65 20 69 6e 20 74 68 65 20 64 69 72 65 63  ite in the direc
9910: 74 6f 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20  tory..      #   
9920: 20 20 20 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e      contained in
9930: 20 74 68 65 20 22 53 79 73 74 65 6d 2e 44 61 74   the "System.Dat
9940: 61 2e 53 51 4c 69 74 65 22 20 65 6e 76 69 72 6f  a.SQLite" enviro
9950: 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 2c 20  nment variable, 
9960: 69 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  if..      #     
9970: 20 20 70 72 65 73 65 6e 74 2e 0d 0a 20 20 20 20    present...    
9980: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
9990: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65 6e  info exists ::en
99a0: 76 28 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  v(System.Data.SQ
99b0: 4c 69 74 65 29 5d 20 26 26 20 5c 0d 0a 20 20 20  Lite)] && \..   
99c0: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
99d0: 65 6e 67 74 68 20 24 3a 3a 65 6e 76 28 53 79 73  ength $::env(Sys
99e0: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 29  tem.Data.SQLite)
99f0: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
9a00: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
9a10: 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20    # NOTE: Build 
9a20: 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  the fully qualif
9a30: 69 65 64 20 64 69 72 65 63 74 6f 72 79 20 77 68  ied directory wh
9a40: 65 72 65 20 74 68 65 20 6e 65 63 65 73 73 61 72  ere the necessar
9a50: 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
9a60: 20 20 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 66 6f     components fo
9a70: 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  r System.Data.SQ
9a80: 4c 69 74 65 20 73 68 6f 75 6c 64 20 62 65 20 66  Lite should be f
9a90: 6f 75 6e 64 2e 0d 0a 20 20 20 20 20 20 20 20 23  ound...        #
9aa0: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 64 69  ..        set di
9ab0: 72 65 63 74 6f 72 79 20 5b 66 69 6c 65 20 6e 61  rectory [file na
9ac0: 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a  tivename [file j
9ad0: 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  oin \..         
9ae0: 20 20 20 24 3a 3a 65 6e 76 28 53 79 73 74 65 6d     $::env(System
9af0: 2e 44 61 74 61 2e 53 51 4c 69 74 65 29 20 5b 67  .Data.SQLite) [g
9b00: 65 74 52 65 6c 65 61 73 65 56 65 72 73 69 6f 6e  etReleaseVersion
9b10: 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74  ]]]....        t
9b20: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
9b30: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
9b40: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
9b50: 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74  hecking for Syst
9b60: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 72  em.Data.SQLite r
9b70: 65 6c 65 61 73 65 20 5c 22 22 20 5c 0d 0a 20 20  elease \"" \..  
9b80: 20 20 20 20 20 20 20 20 20 20 24 64 69 72 65 63            $direc
9b90: 74 6f 72 79 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a  tory "\"... "]..
9ba0: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69  ..        if {[i
9bb0: 73 52 65 6c 65 61 73 65 41 76 61 69 6c 61 62 6c  sReleaseAvailabl
9bc0: 65 20 24 64 69 72 65 63 74 6f 72 79 20 70 6c 61  e $directory pla
9bd0: 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  tform]} then {..
9be0: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73            if {[s
9bf0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c  tring length $pl
9c00: 61 74 66 6f 72 6d 5d 20 3d 3d 20 30 7d 20 74 68  atform] == 0} th
9c10: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
9c20: 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 75    set platform u
9c30: 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20  nknown..        
9c40: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
9c50: 20 69 66 20 7b 24 73 65 6c 65 63 74 20 26 26 20   if {$select && 
9c60: 5b 6d 61 74 63 68 4d 61 63 68 69 6e 65 20 24 70  [matchMachine $p
9c70: 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b  latform]} then {
9c80: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ..            se
9c90: 74 20 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63 74  t ::build_direct
9ca0: 6f 72 79 20 24 64 69 72 65 63 74 6f 72 79 0d 0a  ory $directory..
9cb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
9cc0: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
9cd0: 70 65 6e 64 41 72 67 73 20 22 79 65 73 2c 20 73  pendArgs "yes, s
9ce0: 65 6c 65 63 74 65 64 20 28 22 20 24 70 6c 61 74  elected (" $plat
9cf0: 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a 0d 0a 20  form ")\n"].... 
9d00: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
9d10: 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20  n true..        
9d20: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
9d30: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
9d40: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
9d50: 67 73 20 22 79 65 73 20 28 22 20 24 70 6c 61 74  gs "yes (" $plat
9d60: 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a 20 20 20  form ")\n"]..   
9d70: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
9d80: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
9d90: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
9da0: 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 0d 0a 20 20 20  nnel no\n....   
9db0: 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 70         foreach p
9dc0: 61 74 68 20 5b 6c 73 6f 72 74 20 2d 64 65 63 72  ath [lsort -decr
9dd0: 65 61 73 69 6e 67 20 5b 66 69 6c 65 20 6c 69 73  easing [file lis
9de0: 74 20 24 64 69 72 65 63 74 6f 72 79 20 2a 5d 5d  t $directory *]]
9df0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
9e00: 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73  if {[file exists
9e10: 20 24 70 61 74 68 5d 20 26 26 20 5b 66 69 6c 65   $path] && [file
9e20: 20 69 73 64 69 72 65 63 74 6f 72 79 20 24 70 61   isdirectory $pa
9e30: 74 68 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  th]} then {..   
9e40: 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
9e50: 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
9e60: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
9e70: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
9e80: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79   checking for Sy
9e90: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
9ea0: 20 72 65 6c 65 61 73 65 20 5c 22 22 20 5c 0d 0a   release \"" \..
9eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ec0: 20 20 24 70 61 74 68 20 22 5c 22 2e 2e 2e 20 22    $path "\"... "
9ed0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
9ee0: 20 20 20 69 66 20 7b 5b 69 73 52 65 6c 65 61 73     if {[isReleas
9ef0: 65 41 76 61 69 6c 61 62 6c 65 20 24 70 61 74 68  eAvailable $path
9f00: 20 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e   platform]} then
9f10: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
9f20: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
9f30: 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d  length $platform
9f40: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
9f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f60: 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 75    set platform u
9f70: 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20  nknown..        
9f80: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
9f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
9fa0: 7b 24 73 65 6c 65 63 74 20 26 26 20 5b 6d 61 74  {$select && [mat
9fb0: 63 68 4d 61 63 68 69 6e 65 20 24 70 6c 61 74 66  chMachine $platf
9fc0: 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  orm]} then {..  
9fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fe0: 73 65 74 20 3a 3a 62 75 69 6c 64 5f 64 69 72 65  set ::build_dire
9ff0: 63 74 6f 72 79 20 24 70 61 74 68 0d 0a 0d 0a 20  ctory $path.... 
a000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a010: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
a020: 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73  [appendArgs "yes
a030: 2c 20 73 65 6c 65 63 74 65 64 20 28 22 20 24 70  , selected (" $p
a040: 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a  latform ")\n"]..
a050: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a060: 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d      return true.
a070: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a080: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
a090: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
a0a0: 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
a0b0: 65 6e 64 41 72 67 73 20 22 79 65 73 20 28 22 20  endArgs "yes (" 
a0c0: 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d  $platform ")\n"]
a0d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a0e0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
a0f0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
a100: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
a110: 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e  ts $channel no\n
a120: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a130: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
a140: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
a150: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
a160: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
a170: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
a180: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
a190: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
a1a0: 2d 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61  - environment va
a1b0: 72 69 61 62 6c 65 20 5c 22 53 79 73 74 65 6d 2e  riable \"System.
a1c0: 44 61 74 61 2e 53 51 4c 69 74 65 5c 22 20 69 73  Data.SQLite\" is
a1d0: 20 6e 6f 74 20 22 20 5c 0d 0a 20 20 20 20 20 20   not " \..      
a1e0: 20 20 20 20 20 20 22 73 65 74 2c 20 73 6b 69 70        "set, skip
a1f0: 70 69 6e 67 20 63 68 65 63 6b 20 66 6f 72 20 72  ping check for r
a200: 65 6c 65 61 73 65 73 2e 2e 2e 5c 6e 22 5d 0d 0a  eleases...\n"]..
a210: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
a220: 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20   return false.. 
a230: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
a240: 63 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65  c checkForSQLite
a250: 4c 69 62 72 61 72 79 20 7b 20 63 68 61 6e 6e 65  Library { channe
a260: 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75  l } {..      tpu
a270: 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  ts $channel "---
a280: 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53  - checking for S
a290: 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61  QLite core libra
a2a0: 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  ry... "....     
a2b0: 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
a2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a               obj
a2d0: 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
a2e0: 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 53 79 73  s +NonPublic Sys
a2f0: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
a300: 53 51 4c 69 74 65 33 20 5c 0d 0a 20 20 20 20 20  SQLite3 \..     
a310: 20 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 56           SQLiteV
a320: 65 72 73 69 6f 6e 7d 20 76 65 72 73 69 6f 6e 5d  ersion} version]
a330: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
a340: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
a350: 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
a360: 69 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  if the returned 
a370: 76 65 72 73 69 6f 6e 20 77 61 73 20 6e 75 6c 6c  version was null
a380: 2e 20 20 49 66 20 73 6f 2c 20 6d 61 6b 65 20 69  .  If so, make i
a390: 74 20 65 61 73 79 0d 0a 20 20 20 20 20 20 20 20  t easy..        
a3a0: 23 20 20 20 20 20 20 20 74 6f 20 73 70 6f 74 2e  #       to spot.
a3b0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
a3c0: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
a3d0: 20 6c 65 6e 67 74 68 20 24 76 65 72 73 69 6f 6e   length $version
a3e0: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
a3f0: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 76 65            set ve
a400: 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20 20 20 20  rsion null..    
a410: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
a420: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
a430: 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 71  TE: Attempt to q
a440: 75 65 72 79 20 74 68 65 20 46 6f 73 73 69 6c 20  uery the Fossil 
a450: 73 6f 75 72 63 65 20 69 64 65 6e 74 69 66 69 65  source identifie
a460: 72 20 66 6f 72 20 74 68 65 20 53 51 4c 69 74 65  r for the SQLite
a470: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
a480: 20 20 63 6f 72 65 20 6c 69 62 72 61 72 79 2e 0d    core library..
a490: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
a4a0: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
a4b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a4c0: 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
a4d0: 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
a4e0: 63 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  c System.Data.SQ
a4f0: 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 5c 0d 0a  Lite.SQLite3 \..
a500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a510: 53 51 4c 69 74 65 53 6f 75 72 63 65 49 64 7d 20  SQLiteSourceId} 
a520: 73 6f 75 72 63 65 49 64 5d 7d 20 74 68 65 6e 20  sourceId]} then 
a530: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
a540: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
a550: 3a 20 57 65 20 66 61 69 6c 65 64 20 74 6f 20 71  : We failed to q
a560: 75 65 72 79 20 74 68 65 20 46 6f 73 73 69 6c 20  uery the Fossil 
a570: 73 6f 75 72 63 65 20 69 64 65 6e 74 69 66 69 65  source identifie
a580: 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  r...          #.
a590: 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73  .          set s
a5a0: 6f 75 72 63 65 49 64 20 75 6e 6b 6e 6f 77 6e 0d  ourceId unknown.
a5b0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
a5c0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
a5d0: 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
a5e0: 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 46  f the returned F
a5f0: 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65  ossil source ide
a600: 6e 74 69 66 69 65 72 20 77 61 73 20 6e 75 6c 6c  ntifier was null
a610: 2e 20 20 49 66 0d 0a 20 20 20 20 20 20 20 20 23  .  If..        #
a620: 20 20 20 20 20 20 20 73 6f 2c 20 6d 61 6b 65 20         so, make 
a630: 69 74 20 65 61 73 79 20 74 6f 20 73 70 6f 74 2e  it easy to spot.
a640: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
a650: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
a660: 20 6c 65 6e 67 74 68 20 24 73 6f 75 72 63 65 49   length $sourceI
a670: 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  d] == 0} then {.
a680: 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73  .          set s
a690: 6f 75 72 63 65 49 64 20 6e 75 6c 6c 0d 0a 20 20  ourceId null..  
a6a0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
a6b0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
a6c0: 4e 4f 54 45 3a 20 59 65 73 2c 20 74 68 65 20 53  NOTE: Yes, the S
a6d0: 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61  QLite core libra
a6e0: 72 79 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  ry appears to be
a6f0: 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20   available...   
a700: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
a710: 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 53 51  addConstraint SQ
a720: 4c 69 74 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20  Lite....        
a730: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
a740: 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73 20  appendArgs "yes 
a750: 28 22 20 24 76 65 72 73 69 6f 6e 20 22 20 22 20  (" $version " " 
a760: 24 73 6f 75 72 63 65 49 64 20 22 29 5c 6e 22 5d  $sourceId ")\n"]
a770: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
a780: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
a790: 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20  $channel no\n.. 
a7a0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
a7b0: 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b  ..    proc check
a7c0: 46 6f 72 53 51 4c 69 74 65 49 6e 74 65 72 6f 70  ForSQLiteInterop
a7d0: 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a   { channel } {..
a7e0: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
a7f0: 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b  nnel "---- check
a800: 69 6e 67 20 66 6f 72 20 53 51 4c 69 74 65 20 69  ing for SQLite i
a810: 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 2e  nterop assembly.
a820: 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66  .. "....      if
a830: 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
a840: 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
a850: 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
a860: 4e 6f 6e 50 75 62 6c 69 63 20 53 79 73 74 65 6d  NonPublic System
a870: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
a880: 69 74 65 33 20 5c 0d 0a 20 20 20 20 20 20 20 20  ite3 \..        
a890: 20 20 20 20 20 20 49 6e 74 65 72 6f 70 56 65 72        InteropVer
a8a0: 73 69 6f 6e 7d 20 76 65 72 73 69 6f 6e 5d 20 3d  sion} version] =
a8b0: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
a8c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
a8d0: 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66  # NOTE: Check if
a8e0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 65   the returned ve
a8f0: 72 73 69 6f 6e 20 77 61 73 20 6e 75 6c 6c 2e 20  rsion was null. 
a900: 20 49 66 20 73 6f 2c 20 6d 61 6b 65 20 69 74 20   If so, make it 
a910: 65 61 73 79 0d 0a 20 20 20 20 20 20 20 20 23 20  easy..        # 
a920: 20 20 20 20 20 20 74 6f 20 73 70 6f 74 2e 0d 0a        to spot...
a930: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
a940: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
a950: 65 6e 67 74 68 20 24 76 65 72 73 69 6f 6e 5d 20  ength $version] 
a960: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
a970: 20 20 20 20 20 20 20 20 73 65 74 20 76 65 72 73          set vers
a980: 69 6f 6e 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20  ion null..      
a990: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
a9a0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
a9b0: 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 71 75 65  : Attempt to que
a9c0: 72 79 20 74 68 65 20 46 6f 73 73 69 6c 20 73 6f  ry the Fossil so
a9d0: 75 72 63 65 20 69 64 65 6e 74 69 66 69 65 72 20  urce identifier 
a9e0: 66 6f 72 20 74 68 65 20 53 51 4c 69 74 65 0d 0a  for the SQLite..
a9f0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
aa00: 63 6f 72 65 20 6c 69 62 72 61 72 79 2e 0d 0a 20  core library... 
aa10: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
aa20: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
aa30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa40: 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
aa50: 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
aa60: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
aa70: 74 65 2e 53 51 4c 69 74 65 33 20 5c 0d 0a 20 20  te.SQLite3 \..  
aa80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49 6e                In
aa90: 74 65 72 6f 70 53 6f 75 72 63 65 49 64 7d 20 73  teropSourceId} s
aaa0: 6f 75 72 63 65 49 64 5d 7d 20 74 68 65 6e 20 7b  ourceId]} then {
aab0: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
aac0: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
aad0: 20 57 65 20 66 61 69 6c 65 64 20 74 6f 20 71 75   We failed to qu
aae0: 65 72 79 20 74 68 65 20 46 6f 73 73 69 6c 20 73  ery the Fossil s
aaf0: 6f 75 72 63 65 20 69 64 65 6e 74 69 66 69 65 72  ource identifier
ab00: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
ab10: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73 6f            set so
ab20: 75 72 63 65 49 64 20 75 6e 6b 6e 6f 77 6e 0d 0a  urceId unknown..
ab30: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
ab40: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
ab50: 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66  # NOTE: Check if
ab60: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 46 6f   the returned Fo
ab70: 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e  ssil source iden
ab80: 74 69 66 69 65 72 20 77 61 73 20 6e 75 6c 6c 2e  tifier was null.
ab90: 20 20 49 66 0d 0a 20 20 20 20 20 20 20 20 23 20    If..        # 
aba0: 20 20 20 20 20 20 73 6f 2c 20 6d 61 6b 65 20 69        so, make i
abb0: 74 20 65 61 73 79 20 74 6f 20 73 70 6f 74 2e 0d  t easy to spot..
abc0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
abd0: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
abe0: 6c 65 6e 67 74 68 20 24 73 6f 75 72 63 65 49 64  length $sourceId
abf0: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
ac00: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73 6f            set so
ac10: 75 72 63 65 49 64 20 6e 75 6c 6c 0d 0a 20 20 20  urceId null..   
ac20: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
ac30: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
ac40: 4f 54 45 3a 20 59 65 73 2c 20 74 68 65 20 53 51  OTE: Yes, the SQ
ac50: 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73  Lite interop ass
ac60: 65 6d 62 6c 79 20 61 70 70 65 61 72 73 20 74 6f  embly appears to
ac70: 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a   be available...
ac80: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
ac90: 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
aca0: 20 53 51 4c 69 74 65 49 6e 74 65 72 6f 70 0d 0a   SQLiteInterop..
acb0: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
acc0: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
acd0: 41 72 67 73 20 22 79 65 73 20 28 22 20 24 76 65  Args "yes (" $ve
ace0: 72 73 69 6f 6e 20 22 20 22 20 24 73 6f 75 72 63  rsion " " $sourc
acf0: 65 49 64 20 22 29 5c 6e 22 5d 0d 0a 20 20 20 20  eId ")\n"]..    
ad00: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
ad10: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
ad20: 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d  el no\n..      }
ad30: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
ad40: 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51 4c  proc checkForSQL
ad50: 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e  iteDefineConstan
ad60: 74 20 7b 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65  t { channel name
ad70: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74   } {..      tput
ad80: 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
ad90: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
ada0: 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69      "---- checki
adb0: 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61  ng for System.Da
adc0: 74 61 2e 53 51 4c 69 74 65 20 64 65 66 69 6e 65  ta.SQLite define
add0: 20 63 6f 6e 73 74 61 6e 74 20 5c 22 22 20 24 6e   constant \"" $n
ade0: 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
adf0: 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20   "\"... "]....  
ae00: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
ae10: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
ae20: 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
ae30: 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
ae40: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
ae50: 74 65 2e 53 51 4c 69 74 65 33 20 5c 0d 0a 20 20  te.SQLite3 \..  
ae60: 20 20 20 20 20 20 20 20 20 20 20 20 44 65 66 69              Defi
ae70: 6e 65 43 6f 6e 73 74 61 6e 74 73 7d 20 64 65 66  neConstants} def
ae80: 69 6e 65 43 6f 6e 73 74 61 6e 74 73 5d 20 3d 3d  ineConstants] ==
ae90: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
aea0: 20 20 20 20 69 66 20 7b 5b 6c 73 65 61 72 63 68      if {[lsearch
aeb0: 20 2d 65 78 61 63 74 20 2d 6e 6f 63 61 73 65 20   -exact -nocase 
aec0: 24 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73  $defineConstants
aed0: 20 24 6e 61 6d 65 5d 20 21 3d 20 2d 31 7d 20 74   $name] != -1} t
aee0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
aef0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
af00: 4e 4f 54 45 3a 20 59 65 73 2c 20 74 68 69 73 20  NOTE: Yes, this 
af10: 64 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74 20  define constant 
af20: 77 61 73 20 65 6e 61 62 6c 65 64 20 77 68 65 6e  was enabled when
af30: 20 74 68 65 20 6d 61 6e 61 67 65 64 0d 0a 20 20   the managed..  
af40: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
af50: 61 73 73 65 6d 62 6c 79 20 77 61 73 20 63 6f 6d  assembly was com
af60: 70 69 6c 65 64 2e 0d 0a 20 20 20 20 20 20 20 20  piled...        
af70: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 61    #..          a
af80: 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  ddConstraint [ap
af90: 70 65 6e 64 41 72 67 73 20 64 65 66 69 6e 65 43  pendArgs defineC
afa0: 6f 6e 73 74 61 6e 74 2e 53 79 73 74 65 6d 2e 44  onstant.System.D
afb0: 61 74 61 2e 53 51 4c 69 74 65 2e 20 24 6e 61 6d  ata.SQLite. $nam
afc0: 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  e]....          
afd0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79  tputs $channel y
afe0: 65 73 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d 20  es\n..        } 
aff0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
b000: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
b010: 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d   no\n..        }
b020: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
b030: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
b040: 24 63 68 61 6e 6e 65 6c 20 65 72 72 6f 72 5c 6e  $channel error\n
b050: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
b060: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
b070: 74 44 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 20  tDateTimeFormat 
b080: 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
b090: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69       # NOTE: Thi
b0a0: 73 20 70 72 6f 63 65 64 75 72 65 20 73 69 6d 70  s procedure simp
b0b0: 6c 79 20 72 65 74 75 72 6e 73 20 74 68 65 20 22  ly returns the "
b0c0: 64 65 66 61 75 6c 74 22 20 44 61 74 65 54 69 6d  default" DateTim
b0d0: 65 20 66 6f 72 6d 61 74 20 75 73 65 64 0d 0a 20  e format used.. 
b0e0: 20 20 20 20 20 23 20 20 20 20 20 20 20 62 79 20       #       by 
b0f0: 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d  the test suite..
b100: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
b110: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
b120: 20 3a 3a 64 61 74 65 74 69 6d 65 5f 66 6f 72 6d   ::datetime_form
b130: 61 74 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  at] && \..      
b140: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
b150: 74 68 20 24 3a 3a 64 61 74 65 74 69 6d 65 5f 66  th $::datetime_f
b160: 6f 72 6d 61 74 5d 20 3e 20 30 7d 20 74 68 65 6e  ormat] > 0} then
b170: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
b180: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52         # NOTE: R
b190: 65 74 75 72 6e 20 74 68 65 20 6d 61 6e 75 61 6c  eturn the manual
b1a0: 6c 79 20 6f 76 65 72 72 69 64 64 65 6e 20 76 61  ly overridden va
b1b0: 6c 75 65 20 66 6f 72 20 74 68 65 20 44 61 74 65  lue for the Date
b1c0: 54 69 6d 65 20 66 6f 72 6d 61 74 2e 0d 0a 20 20  Time format...  
b1d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
b1e0: 20 72 65 74 75 72 6e 20 24 3a 3a 64 61 74 65 74   return $::datet
b1f0: 69 6d 65 5f 66 6f 72 6d 61 74 0d 0a 20 20 20 20  ime_format..    
b200: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
b210: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
b220: 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 61 6e   NOTE: Return an
b230: 20 49 53 4f 38 36 30 31 20 44 61 74 65 54 69 6d   ISO8601 DateTim
b240: 65 20 66 6f 72 6d 61 74 20 63 6f 6d 70 61 74 69  e format compati
b250: 62 6c 65 20 77 69 74 68 20 53 51 4c 69 74 65 2c  ble with SQLite,
b260: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
b270: 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
b280: 4c 69 74 65 2c 20 61 6e 64 20 73 75 69 74 61 62  Lite, and suitab
b290: 6c 65 20 66 6f 72 20 72 6f 75 6e 64 2d 74 72 69  le for round-tri
b2a0: 70 70 69 6e 67 20 77 69 74 68 20 74 68 65 0d 0a  pping with the..
b2b0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
b2c0: 44 61 74 65 54 69 6d 65 20 63 6c 61 73 73 20 6f  DateTime class o
b2d0: 66 20 74 68 65 20 66 72 61 6d 65 77 6f 72 6b 2e  f the framework.
b2e0: 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20    If this value 
b2f0: 69 73 20 63 68 61 6e 67 65 64 2c 0d 0a 20 20 20  is changed,..   
b300: 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61 72       #       var
b310: 69 6f 75 73 20 74 65 73 74 73 20 6d 61 79 20 66  ious tests may f
b320: 61 69 6c 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ail...        #.
b330: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
b340: 22 79 79 79 79 2d 4d 4d 2d 64 64 20 48 48 3a 6d  "yyyy-MM-dd HH:m
b350: 6d 3a 73 73 2e 46 46 46 46 46 46 46 4b 22 0d 0a  m:ss.FFFFFFFK"..
b360: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
b370: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 65 6e 75 6d  ...    proc enum
b380: 65 72 61 62 6c 65 54 6f 4c 69 73 74 20 7b 20 65  erableToList { e
b390: 6e 75 6d 65 72 61 62 6c 65 20 7d 20 7b 0d 0a 20  numerable } {.. 
b3a0: 20 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20       set result 
b3b0: 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20  [list]....      
b3c0: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
b3d0: 74 68 20 24 65 6e 75 6d 65 72 61 62 6c 65 5d 20  th $enumerable] 
b3e0: 3d 3d 20 30 20 7c 7c 20 24 65 6e 75 6d 65 72 61  == 0 || $enumera
b3f0: 62 6c 65 20 65 71 20 22 6e 75 6c 6c 22 7d 20 74  ble eq "null"} t
b400: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
b410: 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20  eturn $result.. 
b420: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
b430: 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20 2d  object foreach -
b440: 61 6c 69 61 73 20 69 74 65 6d 20 24 65 6e 75 6d  alias item $enum
b450: 65 72 61 62 6c 65 20 7b 0d 0a 20 20 20 20 20 20  erable {..      
b460: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
b470: 6e 67 74 68 20 24 69 74 65 6d 5d 20 3e 20 30 7d  ngth $item] > 0}
b480: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
b490: 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c     lappend resul
b4a0: 74 20 5b 24 69 74 65 6d 20 54 6f 53 74 72 69 6e  t [$item ToStrin
b4b0: 67 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  g]..        }.. 
b4c0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
b4d0: 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a  return $result..
b4e0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
b4f0: 6f 63 20 63 61 74 63 68 41 6e 64 52 65 74 75 72  oc catchAndRetur
b500: 6e 20 7b 20 73 63 72 69 70 74 20 7b 73 74 61 63  n { script {stac
b510: 6b 54 72 61 63 65 20 66 61 6c 73 65 7d 20 7b 73  kTrace false} {s
b520: 74 72 69 63 74 20 74 72 75 65 7d 20 7d 20 7b 0d  trict true} } {.
b530: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
b540: 23 20 4e 4f 54 45 3a 20 45 76 61 6c 75 61 74 65  # NOTE: Evaluate
b550: 20 74 68 65 20 73 63 72 69 70 74 20 70 72 6f 76   the script prov
b560: 69 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c  ided by our call
b570: 65 72 20 69 6e 20 74 68 65 69 72 20 63 6f 6e 74  er in their cont
b580: 65 78 74 2c 0d 0a 20 20 20 20 20 20 23 20 20 20  ext,..      #   
b590: 20 20 20 20 63 61 70 74 75 72 69 6e 67 20 62 6f      capturing bo
b5a0: 74 68 20 74 68 65 20 72 65 73 75 6c 74 20 61 6e  th the result an
b5b0: 64 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  d the return cod
b5c0: 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
b5d0: 20 20 20 73 65 74 20 63 6f 64 65 20 5b 63 61 74     set code [cat
b5e0: 63 68 20 7b 75 70 6c 65 76 65 6c 20 31 20 24 73  ch {uplevel 1 $s
b5f0: 63 72 69 70 74 7d 20 72 65 73 75 6c 74 5d 0d 0a  cript} result]..
b600: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
b610: 20 23 20 4e 4f 54 45 3a 20 44 69 64 20 74 68 65   # NOTE: Did the
b620: 20 73 63 72 69 70 74 20 70 72 6f 76 69 64 65 64   script provided
b630: 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 20 4e   by our caller N
b640: 4f 54 20 72 61 69 73 65 20 61 6e 20 65 72 72 6f  OT raise an erro
b650: 72 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  r?..      #..   
b660: 20 20 20 69 66 20 7b 24 73 74 72 69 63 74 20 26     if {$strict &
b670: 26 20 24 63 6f 64 65 20 3d 3d 20 30 20 7c 7c 20  & $code == 0 || 
b680: 21 24 73 74 72 69 63 74 20 26 26 20 24 63 6f 64  !$strict && $cod
b690: 65 20 21 3d 20 31 7d 20 74 68 65 6e 20 7b 0d 0a  e != 1} then {..
b6a0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
b6b0: 20 20 20 23 20 4e 4f 54 45 3a 20 53 75 63 63 65     # NOTE: Succe
b6c0: 73 73 2e 20 20 52 65 74 75 72 6e 20 61 20 6c 69  ss.  Return a li
b6d0: 73 74 20 77 69 74 68 20 74 68 65 20 72 65 74 75  st with the retu
b6e0: 72 6e 20 63 6f 64 65 20 61 6e 64 20 74 68 65 20  rn code and the 
b6f0: 72 65 73 75 6c 74 2e 0d 0a 20 20 20 20 20 20 20  result...       
b700: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
b710: 72 6e 20 5b 6c 69 73 74 20 24 63 6f 64 65 20 24  rn [list $code $
b720: 72 65 73 75 6c 74 5d 0d 0a 20 20 20 20 20 20 7d  result]..      }
b730: 20 65 6c 73 65 69 66 20 7b 24 73 74 61 63 6b 54   elseif {$stackT
b740: 72 61 63 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  race} then {..  
b750: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
b760: 20 23 20 4e 4f 54 45 3a 20 46 61 69 6c 75 72 65   # NOTE: Failure
b770: 2e 20 20 4f 75 72 20 63 61 6c 6c 65 72 20 77 61  .  Our caller wa
b780: 6e 74 73 20 61 20 66 75 6c 6c 20 73 74 61 63 6b  nts a full stack
b790: 20 74 72 61 63 65 20 28 69 66 20 61 70 70 6c 69   trace (if appli
b7a0: 63 61 62 6c 65 29 2c 0d 0a 20 20 20 20 20 20 20  cable),..       
b7b0: 20 23 20 20 20 20 20 20 20 72 65 74 75 72 6e 20   #       return 
b7c0: 61 20 6c 69 73 74 20 77 69 74 68 20 74 68 65 20  a list with the 
b7d0: 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20  return code and 
b7e0: 74 68 65 20 72 65 73 75 6c 74 20 76 65 72 62 61  the result verba
b7f0: 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  tim...        #.
b800: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
b810: 5b 6c 69 73 74 20 24 63 6f 64 65 20 24 72 65 73  [list $code $res
b820: 75 6c 74 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  ult]..      } el
b830: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
b840: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
b850: 20 46 61 69 6c 75 72 65 2e 20 20 4f 75 72 20 63   Failure.  Our c
b860: 61 6c 6c 65 72 20 64 6f 65 73 20 6e 6f 74 20 77  aller does not w
b870: 61 6e 74 20 61 20 66 75 6c 6c 20 73 74 61 63 6b  ant a full stack
b880: 20 74 72 61 63 65 20 28 69 66 0d 0a 20 20 20 20   trace (if..    
b890: 20 20 20 20 23 20 20 20 20 20 20 20 61 70 70 6c      #       appl
b8a0: 69 63 61 62 6c 65 29 2c 20 72 65 74 75 72 6e 20  icable), return 
b8b0: 61 20 6c 69 73 74 20 77 69 74 68 20 74 68 65 20  a list with the 
b8c0: 72 65 74 75 72 6e 20 63 6f 64 65 2c 20 74 68 65  return code, the
b8d0: 20 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20   error..        
b8e0: 23 20 20 20 20 20 20 20 63 6f 64 65 20 66 6f 72  #       code for
b8f0: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
b900: 2c 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20  , and the error 
b910: 6d 65 73 73 61 67 65 20 75 70 20 74 6f 20 74 68  message up to th
b920: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
b930: 20 20 20 70 6f 69 6e 74 20 77 68 65 72 65 20 74     point where t
b940: 68 65 20 73 74 61 63 6b 20 74 72 61 63 65 20 73  he stack trace s
b950: 68 6f 75 6c 64 20 73 74 61 72 74 2e 0d 0a 20 20  hould start...  
b960: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
b970: 20 73 65 74 20 69 6e 64 65 78 20 5b 73 74 72 69   set index [stri
b980: 6e 67 20 66 69 72 73 74 20 22 20 20 20 61 74 20  ng first "   at 
b990: 22 20 24 72 65 73 75 6c 74 5d 3b 20 23 20 48 41  " $result]; # HA
b9a0: 43 4b 3a 20 52 65 6c 69 61 62 6c 65 3f 0d 0a 0d  CK: Reliable?...
b9b0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
b9c0: 5b 6c 69 73 74 20 24 63 6f 64 65 20 24 3a 3a 65  [list $code $::e
b9d0: 72 72 6f 72 43 6f 64 65 20 5b 65 78 70 72 20 7b  rrorCode [expr {
b9e0: 24 69 6e 64 65 78 20 21 3d 20 2d 31 20 3f 20 5c  $index != -1 ? \
b9f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 73  ..            [s
ba00: 74 72 69 6e 67 20 74 72 69 6d 20 5b 73 74 72 69  tring trim [stri
ba10: 6e 67 20 72 61 6e 67 65 20 24 72 65 73 75 6c 74  ng range $result
ba20: 20 30 20 24 69 6e 64 65 78 5d 5d 20 3a 20 24 72   0 $index]] : $r
ba30: 65 73 75 6c 74 7d 5d 5d 0d 0a 20 20 20 20 20 20  esult}]]..      
ba40: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
ba50: 20 70 72 6f 63 20 63 6f 6d 70 69 6c 65 43 53 68   proc compileCSh
ba60: 61 72 70 57 69 74 68 20 7b 0d 0a 20 20 20 20 20  arpWith {..     
ba70: 20 20 20 20 20 20 20 74 65 78 74 20 6d 65 6d 6f         text memo
ba80: 72 79 20 73 79 6d 62 6f 6c 73 20 73 74 72 69 63  ry symbols stric
ba90: 74 20 72 65 73 75 6c 74 73 56 61 72 4e 61 6d 65  t resultsVarName
baa0: 20 65 72 72 6f 72 73 56 61 72 4e 61 6d 65 20 66   errorsVarName f
bab0: 69 6c 65 4e 61 6d 65 73 0d 0a 20 20 20 20 20 20  ileNames..      
bac0: 20 20 20 20 20 20 61 72 67 73 20 7d 20 7b 0d 0a        args } {..
bad0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
bae0: 20 4e 4f 54 45 3a 20 53 69 6e 63 65 20 77 65 20   NOTE: Since we 
baf0: 61 72 65 20 67 6f 69 6e 67 20 74 6f 20 75 73 65  are going to use
bb00: 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6e 61 6d   this method nam
bb10: 65 20 61 20 6c 6f 74 2c 20 61 73 73 69 67 6e 20  e a lot, assign 
bb20: 69 74 20 74 6f 20 61 0d 0a 20 20 20 20 20 20 23  it to a..      #
bb30: 20 20 20 20 20 20 20 76 61 72 69 61 62 6c 65 20         variable 
bb40: 66 69 72 73 74 2e 0d 0a 20 20 20 20 20 20 23 0d  first...      #.
bb50: 0a 20 20 20 20 20 20 73 65 74 20 61 64 64 20 52  .      set add R
bb60: 65 66 65 72 65 6e 63 65 64 41 73 73 65 6d 62 6c  eferencedAssembl
bb70: 69 65 73 2e 41 64 64 0d 0a 0d 0a 20 20 20 20 20  ies.Add....     
bb80: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
bb90: 3a 20 43 72 65 61 74 65 20 74 68 65 20 62 61 73  : Create the bas
bba0: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61  e command to eva
bbb0: 6c 75 61 74 65 20 61 6e 64 20 61 64 64 20 74 68  luate and add th
bbc0: 65 20 70 72 6f 70 65 72 74 79 20 73 65 74 74 69  e property setti
bbd0: 6e 67 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ngs..      #    
bbe0: 20 20 20 74 68 61 74 20 61 72 65 20 61 6c 6d 6f     that are almo
bbf0: 73 74 20 61 6c 77 61 79 73 20 6e 65 65 64 65 64  st always needed
bc00: 20 62 79 20 6f 75 72 20 75 6e 69 74 20 74 65 73   by our unit tes
bc10: 74 73 20 28 69 2e 65 2e 20 74 68 65 20 53 79 73  ts (i.e. the Sys
bc20: 74 65 6d 0d 0a 20 20 20 20 20 20 23 20 20 20 20  tem..      #    
bc30: 20 20 20 61 6e 64 20 53 79 73 74 65 6d 2e 44 61     and System.Da
bc40: 74 61 20 61 73 73 65 6d 62 6c 79 20 72 65 66 65  ta assembly refe
bc50: 72 65 6e 63 65 73 29 2e 0d 0a 20 20 20 20 20 20  rences)...      
bc60: 23 0d 0a 20 20 20 20 20 20 73 65 74 20 63 6f 6d  #..      set com
bc70: 6d 61 6e 64 20 5b 6c 69 73 74 20 5c 0d 0a 20 20  mand [list \..  
bc80: 20 20 20 20 20 20 20 20 63 6f 6d 70 69 6c 65 43          compileC
bc90: 53 68 61 72 70 20 24 74 65 78 74 20 24 6d 65 6d  Sharp $text $mem
bca0: 6f 72 79 20 24 73 79 6d 62 6f 6c 73 20 24 73 74  ory $symbols $st
bcb0: 72 69 63 74 20 72 65 73 75 6c 74 73 20 65 72 72  rict results err
bcc0: 6f 72 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ors \..         
bcd0: 20 24 61 64 64 20 53 79 73 74 65 6d 2e 64 6c 6c   $add System.dll
bce0: 20 24 61 64 64 20 53 79 73 74 65 6d 2e 44 61 74   $add System.Dat
bcf0: 61 2e 64 6c 6c 20 24 61 64 64 20 53 79 73 74 65  a.dll $add Syste
bd00: 6d 2e 54 72 61 6e 73 61 63 74 69 6f 6e 73 2e 64  m.Transactions.d
bd10: 6c 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ll \..          
bd20: 24 61 64 64 20 53 79 73 74 65 6d 2e 58 6d 6c 2e  $add System.Xml.
bd30: 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  dll]....      #.
bd40: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41  .      # NOTE: A
bd50: 64 64 20 61 6c 6c 20 74 68 65 20 70 72 6f 76 69  dd all the provi
bd60: 64 65 64 20 66 69 6c 65 20 6e 61 6d 65 73 20 61  ded file names a
bd70: 73 20 61 73 73 65 6d 62 6c 79 20 72 65 66 65 72  s assembly refer
bd80: 65 6e 63 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d  ences...      #.
bd90: 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66  .      foreach f
bda0: 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d  ileName $fileNam
bdb0: 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 6c 61  es {..        la
bdc0: 70 70 65 6e 64 20 63 6f 6d 6d 61 6e 64 20 24 61  ppend command $a
bdd0: 64 64 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c  dd [getBinaryFil
bde0: 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d  eName $fileName]
bdf0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
be00: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
be10: 54 45 3a 20 41 64 64 20 74 68 65 20 65 78 74 72  TE: Add the extr
be20: 61 20 61 72 67 75 6d 65 6e 74 73 2c 20 69 66 20  a arguments, if 
be30: 61 6e 79 2c 20 74 6f 20 74 68 65 20 63 6f 6d 6d  any, to the comm
be40: 61 6e 64 20 74 6f 20 65 76 61 6c 75 61 74 65 2e  and to evaluate.
be50: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
be60: 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 63 6f   eval lappend co
be70: 6d 6d 61 6e 64 20 24 61 72 67 73 0d 0a 0d 0a 20  mmand $args.... 
be80: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
be90: 4e 4f 54 45 3a 20 41 6c 69 61 73 20 74 68 65 20  NOTE: Alias the 
bea0: 63 6f 6d 70 69 6c 65 72 20 6c 6f 63 61 6c 20 72  compiler local r
beb0: 65 73 75 6c 74 73 20 61 6e 64 20 65 72 72 6f 72  esults and error
bec0: 73 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20 74  s variables to t
bed0: 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
bee0: 20 20 76 61 72 69 61 62 6c 65 20 6e 61 6d 65 73    variable names
bef0: 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72   provided by our
bf00: 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20   caller...      
bf10: 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31  #..      upvar 1
bf20: 20 24 72 65 73 75 6c 74 73 56 61 72 4e 61 6d 65   $resultsVarName
bf30: 20 72 65 73 75 6c 74 73 0d 0a 20 20 20 20 20 20   results..      
bf40: 75 70 76 61 72 20 31 20 24 65 72 72 6f 72 73 56  upvar 1 $errorsV
bf50: 61 72 4e 61 6d 65 20 65 72 72 6f 72 73 0d 0a 0d  arName errors...
bf60: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
bf70: 23 20 4e 4f 54 45 3a 20 45 76 61 6c 75 61 74 65  # NOTE: Evaluate
bf80: 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 65 64   the constructed
bf90: 20 5b 63 6f 6d 70 69 6c 65 43 53 68 61 72 70 5d   [compileCSharp]
bfa0: 20 63 6f 6d 6d 61 6e 64 20 61 6e 64 20 72 65 74   command and ret
bfb0: 75 72 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23  urn the..      #
bfc0: 20 20 20 20 20 20 20 72 65 73 75 6c 74 2e 0d 0a         result...
bfd0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 65        #..      e
bfe0: 76 61 6c 20 24 63 6f 6d 6d 61 6e 64 0d 0a 20 20  val $command..  
bff0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
c000: 20 69 73 4d 65 6d 6f 72 79 44 62 20 7b 20 66 69   isMemoryDb { fi
c010: 6c 65 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20  leName } {..    
c020: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
c030: 45 3a 20 49 73 20 74 68 65 20 73 70 65 63 69 66  E: Is the specif
c040: 69 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  ied database fil
c050: 65 20 6e 61 6d 65 20 72 65 61 6c 6c 79 20 61 6e  e name really an
c060: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
c070: 61 73 65 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ase?..      #.. 
c080: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70       return [exp
c090: 72 20 7b 24 66 69 6c 65 4e 61 6d 65 20 65 71 20  r {$fileName eq 
c0a0: 22 3a 6d 65 6d 6f 72 79 3a 22 20 7c 7c 20 5c 0d  ":memory:" || \.
c0b0: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
c0c0: 6e 67 20 72 61 6e 67 65 20 24 66 69 6c 65 4e 61  ng range $fileNa
c0d0: 6d 65 20 30 20 31 32 5d 20 65 71 20 22 66 69 6c  me 0 12] eq "fil
c0e0: 65 3a 3a 6d 65 6d 6f 72 79 3a 22 7d 5d 0d 0a 20  e::memory:"}].. 
c0f0: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
c100: 63 20 69 73 54 61 62 6c 65 49 6e 44 62 20 7b 20  c isTableInDb { 
c110: 6e 61 6d 65 20 7b 76 61 72 4e 61 6d 65 20 64 62  name {varName db
c120: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
c130: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
c140: 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63 69  fer to the speci
c150: 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28 65  fied variable (e
c160: 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65  .g. "db") in the
c170: 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d   context of our.
c180: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
c190: 61 6c 6c 65 72 2e 20 20 49 74 20 63 6f 6e 74 61  aller.  It conta
c1a0: 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ins the database
c1b0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64   connection hand
c1c0: 6c 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 0d  le that will be.
c1d0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75  .      #       u
c1e0: 73 65 64 20 74 6f 20 65 78 65 63 75 74 65 20 74  sed to execute t
c1f0: 68 65 20 71 75 65 72 79 20 75 73 65 64 20 74 6f  he query used to
c200: 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
c210: 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73  e named table is
c220: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
c230: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 61 74 20  present in that 
c240: 64 61 74 61 62 61 73 65 2e 0d 0a 20 20 20 20 20  database...     
c250: 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20   #..      upvar 
c260: 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d  1 $varName db...
c270: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
c280: 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20  # NOTE: Use the 
c290: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
c2a0: 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ble to determine
c2b0: 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61   if the named ta
c2c0: 62 6c 65 20 69 73 0d 0a 20 20 20 20 20 20 23 20  ble is..      # 
c2d0: 20 20 20 20 20 20 70 72 65 73 65 6e 74 20 69 6e        present in
c2e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0d 0a   the database...
c2f0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73        #..      s
c300: 65 74 20 73 71 6c 20 7b 0d 0a 20 20 20 20 20 20  et sql {..      
c310: 20 20 53 45 4c 45 43 54 20 43 4f 55 4e 54 28 2a    SELECT COUNT(*
c320: 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  ) FROM sqlite_ma
c330: 73 74 65 72 20 57 48 45 52 45 20 74 79 70 65 20  ster WHERE type 
c340: 3d 20 27 74 61 62 6c 65 27 20 41 4e 44 20 6e 61  = 'table' AND na
c350: 6d 65 20 3d 20 3f 3b 0d 0a 20 20 20 20 20 20 7d  me = ?;..      }
c360: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
c370: 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72     # NOTE: Retur
c380: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  n non-zero if th
c390: 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73  e named table is
c3a0: 20 70 72 65 73 65 6e 74 2e 0d 0a 20 20 20 20 20   present...     
c3b0: 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   #..      return
c3c0: 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20 20 20   [expr {..      
c3d0: 20 20 5b 73 71 6c 20 65 78 65 63 75 74 65 20 2d    [sql execute -
c3e0: 65 78 65 63 75 74 65 20 73 63 61 6c 61 72 20 24  execute scalar $
c3f0: 64 62 20 24 73 71 6c 20 5b 6c 69 73 74 20 70 61  db $sql [list pa
c400: 72 61 6d 31 20 53 74 72 69 6e 67 20 24 6e 61 6d  ram1 String $nam
c410: 65 5d 5d 20 3e 20 30 0d 0a 20 20 20 20 20 20 7d  e]] > 0..      }
c420: 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  ]..    }.....   
c430: 20 70 72 6f 63 20 74 72 69 6d 53 71 6c 20 7b 20   proc trimSql { 
c440: 73 71 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 72  sql } {..      r
c450: 65 74 75 72 6e 20 5b 72 65 67 73 75 62 20 2d 61  eturn [regsub -a
c460: 6c 6c 20 2d 2d 20 7b 5c 73 2b 7d 20 5b 73 74 72  ll -- {\s+} [str
c470: 69 6e 67 20 74 72 69 6d 20 24 73 71 6c 5d 20 22  ing trim $sql] "
c480: 20 22 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20   "]..    }..... 
c490: 20 20 20 70 72 6f 63 20 65 78 65 63 75 74 65 53     proc executeS
c4a0: 71 6c 20 7b 20 73 71 6c 20 7b 65 78 65 63 75 74  ql { sql {execut
c4b0: 65 20 6e 6f 6e 65 7d 20 7b 66 6f 72 6d 61 74 20  e none} {format 
c4c0: 6e 6f 6e 65 7d 20 7b 66 69 6c 65 4e 61 6d 65 20  none} {fileName 
c4d0: 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69  ""} } {..      i
c4e0: 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
c4f0: 68 20 24 66 69 6c 65 4e 61 6d 65 5d 20 3d 3d 20  h $fileName] == 
c500: 30 7d 20 74 68 65 6e 20 7b 73 65 74 20 66 69 6c  0} then {set fil
c510: 65 4e 61 6d 65 20 3a 6d 65 6d 6f 72 79 3a 7d 0d  eName :memory:}.
c520: 0a 20 20 20 20 20 20 73 65 74 75 70 44 62 20 24  .      setupDb $
c530: 66 69 6c 65 4e 61 6d 65 20 22 22 20 22 22 20 22  fileName "" "" "
c540: 22 20 22 22 20 22 22 20 66 61 6c 73 65 20 66 61  " "" "" false fa
c550: 6c 73 65 20 66 61 6c 73 65 20 66 61 6c 73 65 20  lse false false 
c560: 64 62 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20  db true....     
c570: 20 74 72 79 20 7b 0d 0a 20 20 20 20 20 20 20 20   try {..        
c580: 72 65 74 75 72 6e 20 5b 75 70 6c 65 76 65 6c 20  return [uplevel 
c590: 31 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20  1 [list \..     
c5a0: 20 20 20 20 20 20 20 73 71 6c 20 65 78 65 63 75         sql execu
c5b0: 74 65 20 2d 65 78 65 63 75 74 65 20 24 65 78 65  te -execute $exe
c5c0: 63 75 74 65 20 2d 66 6f 72 6d 61 74 20 24 66 6f  cute -format $fo
c5d0: 72 6d 61 74 20 24 64 62 20 24 73 71 6c 5d 5d 0d  rmat $db $sql]].
c5e0: 0a 20 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79  .      } finally
c5f0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6c 65 61   {..        clea
c600: 6e 75 70 44 62 20 24 66 69 6c 65 4e 61 6d 65 20  nupDb $fileName 
c610: 64 62 20 66 61 6c 73 65 20 66 61 6c 73 65 20 66  db false false f
c620: 61 6c 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  alse..      }.. 
c630: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
c640: 63 20 67 65 74 43 6f 6e 6e 65 63 74 69 6f 6e 46  c getConnectionF
c650: 6c 61 67 73 20 7b 20 66 6c 61 67 73 20 7b 71 75  lags { flags {qu
c660: 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  iet false} } {..
c670: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
c680: 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 72 65 20   NOTE: If there 
c690: 61 72 65 20 61 6e 79 20 67 6c 6f 62 61 6c 20 28  are any global (
c6a0: 70 65 72 20 74 65 73 74 20 72 75 6e 29 20 63 6f  per test run) co
c6b0: 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 63  nnection flags c
c6c0: 75 72 72 65 6e 74 6c 79 0d 0a 20 20 20 20 20 20  urrently..      
c6d0: 23 20 20 20 20 20 20 20 73 65 74 2c 20 75 73 65  #       set, use
c6e0: 20 74 68 65 6d 20 6e 6f 77 20 28 69 2e 65 2e 20   them now (i.e. 
c6f0: 62 79 20 63 6f 6d 62 69 6e 69 6e 67 20 74 68 65  by combining the
c700: 6d 20 77 69 74 68 20 74 68 65 20 6f 6e 65 73 20  m with the ones 
c710: 66 6f 72 20 74 68 69 73 0d 0a 20 20 20 20 20 20  for this..      
c720: 23 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69  #       connecti
c730: 6f 6e 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  on)...      #.. 
c740: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
c750: 78 69 73 74 73 20 3a 3a 63 6f 6e 6e 65 63 74 69  xists ::connecti
c760: 6f 6e 5f 66 6c 61 67 73 5d 20 26 26 20 5c 0d 0a  on_flags] && \..
c770: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
c780: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 63 6f 6e 6e  g length $::conn
c790: 65 63 74 69 6f 6e 5f 66 6c 61 67 73 5d 20 3e 20  ection_flags] > 
c7a0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
c7b0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
c7c0: 4e 4f 54 45 3a 20 53 68 6f 77 20 28 61 6e 64 20  NOTE: Show (and 
c7d0: 6c 6f 67 29 20 74 68 61 74 20 74 68 65 20 6c 6f  log) that the lo
c7e0: 63 61 6c 20 61 6e 64 20 67 6c 6f 62 61 6c 20 63  cal and global c
c7f0: 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 2e  onnection flags.
c800: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
c810: 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
c820: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
c830: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
c840: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
c850: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
c860: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 6f 63         "---- loc
c870: 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c  al connection fl
c880: 61 67 73 20 61 72 65 3a 20 22 20 24 66 6c 61 67  ags are: " $flag
c890: 73 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  s \n]....       
c8a0: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
c8b0: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
c8c0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
c8d0: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 67 6c 6f 62        "---- glob
c8e0: 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c  al connection fl
c8f0: 61 67 73 20 64 65 74 65 63 74 65 64 3a 20 22 20  ags detected: " 
c900: 24 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c  $::connection_fl
c910: 61 67 73 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ags \n]..       
c920: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
c930: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
c940: 20 43 6f 6d 62 69 6e 65 20 61 6e 64 2f 6f 72 20   Combine and/or 
c950: 72 65 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 6e  replace the conn
c960: 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 61 6e 64  ection flags and
c970: 20 74 68 65 6e 20 73 68 6f 77 20 74 68 65 0d 0a   then show the..
c980: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
c990: 6e 65 77 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20  new value...    
c9a0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
c9b0: 65 74 20 66 6c 61 67 73 20 5b 63 6f 6d 62 69 6e  et flags [combin
c9c0: 65 46 6c 61 67 73 20 24 66 6c 61 67 73 20 24 3a  eFlags $flags $:
c9d0: 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67  :connection_flag
c9e0: 73 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  s]....        #.
c9f0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
ca00: 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f 67 29 20   Show (and log) 
ca10: 74 68 65 20 6e 65 77 20 65 66 66 65 63 74 69 76  the new effectiv
ca20: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61  e connection fla
ca30: 67 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  gs...        #..
ca40: 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
ca50: 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
ca60: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
ca70: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
ca80: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
ca90: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
caa0: 63 6f 6d 62 69 6e 65 64 20 63 6f 6e 6e 65 63 74  combined connect
cab0: 69 6f 6e 20 66 6c 61 67 73 20 61 72 65 3a 20 22  ion flags are: "
cac0: 20 24 66 6c 61 67 73 20 5c 6e 5d 0d 0a 20 20 20   $flags \n]..   
cad0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
cae0: 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
caf0: 24 66 6c 61 67 73 0d 0a 20 20 20 20 7d 0d 0a 0c  $flags..    }...
cb00: 0d 0a 20 20 20 20 70 72 6f 63 20 73 65 74 75 70  ..    proc setup
cb10: 44 62 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  Db {..          
cb20: 20 20 66 69 6c 65 4e 61 6d 65 20 7b 6d 6f 64 65    fileName {mode
cb30: 20 22 22 7d 20 7b 64 61 74 65 54 69 6d 65 46 6f   ""} {dateTimeFo
cb40: 72 6d 61 74 20 22 22 7d 20 7b 64 61 74 65 54 69  rmat ""} {dateTi
cb50: 6d 65 4b 69 6e 64 20 22 22 7d 20 7b 66 6c 61 67  meKind ""} {flag
cb60: 73 20 22 22 7d 0d 0a 20 20 20 20 20 20 20 20 20  s ""}..         
cb70: 20 20 20 7b 65 78 74 72 61 20 22 22 7d 20 7b 71     {extra ""} {q
cb80: 75 61 6c 69 66 79 20 74 72 75 65 7d 20 7b 64 65  ualify true} {de
cb90: 6c 65 74 65 20 74 72 75 65 7d 20 7b 75 72 69 20  lete true} {uri 
cba0: 66 61 6c 73 65 7d 0d 0a 20 20 20 20 20 20 20 20  false}..        
cbb0: 20 20 20 20 7b 74 65 6d 70 6f 72 61 72 79 20 74      {temporary t
cbc0: 72 75 65 7d 20 7b 76 61 72 4e 61 6d 65 20 64 62  rue} {varName db
cbd0: 7d 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20  } {quiet false} 
cbe0: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
cbf0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 72 73      # NOTE: Firs
cc00: 74 2c 20 73 65 65 20 69 66 20 6f 75 72 20 63 61  t, see if our ca
cc10: 6c 6c 65 72 20 68 61 73 20 72 65 71 75 65 73 74  ller has request
cc20: 65 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  ed an in-memory 
cc30: 64 61 74 61 62 61 73 65 2e 0d 0a 20 20 20 20 20  database...     
cc40: 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 69 73   #..      set is
cc50: 4d 65 6d 6f 72 79 20 5b 69 73 4d 65 6d 6f 72 79  Memory [isMemory
cc60: 44 62 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d  Db $fileName]...
cc70: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
cc80: 23 20 4e 4f 54 45 3a 20 46 6f 72 20 6e 6f 77 2c  # NOTE: For now,
cc90: 20 61 6c 6c 20 74 65 73 74 20 64 61 74 61 62 61   all test databa
cca0: 73 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20  ses used by the 
ccb0: 74 65 73 74 20 73 75 69 74 65 20 61 72 65 20 70  test suite are p
ccc0: 6c 61 63 65 64 0d 0a 20 20 20 20 20 20 23 20 20  laced..      #  
ccd0: 20 20 20 20 20 69 6e 74 6f 20 74 68 65 20 64 61       into the da
cce0: 74 61 62 61 73 65 20 64 69 72 65 63 74 6f 72 79  tabase directory
ccf0: 2e 20 20 45 61 63 68 20 64 61 74 61 62 61 73 65  .  Each database
cd00: 20 61 6e 64 20 72 65 6c 61 74 65 64 20 66 69 6c   and related fil
cd10: 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  es..      #     
cd20: 20 20 75 73 65 64 20 62 79 20 61 20 74 65 73 74    used by a test
cd30: 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 65 61 6e   should be clean
cd40: 65 64 20 75 70 20 62 79 20 74 68 61 74 20 74 65  ed up by that te
cd50: 73 74 20 75 73 69 6e 67 20 74 68 65 0d 0a 20 20  st using the..  
cd60: 20 20 20 20 23 20 20 20 20 20 20 20 22 63 6c 65      #       "cle
cd70: 61 6e 75 70 44 62 22 20 70 72 6f 63 65 64 75 72  anupDb" procedur
cd80: 65 2c 20 62 65 6c 6f 77 2e 0d 0a 20 20 20 20 20  e, below...     
cd90: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24   #..      if {!$
cda0: 69 73 4d 65 6d 6f 72 79 20 26 26 20 24 71 75 61  isMemory && $qua
cdb0: 6c 69 66 79 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  lify} then {..  
cdc0: 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61        set fileNa
cdd0: 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67  me [file join [g
cde0: 65 74 44 61 74 61 62 61 73 65 44 69 72 65 63 74  etDatabaseDirect
cdf0: 6f 72 79 5d 20 5b 66 69 6c 65 20 74 61 69 6c 20  ory] [file tail 
ce00: 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20  $fileName]]..   
ce10: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
ce20: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42  .      # NOTE: B
ce30: 79 20 64 65 66 61 75 6c 74 2c 20 64 65 6c 65 74  y default, delet
ce40: 65 20 61 6e 79 20 70 72 65 2d 65 78 69 73 74 69  e any pre-existi
ce50: 6e 67 20 64 61 74 61 62 61 73 65 20 77 69 74 68  ng database with
ce60: 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 0d 0a   the same file..
ce70: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61        #       na
ce80: 6d 65 20 69 66 20 69 74 20 63 75 72 72 65 6e 74  me if it current
ce90: 6c 79 20 65 78 69 73 74 73 2e 0d 0a 20 20 20 20  ly exists...    
cea0: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21    #..      if {!
ceb0: 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24 64 65  $isMemory && $de
cec0: 6c 65 74 65 20 26 26 20 5b 66 69 6c 65 20 65 78  lete && [file ex
ced0: 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d  ists $fileName]}
cee0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
cef0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
cf00: 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 64  TE: Attempt to d
cf10: 65 6c 65 74 65 20 61 6e 79 20 70 72 65 2d 65 78  elete any pre-ex
cf20: 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20  isting database 
cf30: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 66 69  with the same fi
cf40: 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  le..        #   
cf50: 20 20 20 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20      name...     
cf60: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
cf70: 20 7b 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64   {[catch {file d
cf80: 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d  elete $fileName}
cf90: 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d   error]} then {.
cfa0: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
cfb0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
cfc0: 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65  We somehow faile
cfd0: 64 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  d to delete the 
cfe0: 66 69 6c 65 2c 20 72 65 70 6f 72 74 20 77 68 79  file, report why
cff0: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
d000: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
d010: 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
d020: 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
d030: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
d040: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
d050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d060: 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
d070: 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20  ailed to delete 
d080: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 5c 22  database file \"
d090: 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  " $fileName \.. 
d0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
d0b0: 5c 22 20 64 75 72 69 6e 67 20 73 65 74 75 70 2c  \" during setup,
d0c0: 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24   error: " \n\t $
d0d0: 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20  error \n]..     
d0e0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
d0f0: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
d100: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
d110: 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68  OTE: Refer to th
d120: 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72 69  e specified vari
d130: 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22 29  able (e.g. "db")
d140: 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20   in the context 
d150: 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23 20  of our..      # 
d160: 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20 20 54        caller.  T
d170: 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 74 68 65  he handle to the
d180: 20 6f 70 65 6e 65 64 20 64 61 74 61 62 61 73 65   opened database
d190: 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20   will be stored 
d1a0: 74 68 65 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d  there...      #.
d1b0: 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24  .      upvar 1 $
d1c0: 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20  varName db....  
d1d0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
d1e0: 4f 54 45 3a 20 53 74 61 72 74 20 62 75 69 6c 64  OTE: Start build
d1f0: 69 6e 67 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ing the connecti
d200: 6f 6e 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20  on string.  The 
d210: 6f 6e 6c 79 20 72 65 71 75 69 72 65 64 20 70 6f  only required po
d220: 72 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20  rtion..      #  
d230: 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6e 6e       of the conn
d240: 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 69 73  ection string is
d250: 20 74 68 65 20 64 61 74 61 20 73 6f 75 72 63 65   the data source
d260: 2c 20 77 68 69 63 68 20 63 6f 6e 74 61 69 6e 73  , which contains
d270: 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
d280: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
d290: 65 20 6e 61 6d 65 20 69 74 73 65 6c 66 2e 20 20  e name itself.  
d2a0: 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 77 61  If our caller wa
d2b0: 6e 74 73 20 74 6f 20 75 73 65 20 61 20 55 52 49  nts to use a URI
d2c0: 20 61 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20   as..      #    
d2d0: 20 20 20 74 68 65 20 64 61 74 61 20 73 6f 75 72     the data sour
d2e0: 63 65 2c 20 75 73 65 20 74 68 65 20 46 75 6c 6c  ce, use the Full
d2f0: 55 72 69 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  Uri connection s
d300: 74 72 69 6e 67 20 70 72 6f 70 65 72 74 79 20 74  tring property t
d310: 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  o..      #      
d320: 20 70 72 65 76 65 6e 74 20 74 68 65 20 64 61 74   prevent the dat
d330: 61 20 73 6f 75 72 63 65 20 73 74 72 69 6e 67 20  a source string 
d340: 66 72 6f 6d 20 62 65 69 6e 67 20 6d 61 6e 67 6c  from being mangl
d350: 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ed...      #..  
d360: 20 20 20 20 69 66 20 7b 24 75 72 69 7d 20 74 68      if {$uri} th
d370: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  en {..        se
d380: 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 46 75  t connection {Fu
d390: 6c 6c 55 72 69 3d 24 7b 66 69 6c 65 4e 61 6d 65  llUri=${fileName
d3a0: 7d 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  }}..      } else
d3b0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
d3c0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 44 61 74 61  connection {Data
d3d0: 20 53 6f 75 72 63 65 3d 24 7b 66 69 6c 65 4e 61   Source=${fileNa
d3e0: 6d 65 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  me}}..      }...
d3f0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
d400: 23 20 4e 4f 54 45 3a 20 53 69 6e 63 65 20 74 68  # NOTE: Since th
d410: 69 73 20 70 72 6f 63 65 64 75 72 65 20 68 61 73  is procedure has
d420: 20 6e 6f 20 73 70 65 63 69 61 6c 20 6b 6e 6f 77   no special know
d430: 6c 65 64 67 65 20 6f 66 20 77 68 61 74 20 74 68  ledge of what th
d440: 65 20 64 65 66 61 75 6c 74 0d 0a 20 20 20 20 20  e default..     
d450: 20 23 20 20 20 20 20 20 20 73 65 74 74 69 6e 67   #       setting
d460: 20 69 73 20 66 6f 72 20 74 68 65 20 54 6f 46 75   is for the ToFu
d470: 6c 6c 50 61 74 68 20 63 6f 6e 6e 65 63 74 69 6f  llPath connectio
d480: 6e 20 73 74 72 69 6e 67 20 70 72 6f 70 65 72 79  n string propery
d490: 2c 20 61 6c 77 61 79 73 0d 0a 20 20 20 20 20 20  , always..      
d4a0: 23 20 20 20 20 20 20 20 61 64 64 20 74 68 65 20  #       add the 
d4b0: 76 61 6c 75 65 20 77 65 20 6b 6e 6f 77 20 61 62  value we know ab
d4c0: 6f 75 74 20 74 6f 20 74 68 65 20 63 6f 6e 6e 65  out to the conne
d4d0: 63 74 69 6f 6e 20 73 74 72 69 6e 67 2e 0d 0a 20  ction string... 
d4e0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 61 70       #..      ap
d4f0: 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  pend connection 
d500: 7b 3b 54 6f 46 75 6c 6c 50 61 74 68 3d 24 7b 71  {;ToFullPath=${q
d510: 75 61 6c 69 66 79 7d 7d 0d 0a 0d 0a 20 20 20 20  ualify}}....    
d520: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
d530: 45 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72  E: If our caller
d540: 20 73 70 65 63 69 66 69 65 64 20 61 20 6a 6f 75   specified a jou
d550: 72 6e 61 6c 20 6d 6f 64 65 2c 20 61 64 64 20 74  rnal mode, add t
d560: 68 65 20 6e 65 63 65 73 73 61 72 79 20 70 6f 72  he necessary por
d570: 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  tion..      #   
d580: 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65      of the conne
d590: 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77  ction string now
d5a0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
d5b0: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
d5c0: 6e 67 74 68 20 24 6d 6f 64 65 5d 20 3e 20 30 7d  ngth $mode] > 0}
d5d0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
d5e0: 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69   append connecti
d5f0: 6f 6e 20 7b 3b 4a 6f 75 72 6e 61 6c 20 4d 6f 64  on {;Journal Mod
d600: 65 3d 24 7b 6d 6f 64 65 7d 7d 0d 0a 20 20 20 20  e=${mode}}..    
d610: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
d620: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
d630: 20 6f 75 72 20 63 61 6c 6c 65 72 20 73 70 65 63   our caller spec
d640: 69 66 69 65 64 20 61 20 44 61 74 65 54 69 6d 65  ified a DateTime
d650: 20 66 6f 72 6d 61 74 2c 20 61 64 64 20 74 68 65   format, add the
d660: 20 6e 65 63 65 73 73 61 72 79 0d 0a 20 20 20 20   necessary..    
d670: 20 20 23 20 20 20 20 20 20 20 70 6f 72 74 69 6f    #       portio
d680: 6e 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  n of the connect
d690: 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d  ion string now..
d6a0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
d6b0: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
d6c0: 74 68 20 24 64 61 74 65 54 69 6d 65 46 6f 72 6d  th $dateTimeForm
d6d0: 61 74 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  at] > 0} then {.
d6e0: 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20  .        append 
d6f0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 44 61 74  connection {;Dat
d700: 65 54 69 6d 65 46 6f 72 6d 61 74 3d 24 7b 64 61  eTimeFormat=${da
d710: 74 65 54 69 6d 65 46 6f 72 6d 61 74 7d 7d 0d 0a  teTimeFormat}}..
d720: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
d730: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
d740: 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20  : If our caller 
d750: 73 70 65 63 69 66 69 65 64 20 61 20 44 61 74 65  specified a Date
d760: 54 69 6d 65 4b 69 6e 64 2c 20 61 64 64 20 74 68  TimeKind, add th
d770: 65 20 6e 65 63 65 73 73 61 72 79 20 70 6f 72 74  e necessary port
d780: 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ion..      #    
d790: 20 20 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63     of the connec
d7a0: 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e  tion string now.
d7b0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
d7c0: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
d7d0: 67 74 68 20 24 64 61 74 65 54 69 6d 65 4b 69 6e  gth $dateTimeKin
d7e0: 64 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  d] > 0} then {..
d7f0: 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 63          append c
d800: 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 44 61 74 65  onnection {;Date
d810: 54 69 6d 65 4b 69 6e 64 3d 24 7b 64 61 74 65 54  TimeKind=${dateT
d820: 69 6d 65 4b 69 6e 64 7d 7d 0d 0a 20 20 20 20 20  imeKind}}..     
d830: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
d840: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 67       # NOTE: Fig
d850: 75 72 65 20 6f 75 74 20 77 68 61 74 20 74 68 65  ure out what the
d860: 20 66 69 6e 61 6c 20 66 6c 61 67 73 20 66 6f 72   final flags for
d870: 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
d880: 20 6e 65 65 64 20 74 6f 20 62 65 2e 0d 0a 20 20   need to be...  
d890: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
d8a0: 20 66 6c 61 67 73 20 5b 67 65 74 43 6f 6e 6e 65   flags [getConne
d8b0: 63 74 69 6f 6e 46 6c 61 67 73 20 24 66 6c 61 67  ctionFlags $flag
d8c0: 73 20 24 71 75 69 65 74 5d 0d 0a 0d 0a 20 20 20  s $quiet]....   
d8d0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
d8e0: 54 45 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65  TE: If our calle
d8f0: 72 20 73 70 65 63 69 66 69 65 64 20 73 6f 6d 65  r specified some
d900: 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f   SQLiteConnectio
d910: 6e 46 6c 61 67 73 2c 20 61 64 64 20 74 68 65 0d  nFlags, add the.
d920: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e  .      #       n
d930: 65 63 65 73 73 61 72 79 20 70 6f 72 74 69 6f 6e  ecessary portion
d940: 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   of the connecti
d950: 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a  on string now...
d960: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
d970: 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
d980: 68 20 24 66 6c 61 67 73 5d 20 3e 20 30 7d 20 74  h $flags] > 0} t
d990: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61  hen {..        a
d9a0: 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e  ppend connection
d9b0: 20 7b 3b 46 6c 61 67 73 3d 24 7b 66 6c 61 67 73   {;Flags=${flags
d9c0: 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  }}..      }.... 
d9d0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
d9e0: 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20 63 61 6c  NOTE: If our cal
d9f0: 6c 65 72 20 73 70 65 63 69 66 69 65 64 20 61 6e  ler specified an
da00: 20 65 78 74 72 61 20 70 61 79 6c 6f 61 64 20 74   extra payload t
da10: 6f 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  o the connection
da20: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
da30: 73 74 72 69 6e 67 2c 20 61 70 70 65 6e 64 20 69  string, append i
da40: 74 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d  t now...      #.
da50: 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
da60: 6e 67 20 6c 65 6e 67 74 68 20 24 65 78 74 72 61  ng length $extra
da70: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
da80: 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f         append co
da90: 6e 6e 65 63 74 69 6f 6e 20 5c 3b 20 24 65 78 74  nnection \; $ext
daa0: 72 61 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ra..      }.... 
dab0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
dac0: 4e 4f 54 45 3a 20 4f 70 65 6e 20 74 68 65 20 64  NOTE: Open the d
dad0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
dae0: 6f 6e 20 6e 6f 77 2c 20 70 6c 61 63 69 6e 67 20  on now, placing 
daf0: 74 68 65 20 6f 70 61 71 75 65 20 68 61 6e 64 6c  the opaque handl
db00: 65 20 76 61 6c 75 65 0d 0a 20 20 20 20 20 20 23  e value..      #
db10: 20 20 20 20 20 20 20 69 6e 74 6f 20 74 68 65 20         into the 
db20: 76 61 72 69 61 62 6c 65 20 73 70 65 63 69 66 69  variable specifi
db30: 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72  ed by our caller
db40: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
db50: 20 20 73 65 74 20 64 62 20 5b 73 71 6c 20 6f 70    set db [sql op
db60: 65 6e 20 2d 74 79 70 65 20 53 51 4c 69 74 65 20  en -type SQLite 
db70: 5b 73 75 62 73 74 20 24 63 6f 6e 6e 65 63 74 69  [subst $connecti
db80: 6f 6e 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  on]]....      #.
db90: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43  .      # NOTE: C
dba0: 6f 6e 66 69 67 75 72 65 20 74 68 65 20 74 65 6d  onfigure the tem
dbb0: 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79  porary directory
dbc0: 20 66 6f 72 20 74 68 65 20 6e 65 77 6c 79 20 6f   for the newly o
dbd0: 70 65 6e 65 64 20 64 61 74 61 62 61 73 65 0d 0a  pened database..
dbe0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
dbf0: 6e 6e 65 63 74 69 6f 6e 20 6e 6f 77 20 75 6e 6c  nnection now unl
dc00: 65 73 73 20 6f 75 72 20 63 61 6c 6c 65 72 20 66  ess our caller f
dc10: 6f 72 62 69 64 73 20 69 74 2e 0d 0a 20 20 20 20  orbids it...    
dc20: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24    #..      if {$
dc30: 74 65 6d 70 6f 72 61 72 79 20 26 26 20 21 5b 69  temporary && ![i
dc40: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
dc50: 73 65 74 54 65 6d 70 6f 72 61 72 79 44 69 72 65  setTemporaryDire
dc60: 63 74 6f 72 79 29 5d 7d 20 74 68 65 6e 20 7b 0d  ctory)]} then {.
dc70: 0a 20 20 20 20 20 20 20 20 73 71 6c 20 65 78 65  .        sql exe
dc80: 63 75 74 65 20 24 64 62 20 5b 61 70 70 65 6e 64  cute $db [append
dc90: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
dca0: 20 20 20 20 22 50 52 41 47 4d 41 20 74 65 6d 70      "PRAGMA temp
dcb0: 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79  _store_directory
dcc0: 20 3d 20 5c 22 22 20 5b 67 65 74 54 65 6d 70 6f   = \"" [getTempo
dcd0: 72 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20 5c  raryDirectory] \
dce0: 22 5c 3b 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  "\;]..      }...
dcf0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
dd00: 23 20 4e 4f 54 45 3a 20 41 6c 77 61 79 73 20 72  # NOTE: Always r
dd10: 65 74 75 72 6e 20 74 68 65 20 63 6f 6e 6e 65 63  eturn the connec
dd20: 74 69 6f 6e 20 68 61 6e 64 6c 65 20 75 70 6f 6e  tion handle upon
dd30: 20 73 75 63 63 65 73 73 2e 0d 0a 20 20 20 20 20   success...     
dd40: 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   #..      return
dd50: 20 24 64 62 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a   $db..    }.....
dd60: 20 20 20 20 70 72 6f 63 20 67 65 74 44 62 43 6f      proc getDbCo
dd70: 6e 6e 65 63 74 69 6f 6e 20 7b 20 7b 76 61 72 4e  nnection { {varN
dd80: 61 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a 20 20 20  ame db} } {..   
dd90: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
dda0: 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65  TE: Refer to the
ddb0: 20 73 70 65 63 69 66 69 65 64 20 76 61 72 69 61   specified varia
ddc0: 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22 29 20  ble (e.g. "db") 
ddd0: 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f  in the context o
dde0: 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23 20 20  f our..      #  
ddf0: 20 20 20 20 20 63 61 6c 6c 65 72 2e 20 20 54 68       caller.  Th
de00: 65 20 68 61 6e 64 6c 65 20 74 6f 20 74 68 65 20  e handle to the 
de10: 64 61 74 61 62 61 73 65 20 70 72 65 76 69 6f 75  database previou
de20: 73 6c 79 20 6f 70 65 6e 65 64 20 76 69 61 20 74  sly opened via t
de30: 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
de40: 20 20 5b 73 65 74 75 70 44 62 5d 20 70 72 6f 63    [setupDb] proc
de50: 65 64 75 72 65 20 73 68 6f 75 6c 64 20 62 65 20  edure should be 
de60: 73 74 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a 20  stored there... 
de70: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70       #..      up
de80: 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 64  var 1 $varName d
de90: 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  b....      #..  
dea0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73      # NOTE: This
deb0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 41 44 4f   returns the ADO
dec0: 2e 4e 45 54 20 49 44 62 43 6f 6e 6e 65 63 74 69  .NET IDbConnecti
ded0: 6f 6e 20 6f 62 6a 65 63 74 20 69 6e 73 74 61 6e  on object instan
dee0: 63 65 20 66 6f 72 20 74 68 65 0d 0a 20 20 20 20  ce for the..    
def0: 20 20 23 20 20 20 20 20 20 20 73 70 65 63 69 66    #       specif
df00: 69 65 64 20 64 61 74 61 62 73 65 20 68 61 6e 64  ied databse hand
df10: 6c 65 2e 20 20 53 69 6e 63 65 20 67 65 74 74 69  le.  Since getti
df20: 6e 67 20 74 68 69 73 20 6f 62 6a 65 63 74 20 72  ng this object r
df30: 65 6c 69 65 73 20 75 70 6f 6e 0d 0a 20 20 20 20  elies upon..    
df40: 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 20    #       Eagle 
df50: 69 6e 74 65 72 6e 61 6c 73 2c 20 67 72 65 61 74  internals, great
df60: 20 63 61 72 65 20 73 68 6f 75 6c 64 20 62 65 20   care should be 
df70: 74 61 6b 65 6e 20 74 6f 20 61 76 6f 69 64 20 64  taken to avoid d
df80: 69 73 70 6f 73 69 6e 67 20 6f 66 0d 0a 20 20 20  isposing of..   
df90: 20 20 20 23 20 20 20 20 20 20 20 74 68 69 73 20     #       this 
dfa0: 6f 62 6a 65 63 74 20 6f 72 20 6f 74 68 65 72 77  object or otherw
dfb0: 69 73 65 20 70 75 74 74 69 6e 67 20 69 74 20 69  ise putting it i
dfc0: 6e 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 73  nto an invalid s
dfd0: 74 61 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  tate...      #..
dfe0: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
dff0: 65 78 69 73 74 73 20 64 62 5d 7d 20 74 68 65 6e  exists db]} then
e000: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
e010: 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
e020: 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
e030: 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
e040: 4e 6f 6e 50 75 62 6c 69 63 20 2d 6f 62 6a 65 63  NonPublic -objec
e050: 74 66 6c 61 67 73 20 2b 4e 6f 44 69 73 70 6f 73  tflags +NoDispos
e060: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
e070: 20 20 20 20 20 2d 61 6c 69 61 73 20 49 6e 74 65       -alias Inte
e080: 72 70 72 65 74 65 72 2e 47 65 74 41 63 74 69 76  rpreter.GetActiv
e090: 65 2e 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 49 74  e.connections It
e0a0: 65 6d 20 24 64 62 7d 20 5c 0d 0a 20 20 20 20 20  em $db} \..     
e0b0: 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c             resul
e0c0: 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  t] == 0} then {.
e0d0: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
e0e0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
e0f0: 53 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20  Success, return 
e100: 74 68 65 20 6f 70 61 71 75 65 20 6f 62 6a 65 63  the opaque objec
e110: 74 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20  t handle...     
e120: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
e130: 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74    return $result
e140: 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
e150: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
e160: 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
e170: 45 3a 20 46 61 69 6c 75 72 65 2c 20 72 65 70 6f  E: Failure, repo
e180: 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20  rt why...       
e190: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
e1a0: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
e1b0: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
e1c0: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
e1d0: 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
e1e0: 3a 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20  : failed to get 
e1f0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c  connection handl
e200: 65 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 5c  e for database \
e210: 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
e220: 20 20 20 20 24 64 62 20 22 5c 22 2c 20 65 72 72      $db "\", err
e230: 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65 73 75  or: " \n\t $resu
e240: 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  lt \n]..        
e250: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
e260: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 66  }.....    proc f
e270: 72 65 65 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20  reeDbConnection 
e280: 7b 20 7b 76 61 72 4e 61 6d 65 20 63 6f 6e 6e 65  { {varName conne
e290: 63 74 69 6f 6e 7d 20 7d 20 7b 0d 0a 20 20 20 20  ction} } {..    
e2a0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
e2b0: 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65 20  E: Refer to the 
e2c0: 73 70 65 63 69 66 69 65 64 20 76 61 72 69 61 62  specified variab
e2d0: 6c 65 20 28 65 2e 67 2e 20 22 63 6f 6e 6e 65 63  le (e.g. "connec
e2e0: 74 69 6f 6e 22 29 20 69 6e 20 74 68 65 0d 0a 20  tion") in the.. 
e2f0: 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e       #       con
e300: 74 65 78 74 20 6f 66 20 6f 75 72 20 63 61 6c 6c  text of our call
e310: 65 72 2e 20 20 54 68 65 20 6f 70 61 71 75 65 20  er.  The opaque 
e320: 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 66 6f  object handle fo
e330: 72 20 61 6e 20 41 44 4f 2e 4e 45 54 0d 0a 20 20  r an ADO.NET..  
e340: 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 6e      #       conn
e350: 65 63 74 69 6f 6e 20 70 72 65 76 69 6f 75 73 6c  ection previousl
e360: 79 20 72 65 74 75 72 6e 65 64 20 62 79 20 5b 67  y returned by [g
e370: 65 74 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 5d 20  etDbConnection] 
e380: 73 68 6f 75 6c 64 20 62 65 0d 0a 20 20 20 20 20  should be..     
e390: 20 23 20 20 20 20 20 20 20 73 74 6f 72 65 64 20   #       stored 
e3a0: 74 68 65 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d  there...      #.
e3b0: 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24  .      upvar 1 $
e3c0: 76 61 72 4e 61 6d 65 20 63 6f 6e 6e 65 63 74 69  varName connecti
e3d0: 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  on....      #.. 
e3e0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74       # NOTE: Att
e3f0: 65 6d 70 74 20 74 6f 20 72 65 6d 6f 76 65 20 74  empt to remove t
e400: 68 65 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74  he opaque object
e410: 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 74 68 65   handle from the
e420: 20 69 6e 74 65 72 70 72 65 74 65 72 0d 0a 20 20   interpreter..  
e430: 20 20 20 20 23 20 20 20 20 20 20 20 6e 6f 77 2e      #       now.
e440: 20 20 54 68 69 73 20 5b 6f 62 6a 65 63 74 20 64    This [object d
e450: 69 73 70 6f 73 65 5d 20 63 61 6c 6c 20 77 69 6c  ispose] call wil
e460: 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 64  l not actually d
e470: 69 73 70 6f 73 65 20 6f 66 20 74 68 65 0d 0a 20  ispose of the.. 
e480: 20 20 20 20 20 23 20 20 20 20 20 20 20 75 6e 64       #       und
e490: 65 72 6c 79 69 6e 67 20 6f 62 6a 65 63 74 20 62  erlying object b
e4a0: 65 63 61 75 73 65 20 74 68 65 20 2b 4e 6f 44 69  ecause the +NoDi
e4b0: 73 70 6f 73 65 20 66 6c 61 67 20 77 61 73 20 73  spose flag was s
e4c0: 65 74 20 6f 6e 20 69 74 0d 0a 20 20 20 20 20 20  et on it..      
e4d0: 23 20 20 20 20 20 20 20 64 75 72 69 6e 67 20 63  #       during c
e4e0: 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f  reation of the o
e4f0: 70 61 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e  paque object han
e500: 64 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  dle...      #.. 
e510: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
e520: 78 69 73 74 73 20 63 6f 6e 6e 65 63 74 69 6f 6e  xists connection
e530: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
e540: 20 20 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74    [catch {object
e550: 20 64 69 73 70 6f 73 65 20 24 63 6f 6e 6e 65 63   dispose $connec
e560: 74 69 6f 6e 7d 20 65 72 72 6f 72 5d 7d 20 74 68  tion} error]} th
e570: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
e580: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
e590: 20 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c   We somehow fail
e5a0: 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  ed to remove the
e5b0: 20 68 61 6e 64 6c 65 2c 20 72 65 70 6f 72 74 20   handle, report 
e5c0: 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  why...        #.
e5d0: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
e5e0: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
e5f0: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
e600: 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
e610: 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
e620: 74 6f 20 72 65 6d 6f 76 65 20 63 6f 6e 6e 65 63  to remove connec
e630: 74 69 6f 6e 20 68 61 6e 64 6c 65 20 5c 22 22 20  tion handle \"" 
e640: 24 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 0d 0a 20  $connection \.. 
e650: 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20             "\", 
e660: 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65  error: " \n\t $e
e670: 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  rror \n]..      
e680: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
e690: 20 70 72 6f 63 20 61 64 64 44 62 43 6f 6e 6e 65   proc addDbConne
e6a0: 63 74 69 6f 6e 20 7b 20 63 6f 6e 6e 65 63 74 69  ction { connecti
e6b0: 6f 6e 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20  on {varName db} 
e6c0: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
e6d0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65      # NOTE: Refe
e6e0: 72 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69  r to the specifi
e6f0: 65 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67  ed variable (e.g
e700: 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65 20 63  . "db") in the c
e710: 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20  ontext of our.. 
e720: 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6c       #       cal
e730: 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ler...      #.. 
e740: 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61       upvar 1 $va
e750: 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20  rName db....    
e760: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
e770: 45 3a 20 43 72 65 61 74 65 20 61 20 63 6f 72 72  E: Create a corr
e780: 65 63 74 6c 79 20 66 6f 72 6d 61 74 74 65 64 20  ectly formatted 
e790: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 64 61 74  name for the dat
e7a0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
e7b0: 20 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20   to..      #    
e7c0: 20 20 20 62 65 20 61 64 64 65 64 20 74 6f 20 74     be added to t
e7d0: 68 65 20 6c 69 73 74 20 6d 61 6e 61 67 65 64 20  he list managed 
e7e0: 62 79 20 74 68 65 20 45 61 67 6c 65 20 69 6e 74  by the Eagle int
e7f0: 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20  erpreter...     
e800: 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 64 62   #..      set db
e810: 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   [object invoke 
e820: 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
e830: 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 45  c \..          E
e840: 61 67 6c 65 2e 5f 43 6f 6d 70 6f 6e 65 6e 74 73  agle._Components
e850: 2e 50 72 69 76 61 74 65 2e 46 6f 72 6d 61 74 4f  .Private.FormatO
e860: 70 73 20 44 61 74 61 62 61 73 65 4f 62 6a 65 63  ps DatabaseObjec
e870: 74 4e 61 6d 65 20 24 63 6f 6e 6e 65 63 74 69 6f  tName $connectio
e880: 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 53  n \..          S
e890: 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20  QLiteConnection 
e8a0: 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49  [object invoke I
e8b0: 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74 41 63  nterpreter.GetAc
e8c0: 74 69 76 65 20 4e 65 78 74 49 64 5d 5d 0d 0a 0d  tive NextId]]...
e8d0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
e8e0: 23 20 4e 4f 54 45 3a 20 41 64 64 20 74 68 65 20  # NOTE: Add the 
e8f0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
e900: 69 6f 6e 20 70 72 6f 76 69 64 65 64 20 62 79 20  ion provided by 
e910: 6f 75 72 20 63 61 6c 6c 65 72 20 74 6f 20 74 68  our caller to th
e920: 65 20 6c 69 73 74 0d 0a 20 20 20 20 20 20 23 20  e list..      # 
e930: 20 20 20 20 20 20 6f 66 20 74 68 6f 73 65 20 6b        of those k
e940: 6e 6f 77 6e 20 74 6f 20 74 68 65 20 45 61 67 6c  nown to the Eagl
e950: 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a  e interpreter...
e960: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 6f        #..      o
e970: 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
e980: 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 49  ags +NonPublic I
e990: 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74 41 63  nterpreter.GetAc
e9a0: 74 69 76 65 2e 63 6f 6e 6e 65 63 74 69 6f 6e 73  tive.connections
e9b0: 20 41 64 64 20 5c 0d 0a 20 20 20 20 20 20 20 20   Add \..        
e9c0: 20 20 24 64 62 20 24 63 6f 6e 6e 65 63 74 69 6f    $db $connectio
e9d0: 6e 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  n..    }.....   
e9e0: 20 70 72 6f 63 20 63 6c 65 61 6e 75 70 44 62 20   proc cleanupDb 
e9f0: 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 76 61 72 4e  { fileName {varN
ea00: 61 6d 65 20 64 62 7d 20 7b 63 6f 6c 6c 65 63 74  ame db} {collect
ea10: 20 74 72 75 65 7d 20 7b 71 75 61 6c 69 66 79 20   true} {qualify 
ea20: 74 72 75 65 7d 0d 0a 20 20 20 20 20 20 20 20 20  true}..         
ea30: 20 20 20 20 20 20 20 20 20 20 20 20 7b 64 65 6c              {del
ea40: 65 74 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20  ete true} } {.. 
ea50: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
ea60: 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
ea70: 20 66 6f 72 63 65 20 61 6c 6c 20 70 65 6e 64 69   force all pendi
ea80: 6e 67 20 22 67 61 72 62 61 67 65 22 20 6f 62 6a  ng "garbage" obj
ea90: 65 63 74 73 20 74 6f 20 62 65 20 63 6f 6c 6c 65  ects to be colle
eaa0: 63 74 65 64 2c 0d 0a 20 20 20 20 20 20 23 20 20  cted,..      #  
eab0: 20 20 20 20 20 69 6e 63 6c 75 64 69 6e 67 20 53       including S
eac0: 51 4c 69 74 65 20 73 74 61 74 65 6d 65 6e 74 73  QLite statements
ead0: 20 61 6e 64 20 62 61 63 6b 75 70 20 6f 62 6a 65   and backup obje
eae0: 63 74 73 3b 20 74 68 69 73 20 73 68 6f 75 6c 64  cts; this should
eaf0: 20 61 6c 6c 6f 77 0d 0a 20 20 20 20 20 20 23 20   allow..      # 
eb00: 20 20 20 20 20 20 74 68 65 20 75 6e 64 65 72 6c        the underl
eb10: 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
eb20: 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  le to be deleted
eb30: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
eb40: 20 20 69 66 20 7b 24 63 6f 6c 6c 65 63 74 7d 20    if {$collect} 
eb50: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
eb60: 63 6f 6c 6c 65 63 74 47 61 72 62 61 67 65 20 24  collectGarbage $
eb70: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a  ::test_channel..
eb80: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
eb90: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
eba0: 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 73  : Refer to the s
ebb0: 70 65 63 69 66 69 65 64 20 76 61 72 69 61 62 6c  pecified variabl
ebc0: 65 20 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e  e (e.g. "db") in
ebd0: 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20   the context of 
ebe0: 6f 75 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20  our..      #    
ebf0: 20 20 20 63 61 6c 6c 65 72 2e 20 20 54 68 65 20     caller.  The 
ec00: 68 61 6e 64 6c 65 20 74 6f 20 74 68 65 20 64 61  handle to the da
ec10: 74 61 62 61 73 65 20 70 72 65 76 69 6f 75 73 6c  tabase previousl
ec20: 79 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 65  y opened via the
ec30: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
ec40: 5b 73 65 74 75 70 44 62 5d 20 70 72 6f 63 65 64  [setupDb] proced
ec50: 75 72 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74  ure should be st
ec60: 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a 20 20 20  ored there...   
ec70: 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61     #..      upva
ec80: 72 20 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d  r 1 $varName db.
ec90: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
eca0: 20 20 23 20 4e 4f 54 45 3a 20 43 6c 6f 73 65 20    # NOTE: Close 
ecb0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  the connection t
ecc0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  o the database n
ecd0: 6f 77 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64  ow.  This should
ece0: 20 61 6c 6c 6f 77 20 75 73 0d 0a 20 20 20 20 20   allow us..     
ecf0: 20 23 20 20 20 20 20 20 20 74 6f 20 64 65 6c 65   #       to dele
ed00: 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  te the underlyin
ed10: 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  g database file.
ed20: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
ed30: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
ed40: 73 20 64 62 5d 20 26 26 20 5b 63 61 74 63 68 20  s db] && [catch 
ed50: 7b 73 71 6c 20 63 6c 6f 73 65 20 24 64 62 7d 20  {sql close $db} 
ed60: 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a  error]} then {..
ed70: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
ed80: 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f     # NOTE: We so
ed90: 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f 20  mehow failed to 
eda0: 63 6c 6f 73 65 20 74 68 65 20 64 61 74 61 62 61  close the databa
edb0: 73 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d  se, report why..
edc0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
edd0: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
ede0: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
edf0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
ee00: 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
ee10: 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 63 6c  NG: failed to cl
ee20: 6f 73 65 20 64 61 74 61 62 61 73 65 20 5c 22 22  ose database \""
ee30: 20 24 64 62 20 22 5c 22 2c 20 65 72 72 6f 72 3a   $db "\", error:
ee40: 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
ee50: 20 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e    \n\t $error \n
ee60: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ]..      }....  
ee70: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
ee80: 4f 54 45 3a 20 46 69 72 73 74 2c 20 73 65 65 20  OTE: First, see 
ee90: 69 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 68 61  if our caller ha
eea0: 73 20 72 65 71 75 65 73 74 65 64 20 61 6e 20 69  s requested an i
eeb0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
eec0: 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
eed0: 20 20 20 73 65 74 20 69 73 4d 65 6d 6f 72 79 20     set isMemory 
eee0: 5b 69 73 4d 65 6d 6f 72 79 44 62 20 24 66 69 6c  [isMemoryDb $fil
eef0: 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  eName]....      
ef00: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
ef10: 20 42 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 20   Build the full 
ef20: 70 61 74 68 20 74 6f 20 74 68 65 20 64 61 74 61  path to the data
ef30: 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 2e 20  base file name. 
ef40: 20 46 6f 72 20 6e 6f 77 2c 20 61 6c 6c 20 74 65   For now, all te
ef50: 73 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  st..      #     
ef60: 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73    database files
ef70: 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74   are stored in t
ef80: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72  he temporary dir
ef90: 65 63 74 6f 72 79 2e 0d 0a 20 20 20 20 20 20 23  ectory...      #
efa0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 69 73  ..      if {!$is
efb0: 4d 65 6d 6f 72 79 20 26 26 20 24 71 75 61 6c 69  Memory && $quali
efc0: 66 79 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  fy} then {..    
efd0: 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65      set fileName
efe0: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74   [file join [get
eff0: 44 61 74 61 62 61 73 65 44 69 72 65 63 74 6f 72  DatabaseDirector
f000: 79 5d 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66  y] [file tail $f
f010: 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 20  ileName]]..     
f020: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
f030: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
f040: 63 6b 20 69 66 20 74 68 65 20 66 69 6c 65 20 73  ck if the file s
f050: 74 69 6c 6c 20 65 78 69 73 74 73 2e 0d 0a 20 20  till exists...  
f060: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
f070: 7b 21 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24  {!$isMemory && $
f080: 64 65 6c 65 74 65 20 26 26 20 5b 66 69 6c 65 20  delete && [file 
f090: 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65  exists $fileName
f0a0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
f0b0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
f0c0: 4e 4f 54 45 3a 20 53 6b 69 70 20 64 65 6c 65 74  NOTE: Skip delet
f0d0: 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
f0e0: 65 73 20 69 66 20 73 6f 6d 65 62 6f 64 79 20 73  es if somebody s
f0f0: 65 74 73 20 74 68 65 20 67 6c 6f 62 61 6c 0d 0a  ets the global..
f100: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
f110: 76 61 72 69 61 62 6c 65 20 74 6f 20 70 72 65 76  variable to prev
f120: 65 6e 74 20 69 74 2e 0d 0a 20 20 20 20 20 20 20  ent it...       
f130: 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
f140: 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
f150: 6e 6f 28 63 6c 65 61 6e 75 70 44 62 46 69 6c 65  no(cleanupDbFile
f160: 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
f170: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
f180: 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
f190: 70 74 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  pt to delete the
f1a0: 20 74 65 73 74 20 64 61 74 61 62 61 73 65 20 66   test database f
f1b0: 69 6c 65 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  ile now...      
f1c0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
f1d0: 20 69 66 20 7b 5b 73 65 74 20 63 6f 64 65 20 5b   if {[set code [
f1e0: 63 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65  catch {file dele
f1f0: 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d 20 65 72  te $fileName} er
f200: 72 6f 72 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ror]]} then {.. 
f210: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
f220: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
f230: 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69  : We somehow fai
f240: 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 74 68  led to delete th
f250: 65 20 66 69 6c 65 2c 20 72 65 70 6f 72 74 20 77  e file, report w
f260: 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  hy...           
f270: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
f280: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
f290: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
f2a0: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
f2b0: 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
f2c0: 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 64 65  NG: failed to de
f2d0: 6c 65 74 65 20 64 61 74 61 62 61 73 65 20 66 69  lete database fi
f2e0: 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65  le \"" $fileName
f2f0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
f300: 20 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63      "\" during c
f310: 6c 65 61 6e 75 70 2c 20 65 72 72 6f 72 3a 20 22  leanup, error: "
f320: 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d   \n\t $error \n]
f330: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
f340: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
f350: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
f360: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
f370: 53 68 6f 77 20 74 68 61 74 20 77 65 20 73 6b 69  Show that we ski
f380: 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20 74 68  pped deleting th
f390: 65 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20  e file...       
f3a0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
f3b0: 73 65 74 20 63 6f 64 65 20 30 0d 0a 0d 0a 20 20  set code 0....  
f3c0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
f3d0: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
f3e0: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
f3f0: 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
f400: 20 57 41 52 4e 49 4e 47 3a 20 73 6b 69 70 70 65   WARNING: skippe
f410: 64 20 64 65 6c 65 74 69 6e 67 20 64 61 74 61 62  d deleting datab
f420: 61 73 65 20 66 69 6c 65 20 5c 22 22 20 24 66 69  ase file \"" $fi
f430: 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  leName \..      
f440: 20 20 20 20 20 20 20 20 22 5c 22 20 64 75 72 69          "\" duri
f450: 6e 67 20 63 6c 65 61 6e 75 70 5c 6e 22 5d 0d 0a  ng cleanup\n"]..
f460: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
f470: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
f480: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
f490: 4e 4f 54 45 3a 20 54 68 65 20 66 69 6c 65 20 64  NOTE: The file d
f4a0: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 73  oes not exist, s
f4b0: 75 63 63 65 73 73 21 0d 0a 20 20 20 20 20 20 20  uccess!..       
f4c0: 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
f4d0: 63 6f 64 65 20 30 0d 0a 20 20 20 20 20 20 7d 0d  code 0..      }.
f4e0: 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
f4f0: 24 63 6f 64 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  $code..    }....
f500: 0a 20 20 20 20 70 72 6f 63 20 73 65 74 75 70 44  .    proc setupD
f510: 62 49 6e 74 65 72 72 75 70 74 43 61 6c 6c 62 61  bInterruptCallba
f520: 63 6b 20 7b 20 63 68 61 6e 6e 65 6c 20 6c 6f 67  ck { channel log
f530: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74   } {..      tput
f540: 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
f550: 20 73 65 74 74 69 6e 67 20 75 70 20 64 65 62 75   setting up debu
f560: 67 67 65 72 20 69 6e 74 65 72 72 75 70 74 20 63  gger interrupt c
f570: 61 6c 6c 62 61 63 6b 2e 2e 2e 20 22 0d 0a 0d 0a  allback... "....
f580: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
f590: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
f5a0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d         # NOTE: M
f5b0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 63 72  ake sure the scr
f5c0: 69 70 74 20 64 65 62 75 67 67 65 72 20 61 6e 64  ipt debugger and
f5d0: 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20 69 6e   the isolated in
f5e0: 74 65 72 70 72 65 74 65 72 20 61 72 65 0d 0a 20  terpreter are.. 
f5f0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73         #       s
f600: 65 74 75 70 20 61 6e 64 20 72 65 61 64 79 20 66  etup and ready f
f610: 6f 72 20 75 73 65 2e 0d 0a 20 20 20 20 20 20 20  or use...       
f620: 20 23 0d 0a 20 20 20 20 20 20 20 20 64 65 62 75   #..        debu
f630: 67 20 73 65 74 75 70 20 74 72 75 65 20 74 72 75  g setup true tru
f640: 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e....        #..
f650: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
f660: 4c 6f 61 64 20 74 68 65 20 6e 65 63 65 73 73 61  Load the necessa
f670: 72 79 20 70 61 63 6b 61 67 65 73 20 69 6e 74 6f  ry packages into
f680: 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20 69 6e   the isolated in
f690: 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20  terpreter...    
f6a0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 64      #..        d
f6b0: 65 62 75 67 20 65 76 61 6c 20 7b 0d 0a 20 20 20  ebug eval {..   
f6c0: 20 20 20 20 20 20 20 70 61 63 6b 61 67 65 20 72         package r
f6d0: 65 71 75 69 72 65 20 45 61 67 6c 65 0d 0a 20 20  equire Eagle..  
f6e0: 20 20 20 20 20 20 20 20 70 61 63 6b 61 67 65 20          package 
f6f0: 72 65 71 75 69 72 65 20 45 61 67 6c 65 2e 4c 69  require Eagle.Li
f700: 62 72 61 72 79 0d 0a 20 20 20 20 20 20 20 20 20  brary..         
f710: 20 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65   package require
f720: 20 45 61 67 6c 65 2e 54 65 73 74 0d 0a 20 20 20   Eagle.Test..   
f730: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
f740: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
f750: 4f 54 45 3a 20 43 6f 70 79 20 74 68 65 20 6e 65  OTE: Copy the ne
f760: 63 65 73 73 61 72 79 20 76 61 72 69 61 62 6c 65  cessary variable
f770: 73 20 69 6e 74 6f 20 74 68 65 20 69 73 6f 6c 61  s into the isola
f780: 74 65 64 20 69 6e 74 65 72 70 72 65 74 65 72 2e  ted interpreter.
f790: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
f7a0: 20 20 20 20 20 64 65 62 75 67 20 69 6e 76 6f 6b       debug invok
f7b0: 65 20 30 20 73 65 74 20 3a 3a 74 65 73 74 5f 63  e 0 set ::test_c
f7c0: 68 61 6e 6e 65 6c 20 24 63 68 61 6e 6e 65 6c 3b  hannel $channel;
f7d0: 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 5b 74 70   # NOTE: For [tp
f7e0: 75 74 73 5d 2e 0d 0a 20 20 20 20 20 20 20 20 64  uts]...        d
f7f0: 65 62 75 67 20 69 6e 76 6f 6b 65 20 30 20 73 65  ebug invoke 0 se
f800: 74 20 3a 3a 74 65 73 74 5f 6c 6f 67 20 24 6c 6f  t ::test_log $lo
f810: 67 3b 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 5b  g; # NOTE: For [
f820: 74 6c 6f 67 5d 2e 0d 0a 0d 0a 20 20 20 20 20 20  tlog].....      
f830: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
f840: 4f 54 45 3a 20 49 6e 73 74 61 6c 6c 20 74 68 65  OTE: Install the
f850: 20 63 61 6c 6c 62 61 63 6b 20 73 63 72 69 70 74   callback script
f860: 20 74 6f 20 62 65 20 65 76 61 6c 75 61 74 65 64   to be evaluated
f870: 20 69 6e 20 74 68 65 20 69 73 6f 6c 61 74 65 64   in the isolated
f880: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
f890: 20 20 69 6e 74 65 72 70 72 65 74 65 72 20 77 68    interpreter wh
f8a0: 65 6e 20 74 68 69 73 20 69 6e 74 65 72 70 72 65  en this interpre
f8b0: 74 65 72 20 69 73 20 69 6e 74 65 72 72 75 70 74  ter is interrupt
f8c0: 65 64 20 62 79 20 73 63 72 69 70 74 0d 0a 20 20  ed by script..  
f8d0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61        #       ca
f8e0: 6e 63 65 6c 6c 61 74 69 6f 6e 2c 20 65 74 63 2e  ncellation, etc.
f8f0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
f900: 20 20 20 20 20 64 65 62 75 67 20 63 61 6c 6c 62       debug callb
f910: 61 63 6b 20 61 70 70 6c 79 20 7b 7b 73 65 6e 64  ack apply {{send
f920: 65 72 20 65 7d 20 7b 0d 0a 20 20 20 20 20 20 20  er e} {..       
f930: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
f940: 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66  # NOTE: Check if
f950: 20 74 68 69 73 20 63 61 6c 6c 62 61 63 6b 20 69   this callback i
f960: 73 20 6f 6e 65 20 74 68 61 74 20 77 65 20 63 61  s one that we ca
f970: 72 65 20 61 62 6f 75 74 2e 0d 0a 20 20 20 20 20  re about...     
f980: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
f990: 20 20 69 66 20 7b 22 43 61 6e 63 65 6c 65 64 22    if {"Canceled"
f9a0: 20 69 6e 20 5b 73 70 6c 69 74 20 5b 24 65 20 49   in [split [$e I
f9b0: 6e 74 65 72 72 75 70 74 54 79 70 65 5d 20 22 2c  nterruptType] ",
f9c0: 20 22 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20   "]} then {..   
f9d0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
f9e0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
f9f0: 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  Iterate through 
fa00: 61 6c 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e  all database con
fa10: 6e 65 63 74 69 6f 6e 73 20 6b 6e 6f 77 6e 20 74  nections known t
fa20: 6f 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20  o the..         
fa30: 20 20 20 23 20 20 20 20 20 20 20 70 61 72 65 6e     #       paren
fa40: 74 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a  t interpreter...
fa50: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
fa60: 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63             objec
fa70: 74 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61 73  t foreach -alias
fa80: 20 70 61 69 72 20 5c 0d 0a 20 20 20 20 20 20 20   pair \..       
fa90: 20 20 20 20 20 20 20 20 20 5b 6f 62 6a 65 63 74           [object
faa0: 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
fab0: 4e 6f 6e 50 75 62 6c 69 63 20 24 65 20 49 6e 74  NonPublic $e Int
fac0: 65 72 70 72 65 74 65 72 2e 63 6f 6e 6e 65 63 74  erpreter.connect
fad0: 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20  ions] {..       
fae0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
faf0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
fb00: 41 74 74 65 6d 70 74 20 74 6f 20 63 61 6e 63 65  Attempt to cance
fb10: 6c 20 61 6e 79 20 53 51 4c 20 71 75 65 72 69 65  l any SQL querie
fb20: 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 6f 6e  s in progress on
fb30: 20 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20 20   this..         
fb40: 20 20 20 20 20 23 20 20 20 20 20 20 20 64 61 74       #       dat
fb50: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
fb60: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
fb70: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
fb80: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 24 70    if {[catch {$p
fb90: 61 69 72 20 56 61 6c 75 65 2e 43 61 6e 63 65 6c  air Value.Cancel
fba0: 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b  } error]} then {
fbb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
fbc0: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
fbd0: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
fbe0: 72 67 73 20 5c 6e 20 5c 0d 0a 20 20 20 20 20 20  rgs \n \..      
fbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
fc00: 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
fc10: 6c 65 64 20 74 6f 20 63 61 6e 63 65 6c 20 71 75  led to cancel qu
fc20: 65 72 79 20 66 6f 72 20 63 6f 6e 6e 65 63 74 69  ery for connecti
fc30: 6f 6e 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  on \"" \..      
fc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 24                [$
fc50: 70 61 69 72 20 4b 65 79 5d 20 22 5c 22 2c 20 65  pair Key] "\", e
fc60: 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72  rror: " \n\t $er
fc70: 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ror \n]..       
fc80: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
fc90: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
fca0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 7d     }..        }}
fcb0: 0d 0a 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d  ..      } error]
fcc0: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
fcd0: 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
fce0: 61 69 6e 74 20 69 6e 74 65 72 72 75 70 74 43 61  aint interruptCa
fcf0: 6c 6c 62 61 63 6b 2e 73 71 6c 69 74 65 33 0d 0a  llback.sqlite3..
fd00: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
fd10: 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a  $channel yes\n..
fd20: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
fd30: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
fd40: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
fd50: 67 73 20 22 6e 6f 2c 20 65 72 72 6f 72 3a 20 22  gs "no, error: "
fd60: 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d   \n\t $error \n]
fd70: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
fd80: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 6c  .....    proc cl
fd90: 65 61 6e 75 70 46 69 6c 65 20 7b 20 66 69 6c 65  eanupFile { file
fda0: 4e 61 6d 65 20 7b 63 6f 6c 6c 65 63 74 20 74 72  Name {collect tr
fdb0: 75 65 7d 20 7b 66 6f 72 63 65 20 66 61 6c 73 65  ue} {force false
fdc0: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
fdd0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74        # NOTE: At
fde0: 74 65 6d 70 74 20 74 6f 20 66 6f 72 63 65 20 61  tempt to force a
fdf0: 6c 6c 20 70 65 6e 64 69 6e 67 20 22 67 61 72 62  ll pending "garb
fe00: 61 67 65 22 20 6f 62 6a 65 63 74 73 20 74 6f 20  age" objects to 
fe10: 62 65 20 63 6f 6c 6c 65 63 74 65 64 2c 0d 0a 20  be collected,.. 
fe20: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 63       #       inc
fe30: 6c 75 64 69 6e 67 20 53 51 4c 69 74 65 20 73 74  luding SQLite st
fe40: 61 74 65 6d 65 6e 74 73 20 61 6e 64 20 62 61 63  atements and bac
fe50: 6b 75 70 20 6f 62 6a 65 63 74 73 3b 20 74 68 69  kup objects; thi
fe60: 73 20 73 68 6f 75 6c 64 20 61 6c 6c 6f 77 0d 0a  s should allow..
fe70: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
fe80: 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
fe90: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 62 65  abase file to be
fea0: 20 64 65 6c 65 74 65 64 2e 0d 0a 20 20 20 20 20   deleted...     
feb0: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 63   #..      if {$c
fec0: 6f 6c 6c 65 63 74 7d 20 74 68 65 6e 20 7b 0d 0a  ollect} then {..
fed0: 20 20 20 20 20 20 20 20 63 6f 6c 6c 65 63 74 47          collectG
fee0: 61 72 62 61 67 65 20 24 3a 3a 74 65 73 74 5f 63  arbage $::test_c
fef0: 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20 20 7d 0d  hannel..      }.
ff00: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
ff10: 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
ff20: 69 66 20 74 68 65 20 66 69 6c 65 20 73 74 69 6c  if the file stil
ff30: 6c 20 65 78 69 73 74 73 2e 0d 0a 20 20 20 20 20  l exists...     
ff40: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 66   #..      if {[f
ff50: 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65  ile exists $file
ff60: 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
ff70: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
ff80: 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 64    # NOTE: Skip d
ff90: 65 6c 65 74 69 6e 67 20 74 65 73 74 20 66 69 6c  eleting test fil
ffa0: 65 73 20 69 66 20 73 6f 6d 65 62 6f 64 79 20 73  es if somebody s
ffb0: 65 74 73 20 74 68 65 20 67 6c 6f 62 61 6c 20 76  ets the global v
ffc0: 61 72 69 61 62 6c 65 0d 0a 20 20 20 20 20 20 20  ariable..       
ffd0: 20 23 20 20 20 20 20 20 20 74 6f 20 70 72 65 76   #       to prev
ffe0: 65 6e 74 20 69 74 2e 0d 0a 20 20 20 20 20 20 20  ent it...       
fff0: 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
10000 24 66 6f 72 63 65 20 7c 7c 20 21 5b 69 6e 66 6f  $force || ![info
10010 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6c 65   exists ::no(cle
10020 61 6e 75 70 46 69 6c 65 29 5d 7d 20 74 68 65 6e  anupFile)]} then
10030 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
10040 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
10050 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65  E: Attempt to de
10060 6c 65 74 65 20 74 68 65 20 74 65 73 74 20 66 69  lete the test fi
10070 6c 65 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20  le now...       
10080 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
10090 69 66 20 7b 5b 73 65 74 20 63 6f 64 65 20 5b 63  if {[set code [c
100a0 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74  atch {file delet
100b0 65 20 24 66 69 6c 65 4e 61 6d 65 7d 20 65 72 72  e $fileName} err
100c0 6f 72 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  or]]} then {..  
100d0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
100e0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
100f0 20 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c   We somehow fail
10100 65 64 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  ed to delete the
10110 20 66 69 6c 65 2c 20 72 65 70 6f 72 74 20 77 68   file, report wh
10120 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y...            
10130 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  #..            t
10140 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
10150 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
10160 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
10170 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
10180 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c  G: failed to del
10190 65 74 65 20 74 65 73 74 20 66 69 6c 65 20 5c 22  ete test file \"
101a0 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  " $fileName \.. 
101b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
101c0 5c 22 20 64 75 72 69 6e 67 20 63 6c 65 61 6e 75  \" during cleanu
101d0 70 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  p, error: " \n\t
101e0 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20   $error \n]..   
101f0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
10200 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
10210 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
10220 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20     # NOTE: Show 
10230 74 68 61 74 20 77 65 20 73 6b 69 70 70 65 64 20  that we skipped 
10240 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c  deleting the fil
10250 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  e...          #.
10260 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 63  .          set c
10270 6f 64 65 20 30 0d 0a 0d 0a 20 20 20 20 20 20 20  ode 0....       
10280 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
10290 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
102a0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
102b0 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
102c0 49 4e 47 3a 20 73 6b 69 70 70 65 64 20 64 65 6c  ING: skipped del
102d0 65 74 69 6e 67 20 74 65 73 74 20 66 69 6c 65 20  eting test file 
102e0 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d  \"" $fileName \.
102f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
10300 5c 22 20 64 75 72 69 6e 67 20 63 6c 65 61 6e 75  \" during cleanu
10310 70 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d  p\n"]..        }
10320 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
10330 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
10340 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
10350 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65   file does not e
10360 78 69 73 74 2c 20 73 75 63 63 65 73 73 21 0d 0a  xist, success!..
10370 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
10380 20 20 20 73 65 74 20 63 6f 64 65 20 30 0d 0a 20     set code 0.. 
10390 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
103a0 72 65 74 75 72 6e 20 24 63 6f 64 65 0d 0a 20 20  return $code..  
103b0 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
103c0 20 63 6f 6c 6c 65 63 74 47 61 72 62 61 67 65 20   collectGarbage 
103d0 7b 20 63 68 61 6e 6e 65 6c 20 7b 6d 69 6c 6c 69  { channel {milli
103e0 73 65 63 6f 6e 64 73 20 31 30 30 30 7d 20 7b 71  seconds 1000} {q
103f0 75 69 65 74 20 74 72 75 65 7d 20 7d 20 7b 0d 0a  uiet true} } {..
10400 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
10410 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   {object invoke 
10420 47 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72  GC GetTotalMemor
10430 79 20 66 61 6c 73 65 7d 20 72 65 73 75 6c 74 5d  y false} result]
10440 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
10450 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
10460 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
10470 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
10480 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
10490 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
104a0 20 20 22 2d 2d 2d 2d 20 6d 65 6d 6f 72 79 20 69    "---- memory i
104b0 6e 20 75 73 65 20 62 79 20 74 68 65 20 43 4c 52  n use by the CLR
104c0 20 62 65 66 6f 72 65 20 63 6f 6c 6c 65 63 74 69   before collecti
104d0 6f 6e 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20  on... " \..     
104e0 20 20 20 20 20 20 20 20 20 24 72 65 73 75 6c 74           $result
104f0 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20   " bytes\n"]..  
10500 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
10510 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
10520 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
10530 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
10540 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
10550 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
10560 20 74 6f 20 67 65 74 20 43 4c 52 20 6d 65 6d 6f   to get CLR memo
10570 72 79 20 75 73 61 67 65 2c 20 65 72 72 6f 72 3a  ry usage, error:
10580 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
10590 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c    \n\t $result \
105a0 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  n]..      }.... 
105b0 20 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23       ###########
105c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
105d0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
105e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
105f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
10600 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
10610 20 23 20 4e 4f 54 45 3a 20 52 65 70 65 61 74 65   # NOTE: Repeate
10620 64 6c 79 20 61 74 74 65 6d 70 74 20 74 6f 20 63  dly attempt to c
10630 6f 6c 6c 65 63 74 20 67 61 72 62 61 67 65 20 75  ollect garbage u
10640 6e 74 69 6c 20 74 68 65 20 61 6c 6c 6f 74 74 65  ntil the allotte
10650 64 20 6e 75 6d 62 65 72 0d 0a 20 20 20 20 20 20  d number..      
10660 23 20 20 20 20 20 20 20 6f 66 20 6d 69 6c 6c 69  #       of milli
10670 73 65 63 6f 6e 64 73 20 68 61 73 20 65 6c 61 70  seconds has elap
10680 73 65 64 2e 20 20 41 6c 77 61 79 73 20 61 74 74  sed.  Always att
10690 65 6d 70 74 20 74 6f 20 63 6f 6c 6c 65 63 74 20  empt to collect 
106a0 67 61 72 62 61 67 65 0d 0a 20 20 20 20 20 20 23  garbage..      #
106b0 20 20 20 20 20 20 20 61 74 20 6c 65 61 73 74 20         at least 
106c0 6f 6e 63 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  once...      #..
106d0 20 20 20 20 20 20 73 65 74 20 73 74 61 72 74 20        set start 
106e0 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 0d  [clock seconds].
106f0 0a 20 20 20 20 20 20 73 65 74 20 73 74 6f 70 20  .      set stop 
10700 5b 65 78 70 72 20 7b 24 73 74 61 72 74 20 2b 20  [expr {$start + 
10710 28 24 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 2f  ($milliseconds /
10720 20 31 30 30 30 29 7d 5d 0d 0a 0d 0a 20 20 20 20   1000)}]....    
10730 20 20 64 6f 20 7b 0d 0a 20 20 20 20 20 20 20 20    do {..        
10740 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
10750 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 66 6f  E: Attempt to fo
10760 72 63 65 20 61 20 66 75 6c 6c 20 67 61 72 62 61  rce a full garba
10770 67 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 6e 6f  ge collection no
10780 77 2e 20 20 52 65 70 6f 72 74 20 61 6e 79 0d 0a  w.  Report any..
10790 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
107a0 65 72 72 6f 72 20 74 68 61 74 20 69 73 20 65 6e  error that is en
107b0 63 6f 75 6e 74 65 72 65 64 20 69 66 20 77 65 20  countered if we 
107c0 66 61 69 6c 2e 0d 0a 20 20 20 20 20 20 20 20 23  fail...        #
107d0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
107e0 61 74 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76  atch {object inv
107f0 6f 6b 65 20 47 43 20 47 65 74 54 6f 74 61 6c 4d  oke GC GetTotalM
10800 65 6d 6f 72 79 20 74 72 75 65 7d 20 65 72 72 6f  emory true} erro
10810 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  r]} then {..    
10820 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
10830 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
10840 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
10850 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
10860 20 66 61 69 6c 65 64 20 66 75 6c 6c 20 67 61 72   failed full gar
10870 62 61 67 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 2c  bage collection,
10880 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20   error: " \..   
10890 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20             \n\t 
108a0 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20  $error \n]..    
108b0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
108c0 20 73 65 74 20 6e 6f 77 20 5b 63 6c 6f 63 6b 20   set now [clock 
108d0 73 65 63 6f 6e 64 73 5d 0d 0a 20 20 20 20 20 20  seconds]..      
108e0 7d 20 77 68 69 6c 65 20 7b 24 73 74 61 72 74 20  } while {$start 
108f0 3c 3d 20 24 6e 6f 77 20 26 26 20 24 6e 6f 77 20  <= $now && $now 
10900 3c 20 24 73 74 6f 70 7d 0d 0a 0d 0a 20 20 20 20  < $stop}....    
10910 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
10920 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
10930 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
10940 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
10950 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20  ###########.... 
10960 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
10970 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47  {object invoke G
10980 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79  C GetTotalMemory
10990 20 66 61 6c 73 65 7d 20 72 65 73 75 6c 74 5d 20   false} result] 
109a0 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
109b0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
109c0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
109d0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
109e0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
109f0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
10a00 20 22 2d 2d 2d 2d 20 6d 65 6d 6f 72 79 20 69 6e   "---- memory in
10a10 20 75 73 65 20 62 79 20 74 68 65 20 43 4c 52 20   use by the CLR 
10a20 61 66 74 65 72 20 63 6f 6c 6c 65 63 74 69 6f 6e  after collection
10a30 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  ... " \..       
10a40 20 20 20 20 20 20 20 24 72 65 73 75 6c 74 20 22         $result "
10a50 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20   bytes\n"]..    
10a60 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65      }..      } e
10a70 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
10a80 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
10a90 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
10aa0 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
10ab0 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
10ac0 6f 20 67 65 74 20 43 4c 52 20 6d 65 6d 6f 72 79  o get CLR memory
10ad0 20 75 73 61 67 65 2c 20 65 72 72 6f 72 3a 20 22   usage, error: "
10ae0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
10af0 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d  \n\t $result \n]
10b00 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
10b10 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
10b20 74 53 51 4c 69 74 65 48 61 6e 64 6c 65 43 6f 75  tSQLiteHandleCou
10b30 6e 74 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 71  nts { channel {q
10b40 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  uiet false} } {.
10b50 0a 20 20 20 20 20 20 73 65 74 20 72 65 73 75 6c  .      set resul
10b60 74 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20  t [list]....    
10b70 20 20 69 66 20 7b 5b 68 61 76 65 43 6f 6e 73 74    if {[haveConst
10b80 72 61 69 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20  raint \..       
10b90 20 20 20 20 20 20 20 64 65 66 69 6e 65 43 6f 6e         defineCon
10ba0 73 74 61 6e 74 2e 53 79 73 74 65 6d 2e 44 61 74  stant.System.Dat
10bb0 61 2e 53 51 4c 69 74 65 2e 43 4f 55 4e 54 5f 48  a.SQLite.COUNT_H
10bc0 41 4e 44 4c 45 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ANDLE]} then {..
10bd0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
10be0 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 65     # NOTE: Add e
10bf0 61 63 68 20 63 72 69 74 69 63 61 6c 20 68 61 6e  ach critical han
10c00 64 6c 65 20 63 6f 75 6e 74 20 74 6f 20 74 68 65  dle count to the
10c10 20 72 65 73 75 6c 74 69 6e 67 20 6c 69 73 74 2e   resulting list.
10c20 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
10c30 20 20 20 20 20 66 6f 72 65 61 63 68 20 6e 61 6d       foreach nam
10c40 65 20 5b 6c 69 73 74 20 63 6f 6e 6e 65 63 74 69  e [list connecti
10c50 6f 6e 43 6f 75 6e 74 20 73 74 61 74 65 6d 65 6e  onCount statemen
10c60 74 43 6f 75 6e 74 20 62 61 63 6b 75 70 43 6f 75  tCount backupCou
10c70 6e 74 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  nt] {..         
10c80 20 73 65 74 20 76 61 6c 75 65 20 5b 6f 62 6a 65   set value [obje
10c90 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
10ca0 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
10cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
10cc0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
10cd0 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
10ce0 6f 64 73 20 24 6e 61 6d 65 5d 0d 0a 0d 0a 20 20  ods $name]....  
10cf0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
10d00 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
10d10 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
10d20 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
10d30 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
10d40 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 72 69         "---- cri
10d50 74 69 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75  tical handle cou
10d60 6e 74 20 5c 22 22 20 24 6e 61 6d 65 20 22 5c 22  nt \"" $name "\"
10d70 20 69 73 20 22 20 24 76 61 6c 75 65 20 5c 6e 5d   is " $value \n]
10d80 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
10d90 0a 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65  .          lappe
10da0 6e 64 20 72 65 73 75 6c 74 20 24 76 61 6c 75 65  nd result $value
10db0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
10dc0 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 21 24 71     } elseif {!$q
10dd0 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
10de0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
10df0 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 61 63 74   # NOTE: The act
10e00 75 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74  ual handle count
10e10 73 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61  s are not availa
10e20 62 6c 65 3b 20 74 68 65 72 65 66 6f 72 65 2c 20  ble; therefore, 
10e30 6a 75 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20  just..        # 
10e40 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 6e 20        return an 
10e50 65 6d 70 74 79 20 6c 69 73 74 2e 0d 0a 20 20 20  empty list...   
10e60 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
10e70 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
10e80 2d 2d 2d 2d 20 63 72 69 74 69 63 61 6c 20 68 61  ---- critical ha
10e90 6e 64 6c 65 20 63 6f 75 6e 74 73 20 75 6e 61 76  ndle counts unav
10ea0 61 69 6c 61 62 6c 65 5c 6e 22 0d 0a 20 20 20 20  ailable\n"..    
10eb0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74    }....      ret
10ec0 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20  urn $result..   
10ed0 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
10ee0 73 68 75 74 64 6f 77 6e 53 51 4c 69 74 65 20 7b  shutdownSQLite {
10ef0 20 63 68 61 6e 6e 65 6c 20 7b 66 6f 72 63 65 20   channel {force 
10f00 66 61 6c 73 65 7d 20 7b 71 75 69 65 74 20 66 61  false} {quiet fa
10f10 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  lse} } {..      
10f20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
10f30 20 4d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   Make sure that 
10f40 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72  SQLite core libr
10f50 61 72 79 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c  ary is completel
10f60 79 20 73 68 75 74 64 6f 77 6e 2e 20 20 54 68 69  y shutdown.  Thi
10f70 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
10f80 20 69 73 20 75 73 65 64 20 62 79 20 74 65 73 74   is used by test
10f90 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 63 6f  s that change co
10fa0 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69  nfiguration opti
10fb0 6f 6e 73 20 61 6e 64 2f 6f 72 20 74 68 6f 73 65  ons and/or those
10fc0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
10fd0 74 68 61 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b  that need to mak
10fe0 65 20 73 75 72 65 20 6c 6f 67 67 69 6e 67 20 69  e sure logging i
10ff0 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 28 69  s initialized (i
11000 2e 65 2e 20 6a 75 73 74 20 69 6e 20 63 61 73 65  .e. just in case
11010 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
11020 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20  the SQLite core 
11030 6c 69 62 72 61 72 79 20 77 61 73 20 69 6e 69 74  library was init
11040 69 61 6c 69 7a 65 64 20 69 6e 20 74 68 65 20 70  ialized in the p
11050 72 6f 63 65 73 73 20 70 72 69 6f 72 20 74 6f 0d  rocess prior to.
11060 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
11070 68 65 20 53 51 4c 69 74 65 4c 6f 67 20 63 6c 61  he SQLiteLog cla
11080 73 73 20 62 65 69 6e 67 20 61 62 6c 65 20 74 6f  ss being able to
11090 20 73 65 74 75 70 20 69 74 73 20 6c 6f 67 67 69   setup its loggi
110a0 6e 67 20 63 61 6c 6c 62 61 63 6b 29 2e 0d 0a 20  ng callback)... 
110b0 20 20 20 20 20 23 20 20 20 20 20 20 20 4e 6f 72       #       Nor
110c0 6d 61 6c 6c 79 2c 20 74 68 69 73 20 73 68 6f 75  mally, this shou
110d0 6c 64 20 6f 6e 6c 79 20 62 65 20 70 65 72 66 6f  ld only be perfo
110e0 72 6d 65 64 20 69 66 20 53 51 4c 69 74 65 20 69  rmed if SQLite i
110f0 73 20 6c 6f 61 64 65 64 20 61 6e 64 0d 0a 20 20  s loaded and..  
11100 20 20 20 20 23 20 20 20 20 20 20 20 72 65 61 64      #       read
11110 79 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65  y for use by the
11120 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20   test suite...  
11130 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
11140 7b 24 66 6f 72 63 65 20 7c 7c 20 5b 69 73 53 51  {$force || [isSQ
11150 4c 69 74 65 52 65 61 64 79 5d 7d 20 74 68 65 6e  LiteReady]} then
11160 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
11170 20 20 20 20 20 20 20 23 20 42 55 47 46 49 58 3a         # BUGFIX:
11180 20 42 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   Before calling 
11190 74 68 65 20 6e 61 74 69 76 65 20 73 68 75 74 64  the native shutd
111a0 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 2c 20 6d 61  own function, ma
111b0 6b 65 20 73 75 72 65 20 62 6f 74 68 0d 0a 20 20  ke sure both..  
111c0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
111d0 6f 66 20 74 68 65 20 50 52 41 47 4d 41 20 72 65  of the PRAGMA re
111e0 6c 61 74 65 64 20 64 69 72 65 63 74 6f 72 79 20  lated directory 
111f0 6e 61 6d 65 73 20 61 72 65 20 66 72 65 65 64 2e  names are freed.
11200 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
11210 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c       checkForSQL
11220 69 74 65 44 69 72 65 63 74 6f 72 69 65 73 20 24  iteDirectories $
11230 63 68 61 6e 6e 65 6c 20 74 72 75 65 0d 0a 0d 0a  channel true....
11240 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
11250 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b  ch {object invok
11260 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
11270 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
11280 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
11290 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65  ta.SQLite.Unsafe
112a0 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d  NativeMethods \.
112b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
112c0 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77   sqlite3_shutdow
112d0 6e 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d  n} result] == 0}
112e0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
112f0 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
11300 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
11310 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
11320 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
11330 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
11340 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c    "---- call sql
11350 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 2e  ite3_shutdown().
11360 2e 2e 20 6f 6b 3a 20 22 20 24 72 65 73 75 6c 74  .. ok: " $result
11370 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
11380 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  }..        } els
11390 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  e {..          i
113a0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
113b0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
113c0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
113d0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
113e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
113f0 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  --- call sqlite3
11400 5f 73 68 75 74 64 6f 77 6e 28 29 2e 2e 2e 20 65  _shutdown()... e
11410 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65  rror: " \n\t $re
11420 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  sult \n]..      
11430 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
11440 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
11450 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 65  .....    proc re
11460 70 6f 72 74 53 51 4c 69 74 65 52 65 73 6f 75 72  portSQLiteResour
11470 63 65 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 71  ces { channel {q
11480 75 69 65 74 20 66 61 6c 73 65 7d 20 7b 63 6f 6c  uiet false} {col
11490 6c 65 63 74 20 74 72 75 65 7d 20 7d 20 7b 0d 0a  lect true} } {..
114a0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
114b0 20 4e 4f 54 45 3a 20 53 6b 69 70 20 61 6c 6c 20   NOTE: Skip all 
114c0 6f 75 74 70 75 74 20 69 66 20 77 65 20 61 72 65  output if we are
114d0 20 72 75 6e 6e 69 6e 67 20 69 6e 20 22 71 75 69   running in "qui
114e0 65 74 22 20 6d 6f 64 65 2e 0d 0a 20 20 20 20 20  et" mode...     
114f0 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68   #..      if {[h
11500 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5c 0d  aveConstraint \.
11510 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  .              d
11520 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 2e 53 79  efineConstant.Sy
11530 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
11540 2e 49 4e 54 45 52 4f 50 5f 56 49 52 54 55 41 4c  .INTEROP_VIRTUAL
11550 5f 54 41 42 4c 45 5d 20 26 26 20 5c 0d 0a 20 20  _TABLE] && \..  
11560 20 20 20 20 20 20 20 20 5b 68 61 76 65 43 6f 6e          [haveCon
11570 73 74 72 61 69 6e 74 20 5c 0d 0a 20 20 20 20 20  straint \..     
11580 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 43           defineC
11590 6f 6e 73 74 61 6e 74 2e 53 79 73 74 65 6d 2e 44  onstant.System.D
115a0 61 74 61 2e 53 51 4c 69 74 65 2e 54 52 41 43 4b  ata.SQLite.TRACK
115b0 5f 4d 45 4d 4f 52 59 5f 42 59 54 45 53 5d 7d 20  _MEMORY_BYTES]} 
115c0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
115d0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
115e0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
115f0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
11600 2d 2d 2d 20 63 75 72 72 65 6e 74 20 6d 65 6d 6f  --- current memo
11610 72 79 20 69 6e 20 75 73 65 20 62 79 20 53 51 4c  ry in use by SQL
11620 69 74 65 4d 65 6d 6f 72 79 2e 2e 2e 20 22 0d 0a  iteMemory... "..
11630 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
11640 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
11650 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d  {object invoke -
11660 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
11670 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
11680 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
11690 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 4d 65 6d  SQLite.SQLiteMem
116a0 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ory \..         
116b0 20 20 20 20 20 20 20 62 79 74 65 73 41 6c 6c 6f         bytesAllo
116c0 63 61 74 65 64 7d 20 6d 65 6d 6f 72 79 5d 20 3d  cated} memory] =
116d0 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
116e0 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
116f0 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
11700 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
11710 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
11720 67 73 20 24 6d 65 6d 6f 72 79 20 22 20 62 79 74  gs $memory " byt
11730 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  es\n"]..        
11740 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65    }..        } e
11750 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
11760 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e   set memory unkn
11770 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  own....         
11780 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
11790 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
117a0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
117b0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65   [appendArgs $me
117c0 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  mory \n]..      
117d0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
117e0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
117f0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
11800 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
11810 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
11820 6d 61 78 69 6d 75 6d 20 6d 65 6d 6f 72 79 20 69  maximum memory i
11830 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74 65 4d  n use by SQLiteM
11840 65 6d 6f 72 79 2e 2e 2e 20 22 0d 0a 20 20 20 20  emory... "..    
11850 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
11860 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a   if {[catch {obj
11870 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
11880 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
11890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118a0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
118b0 74 65 2e 53 51 4c 69 74 65 4d 65 6d 6f 72 79 20  te.SQLiteMemory 
118c0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
118d0 20 20 20 6d 61 78 69 6d 75 6d 42 79 74 65 73 41     maximumBytesA
118e0 6c 6c 6f 63 61 74 65 64 7d 20 6d 65 6d 6f 72 79  llocated} memory
118f0 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
11900 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
11910 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
11920 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
11930 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
11940 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20  dArgs $memory " 
11950 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20  bytes\n"]..     
11960 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
11970 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
11980 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75      set memory u
11990 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20  nknown....      
119a0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
119b0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
119c0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
119d0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
119e0 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20  $memory \n]..   
119f0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
11a00 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
11a10 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
11a20 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
11a30 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
11a40 6c 20 22 2d 2d 2d 2d 20 63 75 72 72 65 6e 74 20  l "---- current 
11a50 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79  memory in use by
11a60 20 53 51 4c 69 74 65 2e 2e 2e 20 22 0d 0a 20 20   SQLite... "..  
11a70 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69      }....      i
11a80 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63  f {[catch {objec
11a90 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
11aa0 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
11ab0 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
11ac0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55  em.Data.SQLite.U
11ad0 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
11ae0 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ds \..          
11af0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f      sqlite3_memo
11b00 72 79 5f 75 73 65 64 7d 20 6d 65 6d 6f 72 79 5d  ry_used} memory]
11b10 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
11b20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
11b30 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
11b40 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
11b50 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
11b60 20 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65 73   $memory " bytes
11b70 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d  \n"]..        }.
11b80 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
11b90 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
11ba0 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 79 62      # NOTE: Mayb
11bb0 65 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72  e the SQLite cor
11bc0 65 20 6c 69 62 72 61 72 79 20 69 73 20 75 6e 61  e library is una
11bd0 76 61 69 6c 61 62 6c 65 3f 0d 0a 20 20 20 20 20  vailable?..     
11be0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65     #..        se
11bf0 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e  t memory unknown
11c00 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
11c10 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
11c20 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
11c30 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
11c40 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e  dArgs $memory \n
11c50 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
11c60 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73      }....      s
11c70 65 74 20 72 65 73 75 6c 74 20 24 6d 65 6d 6f 72  et result $memor
11c80 79 3b 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72  y; # NOTE: Retur
11c90 6e 20 6d 65 6d 6f 72 79 20 69 6e 2d 75 73 65 20  n memory in-use 
11ca0 74 6f 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a  to our caller...
11cb0 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71 75  ..      if {!$qu
11cc0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
11cd0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
11ce0 6e 65 6c 20 22 2d 2d 2d 2d 20 6d 61 78 69 6d 75  nel "---- maximu
11cf0 6d 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20  m memory in use 
11d00 62 79 20 53 51 4c 69 74 65 2e 2e 2e 20 22 0d 0a  by SQLite... "..
11d10 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
11d20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a   if {[catch {obj
11d30 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
11d40 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
11d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
11d60 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
11d70 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74  .UnsafeNativeMet
11d80 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  hods \..        
11d90 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 65        sqlite3_me
11da0 6d 6f 72 79 5f 68 69 67 68 77 61 74 65 72 20 30  mory_highwater 0
11db0 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20  } memory] == 0} 
11dc0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
11dd0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
11de0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
11df0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
11e00 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72  ppendArgs $memor
11e10 79 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20  y " bytes\n"].. 
11e20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
11e30 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
11e40 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
11e50 4f 54 45 3a 20 4d 61 79 62 65 20 74 68 65 20 53  OTE: Maybe the S
11e60 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61  QLite core libra
11e70 72 79 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c  ry is unavailabl
11e80 65 3f 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e?..        #.. 
11e90 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72         set memor
11ea0 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20  y unknown....   
11eb0 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
11ec0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
11ed0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
11ee0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  el [appendArgs $
11ef0 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20  memory \n]..    
11f00 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
11f10 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 63 6f 6c  ..      if {$col
11f20 6c 65 63 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  lect} then {..  
11f30 20 20 20 20 20 20 63 6f 6c 6c 65 63 74 47 61 72        collectGar
11f40 62 61 67 65 20 24 63 68 61 6e 6e 65 6c 0d 0a 20  bage $channel.. 
11f50 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
11f60 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
11f70 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  n {..        tpu
11f80 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  ts $channel "---
11f90 2d 20 63 75 72 72 65 6e 74 20 6d 65 6d 6f 72 79  - current memory
11fa0 20 69 6e 20 75 73 65 20 62 79 20 74 68 65 20 43   in use by the C
11fb0 4c 52 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 7d  LR... "..      }
11fc0 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63  ....      if {[c
11fd0 61 74 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76  atch {object inv
11fe0 6f 6b 65 20 47 43 20 47 65 74 54 6f 74 61 6c 4d  oke GC GetTotalM
11ff0 65 6d 6f 72 79 20 66 61 6c 73 65 7d 20 6d 65 6d  emory false} mem
12000 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ory] == 0} then 
12010 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  {..        if {[
12020 73 74 72 69 6e 67 20 69 73 20 69 6e 74 65 67 65  string is intege
12030 72 20 2d 73 74 72 69 63 74 20 24 6d 65 6d 6f 72  r -strict $memor
12040 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  y]} then {..    
12050 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
12060 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
12070 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
12080 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
12090 73 20 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65  s $memory " byte
120a0 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  s\n"]..         
120b0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c   }..        } el
120c0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
120d0 73 65 74 20 6d 65 6d 6f 72 79 20 69 6e 76 61 6c  set memory inval
120e0 69 64 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  id....          
120f0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
12100 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
12110 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
12120 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d  [appendArgs $mem
12130 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ory \n]..       
12140 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
12150 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
12160 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d  .        set mem
12170 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20  ory unknown.... 
12180 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
12190 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
121a0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
121b0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
121c0 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20   $memory \n]..  
121d0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
121e0 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ....      return
121f0 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d   $result..    }.
12200 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65  ....    proc che
12210 63 6b 46 6f 72 53 51 4c 69 74 65 44 69 72 65 63  ckForSQLiteDirec
12220 74 6f 72 69 65 73 20 7b 20 63 68 61 6e 6e 65 6c  tories { channel
12230 20 7b 72 65 73 65 74 20 66 61 6c 73 65 7d 20 7d   {reset false} }
12240 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
12250 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
12260 20 69 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   if the sqlite3_
12270 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
12280 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  ory function is 
12290 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20  available...    
122a0 20 20 23 0d 0a 20 20 20 20 20 20 74 70 75 74 73    #..      tputs
122b0 20 24 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20   $channel \..   
122c0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65         "---- che
122d0 63 6b 69 6e 67 20 66 6f 72 20 66 75 6e 63 74 69  cking for functi
122e0 6f 6e 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  on sqlite3_win32
122f0 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 2e 2e  _set_directory..
12300 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  . "....      #..
12310 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
12320 69 73 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 73  is call to the s
12330 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
12340 5f 64 69 72 65 63 74 6f 72 79 20 66 75 6e 63 74  _directory funct
12350 69 6f 6e 20 75 73 65 73 20 74 68 65 0d 0a 20 20  ion uses the..  
12360 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 76 61      #       inva
12370 6c 69 64 20 76 61 6c 75 65 20 30 20 66 6f 72 20  lid value 0 for 
12380 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
12390 6e 74 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69  nt.  This code i
123a0 73 20 64 65 73 69 67 6e 65 64 0d 0a 20 20 20 20  s designed..    
123b0 20 20 23 20 20 20 20 20 20 20 74 6f 20 63 68 65    #       to che
123c0 63 6b 20 69 66 20 63 61 6c 6c 69 6e 67 20 74 68  ck if calling th
123d0 65 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  e function will 
123e0 72 61 69 73 65 20 61 6e 20 65 78 63 65 70 74 69  raise an excepti
123f0 6f 6e 20 28 69 2e 65 2e 0d 0a 20 20 20 20 20 20  on (i.e...      
12400 23 20 20 20 20 20 20 20 74 68 65 20 61 63 74 75  #       the actu
12410 61 6c 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  al result of the
12420 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
12430 6f 74 20 6d 61 74 74 65 72 20 61 73 20 6c 6f 6e  ot matter as lon
12440 67 20 61 73 20 6e 6f 0d 0a 20 20 20 20 20 20 23  g as no..      #
12450 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79         directory
12460 20 69 73 20 63 68 61 6e 67 65 64 29 2e 0d 0a 20   is changed)... 
12470 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
12480 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
12490 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
124a0 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
124b0 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
124c0 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
124d0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e  m.Data.SQLite.Un
124e0 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
124f0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
12500 20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32     sqlite3_win32
12510 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 30  _set_directory 0
12520 20 6e 75 6c 6c 7d 5d 20 3d 3d 20 30 7d 20 74 68   null}] == 0} th
12530 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
12540 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
12550 20 43 61 6c 6c 69 6e 67 20 74 68 65 20 73 71 6c   Calling the sql
12560 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
12570 69 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f  irectory functio
12580 6e 20 64 6f 65 73 20 6e 6f 74 0d 0a 20 20 20 20  n does not..    
12590 20 20 20 20 23 20 20 20 20 20 20 20 63 61 75 73      #       caus
125a0 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 3b 20  e an exception; 
125b0 74 68 65 72 65 66 6f 72 65 2c 20 69 74 20 6d 75  therefore, it mu
125c0 73 74 20 62 65 20 61 76 61 69 6c 61 62 6c 65 20  st be available 
125d0 28 69 2e 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  (i.e...        #
125e0 20 20 20 20 20 20 20 65 76 65 6e 20 74 68 6f 75         even thou
125f0 67 68 20 69 74 20 73 68 6f 75 6c 64 20 72 65 74  gh it should ret
12600 75 72 6e 20 61 20 66 61 69 6c 75 72 65 20 72 65  urn a failure re
12610 74 75 72 6e 20 63 6f 64 65 20 69 6e 20 74 68 69  turn code in thi
12620 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  s..        #    
12630 20 20 20 63 61 73 65 29 2e 0d 0a 20 20 20 20 20     case)...     
12640 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64     #..        ad
12650 64 43 6f 6e 73 74 72 61 69 6e 74 20 73 71 6c 69  dConstraint sqli
12660 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69  te3_win32_set_di
12670 72 65 63 74 6f 72 79 0d 0a 0d 0a 20 20 20 20 20  rectory....     
12680 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
12690 6c 20 79 65 73 5c 6e 0d 0a 0d 0a 20 20 20 20 20  l yes\n....     
126a0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
126b0 4e 4f 54 45 3a 20 44 6f 65 73 20 6f 75 72 20 63  NOTE: Does our c
126c0 61 6c 6c 65 72 20 77 61 6e 74 20 74 6f 20 72 65  aller want to re
126d0 73 65 74 20 74 68 65 20 64 69 72 65 63 74 6f 72  set the director
126e0 69 65 73 3f 0d 0a 20 20 20 20 20 20 20 20 23 0d  ies?..        #.
126f0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 72 65  .        if {$re
12700 73 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  set} then {..   
12710 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
12720 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 20      # NOTE: Now 
12730 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 64 61  make sure the da
12740 74 61 62 61 73 65 20 61 6e 64 20 74 65 6d 70 6f  tabase and tempo
12750 72 61 72 79 20 64 69 72 65 63 74 6f 72 69 65 73  rary directories
12760 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20   are..          
12770 23 20 20 20 20 20 20 20 72 65 73 65 74 20 74 68  #       reset th
12780 65 69 72 20 64 65 66 61 75 6c 74 20 76 61 6c 75  eir default valu
12790 65 73 2c 20 77 68 69 63 68 20 73 68 6f 75 6c 64  es, which should
127a0 20 62 65 20 6e 75 6c 6c 20 66 6f 72 20 62 6f 74   be null for bot
127b0 68 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  h...          # 
127c0 20 20 20 20 20 20 53 69 6e 63 65 20 74 68 65 20        Since the 
127d0 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
127e0 74 5f 64 69 72 65 63 74 6f 72 79 20 66 75 6e 63  t_directory func
127f0 74 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c  tion is availabl
12800 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  e,..          # 
12810 20 20 20 20 20 20 75 73 65 20 69 74 2e 0d 0a 20        use it... 
12820 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
12830 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69        for {set i
12840 6e 64 65 78 20 31 7d 20 7b 24 69 6e 64 65 78 20  ndex 1} {$index 
12850 3c 20 33 7d 20 7b 69 6e 63 72 20 69 6e 64 65 78  < 3} {incr index
12860 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  } {..           
12870 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
12880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12890 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
128a0 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
128b0 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
128c0 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
128d0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73  .Data.SQLite.Uns
128e0 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
128f0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
12900 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
12910 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
12920 6f 72 79 20 24 69 6e 64 65 78 20 6e 75 6c 6c 7d  ory $index null}
12930 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
12940 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 5d 20          result] 
12950 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
12960 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
12970 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
12980 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
12990 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
129a0 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 77  - call sqlite3_w
129b0 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
129c0 72 79 28 22 20 24 69 6e 64 65 78 20 5c 0d 0a 20  ry(" $index \.. 
129d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129e0 20 22 2c 20 6e 75 6c 6c 29 2e 2e 2e 20 6f 6b 3a   ", null)... ok:
129f0 20 22 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a   " $result \n]..
12a00 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
12a10 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
12a20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
12a30 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
12a40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
12a50 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73      "---- call s
12a60 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
12a70 5f 64 69 72 65 63 74 6f 72 79 28 22 20 24 69 6e  _directory(" $in
12a80 64 65 78 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  dex \..         
12a90 20 20 20 20 20 20 20 20 20 22 2c 20 6e 75 6c 6c           ", null
12aa0 29 2e 2e 2e 20 65 72 72 6f 72 3a 20 22 20 5c 6e  )... error: " \n
12ab0 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a  \t $result \n]..
12ac0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
12ad0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
12ae0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65      }..      } e
12af0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
12b00 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
12b10 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  \n....        #.
12b20 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
12b30 20 44 6f 65 73 20 6f 75 72 20 63 61 6c 6c 65 72   Does our caller
12b40 20 77 61 6e 74 20 74 6f 20 72 65 73 65 74 20 74   want to reset t
12b50 68 65 20 64 69 72 65 63 74 6f 72 69 65 73 3f 20  he directories? 
12b60 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 0d 0a   This can only..
12b70 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
12b80 62 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20  be performed if 
12b90 53 51 4c 69 74 65 20 69 73 20 6c 6f 61 64 65 64  SQLite is loaded
12ba0 20 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20 75   and ready for u
12bb0 73 65 20 62 79 20 74 68 65 20 74 65 73 74 0d 0a  se by the test..
12bc0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
12bd0 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20  suite...        
12be0 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24  #..        if {$
12bf0 72 65 73 65 74 20 26 26 20 5b 69 73 53 51 4c 69  reset && [isSQLi
12c00 74 65 52 65 61 64 79 5d 7d 20 74 68 65 6e 20 7b  teReady]} then {
12c10 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
12c20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
12c30 20 4e 6f 77 20 6d 61 6b 65 20 73 75 72 65 20 74   Now make sure t
12c40 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
12c50 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
12c60 6f 72 69 65 73 20 61 72 65 0d 0a 20 20 20 20 20  ories are..     
12c70 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65 73       #       res
12c80 65 74 20 74 68 65 69 72 20 64 65 66 61 75 6c 74  et their default
12c90 20 76 61 6c 75 65 73 2c 20 77 68 69 63 68 20 73   values, which s
12ca0 68 6f 75 6c 64 20 62 65 20 6e 75 6c 6c 20 66 6f  hould be null fo
12cb0 72 20 62 6f 74 68 2e 0d 0a 20 20 20 20 20 20 20  r both...       
12cc0 20 20 20 23 20 20 20 20 20 20 20 53 69 6e 63 65     #       Since
12cd0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e   the sqlite3_win
12ce0 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79  32_set_directory
12cf0 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
12d00 6f 74 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  ot..          # 
12d10 20 20 20 20 20 20 61 70 70 65 61 72 20 74 6f 20        appear to 
12d20 62 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 75 73  be available, us
12d30 65 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  e the associated
12d40 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 73   PRAGMA commands
12d50 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
12d60 20 20 20 20 69 6e 73 74 65 61 64 2e 0d 0a 20 20      instead...  
12d70 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
12d80 20 20 20 20 20 66 6f 72 65 61 63 68 20 64 69 72       foreach dir
12d90 65 63 74 6f 72 79 20 5b 6c 69 73 74 20 64 61 74  ectory [list dat
12da0 61 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72  a_store_director
12db0 79 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72  y temp_store_dir
12dc0 65 63 74 6f 72 79 5d 20 7b 0d 0a 20 20 20 20 20  ectory] {..     
12dd0 20 20 20 20 20 20 20 73 65 74 20 73 71 6c 20 5b         set sql [
12de0 61 70 70 65 6e 64 41 72 67 73 20 22 50 52 41 47  appendArgs "PRAG
12df0 4d 41 20 22 20 24 64 69 72 65 63 74 6f 72 79 20  MA " $directory 
12e00 22 20 3d 20 5c 22 5c 22 3b 22 5d 0d 0a 0d 0a 20  " = \"\";"].... 
12e10 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
12e20 63 61 74 63 68 20 7b 65 78 65 63 75 74 65 53 71  catch {executeSq
12e30 6c 20 24 73 71 6c 7d 20 72 65 73 75 6c 74 5d 20  l $sql} result] 
12e40 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
12e50 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
12e60 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
12e70 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
12e80 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
12e90 2d 20 65 78 65 63 75 74 65 20 50 52 41 47 4d 41  - execute PRAGMA
12ea0 20 22 20 24 64 69 72 65 63 74 6f 72 79 20 22 2e   " $directory ".
12eb0 2e 2e 20 6f 6b 3a 20 5c 22 22 20 5c 0d 0a 20 20  .. ok: \"" \..  
12ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ed0 24 72 65 73 75 6c 74 20 5c 22 5c 6e 5d 0d 0a 20  $result \"\n].. 
12ee0 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
12ef0 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
12f00 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
12f10 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
12f20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12f30 20 20 20 22 2d 2d 2d 2d 20 65 78 65 63 75 74 65     "---- execute
12f40 20 50 52 41 47 4d 41 20 22 20 24 64 69 72 65 63   PRAGMA " $direc
12f50 74 6f 72 79 20 22 2e 2e 2e 20 65 72 72 6f 72 3a  tory "... error:
12f60 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
12f70 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65          \n\t $re
12f80 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  sult \n]..      
12f90 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
12fa0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
12fb0 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
12fc0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
12fd0 45 3a 20 46 69 6e 61 6c 6c 79 2c 20 73 68 6f 77  E: Finally, show
12fe0 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
12ff0 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ue of the databa
13000 73 65 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79  se and temporary
13010 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
13020 64 69 72 65 63 74 6f 72 69 65 73 2e 20 20 54 68  directories.  Th
13030 69 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 70  is can only be p
13040 65 72 66 6f 72 6d 65 64 20 69 66 20 53 51 4c 69  erformed if SQLi
13050 74 65 20 69 73 20 6c 6f 61 64 65 64 0d 0a 20 20  te is loaded..  
13060 20 20 20 20 23 20 20 20 20 20 20 20 61 6e 64 20      #       and 
13070 72 65 61 64 79 20 66 6f 72 20 75 73 65 20 62 79  ready for use by
13080 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e   the test suite.
13090 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
130a0 20 69 66 20 7b 5b 69 73 53 51 4c 69 74 65 52 65   if {[isSQLiteRe
130b0 61 64 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ady]} then {..  
130c0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 64 69        foreach di
130d0 72 65 63 74 6f 72 79 20 5b 6c 69 73 74 20 64 61  rectory [list da
130e0 74 61 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  ta_store_directo
130f0 72 79 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69  ry temp_store_di
13100 72 65 63 74 6f 72 79 5d 20 7b 0d 0a 20 20 20 20  rectory] {..    
13110 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
13120 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
13130 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20   "---- checking 
13140 22 20 24 64 69 72 65 63 74 6f 72 79 20 22 2e 2e  " $directory "..
13150 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  . "]....        
13160 20 20 73 65 74 20 73 71 6c 20 5b 61 70 70 65 6e    set sql [appen
13170 64 41 72 67 73 20 22 50 52 41 47 4d 41 20 22 20  dArgs "PRAGMA " 
13180 24 64 69 72 65 63 74 6f 72 79 20 5c 3b 5d 0d 0a  $directory \;]..
13190 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
131a0 5b 63 61 74 63 68 20 7b 65 78 65 63 75 74 65 53  [catch {executeS
131b0 71 6c 20 24 73 71 6c 20 73 63 61 6c 61 72 7d 20  ql $sql scalar} 
131c0 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68  result] == 0} th
131d0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
131e0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
131f0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 6f 6b   [appendArgs "ok
13200 3a 20 5c 22 22 20 24 72 65 73 75 6c 74 20 5c 22  : \"" $result \"
13210 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
13220 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
13230 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
13240 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
13250 22 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24  "error: " \n\t $
13260 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20  result \n]..    
13270 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
13280 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20   }..      }..   
13290 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
132a0 6c 6f 61 64 53 51 4c 69 74 65 54 65 73 74 53 65  loadSQLiteTestSe
132b0 74 74 69 6e 67 73 20 7b 20 63 68 61 6e 6e 65 6c  ttings { channel
132c0 20 7b 73 75 66 66 69 78 20 22 22 7d 20 7b 71 75   {suffix ""} {qu
132d0 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  iet false} } {..
132e0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
132f0 20 4e 4f 54 45 3a 20 53 6b 69 70 20 6c 6f 61 64   NOTE: Skip load
13300 69 6e 67 20 74 68 65 20 73 65 74 74 69 6e 67 73  ing the settings
13310 20 69 66 20 74 68 65 69 72 20 75 73 61 67 65 20   if their usage 
13320 68 61 73 20 62 65 65 6e 20 64 69 73 61 62 6c 65  has been disable
13330 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  d...      #..   
13340 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
13350 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65  ists ::no(sqlite
13360 54 65 73 74 53 65 74 74 69 6e 67 73 29 5d 7d 20  TestSettings)]} 
13370 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
13380 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
13390 45 3a 20 4c 6f 61 64 20 63 75 73 74 6f 6d 20 70  E: Load custom p
133a0 65 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20 70  er-user and/or p
133b0 65 72 2d 68 6f 73 74 20 74 65 73 74 20 73 65 74  er-host test set
133c0 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20 20 20  tings now...    
133d0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
133e0 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
133f0 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 75  ::tcl_platform(u
13400 73 65 72 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ser)]} then {.. 
13410 20 20 20 20 20 20 20 20 20 73 65 74 20 75 73 65           set use
13420 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d  rSettingsFileNam
13430 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65  e [file join [ge
13440 74 43 6f 6d 6d 6f 6e 44 69 72 65 63 74 6f 72 79  tCommonDirectory
13450 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ] \..           
13460 20 20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 73     [appendArgs s
13470 65 74 74 69 6e 67 73 20 24 73 75 66 66 69 78 20  ettings $suffix 
13480 2e 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72  . $::tcl_platfor
13490 6d 28 75 73 65 72 29 20 2e 65 61 67 6c 65 5d 5d  m(user) .eagle]]
134a0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
134b0 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24   {[file exists $
134c0 75 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65  userSettingsFile
134d0 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
134e0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
134f0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
13500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
13510 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
13520 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
13530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
13540 2d 2d 2d 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d  --- loading per-
13550 75 73 65 72 20 74 65 73 74 20 73 65 74 74 69 6e  user test settin
13560 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20  gs file \"" \.. 
13570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13580 20 24 75 73 65 72 53 65 74 74 69 6e 67 73 46 69   $userSettingsFi
13590 6c 65 4e 61 6d 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d  leName \"...\n].
135a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
135b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
135c0 20 7b 5b 63 61 74 63 68 20 7b 75 70 6c 65 76 65   {[catch {upleve
135d0 6c 20 31 20 5b 6c 69 73 74 20 73 6f 75 72 63 65  l 1 [list source
135e0 20 24 75 73 65 72 53 65 74 74 69 6e 67 73 46 69   $userSettingsFi
135f0 6c 65 4e 61 6d 65 5d 7d 20 5c 0d 0a 20 20 20 20  leName]} \..    
13600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13610 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a  error]} then {..
13620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
13630 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
13640 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
13650 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
13660 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
13670 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13680 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
13690 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 6c 6f  NG: failed to lo
136a0 61 64 20 70 65 72 2d 75 73 65 72 20 73 65 74 74  ad per-user sett
136b0 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d  ings file \"" \.
136c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
136d0 20 20 20 20 20 24 75 73 65 72 53 65 74 74 69 6e       $userSettin
136e0 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20  gsFileName "\", 
136f0 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65  error: " \n\t $e
13700 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  rror \n]..      
13710 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
13720 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
13730 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
13740 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
13750 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
13760 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
13770 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
13780 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
13790 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
137a0 2d 2d 20 73 6b 69 70 70 65 64 20 6c 6f 61 64 69  -- skipped loadi
137b0 6e 67 20 70 65 72 2d 75 73 65 72 20 74 65 73 74  ng per-user test
137c0 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c   settings file \
137d0 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
137e0 20 20 20 20 20 20 20 20 24 75 73 65 72 53 65 74          $userSet
137f0 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c  tingsFileName "\
13800 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65  ", it does not e
13810 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  xist\n"]..      
13820 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
13830 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
13840 0a 0d 0a 20 20 20 20 20 20 20 20 23 23 23 23 23  ...        #####
13850 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13860 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13870 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13880 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13890 23 23 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66  ##....        if
138a0 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
138b0 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 68 6f  :tcl_platform(ho
138c0 73 74 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  st)]} then {..  
138d0 20 20 20 20 20 20 20 20 73 65 74 20 68 6f 73 74          set host
138e0 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65  SettingsFileName
138f0 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74   [file join [get
13900 43 6f 6d 6d 6f 6e 44 69 72 65 63 74 6f 72 79 5d  CommonDirectory]
13910 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
13920 20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 73 65    [appendArgs se
13930 74 74 69 6e 67 73 20 24 73 75 66 66 69 78 20 2e  ttings $suffix .
13940 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d   $::tcl_platform
13950 28 68 6f 73 74 29 20 2e 65 61 67 6c 65 5d 5d 0d  (host) .eagle]].
13960 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
13970 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 68  {[file exists $h
13980 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e  ostSettingsFileN
13990 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
139a0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
139b0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
139c0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
139d0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
139e0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
139f0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
13a00 2d 2d 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d 68  -- loading per-h
13a10 6f 73 74 20 74 65 73 74 20 73 65 74 74 69 6e 67  ost test setting
13a20 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20  s file \"" \..  
13a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a40 24 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c  $hostSettingsFil
13a50 65 4e 61 6d 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a  eName \"...\n]..
13a60 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
13a70 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
13a80 7b 5b 63 61 74 63 68 20 7b 75 70 6c 65 76 65 6c  {[catch {uplevel
13a90 20 31 20 5b 6c 69 73 74 20 73 6f 75 72 63 65 20   1 [list source 
13aa0 24 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c  $hostSettingsFil
13ab0 65 4e 61 6d 65 5d 7d 20 5c 0d 0a 20 20 20 20 20  eName]} \..     
13ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
13ad0 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  rror]} then {.. 
13ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
13af0 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
13b00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
13b10 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
13b20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
13b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b40 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
13b50 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 6c 6f 61  G: failed to loa
13b60 64 20 70 65 72 2d 68 6f 73 74 20 73 65 74 74 69  d per-host setti
13b70 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a  ngs file \"" \..
13b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b90 20 20 20 20 24 68 6f 73 74 53 65 74 74 69 6e 67      $hostSetting
13ba0 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 65  sFileName "\", e
13bb0 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72  rror: " \n\t $er
13bc0 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ror \n]..       
13bd0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
13be0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
13bf0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
13c00 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
13c10 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
13c20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
13c30 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
13c40 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
13c50 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
13c60 2d 20 73 6b 69 70 70 65 64 20 6c 6f 61 64 69 6e  - skipped loadin
13c70 67 20 70 65 72 2d 68 6f 73 74 20 74 65 73 74 20  g per-host test 
13c80 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22  settings file \"
13c90 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
13ca0 20 20 20 20 20 20 20 24 68 6f 73 74 53 65 74 74         $hostSett
13cb0 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22  ingsFileName "\"
13cc0 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78  , it does not ex
13cd0 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  ist\n"]..       
13ce0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
13cf0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
13d00 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
13d10 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 75 6e 53  ...    proc runS
13d20 51 4c 69 74 65 54 65 73 74 50 72 6f 6c 6f 67 75  QLiteTestPrologu
13d30 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e {} {..      #.
13d40 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53  .      # NOTE: S
13d50 6b 69 70 20 72 75 6e 6e 69 6e 67 20 6f 75 72 20  kip running our 
13d60 63 75 73 74 6f 6d 20 70 72 6f 6c 6f 67 75 65 20  custom prologue 
13d70 69 66 20 74 68 65 20 6d 61 69 6e 20 6f 6e 65 20  if the main one 
13d80 68 61 73 20 62 65 65 6e 0d 0a 20 20 20 20 20 20  has been..      
13d90 23 20 20 20 20 20 20 20 73 6b 69 70 70 65 64 2e  #       skipped.
13da0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
13db0 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
13dc0 74 73 20 3a 3a 6e 6f 28 70 72 6f 6c 6f 67 75 65  ts ::no(prologue
13dd0 2e 65 61 67 6c 65 29 5d 7d 20 74 68 65 6e 20 7b  .eagle)]} then {
13de0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
13df0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61       # NOTE: Loa
13e00 64 20 74 68 65 20 22 62 65 66 6f 72 65 2d 63 6f  d the "before-co
13e10 6e 73 74 72 61 69 6e 74 73 22 20 63 75 73 74 6f  nstraints" custo
13e20 6d 20 70 65 72 2d 75 73 65 72 20 61 6e 64 2f 6f  m per-user and/o
13e30 72 20 70 65 72 2d 68 6f 73 74 0d 0a 20 20 20 20  r per-host..    
13e40 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74      #       test
13e50 20 73 65 74 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a   settings now...
13e60 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
13e70 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69     uplevel 1 [li
13e80 73 74 20 6c 6f 61 64 53 51 4c 69 74 65 54 65 73  st loadSQLiteTes
13e90 74 53 65 74 74 69 6e 67 73 20 24 3a 3a 74 65 73  tSettings $::tes
13ea0 74 5f 63 68 61 6e 6e 65 6c 20 2e 62 65 66 6f 72  t_channel .befor
13eb0 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  e]....        #.
13ec0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
13ed0 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e   Determine the n
13ee0 61 6d 65 73 20 6f 66 20 74 68 65 20 6e 61 74 69  ames of the nati
13ef0 76 65 20 70 6c 61 74 66 6f 72 6d 20 61 6e 64 20  ve platform and 
13f00 61 72 63 68 69 74 65 63 74 75 72 65 2e 0d 0a 20  architecture... 
13f10 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
13f20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 5b    set platform [
13f30 67 65 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d  getBuildPlatform
13f40 20 74 72 75 65 5d 0d 0a 20 20 20 20 20 20 20 20   true]..        
13f50 73 65 74 20 61 72 63 68 69 74 65 63 74 75 72 65  set architecture
13f60 20 5b 61 72 63 68 69 74 65 63 74 75 72 65 46 6f   [architectureFo
13f70 72 50 6c 61 74 66 6f 72 6d 20 24 70 6c 61 74 66  rPlatform $platf
13f80 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  orm]....        
13f90 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
13fa0 45 3a 20 53 68 6f 77 20 74 68 65 20 70 6c 61 74  E: Show the plat
13fb0 66 6f 72 6d 20 61 6e 64 20 61 72 63 68 69 74 65  form and archite
13fc0 63 74 75 72 65 20 75 73 65 64 20 74 6f 20 68 65  cture used to he
13fd0 6c 70 20 6c 6f 63 61 74 65 20 74 68 65 0d 0a 20  lp locate the.. 
13fe0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e         #       n
13ff0 61 74 69 76 65 20 62 75 69 6c 64 20 66 69 6c 65  ative build file
14000 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  s...        #.. 
14010 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
14020 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
14030 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
14040 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 70 6c          "---- pl
14050 61 74 66 6f 72 6d 20 66 6f 72 20 6c 6f 63 61 74  atform for locat
14060 69 6e 67 20 6e 61 74 69 76 65 20 62 75 69 6c 64  ing native build
14070 20 66 69 6c 65 73 20 69 73 20 5c 22 22 20 5c 0d   files is \"" \.
14080 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 70 6c  .            $pl
14090 61 74 66 6f 72 6d 20 5c 22 5c 6e 5d 0d 0a 0d 0a  atform \"\n]....
140a0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
140b0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
140c0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
140d0 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 61           "---- a
140e0 72 63 68 69 74 65 63 74 75 72 65 20 66 6f 72 20  rchitecture for 
140f0 6c 6f 63 61 74 69 6e 67 20 6e 61 74 69 76 65 20  locating native 
14100 62 75 69 6c 64 20 66 69 6c 65 73 20 69 73 20 5c  build files is \
14110 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
14120 20 20 24 61 72 63 68 69 74 65 63 74 75 72 65 20    $architecture 
14130 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  \"\n]....       
14140 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
14150 54 45 3a 20 42 75 69 6c 64 20 61 20 6c 69 73 74  TE: Build a list
14160 20 6f 66 20 63 6f 6e 66 69 67 75 72 61 74 69 6f   of configuratio
14170 6e 20 66 69 6c 65 73 20 74 68 61 74 20 77 65 20  n files that we 
14180 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20  handle...       
14190 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
141a0 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20  configFileNames 
141b0 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20  [list \..       
141c0 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
141d0 2e 53 51 4c 69 74 65 2e 64 6c 6c 2e 63 6f 6e 66  .SQLite.dll.conf
141e0 69 67 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  ig]....        #
141f0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
14200 3a 20 42 75 69 6c 64 20 61 20 6c 69 73 74 20 6f  : Build a list o
14210 66 20 61 75 78 69 6c 69 61 72 79 20 4d 61 6e 61  f auxiliary Mana
14220 67 65 64 20 44 65 62 75 67 67 69 6e 67 20 41 73  ged Debugging As
14230 73 69 73 74 61 6e 74 73 20 28 4d 44 41 29 0d 0a  sistants (MDA)..
14240 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
14250 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 69  configuration fi
14260 6c 65 73 20 74 68 61 74 20 77 65 20 68 61 6e 64  les that we hand
14270 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  le...        #..
14280 20 20 20 20 20 20 20 20 73 65 74 20 6d 64 61 43          set mdaC
14290 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 5b  onfigFileNames [
142a0 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  list \..        
142b0 20 20 20 20 49 6e 73 74 61 6c 6c 65 72 2e 65 78      Installer.ex
142c0 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 74 65 73  e.mda.config tes
142d0 74 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67  t.exe.mda.config
142e0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
142f0 74 65 73 74 6c 69 6e 71 2e 65 78 65 2e 6d 64 61  testlinq.exe.mda
14300 2e 63 6f 6e 66 69 67 5d 0d 0a 0d 0a 20 20 20 20  .config]....    
14310 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
14320 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65   NOTE: Build the
14330 20 6c 69 73 74 20 6f 66 20 6e 61 74 69 76 65 20   list of native 
14340 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 73 20 74  assembly files t
14350 68 61 74 20 77 65 20 68 61 6e 64 6c 65 2e 20 20  hat we handle.  
14360 54 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  The..        #  
14370 20 20 20 20 20 72 65 61 73 6f 6e 20 74 68 65 20       reason the 
14380 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  "System.Data.SQL
14390 69 74 65 2e 64 6c 6c 22 20 66 69 6c 65 20 69 73  ite.dll" file is
143a0 20 69 6e 63 6c 75 64 65 64 20 68 65 72 65 20 69   included here i
143b0 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  s..        #    
143c0 20 20 20 62 65 63 61 75 73 65 20 69 74 20 63 6f     because it co
143d0 75 6c 64 20 62 65 20 74 68 65 20 6d 69 78 65 64  uld be the mixed
143e0 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 2e 0d  -mode assembly..
143f0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
14400 20 20 20 20 73 65 74 20 6e 61 74 69 76 65 46 69      set nativeFi
14410 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74 20 5c 0d  leNames [list \.
14420 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
14430 69 74 65 33 2e 64 6c 6c 20 53 51 4c 69 74 65 2e  ite3.dll SQLite.
14440 49 6e 74 65 72 6f 70 2e 64 6c 6c 20 53 79 73 74  Interop.dll Syst
14450 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
14460 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  ll]....        #
14470 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
14480 3a 20 42 75 69 6c 64 20 74 68 65 20 6c 69 73 74  : Build the list
14490 20 6f 66 20 6d 61 6e 61 67 65 64 20 61 73 73 65   of managed asse
144a0 6d 62 6c 79 20 66 69 6c 65 73 20 74 68 61 74 20  mbly files that 
144b0 77 65 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20  we handle...    
144c0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
144d0 65 74 20 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61  et managedFileNa
144e0 6d 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20  mes [list \..   
144f0 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
14500 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 20  Data.SQLite.dll 
14510 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
14520 74 65 2e 4c 69 6e 71 2e 64 6c 6c 5d 0d 0a 0d 0a  te.Linq.dll]....
14530 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
14540 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 6d 6f 76     # NOTE: Remov
14550 65 20 61 6e 79 20 74 65 73 74 20 63 6f 6e 73 74  e any test const
14560 72 61 69 6e 74 73 20 74 68 61 74 20 72 65 66 65  raints that refe
14570 72 20 74 6f 20 74 68 65 20 6e 61 74 69 76 65 20  r to the native 
14580 61 6e 64 2f 6f 72 0d 0a 20 20 20 20 20 20 20 20  and/or..        
14590 23 20 20 20 20 20 20 20 6d 61 6e 61 67 65 64 20  #       managed 
145a0 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 73 20 74  assembly files t
145b0 68 61 74 20 77 65 20 68 61 6e 64 6c 65 20 75 6e  hat we handle un
145c0 6c 65 73 73 20 66 6f 72 62 69 64 64 65 6e 20 66  less forbidden f
145d0 72 6f 6d 0d 0a 20 20 20 20 20 20 20 20 23 20 20  rom..        #  
145e0 20 20 20 20 20 64 6f 69 6e 67 20 73 6f 2e 0d 0a       doing so...
145f0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
14600 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
14610 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65  ists ::no(sqlite
14620 52 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74  RemoveConstraint
14630 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
14640 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
14650 69 6c 65 4e 61 6d 65 20 24 63 6f 6e 66 69 67 46  ileName $configF
14660 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
14670 20 20 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f          removeCo
14680 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
14690 41 72 67 73 20 66 69 6c 65 5f 20 24 66 69 6c 65  Args file_ $file
146a0 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20  Name]..         
146b0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
146c0 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
146d0 20 24 6d 64 61 43 6f 6e 66 69 67 46 69 6c 65 4e   $mdaConfigFileN
146e0 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
146f0 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72      removeConstr
14700 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
14710 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61 6d 65   file_ $fileName
14720 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
14730 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65  ..          fore
14740 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61  ach fileName $na
14750 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  tiveFileNames {.
14760 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6d  .            rem
14770 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  oveConstraint [a
14780 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20  ppendArgs file_ 
14790 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20  $fileName]..    
147a0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
147b0 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
147c0 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64 46 69  eName $managedFi
147d0 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
147e0 20 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e         removeCon
147f0 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
14800 72 67 73 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e  rgs file_ $fileN
14810 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  ame]..          
14820 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
14830 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
14840 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20     # NOTE: Skip 
14850 61 6c 6c 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  all System.Data.
14860 53 51 4c 69 74 65 20 72 65 6c 61 74 65 64 20 66  SQLite related f
14870 69 6c 65 20 68 61 6e 64 6c 69 6e 67 20 28 64 65  ile handling (de
14880 6c 65 74 69 6e 67 2c 0d 0a 20 20 20 20 20 20 20  leting,..       
14890 20 23 20 20 20 20 20 20 20 63 6f 70 79 69 6e 67   #       copying
148a0 2c 20 61 6e 64 20 6c 6f 61 64 69 6e 67 29 20 69  , and loading) i
148b0 66 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20  f instructed... 
148c0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
148d0 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
148e0 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 46  sts ::no(sqliteF
148f0 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
14900 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
14910 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
14920 6b 69 70 20 74 72 79 69 6e 67 20 74 6f 20 64 65  kip trying to de
14930 6c 65 74 65 20 61 6e 79 20 66 69 6c 65 73 20 69  lete any files i
14940 66 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20  f instructed... 
14950 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
14960 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
14970 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c   exists ::no(del
14980 65 74 65 53 71 6c 69 74 65 46 69 6c 65 73 29 5d  eteSqliteFiles)]
14990 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
149a0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
149b0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c   exists ::no(del
149c0 65 74 65 53 71 6c 69 74 65 43 6f 6e 66 69 67 46  eteSqliteConfigF
149d0 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
149e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
149f0 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
14a00 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20  configFileNames 
14a10 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
14a20 20 20 20 74 72 79 44 65 6c 65 74 65 42 69 6e 61     tryDeleteBina
14a30 72 79 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65  ryFile $fileName
14a40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
14a50 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
14a60 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
14a70 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
14a80 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c  s ::no(deleteSql
14a90 69 74 65 4e 61 74 69 76 65 46 69 6c 65 73 29 5d  iteNativeFiles)]
14aa0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
14ab0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
14ac0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64  fo exists ::no(d
14ad0 65 6c 65 74 65 53 71 6c 69 74 65 49 6d 70 6c 69  eleteSqliteImpli
14ae0 63 69 74 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  citFiles)]} then
14af0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
14b00 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
14b10 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65  Name $nativeFile
14b20 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
14b30 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65             tryDe
14b40 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 24 66 69  leteAssembly $fi
14b50 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20  leName..        
14b60 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
14b70 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
14b80 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
14b90 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
14ba0 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 50  no(deleteSqliteP
14bb0 6c 61 74 66 6f 72 6d 46 69 6c 65 73 29 5d 20 26  latformFiles)] &
14bc0 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
14bd0 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
14be0 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d  ength $platform]
14bf0 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
14c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
14c10 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
14c20 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20  nativeFileNames 
14c30 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
14c40 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 41 73       tryDeleteAs
14c50 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65  sembly $fileName
14c60 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20   $platform..    
14c70 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
14c80 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
14c90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
14ca0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
14cb0 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c  s ::no(deleteSql
14cc0 69 74 65 41 72 63 68 69 74 65 63 74 75 72 65 46  iteArchitectureF
14cd0 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20  iles)] && \..   
14ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
14cf0 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 61  string length $a
14d00 72 63 68 69 74 65 63 74 75 72 65 5d 20 3e 20 30  rchitecture] > 0
14d10 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
14d20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
14d30 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69  h fileName $nati
14d40 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  veFileNames {.. 
14d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d60 20 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62   tryDeleteAssemb
14d70 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 24 61 72  ly $fileName $ar
14d80 63 68 69 74 65 63 74 75 72 65 0d 0a 20 20 20 20  chitecture..    
14d90 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
14da0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
14db0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
14dc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
14dd0 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
14de0 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65  :no(deleteSqlite
14df0 4d 61 6e 61 67 65 64 46 69 6c 65 73 29 5d 7d 20  ManagedFiles)]} 
14e00 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
14e10 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
14e20 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64 46  leName $managedF
14e30 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
14e40 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44              tryD
14e50 65 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 24 66  eleteAssembly $f
14e60 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20  ileName..       
14e70 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
14e80 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
14e90 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
14ea0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
14eb0 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f 72   NOTE: Check for
14ec0 20 74 68 65 20 22 61 75 74 6f 53 65 6c 65 63 74   the "autoSelect
14ed0 22 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e  " runtime option
14ee0 2e 20 20 49 66 20 70 72 65 73 65 6e 74 2c 0d 0a  .  If present,..
14ef0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
14f00 20 20 61 74 74 65 6d 70 74 20 74 6f 20 61 75 74    attempt to aut
14f10 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65 6c 65 63  omatically selec
14f20 74 20 74 68 65 20 66 69 72 73 74 20 61 76 61 69  t the first avai
14f30 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 20  lable..         
14f40 20 23 20 20 20 20 20 20 20 62 75 69 6c 64 20 28   #       build (
14f50 6f 72 20 22 72 65 6c 65 61 73 65 22 29 20 6f 66  or "release") of
14f60 20 53 51 4c 69 74 65 20 61 6e 64 20 53 79 73 74   SQLite and Syst
14f70 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 0d 0a  em.Data.SQLite..
14f80 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
14f90 20 20 66 6f 72 20 75 73 65 20 77 69 74 68 20 74    for use with t
14fa0 68 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a  he test suite...
14fb0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
14fc0 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61 73 52         if {[hasR
14fd0 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 61 75 74  untimeOption aut
14fe0 6f 53 65 6c 65 63 74 5d 7d 20 74 68 65 6e 20 7b  oSelect]} then {
14ff0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
15000 20 7b 21 5b 63 68 65 63 6b 46 6f 72 53 51 4c 69   {![checkForSQLi
15010 74 65 42 75 69 6c 64 73 20 24 3a 3a 74 65 73 74  teBuilds $::test
15020 5f 63 68 61 6e 6e 65 6c 20 74 72 75 65 5d 7d 20  _channel true]} 
15030 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
15040 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51        checkForSQ
15050 4c 69 74 65 52 65 6c 65 61 73 65 73 20 24 3a 3a  LiteReleases $::
15060 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75  test_channel tru
15070 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e..            }
15080 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
15090 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
150a0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
150b0 53 6b 69 70 20 74 72 79 69 6e 67 20 74 6f 20 76  Skip trying to v
150c0 65 72 69 66 79 20 74 68 65 20 62 75 69 6c 64 20  erify the build 
150d0 64 69 72 65 63 74 6f 72 79 20 69 66 20 69 6e 73  directory if ins
150e0 74 72 75 63 74 65 64 3b 0d 0a 20 20 20 20 20 20  tructed;..      
150f0 20 20 20 20 23 20 20 20 20 20 20 20 6f 74 68 65      #       othe
15100 72 77 69 73 65 2c 20 6d 61 6b 65 20 73 75 72 65  rwise, make sure
15110 20 69 74 20 61 63 74 75 61 6c 6c 79 20 65 78 69   it actually exi
15120 73 74 73 20 6f 72 20 68 61 6c 74 20 74 68 65 20  sts or halt the 
15130 65 6e 74 69 72 65 0d 0a 20 20 20 20 20 20 20 20  entire..        
15140 20 20 23 20 20 20 20 20 20 20 74 65 73 74 69 6e    #       testin
15150 67 20 70 72 6f 63 65 73 73 20 69 66 20 69 74 20  g process if it 
15160 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0d  does not exist..
15170 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
15180 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
15190 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 76  fo exists ::no(v
151a0 65 72 69 66 79 42 75 69 6c 64 44 69 72 65 63 74  erifyBuildDirect
151b0 6f 72 79 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ory)]} then {.. 
151c0 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
151d0 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
151e0 3a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  : At this point,
151f0 20 74 68 65 20 62 75 69 6c 64 20 64 69 72 65 63   the build direc
15200 74 6f 72 79 20 4d 55 53 54 20 65 78 69 73 74 20  tory MUST exist 
15210 61 73 20 61 0d 0a 20 20 20 20 20 20 20 20 20 20  as a..          
15220 20 20 23 20 20 20 20 20 20 20 76 61 6c 69 64 20    #       valid 
15230 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20 74 68  directory for th
15240 65 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73  e testing proces
15250 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0d 0a  s to continue...
15260 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
15270 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 64             set d
15280 69 72 65 63 74 6f 72 79 20 5b 67 65 74 42 75 69  irectory [getBui
15290 6c 64 44 69 72 65 63 74 6f 72 79 5d 0d 0a 0d 0a  ldDirectory]....
152a0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
152b0 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 64  ![file exists $d
152c0 69 72 65 63 74 6f 72 79 5d 20 7c 7c 20 5c 0d 0a  irectory] || \..
152d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152e0 21 5b 66 69 6c 65 20 69 73 64 69 72 65 63 74 6f  ![file isdirecto
152f0 72 79 20 24 64 69 72 65 63 74 6f 72 79 5d 7d 20  ry $directory]} 
15300 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
15310 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
15320 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4a         # NOTE: J
15330 75 73 74 20 70 72 69 6f 72 20 74 6f 20 61 63 74  ust prior to act
15340 75 61 6c 6c 79 20 68 61 6c 74 69 6e 67 20 74 68  ually halting th
15350 65 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73  e testing proces
15360 73 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  s,..            
15370 20 20 23 20 20 20 20 20 20 20 61 64 64 20 61 6e    #       add an
15380 20 65 72 72 6f 72 20 74 6f 20 74 68 65 20 74 65   error to the te
15390 73 74 20 6c 6f 67 20 66 69 6c 65 2e 0d 0a 20 20  st log file...  
153a0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
153b0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
153c0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
153d0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
153e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
153f0 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 75 6c 64 20      "---- could 
15400 6e 6f 74 20 76 65 72 69 66 79 20 62 75 69 6c 64  not verify build
15410 20 64 69 72 65 63 74 6f 72 79 20 5c 22 22 20 24   directory \"" $
15420 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20  directory \..   
15430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
15440 5c 22 2c 20 61 6c 6c 20 74 65 73 74 69 6e 67 20  \", all testing 
15450 68 61 6c 74 65 64 5c 6e 22 5d 0d 0a 0d 0a 20 20  halted\n"]....  
15460 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
15470 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
15480 4f 54 45 3a 20 52 61 69 73 69 6e 67 20 61 20 73  OTE: Raising a s
15490 63 72 69 70 74 20 65 72 72 6f 72 20 66 72 6f 6d  cript error from
154a0 20 74 68 69 73 20 70 6f 69 6e 74 20 73 68 6f 75   this point shou
154b0 6c 64 20 68 61 6c 74 0d 0a 20 20 20 20 20 20 20  ld halt..       
154c0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
154d0 68 65 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65  he testing proce
154e0 73 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ss...           
154f0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
15500 20 20 20 20 65 72 72 6f 72 20 5b 61 70 70 65 6e      error [appen
15510 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
15520 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 75 6c             "coul
15530 64 20 6e 6f 74 20 76 65 72 69 66 79 20 62 75 69  d not verify bui
15540 6c 64 20 64 69 72 65 63 74 6f 72 79 20 5c 22 22  ld directory \""
15550 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20   $directory \.. 
15560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15570 20 22 5c 22 2c 20 61 6c 6c 20 74 65 73 74 69 6e   "\", all testin
15580 67 20 68 61 6c 74 65 64 22 5d 0d 0a 20 20 20 20  g halted"]..    
15590 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
155a0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
155b0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
155c0 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72   # NOTE: Skip tr
155d0 79 69 6e 67 20 74 6f 20 63 6f 70 79 20 61 6e 79  ying to copy any
155e0 20 66 69 6c 65 73 20 69 66 20 69 6e 73 74 72 75   files if instru
155f0 63 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20  cted...         
15600 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   #..          if
15610 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
15620 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 46  ::no(copySqliteF
15630 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
15640 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
15650 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
15660 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 43 6f 6e  no(copySqliteCon
15670 66 69 67 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  figFiles)]} then
15680 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
15690 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
156a0 6d 65 20 24 63 6f 6e 66 69 67 46 69 6c 65 4e 61  me $configFileNa
156b0 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
156c0 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 42 75         tryCopyBu
156d0 69 6c 64 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d  ildFile $fileNam
156e0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
156f0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
15700 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
15710 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
15720 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69  ts ::no(copySqli
15730 74 65 4e 61 74 69 76 65 46 69 6c 65 73 29 5d 7d  teNativeFiles)]}
15740 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
15750 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
15760 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f  o exists ::no(co
15770 70 79 53 71 6c 69 74 65 49 6d 70 6c 69 63 69 74  pySqliteImplicit
15780 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
15790 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
157a0 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
157b0 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d  e $nativeFileNam
157c0 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
157d0 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 41          tryCopyA
157e0 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d  ssembly $fileNam
157f0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
15800 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
15810 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
15820 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
15830 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f  o exists ::no(co
15840 70 79 53 71 6c 69 74 65 50 6c 61 74 66 6f 72 6d  pySqlitePlatform
15850 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20  Files)] && \..  
15860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15870 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
15880 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74  platform] > 0} t
15890 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
158a0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
158b0 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46  ileName $nativeF
158c0 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
158d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
158e0 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 24 66  yCopyAssembly $f
158f0 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72  ileName $platfor
15900 6d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m..             
15910 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
15920 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
15930 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
15940 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f  o exists ::no(co
15950 70 79 53 71 6c 69 74 65 41 72 63 68 69 74 65 63  pySqliteArchitec
15960 74 75 72 65 46 69 6c 65 73 29 5d 20 26 26 20 5c  tureFiles)] && \
15970 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
15980 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
15990 74 68 20 24 61 72 63 68 69 74 65 63 74 75 72 65  th $architecture
159a0 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
159b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
159c0 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
159d0 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73  $nativeFileNames
159e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
159f0 20 20 20 20 20 20 74 72 79 43 6f 70 79 41 73 73        tryCopyAss
15a00 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20  embly $fileName 
15a10 24 61 72 63 68 69 74 65 63 74 75 72 65 0d 0a 20  $architecture.. 
15a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
15a30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
15a40 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
15a50 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
15a60 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
15a70 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74  s ::no(copySqlit
15a80 65 4d 61 6e 61 67 65 64 46 69 6c 65 73 29 5d 7d  eManagedFiles)]}
15a90 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
15aa0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
15ab0 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64  ileName $managed
15ac0 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
15ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
15ae0 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 24 66 69  CopyAssembly $fi
15af0 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20  leName..        
15b00 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
15b10 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
15b20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
15b30 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
15b40 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72 79 69 6e  NOTE: Skip tryin
15b50 67 20 74 6f 20 6c 6f 61 64 20 61 6e 79 20 66 69  g to load any fi
15b60 6c 65 73 20 69 66 20 69 6e 73 74 72 75 63 74 65  les if instructe
15b70 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  d...          #.
15b80 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
15b90 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
15ba0 6f 28 6c 6f 61 64 53 71 6c 69 74 65 46 69 6c 65  o(loadSqliteFile
15bb0 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
15bc0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
15bd0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
15be0 6c 6f 61 64 53 71 6c 69 74 65 49 6d 70 6c 69 63  loadSqliteImplic
15bf0 69 74 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  itFiles)]} then 
15c00 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
15c10 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79   tryLoadAssembly
15c20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
15c30 69 74 65 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20  ite.dll..       
15c40 20 20 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73         tryLoadAs
15c50 73 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61  sembly System.Da
15c60 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64  ta.SQLite.Linq.d
15c70 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll..            
15c80 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
15c90 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
15ca0 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69  ts ::no(loadSqli
15cb0 74 65 50 6c 61 74 66 6f 72 6d 46 69 6c 65 73 29  tePlatformFiles)
15cc0 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
15cd0 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
15ce0 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d  length $platform
15cf0 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
15d00 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
15d10 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20 53 79 73  LoadAssembly Sys
15d20 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
15d30 64 6c 6c 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 20  dll $platform.. 
15d40 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
15d50 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
15d60 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
15d70 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 41 72 63  no(loadSqliteArc
15d80 68 69 74 65 63 74 75 72 65 46 69 6c 65 73 29 5d  hitectureFiles)]
15d90 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
15da0 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
15db0 65 6e 67 74 68 20 24 61 72 63 68 69 74 65 63 74  ength $architect
15dc0 75 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ure] > 0} then {
15dd0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
15de0 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20  tryLoadAssembly 
15df0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
15e00 74 65 2e 64 6c 6c 20 24 61 72 63 68 69 74 65 63  te.dll $architec
15e10 74 75 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20  ture..          
15e20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
15e30 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  ....          #.
15e40 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
15e50 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74  E: Skip trying t
15e60 6f 20 64 65 6c 65 74 65 20 65 78 74 65 72 6e 61  o delete externa
15e70 6c 20 66 69 6c 65 73 20 69 66 20 69 6e 73 74 72  l files if instr
15e80 75 63 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20  ucted...        
15e90 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69    #..          i
15ea0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
15eb0 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69   ::no(deleteSqli
15ec0 74 65 45 78 74 65 72 6e 61 6c 46 69 6c 65 73 29  teExternalFiles)
15ed0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
15ee0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
15ef0 69 6c 65 4e 61 6d 65 20 24 6d 64 61 43 6f 6e 66  ileName $mdaConf
15f00 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  igFileNames {.. 
15f10 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
15f20 44 65 6c 65 74 65 42 75 69 6c 64 46 69 6c 65 20  DeleteBuildFile 
15f30 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  $fileName..     
15f40 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
15f50 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
15f60 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
15f70 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72 79  # NOTE: Skip try
15f80 69 6e 67 20 74 6f 20 63 6f 70 79 20 65 78 74 65  ing to copy exte
15f90 72 6e 61 6c 20 66 69 6c 65 73 20 69 66 20 69 6e  rnal files if in
15fa0 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20 20  structed...     
15fb0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
15fc0 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
15fd0 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c  sts ::no(copySql
15fe0 69 74 65 45 78 74 65 72 6e 61 6c 46 69 6c 65 73  iteExternalFiles
15ff0 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
16000 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
16010 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
16020 6f 70 79 20 74 68 65 20 4d 61 6e 61 67 65 64 20  opy the Managed 
16030 44 65 62 75 67 67 69 6e 67 20 41 73 73 69 73 74  Debugging Assist
16040 61 6e 74 73 20 28 4d 44 41 29 20 63 6f 6e 66 69  ants (MDA) confi
16050 67 75 72 61 74 69 6f 6e 0d 0a 20 20 20 20 20 20  guration..      
16060 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66 69        #       fi
16070 6c 65 20 66 6f 72 20 74 68 65 20 45 61 67 6c 65  le for the Eagle
16080 20 73 68 65 6c 6c 20 74 6f 20 74 68 65 20 62 75   shell to the bu
16090 69 6c 64 20 6f 75 74 70 75 74 20 64 69 72 65 63  ild output direc
160a0 74 6f 72 79 2c 0d 0a 20 20 20 20 20 20 20 20 20  tory,..         
160b0 20 20 20 23 20 20 20 20 20 20 20 77 68 69 6c 65     #       while
160c0 20 75 73 69 6e 67 20 65 61 63 68 20 6f 66 20 74   using each of t
160d0 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20  he names of the 
160e0 76 61 72 69 6f 75 73 20 6c 65 67 61 63 79 20 74  various legacy t
160f0 65 73 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20  est..           
16100 20 23 20 20 20 20 20 20 20 65 78 65 63 75 74 61   #       executa
16110 62 6c 65 73 2e 20 20 54 68 69 73 20 77 69 6c 6c  bles.  This will
16120 20 68 65 6c 70 20 74 6f 20 6d 61 6b 65 20 73 75   help to make su
16130 72 65 20 74 68 61 74 20 61 6c 6c 20 74 68 65 0d  re that all the.
16140 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20  .            #  
16150 20 20 20 20 20 6c 65 67 61 63 79 20 74 65 73 74       legacy test
16160 73 20 72 75 6e 20 77 69 74 68 20 65 78 61 63 74  s run with exact
16170 6c 79 20 74 68 65 20 73 61 6d 65 20 73 65 74 20  ly the same set 
16180 6f 66 20 4d 61 6e 61 67 65 64 0d 0a 20 20 20 20  of Managed..    
16190 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
161a0 44 65 62 75 67 67 69 6e 67 20 41 73 73 69 73 74  Debugging Assist
161b0 61 6e 74 73 20 63 6f 6e 66 69 67 75 72 65 64 2e  ants configured.
161c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
161d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
161e0 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d  each fileName $m
161f0 64 61 43 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65  daConfigFileName
16200 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
16210 20 20 20 74 72 79 43 6f 70 79 42 69 6e 61 72 79     tryCopyBinary
16220 46 69 6c 65 20 45 61 67 6c 65 53 68 65 6c 6c 2e  File EagleShell.
16230 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 22  exe.mda.config "
16240 22 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  " $fileName..   
16250 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
16260 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
16270 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61   }....        ca
16280 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
16290 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
162a0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
162b0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
162c0 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76      "---- file v
162d0 65 72 73 69 6f 6e 20 6f 66 20 5c 22 73 71 6c 69  ersion of \"sqli
162e0 74 65 33 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5c  te3.dll\"... " \
162f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
16300 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67  [file version [g
16310 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  etBinaryFileName
16320 20 73 71 6c 69 74 65 33 2e 64 6c 6c 5d 5d 20 5c   sqlite3.dll]] \
16330 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  n]..        }...
16340 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b  .        catch {
16350 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
16360 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
16370 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
16380 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
16390 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f  ---- file versio
163a0 6e 20 6f 66 20 5c 22 53 51 4c 69 74 65 2e 49 6e  n of \"SQLite.In
163b0 74 65 72 6f 70 2e 64 6c 6c 5c 22 2e 2e 2e 20 22  terop.dll\"... "
163c0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
163d0 20 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20    [file version 
163e0 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61  [getBinaryFileNa
163f0 6d 65 20 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f  me SQLite.Intero
16400 70 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20 20  p.dll]] \n]..   
16410 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
16420 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20    catch {..     
16430 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
16440 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
16450 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
16460 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69          "---- fi
16470 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22  le version of \"
16480 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
16490 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5c 0d  te.dll\"... " \.
164a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
164b0 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67 65  file version [ge
164c0 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
164d0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
164e0 74 65 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20  te.dll]] \n]..  
164f0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
16500 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20     catch {..    
16510 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
16520 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
16530 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
16540 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66           "---- f
16550 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c  ile version of \
16560 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  "System.Data.SQL
16570 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 5c 22 2e 2e  ite.Linq.dll\"..
16580 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  . " \..         
16590 20 20 20 20 20 5b 66 69 6c 65 20 76 65 72 73 69       [file versi
165a0 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c  on [getBinaryFil
165b0 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74  eName System.Dat
165c0 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c  a.SQLite.Linq.dl
165d0 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  l]] \n]..       
165e0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
165f0 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
16600 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d   $platform] > 0}
16610 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
16620 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20     catch {..    
16630 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
16640 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
16650 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
16660 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
16670 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20  -- file version 
16680 6f 66 20 5c 22 22 20 24 70 6c 61 74 66 6f 72 6d  of \"" $platform
16690 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
166a0 20 20 20 20 22 2f 73 71 6c 69 74 65 33 2e 64 6c      "/sqlite3.dl
166b0 6c 5c 22 2e 2e 2e 20 22 20 5b 66 69 6c 65 20 76  l\"... " [file v
166c0 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20  ersion \..      
166d0 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 69            [getBi
166e0 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 73 71 6c  naryFileName sql
166f0 69 74 65 33 2e 64 6c 6c 20 24 70 6c 61 74 66 6f  ite3.dll $platfo
16700 72 6d 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  rm]] \n]..      
16710 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
16720 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20     catch {..    
16730 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
16740 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
16750 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
16760 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
16770 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20  -- file version 
16780 6f 66 20 5c 22 22 20 24 70 6c 61 74 66 6f 72 6d  of \"" $platform
16790 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
167a0 20 20 20 20 22 2f 53 51 4c 69 74 65 2e 49 6e 74      "/SQLite.Int
167b0 65 72 6f 70 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20  erop.dll\"... " 
167c0 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d  [file version \.
167d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
167e0 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
167f0 61 6d 65 20 53 51 4c 69 74 65 2e 49 6e 74 65 72  ame SQLite.Inter
16800 6f 70 2e 64 6c 6c 20 24 70 6c 61 74 66 6f 72 6d  op.dll $platform
16810 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ]] \n]..        
16820 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
16830 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20   catch {..      
16840 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
16850 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
16860 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
16870 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
16880 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66   file version of
16890 20 5c 22 22 20 24 70 6c 61 74 66 6f 72 6d 20 5c   \"" $platform \
168a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
168b0 20 20 22 2f 53 79 73 74 65 6d 2e 44 61 74 61 2e    "/System.Data.
168c0 53 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20  SQLite.dll\"... 
168d0 22 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20  " [file version 
168e0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
168f0 20 20 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c     [getBinaryFil
16900 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74  eName System.Dat
16910 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 20 24 70 6c  a.SQLite.dll $pl
16920 61 74 66 6f 72 6d 5d 5d 20 5c 6e 5d 0d 0a 20 20  atform]] \n]..  
16930 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
16940 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
16950 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
16960 74 68 20 24 61 72 63 68 69 74 65 63 74 75 72 65  th $architecture
16970 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
16980 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b           catch {
16990 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
169a0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
169b0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
169c0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
169d0 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65     "---- file ve
169e0 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24 61 72  rsion of \"" $ar
169f0 63 68 69 74 65 63 74 75 72 65 20 5c 0d 0a 20 20  chitecture \..  
16a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2f                "/
16a10 73 71 6c 69 74 65 33 2e 64 6c 6c 5c 22 2e 2e 2e  sqlite3.dll\"...
16a20 20 22 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e   " [file version
16a30 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
16a40 20 20 20 20 5b 67 65 74 42 69 6e 61 72 79 46 69      [getBinaryFi
16a50 6c 65 4e 61 6d 65 20 73 71 6c 69 74 65 33 2e 64  leName sqlite3.d
16a60 6c 6c 20 24 61 72 63 68 69 74 65 63 74 75 72 65  ll $architecture
16a70 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ]] \n]..        
16a80 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
16a90 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20   catch {..      
16aa0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
16ab0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
16ac0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
16ad0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
16ae0 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66   file version of
16af0 20 5c 22 22 20 24 61 72 63 68 69 74 65 63 74 75   \"" $architectu
16b00 72 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  re \..          
16b10 20 20 20 20 20 20 22 2f 53 51 4c 69 74 65 2e 49        "/SQLite.I
16b20 6e 74 65 72 6f 70 2e 64 6c 6c 5c 22 2e 2e 2e 20  nterop.dll\"... 
16b30 22 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20  " [file version 
16b40 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
16b50 20 20 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c     [getBinaryFil
16b60 65 4e 61 6d 65 20 53 51 4c 69 74 65 2e 49 6e 74  eName SQLite.Int
16b70 65 72 6f 70 2e 64 6c 6c 20 24 61 72 63 68 69 74  erop.dll $archit
16b80 65 63 74 75 72 65 5d 5d 20 5c 6e 5d 0d 0a 20 20  ecture]] \n]..  
16b90 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
16ba0 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a         catch {..
16bb0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
16bc0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
16bd0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
16be0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16bf0 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73   "---- file vers
16c00 69 6f 6e 20 6f 66 20 5c 22 22 20 24 61 72 63 68  ion of \"" $arch
16c10 69 74 65 63 74 75 72 65 20 5c 0d 0a 20 20 20 20  itecture \..    
16c20 20 20 20 20 20 20 20 20 20 20 20 20 22 2f 53 79              "/Sy
16c30 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
16c40 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5b 66 69 6c  .dll\"... " [fil
16c50 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20  e version \..   
16c60 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65               [ge
16c70 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
16c80 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
16c90 74 65 2e 64 6c 6c 20 24 61 72 63 68 69 74 65 63  te.dll $architec
16ca0 74 75 72 65 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20  ture]] \n]..    
16cb0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
16cc0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65   }....        se
16cd0 74 20 61 73 73 65 6d 62 6c 69 65 73 20 5b 6f 62  t assemblies [ob
16ce0 6a 65 63 74 20 69 6e 76 6f 6b 65 20 41 70 70 44  ject invoke AppD
16cf0 6f 6d 61 69 6e 2e 43 75 72 72 65 6e 74 44 6f 6d  omain.CurrentDom
16d00 61 69 6e 20 47 65 74 41 73 73 65 6d 62 6c 69 65  ain GetAssemblie
16d10 73 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 6f 62  s]....        ob
16d20 6a 65 63 74 20 66 6f 72 65 61 63 68 20 61 73 73  ject foreach ass
16d30 65 6d 62 6c 79 20 24 61 73 73 65 6d 62 6c 69 65  embly $assemblie
16d40 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  s {..          i
16d50 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68  f {[string match
16d60 20 5c 7b 53 79 73 74 65 6d 2e 44 61 74 61 2e 53   \{System.Data.S
16d70 51 4c 69 74 65 2a 20 24 61 73 73 65 6d 62 6c 79  QLite* $assembly
16d80 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
16d90 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
16da0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
16db0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
16dc0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
16dd0 2d 20 66 6f 75 6e 64 20 61 73 73 65 6d 62 6c 79  - found assembly
16de0 3a 20 22 20 24 61 73 73 65 6d 62 6c 79 20 5c 6e  : " $assembly \n
16df0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
16e00 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
16e10 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
16e20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
16e30 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d  :test_channel \.
16e40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
16e50 2d 2d 2d 2d 20 64 65 66 69 6e 65 20 63 6f 6e 73  ---- define cons
16e60 74 61 6e 74 73 20 66 6f 72 20 5c 22 53 79 73 74  tants for \"Syst
16e70 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 5c 22  em.Data.SQLite\"
16e80 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20  ... "....       
16e90 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f     if {[catch {o
16ea0 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
16eb0 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
16ec0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
16ed0 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
16ee0 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 44  SQLite.SQLite3 D
16ef0 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73 7d 20  efineConstants} 
16f00 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
16f10 20 20 20 20 20 64 65 66 69 6e 65 43 6f 6e 73 74       defineConst
16f20 61 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ants] == 0} then
16f30 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
16f40 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
16f50 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
16f60 73 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c  s [formatList [l
16f70 73 6f 72 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  sort \..        
16f80 20 20 20 20 20 20 20 20 24 64 65 66 69 6e 65 43          $defineC
16f90 6f 6e 73 74 61 6e 74 73 5d 20 3c 6e 6f 6e 65 3e  onstants] <none>
16fa0 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  ] \n]..         
16fb0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
16fc0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
16fd0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b  test_channel unk
16fe0 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20  nown\n..        
16ff0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
17000 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20  ..        catch 
17010 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
17020 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
17030 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  el \..          
17040 20 20 20 20 22 2d 2d 2d 2d 20 73 6f 75 72 63 65      "---- source
17050 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53 79   version of \"Sy
17060 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
17070 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a 20  .dll\"... ".... 
17080 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
17090 74 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f  tch {object invo
170a0 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
170b0 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
170c0 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
170d0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
170e0 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 50 72  iteConnection Pr
170f0 6f 76 69 64 65 72 56 65 72 73 69 6f 6e 7d 20 5c  oviderVersion} \
17100 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17110 20 20 20 20 76 65 72 73 69 6f 6e 5d 20 3d 3d 20      version] == 
17120 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
17130 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
17140 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72 73 69  ng length $versi
17150 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  on] == 0} then {
17160 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17170 73 65 74 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c  set version null
17180 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
17190 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
171a0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
171b0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  el [appendArgs $
171c0 76 65 72 73 69 6f 6e 20 5c 6e 5d 0d 0a 20 20 20  version \n]..   
171d0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
171e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
171f0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
17200 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20  el unknown\n..  
17210 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
17220 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
17230 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
17240 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
17250 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20  _channel \..    
17260 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
17270 73 6f 75 72 63 65 20 63 68 65 63 6b 6f 75 74 20  source checkout 
17280 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61  of \"System.Data
17290 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e  .SQLite.dll\"...
172a0 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   "....          
172b0 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65  if {[catch {obje
172c0 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
172d0 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
172e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172f0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
17300 69 74 65 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63  ite.SQLiteConnec
17310 74 69 6f 6e 20 50 72 6f 76 69 64 65 72 53 6f 75  tion ProviderSou
17320 72 63 65 49 64 7d 20 5c 0d 0a 20 20 20 20 20 20  rceId} \..      
17330 20 20 20 20 20 20 20 20 20 20 20 20 73 6f 75 72              sour
17340 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ceId] == 0} then
17350 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
17360 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
17370 74 68 20 24 73 6f 75 72 63 65 49 64 5d 20 3d 3d  th $sourceId] ==
17380 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
17390 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73 6f            set so
173a0 75 72 63 65 49 64 20 6e 75 6c 6c 0d 0a 20 20 20  urceId null..   
173b0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
173c0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
173d0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
173e0 70 70 65 6e 64 41 72 67 73 20 24 73 6f 75 72 63  ppendArgs $sourc
173f0 65 49 64 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  eId \n]..       
17400 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
17410 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
17420 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75  ::test_channel u
17430 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20  nknown\n..      
17440 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
17450 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
17460 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
17470 68 65 63 6b 20 74 68 65 20 61 76 61 69 6c 61 62  heck the availab
17480 6c 65 20 62 75 69 6c 64 73 20 28 61 6e 64 20 22  le builds (and "
17490 72 65 6c 65 61 73 65 73 22 29 20 6f 66 20 53 51  releases") of SQ
174a0 4c 69 74 65 20 61 6e 64 0d 0a 20 20 20 20 20 20  Lite and..      
174b0 20 20 23 20 20 20 20 20 20 20 53 79 73 74 65 6d    #       System
174c0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 0d 0a 20  .Data.SQLite... 
174d0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
174e0 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65    checkForSQLite
174f0 42 75 69 6c 64 73 20 24 3a 3a 74 65 73 74 5f 63  Builds $::test_c
17500 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20 20 20 20  hannel..        
17510 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 52 65  checkForSQLiteRe
17520 6c 65 61 73 65 73 20 24 3a 3a 74 65 73 74 5f 63  leases $::test_c
17530 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20  hannel....      
17540 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
17550 4f 54 45 3a 20 4e 6f 77 2c 20 77 65 20 6e 65 65  OTE: Now, we nee
17560 64 20 74 6f 20 6b 6e 6f 77 20 69 66 20 74 68 65  d to know if the
17570 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62   SQLite core lib
17580 72 61 72 79 20 69 73 20 61 76 61 69 6c 61 62 6c  rary is availabl
17590 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
175a0 20 20 20 28 69 2e 65 2e 20 62 65 63 61 75 73 65     (i.e. because
175b0 20 74 68 65 20 6d 61 6e 61 67 65 64 2d 6f 6e 6c   the managed-onl
175c0 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  y System.Data.SQ
175d0 4c 69 74 65 20 61 73 73 65 6d 62 6c 79 20 63 61  Lite assembly ca
175e0 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  n..        #    
175f0 20 20 20 6c 6f 61 64 20 77 69 74 68 6f 75 74 20     load without 
17600 69 74 3b 20 68 6f 77 65 76 65 72 2c 20 69 74 20  it; however, it 
17610 63 61 6e 6e 6f 74 20 64 6f 20 61 6e 79 74 68 69  cannot do anythi
17620 6e 67 20 75 73 65 66 75 6c 20 77 69 74 68 6f 75  ng useful withou
17630 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
17640 20 20 20 69 74 29 2e 20 20 49 66 20 77 65 20 61     it).  If we a
17650 72 65 20 75 73 69 6e 67 20 74 68 65 20 6d 69 78  re using the mix
17660 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79  ed-mode assembly
17670 20 61 6e 64 20 77 65 20 61 6c 72 65 61 64 79 0d   and we already.
17680 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
17690 20 66 6f 75 6e 64 20 69 74 20 28 61 62 6f 76 65   found it (above
176a0 29 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 61  ), this should a
176b0 6c 77 61 79 73 20 73 75 63 63 65 65 64 2e 0d 0a  lways succeed...
176c0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
176d0 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74     checkForSQLit
176e0 65 4c 69 62 72 61 72 79 20 24 3a 3a 74 65 73 74  eLibrary $::test
176f0 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20  _channel....    
17700 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
17710 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20   NOTE: Check if 
17720 74 68 65 20 53 51 4c 69 74 65 20 69 6e 74 65 72  the SQLite inter
17730 6f 70 20 61 73 73 65 6d 62 6c 79 20 69 73 20 61  op assembly is a
17740 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20  vailable...     
17750 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68     #..        ch
17760 65 63 6b 46 6f 72 53 51 4c 69 74 65 49 6e 74 65  eckForSQLiteInte
17770 72 6f 70 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  rop $::test_chan
17780 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  nel....        #
17790 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
177a0 3a 20 43 68 65 63 6b 20 74 68 65 20 53 51 4c 69  : Check the SQLi
177b0 74 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  te database and 
177c0 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
177d0 6f 72 69 65 73 2e 0d 0a 20 20 20 20 20 20 20 20  ories...        
177e0 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  #..        check
177f0 46 6f 72 53 51 4c 69 74 65 44 69 72 65 63 74 6f  ForSQLiteDirecto
17800 72 69 65 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  ries $::test_cha
17810 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nnel....        
17820 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
17830 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65  E: Attempt to de
17840 74 65 72 6d 69 6e 65 20 69 66 20 76 61 72 69 6f  termine if vario
17850 75 73 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  us compile-time 
17860 6f 70 74 69 6f 6e 73 20 6e 65 65 64 65 64 20 66  options needed f
17870 6f 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  or..        #   
17880 20 20 20 20 74 65 73 74 20 63 6f 6e 73 74 72 61      test constra
17890 69 6e 74 73 20 77 65 72 65 20 65 6e 61 62 6c 65  ints were enable
178a0 64 20 66 6f 72 20 74 68 65 20 6d 61 6e 61 67 65  d for the manage
178b0 64 20 61 73 73 65 6d 62 6c 79 2e 20 20 54 68 65  d assembly.  The
178c0 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  re..        #   
178d0 20 20 20 20 61 72 65 20 73 6f 6d 65 20 63 6f 6d      are some com
178e0 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
178f0 73 20 74 68 61 74 20 6d 75 73 74 20 61 6c 73 6f  s that must also
17900 20 68 61 76 65 20 62 65 65 6e 20 65 6e 61 62 6c   have been enabl
17910 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ed..        #   
17920 20 20 20 20 66 6f 72 20 74 68 65 20 69 6e 74 65      for the inte
17930 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 69 6e 20  rop assembly in 
17940 6f 72 64 65 72 20 74 6f 20 62 65 20 65 66 66 65  order to be effe
17950 63 74 69 76 65 2e 20 20 46 6f 72 20 74 68 6f 73  ctive.  For thos
17960 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
17970 20 20 20 6f 70 74 69 6f 6e 73 2c 20 69 74 20 77     options, it w
17980 69 6c 6c 20 62 65 20 61 73 73 75 6d 65 64 20 74  ill be assumed t
17990 68 61 74 20 69 74 20 77 61 73 20 65 6e 61 62 6c  hat it was enabl
179a0 65 64 20 66 6f 72 20 74 68 65 20 69 6e 74 65 72  ed for the inter
179b0 6f 70 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  op..        #   
179c0 20 20 20 20 61 73 73 65 6d 62 6c 79 20 69 66 20      assembly if 
179d0 69 74 20 77 61 73 20 65 6e 61 62 6c 65 64 20 66  it was enabled f
179e0 6f 72 20 74 68 65 20 6d 61 6e 61 67 65 64 20 61  or the managed a
179f0 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20  ssembly...      
17a00 20 20 23 0d 0a 20 20 20 20 20 20 20 20 66 6f 72    #..        for
17a10 65 61 63 68 20 64 65 66 69 6e 65 43 6f 6e 73 74  each defineConst
17a20 61 6e 74 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20  ant [list \..   
17a30 20 20 20 20 20 20 20 20 20 43 48 45 43 4b 5f 53           CHECK_S
17a40 54 41 54 45 20 43 4f 55 4e 54 5f 48 41 4e 44 4c  TATE COUNT_HANDL
17a50 45 20 44 45 42 55 47 20 49 4e 54 45 52 4f 50 5f  E DEBUG INTEROP_
17a60 43 4f 44 45 43 20 49 4e 54 45 52 4f 50 5f 44 45  CODEC INTEROP_DE
17a70 42 55 47 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  BUG \..         
17a80 20 20 20 49 4e 54 45 52 4f 50 5f 45 58 54 45 4e     INTEROP_EXTEN
17a90 53 49 4f 4e 5f 46 55 4e 43 54 49 4f 4e 53 20 49  SION_FUNCTIONS I
17aa0 4e 54 45 52 4f 50 5f 4c 45 47 41 43 59 5f 43 4c  NTEROP_LEGACY_CL
17ab0 4f 53 45 20 49 4e 54 45 52 4f 50 5f 4c 4f 47 20  OSE INTEROP_LOG 
17ac0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 49  \..            I
17ad0 4e 54 45 52 4f 50 5f 54 45 53 54 5f 45 58 54 45  NTEROP_TEST_EXTE
17ae0 4e 53 49 4f 4e 20 49 4e 54 45 52 4f 50 5f 56 49  NSION INTEROP_VI
17af0 52 54 55 41 4c 5f 54 41 42 4c 45 20 4e 45 54 5f  RTUAL_TABLE NET_
17b00 32 30 20 4e 45 54 5f 33 35 20 5c 0d 0a 20 20 20  20 NET_35 \..   
17b10 20 20 20 20 20 20 20 20 20 4e 45 54 5f 34 30 20           NET_40 
17b20 4e 45 54 5f 34 35 20 4e 45 54 5f 34 35 31 20 4e  NET_45 NET_451 N
17b30 45 54 5f 43 4f 4d 50 41 43 54 5f 32 30 20 50 4c  ET_COMPACT_20 PL
17b40 41 54 46 4f 52 4d 5f 43 4f 4d 50 41 43 54 46 52  ATFORM_COMPACTFR
17b50 41 4d 45 57 4f 52 4b 20 5c 0d 0a 20 20 20 20 20  AMEWORK \..     
17b60 20 20 20 20 20 20 20 50 52 45 4c 4f 41 44 5f 4e         PRELOAD_N
17b70 41 54 49 56 45 5f 4c 49 42 52 41 52 59 20 52 45  ATIVE_LIBRARY RE
17b80 54 41 52 47 45 54 41 42 4c 45 20 53 51 4c 49 54  TARGETABLE SQLIT
17b90 45 5f 53 54 41 4e 44 41 52 44 20 5c 0d 0a 20 20  E_STANDARD \..  
17ba0 20 20 20 20 20 20 20 20 20 20 54 48 52 4f 57 5f            THROW_
17bb0 4f 4e 5f 44 49 53 50 4f 53 45 44 20 54 52 41 43  ON_DISPOSED TRAC
17bc0 45 20 54 52 41 43 45 5f 43 4f 4e 4e 45 43 54 49  E TRACE_CONNECTI
17bd0 4f 4e 20 54 52 41 43 45 5f 48 41 4e 44 4c 45 20  ON TRACE_HANDLE 
17be0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 54  \..            T
17bf0 52 41 43 45 5f 50 52 45 4c 4f 41 44 20 54 52 41  RACE_PRELOAD TRA
17c00 43 45 5f 53 48 41 52 45 44 20 54 52 41 43 45 5f  CE_SHARED TRACE_
17c10 53 54 41 54 45 4d 45 4e 54 20 54 52 41 43 45 5f  STATEMENT TRACE_
17c20 57 41 52 4e 49 4e 47 20 5c 0d 0a 20 20 20 20 20  WARNING \..     
17c30 20 20 20 20 20 20 20 54 52 41 43 4b 5f 4d 45 4d         TRACK_MEM
17c40 4f 52 59 5f 42 59 54 45 53 20 55 53 45 5f 49 4e  ORY_BYTES USE_IN
17c50 54 45 52 4f 50 5f 44 4c 4c 20 55 53 45 5f 50 52  TEROP_DLL USE_PR
17c60 45 50 41 52 45 5f 56 32 20 57 49 4e 44 4f 57 53  EPARE_V2 WINDOWS
17c70 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ] {..          #
17c80 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
17c90 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65  TE: Check if the
17ca0 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
17cb0 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64 20 69  tion is listed i
17cc0 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 0d 0a 20  n the list of.. 
17cd0 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
17ce0 20 22 64 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e   "define constan
17cf0 74 73 22 20 6b 65 70 74 20 74 72 61 63 6b 20 6f  ts" kept track o
17d00 66 20 62 79 20 74 68 65 20 6d 61 6e 61 67 65 64  f by the managed
17d10 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20   assembly...    
17d20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
17d30 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74     checkForSQLit
17d40 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20  eDefineConstant 
17d50 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
17d60 24 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 0d  $defineConstant.
17d70 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
17d80 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
17d90 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74   # NOTE: Check t
17da0 68 65 20 63 75 72 72 65 6e 74 20 62 75 69 6c 64  he current build
17db0 20 79 65 61 72 2e 20 20 42 61 73 69 63 61 6c 6c   year.  Basicall
17dc0 79 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65  y, this indicate
17dd0 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  s..        #    
17de0 20 20 20 77 68 69 63 68 20 76 65 72 73 69 6f 6e     which version
17df0 20 6f 66 20 4d 53 42 75 69 6c 64 20 61 6e 64 2f   of MSBuild and/
17e00 6f 72 20 56 69 73 75 61 6c 20 53 74 75 64 69 6f  or Visual Studio
17e10 20 77 61 73 20 75 73 65 64 20 74 6f 0d 0a 20 20   was used to..  
17e20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
17e30 6d 70 69 6c 65 20 74 68 65 20 61 73 73 65 6d 62  mpile the assemb
17e40 6c 79 20 62 69 6e 61 72 69 65 73 20 75 6e 64 65  ly binaries unde
17e50 72 20 74 65 73 74 2e 0d 0a 20 20 20 20 20 20 20  r test...       
17e60 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   #..        tput
17e70 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
17e80 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l \..           
17e90 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20   "---- checking 
17ea0 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  for System.Data.
17eb0 53 51 4c 69 74 65 20 62 75 69 6c 64 20 79 65 61  SQLite build yea
17ec0 72 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  r... "....      
17ed0 20 20 73 65 74 20 79 65 61 72 20 5b 67 65 74 42    set year [getB
17ee0 75 69 6c 64 59 65 61 72 5d 0d 0a 20 20 20 20 20  uildYear]..     
17ef0 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
17f00 20 5b 61 70 70 65 6e 64 41 72 67 73 20 62 75 69   [appendArgs bui
17f10 6c 64 59 65 61 72 2e 20 24 79 65 61 72 5d 0d 0a  ldYear. $year]..
17f20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
17f30 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
17f40 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24 79 65  ppendArgs \" $ye
17f50 61 72 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  ar \"\n]....    
17f60 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
17f70 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65   NOTE: Check the
17f80 20 63 75 72 72 65 6e 74 20 62 75 69 6c 64 20 63   current build c
17f90 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 20 54  onfiguration.  T
17fa0 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61  his should norma
17fb0 6c 6c 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20  lly..        #  
17fc0 20 20 20 20 20 62 65 20 65 69 74 68 65 72 20 22       be either "
17fd0 44 65 62 75 67 22 20 6f 72 20 22 52 65 6c 65 61  Debug" or "Relea
17fe0 73 65 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  se"...        #.
17ff0 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
18000 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c  ::test_channel \
18010 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
18020 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
18030 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
18040 69 74 65 20 62 75 69 6c 64 20 63 6f 6e 66 69 67  ite build config
18050 75 72 61 74 69 6f 6e 2e 2e 2e 20 22 0d 0a 0d 0a  uration... "....
18060 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 6e 66          set conf
18070 69 67 75 72 61 74 69 6f 6e 20 5b 67 65 74 42 75  iguration [getBu
18080 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ildConfiguration
18090 5d 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  ]..        addCo
180a0 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
180b0 41 72 67 73 20 62 75 69 6c 64 43 6f 6e 66 69 67  Args buildConfig
180c0 75 72 61 74 69 6f 6e 2e 20 24 63 6f 6e 66 69 67  uration. $config
180d0 75 72 61 74 69 6f 6e 5d 0d 0a 20 20 20 20 20 20  uration]..      
180e0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
180f0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
18100 72 67 73 20 5c 22 20 24 63 6f 6e 66 69 67 75 72  rgs \" $configur
18110 61 74 69 6f 6e 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20  ation \"\n].... 
18120 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
18130 20 20 23 20 4e 4f 54 45 3a 20 54 72 79 20 74 6f    # NOTE: Try to
18140 20 73 65 74 75 70 20 61 6e 20 69 6e 74 65 72 72   setup an interr
18150 75 70 74 20 63 61 6c 6c 62 61 63 6b 20 75 73 69  upt callback usi
18160 6e 67 20 74 68 65 20 73 63 72 69 70 74 20 64 65  ng the script de
18170 62 75 67 67 65 72 0d 0a 20 20 20 20 20 20 20 20  bugger..        
18180 23 20 20 20 20 20 20 20 74 68 61 74 20 77 69 6c  #       that wil
18190 6c 20 63 61 6e 63 65 6c 20 61 6c 6c 20 53 51 4c  l cancel all SQL
181a0 20 71 75 65 72 69 65 73 20 69 6e 20 70 72 6f 67   queries in prog
181b0 72 65 73 73 20 66 6f 72 20 61 6c 6c 20 64 61 74  ress for all dat
181c0 61 62 61 73 65 0d 0a 20 20 20 20 20 20 20 20 23  abase..        #
181d0 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f         connectio
181e0 6e 73 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 69 73  ns known to this
181f0 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20   interpreter... 
18200 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
18210 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
18220 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 49  sts ::no(sqliteI
18230 6e 74 65 72 72 75 70 74 43 61 6c 6c 62 61 63 6b  nterruptCallback
18240 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
18250 20 20 20 20 20 20 73 65 74 75 70 44 62 49 6e 74        setupDbInt
18260 65 72 72 75 70 74 43 61 6c 6c 62 61 63 6b 20 24  erruptCallback $
18270 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24  ::test_channel $
18280 3a 3a 74 65 73 74 5f 6c 6f 67 0d 0a 20 20 20 20  ::test_log..    
18290 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
182a0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
182b0 54 45 3a 20 43 68 65 63 6b 20 66 6f 72 20 74 68  TE: Check for th
182c0 65 20 6e 61 74 69 76 65 20 72 75 6e 74 69 6d 65  e native runtime
182d0 20 6f 70 74 69 6f 6e 2c 20 77 68 69 63 68 20 77   option, which w
182e0 6f 75 6c 64 20 6d 65 61 6e 20 77 65 20 61 72 65  ould mean we are
182f0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
18300 20 20 75 73 69 6e 67 20 74 68 65 20 6d 69 78 65    using the mixe
18310 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 2e  d-mode assembly.
18320 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
18330 20 20 20 20 20 63 68 65 63 6b 46 6f 72 52 75 6e       checkForRun
18340 74 69 6d 65 4f 70 74 69 6f 6e 20 24 3a 3a 74 65  timeOption $::te
18350 73 74 5f 63 68 61 6e 6e 65 6c 20 6e 61 74 69 76  st_channel nativ
18360 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e....        #..
18370 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
18380 43 68 65 63 6b 20 69 66 20 74 68 65 20 74 65 73  Check if the tes
18390 74 20 73 75 69 74 65 20 73 68 6f 75 6c 64 20 63  t suite should c
183a0 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
183b0 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0d 0a  of connections..
183c0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
183d0 22 6f 70 65 6e 65 64 22 20 61 6e 64 20 22 63 6c  "opened" and "cl
183e0 6f 73 65 64 22 20 66 72 6f 6d 20 74 68 65 20 70  osed" from the p
183f0 6f 6f 6c 20 77 68 65 6e 20 64 65 74 65 72 6d 69  ool when determi
18400 6e 69 6e 67 20 69 66 20 61 20 74 65 73 74 0d 0a  ning if a test..
18410 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
18420 70 61 73 73 65 64 2e 20 20 44 69 73 61 62 6c 69  passed.  Disabli
18430 6e 67 20 74 68 69 73 20 62 65 68 61 76 69 6f 72  ng this behavior
18440 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 6e 65   is sometimes ne
18450 63 65 73 73 61 72 79 20 28 65 2e 67 2e 0d 0a 20  cessary (e.g... 
18460 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64         #       d
18470 75 72 69 6e 67 20 74 68 65 20 72 65 6c 65 61 73  uring the releas
18480 65 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73  e testing proces
18490 73 29 20 62 65 63 61 75 73 65 20 74 68 65 72 65  s) because there
184a0 20 61 72 65 20 73 65 76 65 72 61 6c 0d 0a 20 20   are several..  
184b0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65        #       te
184c0 73 74 73 20 74 68 61 74 20 72 65 6c 79 20 6f 6e  sts that rely on
184d0 20 74 68 65 20 22 6f 70 65 6e 65 64 20 66 72 6f   the "opened fro
184e0 6d 20 70 6f 6f 6c 22 20 63 6f 75 6e 74 20 62 65  m pool" count be
184f0 69 6e 67 20 67 72 65 61 74 65 72 0d 0a 20 20 20  ing greater..   
18500 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 61       #       tha
18510 6e 20 7a 65 72 6f 2e 20 20 54 68 65 73 65 20 74  n zero.  These t
18520 65 73 74 73 20 6d 61 79 20 66 61 69 6c 20 64 75  ests may fail du
18530 65 20 74 6f 20 74 68 65 20 6e 6f 6e 2d 64 65 74  e to the non-det
18540 65 72 6d 69 6e 69 73 74 69 63 0d 0a 20 20 20 20  erministic..    
18550 20 20 20 20 23 20 20 20 20 20 20 20 62 65 68 61      #       beha
18560 76 69 6f 72 20 6f 66 20 74 68 65 20 43 4c 52 20  vior of the CLR 
18570 47 43 2c 20 65 76 65 6e 20 77 68 65 6e 20 74 68  GC, even when th
18580 65 72 65 20 69 73 20 6e 6f 20 62 75 67 20 69 6e  ere is no bug in
18590 20 74 68 65 20 63 6f 64 65 0d 0a 20 20 20 20 20   the code..     
185a0 20 20 20 23 20 20 20 20 20 20 20 62 65 69 6e 67     #       being
185b0 20 74 65 73 74 65 64 2e 0d 0a 20 20 20 20 20 20   tested...      
185c0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65    #..        che
185d0 63 6b 46 6f 72 52 75 6e 74 69 6d 65 4f 70 74 69  ckForRuntimeOpti
185e0 6f 6e 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  on $::test_chann
185f0 65 6c 20 6e 6f 50 6f 6f 6c 43 6f 75 6e 74 73 0d  el noPoolCounts.
18600 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
18610 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
18620 70 6f 72 74 20 74 68 65 20 72 65 73 6f 75 72 63  port the resourc
18630 65 20 75 73 61 67 65 20 70 72 69 6f 72 20 74 6f  e usage prior to
18640 20 72 75 6e 6e 69 6e 67 20 61 6e 79 20 74 65 73   running any tes
18650 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ts...        #..
18660 20 20 20 20 20 20 20 20 72 65 70 6f 72 74 53 51          reportSQ
18670 4c 69 74 65 52 65 73 6f 75 72 63 65 73 20 24 3a  LiteResources $:
18680 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d  :test_channel...
18690 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
186a0 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77      # NOTE: Show
186b0 20 74 68 65 20 61 63 74 69 76 65 20 74 65 73 74   the active test
186c0 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0d 0a 20   constraints... 
186d0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
186e0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
186f0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
18700 72 67 73 20 22 2d 2d 2d 2d 20 63 6f 6e 73 74 72  rgs "---- constr
18710 61 69 6e 74 73 3a 20 22 20 5c 0d 0a 20 20 20 20  aints: " \..    
18720 20 20 20 20 20 20 20 20 5b 66 6f 72 6d 61 74 4c          [formatL
18730 69 73 74 20 5b 6c 73 6f 72 74 20 5b 67 65 74 43  ist [lsort [getC
18740 6f 6e 73 74 72 61 69 6e 74 73 5d 5d 20 3c 6e 6f  onstraints]] <no
18750 6e 65 3e 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  ne>] \n]....    
18760 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
18770 20 4e 4f 54 45 3a 20 53 61 76 65 20 74 68 65 20   NOTE: Save the 
18780 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 73  test constraints
18790 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 72 65   for use by thre
187a0 61 64 73 20 63 72 65 61 74 65 64 20 69 6e 20 74  ads created in t
187b0 68 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20  his..        #  
187c0 20 20 20 20 20 61 70 70 6c 69 63 61 74 69 6f 6e       application
187d0 20 64 6f 6d 61 69 6e 2e 20 20 54 68 69 73 20 69   domain.  This i
187e0 73 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61  s necessary beca
187f0 75 73 65 20 61 6c 6c 20 74 68 65 20 45 61 67 6c  use all the Eagl
18800 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
18810 20 20 20 22 74 65 73 74 20 63 6f 6e 74 65 78 74     "test context
18820 22 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  " information is
18830 20 70 65 72 2d 74 68 72 65 61 64 2e 0d 0a 20 20   per-thread...  
18840 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
18850 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
18860 74 73 20 3a 3a 74 65 73 74 5f 63 6f 6e 73 74 72  ts ::test_constr
18870 61 69 6e 74 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a  aints]} then {..
18880 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a            set ::
18890 74 65 73 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  test_constraints
188a0 20 24 3a 3a 65 61 67 6c 65 5f 74 65 73 74 73 28   $::eagle_tests(
188b0 63 6f 6e 73 74 72 61 69 6e 74 73 29 0d 0a 20 20  constraints)..  
188c0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
188d0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
188e0 4e 4f 54 45 3a 20 4c 6f 61 64 20 74 68 65 20 22  NOTE: Load the "
188f0 61 66 74 65 72 2d 63 6f 6e 73 74 72 61 69 6e 74  after-constraint
18900 73 22 20 63 75 73 74 6f 6d 20 70 65 72 2d 75 73  s" custom per-us
18910 65 72 20 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f  er and/or per-ho
18920 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  st..        #   
18930 20 20 20 20 74 65 73 74 20 73 65 74 74 69 6e 67      test setting
18940 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20  s now...        
18950 23 0d 0a 20 20 20 20 20 20 20 20 75 70 6c 65 76  #..        uplev
18960 65 6c 20 31 20 5b 6c 69 73 74 20 6c 6f 61 64 53  el 1 [list loadS
18970 51 4c 69 74 65 54 65 73 74 53 65 74 74 69 6e 67  QLiteTestSetting
18980 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
18990 6c 20 2e 61 66 74 65 72 5d 0d 0a 0d 0a 20 20 20  l .after]....   
189a0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
189b0 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 77 68 65  # NOTE: Show whe
189c0 6e 20 6f 75 72 20 74 65 73 74 73 20 61 63 74 75  n our tests actu
189d0 61 6c 6c 79 20 62 65 67 61 6e 20 28 6e 6f 77 29  ally began (now)
189e0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
189f0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
18a00 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
18a10 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
18a20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 53 79 73         "---- Sys
18a30 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
18a40 74 65 73 74 73 20 62 65 67 61 6e 20 61 74 20 22  tests began at "
18a50 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
18a60 5b 63 6c 6f 63 6b 20 66 6f 72 6d 61 74 20 5b 63  [clock format [c
18a70 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 5d 20 5c  lock seconds]] \
18a80 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  n]..      }..   
18a90 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
18aa0 72 75 6e 53 51 4c 69 74 65 54 65 73 74 45 70 69  runSQLiteTestEpi
18ab0 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20 20 20 20  logue {} {..    
18ac0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
18ad0 45 3a 20 53 6b 69 70 20 72 75 6e 6e 69 6e 67 20  E: Skip running 
18ae0 6f 75 72 20 63 75 73 74 6f 6d 20 65 70 69 6c 6f  our custom epilo
18af0 67 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20  gue if the main 
18b00 6f 6e 65 20 68 61 73 20 62 65 65 6e 0d 0a 20 20  one has been..  
18b10 20 20 20 20 23 20 20 20 20 20 20 20 73 6b 69 70      #       skip
18b20 70 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ped...      #.. 
18b30 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
18b40 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 70 69 6c  exists ::no(epil
18b50 6f 67 75 65 2e 65 61 67 6c 65 29 5d 7d 20 74 68  ogue.eagle)]} th
18b60 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
18b70 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
18b80 20 53 68 6f 77 20 77 68 65 6e 20 6f 75 72 20 74   Show when our t
18b90 65 73 74 73 20 61 63 74 75 61 6c 6c 79 20 65 6e  ests actually en
18ba0 64 65 64 20 28 6e 6f 77 29 2e 0d 0a 20 20 20 20  ded (now)...    
18bb0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74      #..        t
18bc0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
18bd0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
18be0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
18bf0 22 2d 2d 2d 2d 20 53 79 73 74 65 6d 2e 44 61 74  "---- System.Dat
18c00 61 2e 53 51 4c 69 74 65 20 74 65 73 74 73 20 65  a.SQLite tests e
18c10 6e 64 65 64 20 61 74 20 22 20 5c 0d 0a 20 20 20  nded at " \..   
18c20 20 20 20 20 20 20 20 20 20 5b 63 6c 6f 63 6b 20           [clock 
18c30 66 6f 72 6d 61 74 20 5b 63 6c 6f 63 6b 20 73 65  format [clock se
18c40 63 6f 6e 64 73 5d 5d 20 5c 6e 5d 0d 0a 0d 0a 20  conds]] \n].... 
18c50 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
18c60 20 20 23 20 42 55 47 46 49 58 3a 20 42 65 66 6f    # BUGFIX: Befo
18c70 72 65 20 63 68 65 63 6b 69 6e 67 20 74 68 65 20  re checking the 
18c80 66 69 6e 61 6c 20 72 65 73 6f 75 72 63 65 73 20  final resources 
18c90 69 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74 65  in use by SQLite
18ca0 2c 20 6d 61 6b 65 0d 0a 20 20 20 20 20 20 20 20  , make..        
18cb0 23 20 20 20 20 20 20 20 20 20 73 75 72 65 20 62  #         sure b
18cc0 6f 74 68 20 6f 66 20 74 68 65 20 50 52 41 47 4d  oth of the PRAGM
18cd0 41 20 72 65 6c 61 74 65 64 20 64 69 72 65 63 74  A related direct
18ce0 6f 72 79 20 6e 61 6d 65 73 20 61 72 65 20 66 72  ory names are fr
18cf0 65 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  eed...        #.
18d00 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f  .        checkFo
18d10 72 53 51 4c 69 74 65 44 69 72 65 63 74 6f 72 69  rSQLiteDirectori
18d20 65 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  es $::test_chann
18d30 65 6c 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20  el true....     
18d40 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
18d50 4e 4f 54 45 3a 20 41 6c 73 6f 20 72 65 70 6f 72  NOTE: Also repor
18d60 74 20 74 68 65 20 72 65 73 6f 75 72 63 65 20 75  t the resource u
18d70 73 61 67 65 20 61 66 74 65 72 20 72 75 6e 6e 69  sage after runni
18d80 6e 67 20 74 68 65 20 74 65 73 74 73 2e 0d 0a 20  ng the tests... 
18d90 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
18da0 20 20 72 65 70 6f 72 74 53 51 4c 69 74 65 52 65    reportSQLiteRe
18db0 73 6f 75 72 63 65 73 20 24 3a 3a 74 65 73 74 5f  sources $::test_
18dc0 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20  channel....     
18dd0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
18de0 4e 4f 54 45 3a 20 52 65 70 6f 72 74 20 74 68 65  NOTE: Report the
18df0 20 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65   critical handle
18e00 20 63 6f 75 6e 74 73 20 61 66 74 65 72 20 72 75   counts after ru
18e10 6e 6e 69 6e 67 20 74 68 65 20 74 65 73 74 73 2e  nning the tests.
18e20 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
18e30 20 20 20 20 20 67 65 74 53 51 4c 69 74 65 48 61       getSQLiteHa
18e40 6e 64 6c 65 43 6f 75 6e 74 73 20 24 3a 3a 74 65  ndleCounts $::te
18e50 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20  st_channel..    
18e60 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
18e70 20 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23     #############
18e80 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18e90 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18ea0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18eb0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
18ec0 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23 23      ############
18ed0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18ee0 23 20 45 4e 44 20 45 61 67 6c 65 20 4f 4e 4c 59  # END Eagle ONLY
18ef0 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
18f00 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
18f10 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23  .    ###########
18f20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18f30 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18f40 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18f50 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18f60 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 0d 0a 20 20  ..  }....  #..  
18f70 23 20 4e 4f 54 45 3a 20 53 61 76 65 20 74 68 65  # NOTE: Save the
18f80 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 69 72   name of the dir
18f90 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e  ectory containin
18fa0 67 20 74 68 69 73 20 66 69 6c 65 2e 0d 0a 20 20  g this file...  
18fb0 23 0d 0a 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20  #..  if {![info 
18fc0 65 78 69 73 74 73 20 63 6f 6d 6d 6f 6e 5f 64 69  exists common_di
18fd0 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b  rectory]} then {
18fe0 0d 0a 20 20 20 20 73 65 74 20 63 6f 6d 6d 6f 6e  ..    set common
18ff0 5f 64 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65  _directory [file
19000 20 64 69 72 6e 61 6d 65 20 5b 69 6e 66 6f 20 73   dirname [info s
19010 63 72 69 70 74 5d 5d 0d 0a 20 20 7d 0d 0a 0d 0a  cript]]..  }....
19020 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 50    #..  # NOTE: P
19030 72 6f 76 69 64 65 20 74 68 65 20 53 79 73 74 65  rovide the Syste
19040 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 74 65  m.Data.SQLite te
19050 73 74 20 70 61 63 6b 61 67 65 20 74 6f 20 74 68  st package to th
19060 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a  e interpreter...
19070 20 20 23 0d 0a 20 20 70 61 63 6b 61 67 65 20 70    #..  package p
19080 72 6f 76 69 64 65 20 53 79 73 74 65 6d 2e 44 61  rovide System.Da
19090 74 61 2e 53 51 4c 69 74 65 2e 54 65 73 74 20 31  ta.SQLite.Test 1
190a0 2e 30 0d 0a 7d 0d 0a                             .0..}..