System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 66fd71b7ba640e0137abe4c31e1d353d44ce78a6:


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 73 65 74 75 70 44 62 20 7b 0d 0a 20 20 20  c setupDb {..   
c650: 20 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d           fileNam
c660: 65 20 7b 6d 6f 64 65 20 22 22 7d 20 7b 64 61 74  e {mode ""} {dat
c670: 65 54 69 6d 65 46 6f 72 6d 61 74 20 22 22 7d 20  eTimeFormat ""} 
c680: 7b 64 61 74 65 54 69 6d 65 4b 69 6e 64 20 22 22  {dateTimeKind ""
c690: 7d 20 7b 66 6c 61 67 73 20 22 22 7d 0d 0a 20 20  } {flags ""}..  
c6a0: 20 20 20 20 20 20 20 20 20 20 7b 65 78 74 72 61            {extra
c6b0: 20 22 22 7d 20 7b 71 75 61 6c 69 66 79 20 74 72   ""} {qualify tr
c6c0: 75 65 7d 20 7b 64 65 6c 65 74 65 20 74 72 75 65  ue} {delete true
c6d0: 7d 20 7b 75 72 69 20 66 61 6c 73 65 7d 0d 0a 20  } {uri false}.. 
c6e0: 20 20 20 20 20 20 20 20 20 20 20 7b 74 65 6d 70             {temp
c6f0: 6f 72 61 72 79 20 74 72 75 65 7d 20 7b 76 61 72  orary true} {var
c700: 4e 61 6d 65 20 64 62 7d 20 7b 71 75 69 65 74 20  Name db} {quiet 
c710: 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20  false} } {..    
c720: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
c730: 45 3a 20 46 69 72 73 74 2c 20 73 65 65 20 69 66  E: First, see if
c740: 20 6f 75 72 20 63 61 6c 6c 65 72 20 68 61 73 20   our caller has 
c750: 72 65 71 75 65 73 74 65 64 20 61 6e 20 69 6e 2d  requested an in-
c760: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
c770: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
c780: 20 73 65 74 20 69 73 4d 65 6d 6f 72 79 20 5b 69   set isMemory [i
c790: 73 4d 65 6d 6f 72 79 44 62 20 24 66 69 6c 65 4e  sMemoryDb $fileN
c7a0: 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  ame]....      #.
c7b0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46  .      # NOTE: F
c7c0: 6f 72 20 6e 6f 77 2c 20 61 6c 6c 20 74 65 73 74  or now, all test
c7d0: 20 64 61 74 61 62 61 73 65 73 20 75 73 65 64 20   databases used 
c7e0: 62 79 20 74 68 65 20 74 65 73 74 20 73 75 69 74  by the test suit
c7f0: 65 20 61 72 65 20 70 6c 61 63 65 64 0d 0a 20 20  e are placed..  
c800: 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 74 6f      #       into
c810: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64 69   the database di
c820: 72 65 63 74 6f 72 79 2e 20 20 45 61 63 68 20 64  rectory.  Each d
c830: 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 6c 61  atabase and rela
c840: 74 65 64 20 66 69 6c 65 73 0d 0a 20 20 20 20 20  ted files..     
c850: 20 23 20 20 20 20 20 20 20 75 73 65 64 20 62 79   #       used by
c860: 20 61 20 74 65 73 74 20 73 68 6f 75 6c 64 20 62   a test should b
c870: 65 20 63 6c 65 61 6e 65 64 20 75 70 20 62 79 20  e cleaned up by 
c880: 74 68 61 74 20 74 65 73 74 20 75 73 69 6e 67 20  that test using 
c890: 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
c8a0: 20 20 20 22 63 6c 65 61 6e 75 70 44 62 22 20 70     "cleanupDb" p
c8b0: 72 6f 63 65 64 75 72 65 2c 20 62 65 6c 6f 77 2e  rocedure, below.
c8c0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
c8d0: 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72 79 20   if {!$isMemory 
c8e0: 26 26 20 24 71 75 61 6c 69 66 79 7d 20 74 68 65  && $qualify} the
c8f0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  n {..        set
c900: 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20   fileName [file 
c910: 6a 6f 69 6e 20 5b 67 65 74 44 61 74 61 62 61 73  join [getDatabas
c920: 65 44 69 72 65 63 74 6f 72 79 5d 20 5b 66 69 6c  eDirectory] [fil
c930: 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65  e tail $fileName
c940: 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ]]..      }.... 
c950: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
c960: 4e 4f 54 45 3a 20 42 79 20 64 65 66 61 75 6c 74  NOTE: By default
c970: 2c 20 64 65 6c 65 74 65 20 61 6e 79 20 70 72 65  , delete any pre
c980: 2d 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61  -existing databa
c990: 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  se with the same
c9a0: 20 66 69 6c 65 0d 0a 20 20 20 20 20 20 23 20 20   file..      #  
c9b0: 20 20 20 20 20 6e 61 6d 65 20 69 66 20 69 74 20       name if it 
c9c0: 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73  currently exists
c9d0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
c9e0: 20 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72 79    if {!$isMemory
c9f0: 20 26 26 20 24 64 65 6c 65 74 65 20 26 26 20 5b   && $delete && [
ca00: 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c  file exists $fil
ca10: 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
ca20: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
ca30: 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
ca40: 70 74 20 74 6f 20 64 65 6c 65 74 65 20 61 6e 79  pt to delete any
ca50: 20 70 72 65 2d 65 78 69 73 74 69 6e 67 20 64 61   pre-existing da
ca60: 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20  tabase with the 
ca70: 73 61 6d 65 20 66 69 6c 65 0d 0a 20 20 20 20 20  same file..     
ca80: 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d 65 2e     #       name.
ca90: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
caa0: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
cab0: 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66 69  {file delete $fi
cac0: 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72 5d 7d 20  leName} error]} 
cad0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
cae0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
caf0: 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f   NOTE: We someho
cb00: 77 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65  w failed to dele
cb10: 74 65 20 74 68 65 20 66 69 6c 65 2c 20 72 65 70  te the file, rep
cb20: 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20  ort why...      
cb30: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
cb40: 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
cb50: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
cb60: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
cb70: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
cb80: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
cb90: 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
cba0: 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
cbb0: 64 65 6c 65 74 65 20 64 61 74 61 62 61 73 65 20  delete database 
cbc0: 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61  file \"" $fileNa
cbd0: 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
cbe0: 20 20 20 20 20 20 22 5c 22 20 64 75 72 69 6e 67        "\" during
cbf0: 20 73 65 74 75 70 2c 20 65 72 72 6f 72 3a 20 22   setup, error: "
cc00: 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d   \n\t $error \n]
cc10: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
cc20: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
cc30: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
cc40: 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65      # NOTE: Refe
cc50: 72 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69  r to the specifi
cc60: 65 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67  ed variable (e.g
cc70: 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65 20 63  . "db") in the c
cc80: 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20  ontext of our.. 
cc90: 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6c       #       cal
cca0: 6c 65 72 2e 20 20 54 68 65 20 68 61 6e 64 6c 65  ler.  The handle
ccb0: 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 64   to the opened d
ccc0: 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65 20  atabase will be 
ccd0: 73 74 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a 20  stored there... 
cce0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70       #..      up
ccf0: 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 64  var 1 $varName d
cd00: 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  b....      #..  
cd10: 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 74 61 72      # NOTE: Star
cd20: 74 20 62 75 69 6c 64 69 6e 67 20 74 68 65 20 63  t building the c
cd30: 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67  onnection string
cd40: 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 71 75  .  The only requ
cd50: 69 72 65 64 20 70 6f 72 74 69 6f 6e 0d 0a 20 20  ired portion..  
cd60: 20 20 20 20 23 20 20 20 20 20 20 20 6f 66 20 74      #       of t
cd70: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74  he connection st
cd80: 72 69 6e 67 20 69 73 20 74 68 65 20 64 61 74 61  ring is the data
cd90: 20 73 6f 75 72 63 65 2c 20 77 68 69 63 68 20 63   source, which c
cda0: 6f 6e 74 61 69 6e 73 20 74 68 65 0d 0a 20 20 20  ontains the..   
cdb0: 20 20 20 23 20 20 20 20 20 20 20 64 61 74 61 62     #       datab
cdc0: 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 74  ase file name it
cdd0: 73 65 6c 66 2e 20 20 49 66 20 6f 75 72 20 63 61  self.  If our ca
cde0: 6c 6c 65 72 20 77 61 6e 74 73 20 74 6f 20 75 73  ller wants to us
cdf0: 65 20 61 20 55 52 49 20 61 73 0d 0a 20 20 20 20  e a URI as..    
ce00: 20 20 23 20 20 20 20 20 20 20 74 68 65 20 64 61    #       the da
ce10: 74 61 20 73 6f 75 72 63 65 2c 20 75 73 65 20 74  ta source, use t
ce20: 68 65 20 46 75 6c 6c 55 72 69 20 63 6f 6e 6e 65  he FullUri conne
ce30: 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 70 72 6f  ction string pro
ce40: 70 65 72 74 79 20 74 6f 0d 0a 20 20 20 20 20 20  perty to..      
ce50: 23 20 20 20 20 20 20 20 70 72 65 76 65 6e 74 20  #       prevent 
ce60: 74 68 65 20 64 61 74 61 20 73 6f 75 72 63 65 20  the data source 
ce70: 73 74 72 69 6e 67 20 66 72 6f 6d 20 62 65 69 6e  string from bein
ce80: 67 20 6d 61 6e 67 6c 65 64 2e 0d 0a 20 20 20 20  g mangled...    
ce90: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24    #..      if {$
cea0: 75 72 69 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  uri} then {..   
ceb0: 20 20 20 20 20 73 65 74 20 63 6f 6e 6e 65 63 74       set connect
cec0: 69 6f 6e 20 7b 46 75 6c 6c 55 72 69 3d 24 7b 66  ion {FullUri=${f
ced0: 69 6c 65 4e 61 6d 65 7d 7d 0d 0a 20 20 20 20 20  ileName}}..     
cee0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
cef0: 20 20 20 73 65 74 20 63 6f 6e 6e 65 63 74 69 6f     set connectio
cf00: 6e 20 7b 44 61 74 61 20 53 6f 75 72 63 65 3d 24  n {Data Source=$
cf10: 7b 66 69 6c 65 4e 61 6d 65 7d 7d 0d 0a 20 20 20  {fileName}}..   
cf20: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
cf30: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53  .      # NOTE: S
cf40: 69 6e 63 65 20 74 68 69 73 20 70 72 6f 63 65 64  ince this proced
cf50: 75 72 65 20 68 61 73 20 6e 6f 20 73 70 65 63 69  ure has no speci
cf60: 61 6c 20 6b 6e 6f 77 6c 65 64 67 65 20 6f 66 20  al knowledge of 
cf70: 77 68 61 74 20 74 68 65 20 64 65 66 61 75 6c 74  what the default
cf80: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
cf90: 73 65 74 74 69 6e 67 20 69 73 20 66 6f 72 20 74  setting is for t
cfa0: 68 65 20 54 6f 46 75 6c 6c 50 61 74 68 20 63 6f  he ToFullPath co
cfb0: 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20  nnection string 
cfc0: 70 72 6f 70 65 72 79 2c 20 61 6c 77 61 79 73 0d  propery, always.
cfd0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
cfe0: 64 64 20 74 68 65 20 76 61 6c 75 65 20 77 65 20  dd the value we 
cff0: 6b 6e 6f 77 20 61 62 6f 75 74 20 74 6f 20 74 68  know about to th
d000: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72  e connection str
d010: 69 6e 67 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ing...      #.. 
d020: 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e       append conn
d030: 65 63 74 69 6f 6e 20 7b 3b 54 6f 46 75 6c 6c 50  ection {;ToFullP
d040: 61 74 68 3d 24 7b 71 75 61 6c 69 66 79 7d 7d 0d  ath=${qualify}}.
d050: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
d060: 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72    # NOTE: If our
d070: 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65   caller specifie
d080: 64 20 61 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  d a journal mode
d090: 2c 20 61 64 64 20 74 68 65 20 6e 65 63 65 73 73  , add the necess
d0a0: 61 72 79 20 70 6f 72 74 69 6f 6e 0d 0a 20 20 20  ary portion..   
d0b0: 20 20 20 23 20 20 20 20 20 20 20 6f 66 20 74 68     #       of th
d0c0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72  e connection str
d0d0: 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  ing now...      
d0e0: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  #..      if {[st
d0f0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6d 6f 64  ring length $mod
d100: 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
d110: 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 63          append c
d120: 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 4a 6f 75 72  onnection {;Jour
d130: 6e 61 6c 20 4d 6f 64 65 3d 24 7b 6d 6f 64 65 7d  nal Mode=${mode}
d140: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
d150: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
d160: 4f 54 45 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c  OTE: If our call
d170: 65 72 20 73 70 65 63 69 66 69 65 64 20 61 20 44  er specified a D
d180: 61 74 65 54 69 6d 65 20 66 6f 72 6d 61 74 2c 20  ateTime format, 
d190: 61 64 64 20 74 68 65 20 6e 65 63 65 73 73 61 72  add the necessar
d1a0: 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
d1b0: 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
d1c0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e  connection strin
d1d0: 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d  g now...      #.
d1e0: 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
d1f0: 6e 67 20 6c 65 6e 67 74 68 20 24 64 61 74 65 54  ng length $dateT
d200: 69 6d 65 46 6f 72 6d 61 74 5d 20 3e 20 30 7d 20  imeFormat] > 0} 
d210: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
d220: 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f  append connectio
d230: 6e 20 7b 3b 44 61 74 65 54 69 6d 65 46 6f 72 6d  n {;DateTimeForm
d240: 61 74 3d 24 7b 64 61 74 65 54 69 6d 65 46 6f 72  at=${dateTimeFor
d250: 6d 61 74 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a  mat}}..      }..
d260: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
d270: 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20   # NOTE: If our 
d280: 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64  caller specified
d290: 20 61 20 44 61 74 65 54 69 6d 65 4b 69 6e 64 2c   a DateTimeKind,
d2a0: 20 61 64 64 20 74 68 65 20 6e 65 63 65 73 73 61   add the necessa
d2b0: 72 79 20 70 6f 72 74 69 6f 6e 0d 0a 20 20 20 20  ry portion..    
d2c0: 20 20 23 20 20 20 20 20 20 20 6f 66 20 74 68 65    #       of the
d2d0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69   connection stri
d2e0: 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23  ng now...      #
d2f0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
d300: 69 6e 67 20 6c 65 6e 67 74 68 20 24 64 61 74 65  ing length $date
d310: 54 69 6d 65 4b 69 6e 64 5d 20 3e 20 30 7d 20 74  TimeKind] > 0} t
d320: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61  hen {..        a
d330: 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e  ppend connection
d340: 20 7b 3b 44 61 74 65 54 69 6d 65 4b 69 6e 64 3d   {;DateTimeKind=
d350: 24 7b 64 61 74 65 54 69 6d 65 4b 69 6e 64 7d 7d  ${dateTimeKind}}
d360: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
d370: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
d380: 54 45 3a 20 49 66 20 74 68 65 72 65 20 61 72 65  TE: If there are
d390: 20 61 6e 79 20 67 6c 6f 62 61 6c 20 28 70 65 72   any global (per
d3a0: 20 74 65 73 74 20 72 75 6e 29 20 63 6f 6e 6e 65   test run) conne
d3b0: 63 74 69 6f 6e 20 66 6c 61 67 73 20 63 75 72 72  ction flags curr
d3c0: 65 6e 74 6c 79 0d 0a 20 20 20 20 20 20 23 20 20  ently..      #  
d3d0: 20 20 20 20 20 73 65 74 2c 20 75 73 65 20 74 68       set, use th
d3e0: 65 6d 20 6e 6f 77 20 28 69 2e 65 2e 20 62 79 20  em now (i.e. by 
d3f0: 63 6f 6d 62 69 6e 69 6e 67 20 74 68 65 6d 20 77  combining them w
d400: 69 74 68 20 74 68 65 20 6f 6e 65 73 20 66 6f 72  ith the ones for
d410: 20 74 68 69 73 0d 0a 20 20 20 20 20 20 23 20 20   this..      #  
d420: 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 29       connection)
d430: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
d440: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
d450: 74 73 20 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f  ts ::connection_
d460: 66 6c 61 67 73 5d 20 26 26 20 5c 0d 0a 20 20 20  flags] && \..   
d470: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
d480: 65 6e 67 74 68 20 24 3a 3a 63 6f 6e 6e 65 63 74  ength $::connect
d490: 69 6f 6e 5f 66 6c 61 67 73 5d 20 3e 20 30 7d 20  ion_flags] > 0} 
d4a0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
d4b0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
d4c0: 45 3a 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f 67  E: Show (and log
d4d0: 29 20 74 68 61 74 20 74 68 65 20 6c 6f 63 61 6c  ) that the local
d4e0: 20 61 6e 64 20 67 6c 6f 62 61 6c 20 63 6f 6e 6e   and global conn
d4f0: 65 63 74 69 6f 6e 20 66 6c 61 67 73 2e 0d 0a 20  ection flags... 
d500: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
d510: 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
d520: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
d530: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
d540: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
d550: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
d560: 20 20 20 20 22 2d 2d 2d 2d 20 6c 6f 63 61 6c 20      "---- local 
d570: 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
d580: 20 61 72 65 3a 20 22 20 24 66 6c 61 67 73 20 5c   are: " $flags \
d590: 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  n]....          
d5a0: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
d5b0: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
d5c0: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
d5d0: 20 20 20 22 2d 2d 2d 2d 20 67 6c 6f 62 61 6c 20     "---- global 
d5e0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
d5f0: 20 64 65 74 65 63 74 65 64 3a 20 22 20 24 3a 3a   detected: " $::
d600: 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73  connection_flags
d610: 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d   \n]..        }.
d620: 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
d630: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f        # NOTE: Co
d640: 6d 62 69 6e 65 20 61 6e 64 2f 6f 72 20 72 65 70  mbine and/or rep
d650: 6c 61 63 65 20 74 68 65 20 63 6f 6e 6e 65 63 74  lace the connect
d660: 69 6f 6e 20 66 6c 61 67 73 20 61 6e 64 20 74 68  ion flags and th
d670: 65 6e 20 73 68 6f 77 20 74 68 65 0d 0a 20 20 20  en show the..   
d680: 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 65 77       #       new
d690: 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20   value...       
d6a0: 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
d6b0: 66 6c 61 67 73 20 5b 63 6f 6d 62 69 6e 65 46 6c  flags [combineFl
d6c0: 61 67 73 20 24 66 6c 61 67 73 20 24 3a 3a 63 6f  ags $flags $::co
d6d0: 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73 5d 0d  nnection_flags].
d6e0: 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
d6f0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68        # NOTE: Sh
d700: 6f 77 20 28 61 6e 64 20 6c 6f 67 29 20 74 68 65  ow (and log) the
d710: 20 6e 65 77 20 65 66 66 65 63 74 69 76 65 20 63   new effective c
d720: 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 2e  onnection flags.
d730: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
d740: 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
d750: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
d760: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
d770: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
d780: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
d790: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 6d         "---- com
d7a0: 62 69 6e 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e  bined connection
d7b0: 20 66 6c 61 67 73 20 61 72 65 3a 20 22 20 24 66   flags are: " $f
d7c0: 6c 61 67 73 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  lags \n]..      
d7d0: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
d7e0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
d7f0: 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20 63 61   NOTE: If our ca
d800: 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64 20 73  ller specified s
d810: 6f 6d 65 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63  ome SQLiteConnec
d820: 74 69 6f 6e 46 6c 61 67 73 2c 20 61 64 64 20 74  tionFlags, add t
d830: 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
d840: 20 20 6e 65 63 65 73 73 61 72 79 20 70 6f 72 74    necessary port
d850: 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65  ion of the conne
d860: 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77  ction string now
d870: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
d880: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
d890: 6e 67 74 68 20 24 66 6c 61 67 73 5d 20 3e 20 30  ngth $flags] > 0
d8a0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
d8b0: 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74    append connect
d8c0: 69 6f 6e 20 7b 3b 46 6c 61 67 73 3d 24 7b 66 6c  ion {;Flags=${fl
d8d0: 61 67 73 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a  ags}}..      }..
d8e0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
d8f0: 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20   # NOTE: If our 
d900: 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64  caller specified
d910: 20 61 6e 20 65 78 74 72 61 20 70 61 79 6c 6f 61   an extra payloa
d920: 64 20 74 6f 20 74 68 65 20 63 6f 6e 6e 65 63 74  d to the connect
d930: 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ion..      #    
d940: 20 20 20 73 74 72 69 6e 67 2c 20 61 70 70 65 6e     string, appen
d950: 64 20 69 74 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  d it now...     
d960: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   #..      if {[s
d970: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 65 78  tring length $ex
d980: 74 72 61 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  tra] > 0} then {
d990: 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  ..        append
d9a0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 3b 20 24   connection \; $
d9b0: 65 78 74 72 61 0d 0a 20 20 20 20 20 20 7d 0d 0a  extra..      }..
d9c0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
d9d0: 20 23 20 4e 4f 54 45 3a 20 4f 70 65 6e 20 74 68   # NOTE: Open th
d9e0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
d9f0: 63 74 69 6f 6e 20 6e 6f 77 2c 20 70 6c 61 63 69  ction now, placi
da00: 6e 67 20 74 68 65 20 6f 70 61 71 75 65 20 68 61  ng the opaque ha
da10: 6e 64 6c 65 20 76 61 6c 75 65 0d 0a 20 20 20 20  ndle value..    
da20: 20 20 23 20 20 20 20 20 20 20 69 6e 74 6f 20 74    #       into t
da30: 68 65 20 76 61 72 69 61 62 6c 65 20 73 70 65 63  he variable spec
da40: 69 66 69 65 64 20 62 79 20 6f 75 72 20 63 61 6c  ified by our cal
da50: 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ler...      #.. 
da60: 20 20 20 20 20 73 65 74 20 64 62 20 5b 73 71 6c       set db [sql
da70: 20 6f 70 65 6e 20 2d 74 79 70 65 20 53 51 4c 69   open -type SQLi
da80: 74 65 20 5b 73 75 62 73 74 20 24 63 6f 6e 6e 65  te [subst $conne
da90: 63 74 69 6f 6e 5d 5d 0d 0a 0d 0a 20 20 20 20 20  ction]]....     
daa0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
dab0: 3a 20 43 6f 6e 66 69 67 75 72 65 20 74 68 65 20  : Configure the 
dac0: 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
dad0: 6f 72 79 20 66 6f 72 20 74 68 65 20 6e 65 77 6c  ory for the newl
dae0: 79 20 6f 70 65 6e 65 64 20 64 61 74 61 62 61 73  y opened databas
daf0: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
db00: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 77 20   connection now 
db10: 75 6e 6c 65 73 73 20 6f 75 72 20 63 61 6c 6c 65  unless our calle
db20: 72 20 66 6f 72 62 69 64 73 20 69 74 2e 0d 0a 20  r forbids it... 
db30: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
db40: 20 7b 24 74 65 6d 70 6f 72 61 72 79 20 26 26 20   {$temporary && 
db50: 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
db60: 6e 6f 28 73 65 74 54 65 6d 70 6f 72 61 72 79 44  no(setTemporaryD
db70: 69 72 65 63 74 6f 72 79 29 5d 7d 20 74 68 65 6e  irectory)]} then
db80: 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 71 6c 20   {..        sql 
db90: 65 78 65 63 75 74 65 20 24 64 62 20 5b 61 70 70  execute $db [app
dba0: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
dbb0: 20 20 20 20 20 20 20 22 50 52 41 47 4d 41 20 74         "PRAGMA t
dbc0: 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74  emp_store_direct
dbd0: 6f 72 79 20 3d 20 5c 22 22 20 5b 67 65 74 54 65  ory = \"" [getTe
dbe0: 6d 70 6f 72 61 72 79 44 69 72 65 63 74 6f 72 79  mporaryDirectory
dbf0: 5d 20 5c 22 5c 3b 5d 0d 0a 20 20 20 20 20 20 7d  ] \"\;]..      }
dc00: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
dc10: 20 20 20 23 20 4e 4f 54 45 3a 20 41 6c 77 61 79     # NOTE: Alway
dc20: 73 20 72 65 74 75 72 6e 20 74 68 65 20 63 6f 6e  s return the con
dc30: 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 75  nection handle u
dc40: 70 6f 6e 20 73 75 63 63 65 73 73 2e 0d 0a 20 20  pon success...  
dc50: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74      #..      ret
dc60: 75 72 6e 20 24 64 62 0d 0a 20 20 20 20 7d 0d 0a  urn $db..    }..
dc70: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 44  ...    proc getD
dc80: 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20 7b 76  bConnection { {v
dc90: 61 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a  arName db} } {..
dca0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
dcb0: 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20   NOTE: Refer to 
dcc0: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61  the specified va
dcd0: 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62  riable (e.g. "db
dce0: 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78  ") in the contex
dcf0: 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20  t of our..      
dd00: 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20  #       caller. 
dd10: 20 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 74   The handle to t
dd20: 68 65 20 64 61 74 61 62 61 73 65 20 70 72 65 76  he database prev
dd30: 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 76 69  iously opened vi
dd40: 61 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  a the..      #  
dd50: 20 20 20 20 20 5b 73 65 74 75 70 44 62 5d 20 70       [setupDb] p
dd60: 72 6f 63 65 64 75 72 65 20 73 68 6f 75 6c 64 20  rocedure should 
dd70: 62 65 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e  be stored there.
dd80: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
dd90: 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d   upvar 1 $varNam
dda0: 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  e db....      #.
ddb0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
ddc0: 68 69 73 20 72 65 74 75 72 6e 73 20 74 68 65 20  his returns the 
ddd0: 41 44 4f 2e 4e 45 54 20 49 44 62 43 6f 6e 6e 65  ADO.NET IDbConne
dde0: 63 74 69 6f 6e 20 6f 62 6a 65 63 74 20 69 6e 73  ction object ins
ddf0: 74 61 6e 63 65 20 66 6f 72 20 74 68 65 0d 0a 20  tance for the.. 
de00: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 70 65       #       spe
de10: 63 69 66 69 65 64 20 64 61 74 61 62 73 65 20 68  cified databse h
de20: 61 6e 64 6c 65 2e 20 20 53 69 6e 63 65 20 67 65  andle.  Since ge
de30: 74 74 69 6e 67 20 74 68 69 73 20 6f 62 6a 65 63  tting this objec
de40: 74 20 72 65 6c 69 65 73 20 75 70 6f 6e 0d 0a 20  t relies upon.. 
de50: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
de60: 6c 65 20 69 6e 74 65 72 6e 61 6c 73 2c 20 67 72  le internals, gr
de70: 65 61 74 20 63 61 72 65 20 73 68 6f 75 6c 64 20  eat care should 
de80: 62 65 20 74 61 6b 65 6e 20 74 6f 20 61 76 6f 69  be taken to avoi
de90: 64 20 64 69 73 70 6f 73 69 6e 67 20 6f 66 0d 0a  d disposing of..
dea0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
deb0: 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 6f 74 68  is object or oth
dec0: 65 72 77 69 73 65 20 70 75 74 74 69 6e 67 20 69  erwise putting i
ded0: 74 20 69 6e 74 6f 20 61 6e 20 69 6e 76 61 6c 69  t into an invali
dee0: 64 20 73 74 61 74 65 2e 0d 0a 20 20 20 20 20 20  d state...      
def0: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
df00: 66 6f 20 65 78 69 73 74 73 20 64 62 5d 7d 20 74  fo exists db]} t
df10: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
df20: 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
df30: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a               obj
df40: 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
df50: 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d 6f 62  s +NonPublic -ob
df60: 6a 65 63 74 66 6c 61 67 73 20 2b 4e 6f 44 69 73  jectflags +NoDis
df70: 70 6f 73 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  pose \..        
df80: 20 20 20 20 20 20 20 20 2d 61 6c 69 61 73 20 49          -alias I
df90: 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74 41 63  nterpreter.GetAc
dfa0: 74 69 76 65 2e 63 6f 6e 6e 65 63 74 69 6f 6e 73  tive.connections
dfb0: 20 49 74 65 6d 20 24 64 62 7d 20 5c 0d 0a 20 20   Item $db} \..  
dfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
dfd0: 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sult] == 0} then
dfe0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
dff0: 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
e000: 45 3a 20 53 75 63 63 65 73 73 2c 20 72 65 74 75  E: Success, retu
e010: 72 6e 20 74 68 65 20 6f 70 61 71 75 65 20 6f 62  rn the opaque ob
e020: 6a 65 63 74 20 68 61 6e 64 6c 65 2e 0d 0a 20 20  ject handle...  
e030: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
e040: 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73       return $res
e050: 75 6c 74 0d 0a 20 20 20 20 20 20 20 20 7d 20 65  ult..        } e
e060: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
e070: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
e080: 4e 4f 54 45 3a 20 46 61 69 6c 75 72 65 2c 20 72  NOTE: Failure, r
e090: 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20  eport why...    
e0a0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
e0b0: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
e0c0: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
e0d0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
e0e0: 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
e0f0: 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 67  ING: failed to g
e100: 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  et connection ha
e110: 6e 64 6c 65 20 66 6f 72 20 64 61 74 61 62 61 73  ndle for databas
e120: 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  e \"" \..       
e130: 20 20 20 20 20 20 20 24 64 62 20 22 5c 22 2c 20         $db "\", 
e140: 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72  error: " \n\t $r
e150: 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20  esult \n]..     
e160: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20     }..      }.. 
e170: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
e180: 63 20 66 72 65 65 44 62 43 6f 6e 6e 65 63 74 69  c freeDbConnecti
e190: 6f 6e 20 7b 20 7b 76 61 72 4e 61 6d 65 20 63 6f  on { {varName co
e1a0: 6e 6e 65 63 74 69 6f 6e 7d 20 7d 20 7b 0d 0a 20  nnection} } {.. 
e1b0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
e1c0: 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74  NOTE: Refer to t
e1d0: 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72  he specified var
e1e0: 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 63 6f 6e  iable (e.g. "con
e1f0: 6e 65 63 74 69 6f 6e 22 29 20 69 6e 20 74 68 65  nection") in the
e200: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
e210: 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 20 63  context of our c
e220: 61 6c 6c 65 72 2e 20 20 54 68 65 20 6f 70 61 71  aller.  The opaq
e230: 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65  ue object handle
e240: 20 66 6f 72 20 61 6e 20 41 44 4f 2e 4e 45 54 0d   for an ADO.NET.
e250: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
e260: 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 65 76 69 6f  onnection previo
e270: 75 73 6c 79 20 72 65 74 75 72 6e 65 64 20 62 79  usly returned by
e280: 20 5b 67 65 74 44 62 43 6f 6e 6e 65 63 74 69 6f   [getDbConnectio
e290: 6e 5d 20 73 68 6f 75 6c 64 20 62 65 0d 0a 20 20  n] should be..  
e2a0: 20 20 20 20 23 20 20 20 20 20 20 20 73 74 6f 72      #       stor
e2b0: 65 64 20 74 68 65 72 65 2e 0d 0a 20 20 20 20 20  ed there...     
e2c0: 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20   #..      upvar 
e2d0: 31 20 24 76 61 72 4e 61 6d 65 20 63 6f 6e 6e 65  1 $varName conne
e2e0: 63 74 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 23  ction....      #
e2f0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
e300: 41 74 74 65 6d 70 74 20 74 6f 20 72 65 6d 6f 76  Attempt to remov
e310: 65 20 74 68 65 20 6f 70 61 71 75 65 20 6f 62 6a  e the opaque obj
e320: 65 63 74 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20  ect handle from 
e330: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 0d  the interpreter.
e340: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e  .      #       n
e350: 6f 77 2e 20 20 54 68 69 73 20 5b 6f 62 6a 65 63  ow.  This [objec
e360: 74 20 64 69 73 70 6f 73 65 5d 20 63 61 6c 6c 20  t dispose] call 
e370: 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c  will not actuall
e380: 79 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65  y dispose of the
e390: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
e3a0: 75 6e 64 65 72 6c 79 69 6e 67 20 6f 62 6a 65 63  underlying objec
e3b0: 74 20 62 65 63 61 75 73 65 20 74 68 65 20 2b 4e  t because the +N
e3c0: 6f 44 69 73 70 6f 73 65 20 66 6c 61 67 20 77 61  oDispose flag wa
e3d0: 73 20 73 65 74 20 6f 6e 20 69 74 0d 0a 20 20 20  s set on it..   
e3e0: 20 20 20 23 20 20 20 20 20 20 20 64 75 72 69 6e     #       durin
e3f0: 67 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68  g creation of th
e400: 65 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74 20  e opaque object 
e410: 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 23  handle...      #
e420: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
e430: 6f 20 65 78 69 73 74 73 20 63 6f 6e 6e 65 63 74  o exists connect
e440: 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ion] && \..     
e450: 20 20 20 20 20 5b 63 61 74 63 68 20 7b 6f 62 6a       [catch {obj
e460: 65 63 74 20 64 69 73 70 6f 73 65 20 24 63 6f 6e  ect dispose $con
e470: 6e 65 63 74 69 6f 6e 7d 20 65 72 72 6f 72 5d 7d  nection} error]}
e480: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
e490: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
e4a0: 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20 66  TE: We somehow f
e4b0: 61 69 6c 65 64 20 74 6f 20 72 65 6d 6f 76 65 20  ailed to remove 
e4c0: 74 68 65 20 68 61 6e 64 6c 65 2c 20 72 65 70 6f  the handle, repo
e4d0: 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20  rt why...       
e4e0: 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   #..        tput
e4f0: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
e500: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
e510: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d  .            "==
e520: 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
e530: 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 63 6f 6e  ed to remove con
e540: 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 5c  nection handle \
e550: 22 22 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c  "" $connection \
e560: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 5c  ..            "\
e570: 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  ", error: " \n\t
e580: 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20   $error \n]..   
e590: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
e5a0: 20 20 20 20 70 72 6f 63 20 61 64 64 44 62 43 6f      proc addDbCo
e5b0: 6e 6e 65 63 74 69 6f 6e 20 7b 20 63 6f 6e 6e 65  nnection { conne
e5c0: 63 74 69 6f 6e 20 7b 76 61 72 4e 61 6d 65 20 64  ction {varName d
e5d0: 62 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  b} } {..      #.
e5e0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
e5f0: 65 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63  efer to the spec
e600: 69 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28  ified variable (
e610: 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68  e.g. "db") in th
e620: 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72  e context of our
e630: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
e640: 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23  caller...      #
e650: 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20  ..      upvar 1 
e660: 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20  $varName db.... 
e670: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
e680: 4e 4f 54 45 3a 20 43 72 65 61 74 65 20 61 20 63  NOTE: Create a c
e690: 6f 72 72 65 63 74 6c 79 20 66 6f 72 6d 61 74 74  orrectly formatt
e6a0: 65 64 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  ed name for the 
e6b0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
e6c0: 69 6f 6e 20 74 6f 0d 0a 20 20 20 20 20 20 23 20  ion to..      # 
e6d0: 20 20 20 20 20 20 62 65 20 61 64 64 65 64 20 74        be added t
e6e0: 6f 20 74 68 65 20 6c 69 73 74 20 6d 61 6e 61 67  o the list manag
e6f0: 65 64 20 62 79 20 74 68 65 20 45 61 67 6c 65 20  ed by the Eagle 
e700: 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20  interpreter...  
e710: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
e720: 20 64 62 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f   db [object invo
e730: 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
e740: 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
e750: 20 20 45 61 67 6c 65 2e 5f 43 6f 6d 70 6f 6e 65    Eagle._Compone
e760: 6e 74 73 2e 50 72 69 76 61 74 65 2e 46 6f 72 6d  nts.Private.Form
e770: 61 74 4f 70 73 20 44 61 74 61 62 61 73 65 4f 62  atOps DatabaseOb
e780: 6a 65 63 74 4e 61 6d 65 20 24 63 6f 6e 6e 65 63  jectName $connec
e790: 74 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  tion \..        
e7a0: 20 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69    SQLiteConnecti
e7b0: 6f 6e 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b  on [object invok
e7c0: 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65  e Interpreter.Ge
e7d0: 74 41 63 74 69 76 65 20 4e 65 78 74 49 64 5d 5d  tActive NextId]]
e7e0: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
e7f0: 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 74     # NOTE: Add t
e800: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
e810: 65 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 64 20  ection provided 
e820: 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 20 74 6f  by our caller to
e830: 20 74 68 65 20 6c 69 73 74 0d 0a 20 20 20 20 20   the list..     
e840: 20 23 20 20 20 20 20 20 20 6f 66 20 74 68 6f 73   #       of thos
e850: 65 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 65 20 45  e known to the E
e860: 61 67 6c 65 20 69 6e 74 65 72 70 72 65 74 65 72  agle interpreter
e870: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
e880: 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
e890: 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
e8a0: 63 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65  c Interpreter.Ge
e8b0: 74 41 63 74 69 76 65 2e 63 6f 6e 6e 65 63 74 69  tActive.connecti
e8c0: 6f 6e 73 20 41 64 64 20 5c 0d 0a 20 20 20 20 20  ons Add \..     
e8d0: 20 20 20 20 20 24 64 62 20 24 63 6f 6e 6e 65 63       $db $connec
e8e0: 74 69 6f 6e 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  tion..    }.....
e8f0: 20 20 20 20 70 72 6f 63 20 63 6c 65 61 6e 75 70      proc cleanup
e900: 44 62 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 76  Db { fileName {v
e910: 61 72 4e 61 6d 65 20 64 62 7d 20 7b 63 6f 6c 6c  arName db} {coll
e920: 65 63 74 20 74 72 75 65 7d 20 7b 71 75 61 6c 69  ect true} {quali
e930: 66 79 20 74 72 75 65 7d 0d 0a 20 20 20 20 20 20  fy true}..      
e940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
e950: 64 65 6c 65 74 65 20 74 72 75 65 7d 20 7d 20 7b  delete true} } {
e960: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
e970: 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
e980: 20 74 6f 20 66 6f 72 63 65 20 61 6c 6c 20 70 65   to force all pe
e990: 6e 64 69 6e 67 20 22 67 61 72 62 61 67 65 22 20  nding "garbage" 
e9a0: 6f 62 6a 65 63 74 73 20 74 6f 20 62 65 20 63 6f  objects to be co
e9b0: 6c 6c 65 63 74 65 64 2c 0d 0a 20 20 20 20 20 20  llected,..      
e9c0: 23 20 20 20 20 20 20 20 69 6e 63 6c 75 64 69 6e  #       includin
e9d0: 67 20 53 51 4c 69 74 65 20 73 74 61 74 65 6d 65  g SQLite stateme
e9e0: 6e 74 73 20 61 6e 64 20 62 61 63 6b 75 70 20 6f  nts and backup o
e9f0: 62 6a 65 63 74 73 3b 20 74 68 69 73 20 73 68 6f  bjects; this sho
ea00: 75 6c 64 20 61 6c 6c 6f 77 0d 0a 20 20 20 20 20  uld allow..     
ea10: 20 23 20 20 20 20 20 20 20 74 68 65 20 75 6e 64   #       the und
ea20: 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
ea30: 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65   file to be dele
ea40: 74 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ted...      #.. 
ea50: 20 20 20 20 20 69 66 20 7b 24 63 6f 6c 6c 65 63       if {$collec
ea60: 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
ea70: 20 20 20 63 6f 6c 6c 65 63 74 47 61 72 62 61 67     collectGarbag
ea80: 65 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  e $::test_channe
ea90: 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  l..      }....  
eaa0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
eab0: 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68  OTE: Refer to th
eac0: 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72 69  e specified vari
ead0: 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22 29  able (e.g. "db")
eae0: 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20   in the context 
eaf0: 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23 20  of our..      # 
eb00: 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20 20 54        caller.  T
eb10: 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 74 68 65  he handle to the
eb20: 20 64 61 74 61 62 61 73 65 20 70 72 65 76 69 6f   database previo
eb30: 75 73 6c 79 20 6f 70 65 6e 65 64 20 76 69 61 20  usly opened via 
eb40: 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
eb50: 20 20 20 5b 73 65 74 75 70 44 62 5d 20 70 72 6f     [setupDb] pro
eb60: 63 65 64 75 72 65 20 73 68 6f 75 6c 64 20 62 65  cedure should be
eb70: 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a   stored there...
eb80: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75        #..      u
eb90: 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20  pvar 1 $varName 
eba0: 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  db....      #.. 
ebb0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6c 6f       # NOTE: Clo
ebc0: 73 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  se the connectio
ebd0: 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
ebe0: 65 20 6e 6f 77 2e 20 20 54 68 69 73 20 73 68 6f  e now.  This sho
ebf0: 75 6c 64 20 61 6c 6c 6f 77 20 75 73 0d 0a 20 20  uld allow us..  
ec00: 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 64      #       to d
ec10: 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c  elete the underl
ec20: 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
ec30: 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  le...      #..  
ec40: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
ec50: 69 73 74 73 20 64 62 5d 20 26 26 20 5b 63 61 74  ists db] && [cat
ec60: 63 68 20 7b 73 71 6c 20 63 6c 6f 73 65 20 24 64  ch {sql close $d
ec70: 62 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20  b} error]} then 
ec80: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
ec90: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65        # NOTE: We
eca0: 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20   somehow failed 
ecb0: 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 64 61 74  to close the dat
ecc0: 61 62 61 73 65 2c 20 72 65 70 6f 72 74 20 77 68  abase, report wh
ecd0: 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  y...        #.. 
ece0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
ecf0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
ed00: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
ed10: 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
ed20: 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
ed30: 20 63 6c 6f 73 65 20 64 61 74 61 62 61 73 65 20   close database 
ed40: 5c 22 22 20 24 64 62 20 22 5c 22 2c 20 65 72 72  \"" $db "\", err
ed50: 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  or: " \..       
ed60: 20 20 20 20 20 5c 6e 5c 74 20 24 65 72 72 6f 72       \n\t $error
ed70: 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d   \n]..      }...
ed80: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
ed90: 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20 73  # NOTE: First, s
eda0: 65 65 20 69 66 20 6f 75 72 20 63 61 6c 6c 65 72  ee if our caller
edb0: 20 68 61 73 20 72 65 71 75 65 73 74 65 64 20 61   has requested a
edc0: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
edd0: 62 61 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  base...      #..
ede0: 20 20 20 20 20 20 73 65 74 20 69 73 4d 65 6d 6f        set isMemo
edf0: 72 79 20 5b 69 73 4d 65 6d 6f 72 79 44 62 20 24  ry [isMemoryDb $
ee00: 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20  fileName]....   
ee10: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
ee20: 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 66 75  TE: Build the fu
ee30: 6c 6c 20 70 61 74 68 20 74 6f 20 74 68 65 20 64  ll path to the d
ee40: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
ee50: 65 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 61 6c 6c  e.  For now, all
ee60: 20 74 65 73 74 0d 0a 20 20 20 20 20 20 23 20 20   test..      #  
ee70: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
ee80: 6c 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 69  les are stored i
ee90: 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  n the temporary 
eea0: 64 69 72 65 63 74 6f 72 79 2e 0d 0a 20 20 20 20  directory...    
eeb0: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21    #..      if {!
eec0: 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24 71 75  $isMemory && $qu
eed0: 61 6c 69 66 79 7d 20 74 68 65 6e 20 7b 0d 0a 20  alify} then {.. 
eee0: 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e         set fileN
eef0: 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b  ame [file join [
ef00: 67 65 74 44 61 74 61 62 61 73 65 44 69 72 65 63  getDatabaseDirec
ef10: 74 6f 72 79 5d 20 5b 66 69 6c 65 20 74 61 69 6c  tory] [file tail
ef20: 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20   $fileName]]..  
ef30: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
ef40: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
ef50: 43 68 65 63 6b 20 69 66 20 74 68 65 20 66 69 6c  Check if the fil
ef60: 65 20 73 74 69 6c 6c 20 65 78 69 73 74 73 2e 0d  e still exists..
ef70: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
ef80: 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72 79 20 26  if {!$isMemory &
ef90: 26 20 24 64 65 6c 65 74 65 20 26 26 20 5b 66 69  & $delete && [fi
efa0: 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e  le exists $fileN
efb0: 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
efc0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
efd0: 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 64 65   # NOTE: Skip de
efe0: 6c 65 74 69 6e 67 20 64 61 74 61 62 61 73 65 20  leting database 
eff0: 66 69 6c 65 73 20 69 66 20 73 6f 6d 65 62 6f 64  files if somebod
f000: 79 20 73 65 74 73 20 74 68 65 20 67 6c 6f 62 61  y sets the globa
f010: 6c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  l..        #    
f020: 20 20 20 76 61 72 69 61 62 6c 65 20 74 6f 20 70     variable to p
f030: 72 65 76 65 6e 74 20 69 74 2e 0d 0a 20 20 20 20  revent it...    
f040: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
f050: 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
f060: 20 3a 3a 6e 6f 28 63 6c 65 61 6e 75 70 44 62 46   ::no(cleanupDbF
f070: 69 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ile)]} then {.. 
f080: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
f090: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74        # NOTE: At
f0a0: 74 65 6d 70 74 20 74 6f 20 64 65 6c 65 74 65 20  tempt to delete 
f0b0: 74 68 65 20 74 65 73 74 20 64 61 74 61 62 61 73  the test databas
f0c0: 65 20 66 69 6c 65 20 6e 6f 77 2e 0d 0a 20 20 20  e file now...   
f0d0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
f0e0: 20 20 20 20 69 66 20 7b 5b 73 65 74 20 63 6f 64      if {[set cod
f0f0: 65 20 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64  e [catch {file d
f100: 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d  elete $fileName}
f110: 20 65 72 72 6f 72 5d 5d 7d 20 74 68 65 6e 20 7b   error]]} then {
f120: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
f130: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
f140: 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20  OTE: We somehow 
f150: 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65  failed to delete
f160: 20 74 68 65 20 66 69 6c 65 2c 20 72 65 70 6f 72   the file, repor
f170: 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20  t why...        
f180: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
f190: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
f1a0: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
f1b0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
f1c0: 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
f1d0: 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
f1e0: 20 64 65 6c 65 74 65 20 64 61 74 61 62 61 73 65   delete database
f1f0: 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e   file \"" $fileN
f200: 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
f210: 20 20 20 20 20 20 20 22 5c 22 20 64 75 72 69 6e         "\" durin
f220: 67 20 63 6c 65 61 6e 75 70 2c 20 65 72 72 6f 72  g cleanup, error
f230: 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20  : " \n\t $error 
f240: 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
f250: 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
f260: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
f270: 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
f280: 45 3a 20 53 68 6f 77 20 74 68 61 74 20 77 65 20  E: Show that we 
f290: 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67  skipped deleting
f2a0: 20 74 68 65 20 66 69 6c 65 2e 0d 0a 20 20 20 20   the file...    
f2b0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
f2c0: 20 20 20 73 65 74 20 63 6f 64 65 20 30 0d 0a 0d     set code 0...
f2d0: 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
f2e0: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
f2f0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
f300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
f310: 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 73 6b 69  === WARNING: ski
f320: 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20 64 61  pped deleting da
f330: 74 61 62 61 73 65 20 66 69 6c 65 20 5c 22 22 20  tabase file \"" 
f340: 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20  $fileName \..   
f350: 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 64             "\" d
f360: 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 5c 6e 22  uring cleanup\n"
f370: 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
f380: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
f390: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
f3a0: 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 66 69 6c   # NOTE: The fil
f3b0: 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
f3c0: 2c 20 73 75 63 63 65 73 73 21 0d 0a 20 20 20 20  , success!..    
f3d0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
f3e0: 65 74 20 63 6f 64 65 20 30 0d 0a 20 20 20 20 20  et code 0..     
f3f0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
f400: 72 6e 20 24 63 6f 64 65 0d 0a 20 20 20 20 7d 0d  rn $code..    }.
f410: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 65 74  ....    proc set
f420: 75 70 44 62 49 6e 74 65 72 72 75 70 74 43 61 6c  upDbInterruptCal
f430: 6c 62 61 63 6b 20 7b 20 63 68 61 6e 6e 65 6c 20  lback { channel 
f440: 6c 6f 67 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74  log } {..      t
f450: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
f460: 2d 2d 2d 20 73 65 74 74 69 6e 67 20 75 70 20 64  --- setting up d
f470: 65 62 75 67 67 65 72 20 69 6e 74 65 72 72 75 70  ebugger interrup
f480: 74 20 63 61 6c 6c 62 61 63 6b 2e 2e 2e 20 22 0d  t callback... ".
f490: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  ...      if {[ca
f4a0: 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  tch {..        #
f4b0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
f4c0: 3a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  : Make sure the 
f4d0: 73 63 72 69 70 74 20 64 65 62 75 67 67 65 72 20  script debugger 
f4e0: 61 6e 64 20 74 68 65 20 69 73 6f 6c 61 74 65 64  and the isolated
f4f0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 61 72 65   interpreter are
f500: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
f510: 20 20 73 65 74 75 70 20 61 6e 64 20 72 65 61 64    setup and read
f520: 79 20 66 6f 72 20 75 73 65 2e 0d 0a 20 20 20 20  y for use...    
f530: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 64      #..        d
f540: 65 62 75 67 20 73 65 74 75 70 20 74 72 75 65 20  ebug setup true 
f550: 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20  true....        
f560: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
f570: 45 3a 20 4c 6f 61 64 20 74 68 65 20 6e 65 63 65  E: Load the nece
f580: 73 73 61 72 79 20 70 61 63 6b 61 67 65 73 20 69  ssary packages i
f590: 6e 74 6f 20 74 68 65 20 69 73 6f 6c 61 74 65 64  nto the isolated
f5a0: 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20   interpreter... 
f5b0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
f5c0: 20 20 64 65 62 75 67 20 65 76 61 6c 20 7b 0d 0a    debug eval {..
f5d0: 20 20 20 20 20 20 20 20 20 20 70 61 63 6b 61 67            packag
f5e0: 65 20 72 65 71 75 69 72 65 20 45 61 67 6c 65 0d  e require Eagle.
f5f0: 0a 20 20 20 20 20 20 20 20 20 20 70 61 63 6b 61  .          packa
f600: 67 65 20 72 65 71 75 69 72 65 20 45 61 67 6c 65  ge require Eagle
f610: 2e 4c 69 62 72 61 72 79 0d 0a 20 20 20 20 20 20  .Library..      
f620: 20 20 20 20 70 61 63 6b 61 67 65 20 72 65 71 75      package requ
f630: 69 72 65 20 45 61 67 6c 65 2e 54 65 73 74 0d 0a  ire Eagle.Test..
f640: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
f650: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
f660: 23 20 4e 4f 54 45 3a 20 43 6f 70 79 20 74 68 65  # NOTE: Copy the
f670: 20 6e 65 63 65 73 73 61 72 79 20 76 61 72 69 61   necessary varia
f680: 62 6c 65 73 20 69 6e 74 6f 20 74 68 65 20 69 73  bles into the is
f690: 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72 65 74  olated interpret
f6a0: 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  er...        #..
f6b0: 20 20 20 20 20 20 20 20 64 65 62 75 67 20 69 6e          debug in
f6c0: 76 6f 6b 65 20 30 20 73 65 74 20 3a 3a 74 65 73  voke 0 set ::tes
f6d0: 74 5f 63 68 61 6e 6e 65 6c 20 24 63 68 61 6e 6e  t_channel $chann
f6e0: 65 6c 3b 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20  el; # NOTE: For 
f6f0: 5b 74 70 75 74 73 5d 2e 0d 0a 20 20 20 20 20 20  [tputs]...      
f700: 20 20 64 65 62 75 67 20 69 6e 76 6f 6b 65 20 30    debug invoke 0
f710: 20 73 65 74 20 3a 3a 74 65 73 74 5f 6c 6f 67 20   set ::test_log 
f720: 24 6c 6f 67 3b 20 23 20 4e 4f 54 45 3a 20 46 6f  $log; # NOTE: Fo
f730: 72 20 5b 74 6c 6f 67 5d 2e 0d 0a 0d 0a 20 20 20  r [tlog].....   
f740: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
f750: 23 20 4e 4f 54 45 3a 20 49 6e 73 74 61 6c 6c 20  # NOTE: Install 
f760: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 73 63 72  the callback scr
f770: 69 70 74 20 74 6f 20 62 65 20 65 76 61 6c 75 61  ipt to be evalua
f780: 74 65 64 20 69 6e 20 74 68 65 20 69 73 6f 6c 61  ted in the isola
f790: 74 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ted..        #  
f7a0: 20 20 20 20 20 69 6e 74 65 72 70 72 65 74 65 72       interpreter
f7b0: 20 77 68 65 6e 20 74 68 69 73 20 69 6e 74 65 72   when this inter
f7c0: 70 72 65 74 65 72 20 69 73 20 69 6e 74 65 72 72  preter is interr
f7d0: 75 70 74 65 64 20 62 79 20 73 63 72 69 70 74 0d  upted by script.
f7e0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
f7f0: 20 63 61 6e 63 65 6c 6c 61 74 69 6f 6e 2c 20 65   cancellation, e
f800: 74 63 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  tc...        #..
f810: 20 20 20 20 20 20 20 20 64 65 62 75 67 20 63 61          debug ca
f820: 6c 6c 62 61 63 6b 20 61 70 70 6c 79 20 7b 7b 73  llback apply {{s
f830: 65 6e 64 65 72 20 65 7d 20 7b 0d 0a 20 20 20 20  ender e} {..    
f840: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
f850: 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
f860: 20 69 66 20 74 68 69 73 20 63 61 6c 6c 62 61 63   if this callbac
f870: 6b 20 69 73 20 6f 6e 65 20 74 68 61 74 20 77 65  k is one that we
f880: 20 63 61 72 65 20 61 62 6f 75 74 2e 0d 0a 20 20   care about...  
f890: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
f8a0: 20 20 20 20 20 69 66 20 7b 22 43 61 6e 63 65 6c       if {"Cancel
f8b0: 65 64 22 20 69 6e 20 5b 73 70 6c 69 74 20 5b 24  ed" in [split [$
f8c0: 65 20 49 6e 74 65 72 72 75 70 74 54 79 70 65 5d  e InterruptType]
f8d0: 20 22 2c 20 22 5d 7d 20 74 68 65 6e 20 7b 0d 0a   ", "]} then {..
f8e0: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
f8f0: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
f900: 45 3a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75  E: Iterate throu
f910: 67 68 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20  gh all database 
f920: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6b 6e 6f 77  connections know
f930: 6e 20 74 6f 20 74 68 65 0d 0a 20 20 20 20 20 20  n to the..      
f940: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 61        #       pa
f950: 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72  rent interpreter
f960: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
f970: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 62  ..            ob
f980: 6a 65 63 74 20 66 6f 72 65 61 63 68 20 2d 61 6c  ject foreach -al
f990: 69 61 73 20 70 61 69 72 20 5c 0d 0a 20 20 20 20  ias pair \..    
f9a0: 20 20 20 20 20 20 20 20 20 20 20 20 5b 6f 62 6a              [obj
f9b0: 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
f9c0: 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 24 65 20  s +NonPublic $e 
f9d0: 49 6e 74 65 72 70 72 65 74 65 72 2e 63 6f 6e 6e  Interpreter.conn
f9e0: 65 63 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20  ections] {..    
f9f0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
fa00: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
fa10: 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 63 61  E: Attempt to ca
fa20: 6e 63 65 6c 20 61 6e 79 20 53 51 4c 20 71 75 65  ncel any SQL que
fa30: 72 69 65 73 20 69 6e 20 70 72 6f 67 72 65 73 73  ries in progress
fa40: 20 6f 6e 20 74 68 69 73 0d 0a 20 20 20 20 20 20   on this..      
fa50: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
fa60: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
fa70: 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ion...          
fa80: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
fa90: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
faa0: 7b 24 70 61 69 72 20 56 61 6c 75 65 2e 43 61 6e  {$pair Value.Can
fab0: 63 65 6c 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65  cel} error]} the
fac0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
fad0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
fae0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
faf0: 6e 64 41 72 67 73 20 5c 6e 20 5c 0d 0a 20 20 20  ndArgs \n \..   
fb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb10: 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
fb20: 66 61 69 6c 65 64 20 74 6f 20 63 61 6e 63 65 6c  failed to cancel
fb30: 20 71 75 65 72 79 20 66 6f 72 20 63 6f 6e 6e 65   query for conne
fb40: 63 74 69 6f 6e 20 5c 22 22 20 5c 0d 0a 20 20 20  ction \"" \..   
fb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb60: 20 5b 24 70 61 69 72 20 4b 65 79 5d 20 22 5c 22   [$pair Key] "\"
fb70: 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  , error: " \n\t 
fb80: 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20  $error \n]..    
fb90: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
fba0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
fbb0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
fbc0: 20 7d 7d 0d 0a 20 20 20 20 20 20 7d 20 65 72 72   }}..      } err
fbd0: 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  or] == 0} then {
fbe0: 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
fbf0: 73 74 72 61 69 6e 74 20 69 6e 74 65 72 72 75 70  straint interrup
fc00: 74 43 61 6c 6c 62 61 63 6b 2e 73 71 6c 69 74 65  tCallback.sqlite
fc10: 33 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75  3....        tpu
fc20: 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c  ts $channel yes\
fc30: 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  n..      } else 
fc40: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
fc50: 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
fc60: 64 41 72 67 73 20 22 6e 6f 2c 20 65 72 72 6f 72  dArgs "no, error
fc70: 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20  : " \n\t $error 
fc80: 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  \n]..      }..  
fc90: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
fca0: 20 63 6c 65 61 6e 75 70 46 69 6c 65 20 7b 20 66   cleanupFile { f
fcb0: 69 6c 65 4e 61 6d 65 20 7b 63 6f 6c 6c 65 63 74  ileName {collect
fcc0: 20 74 72 75 65 7d 20 7b 66 6f 72 63 65 20 66 61   true} {force fa
fcd0: 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  lse} } {..      
fce0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
fcf0: 20 41 74 74 65 6d 70 74 20 74 6f 20 66 6f 72 63   Attempt to forc
fd00: 65 20 61 6c 6c 20 70 65 6e 64 69 6e 67 20 22 67  e all pending "g
fd10: 61 72 62 61 67 65 22 20 6f 62 6a 65 63 74 73 20  arbage" objects 
fd20: 74 6f 20 62 65 20 63 6f 6c 6c 65 63 74 65 64 2c  to be collected,
fd30: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
fd40: 69 6e 63 6c 75 64 69 6e 67 20 53 51 4c 69 74 65  including SQLite
fd50: 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6e 64 20   statements and 
fd60: 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 3b 20  backup objects; 
fd70: 74 68 69 73 20 73 68 6f 75 6c 64 20 61 6c 6c 6f  this should allo
fd80: 77 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  w..      #      
fd90: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
fda0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
fdb0: 20 62 65 20 64 65 6c 65 74 65 64 2e 0d 0a 20 20   be deleted...  
fdc0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
fdd0: 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65 6e 20  {$collect} then 
fde0: 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c 6c 65  {..        colle
fdf0: 63 74 47 61 72 62 61 67 65 20 24 3a 3a 74 65 73  ctGarbage $::tes
fe00: 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20  t_channel..     
fe10: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
fe20: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
fe30: 63 6b 20 69 66 20 74 68 65 20 66 69 6c 65 20 73  ck if the file s
fe40: 74 69 6c 6c 20 65 78 69 73 74 73 2e 0d 0a 20 20  till exists...  
fe50: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
fe60: 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66  {[file exists $f
fe70: 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
fe80: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
fe90: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69       # NOTE: Ski
fea0: 70 20 64 65 6c 65 74 69 6e 67 20 74 65 73 74 20  p deleting test 
feb0: 66 69 6c 65 73 20 69 66 20 73 6f 6d 65 62 6f 64  files if somebod
fec0: 79 20 73 65 74 73 20 74 68 65 20 67 6c 6f 62 61  y sets the globa
fed0: 6c 20 76 61 72 69 61 62 6c 65 0d 0a 20 20 20 20  l variable..    
fee0: 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 70      #       to p
fef0: 72 65 76 65 6e 74 20 69 74 2e 0d 0a 20 20 20 20  revent it...    
ff00: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
ff10: 66 20 7b 24 66 6f 72 63 65 20 7c 7c 20 21 5b 69  f {$force || ![i
ff20: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
ff30: 63 6c 65 61 6e 75 70 46 69 6c 65 29 5d 7d 20 74  cleanupFile)]} t
ff40: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
ff50: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
ff60: 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
ff70: 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 73 74   delete the test
ff80: 20 66 69 6c 65 20 6e 6f 77 2e 0d 0a 20 20 20 20   file now...    
ff90: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
ffa0: 20 20 20 69 66 20 7b 5b 73 65 74 20 63 6f 64 65     if {[set code
ffb0: 20 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64 65   [catch {file de
ffc0: 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d 20  lete $fileName} 
ffd0: 65 72 72 6f 72 5d 5d 7d 20 74 68 65 6e 20 7b 0d  error]]} then {.
ffe0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
fff0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
10000 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20 66  TE: We somehow f
10010 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20  ailed to delete 
10020 74 68 65 20 66 69 6c 65 2c 20 72 65 70 6f 72 74  the file, report
10030 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 20   why...         
10040 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
10050 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
10060 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
10070 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
10080 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
10090 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
100a0 64 65 6c 65 74 65 20 74 65 73 74 20 66 69 6c 65  delete test file
100b0 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c   \"" $fileName \
100c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
100d0 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c 65    "\" during cle
100e0 61 6e 75 70 2c 20 65 72 72 6f 72 3a 20 22 20 5c  anup, error: " \
100f0 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a  n\t $error \n]..
10100 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
10110 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
10120 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
10130 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68        # NOTE: Sh
10140 6f 77 20 74 68 61 74 20 77 65 20 73 6b 69 70 70  ow that we skipp
10150 65 64 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  ed deleting the 
10160 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20  file...         
10170 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   #..          se
10180 74 20 63 6f 64 65 20 30 0d 0a 0d 0a 20 20 20 20  t code 0....    
10190 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
101a0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
101b0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
101c0 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
101d0 41 52 4e 49 4e 47 3a 20 73 6b 69 70 70 65 64 20  ARNING: skipped 
101e0 64 65 6c 65 74 69 6e 67 20 74 65 73 74 20 66 69  deleting test fi
101f0 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65  le \"" $fileName
10200 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
10210 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c 65    "\" during cle
10220 61 6e 75 70 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  anup\n"]..      
10230 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73    }..      } els
10240 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e {..        #..
10250 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
10260 54 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  The file does no
10270 74 20 65 78 69 73 74 2c 20 73 75 63 63 65 73 73  t exist, success
10280 21 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  !..        #..  
10290 20 20 20 20 20 20 73 65 74 20 63 6f 64 65 20 30        set code 0
102a0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
102b0 20 20 20 72 65 74 75 72 6e 20 24 63 6f 64 65 0d     return $code.
102c0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
102d0 72 6f 63 20 63 6f 6c 6c 65 63 74 47 61 72 62 61  roc collectGarba
102e0 67 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 6d 69  ge { channel {mi
102f0 6c 6c 69 73 65 63 6f 6e 64 73 20 31 30 30 30 7d  lliseconds 1000}
10300 20 7b 71 75 69 65 74 20 74 72 75 65 7d 20 7d 20   {quiet true} } 
10310 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  {..      if {[ca
10320 74 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f  tch {object invo
10330 6b 65 20 47 43 20 47 65 74 54 6f 74 61 6c 4d 65  ke GC GetTotalMe
10340 6d 6f 72 79 20 66 61 6c 73 65 7d 20 72 65 73 75  mory false} resu
10350 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  lt] == 0} then {
10360 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24  ..        if {!$
10370 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
10380 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
10390 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
103a0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
103b0 20 20 20 20 20 22 2d 2d 2d 2d 20 6d 65 6d 6f 72       "---- memor
103c0 79 20 69 6e 20 75 73 65 20 62 79 20 74 68 65 20  y in use by the 
103d0 43 4c 52 20 62 65 66 6f 72 65 20 63 6f 6c 6c 65  CLR before colle
103e0 63 74 69 6f 6e 2e 2e 2e 20 22 20 5c 0d 0a 20 20  ction... " \..  
103f0 20 20 20 20 20 20 20 20 20 20 20 20 24 72 65 73              $res
10400 75 6c 74 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d  ult " bytes\n"].
10410 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
10420 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
10430 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
10440 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
10450 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 3d  ..            "=
10460 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
10470 6c 65 64 20 74 6f 20 67 65 74 20 43 4c 52 20 6d  led to get CLR m
10480 65 6d 6f 72 79 20 75 73 61 67 65 2c 20 65 72 72  emory usage, err
10490 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  or: " \..       
104a0 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c       \n\t $resul
104b0 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  t \n]..      }..
104c0 0d 0a 20 20 20 20 20 20 23 23 23 23 23 23 23 23  ..      ########
104d0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
104e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
104f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
10500 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
10510 23 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  #....      #..  
10520 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 70 65      # NOTE: Repe
10530 61 74 65 64 6c 79 20 61 74 74 65 6d 70 74 20 74  atedly attempt t
10540 6f 20 63 6f 6c 6c 65 63 74 20 67 61 72 62 61 67  o collect garbag
10550 65 20 75 6e 74 69 6c 20 74 68 65 20 61 6c 6c 6f  e until the allo
10560 74 74 65 64 20 6e 75 6d 62 65 72 0d 0a 20 20 20  tted number..   
10570 20 20 20 23 20 20 20 20 20 20 20 6f 66 20 6d 69     #       of mi
10580 6c 6c 69 73 65 63 6f 6e 64 73 20 68 61 73 20 65  lliseconds has e
10590 6c 61 70 73 65 64 2e 20 20 41 6c 77 61 79 73 20  lapsed.  Always 
105a0 61 74 74 65 6d 70 74 20 74 6f 20 63 6f 6c 6c 65  attempt to colle
105b0 63 74 20 67 61 72 62 61 67 65 0d 0a 20 20 20 20  ct garbage..    
105c0 20 20 23 20 20 20 20 20 20 20 61 74 20 6c 65 61    #       at lea
105d0 73 74 20 6f 6e 63 65 2e 0d 0a 20 20 20 20 20 20  st once...      
105e0 23 0d 0a 20 20 20 20 20 20 73 65 74 20 73 74 61  #..      set sta
105f0 72 74 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64  rt [clock second
10600 73 5d 0d 0a 20 20 20 20 20 20 73 65 74 20 73 74  s]..      set st
10610 6f 70 20 5b 65 78 70 72 20 7b 24 73 74 61 72 74  op [expr {$start
10620 20 2b 20 28 24 6d 69 6c 6c 69 73 65 63 6f 6e 64   + ($millisecond
10630 73 20 2f 20 31 30 30 30 29 7d 5d 0d 0a 0d 0a 20  s / 1000)}].... 
10640 20 20 20 20 20 64 6f 20 7b 0d 0a 20 20 20 20 20       do {..     
10650 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
10660 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
10670 20 66 6f 72 63 65 20 61 20 66 75 6c 6c 20 67 61   force a full ga
10680 72 62 61 67 65 20 63 6f 6c 6c 65 63 74 69 6f 6e  rbage collection
10690 20 6e 6f 77 2e 20 20 52 65 70 6f 72 74 20 61 6e   now.  Report an
106a0 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
106b0 20 20 20 65 72 72 6f 72 20 74 68 61 74 20 69 73     error that is
106c0 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 66 20   encountered if 
106d0 77 65 20 66 61 69 6c 2e 0d 0a 20 20 20 20 20 20  we fail...      
106e0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
106f0 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20  {[catch {object 
10700 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54 6f 74  invoke GC GetTot
10710 61 6c 4d 65 6d 6f 72 79 20 74 72 75 65 7d 20 65  alMemory true} e
10720 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  rror]} then {.. 
10730 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
10740 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
10750 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
10760 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
10770 4e 47 3a 20 66 61 69 6c 65 64 20 66 75 6c 6c 20  NG: failed full 
10780 67 61 72 62 61 67 65 20 63 6f 6c 6c 65 63 74 69  garbage collecti
10790 6f 6e 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a  on, error: " \..
107a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e                \n
107b0 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20  \t $error \n].. 
107c0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
107d0 20 20 20 20 73 65 74 20 6e 6f 77 20 5b 63 6c 6f      set now [clo
107e0 63 6b 20 73 65 63 6f 6e 64 73 5d 0d 0a 20 20 20  ck seconds]..   
107f0 20 20 20 7d 20 77 68 69 6c 65 20 7b 24 73 74 61     } while {$sta
10800 72 74 20 3c 3d 20 24 6e 6f 77 20 26 26 20 24 6e  rt <= $now && $n
10810 6f 77 20 3c 20 24 73 74 6f 70 7d 0d 0a 0d 0a 20  ow < $stop}.... 
10820 20 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23       ###########
10830 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
10840 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
10850 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
10860 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
10870 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74  ..      if {[cat
10880 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b  ch {object invok
10890 65 20 47 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d  e GC GetTotalMem
108a0 6f 72 79 20 66 61 6c 73 65 7d 20 72 65 73 75 6c  ory false} resul
108b0 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  t] == 0} then {.
108c0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71  .        if {!$q
108d0 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
108e0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
108f0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
10900 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
10910 20 20 20 20 22 2d 2d 2d 2d 20 6d 65 6d 6f 72 79      "---- memory
10920 20 69 6e 20 75 73 65 20 62 79 20 74 68 65 20 43   in use by the C
10930 4c 52 20 61 66 74 65 72 20 63 6f 6c 6c 65 63 74  LR after collect
10940 69 6f 6e 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20  ion... " \..    
10950 20 20 20 20 20 20 20 20 20 20 24 72 65 73 75 6c            $resul
10960 74 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20  t " bytes\n"].. 
10970 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
10980 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
10990 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
109a0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
109b0 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
109c0 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
109d0 64 20 74 6f 20 67 65 74 20 43 4c 52 20 6d 65 6d  d to get CLR mem
109e0 6f 72 79 20 75 73 61 67 65 2c 20 65 72 72 6f 72  ory usage, error
109f0 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  : " \..         
10a00 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20     \n\t $result 
10a10 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  \n]..      }..  
10a20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
10a30 20 67 65 74 53 51 4c 69 74 65 48 61 6e 64 6c 65   getSQLiteHandle
10a40 43 6f 75 6e 74 73 20 7b 20 63 68 61 6e 6e 65 6c  Counts { channel
10a50 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d   {quiet false} }
10a60 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 72 65   {..      set re
10a70 73 75 6c 74 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20  sult [list].... 
10a80 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 43 6f       if {[haveCo
10a90 6e 73 74 72 61 69 6e 74 20 5c 0d 0a 20 20 20 20  nstraint \..    
10aa0 20 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65            define
10ab0 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74 65 6d 2e  Constant.System.
10ac0 44 61 74 61 2e 53 51 4c 69 74 65 2e 43 4f 55 4e  Data.SQLite.COUN
10ad0 54 5f 48 41 4e 44 4c 45 5d 7d 20 74 68 65 6e 20  T_HANDLE]} then 
10ae0 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
10af0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64        # NOTE: Ad
10b00 64 20 65 61 63 68 20 63 72 69 74 69 63 61 6c 20  d each critical 
10b10 68 61 6e 64 6c 65 20 63 6f 75 6e 74 20 74 6f 20  handle count to 
10b20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20 6c 69  the resulting li
10b30 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  st...        #..
10b40 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
10b50 6e 61 6d 65 20 5b 6c 69 73 74 20 63 6f 6e 6e 65  name [list conne
10b60 63 74 69 6f 6e 43 6f 75 6e 74 20 73 74 61 74 65  ctionCount state
10b70 6d 65 6e 74 43 6f 75 6e 74 20 62 61 63 6b 75 70  mentCount backup
10b80 43 6f 75 6e 74 5d 20 7b 0d 0a 20 20 20 20 20 20  Count] {..      
10b90 20 20 20 20 73 65 74 20 76 61 6c 75 65 20 5b 6f      set value [o
10ba0 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
10bb0 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
10bc0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
10bd0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
10be0 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d  te.UnsafeNativeM
10bf0 65 74 68 6f 64 73 20 24 6e 61 6d 65 5d 0d 0a 0d  ethods $name]...
10c00 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
10c10 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
10c20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
10c30 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
10c40 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
10c50 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
10c60 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65 20  critical handle 
10c70 63 6f 75 6e 74 20 5c 22 22 20 24 6e 61 6d 65 20  count \"" $name 
10c80 22 5c 22 20 69 73 20 22 20 24 76 61 6c 75 65 20  "\" is " $value 
10c90 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
10ca0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 6c 61  ....          la
10cb0 70 70 65 6e 64 20 72 65 73 75 6c 74 20 24 76 61  ppend result $va
10cc0 6c 75 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  lue..        }..
10cd0 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
10ce0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
10cf0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
10d00 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
10d10 61 63 74 75 61 6c 20 68 61 6e 64 6c 65 20 63 6f  actual handle co
10d20 75 6e 74 73 20 61 72 65 20 6e 6f 74 20 61 76 61  unts are not ava
10d30 69 6c 61 62 6c 65 3b 20 74 68 65 72 65 66 6f 72  ilable; therefor
10d40 65 2c 20 6a 75 73 74 0d 0a 20 20 20 20 20 20 20  e, just..       
10d50 20 23 20 20 20 20 20 20 20 72 65 74 75 72 6e 20   #       return 
10d60 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e 0d 0a  an empty list...
10d70 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
10d80 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
10d90 6c 20 22 2d 2d 2d 2d 20 63 72 69 74 69 63 61 6c  l "---- critical
10da0 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 73 20 75   handle counts u
10db0 6e 61 76 61 69 6c 61 62 6c 65 5c 6e 22 0d 0a 20  navailable\n".. 
10dc0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
10dd0 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a  return $result..
10de0 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
10df0 6f 63 20 73 68 75 74 64 6f 77 6e 53 51 4c 69 74  oc shutdownSQLit
10e00 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 66 6f 72  e { channel {for
10e10 63 65 20 66 61 6c 73 65 7d 20 7b 71 75 69 65 74  ce false} {quiet
10e20 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20   false} } {..   
10e30 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
10e40 54 45 3a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  TE: Make sure th
10e50 61 74 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c  at SQLite core l
10e60 69 62 72 61 72 79 20 69 73 20 63 6f 6d 70 6c 65  ibrary is comple
10e70 74 65 6c 79 20 73 68 75 74 64 6f 77 6e 2e 20 20  tely shutdown.  
10e80 54 68 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20  This..      #   
10e90 20 20 20 20 69 73 20 75 73 65 64 20 62 79 20 74      is used by t
10ea0 65 73 74 73 20 74 68 61 74 20 63 68 61 6e 67 65  ests that change
10eb0 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f   configuration o
10ec0 70 74 69 6f 6e 73 20 61 6e 64 2f 6f 72 20 74 68  ptions and/or th
10ed0 6f 73 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ose..      #    
10ee0 20 20 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20     that need to 
10ef0 6d 61 6b 65 20 73 75 72 65 20 6c 6f 67 67 69 6e  make sure loggin
10f00 67 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  g is initialized
10f10 20 28 69 2e 65 2e 20 6a 75 73 74 20 69 6e 20 63   (i.e. just in c
10f20 61 73 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ase..      #    
10f30 20 20 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f     the SQLite co
10f40 72 65 20 6c 69 62 72 61 72 79 20 77 61 73 20 69  re library was i
10f50 6e 69 74 69 61 6c 69 7a 65 64 20 69 6e 20 74 68  nitialized in th
10f60 65 20 70 72 6f 63 65 73 73 20 70 72 69 6f 72 20  e process prior 
10f70 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  to..      #     
10f80 20 20 74 68 65 20 53 51 4c 69 74 65 4c 6f 67 20    the SQLiteLog 
10f90 63 6c 61 73 73 20 62 65 69 6e 67 20 61 62 6c 65  class being able
10fa0 20 74 6f 20 73 65 74 75 70 20 69 74 73 20 6c 6f   to setup its lo
10fb0 67 67 69 6e 67 20 63 61 6c 6c 62 61 63 6b 29 2e  gging callback).
10fc0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
10fd0 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20 73  Normally, this s
10fe0 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 70 65  hould only be pe
10ff0 72 66 6f 72 6d 65 64 20 69 66 20 53 51 4c 69 74  rformed if SQLit
11000 65 20 69 73 20 6c 6f 61 64 65 64 20 61 6e 64 0d  e is loaded and.
11010 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72  .      #       r
11020 65 61 64 79 20 66 6f 72 20 75 73 65 20 62 79 20  eady for use by 
11030 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d  the test suite..
11040 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
11050 69 66 20 7b 24 66 6f 72 63 65 20 7c 7c 20 5b 69  if {$force || [i
11060 73 53 51 4c 69 74 65 52 65 61 64 79 5d 7d 20 74  sSQLiteReady]} t
11070 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
11080 0d 0a 20 20 20 20 20 20 20 20 23 20 42 55 47 46  ..        # BUGF
11090 49 58 3a 20 42 65 66 6f 72 65 20 63 61 6c 6c 69  IX: Before calli
110a0 6e 67 20 74 68 65 20 6e 61 74 69 76 65 20 73 68  ng the native sh
110b0 75 74 64 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 2c  utdown function,
110c0 20 6d 61 6b 65 20 73 75 72 65 20 62 6f 74 68 0d   make sure both.
110d0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
110e0 20 20 20 6f 66 20 74 68 65 20 50 52 41 47 4d 41     of the PRAGMA
110f0 20 72 65 6c 61 74 65 64 20 64 69 72 65 63 74 6f   related directo
11100 72 79 20 6e 61 6d 65 73 20 61 72 65 20 66 72 65  ry names are fre
11110 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ed...        #..
11120 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
11130 53 51 4c 69 74 65 44 69 72 65 63 74 6f 72 69 65  SQLiteDirectorie
11140 73 20 24 63 68 61 6e 6e 65 6c 20 74 72 75 65 0d  s $channel true.
11150 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  ...        if {[
11160 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e  catch {object in
11170 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
11180 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
11190 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
111a0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73  .Data.SQLite.Uns
111b0 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
111c0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
111d0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 68 75 74      sqlite3_shut
111e0 64 6f 77 6e 7d 20 72 65 73 75 6c 74 5d 20 3d 3d  down} result] ==
111f0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
11200 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
11210 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
11220 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
11230 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
11240 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
11250 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20       "---- call 
11260 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e  sqlite3_shutdown
11270 28 29 2e 2e 2e 20 6f 6b 3a 20 22 20 24 72 65 73  ()... ok: " $res
11280 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ult \n]..       
11290 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
112a0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
112b0 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
112c0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
112d0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
112e0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
112f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11300 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69   "---- call sqli
11310 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 2e 2e  te3_shutdown()..
11320 2e 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  . error: " \n\t 
11330 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
11340 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
11350 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
11360 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
11370 20 72 65 70 6f 72 74 53 51 4c 69 74 65 52 65 73   reportSQLiteRes
11380 6f 75 72 63 65 73 20 7b 20 63 68 61 6e 6e 65 6c  ources { channel
11390 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7b   {quiet false} {
113a0 63 6f 6c 6c 65 63 74 20 74 72 75 65 7d 20 7d 20  collect true} } 
113b0 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
113c0 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 61    # NOTE: Skip a
113d0 6c 6c 20 6f 75 74 70 75 74 20 69 66 20 77 65 20  ll output if we 
113e0 61 72 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 22  are running in "
113f0 71 75 69 65 74 22 20 6d 6f 64 65 2e 0d 0a 20 20  quiet" mode...  
11400 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
11410 7b 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  {[haveConstraint
11420 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
11430 20 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74    defineConstant
11440 2e 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  .System.Data.SQL
11450 69 74 65 2e 49 4e 54 45 52 4f 50 5f 56 49 52 54  ite.INTEROP_VIRT
11460 55 41 4c 5f 54 41 42 4c 45 5d 20 26 26 20 5c 0d  UAL_TABLE] && \.
11470 0a 20 20 20 20 20 20 20 20 20 20 5b 68 61 76 65  .          [have
11480 43 6f 6e 73 74 72 61 69 6e 74 20 5c 0d 0a 20 20  Constraint \..  
11490 20 20 20 20 20 20 20 20 20 20 20 20 64 65 66 69              defi
114a0 6e 65 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74 65  neConstant.Syste
114b0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 54 52  m.Data.SQLite.TR
114c0 41 43 4b 5f 4d 45 4d 4f 52 59 5f 42 59 54 45 53  ACK_MEMORY_BYTES
114d0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
114e0 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
114f0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
11500 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
11510 20 22 2d 2d 2d 2d 20 63 75 72 72 65 6e 74 20 6d   "---- current m
11520 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20  emory in use by 
11530 53 51 4c 69 74 65 4d 65 6d 6f 72 79 2e 2e 2e 20  SQLiteMemory... 
11540 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  "..        }....
11550 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
11560 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b  ch {object invok
11570 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
11580 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
11590 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
115a0 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65  ta.SQLite.SQLite
115b0 4d 65 6d 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20  Memory \..      
115c0 20 20 20 20 20 20 20 20 20 20 62 79 74 65 73 41            bytesA
115d0 6c 6c 6f 63 61 74 65 64 7d 20 6d 65 6d 6f 72 79  llocated} memory
115e0 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
115f0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
11600 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
11610 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
11620 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
11630 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20  dArgs $memory " 
11640 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20  bytes\n"]..     
11650 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
11660 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
11670 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75      set memory u
11680 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20  nknown....      
11690 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
116a0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
116b0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
116c0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
116d0 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20  $memory \n]..   
116e0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
116f0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69    }....        i
11700 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
11710 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
11720 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d  uts $channel "--
11730 2d 2d 20 6d 61 78 69 6d 75 6d 20 6d 65 6d 6f 72  -- maximum memor
11740 79 20 69 6e 20 75 73 65 20 62 79 20 53 51 4c 69  y in use by SQLi
11750 74 65 4d 65 6d 6f 72 79 2e 2e 2e 20 22 0d 0a 20  teMemory... ".. 
11760 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
11770 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
11780 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
11790 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
117a0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
117b0 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
117c0 51 4c 69 74 65 2e 53 51 4c 69 74 65 4d 65 6d 6f  QLite.SQLiteMemo
117d0 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ry \..          
117e0 20 20 20 20 20 20 6d 61 78 69 6d 75 6d 42 79 74        maximumByt
117f0 65 73 41 6c 6c 6f 63 61 74 65 64 7d 20 6d 65 6d  esAllocated} mem
11800 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ory] == 0} then 
11810 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
11820 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
11830 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
11840 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
11850 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79  pendArgs $memory
11860 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20   " bytes\n"]..  
11870 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
11880 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
11890 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72         set memor
118a0 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20  y unknown....   
118b0 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
118c0 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
118d0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
118e0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
118f0 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a  gs $memory \n]..
11900 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
11910 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
11920 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71  ...      if {!$q
11930 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
11940 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
11950 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 75 72 72 65  nnel "---- curre
11960 6e 74 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65  nt memory in use
11970 20 62 79 20 53 51 4c 69 74 65 2e 2e 2e 20 22 0d   by SQLite... ".
11980 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
11990 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62    if {[catch {ob
119a0 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
119b0 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
119c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  .              S
119d0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
119e0 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  e.UnsafeNativeMe
119f0 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20  thods \..       
11a00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
11a10 65 6d 6f 72 79 5f 75 73 65 64 7d 20 6d 65 6d 6f  emory_used} memo
11a20 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  ry] == 0} then {
11a30 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24  ..        if {!$
11a40 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
11a50 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
11a60 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
11a70 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20 62 79  rgs $memory " by
11a80 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  tes\n"]..       
11a90 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65   }..      } else
11aa0 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
11ab0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d         # NOTE: M
11ac0 61 79 62 65 20 74 68 65 20 53 51 4c 69 74 65 20  aybe the SQLite 
11ad0 63 6f 72 65 20 6c 69 62 72 61 72 79 20 69 73 20  core library is 
11ae0 75 6e 61 76 61 69 6c 61 62 6c 65 3f 0d 0a 20 20  unavailable?..  
11af0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
11b00 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e   set memory unkn
11b10 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69  own....        i
11b20 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
11b30 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
11b40 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
11b50 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79  pendArgs $memory
11b60 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d   \n]..        }.
11b70 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
11b80 20 20 73 65 74 20 72 65 73 75 6c 74 20 24 6d 65    set result $me
11b90 6d 6f 72 79 3b 20 23 20 4e 4f 54 45 3a 20 52 65  mory; # NOTE: Re
11ba0 74 75 72 6e 20 6d 65 6d 6f 72 79 20 69 6e 2d 75  turn memory in-u
11bb0 73 65 20 74 6f 20 6f 75 72 20 63 61 6c 6c 65 72  se to our caller
11bc0 2e 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21  .....      if {!
11bd0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
11be0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
11bf0 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 6d 61 78  hannel "---- max
11c00 69 6d 75 6d 20 6d 65 6d 6f 72 79 20 69 6e 20 75  imum memory in u
11c10 73 65 20 62 79 20 53 51 4c 69 74 65 2e 2e 2e 20  se by SQLite... 
11c20 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  "..      }....  
11c30 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
11c40 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
11c50 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
11c60 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
11c70 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
11c80 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65  ite.UnsafeNative
11c90 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20  Methods \..     
11ca0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11cb0 5f 6d 65 6d 6f 72 79 5f 68 69 67 68 77 61 74 65  _memory_highwate
11cc0 72 20 30 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20  r 0} memory] == 
11cd0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
11ce0 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
11cf0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
11d00 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
11d10 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65   [appendArgs $me
11d20 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e 22 5d  mory " bytes\n"]
11d30 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
11d40 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
11d50 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
11d60 23 20 4e 4f 54 45 3a 20 4d 61 79 62 65 20 74 68  # NOTE: Maybe th
11d70 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69  e SQLite core li
11d80 62 72 61 72 79 20 69 73 20 75 6e 61 76 61 69 6c  brary is unavail
11d90 61 62 6c 65 3f 0d 0a 20 20 20 20 20 20 20 20 23  able?..        #
11da0 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d 65  ..        set me
11db0 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a  mory unknown....
11dc0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
11dd0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
11de0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
11df0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
11e00 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20  s $memory \n].. 
11e10 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
11e20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 24  }....      if {$
11e30 63 6f 6c 6c 65 63 74 7d 20 74 68 65 6e 20 7b 0d  collect} then {.
11e40 0a 20 20 20 20 20 20 20 20 63 6f 6c 6c 65 63 74  .        collect
11e50 47 61 72 62 61 67 65 20 24 63 68 61 6e 6e 65 6c  Garbage $channel
11e60 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
11e70 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
11e80 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
11e90 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
11ea0 2d 2d 2d 2d 20 63 75 72 72 65 6e 74 20 6d 65 6d  ---- current mem
11eb0 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 74 68  ory in use by th
11ec0 65 20 43 4c 52 2e 2e 2e 20 22 0d 0a 20 20 20 20  e CLR... "..    
11ed0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
11ee0 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20  {[catch {object 
11ef0 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54 6f 74  invoke GC GetTot
11f00 61 6c 4d 65 6d 6f 72 79 20 66 61 6c 73 65 7d 20  alMemory false} 
11f10 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68  memory] == 0} th
11f20 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
11f30 20 7b 5b 73 74 72 69 6e 67 20 69 73 20 69 6e 74   {[string is int
11f40 65 67 65 72 20 2d 73 74 72 69 63 74 20 24 6d 65  eger -strict $me
11f50 6d 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  mory]} then {.. 
11f60 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
11f70 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
11f80 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
11f90 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
11fa0 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20 62  Args $memory " b
11fb0 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  ytes\n"]..      
11fc0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
11fd0 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
11fe0 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 69 6e     set memory in
11ff0 76 61 6c 69 64 0d 0a 0d 0a 20 20 20 20 20 20 20  valid....       
12000 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
12010 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
12020 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
12030 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  el [appendArgs $
12040 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20  memory \n]..    
12050 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
12060 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65   }..      } else
12070 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
12080 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a  memory unknown..
12090 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24  ..        if {!$
120a0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
120b0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
120c0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
120d0 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d  rgs $memory \n].
120e0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
120f0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74    }....      ret
12100 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20  urn $result..   
12110 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
12120 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 69  checkForSQLiteDi
12130 72 65 63 74 6f 72 69 65 73 20 7b 20 63 68 61 6e  rectories { chan
12140 6e 65 6c 20 7b 72 65 73 65 74 20 66 61 6c 73 65  nel {reset false
12150 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
12160 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
12170 65 63 6b 20 69 66 20 74 68 65 20 73 71 6c 69 74  eck if the sqlit
12180 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72  e3_win32_set_dir
12190 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20  ectory function 
121a0 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20  is available... 
121b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 74 70       #..      tp
121c0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5c 0d 0a  uts $channel \..
121d0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
121e0 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 66 75 6e  checking for fun
121f0 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 5f 77 69  ction sqlite3_wi
12200 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
12210 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  y... "....      
12220 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
12230 20 54 68 69 73 20 63 61 6c 6c 20 74 6f 20 74 68   This call to th
12240 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  e sqlite3_win32_
12250 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66 75  set_directory fu
12260 6e 63 74 69 6f 6e 20 75 73 65 73 20 74 68 65 0d  nction uses the.
12270 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69  .      #       i
12280 6e 76 61 6c 69 64 20 76 61 6c 75 65 20 30 20 66  nvalid value 0 f
12290 6f 72 20 74 68 65 20 66 69 72 73 74 20 61 72 67  or the first arg
122a0 75 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 64  ument.  This cod
122b0 65 20 69 73 20 64 65 73 69 67 6e 65 64 0d 0a 20  e is designed.. 
122c0 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20       #       to 
122d0 63 68 65 63 6b 20 69 66 20 63 61 6c 6c 69 6e 67  check if calling
122e0 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 77 69   the function wi
122f0 6c 6c 20 72 61 69 73 65 20 61 6e 20 65 78 63 65  ll raise an exce
12300 70 74 69 6f 6e 20 28 69 2e 65 2e 0d 0a 20 20 20  ption (i.e...   
12310 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 61     #       the a
12320 63 74 75 61 6c 20 72 65 73 75 6c 74 20 6f 66 20  ctual result of 
12330 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  the function doe
12340 73 20 6e 6f 74 20 6d 61 74 74 65 72 20 61 73 20  s not matter as 
12350 6c 6f 6e 67 20 61 73 20 6e 6f 0d 0a 20 20 20 20  long as no..    
12360 20 20 23 20 20 20 20 20 20 20 64 69 72 65 63 74    #       direct
12370 6f 72 79 20 69 73 20 63 68 61 6e 67 65 64 29 2e  ory is changed).
12380 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
12390 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
123a0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a               obj
123b0 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
123c0 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
123d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
123e0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
123f0 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74  .UnsafeNativeMet
12400 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  hods \..        
12410 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69        sqlite3_wi
12420 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
12430 79 20 30 20 6e 75 6c 6c 7d 5d 20 3d 3d 20 30 7d  y 0 null}] == 0}
12440 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
12450 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
12460 54 45 3a 20 43 61 6c 6c 69 6e 67 20 74 68 65 20  TE: Calling the 
12470 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
12480 74 5f 64 69 72 65 63 74 6f 72 79 20 66 75 6e 63  t_directory func
12490 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 0d 0a 20  tion does not.. 
124a0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
124b0 61 75 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f  ause an exceptio
124c0 6e 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 69 74  n; therefore, it
124d0 20 6d 75 73 74 20 62 65 20 61 76 61 69 6c 61 62   must be availab
124e0 6c 65 20 28 69 2e 65 2e 0d 0a 20 20 20 20 20 20  le (i.e...      
124f0 20 20 23 20 20 20 20 20 20 20 65 76 65 6e 20 74    #       even t
12500 68 6f 75 67 68 20 69 74 20 73 68 6f 75 6c 64 20  hough it should 
12510 72 65 74 75 72 6e 20 61 20 66 61 69 6c 75 72 65  return a failure
12520 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 6e 20   return code in 
12530 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20  this..        # 
12540 20 20 20 20 20 20 63 61 73 65 29 2e 0d 0a 20 20        case)...  
12550 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
12560 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 73   addConstraint s
12570 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
12580 5f 64 69 72 65 63 74 6f 72 79 0d 0a 0d 0a 20 20  _directory....  
12590 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
125a0 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 0d 0a 20 20  nnel yes\n....  
125b0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
125c0 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20 6f 75   # NOTE: Does ou
125d0 72 20 63 61 6c 6c 65 72 20 77 61 6e 74 20 74 6f  r caller want to
125e0 20 72 65 73 65 74 20 74 68 65 20 64 69 72 65 63   reset the direc
125f0 74 6f 72 69 65 73 3f 0d 0a 20 20 20 20 20 20 20  tories?..       
12600 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
12610 24 72 65 73 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $reset} then {..
12620 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
12630 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e         # NOTE: N
12640 6f 77 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  ow make sure the
12650 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 65   database and te
12660 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72  mporary director
12670 69 65 73 20 61 72 65 0d 0a 20 20 20 20 20 20 20  ies are..       
12680 20 20 20 23 20 20 20 20 20 20 20 72 65 73 65 74     #       reset
12690 20 74 68 65 69 72 20 64 65 66 61 75 6c 74 20 76   their default v
126a0 61 6c 75 65 73 2c 20 77 68 69 63 68 20 73 68 6f  alues, which sho
126b0 75 6c 64 20 62 65 20 6e 75 6c 6c 20 66 6f 72 20  uld be null for 
126c0 62 6f 74 68 2e 0d 0a 20 20 20 20 20 20 20 20 20  both...         
126d0 20 23 20 20 20 20 20 20 20 53 69 6e 63 65 20 74   #       Since t
126e0 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  he sqlite3_win32
126f0 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66  _set_directory f
12700 75 6e 63 74 69 6f 6e 20 69 73 20 61 76 61 69 6c  unction is avail
12710 61 62 6c 65 2c 0d 0a 20 20 20 20 20 20 20 20 20  able,..         
12720 20 23 20 20 20 20 20 20 20 75 73 65 20 69 74 2e   #       use it.
12730 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
12740 20 20 20 20 20 20 20 20 20 66 6f 72 20 7b 73 65           for {se
12750 74 20 69 6e 64 65 78 20 31 7d 20 7b 24 69 6e 64  t index 1} {$ind
12760 65 78 20 3c 20 33 7d 20 7b 69 6e 63 72 20 69 6e  ex < 3} {incr in
12770 64 65 78 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20  dex} {..        
12780 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
12790 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
127a0 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
127b0 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
127c0 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
127d0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
127e0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
127f0 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
12800 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ods \..         
12810 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
12820 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72  e3_win32_set_dir
12830 65 63 74 6f 72 79 20 24 69 6e 64 65 78 20 6e 75  ectory $index nu
12840 6c 6c 7d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ll} \..         
12850 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c             resul
12860 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  t] == 0} then {.
12870 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
12880 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
12890 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
128a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
128b0 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65  ---- call sqlite
128c0 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65  3_win32_set_dire
128d0 63 74 6f 72 79 28 22 20 24 69 6e 64 65 78 20 5c  ctory(" $index \
128e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
128f0 20 20 20 20 22 2c 20 6e 75 6c 6c 29 2e 2e 2e 20      ", null)... 
12900 6f 6b 3a 20 22 20 24 72 65 73 75 6c 74 20 5c 6e  ok: " $result \n
12910 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
12920 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
12930 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
12940 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
12950 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
12960 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c         "---- cal
12970 6c 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  l sqlite3_win32_
12980 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28 22 20  set_directory(" 
12990 24 69 6e 64 65 78 20 5c 0d 0a 20 20 20 20 20 20  $index \..      
129a0 20 20 20 20 20 20 20 20 20 20 20 20 22 2c 20 6e              ", n
129b0 75 6c 6c 29 2e 2e 2e 20 65 72 72 6f 72 3a 20 22  ull)... error: "
129c0 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e   \n\t $result \n
129d0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
129e0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
129f0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
12a00 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
12a10 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
12a20 20 6e 6f 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20 20   no\n....       
12a30 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
12a40 54 45 3a 20 44 6f 65 73 20 6f 75 72 20 63 61 6c  TE: Does our cal
12a50 6c 65 72 20 77 61 6e 74 20 74 6f 20 72 65 73 65  ler want to rese
12a60 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 69 65  t the directorie
12a70 73 3f 20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c  s?  This can onl
12a80 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
12a90 20 20 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20     be performed 
12aa0 69 66 20 53 51 4c 69 74 65 20 69 73 20 6c 6f 61  if SQLite is loa
12ab0 64 65 64 20 61 6e 64 20 72 65 61 64 79 20 66 6f  ded and ready fo
12ac0 72 20 75 73 65 20 62 79 20 74 68 65 20 74 65 73  r use by the tes
12ad0 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
12ae0 20 20 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20     suite...     
12af0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
12b00 20 7b 24 72 65 73 65 74 20 26 26 20 5b 69 73 53   {$reset && [isS
12b10 51 4c 69 74 65 52 65 61 64 79 5d 7d 20 74 68 65  QLiteReady]} the
12b20 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  n {..          #
12b30 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
12b40 54 45 3a 20 4e 6f 77 20 6d 61 6b 65 20 73 75 72  TE: Now make sur
12b50 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  e the database a
12b60 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72  nd temporary dir
12b70 65 63 74 6f 72 69 65 73 20 61 72 65 0d 0a 20 20  ectories are..  
12b80 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
12b90 72 65 73 65 74 20 74 68 65 69 72 20 64 65 66 61  reset their defa
12ba0 75 6c 74 20 76 61 6c 75 65 73 2c 20 77 68 69 63  ult values, whic
12bb0 68 20 73 68 6f 75 6c 64 20 62 65 20 6e 75 6c 6c  h should be null
12bc0 20 66 6f 72 20 62 6f 74 68 2e 0d 0a 20 20 20 20   for both...    
12bd0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 53 69        #       Si
12be0 6e 63 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  nce the sqlite3_
12bf0 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
12c00 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  ory function doe
12c10 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20 20  s not..         
12c20 20 23 20 20 20 20 20 20 20 61 70 70 65 61 72 20   #       appear 
12c30 74 6f 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2c  to be available,
12c40 20 75 73 65 20 74 68 65 20 61 73 73 6f 63 69 61   use the associa
12c50 74 65 64 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61  ted PRAGMA comma
12c60 6e 64 73 0d 0a 20 20 20 20 20 20 20 20 20 20 23  nds..          #
12c70 20 20 20 20 20 20 20 69 6e 73 74 65 61 64 2e 0d         instead..
12c80 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
12c90 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
12ca0 64 69 72 65 63 74 6f 72 79 20 5b 6c 69 73 74 20  directory [list 
12cb0 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65 63  data_store_direc
12cc0 74 6f 72 79 20 74 65 6d 70 5f 73 74 6f 72 65 5f  tory temp_store_
12cd0 64 69 72 65 63 74 6f 72 79 5d 20 7b 0d 0a 20 20  directory] {..  
12ce0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73 71            set sq
12cf0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 50  l [appendArgs "P
12d00 52 41 47 4d 41 20 22 20 24 64 69 72 65 63 74 6f  RAGMA " $directo
12d10 72 79 20 22 20 3d 20 5c 22 5c 22 3b 22 5d 0d 0a  ry " = \"\";"]..
12d20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
12d30 20 7b 5b 63 61 74 63 68 20 7b 65 78 65 63 75 74   {[catch {execut
12d40 65 53 71 6c 20 24 73 71 6c 7d 20 72 65 73 75 6c  eSql $sql} resul
12d50 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  t] == 0} then {.
12d60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
12d70 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
12d80 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
12d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
12da0 2d 2d 2d 2d 20 65 78 65 63 75 74 65 20 50 52 41  ---- execute PRA
12db0 47 4d 41 20 22 20 24 64 69 72 65 63 74 6f 72 79  GMA " $directory
12dc0 20 22 2e 2e 2e 20 6f 6b 3a 20 5c 22 22 20 5c 0d   "... ok: \"" \.
12dd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12de0 20 20 20 24 72 65 73 75 6c 74 20 5c 22 5c 6e 5d     $result \"\n]
12df0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ..            } 
12e00 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
12e10 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
12e20 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
12e30 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
12e40 20 20 20 20 20 20 22 2d 2d 2d 2d 20 65 78 65 63        "---- exec
12e50 75 74 65 20 50 52 41 47 4d 41 20 22 20 24 64 69  ute PRAGMA " $di
12e60 72 65 63 74 6f 72 79 20 22 2e 2e 2e 20 65 72 72  rectory "... err
12e70 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  or: " \..       
12e80 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20             \n\t 
12e90 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
12ea0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
12eb0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
12ec0 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
12ed0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
12ee0 4e 4f 54 45 3a 20 46 69 6e 61 6c 6c 79 2c 20 73  NOTE: Finally, s
12ef0 68 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20  how the current 
12f00 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74  value of the dat
12f10 61 62 61 73 65 20 61 6e 64 20 74 65 6d 70 6f 72  abase and tempor
12f20 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ary..      #    
12f30 20 20 20 64 69 72 65 63 74 6f 72 69 65 73 2e 20     directories. 
12f40 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 62   This can only b
12f50 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20 53  e performed if S
12f60 51 4c 69 74 65 20 69 73 20 6c 6f 61 64 65 64 0d  QLite is loaded.
12f70 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
12f80 6e 64 20 72 65 61 64 79 20 66 6f 72 20 75 73 65  nd ready for use
12f90 20 62 79 20 74 68 65 20 74 65 73 74 20 73 75 69   by the test sui
12fa0 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  te...      #..  
12fb0 20 20 20 20 69 66 20 7b 5b 69 73 53 51 4c 69 74      if {[isSQLit
12fc0 65 52 65 61 64 79 5d 7d 20 74 68 65 6e 20 7b 0d  eReady]} then {.
12fd0 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  .        foreach
12fe0 20 64 69 72 65 63 74 6f 72 79 20 5b 6c 69 73 74   directory [list
12ff0 20 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65   data_store_dire
13000 63 74 6f 72 79 20 74 65 6d 70 5f 73 74 6f 72 65  ctory temp_store
13010 5f 64 69 72 65 63 74 6f 72 79 5d 20 7b 0d 0a 20  _directory] {.. 
13020 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
13030 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
13040 72 67 73 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69  rgs "---- checki
13050 6e 67 20 22 20 24 64 69 72 65 63 74 6f 72 79 20  ng " $directory 
13060 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20  "... "]....     
13070 20 20 20 20 20 73 65 74 20 73 71 6c 20 5b 61 70       set sql [ap
13080 70 65 6e 64 41 72 67 73 20 22 50 52 41 47 4d 41  pendArgs "PRAGMA
13090 20 22 20 24 64 69 72 65 63 74 6f 72 79 20 5c 3b   " $directory \;
130a0 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  ]....          i
130b0 66 20 7b 5b 63 61 74 63 68 20 7b 65 78 65 63 75  f {[catch {execu
130c0 74 65 53 71 6c 20 24 73 71 6c 20 73 63 61 6c 61  teSql $sql scala
130d0 72 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d  r} result] == 0}
130e0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
130f0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
13100 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
13110 22 6f 6b 3a 20 5c 22 22 20 24 72 65 73 75 6c 74  "ok: \"" $result
13120 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20   \"\n]..        
13130 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
13140 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
13150 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
13160 67 73 20 22 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  gs "error: " \n\
13170 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20  t $result \n].. 
13180 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
13190 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
131a0 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
131b0 6f 63 20 6c 6f 61 64 53 51 4c 69 74 65 54 65 73  oc loadSQLiteTes
131c0 74 53 65 74 74 69 6e 67 73 20 7b 20 63 68 61 6e  tSettings { chan
131d0 6e 65 6c 20 7b 73 75 66 66 69 78 20 22 22 7d 20  nel {suffix ""} 
131e0 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20  {quiet false} } 
131f0 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
13200 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 6c    # NOTE: Skip l
13210 6f 61 64 69 6e 67 20 74 68 65 20 73 65 74 74 69  oading the setti
13220 6e 67 73 20 69 66 20 74 68 65 69 72 20 75 73 61  ngs if their usa
13230 67 65 20 68 61 73 20 62 65 65 6e 20 64 69 73 61  ge has been disa
13240 62 6c 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  bled...      #..
13250 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
13260 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c   exists ::no(sql
13270 69 74 65 54 65 73 74 53 65 74 74 69 6e 67 73 29  iteTestSettings)
13280 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
13290 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
132a0 4e 4f 54 45 3a 20 4c 6f 61 64 20 63 75 73 74 6f  NOTE: Load custo
132b0 6d 20 70 65 72 2d 75 73 65 72 20 61 6e 64 2f 6f  m per-user and/o
132c0 72 20 70 65 72 2d 68 6f 73 74 20 74 65 73 74 20  r per-host test 
132d0 73 65 74 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20  settings now... 
132e0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
132f0 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
13300 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72  ts ::tcl_platfor
13310 6d 28 75 73 65 72 29 5d 7d 20 74 68 65 6e 20 7b  m(user)]} then {
13320 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
13330 75 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65  userSettingsFile
13340 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  Name [file join 
13350 5b 67 65 74 43 6f 6d 6d 6f 6e 44 69 72 65 63 74  [getCommonDirect
13360 6f 72 79 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20  ory] \..        
13370 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72 67        [appendArg
13380 73 20 73 65 74 74 69 6e 67 73 20 24 73 75 66 66  s settings $suff
13390 69 78 20 2e 20 24 3a 3a 74 63 6c 5f 70 6c 61 74  ix . $::tcl_plat
133a0 66 6f 72 6d 28 75 73 65 72 29 20 2e 65 61 67 6c  form(user) .eagl
133b0 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  e]]....         
133c0 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74   if {[file exist
133d0 73 20 24 75 73 65 72 53 65 74 74 69 6e 67 73 46  s $userSettingsF
133e0 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
133f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
13400 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
13410 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
13420 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
13430 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
13440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13450 20 22 2d 2d 2d 2d 20 6c 6f 61 64 69 6e 67 20 70   "---- loading p
13460 65 72 2d 75 73 65 72 20 74 65 73 74 20 73 65 74  er-user test set
13470 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c  tings file \"" \
13480 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
13490 20 20 20 20 24 75 73 65 72 53 65 74 74 69 6e 67      $userSetting
134a0 73 46 69 6c 65 4e 61 6d 65 20 5c 22 2e 2e 2e 5c  sFileName \"...\
134b0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
134c0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
134d0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 75 70 6c   if {[catch {upl
134e0 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 73 6f 75  evel 1 [list sou
134f0 72 63 65 20 24 75 73 65 72 53 65 74 74 69 6e 67  rce $userSetting
13500 73 46 69 6c 65 4e 61 6d 65 5d 7d 20 5c 0d 0a 20  sFileName]} \.. 
13510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13520 20 20 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20     error]} then 
13530 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
13540 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
13550 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
13560 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
13570 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
13580 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
13590 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
135a0 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
135b0 20 6c 6f 61 64 20 70 65 72 2d 75 73 65 72 20 73   load per-user s
135c0 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22  ettings file \""
135d0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
135e0 20 20 20 20 20 20 20 20 24 75 73 65 72 53 65 74          $userSet
135f0 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c  tingsFileName "\
13600 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  ", error: " \n\t
13610 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20   $error \n]..   
13620 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
13630 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
13640 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
13650 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
13660 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
13670 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
13680 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
13690 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
136a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136b0 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6c 6f  "---- skipped lo
136c0 61 64 69 6e 67 20 70 65 72 2d 75 73 65 72 20 74  ading per-user t
136d0 65 73 74 20 73 65 74 74 69 6e 67 73 20 66 69 6c  est settings fil
136e0 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  e \"" \..       
136f0 20 20 20 20 20 20 20 20 20 20 20 24 75 73 65 72             $user
13700 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65  SettingsFileName
13710 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f   "\", it does no
13720 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20  t exist\n"]..   
13730 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
13740 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
13750 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 23   }....        ##
13760 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13770 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13780 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13790 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
137a0 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20 20 20  #####....       
137b0 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
137c0 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d  s ::tcl_platform
137d0 28 68 6f 73 74 29 5d 7d 20 74 68 65 6e 20 7b 0d  (host)]} then {.
137e0 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 68  .          set h
137f0 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e  ostSettingsFileN
13800 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b  ame [file join [
13810 67 65 74 43 6f 6d 6d 6f 6e 44 69 72 65 63 74 6f  getCommonDirecto
13820 72 79 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ry] \..         
13830 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72 67 73       [appendArgs
13840 20 73 65 74 74 69 6e 67 73 20 24 73 75 66 66 69   settings $suffi
13850 78 20 2e 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66  x . $::tcl_platf
13860 6f 72 6d 28 68 6f 73 74 29 20 2e 65 61 67 6c 65  orm(host) .eagle
13870 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  ]]....          
13880 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73  if {[file exists
13890 20 24 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69   $hostSettingsFi
138a0 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
138b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
138c0 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
138d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
138e0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
138f0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
13900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13910 22 2d 2d 2d 2d 20 6c 6f 61 64 69 6e 67 20 70 65  "---- loading pe
13920 72 2d 68 6f 73 74 20 74 65 73 74 20 73 65 74 74  r-host test sett
13930 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d  ings file \"" \.
13940 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13950 20 20 20 24 68 6f 73 74 53 65 74 74 69 6e 67 73     $hostSettings
13960 46 69 6c 65 4e 61 6d 65 20 5c 22 2e 2e 2e 5c 6e  FileName \"...\n
13970 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
13980 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
13990 69 66 20 7b 5b 63 61 74 63 68 20 7b 75 70 6c 65  if {[catch {uple
139a0 76 65 6c 20 31 20 5b 6c 69 73 74 20 73 6f 75 72  vel 1 [list sour
139b0 63 65 20 24 68 6f 73 74 53 65 74 74 69 6e 67 73  ce $hostSettings
139c0 46 69 6c 65 4e 61 6d 65 5d 7d 20 5c 0d 0a 20 20  FileName]} \..  
139d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139e0 20 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b    error]} then {
139f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
13a00 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
13a10 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
13a20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
13a30 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
13a40 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
13a50 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
13a60 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
13a70 6c 6f 61 64 20 70 65 72 2d 68 6f 73 74 20 73 65  load per-host se
13a80 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20  ttings file \"" 
13a90 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
13aa0 20 20 20 20 20 20 20 24 68 6f 73 74 53 65 74 74         $hostSett
13ab0 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22  ingsFileName "\"
13ac0 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  , error: " \n\t 
13ad0 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20  $error \n]..    
13ae0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
13af0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
13b00 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
13b10 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
13b20 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
13b30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
13b40 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
13b50 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
13b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
13b70 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6c 6f 61  ---- skipped loa
13b80 64 69 6e 67 20 70 65 72 2d 68 6f 73 74 20 74 65  ding per-host te
13b90 73 74 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65  st settings file
13ba0 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
13bb0 20 20 20 20 20 20 20 20 20 20 24 68 6f 73 74 53            $hostS
13bc0 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20  ettingsFileName 
13bd0 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74  "\", it does not
13be0 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20   exist\n"]..    
13bf0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
13c00 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
13c10 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
13c20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72  }.....    proc r
13c30 75 6e 53 51 4c 69 74 65 54 65 73 74 50 72 6f 6c  unSQLiteTestProl
13c40 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  ogue {} {..     
13c50 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
13c60 3a 20 53 6b 69 70 20 72 75 6e 6e 69 6e 67 20 6f  : Skip running o
13c70 75 72 20 63 75 73 74 6f 6d 20 70 72 6f 6c 6f 67  ur custom prolog
13c80 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20 6f  ue if the main o
13c90 6e 65 20 68 61 73 20 62 65 65 6e 0d 0a 20 20 20  ne has been..   
13ca0 20 20 20 23 20 20 20 20 20 20 20 73 6b 69 70 70     #       skipp
13cb0 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ed...      #..  
13cc0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
13cd0 78 69 73 74 73 20 3a 3a 6e 6f 28 70 72 6f 6c 6f  xists ::no(prolo
13ce0 67 75 65 2e 65 61 67 6c 65 29 5d 7d 20 74 68 65  gue.eagle)]} the
13cf0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
13d00 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
13d10 4c 6f 61 64 20 74 68 65 20 22 62 65 66 6f 72 65  Load the "before
13d20 2d 63 6f 6e 73 74 72 61 69 6e 74 73 22 20 63 75  -constraints" cu
13d30 73 74 6f 6d 20 70 65 72 2d 75 73 65 72 20 61 6e  stom per-user an
13d40 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74 0d 0a 20  d/or per-host.. 
13d50 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
13d60 65 73 74 20 73 65 74 74 69 6e 67 73 20 6e 6f 77  est settings now
13d70 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
13d80 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20        uplevel 1 
13d90 5b 6c 69 73 74 20 6c 6f 61 64 53 51 4c 69 74 65  [list loadSQLite
13da0 54 65 73 74 53 65 74 74 69 6e 67 73 20 24 3a 3a  TestSettings $::
13db0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 2e 62 65  test_channel .be
13dc0 66 6f 72 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  fore]....       
13dd0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
13de0 54 45 3a 20 44 65 74 65 72 6d 69 6e 65 20 74 68  TE: Determine th
13df0 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 6e  e names of the n
13e00 61 74 69 76 65 20 70 6c 61 74 66 6f 72 6d 20 61  ative platform a
13e10 6e 64 20 61 72 63 68 69 74 65 63 74 75 72 65 2e  nd architecture.
13e20 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
13e30 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72       set platfor
13e40 6d 20 5b 67 65 74 42 75 69 6c 64 50 6c 61 74 66  m [getBuildPlatf
13e50 6f 72 6d 20 74 72 75 65 5d 0d 0a 20 20 20 20 20  orm true]..     
13e60 20 20 20 73 65 74 20 61 72 63 68 69 74 65 63 74     set architect
13e70 75 72 65 20 5b 61 72 63 68 69 74 65 63 74 75 72  ure [architectur
13e80 65 46 6f 72 50 6c 61 74 66 6f 72 6d 20 24 70 6c  eForPlatform $pl
13e90 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20  atform]....     
13ea0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
13eb0 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68 65 20 70  NOTE: Show the p
13ec0 6c 61 74 66 6f 72 6d 20 61 6e 64 20 61 72 63 68  latform and arch
13ed0 69 74 65 63 74 75 72 65 20 75 73 65 64 20 74 6f  itecture used to
13ee0 20 68 65 6c 70 20 6c 6f 63 61 74 65 20 74 68 65   help locate the
13ef0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
13f00 20 20 6e 61 74 69 76 65 20 62 75 69 6c 64 20 66    native build f
13f10 69 6c 65 73 2e 0d 0a 20 20 20 20 20 20 20 20 23  iles...        #
13f20 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
13f30 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
13f40 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
13f50 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
13f60 20 70 6c 61 74 66 6f 72 6d 20 66 6f 72 20 6c 6f   platform for lo
13f70 63 61 74 69 6e 67 20 6e 61 74 69 76 65 20 62 75  cating native bu
13f80 69 6c 64 20 66 69 6c 65 73 20 69 73 20 5c 22 22  ild files is \""
13f90 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
13fa0 24 70 6c 61 74 66 6f 72 6d 20 5c 22 5c 6e 5d 0d  $platform \"\n].
13fb0 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  ...        tputs
13fc0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
13fd0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
13fe0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
13ff0 2d 20 61 72 63 68 69 74 65 63 74 75 72 65 20 66  - architecture f
14000 6f 72 20 6c 6f 63 61 74 69 6e 67 20 6e 61 74 69  or locating nati
14010 76 65 20 62 75 69 6c 64 20 66 69 6c 65 73 20 69  ve build files i
14020 73 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  s \"" \..       
14030 20 20 20 20 20 24 61 72 63 68 69 74 65 63 74 75       $architectu
14040 72 65 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  re \"\n]....    
14050 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
14060 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 61 20 6c   NOTE: Build a l
14070 69 73 74 20 6f 66 20 63 6f 6e 66 69 67 75 72 61  ist of configura
14080 74 69 6f 6e 20 66 69 6c 65 73 20 74 68 61 74 20  tion files that 
14090 77 65 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20  we handle...    
140a0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
140b0 65 74 20 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d  et configFileNam
140c0 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20  es [list \..    
140d0 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
140e0 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 2e 63  ata.SQLite.dll.c
140f0 6f 6e 66 69 67 5d 0d 0a 0d 0a 20 20 20 20 20 20  onfig]....      
14100 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
14110 4f 54 45 3a 20 42 75 69 6c 64 20 61 20 6c 69 73  OTE: Build a lis
14120 74 20 6f 66 20 61 75 78 69 6c 69 61 72 79 20 4d  t of auxiliary M
14130 61 6e 61 67 65 64 20 44 65 62 75 67 67 69 6e 67  anaged Debugging
14140 20 41 73 73 69 73 74 61 6e 74 73 20 28 4d 44 41   Assistants (MDA
14150 29 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  )..        #    
14160 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e     configuration
14170 20 66 69 6c 65 73 20 74 68 61 74 20 77 65 20 68   files that we h
14180 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  andle...        
14190 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d  #..        set m
141a0 64 61 43 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65  daConfigFileName
141b0 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20  s [list \..     
141c0 20 20 20 20 20 20 20 49 6e 73 74 61 6c 6c 65 72         Installer
141d0 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20  .exe.mda.config 
141e0 74 65 73 74 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e  test.exe.mda.con
141f0 66 69 67 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  fig \..         
14200 20 20 20 74 65 73 74 6c 69 6e 71 2e 65 78 65 2e     testlinq.exe.
14210 6d 64 61 2e 63 6f 6e 66 69 67 5d 0d 0a 0d 0a 20  mda.config].... 
14220 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
14230 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20    # NOTE: Build 
14240 74 68 65 20 6c 69 73 74 20 6f 66 20 6e 61 74 69  the list of nati
14250 76 65 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65  ve assembly file
14260 73 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65  s that we handle
14270 2e 20 20 54 68 65 0d 0a 20 20 20 20 20 20 20 20  .  The..        
14280 23 20 20 20 20 20 20 20 72 65 61 73 6f 6e 20 74  #       reason t
14290 68 65 20 22 53 79 73 74 65 6d 2e 44 61 74 61 2e  he "System.Data.
142a0 53 51 4c 69 74 65 2e 64 6c 6c 22 20 66 69 6c 65  SQLite.dll" file
142b0 20 69 73 20 69 6e 63 6c 75 64 65 64 20 68 65 72   is included her
142c0 65 20 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20  e is..        # 
142d0 20 20 20 20 20 20 62 65 63 61 75 73 65 20 69 74        because it
142e0 20 63 6f 75 6c 64 20 62 65 20 74 68 65 20 6d 69   could be the mi
142f0 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c  xed-mode assembl
14300 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  y...        #.. 
14310 20 20 20 20 20 20 20 73 65 74 20 6e 61 74 69 76         set nativ
14320 65 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74  eFileNames [list
14330 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
14340 73 71 6c 69 74 65 33 2e 64 6c 6c 20 53 51 4c 69  sqlite3.dll SQLi
14350 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 20 53  te.Interop.dll S
14360 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
14370 65 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20  e.dll]....      
14380 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
14390 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 6c  OTE: Build the l
143a0 69 73 74 20 6f 66 20 6d 61 6e 61 67 65 64 20 61  ist of managed a
143b0 73 73 65 6d 62 6c 79 20 66 69 6c 65 73 20 74 68  ssembly files th
143c0 61 74 20 77 65 20 68 61 6e 64 6c 65 2e 0d 0a 20  at we handle... 
143d0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
143e0 20 20 73 65 74 20 6d 61 6e 61 67 65 64 46 69 6c    set managedFil
143f0 65 4e 61 6d 65 73 20 5b 6c 69 73 74 20 5c 0d 0a  eNames [list \..
14400 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
14410 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
14420 6c 6c 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  ll System.Data.S
14430 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 5d 0d  QLite.Linq.dll].
14440 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
14450 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
14460 6d 6f 76 65 20 61 6e 79 20 74 65 73 74 20 63 6f  move any test co
14470 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74 20 72  nstraints that r
14480 65 66 65 72 20 74 6f 20 74 68 65 20 6e 61 74 69  efer to the nati
14490 76 65 20 61 6e 64 2f 6f 72 0d 0a 20 20 20 20 20  ve and/or..     
144a0 20 20 20 23 20 20 20 20 20 20 20 6d 61 6e 61 67     #       manag
144b0 65 64 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65  ed assembly file
144c0 73 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65  s that we handle
144d0 20 75 6e 6c 65 73 73 20 66 6f 72 62 69 64 64 65   unless forbidde
144e0 6e 20 66 72 6f 6d 0d 0a 20 20 20 20 20 20 20 20  n from..        
144f0 23 20 20 20 20 20 20 20 64 6f 69 6e 67 20 73 6f  #       doing so
14500 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
14510 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
14520 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c   exists ::no(sql
14530 69 74 65 52 65 6d 6f 76 65 43 6f 6e 73 74 72 61  iteRemoveConstra
14540 69 6e 74 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ints)]} then {..
14550 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
14560 68 20 66 69 6c 65 4e 61 6d 65 20 24 63 6f 6e 66  h fileName $conf
14570 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  igFileNames {.. 
14580 20 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76             remov
14590 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  eConstraint [app
145a0 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 24 66  endArgs file_ $f
145b0 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20  ileName]..      
145c0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
145d0 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
145e0 61 6d 65 20 24 6d 64 61 43 6f 6e 66 69 67 46 69  ame $mdaConfigFi
145f0 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
14600 20 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e         removeCon
14610 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
14620 72 67 73 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e  rgs file_ $fileN
14630 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  ame]..          
14640 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66  }....          f
14650 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
14660 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73  $nativeFileNames
14670 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
14680 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74  removeConstraint
14690 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
146a0 65 5f 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20  e_ $fileName].. 
146b0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
146c0 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
146d0 66 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65  fileName $manage
146e0 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  dFileNames {..  
146f0 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76 65            remove
14700 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
14710 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 24 66 69  ndArgs file_ $fi
14720 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20  leName]..       
14730 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
14740 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
14750 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b        # NOTE: Sk
14760 69 70 20 61 6c 6c 20 53 79 73 74 65 6d 2e 44 61  ip all System.Da
14770 74 61 2e 53 51 4c 69 74 65 20 72 65 6c 61 74 65  ta.SQLite relate
14780 64 20 66 69 6c 65 20 68 61 6e 64 6c 69 6e 67 20  d file handling 
14790 28 64 65 6c 65 74 69 6e 67 2c 0d 0a 20 20 20 20  (deleting,..    
147a0 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 70 79      #       copy
147b0 69 6e 67 2c 20 61 6e 64 20 6c 6f 61 64 69 6e 67  ing, and loading
147c0 29 20 69 66 20 69 6e 73 74 72 75 63 74 65 64 2e  ) if instructed.
147d0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
147e0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
147f0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69  exists ::no(sqli
14800 74 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  teFiles)]} then 
14810 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
14820 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
14830 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74 6f  : Skip trying to
14840 20 64 65 6c 65 74 65 20 61 6e 79 20 66 69 6c 65   delete any file
14850 73 20 69 66 20 69 6e 73 74 72 75 63 74 65 64 2e  s if instructed.
14860 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
14870 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
14880 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
14890 64 65 6c 65 74 65 53 71 6c 69 74 65 46 69 6c 65  deleteSqliteFile
148a0 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
148b0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
148c0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
148d0 64 65 6c 65 74 65 53 71 6c 69 74 65 43 6f 6e 66  deleteSqliteConf
148e0 69 67 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  igFiles)]} then 
148f0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
14900 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
14910 65 20 24 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d  e $configFileNam
14920 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
14930 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 42        tryDeleteB
14940 69 6e 61 72 79 46 69 6c 65 20 24 66 69 6c 65 4e  inaryFile $fileN
14950 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ame..           
14960 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
14970 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
14980 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
14990 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65  ists ::no(delete
149a0 53 71 6c 69 74 65 4e 61 74 69 76 65 46 69 6c 65  SqliteNativeFile
149b0 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
149c0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
149d0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
149e0 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 49 6d  o(deleteSqliteIm
149f0 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d 20 74  plicitFiles)]} t
14a00 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
14a10 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
14a20 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46  ileName $nativeF
14a30 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
14a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
14a50 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79 20  yDeleteAssembly 
14a60 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  $fileName..     
14a70 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
14a80 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
14a90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
14aa0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
14ab0 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69   ::no(deleteSqli
14ac0 74 65 50 6c 61 74 66 6f 72 6d 46 69 6c 65 73 29  tePlatformFiles)
14ad0 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
14ae0 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
14af0 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f  g length $platfo
14b00 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  rm] > 0} then {.
14b10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14b20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
14b30 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d  e $nativeFileNam
14b40 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
14b50 20 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74          tryDelet
14b60 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e  eAssembly $fileN
14b70 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 20  ame $platform.. 
14b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
14b90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
14ba0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
14bb0 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
14bc0 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65  ists ::no(delete
14bd0 53 71 6c 69 74 65 41 72 63 68 69 74 65 63 74 75  SqliteArchitectu
14be0 72 65 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a  reFiles)] && \..
14bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c00 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
14c10 20 24 61 72 63 68 69 74 65 63 74 75 72 65 5d 20   $architecture] 
14c20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
14c30 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
14c40 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e  each fileName $n
14c50 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b  ativeFileNames {
14c60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
14c70 20 20 20 20 74 72 79 44 65 6c 65 74 65 41 73 73      tryDeleteAss
14c80 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20  embly $fileName 
14c90 24 61 72 63 68 69 74 65 63 74 75 72 65 0d 0a 20  $architecture.. 
14ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
14cb0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
14cc0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
14cd0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
14ce0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
14cf0 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c  s ::no(deleteSql
14d00 69 74 65 4d 61 6e 61 67 65 64 46 69 6c 65 73 29  iteManagedFiles)
14d10 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
14d20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
14d30 20 66 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67   fileName $manag
14d40 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  edFileNames {.. 
14d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
14d60 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79  ryDeleteAssembly
14d70 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20   $fileName..    
14d80 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
14d90 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
14da0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
14db0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
14dc0 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
14dd0 66 6f 72 20 74 68 65 20 22 61 75 74 6f 53 65 6c  for the "autoSel
14de0 65 63 74 22 20 72 75 6e 74 69 6d 65 20 6f 70 74  ect" runtime opt
14df0 69 6f 6e 2e 20 20 49 66 20 70 72 65 73 65 6e 74  ion.  If present
14e00 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  ,..          #  
14e10 20 20 20 20 20 61 74 74 65 6d 70 74 20 74 6f 20       attempt to 
14e20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65  automatically se
14e30 6c 65 63 74 20 74 68 65 20 66 69 72 73 74 20 61  lect the first a
14e40 76 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20  vailable..      
14e50 20 20 20 20 23 20 20 20 20 20 20 20 62 75 69 6c      #       buil
14e60 64 20 28 6f 72 20 22 72 65 6c 65 61 73 65 22 29  d (or "release")
14e70 20 6f 66 20 53 51 4c 69 74 65 20 61 6e 64 20 53   of SQLite and S
14e80 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
14e90 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  e..          #  
14ea0 20 20 20 20 20 66 6f 72 20 75 73 65 20 77 69 74       for use wit
14eb0 68 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  h the test suite
14ec0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
14ed0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68            if {[h
14ee0 61 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20  asRuntimeOption 
14ef0 61 75 74 6f 53 65 6c 65 63 74 5d 7d 20 74 68 65  autoSelect]} the
14f00 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
14f10 20 69 66 20 7b 21 5b 63 68 65 63 6b 46 6f 72 53   if {![checkForS
14f20 51 4c 69 74 65 42 75 69 6c 64 73 20 24 3a 3a 74  QLiteBuilds $::t
14f30 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75 65  est_channel true
14f40 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
14f50 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f           checkFo
14f60 72 53 51 4c 69 74 65 52 65 6c 65 61 73 65 73 20  rSQLiteReleases 
14f70 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
14f80 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20  true..          
14f90 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
14fa0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  ....          #.
14fb0 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
14fc0 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74  E: Skip trying t
14fd0 6f 20 76 65 72 69 66 79 20 74 68 65 20 62 75 69  o verify the bui
14fe0 6c 64 20 64 69 72 65 63 74 6f 72 79 20 69 66 20  ld directory if 
14ff0 69 6e 73 74 72 75 63 74 65 64 3b 0d 0a 20 20 20  instructed;..   
15000 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f         #       o
15010 74 68 65 72 77 69 73 65 2c 20 6d 61 6b 65 20 73  therwise, make s
15020 75 72 65 20 69 74 20 61 63 74 75 61 6c 6c 79 20  ure it actually 
15030 65 78 69 73 74 73 20 6f 72 20 68 61 6c 74 20 74  exists or halt t
15040 68 65 20 65 6e 74 69 72 65 0d 0a 20 20 20 20 20  he entire..     
15050 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73       #       tes
15060 74 69 6e 67 20 70 72 6f 63 65 73 73 20 69 66 20  ting process if 
15070 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  it does not exis
15080 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  t...          #.
15090 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
150a0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
150b0 6f 28 76 65 72 69 66 79 42 75 69 6c 64 44 69 72  o(verifyBuildDir
150c0 65 63 74 6f 72 79 29 5d 7d 20 74 68 65 6e 20 7b  ectory)]} then {
150d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
150e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
150f0 4f 54 45 3a 20 41 74 20 74 68 69 73 20 70 6f 69  OTE: At this poi
15100 6e 74 2c 20 74 68 65 20 62 75 69 6c 64 20 64 69  nt, the build di
15110 72 65 63 74 6f 72 79 20 4d 55 53 54 20 65 78 69  rectory MUST exi
15120 73 74 20 61 73 20 61 0d 0a 20 20 20 20 20 20 20  st as a..       
15130 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61 6c       #       val
15140 69 64 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72  id directory for
15150 20 74 68 65 20 74 65 73 74 69 6e 67 20 70 72 6f   the testing pro
15160 63 65 73 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65  cess to continue
15170 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
15180 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ..            se
15190 74 20 64 69 72 65 63 74 6f 72 79 20 5b 67 65 74  t directory [get
151a0 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79 5d 0d  BuildDirectory].
151b0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
151c0 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73  f {![file exists
151d0 20 24 64 69 72 65 63 74 6f 72 79 5d 20 7c 7c 20   $directory] || 
151e0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
151f0 20 20 20 21 5b 66 69 6c 65 20 69 73 64 69 72 65     ![file isdire
15200 63 74 6f 72 79 20 24 64 69 72 65 63 74 6f 72 79  ctory $directory
15210 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
15220 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
15230 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
15240 3a 20 4a 75 73 74 20 70 72 69 6f 72 20 74 6f 20  : Just prior to 
15250 61 63 74 75 61 6c 6c 79 20 68 61 6c 74 69 6e 67  actually halting
15260 20 74 68 65 20 74 65 73 74 69 6e 67 20 70 72 6f   the testing pro
15270 63 65 73 73 2c 0d 0a 20 20 20 20 20 20 20 20 20  cess,..         
15280 20 20 20 20 20 23 20 20 20 20 20 20 20 61 64 64       #       add
15290 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 74 68 65   an error to the
152a0 20 74 65 73 74 20 6c 6f 67 20 66 69 6c 65 2e 0d   test log file..
152b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
152c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
152d0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
152e0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
152f0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
15300 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 75         "---- cou
15310 6c 64 20 6e 6f 74 20 76 65 72 69 66 79 20 62 75  ld not verify bu
15320 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20 5c 22  ild directory \"
15330 22 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a  " $directory \..
15340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15350 20 20 22 5c 22 2c 20 61 6c 6c 20 74 65 73 74 69    "\", all testi
15360 6e 67 20 68 61 6c 74 65 64 5c 6e 22 5d 0d 0a 0d  ng halted\n"]...
15370 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
15380 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
15390 23 20 4e 4f 54 45 3a 20 52 61 69 73 69 6e 67 20  # NOTE: Raising 
153a0 61 20 73 63 72 69 70 74 20 65 72 72 6f 72 20 66  a script error f
153b0 72 6f 6d 20 74 68 69 73 20 70 6f 69 6e 74 20 73  rom this point s
153c0 68 6f 75 6c 64 20 68 61 6c 74 0d 0a 20 20 20 20  hould halt..    
153d0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
153e0 20 20 74 68 65 20 74 65 73 74 69 6e 67 20 70 72    the testing pr
153f0 6f 63 65 73 73 2e 0d 0a 20 20 20 20 20 20 20 20  ocess...        
15400 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
15410 20 20 20 20 20 20 20 65 72 72 6f 72 20 5b 61 70         error [ap
15420 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
15430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63                "c
15440 6f 75 6c 64 20 6e 6f 74 20 76 65 72 69 66 79 20  ould not verify 
15450 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20  build directory 
15460 5c 22 22 20 24 64 69 72 65 63 74 6f 72 79 20 5c  \"" $directory \
15470 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
15480 20 20 20 20 22 5c 22 2c 20 61 6c 6c 20 74 65 73      "\", all tes
15490 74 69 6e 67 20 68 61 6c 74 65 64 22 5d 0d 0a 20  ting halted"].. 
154a0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
154b0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
154c0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
154d0 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70      # NOTE: Skip
154e0 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 70 79 20   trying to copy 
154f0 61 6e 79 20 66 69 6c 65 73 20 69 66 20 69 6e 73  any files if ins
15500 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20 20 20  tructed...      
15510 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
15520 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
15530 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69  ts ::no(copySqli
15540 74 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  teFiles)]} then 
15550 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
15560 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
15570 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65   ::no(copySqlite
15580 43 6f 6e 66 69 67 46 69 6c 65 73 29 5d 7d 20 74  ConfigFiles)]} t
15590 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
155a0 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
155b0 65 4e 61 6d 65 20 24 63 6f 6e 66 69 67 46 69 6c  eName $configFil
155c0 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
155d0 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70            tryCop
155e0 79 42 75 69 6c 64 46 69 6c 65 20 24 66 69 6c 65  yBuildFile $file
155f0 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Name..          
15600 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
15610 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
15620 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
15630 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53  xists ::no(copyS
15640 71 6c 69 74 65 4e 61 74 69 76 65 46 69 6c 65 73  qliteNativeFiles
15650 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
15660 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
15670 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
15680 28 63 6f 70 79 53 71 6c 69 74 65 49 6d 70 6c 69  (copySqliteImpli
15690 63 69 74 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  citFiles)]} then
156a0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
156b0 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
156c0 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65  Name $nativeFile
156d0 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
156e0 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f             tryCo
156f0 70 79 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65  pyAssembly $file
15700 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Name..          
15710 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
15720 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
15730 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
15740 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
15750 28 63 6f 70 79 53 71 6c 69 74 65 50 6c 61 74 66  (copySqlitePlatf
15760 6f 72 6d 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d  ormFiles)] && \.
15770 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15780 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
15790 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30  h $platform] > 0
157a0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
157b0 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
157c0 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69  h fileName $nati
157d0 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  veFileNames {.. 
157e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157f0 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79   tryCopyAssembly
15800 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74   $fileName $plat
15810 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20 20 20  form..          
15820 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
15830 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
15840 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
15850 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
15860 28 63 6f 70 79 53 71 6c 69 74 65 41 72 63 68 69  (copySqliteArchi
15870 74 65 63 74 75 72 65 46 69 6c 65 73 29 5d 20 26  tectureFiles)] &
15880 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
15890 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
158a0 65 6e 67 74 68 20 24 61 72 63 68 69 74 65 63 74  ength $architect
158b0 75 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ure] > 0} then {
158c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
158d0 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
158e0 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61  me $nativeFileNa
158f0 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
15900 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79           tryCopy
15910 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61  Assembly $fileNa
15920 6d 65 20 24 61 72 63 68 69 74 65 63 74 75 72 65  me $architecture
15930 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
15940 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
15950 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
15960 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
15970 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
15980 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71  ists ::no(copySq
15990 6c 69 74 65 4d 61 6e 61 67 65 64 46 69 6c 65 73  liteManagedFiles
159a0 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
159b0 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
159c0 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61  h fileName $mana
159d0 67 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  gedFileNames {..
159e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159f0 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20  tryCopyAssembly 
15a00 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  $fileName..     
15a10 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
15a20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
15a30 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
15a40 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
15a50 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72   # NOTE: Skip tr
15a60 79 69 6e 67 20 74 6f 20 6c 6f 61 64 20 61 6e 79  ying to load any
15a70 20 66 69 6c 65 73 20 69 66 20 69 6e 73 74 72 75   files if instru
15a80 63 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20  cted...         
15a90 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   #..          if
15aa0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
15ab0 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 46  ::no(loadSqliteF
15ac0 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
15ad0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
15ae0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
15af0 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 49 6d 70  no(loadSqliteImp
15b00 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d 20 74 68  licitFiles)]} th
15b10 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
15b20 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73 65 6d      tryLoadAssem
15b30 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  bly System.Data.
15b40 53 51 4c 69 74 65 2e 64 6c 6c 0d 0a 20 20 20 20  SQLite.dll..    
15b50 20 20 20 20 20 20 20 20 20 20 74 72 79 4c 6f 61            tryLoa
15b60 64 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65 6d  dAssembly System
15b70 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e  .Data.SQLite.Lin
15b80 71 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20  q.dll..         
15b90 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
15ba0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
15bb0 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53  xists ::no(loadS
15bc0 71 6c 69 74 65 50 6c 61 74 66 6f 72 6d 46 69 6c  qlitePlatformFil
15bd0 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  es)] && \..     
15be0 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69             [stri
15bf0 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66  ng length $platf
15c00 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  orm] > 0} then {
15c10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
15c20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20  tryLoadAssembly 
15c30 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
15c40 74 65 2e 64 6c 6c 20 24 70 6c 61 74 66 6f 72 6d  te.dll $platform
15c50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
15c60 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
15c70 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
15c80 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65   ::no(loadSqlite
15c90 41 72 63 68 69 74 65 63 74 75 72 65 46 69 6c 65  ArchitectureFile
15ca0 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  s)] && \..      
15cb0 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
15cc0 67 20 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74  g length $archit
15cd0 65 63 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65  ecture] > 0} the
15ce0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
15cf0 20 20 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62     tryLoadAssemb
15d00 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  ly System.Data.S
15d10 51 4c 69 74 65 2e 64 6c 6c 20 24 61 72 63 68 69  QLite.dll $archi
15d20 74 65 63 74 75 72 65 0d 0a 20 20 20 20 20 20 20  tecture..       
15d30 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
15d40 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
15d50 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
15d60 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72 79 69 6e  NOTE: Skip tryin
15d70 67 20 74 6f 20 64 65 6c 65 74 65 20 65 78 74 65  g to delete exte
15d80 72 6e 61 6c 20 66 69 6c 65 73 20 69 66 20 69 6e  rnal files if in
15d90 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20 20  structed...     
15da0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
15db0 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
15dc0 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53  sts ::no(deleteS
15dd0 71 6c 69 74 65 45 78 74 65 72 6e 61 6c 46 69 6c  qliteExternalFil
15de0 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
15df0 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
15e00 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 64 61 43  h fileName $mdaC
15e10 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b  onfigFileNames {
15e20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
15e30 74 72 79 44 65 6c 65 74 65 42 75 69 6c 64 46 69  tryDeleteBuildFi
15e40 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20  le $fileName..  
15e50 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
15e60 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
15e70 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
15e80 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20     # NOTE: Skip 
15e90 74 72 79 69 6e 67 20 74 6f 20 63 6f 70 79 20 65  trying to copy e
15ea0 78 74 65 72 6e 61 6c 20 66 69 6c 65 73 20 69 66  xternal files if
15eb0 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20   instructed...  
15ec0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
15ed0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
15ee0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79  exists ::no(copy
15ef0 53 71 6c 69 74 65 45 78 74 65 72 6e 61 6c 46 69  SqliteExternalFi
15f00 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
15f10 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
15f20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
15f30 3a 20 43 6f 70 79 20 74 68 65 20 4d 61 6e 61 67  : Copy the Manag
15f40 65 64 20 44 65 62 75 67 67 69 6e 67 20 41 73 73  ed Debugging Ass
15f50 69 73 74 61 6e 74 73 20 28 4d 44 41 29 20 63 6f  istants (MDA) co
15f60 6e 66 69 67 75 72 61 74 69 6f 6e 0d 0a 20 20 20  nfiguration..   
15f70 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
15f80 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 45 61   file for the Ea
15f90 67 6c 65 20 73 68 65 6c 6c 20 74 6f 20 74 68 65  gle shell to the
15fa0 20 62 75 69 6c 64 20 6f 75 74 70 75 74 20 64 69   build output di
15fb0 72 65 63 74 6f 72 79 2c 0d 0a 20 20 20 20 20 20  rectory,..      
15fc0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77 68        #       wh
15fd0 69 6c 65 20 75 73 69 6e 67 20 65 61 63 68 20 6f  ile using each o
15fe0 66 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74  f the names of t
15ff0 68 65 20 76 61 72 69 6f 75 73 20 6c 65 67 61 63  he various legac
16000 79 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20  y test..        
16010 20 20 20 20 23 20 20 20 20 20 20 20 65 78 65 63      #       exec
16020 75 74 61 62 6c 65 73 2e 20 20 54 68 69 73 20 77  utables.  This w
16030 69 6c 6c 20 68 65 6c 70 20 74 6f 20 6d 61 6b 65  ill help to make
16040 20 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20 74   sure that all t
16050 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  he..            
16060 23 20 20 20 20 20 20 20 6c 65 67 61 63 79 20 74  #       legacy t
16070 65 73 74 73 20 72 75 6e 20 77 69 74 68 20 65 78  ests run with ex
16080 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 73  actly the same s
16090 65 74 20 6f 66 20 4d 61 6e 61 67 65 64 0d 0a 20  et of Managed.. 
160a0 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
160b0 20 20 20 44 65 62 75 67 67 69 6e 67 20 41 73 73     Debugging Ass
160c0 69 73 74 61 6e 74 73 20 63 6f 6e 66 69 67 75 72  istants configur
160d0 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ed...           
160e0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
160f0 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
16100 20 24 6d 64 61 43 6f 6e 66 69 67 46 69 6c 65 4e   $mdaConfigFileN
16110 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
16120 20 20 20 20 20 20 74 72 79 43 6f 70 79 42 69 6e        tryCopyBin
16130 61 72 79 46 69 6c 65 20 45 61 67 6c 65 53 68 65  aryFile EagleShe
16140 6c 6c 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69  ll.exe.mda.confi
16150 67 20 22 22 20 24 66 69 6c 65 4e 61 6d 65 0d 0a  g "" $fileName..
16160 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
16170 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
16180 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
16190 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20   catch {..      
161a0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
161b0 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
161c0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
161d0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c         "---- fil
161e0 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 73  e version of \"s
161f0 71 6c 69 74 65 33 2e 64 6c 6c 5c 22 2e 2e 2e 20  qlite3.dll\"... 
16200 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
16210 20 20 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e     [file version
16220 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
16230 61 6d 65 20 73 71 6c 69 74 65 33 2e 64 6c 6c 5d  ame sqlite3.dll]
16240 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d  ] \n]..        }
16250 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63  ....        catc
16260 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  h {..          t
16270 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
16280 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
16290 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
162a0 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72    "---- file ver
162b0 73 69 6f 6e 20 6f 66 20 5c 22 53 51 4c 69 74 65  sion of \"SQLite
162c0 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 5c 22 2e 2e  .Interop.dll\"..
162d0 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  . " \..         
162e0 20 20 20 20 20 5b 66 69 6c 65 20 76 65 72 73 69       [file versi
162f0 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c  on [getBinaryFil
16300 65 4e 61 6d 65 20 53 51 4c 69 74 65 2e 49 6e 74  eName SQLite.Int
16310 65 72 6f 70 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a  erop.dll]] \n]..
16320 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
16330 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
16340 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
16350 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
16360 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
16370 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
16380 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66   file version of
16390 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53   \"System.Data.S
163a0 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22  QLite.dll\"... "
163b0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
163c0 20 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20    [file version 
163d0 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61  [getBinaryFileNa
163e0 6d 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  me System.Data.S
163f0 51 4c 69 74 65 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d  QLite.dll]] \n].
16400 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
16410 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20        catch {.. 
16420 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
16430 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
16440 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
16450 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
16460 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f  - file version o
16470 66 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e  f \"System.Data.
16480 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 5c  SQLite.Linq.dll\
16490 22 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20  "... " \..      
164a0 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 76 65          [file ve
164b0 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79  rsion [getBinary
164c0 46 69 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e  FileName System.
164d0 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71  Data.SQLite.Linq
164e0 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20  .dll]] \n]..    
164f0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
16500 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
16510 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e  gth $platform] >
16520 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
16530 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20        catch {.. 
16540 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
16550 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
16560 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
16570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16580 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69  "---- file versi
16590 6f 6e 20 6f 66 20 5c 22 22 20 24 70 6c 61 74 66  on of \"" $platf
165a0 6f 72 6d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  orm \..         
165b0 20 20 20 20 20 20 20 22 2f 73 71 6c 69 74 65 33         "/sqlite3
165c0 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5b 66 69 6c  .dll\"... " [fil
165d0 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20  e version \..   
165e0 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65               [ge
165f0 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
16600 73 71 6c 69 74 65 33 2e 64 6c 6c 20 24 70 6c 61  sqlite3.dll $pla
16610 74 66 6f 72 6d 5d 5d 20 5c 6e 5d 0d 0a 20 20 20  tform]] \n]..   
16620 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
16630 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20        catch {.. 
16640 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
16650 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
16660 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
16670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16680 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69  "---- file versi
16690 6f 6e 20 6f 66 20 5c 22 22 20 24 70 6c 61 74 66  on of \"" $platf
166a0 6f 72 6d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  orm \..         
166b0 20 20 20 20 20 20 20 22 2f 53 51 4c 69 74 65 2e         "/SQLite.
166c0 49 6e 74 65 72 6f 70 2e 64 6c 6c 5c 22 2e 2e 2e  Interop.dll\"...
166d0 20 22 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e   " [file version
166e0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
166f0 20 20 20 20 5b 67 65 74 42 69 6e 61 72 79 46 69      [getBinaryFi
16700 6c 65 4e 61 6d 65 20 53 51 4c 69 74 65 2e 49 6e  leName SQLite.In
16710 74 65 72 6f 70 2e 64 6c 6c 20 24 70 6c 61 74 66  terop.dll $platf
16720 6f 72 6d 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20  orm]] \n]..     
16730 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
16740 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
16750 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
16760 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
16770 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
16780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
16790 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e  --- file version
167a0 20 6f 66 20 5c 22 22 20 24 70 6c 61 74 66 6f 72   of \"" $platfor
167b0 6d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  m \..           
167c0 20 20 20 20 20 22 2f 53 79 73 74 65 6d 2e 44 61       "/System.Da
167d0 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e  ta.SQLite.dll\".
167e0 2e 2e 20 22 20 5b 66 69 6c 65 20 76 65 72 73 69  .. " [file versi
167f0 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  on \..          
16800 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61 72 79        [getBinary
16810 46 69 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e  FileName System.
16820 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 20  Data.SQLite.dll 
16830 24 70 6c 61 74 66 6f 72 6d 5d 5d 20 5c 6e 5d 0d  $platform]] \n].
16840 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
16850 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
16860 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
16870 65 6e 67 74 68 20 24 61 72 63 68 69 74 65 63 74  ength $architect
16880 75 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ure] > 0} then {
16890 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61 74 63  ..          catc
168a0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
168b0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
168c0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
168d0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
168e0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65        "---- file
168f0 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20   version of \"" 
16900 24 61 72 63 68 69 74 65 63 74 75 72 65 20 5c 0d  $architecture \.
16910 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16920 20 22 2f 73 71 6c 69 74 65 33 2e 64 6c 6c 5c 22   "/sqlite3.dll\"
16930 2e 2e 2e 20 22 20 5b 66 69 6c 65 20 76 65 72 73  ... " [file vers
16940 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ion \..         
16950 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61 72         [getBinar
16960 79 46 69 6c 65 4e 61 6d 65 20 73 71 6c 69 74 65  yFileName sqlite
16970 33 2e 64 6c 6c 20 24 61 72 63 68 69 74 65 63 74  3.dll $architect
16980 75 72 65 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20  ure]] \n]..     
16990 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
169a0 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
169b0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
169c0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
169d0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
169e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
169f0 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e  --- file version
16a00 20 6f 66 20 5c 22 22 20 24 61 72 63 68 69 74 65   of \"" $archite
16a10 63 74 75 72 65 20 5c 0d 0a 20 20 20 20 20 20 20  cture \..       
16a20 20 20 20 20 20 20 20 20 20 22 2f 53 51 4c 69 74           "/SQLit
16a30 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 5c 22 2e  e.Interop.dll\".
16a40 2e 2e 20 22 20 5b 66 69 6c 65 20 76 65 72 73 69  .. " [file versi
16a50 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  on \..          
16a60 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61 72 79        [getBinary
16a70 46 69 6c 65 4e 61 6d 65 20 53 51 4c 69 74 65 2e  FileName SQLite.
16a80 49 6e 74 65 72 6f 70 2e 64 6c 6c 20 24 61 72 63  Interop.dll $arc
16a90 68 69 74 65 63 74 75 72 65 5d 5d 20 5c 6e 5d 0d  hitecture]] \n].
16aa0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
16ab0 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20            catch 
16ac0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
16ad0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
16ae0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
16af0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
16b00 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76      "---- file v
16b10 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24 61  ersion of \"" $a
16b20 72 63 68 69 74 65 63 74 75 72 65 20 5c 0d 0a 20  rchitecture \.. 
16b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
16b40 2f 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  /System.Data.SQL
16b50 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5b  ite.dll\"... " [
16b60 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a  file version \..
16b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b80 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61  [getBinaryFileNa
16b90 6d 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  me System.Data.S
16ba0 51 4c 69 74 65 2e 64 6c 6c 20 24 61 72 63 68 69  QLite.dll $archi
16bb0 74 65 63 74 75 72 65 5d 5d 20 5c 6e 5d 0d 0a 20  tecture]] \n].. 
16bc0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
16bd0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
16be0 20 73 65 74 20 61 73 73 65 6d 62 6c 69 65 73 20   set assemblies 
16bf0 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 41  [object invoke A
16c00 70 70 44 6f 6d 61 69 6e 2e 43 75 72 72 65 6e 74  ppDomain.Current
16c10 44 6f 6d 61 69 6e 20 47 65 74 41 73 73 65 6d 62  Domain GetAssemb
16c20 6c 69 65 73 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  lies]....       
16c30 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20   object foreach 
16c40 61 73 73 65 6d 62 6c 79 20 24 61 73 73 65 6d 62  assembly $assemb
16c50 6c 69 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  lies {..        
16c60 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61    if {[string ma
16c70 74 63 68 20 5c 7b 53 79 73 74 65 6d 2e 44 61 74  tch \{System.Dat
16c80 61 2e 53 51 4c 69 74 65 2a 20 24 61 73 73 65 6d  a.SQLite* $assem
16c90 62 6c 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  bly]} then {..  
16ca0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
16cb0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
16cc0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
16cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
16ce0 2d 2d 2d 2d 20 66 6f 75 6e 64 20 61 73 73 65 6d  ---- found assem
16cf0 62 6c 79 3a 20 22 20 24 61 73 73 65 6d 62 6c 79  bly: " $assembly
16d00 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
16d10 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
16d20 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d          catch {.
16d30 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
16d40 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
16d50 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
16d60 20 20 22 2d 2d 2d 2d 20 64 65 66 69 6e 65 20 63    "---- define c
16d70 6f 6e 73 74 61 6e 74 73 20 66 6f 72 20 5c 22 53  onstants for \"S
16d80 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
16d90 65 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  e\"... "....    
16da0 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
16db0 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   {object invoke 
16dc0 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
16dd0 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
16de0 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
16df0 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65  ta.SQLite.SQLite
16e00 33 20 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74  3 DefineConstant
16e10 73 7d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  s} \..          
16e20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 43 6f          defineCo
16e30 6e 73 74 61 6e 74 73 5d 20 3d 3d 20 30 7d 20 74  nstants] == 0} t
16e40 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
16e50 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
16e60 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
16e70 41 72 67 73 20 5b 66 6f 72 6d 61 74 4c 69 73 74  Args [formatList
16e80 20 5b 6c 73 6f 72 74 20 5c 0d 0a 20 20 20 20 20   [lsort \..     
16e90 20 20 20 20 20 20 20 20 20 20 20 24 64 65 66 69             $defi
16ea0 6e 65 43 6f 6e 73 74 61 6e 74 73 5d 20 3c 6e 6f  neConstants] <no
16eb0 6e 65 3e 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  ne>] \n]..      
16ec0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
16ed0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
16ee0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
16ef0 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20  unknown\n..     
16f00 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
16f10 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74  }....        cat
16f20 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
16f30 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
16f40 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20  annel \..       
16f50 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6f 75         "---- sou
16f60 72 63 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c  rce version of \
16f70 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  "System.Data.SQL
16f80 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 0d 0a  ite.dll\"... "..
16f90 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
16fa0 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20 69  [catch {object i
16fb0 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
16fc0 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
16fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
16fe0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
16ff0 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
17000 20 50 72 6f 76 69 64 65 72 56 65 72 73 69 6f 6e   ProviderVersion
17010 7d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  } \..           
17020 20 20 20 20 20 20 20 76 65 72 73 69 6f 6e 5d 20         version] 
17030 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
17040 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73            if {[s
17050 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65  tring length $ve
17060 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65  rsion] == 0} the
17070 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
17080 20 20 20 73 65 74 20 76 65 72 73 69 6f 6e 20 6e     set version n
17090 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ull..           
170a0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
170b0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
170c0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
170d0 73 20 24 76 65 72 73 69 6f 6e 20 5c 6e 5d 0d 0a  s $version \n]..
170e0 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
170f0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
17100 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
17110 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d  annel unknown\n.
17120 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
17130 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
17140 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20     catch {..    
17150 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
17160 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20  est_channel \.. 
17170 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
17180 2d 2d 20 73 6f 75 72 63 65 20 63 68 65 63 6b 6f  -- source checko
17190 75 74 20 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44  ut of \"System.D
171a0 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c 22  ata.SQLite.dll\"
171b0 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20  ... "....       
171c0 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f     if {[catch {o
171d0 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
171e0 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
171f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17200 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
17210 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 43 6f 6e  SQLite.SQLiteCon
17220 6e 65 63 74 69 6f 6e 20 50 72 6f 76 69 64 65 72  nection Provider
17230 53 6f 75 72 63 65 49 64 7d 20 5c 0d 0a 20 20 20  SourceId} \..   
17240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
17250 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74  ourceId] == 0} t
17260 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
17270 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
17280 65 6e 67 74 68 20 24 73 6f 75 72 63 65 49 64 5d  ength $sourceId]
17290 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
172a0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
172b0 20 73 6f 75 72 63 65 49 64 20 6e 75 6c 6c 0d 0a   sourceId null..
172c0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
172d0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
172e0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
172f0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 73 6f   [appendArgs $so
17300 75 72 63 65 49 64 20 5c 6e 5d 0d 0a 20 20 20 20  urceId \n]..    
17310 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
17320 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
17330 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
17340 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20  l unknown\n..   
17350 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
17360 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
17370 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
17380 3a 20 43 68 65 63 6b 20 74 68 65 20 61 76 61 69  : Check the avai
17390 6c 61 62 6c 65 20 62 75 69 6c 64 73 20 28 61 6e  lable builds (an
173a0 64 20 22 72 65 6c 65 61 73 65 73 22 29 20 6f 66  d "releases") of
173b0 20 53 51 4c 69 74 65 20 61 6e 64 0d 0a 20 20 20   SQLite and..   
173c0 20 20 20 20 20 23 20 20 20 20 20 20 20 53 79 73       #       Sys
173d0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
173e0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
173f0 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c       checkForSQL
17400 69 74 65 42 75 69 6c 64 73 20 24 3a 3a 74 65 73  iteBuilds $::tes
17410 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20  t_channel..     
17420 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74     checkForSQLit
17430 65 52 65 6c 65 61 73 65 73 20 24 3a 3a 74 65 73  eReleases $::tes
17440 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20  t_channel....   
17450 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
17460 23 20 4e 4f 54 45 3a 20 4e 6f 77 2c 20 77 65 20  # NOTE: Now, we 
17470 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 66 20  need to know if 
17480 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20  the SQLite core 
17490 6c 69 62 72 61 72 79 20 69 73 20 61 76 61 69 6c  library is avail
174a0 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20  able..        # 
174b0 20 20 20 20 20 20 28 69 2e 65 2e 20 62 65 63 61        (i.e. beca
174c0 75 73 65 20 74 68 65 20 6d 61 6e 61 67 65 64 2d  use the managed-
174d0 6f 6e 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61  only System.Data
174e0 2e 53 51 4c 69 74 65 20 61 73 73 65 6d 62 6c 79  .SQLite assembly
174f0 20 63 61 6e 0d 0a 20 20 20 20 20 20 20 20 23 20   can..        # 
17500 20 20 20 20 20 20 6c 6f 61 64 20 77 69 74 68 6f        load witho
17510 75 74 20 69 74 3b 20 68 6f 77 65 76 65 72 2c 20  ut it; however, 
17520 69 74 20 63 61 6e 6e 6f 74 20 64 6f 20 61 6e 79  it cannot do any
17530 74 68 69 6e 67 20 75 73 65 66 75 6c 20 77 69 74  thing useful wit
17540 68 6f 75 74 0d 0a 20 20 20 20 20 20 20 20 23 20  hout..        # 
17550 20 20 20 20 20 20 69 74 29 2e 20 20 49 66 20 77        it).  If w
17560 65 20 61 72 65 20 75 73 69 6e 67 20 74 68 65 20  e are using the 
17570 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d  mixed-mode assem
17580 62 6c 79 20 61 6e 64 20 77 65 20 61 6c 72 65 61  bly and we alrea
17590 64 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  dy..        #   
175a0 20 20 20 20 66 6f 75 6e 64 20 69 74 20 28 61 62      found it (ab
175b0 6f 76 65 29 2c 20 74 68 69 73 20 73 68 6f 75 6c  ove), this shoul
175c0 64 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64  d always succeed
175d0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
175e0 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51        checkForSQ
175f0 4c 69 74 65 4c 69 62 72 61 72 79 20 24 3a 3a 74  LiteLibrary $::t
17600 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20  est_channel.... 
17610 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
17620 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
17630 69 66 20 74 68 65 20 53 51 4c 69 74 65 20 69 6e  if the SQLite in
17640 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 69  terop assembly i
17650 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20  s available...  
17660 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
17670 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 49   checkForSQLiteI
17680 6e 74 65 72 6f 70 20 24 3a 3a 74 65 73 74 5f 63  nterop $::test_c
17690 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20  hannel....      
176a0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
176b0 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20 53  OTE: Check the S
176c0 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 61  QLite database a
176d0 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72  nd temporary dir
176e0 65 63 74 6f 72 69 65 73 2e 0d 0a 20 20 20 20 20  ectories...     
176f0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68     #..        ch
17700 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 69 72 65  eckForSQLiteDire
17710 63 74 6f 72 69 65 73 20 24 3a 3a 74 65 73 74 5f  ctories $::test_
17720 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20  channel....     
17730 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
17740 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
17750 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 76 61   determine if va
17760 72 69 6f 75 73 20 63 6f 6d 70 69 6c 65 2d 74 69  rious compile-ti
17770 6d 65 20 6f 70 74 69 6f 6e 73 20 6e 65 65 64 65  me options neede
17780 64 20 66 6f 72 0d 0a 20 20 20 20 20 20 20 20 23  d for..        #
17790 20 20 20 20 20 20 20 74 65 73 74 20 63 6f 6e 73         test cons
177a0 74 72 61 69 6e 74 73 20 77 65 72 65 20 65 6e 61  traints were ena
177b0 62 6c 65 64 20 66 6f 72 20 74 68 65 20 6d 61 6e  bled for the man
177c0 61 67 65 64 20 61 73 73 65 6d 62 6c 79 2e 20 20  aged assembly.  
177d0 54 68 65 72 65 0d 0a 20 20 20 20 20 20 20 20 23  There..        #
177e0 20 20 20 20 20 20 20 61 72 65 20 73 6f 6d 65 20         are some 
177f0 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
17800 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20 61  ions that must a
17810 6c 73 6f 20 68 61 76 65 20 62 65 65 6e 20 65 6e  lso have been en
17820 61 62 6c 65 64 0d 0a 20 20 20 20 20 20 20 20 23  abled..        #
17830 20 20 20 20 20 20 20 66 6f 72 20 74 68 65 20 69         for the i
17840 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20  nterop assembly 
17850 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 65  in order to be e
17860 66 66 65 63 74 69 76 65 2e 20 20 46 6f 72 20 74  ffective.  For t
17870 68 6f 73 65 0d 0a 20 20 20 20 20 20 20 20 23 20  hose..        # 
17880 20 20 20 20 20 20 6f 70 74 69 6f 6e 73 2c 20 69        options, i
17890 74 20 77 69 6c 6c 20 62 65 20 61 73 73 75 6d 65  t will be assume
178a0 64 20 74 68 61 74 20 69 74 20 77 61 73 20 65 6e  d that it was en
178b0 61 62 6c 65 64 20 66 6f 72 20 74 68 65 20 69 6e  abled for the in
178c0 74 65 72 6f 70 0d 0a 20 20 20 20 20 20 20 20 23  terop..        #
178d0 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 20         assembly 
178e0 69 66 20 69 74 20 77 61 73 20 65 6e 61 62 6c 65  if it was enable
178f0 64 20 66 6f 72 20 74 68 65 20 6d 61 6e 61 67 65  d for the manage
17900 64 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20  d assembly...   
17910 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
17920 66 6f 72 65 61 63 68 20 64 65 66 69 6e 65 43 6f  foreach defineCo
17930 6e 73 74 61 6e 74 20 5b 6c 69 73 74 20 5c 0d 0a  nstant [list \..
17940 20 20 20 20 20 20 20 20 20 20 20 20 43 48 45 43              CHEC
17950 4b 5f 53 54 41 54 45 20 43 4f 55 4e 54 5f 48 41  K_STATE COUNT_HA
17960 4e 44 4c 45 20 44 45 42 55 47 20 49 4e 54 45 52  NDLE DEBUG INTER
17970 4f 50 5f 43 4f 44 45 43 20 49 4e 54 45 52 4f 50  OP_CODEC INTEROP
17980 5f 44 45 42 55 47 20 5c 0d 0a 20 20 20 20 20 20  _DEBUG \..      
17990 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 45 58        INTEROP_EX
179a0 54 45 4e 53 49 4f 4e 5f 46 55 4e 43 54 49 4f 4e  TENSION_FUNCTION
179b0 53 20 49 4e 54 45 52 4f 50 5f 4c 45 47 41 43 59  S INTEROP_LEGACY
179c0 5f 43 4c 4f 53 45 20 49 4e 54 45 52 4f 50 5f 4c  _CLOSE INTEROP_L
179d0 4f 47 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  OG \..          
179e0 20 20 49 4e 54 45 52 4f 50 5f 54 45 53 54 5f 45    INTEROP_TEST_E
179f0 58 54 45 4e 53 49 4f 4e 20 49 4e 54 45 52 4f 50  XTENSION INTEROP
17a00 5f 56 49 52 54 55 41 4c 5f 54 41 42 4c 45 20 4e  _VIRTUAL_TABLE N
17a10 45 54 5f 32 30 20 4e 45 54 5f 33 35 20 5c 0d 0a  ET_20 NET_35 \..
17a20 20 20 20 20 20 20 20 20 20 20 20 20 4e 45 54 5f              NET_
17a30 34 30 20 4e 45 54 5f 34 35 20 4e 45 54 5f 34 35  40 NET_45 NET_45
17a40 31 20 4e 45 54 5f 43 4f 4d 50 41 43 54 5f 32 30  1 NET_COMPACT_20
17a50 20 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50 41 43   PLATFORM_COMPAC
17a60 54 46 52 41 4d 45 57 4f 52 4b 20 5c 0d 0a 20 20  TFRAMEWORK \..  
17a70 20 20 20 20 20 20 20 20 20 20 50 52 45 4c 4f 41            PRELOA
17a80 44 5f 4e 41 54 49 56 45 5f 4c 49 42 52 41 52 59  D_NATIVE_LIBRARY
17a90 20 52 45 54 41 52 47 45 54 41 42 4c 45 20 53 51   RETARGETABLE SQ
17aa0 4c 49 54 45 5f 53 54 41 4e 44 41 52 44 20 5c 0d  LITE_STANDARD \.
17ab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 48 52  .            THR
17ac0 4f 57 5f 4f 4e 5f 44 49 53 50 4f 53 45 44 20 54  OW_ON_DISPOSED T
17ad0 52 41 43 45 20 54 52 41 43 45 5f 43 4f 4e 4e 45  RACE TRACE_CONNE
17ae0 43 54 49 4f 4e 20 54 52 41 43 45 5f 48 41 4e 44  CTION TRACE_HAND
17af0 4c 45 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  LE \..          
17b00 20 20 54 52 41 43 45 5f 50 52 45 4c 4f 41 44 20    TRACE_PRELOAD 
17b10 54 52 41 43 45 5f 53 48 41 52 45 44 20 54 52 41  TRACE_SHARED TRA
17b20 43 45 5f 53 54 41 54 45 4d 45 4e 54 20 54 52 41  CE_STATEMENT TRA
17b30 43 45 5f 57 41 52 4e 49 4e 47 20 5c 0d 0a 20 20  CE_WARNING \..  
17b40 20 20 20 20 20 20 20 20 20 20 54 52 41 43 4b 5f            TRACK_
17b50 4d 45 4d 4f 52 59 5f 42 59 54 45 53 20 55 53 45  MEMORY_BYTES USE
17b60 5f 49 4e 54 45 52 4f 50 5f 44 4c 4c 20 55 53 45  _INTEROP_DLL USE
17b70 5f 50 52 45 50 41 52 45 5f 56 32 20 57 49 4e 44  _PREPARE_V2 WIND
17b80 4f 57 53 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20  OWS] {..        
17b90 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
17ba0 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20   NOTE: Check if 
17bb0 74 68 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  the compile-time
17bc0 20 6f 70 74 69 6f 6e 20 69 73 20 6c 69 73 74 65   option is liste
17bd0 64 20 69 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  d in the list of
17be0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
17bf0 20 20 20 20 22 64 65 66 69 6e 65 20 63 6f 6e 73      "define cons
17c00 74 61 6e 74 73 22 20 6b 65 70 74 20 74 72 61 63  tants" kept trac
17c10 6b 20 6f 66 20 62 79 20 74 68 65 20 6d 61 6e 61  k of by the mana
17c20 67 65 64 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20  ged assembly... 
17c30 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
17c40 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51        checkForSQ
17c50 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61  LiteDefineConsta
17c60 6e 74 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  nt $::test_chann
17c70 65 6c 20 24 64 65 66 69 6e 65 43 6f 6e 73 74 61  el $defineConsta
17c80 6e 74 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  nt..        }...
17c90 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
17ca0 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
17cb0 6b 20 74 68 65 20 63 75 72 72 65 6e 74 20 62 75  k the current bu
17cc0 69 6c 64 20 79 65 61 72 2e 20 20 42 61 73 69 63  ild year.  Basic
17cd0 61 6c 6c 79 2c 20 74 68 69 73 20 69 6e 64 69 63  ally, this indic
17ce0 61 74 65 73 0d 0a 20 20 20 20 20 20 20 20 23 20  ates..        # 
17cf0 20 20 20 20 20 20 77 68 69 63 68 20 76 65 72 73        which vers
17d00 69 6f 6e 20 6f 66 20 4d 53 42 75 69 6c 64 20 61  ion of MSBuild a
17d10 6e 64 2f 6f 72 20 56 69 73 75 61 6c 20 53 74 75  nd/or Visual Stu
17d20 64 69 6f 20 77 61 73 20 75 73 65 64 20 74 6f 0d  dio was used to.
17d30 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
17d40 20 63 6f 6d 70 69 6c 65 20 74 68 65 20 61 73 73   compile the ass
17d50 65 6d 62 6c 79 20 62 69 6e 61 72 69 65 73 20 75  embly binaries u
17d60 6e 64 65 72 20 74 65 73 74 2e 0d 0a 20 20 20 20  nder test...    
17d70 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74      #..        t
17d80 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
17d90 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20  nnel \..        
17da0 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69      "---- checki
17db0 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61  ng for System.Da
17dc0 74 61 2e 53 51 4c 69 74 65 20 62 75 69 6c 64 20  ta.SQLite build 
17dd0 79 65 61 72 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  year... "....   
17de0 20 20 20 20 20 73 65 74 20 79 65 61 72 20 5b 67       set year [g
17df0 65 74 42 75 69 6c 64 59 65 61 72 5d 0d 0a 20 20  etBuildYear]..  
17e00 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
17e10 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
17e20 62 75 69 6c 64 59 65 61 72 2e 20 24 79 65 61 72  buildYear. $year
17e30 5d 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  ]..        tputs
17e40 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
17e50 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20   [appendArgs \" 
17e60 24 79 65 61 72 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20  $year \"\n].... 
17e70 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
17e80 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
17e90 74 68 65 20 63 75 72 72 65 6e 74 20 62 75 69 6c  the current buil
17ea0 64 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  d configuration.
17eb0 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f    This should no
17ec0 72 6d 61 6c 6c 79 0d 0a 20 20 20 20 20 20 20 20  rmally..        
17ed0 23 20 20 20 20 20 20 20 62 65 20 65 69 74 68 65  #       be eithe
17ee0 72 20 22 44 65 62 75 67 22 20 6f 72 20 22 52 65  r "Debug" or "Re
17ef0 6c 65 61 73 65 22 2e 0d 0a 20 20 20 20 20 20 20  lease"...       
17f00 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   #..        tput
17f10 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
17f20 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l \..           
17f30 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20   "---- checking 
17f40 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  for System.Data.
17f50 53 51 4c 69 74 65 20 62 75 69 6c 64 20 63 6f 6e  SQLite build con
17f60 66 69 67 75 72 61 74 69 6f 6e 2e 2e 2e 20 22 0d  figuration... ".
17f70 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63  ...        set c
17f80 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 5b 67 65  onfiguration [ge
17f90 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74  tBuildConfigurat
17fa0 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 20 20 61 64  ion]..        ad
17fb0 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  dConstraint [app
17fc0 65 6e 64 41 72 67 73 20 62 75 69 6c 64 43 6f 6e  endArgs buildCon
17fd0 66 69 67 75 72 61 74 69 6f 6e 2e 20 24 63 6f 6e  figuration. $con
17fe0 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 20 20 20  figuration]..   
17ff0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
18000 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
18010 6e 64 41 72 67 73 20 5c 22 20 24 63 6f 6e 66 69  ndArgs \" $confi
18020 67 75 72 61 74 69 6f 6e 20 5c 22 5c 6e 5d 0d 0a  guration \"\n]..
18030 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
18040 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 72 79       # NOTE: Try
18050 20 74 6f 20 73 65 74 75 70 20 61 6e 20 69 6e 74   to setup an int
18060 65 72 72 75 70 74 20 63 61 6c 6c 62 61 63 6b 20  errupt callback 
18070 75 73 69 6e 67 20 74 68 65 20 73 63 72 69 70 74  using the script
18080 20 64 65 62 75 67 67 65 72 0d 0a 20 20 20 20 20   debugger..     
18090 20 20 20 23 20 20 20 20 20 20 20 74 68 61 74 20     #       that 
180a0 77 69 6c 6c 20 63 61 6e 63 65 6c 20 61 6c 6c 20  will cancel all 
180b0 53 51 4c 20 71 75 65 72 69 65 73 20 69 6e 20 70  SQL queries in p
180c0 72 6f 67 72 65 73 73 20 66 6f 72 20 61 6c 6c 20  rogress for all 
180d0 64 61 74 61 62 61 73 65 0d 0a 20 20 20 20 20 20  database..      
180e0 20 20 23 20 20 20 20 20 20 20 63 6f 6e 6e 65 63    #       connec
180f0 74 69 6f 6e 73 20 6b 6e 6f 77 6e 20 74 6f 20 74  tions known to t
18100 68 69 73 20 69 6e 74 65 72 70 72 65 74 65 72 2e  his interpreter.
18110 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
18120 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
18130 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69  exists ::no(sqli
18140 74 65 49 6e 74 65 72 72 75 70 74 43 61 6c 6c 62  teInterruptCallb
18150 61 63 6b 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ack)]} then {.. 
18160 20 20 20 20 20 20 20 20 20 73 65 74 75 70 44 62           setupDb
18170 49 6e 74 65 72 72 75 70 74 43 61 6c 6c 62 61 63  InterruptCallbac
18180 6b 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  k $::test_channe
18190 6c 20 24 3a 3a 74 65 73 74 5f 6c 6f 67 0d 0a 20  l $::test_log.. 
181a0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
181b0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
181c0 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f 72   NOTE: Check for
181d0 20 74 68 65 20 6e 61 74 69 76 65 20 72 75 6e 74   the native runt
181e0 69 6d 65 20 6f 70 74 69 6f 6e 2c 20 77 68 69 63  ime option, whic
181f0 68 20 77 6f 75 6c 64 20 6d 65 61 6e 20 77 65 20  h would mean we 
18200 61 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  are..        #  
18210 20 20 20 20 20 75 73 69 6e 67 20 74 68 65 20 6d       using the m
18220 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62  ixed-mode assemb
18230 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ly...        #..
18240 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
18250 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 24 3a  RuntimeOption $:
18260 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 6e 61  :test_channel na
18270 74 69 76 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20  tive....        
18280 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
18290 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  E: Check if the 
182a0 74 65 73 74 20 73 75 69 74 65 20 73 68 6f 75 6c  test suite shoul
182b0 64 20 63 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  d count the numb
182c0 65 72 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e  er of connection
182d0 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  s..        #    
182e0 20 20 20 22 6f 70 65 6e 65 64 22 20 61 6e 64 20     "opened" and 
182f0 22 63 6c 6f 73 65 64 22 20 66 72 6f 6d 20 74 68  "closed" from th
18300 65 20 70 6f 6f 6c 20 77 68 65 6e 20 64 65 74 65  e pool when dete
18310 72 6d 69 6e 69 6e 67 20 69 66 20 61 20 74 65 73  rmining if a tes
18320 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
18330 20 20 20 70 61 73 73 65 64 2e 20 20 44 69 73 61     passed.  Disa
18340 62 6c 69 6e 67 20 74 68 69 73 20 62 65 68 61 76  bling this behav
18350 69 6f 72 20 69 73 20 73 6f 6d 65 74 69 6d 65 73  ior is sometimes
18360 20 6e 65 63 65 73 73 61 72 79 20 28 65 2e 67 2e   necessary (e.g.
18370 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
18380 20 20 64 75 72 69 6e 67 20 74 68 65 20 72 65 6c    during the rel
18390 65 61 73 65 20 74 65 73 74 69 6e 67 20 70 72 6f  ease testing pro
183a0 63 65 73 73 29 20 62 65 63 61 75 73 65 20 74 68  cess) because th
183b0 65 72 65 20 61 72 65 20 73 65 76 65 72 61 6c 0d  ere are several.
183c0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
183d0 20 74 65 73 74 73 20 74 68 61 74 20 72 65 6c 79   tests that rely
183e0 20 6f 6e 20 74 68 65 20 22 6f 70 65 6e 65 64 20   on the "opened 
183f0 66 72 6f 6d 20 70 6f 6f 6c 22 20 63 6f 75 6e 74  from pool" count
18400 20 62 65 69 6e 67 20 67 72 65 61 74 65 72 0d 0a   being greater..
18410 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
18420 74 68 61 6e 20 7a 65 72 6f 2e 20 20 54 68 65 73  than zero.  Thes
18430 65 20 74 65 73 74 73 20 6d 61 79 20 66 61 69 6c  e tests may fail
18440 20 64 75 65 20 74 6f 20 74 68 65 20 6e 6f 6e 2d   due to the non-
18450 64 65 74 65 72 6d 69 6e 69 73 74 69 63 0d 0a 20  deterministic.. 
18460 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62         #       b
18470 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20 43  ehavior of the C
18480 4c 52 20 47 43 2c 20 65 76 65 6e 20 77 68 65 6e  LR GC, even when
18490 20 74 68 65 72 65 20 69 73 20 6e 6f 20 62 75 67   there is no bug
184a0 20 69 6e 20 74 68 65 20 63 6f 64 65 0d 0a 20 20   in the code..  
184b0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65        #       be
184c0 69 6e 67 20 74 65 73 74 65 64 2e 0d 0a 20 20 20  ing tested...   
184d0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
184e0 63 68 65 63 6b 46 6f 72 52 75 6e 74 69 6d 65 4f  checkForRuntimeO
184f0 70 74 69 6f 6e 20 24 3a 3a 74 65 73 74 5f 63 68  ption $::test_ch
18500 61 6e 6e 65 6c 20 6e 6f 50 6f 6f 6c 43 6f 75 6e  annel noPoolCoun
18510 74 73 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  ts....        #.
18520 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
18530 20 52 65 70 6f 72 74 20 74 68 65 20 72 65 73 6f   Report the reso
18540 75 72 63 65 20 75 73 61 67 65 20 70 72 69 6f 72  urce usage prior
18550 20 74 6f 20 72 75 6e 6e 69 6e 67 20 61 6e 79 20   to running any 
18560 74 65 73 74 73 2e 0d 0a 20 20 20 20 20 20 20 20  tests...        
18570 23 0d 0a 20 20 20 20 20 20 20 20 72 65 70 6f 72  #..        repor
18580 74 53 51 4c 69 74 65 52 65 73 6f 75 72 63 65 73  tSQLiteResources
18590 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
185a0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
185b0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
185c0 68 6f 77 20 74 68 65 20 61 63 74 69 76 65 20 74  how the active t
185d0 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  est constraints.
185e0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
185f0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
18600 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
18610 6e 64 41 72 67 73 20 22 2d 2d 2d 2d 20 63 6f 6e  ndArgs "---- con
18620 73 74 72 61 69 6e 74 73 3a 20 22 20 5c 0d 0a 20  straints: " \.. 
18630 20 20 20 20 20 20 20 20 20 20 20 5b 66 6f 72 6d             [form
18640 61 74 4c 69 73 74 20 5b 6c 73 6f 72 74 20 5b 67  atList [lsort [g
18650 65 74 43 6f 6e 73 74 72 61 69 6e 74 73 5d 5d 20  etConstraints]] 
18660 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a 0d 0a 20  <none>] \n].... 
18670 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
18680 20 20 23 20 4e 4f 54 45 3a 20 53 61 76 65 20 74    # NOTE: Save t
18690 68 65 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69  he test constrai
186a0 6e 74 73 20 66 6f 72 20 75 73 65 20 62 79 20 74  nts for use by t
186b0 68 72 65 61 64 73 20 63 72 65 61 74 65 64 20 69  hreads created i
186c0 6e 20 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20  n this..        
186d0 23 20 20 20 20 20 20 20 61 70 70 6c 69 63 61 74  #       applicat
186e0 69 6f 6e 20 64 6f 6d 61 69 6e 2e 20 20 54 68 69  ion domain.  Thi
186f0 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62  s is necessary b
18700 65 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20 45  ecause all the E
18710 61 67 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20  agle..        # 
18720 20 20 20 20 20 20 22 74 65 73 74 20 63 6f 6e 74        "test cont
18730 65 78 74 22 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ext" information
18740 20 69 73 20 70 65 72 2d 74 68 72 65 61 64 2e 0d   is per-thread..
18750 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
18760 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
18770 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 63 6f 6e  xists ::test_con
18780 73 74 72 61 69 6e 74 73 5d 7d 20 74 68 65 6e 20  straints]} then 
18790 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
187a0 20 3a 3a 74 65 73 74 5f 63 6f 6e 73 74 72 61 69   ::test_constrai
187b0 6e 74 73 20 24 3a 3a 65 61 67 6c 65 5f 74 65 73  nts $::eagle_tes
187c0 74 73 28 63 6f 6e 73 74 72 61 69 6e 74 73 29 0d  ts(constraints).
187d0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
187e0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
187f0 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 74 68   # NOTE: Load th
18800 65 20 22 61 66 74 65 72 2d 63 6f 6e 73 74 72 61  e "after-constra
18810 69 6e 74 73 22 20 63 75 73 74 6f 6d 20 70 65 72  ints" custom per
18820 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20 70 65 72  -user and/or per
18830 2d 68 6f 73 74 0d 0a 20 20 20 20 20 20 20 20 23  -host..        #
18840 20 20 20 20 20 20 20 74 65 73 74 20 73 65 74 74         test sett
18850 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  ings now...     
18860 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 75 70     #..        up
18870 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 6c 6f  level 1 [list lo
18880 61 64 53 51 4c 69 74 65 54 65 73 74 53 65 74 74  adSQLiteTestSett
18890 69 6e 67 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  ings $::test_cha
188a0 6e 6e 65 6c 20 2e 61 66 74 65 72 5d 0d 0a 0d 0a  nnel .after]....
188b0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
188c0 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20     # NOTE: Show 
188d0 77 68 65 6e 20 6f 75 72 20 74 65 73 74 73 20 61  when our tests a
188e0 63 74 75 61 6c 6c 79 20 62 65 67 61 6e 20 28 6e  ctually began (n
188f0 6f 77 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ow)...        #.
18900 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
18910 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
18920 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
18930 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
18940 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
18950 74 65 20 74 65 73 74 73 20 62 65 67 61 6e 20 61  te tests began a
18960 74 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  t " \..         
18970 20 20 20 5b 63 6c 6f 63 6b 20 66 6f 72 6d 61 74     [clock format
18980 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d   [clock seconds]
18990 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  ] \n]..      }..
189a0 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
189b0 6f 63 20 72 75 6e 53 51 4c 69 74 65 54 65 73 74  oc runSQLiteTest
189c0 45 70 69 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20  Epilogue {} {.. 
189d0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
189e0 4e 4f 54 45 3a 20 53 6b 69 70 20 72 75 6e 6e 69  NOTE: Skip runni
189f0 6e 67 20 6f 75 72 20 63 75 73 74 6f 6d 20 65 70  ng our custom ep
18a00 69 6c 6f 67 75 65 20 69 66 20 74 68 65 20 6d 61  ilogue if the ma
18a10 69 6e 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 0d  in one has been.
18a20 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
18a30 6b 69 70 70 65 64 2e 0d 0a 20 20 20 20 20 20 23  kipped...      #
18a40 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e  ..      if {![in
18a50 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65  fo exists ::no(e
18a60 70 69 6c 6f 67 75 65 2e 65 61 67 6c 65 29 5d 7d  pilogue.eagle)]}
18a70 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
18a80 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
18a90 54 45 3a 20 53 68 6f 77 20 77 68 65 6e 20 6f 75  TE: Show when ou
18aa0 72 20 74 65 73 74 73 20 61 63 74 75 61 6c 6c 79  r tests actually
18ab0 20 65 6e 64 65 64 20 28 6e 6f 77 29 2e 0d 0a 20   ended (now)... 
18ac0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
18ad0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
18ae0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
18af0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
18b00 20 20 20 22 2d 2d 2d 2d 20 53 79 73 74 65 6d 2e     "---- System.
18b10 44 61 74 61 2e 53 51 4c 69 74 65 20 74 65 73 74  Data.SQLite test
18b20 73 20 65 6e 64 65 64 20 61 74 20 22 20 5c 0d 0a  s ended at " \..
18b30 20 20 20 20 20 20 20 20 20 20 20 20 5b 63 6c 6f              [clo
18b40 63 6b 20 66 6f 72 6d 61 74 20 5b 63 6c 6f 63 6b  ck format [clock
18b50 20 73 65 63 6f 6e 64 73 5d 5d 20 5c 6e 5d 0d 0a   seconds]] \n]..
18b60 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
18b70 20 20 20 20 20 23 20 42 55 47 46 49 58 3a 20 42       # BUGFIX: B
18b80 65 66 6f 72 65 20 63 68 65 63 6b 69 6e 67 20 74  efore checking t
18b90 68 65 20 66 69 6e 61 6c 20 72 65 73 6f 75 72 63  he final resourc
18ba0 65 73 20 69 6e 20 75 73 65 20 62 79 20 53 51 4c  es in use by SQL
18bb0 69 74 65 2c 20 6d 61 6b 65 0d 0a 20 20 20 20 20  ite, make..     
18bc0 20 20 20 23 20 20 20 20 20 20 20 20 20 73 75 72     #         sur
18bd0 65 20 62 6f 74 68 20 6f 66 20 74 68 65 20 50 52  e both of the PR
18be0 41 47 4d 41 20 72 65 6c 61 74 65 64 20 64 69 72  AGMA related dir
18bf0 65 63 74 6f 72 79 20 6e 61 6d 65 73 20 61 72 65  ectory names are
18c00 20 66 72 65 65 64 2e 0d 0a 20 20 20 20 20 20 20   freed...       
18c10 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63   #..        chec
18c20 6b 46 6f 72 53 51 4c 69 74 65 44 69 72 65 63 74  kForSQLiteDirect
18c30 6f 72 69 65 73 20 24 3a 3a 74 65 73 74 5f 63 68  ories $::test_ch
18c40 61 6e 6e 65 6c 20 74 72 75 65 0d 0a 0d 0a 20 20  annel true....  
18c50 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
18c60 20 23 20 4e 4f 54 45 3a 20 41 6c 73 6f 20 72 65   # NOTE: Also re
18c70 70 6f 72 74 20 74 68 65 20 72 65 73 6f 75 72 63  port the resourc
18c80 65 20 75 73 61 67 65 20 61 66 74 65 72 20 72 75  e usage after ru
18c90 6e 6e 69 6e 67 20 74 68 65 20 74 65 73 74 73 2e  nning the tests.
18ca0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
18cb0 20 20 20 20 20 72 65 70 6f 72 74 53 51 4c 69 74       reportSQLit
18cc0 65 52 65 73 6f 75 72 63 65 73 20 24 3a 3a 74 65  eResources $::te
18cd0 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20  st_channel....  
18ce0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
18cf0 20 23 20 4e 4f 54 45 3a 20 52 65 70 6f 72 74 20   # NOTE: Report 
18d00 74 68 65 20 63 72 69 74 69 63 61 6c 20 68 61 6e  the critical han
18d10 64 6c 65 20 63 6f 75 6e 74 73 20 61 66 74 65 72  dle counts after
18d20 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 74 65 73   running the tes
18d30 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ts...        #..
18d40 20 20 20 20 20 20 20 20 67 65 74 53 51 4c 69 74          getSQLit
18d50 65 48 61 6e 64 6c 65 43 6f 75 6e 74 73 20 24 3a  eHandleCounts $:
18d60 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20  :test_channel.. 
18d70 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
18d80 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23  ..    ##########
18d90 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18da0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18db0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18dc0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18dd0 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23  #..    #########
18de0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18df0 23 23 23 23 20 45 4e 44 20 45 61 67 6c 65 20 4f  #### END Eagle O
18e00 4e 4c 59 20 23 23 23 23 23 23 23 23 23 23 23 23  NLY ############
18e10 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18e20 23 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23  ##..    ########
18e30 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18e40 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18e50 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18e60 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
18e70 23 23 23 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 0d  ###..  }....  #.
18e80 0a 20 20 23 20 4e 4f 54 45 3a 20 53 61 76 65 20  .  # NOTE: Save 
18e90 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
18ea0 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69  directory contai
18eb0 6e 69 6e 67 20 74 68 69 73 20 66 69 6c 65 2e 0d  ning this file..
18ec0 0a 20 20 23 0d 0a 20 20 69 66 20 7b 21 5b 69 6e  .  #..  if {![in
18ed0 66 6f 20 65 78 69 73 74 73 20 63 6f 6d 6d 6f 6e  fo exists common
18ee0 5f 64 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65  _directory]} the
18ef0 6e 20 7b 0d 0a 20 20 20 20 73 65 74 20 63 6f 6d  n {..    set com
18f00 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 20 5b 66  mon_directory [f
18f10 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b 69 6e 66  ile dirname [inf
18f20 6f 20 73 63 72 69 70 74 5d 5d 0d 0a 20 20 7d 0d  o script]]..  }.
18f30 0a 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45  ...  #..  # NOTE
18f40 3a 20 50 72 6f 76 69 64 65 20 74 68 65 20 53 79  : Provide the Sy
18f50 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
18f60 20 74 65 73 74 20 70 61 63 6b 61 67 65 20 74 6f   test package to
18f70 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
18f80 2e 0d 0a 20 20 23 0d 0a 20 20 70 61 63 6b 61 67  ...  #..  packag
18f90 65 20 70 72 6f 76 69 64 65 20 53 79 73 74 65 6d  e provide System
18fa0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 54 65 73  .Data.SQLite.Tes
18fb0 74 20 31 2e 30 0d 0a 7d 0d 0a                    t 1.0..}..