System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact b86a65bf42df55ff11e5bb3bb7b2c57ecf6c6caa:


0000: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0010: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0020: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0030: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0040: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
0050: 0a 23 0d 0a 23 20 63 6f 6d 6d 6f 6e 2e 65 61 67  .#..# common.eag
0060: 6c 65 20 2d 2d 0d 0a 23 0d 0a 23 20 57 72 69 74  le --..#..# Writ
0070: 74 65 6e 20 62 79 20 4a 6f 65 20 4d 69 73 74 61  ten by Joe Mista
0080: 63 68 6b 69 6e 2e 0d 0a 23 20 52 65 6c 65 61 73  chkin...# Releas
0090: 65 64 20 74 6f 20 74 68 65 20 70 75 62 6c 69 63  ed to the public
00a0: 20 64 6f 6d 61 69 6e 2c 20 75 73 65 20 61 74 20   domain, use at 
00b0: 79 6f 75 72 20 6f 77 6e 20 72 69 73 6b 21 0d 0a  your own risk!..
00c0: 23 0d 0a 23 23 23 23 23 23 23 23 23 23 23 23 23  #..#############
00d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
00e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
00f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0100: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0110: 23 23 0d 0a 0d 0a 23 0d 0a 23 20 4e 4f 54 45 3a  ##....#..# NOTE:
0120: 20 55 73 65 20 6f 75 72 20 6f 77 6e 20 6e 61 6d   Use our own nam
0130: 65 73 70 61 63 65 20 68 65 72 65 20 62 65 63 61  espace here beca
0140: 75 73 65 20 65 76 65 6e 20 74 68 6f 75 67 68 20  use even though 
0150: 77 65 20 64 6f 20 6e 6f 74 20 64 69 72 65 63 74  we do not direct
0160: 6c 79 0d 0a 23 20 20 20 20 20 20 20 73 75 70 70  ly..#       supp
0170: 6f 72 74 20 6e 61 6d 65 73 70 61 63 65 73 20 6f  ort namespaces o
0180: 75 72 73 65 6c 76 65 73 2c 20 77 65 20 64 6f 20  urselves, we do 
0190: 6e 6f 74 20 77 61 6e 74 20 74 6f 20 70 6f 6c 6c  not want to poll
01a0: 75 74 65 20 74 68 65 20 67 6c 6f 62 61 6c 0d 0a  ute the global..
01b0: 23 20 20 20 20 20 20 20 6e 61 6d 65 73 70 61 63  #       namespac
01c0: 65 20 69 66 20 74 68 69 73 20 73 63 72 69 70 74  e if this script
01d0: 20 61 63 74 75 61 6c 6c 79 20 65 6e 64 73 20 75   actually ends u
01e0: 70 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65  p being evaluate
01f0: 64 20 69 6e 20 54 63 6c 2e 0d 0a 23 0d 0a 6e 61  d in Tcl...#..na
0200: 6d 65 73 70 61 63 65 20 65 76 61 6c 20 3a 3a 45  mespace eval ::E
0210: 61 67 6c 65 20 7b 0d 0a 20 20 69 66 20 7b 5b 69  agle {..  if {[i
0220: 73 45 61 67 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d  sEagle]} then {.
0230: 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23  .    ###########
0240: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0250: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0260: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0270: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0280: 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23  ..    ##########
0290: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02a0: 23 23 20 42 45 47 49 4e 20 45 61 67 6c 65 20 4f  ## BEGIN Eagle O
02b0: 4e 4c 59 20 23 23 23 23 23 23 23 23 23 23 23 23  NLY ############
02c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02d0: 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23  #..    #########
02e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0300: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0310: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0320: 23 23 0d 0a 0d 0a 20 20 20 20 70 72 6f 63 20 67  ##....    proc g
0330: 65 74 42 75 69 6c 64 59 65 61 72 20 7b 7d 20 7b  etBuildYear {} {
0340: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
0350: 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66 20   # NOTE: See if 
0360: 74 68 65 20 22 79 65 61 72 22 20 73 65 74 74 69  the "year" setti
0370: 6e 67 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  ng has been over
0380: 72 69 64 64 65 6e 20 62 79 20 74 68 65 20 75 73  ridden by the us
0390: 65 72 20 28 65 2e 67 2e 0d 0a 20 20 20 20 20 20  er (e.g...      
03a0: 23 20 20 20 20 20 20 20 6f 6e 20 74 68 65 20 63  #       on the c
03b0: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 20 20 54  ommand line).  T
03c0: 68 69 73 20 68 65 6c 70 73 20 63 6f 6e 74 72 6f  his helps contro
03d0: 6c 20 65 78 61 63 74 6c 79 20 77 68 69 63 68 20  l exactly which 
03e0: 73 65 74 20 6f 66 0d 0a 20 20 20 20 20 20 23 20  set of..      # 
03f0: 20 20 20 20 20 20 62 69 6e 61 72 69 65 73 20 77        binaries w
0400: 65 20 61 72 65 20 74 65 73 74 69 6e 67 2c 20 74  e are testing, t
0410: 68 6f 73 65 20 70 72 6f 64 75 63 65 64 20 75 73  hose produced us
0420: 69 6e 67 20 74 68 65 20 56 69 73 75 61 6c 20 53  ing the Visual S
0430: 74 75 64 69 6f 0d 0a 20 20 20 20 20 20 23 20 20  tudio..      #  
0440: 20 20 20 20 20 32 30 30 35 2c 20 32 30 30 38 2c       2005, 2008,
0450: 20 32 30 31 30 2c 20 32 30 31 32 2c 20 6f 72 20   2010, 2012, or 
0460: 32 30 31 33 20 62 75 69 6c 64 20 73 79 73 74 65  2013 build syste
0470: 6d 73 2e 20 20 54 6f 20 6f 76 65 72 72 69 64 65  ms.  To override
0480: 20 74 68 69 73 0d 0a 20 20 20 20 20 20 23 20 20   this..      #  
0490: 20 20 20 20 20 76 61 6c 75 65 20 76 69 61 20 74       value via t
04a0: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2c  he command line,
04b0: 20 65 6e 74 65 72 20 61 20 63 6f 6d 6d 61 6e 64   enter a command
04c0: 20 73 69 6d 69 6c 61 72 20 74 6f 20 6f 6e 65 20   similar to one 
04d0: 6f 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  of..      #     
04e0: 20 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    the following 
04f0: 28 61 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65  (all on one line
0500: 29 3a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ):..      #..   
0510: 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65     #       Eagle
0520: 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e  Shell.exe -anyIn
0530: 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65  itialize "set te
0540: 73 74 5f 79 65 61 72 20 32 30 30 35 22 0d 0a 20  st_year 2005".. 
0550: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 2d       #         -
0560: 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61  file .\path\to\a
0570: 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20  ll.eagle..      
0580: 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  #..      #      
0590: 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20   EagleShell.exe 
05a0: 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20 22  -anyInitialize "
05b0: 73 65 74 20 74 65 73 74 5f 79 65 61 72 20 32 30  set test_year 20
05c0: 30 38 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20  08"..      #    
05d0: 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74       -file .\pat
05e0: 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a  h\to\all.eagle..
05f0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
0600: 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c         EagleShel
0610: 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61  l.exe -anyInitia
0620: 6c 69 7a 65 20 22 73 65 74 20 74 65 73 74 5f 79  lize "set test_y
0630: 65 61 72 20 32 30 31 30 22 0d 0a 20 20 20 20 20  ear 2010"..     
0640: 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65   #         -file
0650: 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65   .\path\to\all.e
0660: 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20  agle..      #.. 
0670: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
0680: 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79  leShell.exe -any
0690: 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20  Initialize "set 
06a0: 74 65 73 74 5f 79 65 61 72 20 32 30 31 32 22 0d  test_year 2012".
06b0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20  .      #        
06c0: 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f   -file .\path\to
06d0: 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20  \all.eagle..    
06e0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20    #..      #    
06f0: 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78     EagleShell.ex
0700: 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65  e -anyInitialize
0710: 20 22 73 65 74 20 74 65 73 74 5f 79 65 61 72 20   "set test_year 
0720: 32 30 31 33 22 0d 0a 20 20 20 20 20 20 23 20 20  2013"..      #  
0730: 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70         -file .\p
0740: 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65  ath\to\all.eagle
0750: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
0760: 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68   #       EagleSh
0770: 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74  ell.exe -anyInit
0780: 69 61 6c 69 7a 65 20 22 75 6e 73 65 74 20 2d 6e  ialize "unset -n
0790: 6f 63 6f 6d 70 6c 61 69 6e 20 74 65 73 74 5f 79  ocomplain test_y
07a0: 65 61 72 22 0d 0a 20 20 20 20 20 20 23 20 20 20  ear"..      #   
07b0: 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61        -file .\pa
07c0: 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d  th\to\all.eagle.
07d0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
07e0: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
07f0: 20 3a 3a 74 65 73 74 5f 79 65 61 72 5d 20 26 26   ::test_year] &&
0800: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
0810: 24 3a 3a 74 65 73 74 5f 79 65 61 72 5d 20 3e 20  $::test_year] > 
0820: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
0830: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
0840: 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70  NOTE: Use the sp
0850: 65 63 69 66 69 65 64 20 74 65 73 74 20 79 65 61  ecified test yea
0860: 72 2e 20 20 49 66 20 74 68 69 73 20 76 61 72 69  r.  If this vari
0870: 61 62 6c 65 20 69 73 20 6e 6f 74 20 73 65 74 2c  able is not set,
0880: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
0890: 20 20 20 20 20 20 64 65 66 61 75 6c 74 20 76 61        default va
08a0: 6c 75 65 20 77 69 6c 6c 20 62 65 20 62 61 73 65  lue will be base
08b0: 64 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  d on whether or 
08c0: 6e 6f 74 20 45 61 67 6c 65 20 68 61 73 20 62 65  not Eagle has be
08d0: 65 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  en..        #   
08e0: 20 20 20 20 63 6f 6d 70 69 6c 65 64 20 61 67 61      compiled aga
08f0: 69 6e 73 74 20 74 68 65 20 43 4c 52 20 76 32 2e  inst the CLR v2.
0900: 30 20 6f 72 20 43 4c 52 20 76 34 2e 30 2e 0d 0a  0 or CLR v4.0...
0910: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
0920: 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73     return $::tes
0930: 74 5f 79 65 61 72 0d 0a 20 20 20 20 20 20 7d 20  t_year..      } 
0940: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
0950: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
0960: 45 3a 20 49 66 20 45 61 67 6c 65 20 68 61 73 20  E: If Eagle has 
0970: 62 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20 61 67  been compiled ag
0980: 61 69 6e 73 74 20 74 68 65 20 43 4c 52 20 76 34  ainst the CLR v4
0990: 2e 30 2c 20 75 73 65 20 22 32 30 31 30 22 20 62  .0, use "2010" b
09a0: 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
09b0: 20 20 20 64 65 66 61 75 6c 74 20 28 77 65 20 63     default (we c
09c0: 6f 75 6c 64 20 75 73 65 20 22 32 30 31 32 22 20  ould use "2012" 
09d0: 6f 72 20 22 32 30 31 33 22 20 69 6e 20 74 68 61  or "2013" in tha
09e0: 74 20 63 61 73 65 20 61 73 20 77 65 6c 6c 29 20  t case as well) 
09f0: 61 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  as..        #   
0a00: 20 20 20 20 74 68 65 20 74 65 73 74 20 79 65 61      the test yea
0a10: 72 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 75 73  r; otherwise, us
0a20: 65 20 22 32 30 30 38 22 20 62 79 20 64 65 66 61  e "2008" by defa
0a30: 75 6c 74 20 28 77 65 20 63 6f 75 6c 64 20 75 73  ult (we could us
0a40: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
0a50: 20 20 20 22 32 30 30 35 22 20 69 6e 20 74 68 61     "2005" in tha
0a60: 74 20 63 61 73 65 20 61 73 20 77 65 6c 6c 29 2e  t case as well).
0a70: 20 20 49 66 20 61 6e 6f 74 68 65 72 20 6d 61 6a    If another maj
0a80: 6f 72 20 5b 69 6e 63 6f 6d 70 61 74 69 62 6c 65  or [incompatible
0a90: 5d 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ]..        #    
0aa0: 20 20 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68     version of th
0ab0: 65 20 43 4c 52 20 69 73 20 72 65 6c 65 61 73 65  e CLR is release
0ac0: 64 2c 20 74 68 69 73 20 63 68 65 63 6b 20 77 69  d, this check wi
0ad0: 6c 6c 20 68 61 76 65 20 74 6f 20 62 65 0d 0a 20  ll have to be.. 
0ae0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
0af0: 68 61 6e 67 65 64 2e 20 20 54 68 65 20 64 65 66  hanged.  The def
0b00: 61 75 6c 74 20 74 65 73 74 20 79 65 61 72 20 74  ault test year t
0b10: 6f 20 75 73 65 20 66 6f 72 20 61 20 70 61 72 74  o use for a part
0b20: 69 63 75 6c 61 72 20 43 4c 52 0d 0a 20 20 20 20  icular CLR..    
0b30: 20 20 20 20 23 20 20 20 20 20 20 20 76 65 72 73      #       vers
0b40: 69 6f 6e 20 6d 61 79 20 62 65 20 6f 76 65 72 72  ion may be overr
0b50: 69 64 64 65 6e 20 62 79 20 73 65 74 74 69 6e 67  idden by setting
0b60: 20 74 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 69   the global vari
0b70: 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20  able..        # 
0b80: 20 20 20 20 20 20 22 74 65 73 74 5f 79 65 61 72        "test_year
0b90: 5f 63 6c 72 5f 76 24 58 22 2c 20 77 68 65 72 65  _clr_v$X", where
0ba0: 20 22 24 58 22 20 6d 61 79 20 5b 63 75 72 72 65   "$X" may [curre
0bb0: 6e 74 6c 79 5d 20 62 65 20 65 69 74 68 65 72 20  ntly] be either 
0bc0: 22 32 22 0d 0a 20 20 20 20 20 20 20 20 23 20 20  "2"..        #  
0bd0: 20 20 20 20 20 6f 72 20 22 34 22 2e 0d 0a 20 20       or "4"...  
0be0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
0bf0: 20 69 66 20 7b 5b 68 61 76 65 43 6f 6e 73 74 72   if {[haveConstr
0c00: 61 69 6e 74 20 69 6d 61 67 65 52 75 6e 74 69 6d  aint imageRuntim
0c10: 65 34 30 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e40]} then {..  
0c20: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66          if {[inf
0c30: 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f  o exists ::test_
0c40: 79 65 61 72 5f 63 6c 72 5f 76 34 5d 20 26 26 20  year_clr_v4] && 
0c50: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
0c60: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
0c70: 24 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c 72  $::test_year_clr
0c80: 5f 76 34 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  _v4] > 0} then {
0c90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
0ca0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
0cb0: 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65  OTE: Use the spe
0cc0: 63 69 66 69 65 64 20 74 65 73 74 20 79 65 61 72  cified test year
0cd0: 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76 34 2e   for the CLR v4.
0ce0: 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  0...            
0cf0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  #..            r
0d00: 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 79 65  eturn $::test_ye
0d10: 61 72 5f 63 6c 72 5f 76 34 0d 0a 20 20 20 20 20  ar_clr_v4..     
0d20: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
0d30: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
0d40: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
0d50: 3a 20 55 73 65 20 74 68 65 20 64 65 66 61 75 6c  : Use the defaul
0d60: 74 20 74 65 73 74 20 79 65 61 72 20 66 6f 72 20  t test year for 
0d70: 74 68 65 20 43 4c 52 20 76 34 2e 30 2e 0d 0a 20  the CLR v4.0... 
0d80: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
0d90: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
0da0: 20 32 30 31 30 3b 20 23 20 54 4f 44 4f 3a 20 47   2010; # TODO: G
0db0: 6f 6f 64 20 22 66 61 6c 6c 62 61 63 6b 22 20 64  ood "fallback" d
0dc0: 65 66 61 75 6c 74 3f 0d 0a 20 20 20 20 20 20 20  efault?..       
0dd0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
0de0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
0df0: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
0e00: 74 73 20 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63  ts ::test_year_c
0e10: 6c 72 5f 76 32 5d 20 26 26 20 5c 0d 0a 20 20 20  lr_v2] && \..   
0e20: 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69             [stri
0e30: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73  ng length $::tes
0e40: 74 5f 79 65 61 72 5f 63 6c 72 5f 76 32 5d 20 3e  t_year_clr_v2] >
0e50: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
0e60: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
0e70: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55         # NOTE: U
0e80: 73 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64  se the specified
0e90: 20 74 65 73 74 20 79 65 61 72 20 66 6f 72 20 74   test year for t
0ea0: 68 65 20 43 4c 52 20 76 32 2e 30 2e 0d 0a 20 20  he CLR v2.0...  
0eb0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
0ec0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
0ed0: 24 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c 72  $::test_year_clr
0ee0: 5f 76 32 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  _v2..          }
0ef0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
0f00: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
0f10: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
0f20: 74 68 65 20 64 65 66 61 75 6c 74 20 74 65 73 74  the default test
0f30: 20 79 65 61 72 20 66 6f 72 20 74 68 65 20 43 4c   year for the CL
0f40: 52 20 76 32 2e 30 2e 0d 0a 20 20 20 20 20 20 20  R v2.0...       
0f50: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
0f60: 20 20 20 20 72 65 74 75 72 6e 20 32 30 30 38 3b      return 2008;
0f70: 20 23 20 54 4f 44 4f 3a 20 47 6f 6f 64 20 22 66   # TODO: Good "f
0f80: 61 6c 6c 62 61 63 6b 22 20 64 65 66 61 75 6c 74  allback" default
0f90: 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ?..          }..
0fa0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
0fb0: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
0fc0: 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 59    proc getBuildY
0fd0: 65 61 72 73 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  ears {} {..     
0fe0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
0ff0: 3a 20 53 65 65 20 69 66 20 74 68 65 20 6c 69 73  : See if the lis
1000: 74 20 6f 66 20 74 65 73 74 20 79 65 61 72 73 20  t of test years 
1010: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64  has been overrid
1020: 64 65 6e 20 62 79 20 74 68 65 20 75 73 65 72 0d  den by the user.
1030: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 28  .      #       (
1040: 65 2e 67 2e 20 6f 6e 20 74 68 65 20 63 6f 6d 6d  e.g. on the comm
1050: 61 6e 64 20 6c 69 6e 65 29 2e 0d 0a 20 20 20 20  and line)...    
1060: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
1070: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65  info exists ::te
1080: 73 74 5f 79 65 61 72 73 5d 20 26 26 20 5b 6c 6c  st_years] && [ll
1090: 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 79 65  ength $::test_ye
10a0: 61 72 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ars] > 0} then {
10b0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
10c0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65       # NOTE: Use
10d0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c   the specified l
10e0: 69 73 74 20 6f 66 20 74 65 73 74 20 79 65 61 72  ist of test year
10f0: 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  s...        #.. 
1100: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
1110: 3a 74 65 73 74 5f 79 65 61 72 73 0d 0a 20 20 20  :test_years..   
1120: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1130: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1140: 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20  # NOTE: Use the 
1150: 64 65 66 61 75 6c 74 20 6c 69 73 74 20 6f 66 20  default list of 
1160: 74 65 73 74 20 79 65 61 72 73 2e 0d 0a 20 20 20  test years...   
1170: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1180: 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 32 30 30  return [list 200
1190: 35 20 32 30 30 38 20 32 30 31 30 20 32 30 31 32  5 2008 2010 2012
11a0: 20 32 30 31 33 5d 0d 0a 20 20 20 20 20 20 7d 0d   2013]..      }.
11b0: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
11c0: 72 6f 63 20 67 65 74 42 75 69 6c 64 50 6c 61 74  roc getBuildPlat
11d0: 66 6f 72 6d 20 7b 20 6e 61 74 69 76 65 20 7d 20  form { native } 
11e0: 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  {..      if {[in
11f0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74  fo exists ::test
1200: 5f 70 6c 61 74 66 6f 72 6d 5d 20 26 26 20 5c 0d  _platform] && \.
1210: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
1220: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73  ng length $::tes
1230: 74 5f 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d  t_platform] > 0}
1240: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1250: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1260: 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63  TE: Use the spec
1270: 69 66 69 65 64 20 74 65 73 74 20 70 6c 61 74 66  ified test platf
1280: 6f 72 6d 2e 20 20 49 66 20 74 68 69 73 20 76 61  orm.  If this va
1290: 72 69 61 62 6c 65 20 69 73 20 6e 6f 74 20 73 65  riable is not se
12a0: 74 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  t,..        #   
12b0: 20 20 20 20 74 68 65 20 64 65 66 61 75 6c 74 20      the default 
12c0: 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 20 62 61  value will be ba
12d0: 73 65 64 20 6f 6e 20 74 68 65 20 6d 61 63 68 69  sed on the machi
12e0: 6e 65 20 61 72 63 68 69 74 65 63 74 75 72 65 2e  ne architecture.
12f0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1300: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70       return [exp
1310: 72 20 7b 24 6e 61 74 69 76 65 20 3f 20 24 3a 3a  r {$native ? $::
1320: 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d 20 3a 20  test_platform : 
1330: 22 22 7d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  ""}]..      } el
1340: 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73  seif {[info exis
1350: 74 73 20 3a 3a 74 65 73 74 5f 6d 61 63 68 69 6e  ts ::test_machin
1360: 65 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  e] && \..       
1370: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
1380: 68 20 24 3a 3a 74 65 73 74 5f 6d 61 63 68 69 6e  h $::test_machin
1390: 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
13a0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
13b0: 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 6e     # NOTE: For n
13c0: 61 74 69 76 65 20 62 75 69 6c 64 73 2c 20 72 65  ative builds, re
13d0: 74 75 72 6e 20 74 68 65 20 70 6c 61 74 66 6f 72  turn the platfor
13e0: 6d 20 6e 61 6d 65 20 63 6f 72 72 65 73 70 6f 6e  m name correspon
13f0: 64 69 6e 67 20 74 6f 0d 0a 20 20 20 20 20 20 20  ding to..       
1400: 20 23 20 20 20 20 20 20 20 74 68 65 20 74 65 73   #       the tes
1410: 74 20 6d 61 63 68 69 6e 65 20 61 72 63 68 69 74  t machine archit
1420: 65 63 74 75 72 65 3b 20 6f 74 68 65 72 77 69 73  ecture; otherwis
1430: 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70  e, return an emp
1440: 74 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ty..        #   
1450: 20 20 20 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20      string...   
1460: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1470: 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 24 6e  return [expr {$n
1480: 61 74 69 76 65 20 3f 20 5b 6d 61 63 68 69 6e 65  ative ? [machine
1490: 54 6f 50 6c 61 74 66 6f 72 6d 20 24 3a 3a 74 65  ToPlatform $::te
14a0: 73 74 5f 6d 61 63 68 69 6e 65 5d 20 3a 20 22 22  st_machine] : ""
14b0: 7d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  }]..      } else
14c0: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
14d0: 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28   ::tcl_platform(
14e0: 6d 61 63 68 69 6e 65 29 5d 7d 20 74 68 65 6e 20  machine)]} then 
14f0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
1500: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f        # NOTE: Fo
1510: 72 20 6e 61 74 69 76 65 20 62 75 69 6c 64 73 2c  r native builds,
1520: 20 72 65 74 75 72 6e 20 74 68 65 20 70 6c 61 74   return the plat
1530: 66 6f 72 6d 20 6e 61 6d 65 20 63 6f 72 72 65 73  form name corres
1540: 70 6f 6e 64 69 6e 67 20 74 6f 0d 0a 20 20 20 20  ponding to..    
1550: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
1560: 6d 61 63 68 69 6e 65 20 61 72 63 68 69 74 65 63  machine architec
1570: 74 75 72 65 3b 20 6f 74 68 65 72 77 69 73 65 2c  ture; otherwise,
1580: 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79   return an empty
1590: 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20   string...      
15a0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
15b0: 75 72 6e 20 5b 65 78 70 72 20 7b 24 6e 61 74 69  urn [expr {$nati
15c0: 76 65 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ve ? \..        
15d0: 20 20 20 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c      [machineToPl
15e0: 61 74 66 6f 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c  atform $::tcl_pl
15f0: 61 74 66 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d  atform(machine)]
1600: 20 3a 20 22 22 7d 5d 0d 0a 20 20 20 20 20 20 7d   : ""}]..      }
1610: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1620: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1630: 54 45 3a 20 4e 6f 20 6d 61 63 68 69 6e 65 20 61  TE: No machine a
1640: 72 63 68 69 74 65 63 74 75 72 65 20 69 73 20 61  rchitecture is a
1650: 76 61 69 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e  vailable, return
1660: 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   an empty string
1670: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1680: 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d        return "".
1690: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
16a0: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
16b0: 42 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69  BuildConfigurati
16c0: 6f 6e 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  on {} {..      #
16d0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
16e0: 53 65 65 20 69 66 20 74 68 65 20 22 63 6f 6e 66  See if the "conf
16f0: 69 67 75 72 61 74 69 6f 6e 22 20 73 65 74 74 69  iguration" setti
1700: 6e 67 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  ng has been over
1710: 72 69 64 64 65 6e 20 62 79 20 74 68 65 0d 0a 20  ridden by the.. 
1720: 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73 65       #       use
1730: 72 20 28 65 2e 67 2e 20 6f 6e 20 74 68 65 20 63  r (e.g. on the c
1740: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 20 20 54  ommand line).  T
1750: 68 69 73 20 68 65 6c 70 73 20 63 6f 6e 74 72 6f  his helps contro
1760: 6c 20 65 78 61 63 74 6c 79 0d 0a 20 20 20 20 20  l exactly..     
1770: 20 23 20 20 20 20 20 20 20 77 68 69 63 68 20 73   #       which s
1780: 65 74 20 6f 66 20 62 69 6e 61 72 69 65 73 20 77  et of binaries w
1790: 65 20 61 72 65 20 74 65 73 74 69 6e 67 20 28 69  e are testing (i
17a0: 2e 65 2e 20 74 68 6f 73 65 20 62 75 69 6c 74 20  .e. those built 
17b0: 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  in the..      # 
17c0: 20 20 20 20 20 20 22 44 65 62 75 67 22 20 6f 72        "Debug" or
17d0: 20 22 52 65 6c 65 61 73 65 22 20 62 75 69 6c 64   "Release" build
17e0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 29   configurations)
17f0: 2e 20 20 54 6f 20 6f 76 65 72 72 69 64 65 20 74  .  To override t
1800: 68 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20  his..      #    
1810: 20 20 20 76 61 6c 75 65 20 76 69 61 20 74 68 65     value via the
1820: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2c 20 65   command line, e
1830: 6e 74 65 72 20 61 20 63 6f 6d 6d 61 6e 64 20 73  nter a command s
1840: 69 6d 69 6c 61 72 20 74 6f 20 6f 6e 65 20 6f 66  imilar to one of
1850: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1860: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 28 61  the following (a
1870: 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65 29 3a  ll on one line):
1880: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1890: 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68   #       EagleSh
18a0: 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74  ell.exe -anyInit
18b0: 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65 73 74  ialize "set test
18c0: 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 44  _configuration D
18d0: 65 62 75 67 22 0d 0a 20 20 20 20 20 20 23 20 20  ebug"..      #  
18e0: 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70         -file .\p
18f0: 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65  ath\to\all.eagle
1900: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1910: 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68   #       EagleSh
1920: 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74  ell.exe -anyInit
1930: 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65 73 74  ialize "set test
1940: 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 52  _configuration R
1950: 65 6c 65 61 73 65 22 0d 0a 20 20 20 20 20 20 23  elease"..      #
1960: 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e           -file .
1970: 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67  \path\to\all.eag
1980: 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  le..      #..   
1990: 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65     #       Eagle
19a0: 53 68 65 6c 6c 2e 65 78 65 20 2d 66 69 6c 65 20  Shell.exe -file 
19b0: 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61  .\path\to\all.ea
19c0: 67 6c 65 20 2d 70 72 65 54 65 73 74 0d 0a 20 20  gle -preTest..  
19d0: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 22 75      #         "u
19e0: 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e  nset -nocomplain
19f0: 20 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74   test_configurat
1a00: 69 6f 6e 22 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ion"..      #.. 
1a10: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
1a20: 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 63 6f 6e  xists ::test_con
1a30: 66 69 67 75 72 61 74 69 6f 6e 5d 20 26 26 20 5c  figuration] && \
1a40: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
1a50: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65  ing length $::te
1a60: 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  st_configuration
1a70: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
1a80: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1a90: 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68    # NOTE: Use th
1aa0: 65 20 73 70 65 63 69 66 69 65 64 20 74 65 73 74  e specified test
1ab0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20   configuration. 
1ac0: 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   The default val
1ad0: 75 65 20 75 73 65 64 0d 0a 20 20 20 20 20 20 20  ue used..       
1ae0: 20 23 20 20 20 20 20 20 20 66 6f 72 20 74 68 69   #       for thi
1af0: 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 74 79  s variable is ty
1b00: 70 69 63 61 6c 6c 79 20 22 52 65 6c 65 61 73 65  pically "Release
1b10: 22 2c 20 61 73 20 73 65 74 20 62 79 20 74 68 65  ", as set by the
1b20: 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20 23   test..        #
1b30: 20 20 20 20 20 20 20 73 75 69 74 65 20 69 74 73         suite its
1b40: 65 6c 66 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  elf...        #.
1b50: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1b60: 24 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72  $::test_configur
1b70: 61 74 69 6f 6e 0d 0a 20 20 20 20 20 20 7d 20 65  ation..      } e
1b80: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
1b90: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1ba0: 3a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 77 65 20 77  : Normally, we w
1bb0: 69 6c 6c 20 6e 65 76 65 72 20 68 69 74 20 74 68  ill never hit th
1bc0: 69 73 20 63 61 73 65 20 62 65 63 61 75 73 65 20  is case because 
1bd0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
1be0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1bf0: 20 20 74 65 73 74 20 63 6f 6e 66 69 67 75 72 61    test configura
1c00: 74 69 6f 6e 20 76 61 72 69 61 62 6c 65 20 69 73  tion variable is
1c10: 20 61 6c 77 61 79 73 20 73 65 74 20 62 79 20 74   always set by t
1c20: 68 65 20 74 65 73 74 20 73 75 69 74 65 0d 0a 20  he test suite.. 
1c30: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69         #       i
1c40: 74 73 65 6c 66 3b 20 68 6f 77 65 76 65 72 2c 20  tself; however, 
1c50: 69 74 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69  it can be overri
1c60: 64 64 65 6e 20 75 73 69 6e 67 20 74 68 65 20 75  dden using the u
1c70: 6e 73 65 74 20 63 6f 6d 6d 61 6e 64 0d 0a 20 20  nset command..  
1c80: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66 72        #       fr
1c90: 6f 6d 20 74 68 65 20 2d 70 72 65 54 65 73 74 20  om the -preTest 
1ca0: 6f 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 74 65  option to the te
1cb0: 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20  st suite...     
1cc0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
1cd0: 74 75 72 6e 20 24 3a 3a 65 61 67 6c 65 5f 70 6c  turn $::eagle_pl
1ce0: 61 74 66 6f 72 6d 28 63 6f 6e 66 69 67 75 72 61  atform(configura
1cf0: 74 69 6f 6e 29 0d 0a 20 20 20 20 20 20 7d 0d 0a  tion)..      }..
1d00: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
1d10: 6f 63 20 67 65 74 42 75 69 6c 64 43 6f 6e 66 69  oc getBuildConfi
1d20: 67 75 72 61 74 69 6f 6e 73 20 7b 7d 20 7b 0d 0a  gurations {} {..
1d30: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
1d40: 20 4e 4f 54 45 3a 20 53 65 65 20 69 66 20 74 68   NOTE: See if th
1d50: 65 20 6c 69 73 74 20 6f 66 20 74 65 73 74 20 63  e list of test c
1d60: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 68 61  onfigurations ha
1d70: 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65  s been overridde
1d80: 6e 20 62 79 0d 0a 20 20 20 20 20 20 23 20 20 20  n by..      #   
1d90: 20 20 20 20 74 68 65 20 75 73 65 72 20 28 65 2e      the user (e.
1da0: 67 2e 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e  g. on the comman
1db0: 64 20 6c 69 6e 65 29 2e 0d 0a 20 20 20 20 20 20  d line)...      
1dc0: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
1dd0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74  fo exists ::test
1de0: 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 5d  _configurations]
1df0: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
1e00: 20 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73   [llength $::tes
1e10: 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  t_configurations
1e20: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
1e30: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1e40: 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68    # NOTE: Use th
1e50: 65 20 73 70 65 63 69 66 69 65 64 20 6c 69 73 74  e specified list
1e60: 20 6f 66 20 74 65 73 74 20 63 6f 6e 66 69 67 75   of test configu
1e70: 72 61 74 69 6f 6e 73 2e 0d 0a 20 20 20 20 20 20  rations...      
1e80: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
1e90: 75 72 6e 20 24 3a 3a 74 65 73 74 5f 63 6f 6e 66  urn $::test_conf
1ea0: 69 67 75 72 61 74 69 6f 6e 73 0d 0a 20 20 20 20  igurations..    
1eb0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1ec0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1ed0: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 64   NOTE: Use the d
1ee0: 65 66 61 75 6c 74 20 6c 69 73 74 20 6f 66 20 74  efault list of t
1ef0: 65 73 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  est configuratio
1f00: 6e 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ns...        #..
1f10: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
1f20: 6c 69 73 74 20 44 65 62 75 67 20 52 65 6c 65 61  list Debug Relea
1f30: 73 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  se]..      }..  
1f40: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
1f50: 20 67 65 74 42 75 69 6c 64 42 61 73 65 44 69 72   getBuildBaseDir
1f60: 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20  ectory {} {..   
1f70: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
1f80: 54 45 3a 20 46 69 67 75 72 65 20 6f 75 74 20 74  TE: Figure out t
1f90: 68 65 20 62 61 73 65 20 64 69 72 65 63 74 6f 72  he base director
1fa0: 79 20 77 68 65 72 65 20 61 6c 6c 20 74 68 65 20  y where all the 
1fb0: 62 75 69 6c 64 73 20 73 68 6f 75 6c 64 20 62 65  builds should be
1fc0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1fd0: 6c 6f 63 61 74 65 64 2e 20 20 54 68 69 73 20 77  located.  This w
1fe0: 69 6c 6c 20 62 65 20 74 68 65 20 64 69 72 65 63  ill be the direc
1ff0: 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69  tory that contai
2000: 6e 73 20 74 68 65 20 61 63 74 75 61 6c 0d 0a 20  ns the actual.. 
2010: 20 20 20 20 20 23 20 20 20 20 20 20 20 62 75 69       #       bui
2020: 6c 64 20 6f 75 74 70 75 74 20 64 69 72 65 63 74  ld output direct
2030: 6f 72 79 20 28 65 2e 67 2e 20 70 61 72 65 6e 74  ory (e.g. parent
2040: 20 6f 66 20 22 62 69 6e 22 29 2e 0d 0a 20 20 20   of "bin")...   
2050: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
2060: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 62  [info exists ::b
2070: 75 69 6c 64 5f 62 61 73 65 5f 64 69 72 65 63 74  uild_base_direct
2080: 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ory] && \..     
2090: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
20a0: 67 74 68 20 24 3a 3a 62 75 69 6c 64 5f 62 61 73  gth $::build_bas
20b0: 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30  e_directory] > 0
20c0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
20d0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
20e0: 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f  OTE: The locatio
20f0: 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 64 20 62  n of the build b
2100: 61 73 65 20 64 69 72 65 63 74 6f 72 79 20 68 61  ase directory ha
2110: 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65  s been overridde
2120: 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  n;..        #   
2130: 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75      therefore, u
2140: 73 65 20 69 74 20 76 65 72 62 61 74 69 6d 2e 0d  se it verbatim..
2150: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
2160: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 62 75      return $::bu
2170: 69 6c 64 5f 62 61 73 65 5f 64 69 72 65 63 74 6f  ild_base_directo
2180: 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ry..      } else
2190: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
21a0: 20 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74   ::common_direct
21b0: 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ory] && \..     
21c0: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
21d0: 67 74 68 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69  gth $::common_di
21e0: 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68  rectory] > 0} th
21f0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
2200: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
2210: 20 4e 65 78 74 2c 20 66 61 6c 6c 62 61 63 6b 20   Next, fallback 
2220: 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 64 69  to the parent di
2230: 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20 6f  rectory of the o
2240: 6e 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0d 0a 20  ne containing.. 
2250: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
2260: 68 69 73 20 66 69 6c 65 20 28 69 2e 65 2e 20 22  his file (i.e. "
2270: 63 6f 6d 6d 6f 6e 2e 65 61 67 6c 65 22 29 2c 20  common.eagle"), 
2280: 69 66 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20  if available... 
2290: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
22a0: 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 64    return [file d
22b0: 69 72 6e 61 6d 65 20 24 3a 3a 63 6f 6d 6d 6f 6e  irname $::common
22c0: 5f 64 69 72 65 63 74 6f 72 79 5d 0d 0a 20 20 20  _directory]..   
22d0: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e     } elseif {[in
22e0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 70 61 74 68  fo exists ::path
22f0: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
2300: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
2310: 20 24 3a 3a 70 61 74 68 5d 20 3e 20 30 7d 20 74   $::path] > 0} t
2320: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
2330: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
2340: 3a 20 46 69 6e 61 6c 6c 79 2c 20 66 61 6c 6c 62  : Finally, fallb
2350: 61 63 6b 20 74 6f 20 74 68 65 20 70 61 72 65 6e  ack to the paren
2360: 74 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74  t directory of t
2370: 68 65 20 45 61 67 6c 65 54 65 73 74 0d 0a 20 20  he EagleTest..  
2380: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 61        #       pa
2390: 74 68 2e 20 20 54 68 65 20 45 61 67 6c 65 54 65  th.  The EagleTe
23a0: 73 74 20 70 61 63 6b 61 67 65 20 67 75 61 72 61  st package guara
23b0: 6e 74 65 65 73 20 74 68 61 74 20 74 68 69 73 20  ntees that this 
23c0: 76 61 72 69 61 62 6c 65 0d 0a 20 20 20 20 20 20  variable..      
23d0: 20 20 23 20 20 20 20 20 20 20 77 69 6c 6c 20 62    #       will b
23e0: 65 20 73 65 74 20 74 6f 20 74 68 65 20 64 69 72  e set to the dir
23f0: 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e  ectory containin
2400: 67 20 74 68 65 20 66 69 72 73 74 20 66 69 6c 65  g the first file
2410: 20 74 6f 0d 0a 20 20 20 20 20 20 20 20 23 20 20   to..        #  
2420: 20 20 20 20 20 65 78 65 63 75 74 65 20 74 68 65       execute the
2430: 20 5b 72 75 6e 54 65 73 74 50 72 6f 6c 6f 67 75   [runTestPrologu
2440: 65 5d 20 73 63 72 69 70 74 20 6c 69 62 72 61 72  e] script librar
2450: 79 20 70 72 6f 63 65 64 75 72 65 2e 0d 0a 20 20  y procedure...  
2460: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2470: 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 64 69   return [file di
2480: 72 6e 61 6d 65 20 24 3a 3a 70 61 74 68 5d 0d 0a  rname $::path]..
2490: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
24a0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
24b0: 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 20 70 61     # NOTE: No pa
24c0: 74 68 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  th is available,
24d0: 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79   return an empty
24e0: 20 73 74 72 69 6e 67 2e 20 20 54 68 69 73 20 70   string.  This p
24f0: 6f 69 6e 74 0d 0a 20 20 20 20 20 20 20 20 23 20  oint..        # 
2500: 20 20 20 20 20 20 73 68 6f 75 6c 64 20 6e 6f 74        should not
2510: 20 62 65 20 72 65 61 63 68 65 64 2e 0d 0a 20 20   be reached...  
2520: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2530: 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20   return ""..    
2540: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
2550: 20 20 20 70 72 6f 63 20 69 73 4d 69 78 65 64 4d     proc isMixedM
2560: 6f 64 65 41 73 73 65 6d 62 6c 79 20 7b 20 66 69  odeAssembly { fi
2570: 6c 65 4e 61 6d 65 20 7b 76 61 72 4e 61 6d 65 20  leName {varName 
2580: 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ""} } {..      #
2590: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
25a0: 46 69 72 73 74 2c 20 6d 61 6b 65 20 73 75 72 65  First, make sure
25b0: 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20   the test suite 
25c0: 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 69  infrastructure i
25d0: 73 20 61 6c 6c 6f 77 65 64 20 74 6f 0d 0a 20 20  s allowed to..  
25e0: 20 20 20 20 23 20 20 20 20 20 20 20 75 73 65 20      #       use 
25f0: 74 68 65 20 5b 65 78 65 63 5d 20 63 6f 6d 6d 61  the [exec] comma
2600: 6e 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  nd...      #..  
2610: 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
2620: 78 69 73 74 73 20 3a 3a 6e 6f 28 65 78 65 63 29  xists ::no(exec)
2630: 5d 20 26 26 20 21 5b 69 6e 66 6f 20 65 78 69 73  ] && ![info exis
2640: 74 73 20 3a 3a 6e 6f 28 63 6f 72 46 6c 61 67 73  ts ::no(corFlags
2650: 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
2660: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
2670: 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 6c 6f   NOTE: If the lo
2680: 63 61 74 69 6f 6e 20 6f 66 20 43 6f 72 46 6c 61  cation of CorFla
2690: 67 73 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e  gs is present in
26a0: 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74   the environment
26b0: 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ,..        #    
26c0: 20 20 20 75 73 65 20 69 74 3b 20 6f 74 68 65 72     use it; other
26d0: 77 69 73 65 20 61 73 73 75 6d 65 20 69 74 20 69  wise assume it i
26e0: 73 20 69 6e 20 74 68 65 20 50 41 54 48 2e 0d 0a  s in the PATH...
26f0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2700: 20 20 20 73 65 74 20 63 6f 72 46 6c 61 67 73 20     set corFlags 
2710: 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20 20 20 20  [expr {..       
2720: 20 20 20 5b 69 6e 66 6f 20 65 78 69 73 74 73 20     [info exists 
2730: 3a 3a 65 6e 76 28 43 6f 72 46 6c 61 67 73 29 5d  ::env(CorFlags)]
2740: 20 3f 20 24 3a 3a 65 6e 76 28 43 6f 72 46 6c 61   ? $::env(CorFla
2750: 67 73 29 20 3a 20 22 43 6f 72 46 6c 61 67 73 22  gs) : "CorFlags"
2760: 0d 0a 20 20 20 20 20 20 20 20 7d 5d 0d 0a 0d 0a  ..        }]....
2770: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2780: 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
2790: 70 74 20 74 6f 20 65 78 65 63 75 74 65 20 43 6f  pt to execute Co
27a0: 72 46 6c 61 67 73 20 6f 6e 20 74 68 65 20 73 70  rFlags on the sp
27b0: 65 63 69 66 69 65 64 20 66 69 6c 65 2e 0d 0a 20  ecified file... 
27c0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
27d0: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
27e0: 20 20 20 20 20 20 20 20 20 20 65 78 65 63 20 2d            exec -
27f0: 2d 20 24 63 6f 72 46 6c 61 67 73 20 5b 66 69 6c  - $corFlags [fil
2800: 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 24 66 69  e nativename $fi
2810: 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20  leName]..       
2820: 20 7d 20 65 78 65 63 5d 20 3d 3d 20 30 7d 20 74   } exec] == 0} t
2830: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2840: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
2850: 4e 4f 54 45 3a 20 49 66 20 72 65 71 75 65 73 74  NOTE: If request
2860: 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72  ed by our caller
2870: 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 64 65 74  , attempt to det
2880: 65 72 6d 69 6e 65 20 74 68 65 0d 0a 20 20 20 20  ermine the..    
2890: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 6c        #       pl
28a0: 61 74 66 6f 72 6d 20 66 6f 72 20 74 68 65 20 73  atform for the s
28b0: 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 61 73  pecified file as
28c0: 20 77 65 6c 6c 2e 0d 0a 20 20 20 20 20 20 20 20   well...        
28d0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69    #..          i
28e0: 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
28f0: 68 20 24 76 61 72 4e 61 6d 65 5d 20 3e 20 30 7d  h $varName] > 0}
2900: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2910: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2920: 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 74 6f 72      # NOTE: Stor
2930: 65 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 20 69  e the platform i
2940: 6e 20 74 68 65 20 6e 61 6d 65 64 20 76 61 72 69  n the named vari
2950: 61 62 6c 65 20 69 6e 20 74 68 65 0d 0a 20 20 20  able in the..   
2960: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
2970: 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 20   context of our 
2980: 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 20  caller...       
2990: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
29a0: 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72      upvar 1 $var
29b0: 4e 61 6d 65 20 70 6c 61 74 66 6f 72 6d 0d 0a 0d  Name platform...
29c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
29e0: 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 65  TE: Attempt to e
29f0: 78 74 72 61 63 74 20 74 68 65 20 50 45 20 6c 69  xtract the PE li
2a00: 6e 65 20 66 72 6f 6d 20 74 68 65 20 63 61 70 74  ne from the capt
2a10: 75 72 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20  ured..          
2a20: 20 20 23 20 20 20 20 20 20 20 6f 75 74 70 75 74    #       output
2a30: 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65  .  If this value
2a40: 20 69 73 20 22 50 45 33 32 22 20 6f 72 20 22 50   is "PE32" or "P
2a50: 45 33 32 2b 22 2c 20 74 68 65 0d 0a 20 20 20 20  E32+", the..    
2a60: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2a70: 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 20 69 73  assembly file is
2a80: 20 33 32 2d 62 69 74 20 6f 72 20 36 34 2d 62 69   32-bit or 64-bi
2a90: 74 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 3b  t, respectively;
2aa0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
2ab0: 20 20 20 20 20 20 6f 74 68 65 72 77 69 73 65 2c        otherwise,
2ac0: 20 69 74 73 20 74 79 70 65 20 69 73 20 75 6e 6b   its type is unk
2ad0: 6e 6f 77 6e 2e 0d 0a 20 20 20 20 20 20 20 20 20  nown...         
2ae0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
2af0: 20 20 73 65 74 20 70 61 74 74 65 72 6e 20 7b 5e    set pattern {^
2b00: 50 45 20 20 20 20 20 20 20 20 3a 20 28 50 45 33  PE        : (PE3
2b10: 32 7c 50 45 33 32 5c 2b 29 5c 73 2b 24 7d 0d 0a  2|PE32\+)\s+$}..
2b20: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
2b30: 20 7b 5b 72 65 67 65 78 70 20 2d 6c 69 6e 65 20   {[regexp -line 
2b40: 2d 2d 20 24 70 61 74 74 65 72 6e 20 24 65 78 65  -- $pattern $exe
2b50: 63 20 64 75 6d 6d 79 20 70 65 33 32 5d 7d 20 74  c dummy pe32]} t
2b60: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2b70: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2b80: 20 20 20 20 20 20 23 20 48 41 43 4b 3a 20 54 68        # HACK: Th
2b90: 69 73 20 5b 73 77 69 74 63 68 5d 20 61 73 73 75  is [switch] assu
2ba0: 6d 65 73 20 74 68 61 74 20 33 32 2d 62 69 74 20  mes that 32-bit 
2bb0: 65 78 65 63 75 74 61 62 6c 65 73 20 61 72 65 0d  executables are.
2bc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
2bd0: 20 20 20 20 20 20 20 61 6c 77 61 79 73 20 78 38         always x8
2be0: 36 20 61 6e 64 20 74 68 61 74 20 36 34 2d 62 69  6 and that 64-bi
2bf0: 74 20 65 78 65 63 75 74 61 62 6c 65 73 20 61 72  t executables ar
2c00: 65 20 61 6c 77 61 79 73 0d 0a 20 20 20 20 20 20  e always..      
2c10: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2c20: 78 36 34 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  x64...          
2c30: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
2c40: 20 20 20 20 20 73 77 69 74 63 68 20 2d 65 78 61       switch -exa
2c50: 63 74 20 2d 2d 20 24 70 65 33 32 20 7b 0d 0a 20  ct -- $pe32 {.. 
2c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
2c70: 45 33 32 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  E32 {..         
2c80: 20 20 20 20 20 20 20 20 20 73 65 74 20 70 6c 61           set pla
2c90: 74 66 6f 72 6d 20 57 69 6e 33 32 0d 0a 20 20 20  tform Win32..   
2ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
2cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc0: 50 45 33 32 2b 20 7b 0d 0a 20 20 20 20 20 20 20  PE32+ {..       
2cd0: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 70             set p
2ce0: 6c 61 74 66 6f 72 6d 20 78 36 34 0d 0a 20 20 20  latform x64..   
2cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
2d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d10: 64 65 66 61 75 6c 74 20 7b 0d 0a 20 20 20 20 20  default {..     
2d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
2d30: 20 70 6c 61 74 66 6f 72 6d 20 22 22 0d 0a 20 20   platform ""..  
2d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
2d50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
2d60: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ..            } 
2d70: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
2d80: 20 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f        set platfo
2d90: 72 6d 20 22 22 0d 0a 20 20 20 20 20 20 20 20 20  rm ""..         
2da0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
2db0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23  }....          #
2dc0: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
2dd0: 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 65  TE: Attempt to e
2de0: 78 74 72 61 63 74 20 74 68 65 20 49 4c 4f 4e 4c  xtract the ILONL
2df0: 59 20 6c 69 6e 65 20 66 72 6f 6d 20 74 68 65 20  Y line from the 
2e00: 63 61 70 74 75 72 65 64 0d 0a 20 20 20 20 20 20  captured..      
2e10: 20 20 20 20 23 20 20 20 20 20 20 20 6f 75 74 70      #       outp
2e20: 75 74 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c  ut.  If this val
2e30: 75 65 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 20  ue is zero, the 
2e40: 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 6d  specified file m
2e50: 75 73 74 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ust..          #
2e60: 20 20 20 20 20 20 20 62 65 20 61 20 6d 69 78 65         be a mixe
2e70: 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 3b  d-mode assembly;
2e80: 20 6f 74 68 65 72 77 69 73 65 2c 20 69 74 20 63   otherwise, it c
2e90: 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 0d 0a 20 20  ontains only..  
2ea0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2eb0: 6d 61 6e 61 67 65 64 20 63 6f 6d 70 6f 6e 65 6e  managed componen
2ec0: 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ts...          #
2ed0: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
2ee0: 70 61 74 74 65 72 6e 20 7b 5e 49 4c 4f 4e 4c 59  pattern {^ILONLY
2ef0: 20 20 20 20 3a 20 28 30 7c 31 29 5c 73 2b 24 7d      : (0|1)\s+$}
2f00: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
2f10: 20 7b 21 5b 72 65 67 65 78 70 20 2d 6c 69 6e 65   {![regexp -line
2f20: 20 2d 2d 20 24 70 61 74 74 65 72 6e 20 24 65 78   -- $pattern $ex
2f30: 65 63 20 64 75 6d 6d 79 20 69 6c 4f 6e 6c 79 5d  ec dummy ilOnly]
2f40: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2f50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
2f60: 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  se..          }.
2f70: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
2f80: 7b 21 24 69 6c 4f 6e 6c 79 7d 20 74 68 65 6e 20  {!$ilOnly} then 
2f90: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  {..            r
2fa0: 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20  eturn true..    
2fb0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
2fc0: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
2fd0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
2fe0: 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 74 65 73  NOTE: If the tes
2ff0: 74 20 73 75 69 74 65 20 63 61 6e 6e 6f 74 20 75  t suite cannot u
3000: 73 65 20 5b 65 78 65 63 5d 20 6f 72 20 65 78 65  se [exec] or exe
3010: 63 75 74 69 6f 6e 20 6f 66 20 43 6f 72 46 6c 61  cution of CorFla
3020: 67 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  gs..      #     
3030: 20 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e    failed, return
3040: 20 66 61 6c 73 65 2e 0d 0a 20 20 20 20 20 20 23   false...      #
3050: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 66  ..      return f
3060: 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  alse..    }.....
3070: 20 20 20 20 70 72 6f 63 20 69 73 42 75 69 6c 64      proc isBuild
3080: 41 76 61 69 6c 61 62 6c 65 20 7b 20 6e 61 74 69  Available { nati
3090: 76 65 20 64 69 72 65 63 74 6f 72 79 20 7b 76 61  ve directory {va
30a0: 72 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20  rName ""} } {.. 
30b0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
30c0: 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20  NOTE: Build the 
30d0: 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20  fully qualified 
30e0: 66 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 74 68  file name for th
30f0: 65 20 70 72 69 6d 61 72 79 20 61 73 73 65 6d 62  e primary assemb
3100: 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ly..      #     
3110: 20 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65    containing the
3120: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
3130: 69 74 65 20 6d 61 6e 61 67 65 64 20 63 6f 6d 70  ite managed comp
3140: 6f 6e 65 6e 74 73 2e 20 20 49 74 0d 0a 20 20 20  onents.  It..   
3150: 20 20 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c     #       shoul
3160: 64 20 62 65 20 6e 6f 74 65 64 20 74 68 61 74 20  d be noted that 
3170: 74 68 69 73 20 61 73 73 65 6d 62 6c 79 20 66 69  this assembly fi
3180: 6c 65 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74  le may also cont
3190: 61 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23  ain the..      #
31a0: 20 20 20 20 20 20 20 6e 61 74 69 76 65 20 63 6f         native co
31b0: 6d 70 6f 6e 65 6e 74 73 2c 20 69 66 20 61 20 6e  mponents, if a n
31c0: 61 74 69 76 65 20 62 75 69 6c 64 20 69 73 20 69  ative build is i
31d0: 6e 20 75 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d  n use...      #.
31e0: 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e  .      set fileN
31f0: 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ame [file native
3200: 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
3210: 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20  $directory \..  
3220: 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
3230: 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d 5d  ata.SQLite.dll]]
3240: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b  ....      if {![
3250: 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c  file exists $fil
3260: 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
3270: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
3280: 61 6c 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  alse..      }...
3290: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
32a0: 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
32b0: 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  to automatically
32c0: 20 64 65 74 65 63 74 20 69 66 20 74 68 65 20 70   detect if the p
32d0: 72 69 6d 61 72 79 20 61 73 73 65 6d 62 6c 79 0d  rimary assembly.
32e0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
32f0: 6f 6e 74 61 69 6e 73 20 61 6e 79 20 6e 61 74 69  ontains any nati
3300: 76 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 2c 20 69  ve components, i
3310: 66 20 6e 65 63 65 73 73 61 72 79 2e 0d 0a 20 20  f necessary...  
3320: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
3330: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
3340: 24 6e 61 74 69 76 65 5d 20 3d 3d 20 30 7d 20 74  $native] == 0} t
3350: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
3360: 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
3370: 68 20 24 76 61 72 4e 61 6d 65 5d 20 3e 20 30 7d  h $varName] > 0}
3380: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
3390: 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e     upvar 1 $varN
33a0: 61 6d 65 20 24 76 61 72 4e 61 6d 65 0d 0a 20 20  ame $varName..  
33b0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
33c0: 20 20 20 73 65 74 20 6e 61 74 69 76 65 20 5b 69     set native [i
33d0: 73 4d 69 78 65 64 4d 6f 64 65 41 73 73 65 6d 62  sMixedModeAssemb
33e0: 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 24 76 61  ly $fileName $va
33f0: 72 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 0d  rName]..      }.
3400: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
3410: 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65    # NOTE: If the
3420: 20 70 72 69 6d 61 72 79 20 61 73 73 65 6d 62 6c   primary assembl
3430: 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20  y also contains 
3440: 74 68 65 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f  the native compo
3450: 6e 65 6e 74 73 2c 0d 0a 20 20 20 20 20 20 23 20  nents,..      # 
3460: 20 20 20 20 20 20 77 65 20 68 61 76 65 20 65 76        we have ev
3470: 65 72 79 74 68 69 6e 67 20 77 65 20 6e 65 65 64  erything we need
3480: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
3490: 20 20 69 66 20 7b 24 6e 61 74 69 76 65 7d 20 74    if {$native} t
34a0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
34b0: 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20  eturn true..    
34c0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
34d0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75        # NOTE: Bu
34e0: 69 6c 64 20 74 68 65 20 66 75 6c 6c 79 20 71 75  ild the fully qu
34f0: 61 6c 69 66 69 65 64 20 66 69 6c 65 20 6e 61 6d  alified file nam
3500: 65 20 66 6f 72 20 74 68 65 20 69 6e 74 65 72 6f  e for the intero
3510: 70 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20 20  p assembly..    
3520: 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74 61 69    #       contai
3530: 6e 69 6e 67 20 74 68 65 20 53 79 73 74 65 6d 2e  ning the System.
3540: 44 61 74 61 2e 53 51 4c 69 74 65 20 6e 61 74 69  Data.SQLite nati
3550: 76 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e 20 20  ve components.  
3560: 49 66 20 74 68 69 73 0d 0a 20 20 20 20 20 20 23  If this..      #
3570: 20 20 20 20 20 20 20 66 69 6c 65 20 65 78 69 73         file exis
3580: 74 73 2c 20 77 65 20 73 68 6f 75 6c 64 20 68 61  ts, we should ha
3590: 76 65 20 65 76 65 72 79 74 68 69 6e 67 20 77 65  ve everything we
35a0: 20 6e 65 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d   need...      #.
35b0: 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e  .      set fileN
35c0: 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ame [file native
35d0: 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
35e0: 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20  $directory \..  
35f0: 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 2e 49          SQLite.I
3600: 6e 74 65 72 6f 70 2e 64 6c 6c 5d 5d 0d 0a 0d 0a  nterop.dll]]....
3610: 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20        if {[file 
3620: 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65  exists $fileName
3630: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
3640: 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a     return true..
3650: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
3660: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
3670: 3a 20 42 75 69 6c 64 20 74 68 65 20 66 75 6c 6c  : Build the full
3680: 79 20 71 75 61 6c 69 66 69 65 64 20 66 69 6c 65  y qualified file
3690: 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 53 51   name for the SQ
36a0: 4c 69 74 65 20 63 6f 72 65 0d 0a 20 20 20 20 20  Lite core..     
36b0: 20 23 20 20 20 20 20 20 20 6c 69 62 72 61 72 79   #       library
36c0: 2e 20 20 49 66 20 74 68 69 73 20 66 69 6c 65 20  .  If this file 
36d0: 65 78 69 73 74 73 2c 20 77 65 20 73 68 6f 75 6c  exists, we shoul
36e0: 64 20 68 61 76 65 20 65 76 65 72 79 74 68 69 6e  d have everythin
36f0: 67 20 77 65 0d 0a 20 20 20 20 20 20 23 20 20 20  g we..      #   
3700: 20 20 20 20 6e 65 65 64 2e 0d 0a 20 20 20 20 20      need...     
3710: 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69   #..      set fi
3720: 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74  leName [file nat
3730: 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
3740: 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d  in $directory \.
3750: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
3760: 65 33 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20 20  e3.dll]]....    
3770: 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73    if {[file exis
3780: 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74  ts $fileName]} t
3790: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
37a0: 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20  eturn true..    
37b0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
37c0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4f 6e        # NOTE: On
37d0: 65 20 6f 72 20 6d 6f 72 65 20 6e 61 74 69 76 65  e or more native
37e0: 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 6e 65 65 64   components need
37f0: 65 64 20 62 79 20 53 79 73 74 65 6d 2e 44 61 74  ed by System.Dat
3800: 61 2e 53 51 4c 69 74 65 0d 0a 20 20 20 20 20 20  a.SQLite..      
3810: 23 20 20 20 20 20 20 20 61 72 65 20 6d 69 73 73  #       are miss
3820: 69 6e 67 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ing...      #.. 
3830: 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73       return fals
3840: 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  e..    }.....   
3850: 20 70 72 6f 63 20 69 73 52 65 6c 65 61 73 65 41   proc isReleaseA
3860: 76 61 69 6c 61 62 6c 65 20 7b 20 64 69 72 65 63  vailable { direc
3870: 74 6f 72 79 20 7b 76 61 72 4e 61 6d 65 20 22 22  tory {varName ""
3880: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20  } } {..      if 
3890: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
38a0: 24 76 61 72 4e 61 6d 65 5d 20 3e 20 30 7d 20 74  $varName] > 0} t
38b0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 75  hen {..        u
38c0: 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20  pvar 1 $varName 
38d0: 24 76 61 72 4e 61 6d 65 0d 0a 20 20 20 20 20 20  $varName..      
38e0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
38f0: 6e 20 5b 69 73 42 75 69 6c 64 41 76 61 69 6c 61  n [isBuildAvaila
3900: 62 6c 65 20 22 22 20 24 64 69 72 65 63 74 6f 72  ble "" $director
3910: 79 20 24 76 61 72 4e 61 6d 65 5d 0d 0a 20 20 20  y $varName]..   
3920: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
3930: 6a 6f 69 6e 42 75 69 6c 64 44 69 72 65 63 74 6f  joinBuildDirecto
3940: 72 79 20 7b 20 6e 61 74 69 76 65 20 70 61 74 68  ry { native path
3950: 20 79 65 61 72 20 70 6c 61 74 66 6f 72 6d 20 63   year platform c
3960: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 7d 20 7b  onfiguration } {
3970: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
3980: 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20   # NOTE: Figure 
3990: 6f 75 74 20 61 6e 64 20 74 68 65 6e 20 72 65 74  out and then ret
39a0: 75 72 6e 20 74 68 65 20 66 75 6c 6c 79 20 71 75  urn the fully qu
39b0: 61 6c 69 66 69 65 64 20 70 61 74 68 20 74 6f 20  alified path to 
39c0: 74 68 65 20 62 75 69 6c 64 0d 0a 20 20 20 20 20  the build..     
39d0: 20 23 20 20 20 20 20 20 20 64 69 72 65 63 74 6f   #       directo
39e0: 72 79 20 62 61 73 65 64 20 6f 6e 20 61 6c 6c 20  ry based on all 
39f0: 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 70 72  the arguments pr
3a00: 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20 63 61  ovided by our ca
3a10: 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ller...      #..
3a20: 20 20 20 20 20 20 69 66 20 7b 24 6e 61 74 69 76        if {$nativ
3a30: 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
3a40: 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20     return [file 
3a50: 6a 6f 69 6e 20 24 70 61 74 68 20 62 69 6e 20 24  join $path bin $
3a60: 79 65 61 72 20 24 70 6c 61 74 66 6f 72 6d 20 24  year $platform $
3a70: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a  configuration]..
3a80: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
3a90: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
3aa0: 66 69 6c 65 20 6a 6f 69 6e 20 24 70 61 74 68 20  file join $path 
3ab0: 62 69 6e 20 24 79 65 61 72 20 24 63 6f 6e 66 69  bin $year $confi
3ac0: 67 75 72 61 74 69 6f 6e 20 62 69 6e 5d 0d 0a 20  guration bin].. 
3ad0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
3ae0: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 75  ..    proc getBu
3af0: 69 6c 64 44 69 72 65 63 74 6f 72 79 20 7b 7d 20  ildDirectory {} 
3b00: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
3b10: 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66    # NOTE: See if
3b20: 20 74 68 65 20 22 6e 61 74 69 76 65 22 20 72 75   the "native" ru
3b30: 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 20 68 61 73  ntime option has
3b40: 20 62 65 65 6e 20 73 65 74 2e 20 20 49 66 20 73   been set.  If s
3b50: 6f 2c 20 75 73 65 20 74 68 65 0d 0a 20 20 20 20  o, use the..    
3b60: 20 20 23 20 20 20 20 20 20 20 64 69 72 65 63 74    #       direct
3b70: 6f 72 79 20 66 6f 72 20 74 68 65 20 6d 69 78 65  ory for the mixe
3b80: 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20  d-mode assembly 
3b90: 28 61 2e 6b 2e 61 2e 20 74 68 65 20 6e 61 74 69  (a.k.a. the nati
3ba0: 76 65 20 69 6e 74 65 72 6f 70 0d 0a 20 20 20 20  ve interop..    
3bb0: 20 20 23 20 20 20 20 20 20 20 61 73 73 65 6d 62    #       assemb
3bc0: 6c 79 29 2e 20 20 54 6f 20 65 6e 61 62 6c 65 20  ly).  To enable 
3bd0: 74 68 69 73 20 6f 70 74 69 6f 6e 20 76 69 61 20  this option via 
3be0: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
3bf0: 2c 20 65 6e 74 65 72 20 61 0d 0a 20 20 20 20 20  , enter a..     
3c00: 20 23 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64   #       command
3c10: 20 73 69 6d 69 6c 61 72 20 74 6f 20 6f 6e 65 20   similar to one 
3c20: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
3c30: 20 28 61 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e   (all on one lin
3c40: 65 29 3a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  e):..      #..  
3c50: 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c      #       Eagl
3c60: 65 53 68 65 6c 6c 2e 65 78 65 20 2d 69 6e 69 74  eShell.exe -init
3c70: 69 61 6c 69 7a 65 20 2d 72 75 6e 74 69 6d 65 4f  ialize -runtimeO
3c80: 70 74 69 6f 6e 20 6e 61 74 69 76 65 0d 0a 20 20  ption native..  
3c90: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 2d 66      #         -f
3ca0: 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c  ile .\path\to\al
3cb0: 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23  l.eagle..      #
3cc0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
3cd0: 54 6f 20 65 6e 61 62 6c 65 20 74 68 69 73 20 6f  To enable this o
3ce0: 70 74 69 6f 6e 20 76 69 61 20 74 68 65 20 63 6f  ption via the co
3cf0: 6d 6d 61 6e 64 20 6c 69 6e 65 20 70 72 69 6f 72  mmand line prior
3d00: 20 74 6f 20 74 68 65 20 22 62 65 74 61 20 31 36   to the "beta 16
3d10: 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  "..      #      
3d20: 20 72 65 6c 65 61 73 65 20 6f 66 20 45 61 67 6c   release of Eagl
3d30: 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e, the following
3d40: 20 63 6f 6d 6d 61 6e 64 20 6d 75 73 74 20 62 65   command must be
3d50: 20 75 73 65 64 20 69 6e 73 74 65 61 64 0d 0a 20   used instead.. 
3d60: 20 20 20 20 20 23 20 20 20 20 20 20 20 28 61 6c       #       (al
3d70: 73 6f 20 61 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69  so all on one li
3d80: 6e 65 29 3a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ne):..      #.. 
3d90: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
3da0: 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 69 6e 69  leShell.exe -ini
3db0: 74 69 61 6c 69 7a 65 20 2d 70 6f 73 74 49 6e 69  tialize -postIni
3dc0: 74 69 61 6c 69 7a 65 0d 0a 20 20 20 20 20 20 23  tialize..      #
3dd0: 20 20 20 20 20 20 20 20 20 22 6f 62 6a 65 63 74           "object
3de0: 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72 65   invoke Interpre
3df0: 74 65 72 2e 47 65 74 41 63 74 69 76 65 20 41 64  ter.GetActive Ad
3e00: 64 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e  dRuntimeOption n
3e10: 61 74 69 76 65 22 0d 0a 20 20 20 20 20 20 23 20  ative"..      # 
3e20: 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c          -file .\
3e30: 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c  path\to\all.eagl
3e40: 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  e..      #..    
3e50: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
3e60: 74 73 20 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63  ts ::build_direc
3e70: 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20  tory] && \..    
3e80: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
3e90: 6e 67 74 68 20 24 3a 3a 62 75 69 6c 64 5f 64 69  ngth $::build_di
3ea0: 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68  rectory] > 0} th
3eb0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
3ec0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
3ed0: 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   The location of
3ee0: 20 74 68 65 20 62 75 69 6c 64 20 64 69 72 65 63   the build direc
3ef0: 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76  tory has been ov
3f00: 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20  erridden;..     
3f10: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 72 65     #       there
3f20: 66 6f 72 65 2c 20 75 73 65 20 69 74 20 76 65 72  fore, use it ver
3f30: 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20  batim...        
3f40: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
3f50: 6e 20 24 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63  n $::build_direc
3f60: 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c  tory..      } el
3f70: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
3f80: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
3f90: 20 49 66 20 74 68 65 20 22 6e 61 74 69 76 65 22   If the "native"
3fa0: 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 20   runtime option 
3fb0: 69 73 20 73 65 74 2c 20 74 68 65 20 6d 69 78 65  is set, the mixe
3fc0: 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 0d  d-mode assembly.
3fd0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
3fe0: 20 69 73 20 62 65 69 6e 67 20 74 65 73 74 65 64   is being tested
3ff0: 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  .  In that case,
4000: 20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68 65   the path to the
4010: 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79   build directory
4020: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
4030: 20 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 74    will contain t
4040: 68 65 20 70 6c 61 74 66 6f 72 6d 20 6e 61 6d 65  he platform name
4050: 20 61 6e 64 20 61 6c 6c 20 74 68 65 20 62 69 6e   and all the bin
4060: 61 72 69 65 73 20 75 6e 64 65 72 20 74 65 73 74  aries under test
4070: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
4080: 20 20 73 68 6f 75 6c 64 20 62 65 20 70 72 65 73    should be pres
4090: 65 6e 74 20 69 6e 20 74 68 61 74 20 64 69 72 65  ent in that dire
40a0: 63 74 6f 72 79 2e 20 20 49 66 20 74 68 65 20 22  ctory.  If the "
40b0: 6e 61 74 69 76 65 22 20 72 75 6e 74 69 6d 65 0d  native" runtime.
40c0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
40d0: 20 6f 70 74 69 6f 6e 20 69 73 20 6e 6f 74 20 73   option is not s
40e0: 65 74 2c 20 74 68 65 20 62 75 69 6c 64 20 64 69  et, the build di
40f0: 72 65 63 74 6f 72 79 20 77 69 6c 6c 20 62 65 20  rectory will be 
4100: 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
4110: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
4120: 20 20 22 70 6c 61 74 66 6f 72 6d 2d 6e 65 75 74    "platform-neut
4130: 72 61 6c 22 2c 20 77 69 74 68 20 74 68 65 20 6e  ral", with the n
4140: 6f 74 61 62 6c 65 20 65 78 63 65 70 74 69 6f 6e  otable exception
4150: 20 6f 66 20 61 6e 79 20 6e 61 74 69 76 65 0d 0a   of any native..
4160: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
4170: 61 73 73 65 6d 62 6c 79 20 28 65 2e 67 2e 20 22  assembly (e.g. "
4180: 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64  SQLite.Interop.d
4190: 6c 6c 22 29 20 63 6f 70 69 65 64 20 74 68 65 72  ll") copied ther
41a0: 65 20 64 75 72 69 6e 67 20 74 68 65 0d 0a 20 20  e during the..  
41b0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 75        #       bu
41c0: 69 6c 64 20 70 72 6f 63 65 73 73 20 69 74 73 65  ild process itse
41d0: 6c 66 2e 20 20 49 66 20 74 68 65 20 62 75 69 6c  lf.  If the buil
41e0: 64 20 70 72 6f 63 65 73 73 20 73 6f 6d 65 68 6f  d process someho
41f0: 77 20 64 6f 65 73 20 6e 6f 74 0d 0a 20 20 20 20  w does not..    
4200: 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 70 79      #       copy
4210: 20 74 68 65 20 6e 61 74 69 76 65 20 61 73 73 65   the native asse
4220: 6d 62 6c 79 20 66 6f 72 20 74 68 69 73 20 70 6c  mbly for this pl
4230: 61 74 66 6f 72 6d 2c 20 6d 6f 73 74 20 6f 66 20  atform, most of 
4240: 74 68 65 20 74 65 73 74 73 0d 0a 20 20 20 20 20  the tests..     
4250: 20 20 20 23 20 20 20 20 20 20 20 69 6e 20 74 68     #       in th
4260: 65 20 73 75 69 74 65 20 77 69 6c 6c 20 73 69 6d  e suite will sim
4270: 70 6c 79 20 62 65 20 73 6b 69 70 70 65 64 2e 20  ply be skipped. 
4280: 20 47 65 6e 65 72 61 6c 6c 79 20 73 70 65 61 6b   Generally speak
4290: 69 6e 67 2c 20 74 68 65 72 65 0d 0a 20 20 20 20  ing, there..    
42a0: 20 20 20 20 23 20 20 20 20 20 20 20 61 72 65 20      #       are 
42b0: 74 77 6f 20 77 61 79 73 20 74 6f 20 62 75 69 6c  two ways to buil
42c0: 64 20 74 68 65 20 62 69 6e 61 72 69 65 73 20 77  d the binaries w
42d0: 68 65 6e 20 70 72 65 70 61 72 69 6e 67 20 74 6f  hen preparing to
42e0: 20 72 75 6e 20 74 68 65 0d 0a 20 20 20 20 20 20   run the..      
42f0: 20 20 23 20 20 20 20 20 20 20 74 65 73 74 20 73    #       test s
4300: 75 69 74 65 3a 0d 0a 20 20 20 20 20 20 20 20 23  uite:..        #
4310: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
4320: 20 20 31 2e 20 42 75 69 6c 64 20 74 68 65 20 73    1. Build the s
4330: 65 70 61 72 61 74 65 20 6d 61 6e 61 67 65 64 20  eparate managed 
4340: 61 6e 64 20 6e 61 74 69 76 65 20 61 73 73 65 6d  and native assem
4350: 62 6c 69 65 73 20 75 73 69 6e 67 20 73 6f 6d 65  blies using some
4360: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
4370: 20 20 20 20 20 63 6f 6d 6d 61 6e 64 73 20 73 69       commands si
4380: 6d 69 6c 61 72 20 74 6f 3a 0d 0a 20 20 20 20 20  milar to:..     
4390: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
43a0: 20 20 20 20 20 20 20 20 20 62 75 69 6c 64 2e 62           build.b
43b0: 61 74 20 24 7b 43 6f 6e 66 69 67 75 72 61 74 69  at ${Configurati
43c0: 6f 6e 7d 4d 61 6e 61 67 65 64 4f 6e 6c 79 20 24  on}ManagedOnly $
43d0: 7b 50 6c 61 74 66 6f 72 6d 7d 0d 0a 20 20 20 20  {Platform}..    
43e0: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 62      #          b
43f0: 75 69 6c 64 2e 62 61 74 20 24 7b 43 6f 6e 66 69  uild.bat ${Confi
4400: 67 75 72 61 74 69 6f 6e 7d 4e 61 74 69 76 65 4f  guration}NativeO
4410: 6e 6c 79 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 0d  nly ${Platform}.
4420: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
4430: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 57      #          W
4440: 68 65 72 65 20 24 7b 43 6f 6e 66 69 67 75 72 61  here ${Configura
4450: 74 69 6f 6e 7d 20 69 73 20 65 69 74 68 65 72 20  tion} is either 
4460: 22 44 65 62 75 67 22 20 6f 72 20 22 52 65 6c 65  "Debug" or "Rele
4470: 61 73 65 22 20 61 6e 64 0d 0a 20 20 20 20 20 20  ase" and..      
4480: 20 20 23 20 20 20 20 20 20 20 20 20 20 24 7b 50    #          ${P
4490: 6c 61 74 66 6f 72 6d 7d 20 69 73 20 65 69 74 68  latform} is eith
44a0: 65 72 20 22 57 69 6e 33 32 22 20 6f 72 20 22 78  er "Win32" or "x
44b0: 36 34 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  64"...        #.
44c0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
44d0: 20 32 2e 20 42 75 69 6c 64 20 74 68 65 20 6d 69   2. Build the mi
44e0: 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c  xed-mode assembl
44f0: 79 20 75 73 69 6e 67 20 61 20 63 6f 6d 6d 61 6e  y using a comman
4500: 64 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0d 0a 20  d similar to:.. 
4510: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4520: 20 20 23 20 20 20 20 20 20 20 20 20 20 62 75 69    #          bui
4530: 6c 64 2e 62 61 74 20 24 7b 43 6f 6e 66 69 67 75  ld.bat ${Configu
4540: 72 61 74 69 6f 6e 7d 20 24 7b 50 6c 61 74 66 6f  ration} ${Platfo
4550: 72 6d 7d 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  rm}..        #..
4560: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
4570: 20 20 20 57 68 65 72 65 20 24 7b 43 6f 6e 66 69     Where ${Confi
4580: 67 75 72 61 74 69 6f 6e 7d 20 69 73 20 65 69 74  guration} is eit
4590: 68 65 72 20 22 44 65 62 75 67 22 20 6f 72 20 22  her "Debug" or "
45a0: 52 65 6c 65 61 73 65 22 20 61 6e 64 0d 0a 20 20  Release" and..  
45b0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
45c0: 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 20 69 73 20   ${Platform} is 
45d0: 65 69 74 68 65 72 20 22 57 69 6e 33 32 22 20 6f  either "Win32" o
45e0: 72 20 22 78 36 34 22 2e 20 20 49 66 20 74 68 69  r "x64".  If thi
45f0: 73 20 63 6f 6d 6d 61 6e 64 20 69 73 0d 0a 20 20  s command is..  
4600: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
4610: 20 75 73 65 64 2c 20 76 61 72 69 6f 75 73 20 74   used, various t
4620: 65 73 74 73 20 74 68 61 74 20 72 65 71 75 69 72  ests that requir
4630: 65 20 73 75 70 70 6c 65 6d 65 6e 74 61 72 79 20  e supplementary 
4640: 6d 61 6e 61 67 65 64 0d 0a 20 20 20 20 20 20 20  managed..       
4650: 20 23 20 20 20 20 20 20 20 20 20 20 61 73 73 65   #          asse
4660: 6d 62 6c 69 65 73 20 28 65 2e 67 2e 20 4c 49 4e  mblies (e.g. LIN
4670: 51 29 20 6d 61 79 20 62 65 20 73 6b 69 70 70 65  Q) may be skippe
4680: 64 20 75 6e 6c 65 73 73 20 74 68 6f 73 65 20 62  d unless those b
4690: 69 6e 61 72 69 65 73 0d 0a 20 20 20 20 20 20 20  inaries..       
46a0: 20 23 20 20 20 20 20 20 20 20 20 20 61 72 65 20   #          are 
46b0: 73 75 62 73 65 71 75 65 6e 74 6c 79 20 63 6f 70  subsequently cop
46c0: 69 65 64 20 69 6e 74 6f 20 74 68 65 20 63 6f 72  ied into the cor
46d0: 72 65 63 74 20 64 69 72 65 63 74 6f 72 79 20 28  rect directory (
46e0: 69 2e 65 2e 20 62 79 0d 0a 20 20 20 20 20 20 20  i.e. by..       
46f0: 20 23 20 20 20 20 20 20 20 20 20 20 22 74 65 73   #          "tes
4700: 74 5f 61 6c 6c 2e 62 61 74 22 29 2e 0d 0a 20 20  t_all.bat")...  
4710: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
4720: 20 23 20 20 20 20 20 20 20 4e 6f 74 65 20 74 68   #       Note th
4730: 61 74 20 61 6c 6c 20 6f 66 20 74 68 65 20 62 75  at all of the bu
4740: 69 6c 64 20 63 6f 6d 6d 61 6e 64 73 20 61 62 6f  ild commands abo
4750: 76 65 20 77 69 6c 6c 20 64 65 66 61 75 6c 74 20  ve will default 
4760: 74 6f 20 75 73 69 6e 67 0d 0a 20 20 20 20 20 20  to using..      
4770: 20 20 23 20 20 20 20 20 20 20 74 68 65 20 6c 61    #       the la
4780: 74 65 73 74 20 76 65 72 73 69 6f 6e 20 6f 66 20  test version of 
4790: 4d 53 42 75 69 6c 64 20 61 76 61 69 6c 61 62 6c  MSBuild availabl
47a0: 65 20 61 6e 64 20 74 68 65 20 22 74 65 73 74 5f  e and the "test_
47b0: 79 65 61 72 22 20 6d 61 79 0d 0a 20 20 20 20 20  year" may..     
47c0: 20 20 20 23 20 20 20 20 20 20 20 6e 65 65 64 20     #       need 
47d0: 74 6f 20 62 65 20 61 64 6a 75 73 74 65 64 20 61  to be adjusted a
47e0: 63 63 6f 72 64 69 6e 67 6c 79 20 74 6f 20 61 63  ccordingly to ac
47f0: 74 75 61 6c 6c 79 20 72 75 6e 20 74 68 65 20 74  tually run the t
4800: 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20  est suite...    
4810: 20 20 20 20 23 20 20 20 20 20 20 20 52 65 66 65      #       Refe
4820: 72 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74  r to the comment
4830: 73 20 69 6e 20 5b 67 65 74 42 75 69 6c 64 59 65  s in [getBuildYe
4840: 61 72 5d 20 66 6f 72 20 6d 6f 72 65 20 69 6e 66  ar] for more inf
4850: 6f 72 6d 61 74 69 6f 6e 20 6f 6e 0d 0a 20 20 20  ormation on..   
4860: 20 20 20 20 20 23 20 20 20 20 20 20 20 68 6f 77       #       how
4870: 20 74 6f 20 73 65 74 20 74 68 69 73 20 76 61 72   to set this var
4880: 69 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  iable...        
4890: 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e  #..        set n
48a0: 61 74 69 76 65 20 5b 68 61 73 52 75 6e 74 69 6d  ative [hasRuntim
48b0: 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65 5d 0d  eOption native].
48c0: 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ...        retur
48d0: 6e 20 5b 6a 6f 69 6e 42 75 69 6c 64 44 69 72 65  n [joinBuildDire
48e0: 63 74 6f 72 79 20 24 6e 61 74 69 76 65 20 5b 67  ctory $native [g
48f0: 65 74 42 75 69 6c 64 42 61 73 65 44 69 72 65 63  etBuildBaseDirec
4900: 74 6f 72 79 5d 20 5c 0d 0a 20 20 20 20 20 20 20  tory] \..       
4910: 20 20 20 20 20 5b 67 65 74 42 75 69 6c 64 59 65       [getBuildYe
4920: 61 72 5d 20 5b 67 65 74 42 75 69 6c 64 50 6c 61  ar] [getBuildPla
4930: 74 66 6f 72 6d 20 24 6e 61 74 69 76 65 5d 20 5b  tform $native] [
4940: 67 65 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72  getBuildConfigur
4950: 61 74 69 6f 6e 5d 5d 0d 0a 20 20 20 20 20 20 7d  ation]]..      }
4960: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
4970: 70 72 6f 63 20 67 65 74 52 65 6c 65 61 73 65 56  proc getReleaseV
4980: 65 72 73 69 6f 6e 20 7b 7d 20 7b 0d 0a 20 20 20  ersion {} {..   
4990: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
49a0: 54 45 3a 20 46 69 67 75 72 65 20 6f 75 74 20 74  TE: Figure out t
49b0: 68 65 20 72 65 6c 65 61 73 65 20 76 65 72 73 69  he release versi
49c0: 6f 6e 20 66 6f 72 20 75 73 65 20 77 69 74 68 20  on for use with 
49d0: 74 68 65 20 62 75 69 6c 64 20 64 69 72 65 63 74  the build direct
49e0: 6f 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ory..      #    
49f0: 20 20 20 77 68 65 6e 20 63 68 65 63 6b 69 6e 67     when checking
4a00: 20 66 6f 72 20 61 76 61 69 6c 61 62 6c 65 20 72   for available r
4a10: 65 6c 65 61 73 65 73 2e 0d 0a 20 20 20 20 20 20  eleases...      
4a20: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
4a30: 66 6f 20 65 78 69 73 74 73 20 3a 3a 72 65 6c 65  fo exists ::rele
4a40: 61 73 65 5f 76 65 72 73 69 6f 6e 5d 20 26 26 20  ase_version] && 
4a50: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
4a60: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 72  ring length $::r
4a70: 65 6c 65 61 73 65 5f 76 65 72 73 69 6f 6e 5d 20  elease_version] 
4a80: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
4a90: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4aa0: 23 20 4e 4f 54 45 3a 20 54 68 65 20 72 65 6c 65  # NOTE: The rele
4ab0: 61 73 65 20 76 65 72 73 69 6f 6e 20 68 61 73 20  ase version has 
4ac0: 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b  been overridden;
4ad0: 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   therefore, use 
4ae0: 69 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  it..        #   
4af0: 20 20 20 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20      verbatim... 
4b00: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4b10: 20 20 72 65 74 75 72 6e 20 24 3a 3a 72 65 6c 65    return $::rele
4b20: 61 73 65 5f 76 65 72 73 69 6f 6e 0d 0a 20 20 20  ase_version..   
4b30: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
4b40: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4b50: 23 20 4e 4f 54 45 3a 20 4e 6f 20 72 65 6c 65 61  # NOTE: No relea
4b60: 73 65 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76  se version is av
4b70: 61 69 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e 20  ailable, return 
4b80: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e  an empty string.
4b90: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
4ba0: 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a       return ""..
4bb0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
4bc0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42  ...    proc getB
4bd0: 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 7b 20 66  uildFileName { f
4be0: 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20  ileName } {..   
4bf0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
4c00: 54 45 3a 20 52 65 74 75 72 6e 73 20 74 68 65 20  TE: Returns the 
4c10: 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 6e  specified file n
4c20: 61 6d 65 20 61 73 20 69 66 20 69 74 20 77 65 72  ame as if it wer
4c30: 65 20 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65  e located in the
4c40: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
4c50: 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 2c  build directory,
4c60: 20 64 69 73 63 61 72 64 69 6e 67 20 61 6e 79 20   discarding any 
4c70: 64 69 72 65 63 74 6f 72 79 20 69 6e 66 6f 72 6d  directory inform
4c80: 61 74 69 6f 6e 20 70 72 65 73 65 6e 74 0d 0a 20  ation present.. 
4c90: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 20       #       in 
4ca0: 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 73  the file name as
4cb0: 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72   provided by our
4cc0: 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20   caller...      
4cd0: 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  #..      return 
4ce0: 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
4cf0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 66   \..          [f
4d00: 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42 75 69  ile join [getBui
4d10: 6c 64 44 69 72 65 63 74 6f 72 79 5d 20 5b 66 69  ldDirectory] [fi
4d20: 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d  le tail $fileNam
4d30: 65 5d 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  e]]]..    }.....
4d40: 20 20 20 20 70 72 6f 63 20 67 65 74 42 69 6e 61      proc getBina
4d50: 72 79 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b  ryDirectory {} {
4d60: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
4d70: 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72   # NOTE: This pr
4d80: 6f 63 65 64 75 72 65 20 72 65 74 75 72 6e 73 20  ocedure returns 
4d90: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 77 68  the directory wh
4da0: 65 72 65 20 74 68 65 20 74 65 73 74 20 61 70 70  ere the test app
4db0: 6c 69 63 61 74 69 6f 6e 0d 0a 20 20 20 20 20 20  lication..      
4dc0: 23 20 20 20 20 20 20 20 69 74 73 65 6c 66 20 28  #       itself (
4dd0: 69 2e 65 2e 20 74 68 65 20 45 61 67 6c 65 20 73  i.e. the Eagle s
4de0: 68 65 6c 6c 29 20 69 73 20 6c 6f 63 61 74 65 64  hell) is located
4df0: 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20  .  This will be 
4e00: 75 73 65 64 20 61 73 0d 0a 20 20 20 20 20 20 23  used as..      #
4e10: 20 20 20 20 20 20 20 74 68 65 20 64 65 73 74 69         the desti
4e20: 6e 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 63  nation for the c
4e30: 6f 70 69 65 64 20 53 79 73 74 65 6d 2e 44 61 74  opied System.Dat
4e40: 61 2e 53 51 4c 69 74 65 20 6e 61 74 69 76 65 20  a.SQLite native 
4e50: 61 6e 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20  and..      #    
4e60: 20 20 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d     managed assem
4e70: 62 6c 69 65 73 20 28 69 2e 65 2e 20 62 65 63 61  blies (i.e. beca
4e80: 75 73 65 20 74 68 69 73 20 69 73 20 6f 6e 65 20  use this is one 
4e90: 6f 66 20 74 68 65 20 66 65 77 20 70 6c 61 63 65  of the few place
4ea0: 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
4eb0: 20 77 68 65 72 65 20 74 68 65 20 43 4c 52 20 77   where the CLR w
4ec0: 69 6c 6c 20 61 63 74 75 61 6c 6c 79 20 66 69 6e  ill actually fin
4ed0: 64 20 61 6e 64 20 6c 6f 61 64 20 74 68 65 6d 20  d and load them 
4ee0: 70 72 6f 70 65 72 6c 79 29 2e 0d 0a 20 20 20 20  properly)...    
4ef0: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
4f00: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 62 69  info exists ::bi
4f10: 6e 61 72 79 5f 64 69 72 65 63 74 6f 72 79 5d 20  nary_directory] 
4f20: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
4f30: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
4f40: 3a 3a 62 69 6e 61 72 79 5f 64 69 72 65 63 74 6f  ::binary_directo
4f50: 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ry] > 0} then {.
4f60: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
4f70: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
4f80: 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  location of the 
4f90: 62 69 6e 61 72 79 20 64 69 72 65 63 74 6f 72 79  binary directory
4fa0: 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69   has been overri
4fb0: 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23  dden;..        #
4fc0: 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65         therefore
4fd0: 2c 20 75 73 65 20 69 74 20 76 65 72 62 61 74 69  , use it verbati
4fe0: 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  m...        #.. 
4ff0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
5000: 3a 62 69 6e 61 72 79 5f 64 69 72 65 63 74 6f 72  :binary_director
5010: 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  y..      } else 
5020: 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
5030: 6e 20 5b 69 6e 66 6f 20 62 69 6e 61 72 79 5d 0d  n [info binary].
5040: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
5050: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
5060: 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 7b  BinaryFileName {
5070: 20 66 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d 0a 20   fileName } {.. 
5080: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
5090: 4e 4f 54 45 3a 20 52 65 74 75 72 6e 73 20 74 68  NOTE: Returns th
50a0: 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
50b0: 20 6e 61 6d 65 20 61 73 20 69 66 20 69 74 20 77   name as if it w
50c0: 65 72 65 20 6c 6f 63 61 74 65 64 20 69 6e 20 74  ere located in t
50d0: 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
50e0: 20 20 62 69 6e 61 72 79 20 64 69 72 65 63 74 6f    binary directo
50f0: 72 79 2c 20 64 69 73 63 61 72 64 69 6e 67 20 61  ry, discarding a
5100: 6e 79 20 64 69 72 65 63 74 6f 72 79 20 69 6e 66  ny directory inf
5110: 6f 72 6d 61 74 69 6f 6e 20 70 72 65 73 65 6e 74  ormation present
5120: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
5130: 69 6e 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65  in the file name
5140: 20 61 73 20 70 72 6f 76 69 64 65 64 20 62 79 20   as provided by 
5150: 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20  our caller...   
5160: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
5170: 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  rn [file nativen
5180: 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
5190: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74   [file join [get
51a0: 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d  BinaryDirectory]
51b0: 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c   [file tail $fil
51c0: 65 4e 61 6d 65 5d 5d 5d 0d 0a 20 20 20 20 7d 0d  eName]]]..    }.
51d0: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
51e0: 43 6f 72 65 42 69 6e 61 72 79 46 69 6c 65 4e 61  CoreBinaryFileNa
51f0: 6d 65 20 7b 20 7b 73 74 61 6e 64 61 72 64 20 66  me { {standard f
5200: 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  alse} } {..     
5210: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
5220: 3a 20 52 65 74 75 72 6e 73 20 74 68 65 20 66 75  : Returns the fu
5230: 6c 6c 20 70 61 74 68 20 66 6f 72 20 74 68 65 20  ll path for the 
5240: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  file containing 
5250: 74 68 65 20 63 6f 72 65 20 53 51 4c 69 74 65 0d  the core SQLite.
5260: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6c  .      #       l
5270: 69 62 72 61 72 79 20 63 6f 64 65 20 66 6f 72 20  ibrary code for 
5280: 74 68 69 73 20 70 6c 61 74 66 6f 72 6d 2e 0d 0a  this platform...
5290: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
52a0: 66 20 7b 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70  f {[hasRuntimeOp
52b0: 74 69 6f 6e 20 6e 61 74 69 76 65 5d 7d 20 74 68  tion native]} th
52c0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
52d0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
52e0: 20 52 65 74 75 72 6e 20 74 68 65 20 6d 69 78 65   Return the mixe
52f0: 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20  d-mode assembly 
5300: 66 69 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20 20 20  file name...    
5310: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
5320: 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69  eturn [file nati
5330: 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  vename \..      
5340: 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e        [file join
5350: 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65 63   [getBinaryDirec
5360: 74 6f 72 79 5d 20 53 79 73 74 65 6d 2e 44 61 74  tory] System.Dat
5370: 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d 5d 0d 0a  a.SQLite.dll]]..
5380: 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
5390: 24 73 74 61 6e 64 61 72 64 7d 20 74 68 65 6e 20  $standard} then 
53a0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
53b0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
53c0: 74 75 72 6e 20 74 68 65 20 6e 61 74 69 76 65 2d  turn the native-
53d0: 6f 6e 6c 79 20 73 74 61 6e 64 61 72 64 20 53 51  only standard SQ
53e0: 4c 69 74 65 20 6c 69 62 72 61 72 79 20 66 69 6c  Lite library fil
53f0: 65 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20  e name...       
5400: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
5410: 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  rn [file nativen
5420: 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
5430: 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67     [file join [g
5440: 65 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72  etBinaryDirector
5450: 79 5d 20 73 71 6c 69 74 65 33 2e 64 6c 6c 5d 5d  y] sqlite3.dll]]
5460: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
5470: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
5480: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74       # NOTE: Ret
5490: 75 72 6e 20 74 68 65 20 6e 61 74 69 76 65 2d 6f  urn the native-o
54a0: 6e 6c 79 20 69 6e 74 65 72 6f 70 20 61 73 73 65  nly interop asse
54b0: 6d 62 6c 79 20 66 69 6c 65 20 6e 61 6d 65 2e 0d  mbly file name..
54c0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
54d0: 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65      return [file
54e0: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20   nativename \.. 
54f0: 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
5500: 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e 61 72 79   join [getBinary
5510: 44 69 72 65 63 74 6f 72 79 5d 20 53 51 4c 69 74  Directory] SQLit
5520: 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 5d 5d 0d  e.Interop.dll]].
5530: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
5540: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
5550: 43 6f 6d 6d 6f 6e 44 69 72 65 63 74 6f 72 79 20  CommonDirectory 
5560: 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
5570: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69       # NOTE: Thi
5580: 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75  s procedure retu
5590: 72 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f 72  rns the director
55a0: 79 20 77 68 65 72 65 20 74 68 65 20 74 65 73 74  y where the test
55b0: 20 73 63 72 69 70 74 73 0d 0a 20 20 20 20 20 20   scripts..      
55c0: 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62  #       should b
55d0: 65 20 6c 6f 63 61 74 65 64 2e 20 20 42 79 20 64  e located.  By d
55e0: 65 66 61 75 6c 74 2c 20 74 68 69 73 20 6a 75 73  efault, this jus
55f0: 74 20 72 65 74 75 72 6e 73 20 74 68 65 20 45 61  t returns the Ea
5600: 67 6c 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  gle..      #    
5610: 20 20 20 62 69 6e 61 72 79 20 64 69 72 65 63 74     binary direct
5620: 6f 72 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ory...      #.. 
5630: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
5640: 78 69 73 74 73 20 3a 3a 63 6f 6d 6d 6f 6e 5f 64  xists ::common_d
5650: 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a  irectory] && \..
5660: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
5670: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 63 6f 6d 6d  g length $::comm
5680: 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20  on_directory] > 
5690: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
56a0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
56b0: 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69  NOTE: The locati
56c0: 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6d 6d 6f 6e  on of the common
56d0: 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
56e0: 65 65 6e 20 73 65 74 3b 0d 0a 20 20 20 20 20 20  een set;..      
56f0: 20 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66    #       theref
5700: 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20  ore, use it...  
5710: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
5720: 20 72 65 74 75 72 6e 20 24 3a 3a 63 6f 6d 6d 6f   return $::commo
5730: 6e 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  n_directory..   
5740: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e     } elseif {[in
5750: 66 6f 20 65 78 69 73 74 73 20 3a 3a 76 65 6e 64  fo exists ::vend
5760: 6f 72 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26  or_directory] &&
5770: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
5780: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
5790: 76 65 6e 64 6f 72 5f 64 69 72 65 63 74 6f 72 79  vendor_directory
57a0: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
57b0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
57c0: 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f    # NOTE: The lo
57d0: 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 65  cation of the ve
57e0: 6e 64 6f 72 20 64 69 72 65 63 74 6f 72 79 20 68  ndor directory h
57f0: 61 73 20 62 65 65 6e 20 73 65 74 3b 0d 0a 20 20  as been set;..  
5800: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
5810: 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 2e  erefore, use it.
5820: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
5830: 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 76       return $::v
5840: 65 6e 64 6f 72 5f 64 69 72 65 63 74 6f 72 79 0d  endor_directory.
5850: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20  .      } elseif 
5860: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
5870: 74 63 6c 5f 6c 69 62 72 61 72 79 5d 20 26 26 20  tcl_library] && 
5880: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
5890: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74  ring length $::t
58a0: 63 6c 5f 6c 69 62 72 61 72 79 5d 20 3e 20 30 20  cl_library] > 0 
58b0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
58c0: 5b 66 69 6c 65 20 69 73 64 69 72 65 63 74 6f 72  [file isdirector
58d0: 79 20 24 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79  y $::tcl_library
58e0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
58f0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
5900: 4e 4f 54 45 3a 20 54 68 65 20 76 61 72 69 61 62  NOTE: The variab
5910: 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 61  le with the loca
5920: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 63 72 69  tion of the scri
5930: 70 74 20 6c 69 62 72 61 72 79 20 69 73 0d 0a 20  pt library is.. 
5940: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73         #       s
5950: 65 74 20 61 6e 64 20 61 70 70 65 61 72 73 20 74  et and appears t
5960: 6f 20 62 65 20 61 20 72 65 61 6c 20 64 69 72 65  o be a real dire
5970: 63 74 6f 72 79 20 28 69 2e 65 2e 20 6e 6f 74 20  ctory (i.e. not 
5980: 65 6d 62 65 64 64 65 64 0d 0a 20 20 20 20 20 20  embedded..      
5990: 20 20 23 20 20 20 20 20 20 20 77 69 74 68 69 6e    #       within
59a0: 20 61 20 66 69 6c 65 29 3b 20 74 68 65 72 65 66   a file); theref
59b0: 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20  ore, use it...  
59c0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
59d0: 20 72 65 74 75 72 6e 20 24 3a 3a 74 63 6c 5f 6c   return $::tcl_l
59e0: 69 62 72 61 72 79 0d 0a 20 20 20 20 20 20 7d 20  ibrary..      } 
59f0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
5a00: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
5a10: 45 3a 20 46 61 6c 6c 62 61 63 6b 20 74 6f 20 74  E: Fallback to t
5a20: 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e  he directory con
5a30: 74 61 69 6e 69 6e 67 20 74 68 65 20 65 78 65 63  taining the exec
5a40: 75 74 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20  utable...       
5a50: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
5a60: 72 6e 20 5b 69 6e 66 6f 20 62 69 6e 61 72 79 5d  rn [info binary]
5a70: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
5a80: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
5a90: 74 44 61 74 61 62 61 73 65 44 69 72 65 63 74 6f  tDatabaseDirecto
5aa0: 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ry {} {..      #
5ab0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
5ac0: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 72  This procedure r
5ad0: 65 74 75 72 6e 73 20 74 68 65 20 64 69 72 65 63  eturns the direc
5ae0: 74 6f 72 79 20 77 68 65 72 65 20 74 68 65 20 74  tory where the t
5af0: 65 73 74 20 64 61 74 61 62 61 73 65 73 0d 0a 20  est databases.. 
5b00: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 68 6f       #       sho
5b10: 75 6c 64 20 62 65 20 6c 6f 63 61 74 65 64 2e 20  uld be located. 
5b20: 20 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69   By default, thi
5b30: 73 20 6a 75 73 74 20 75 73 65 73 20 74 68 65 20  s just uses the 
5b40: 74 65 6d 70 6f 72 61 72 79 0d 0a 20 20 20 20 20  temporary..     
5b50: 20 23 20 20 20 20 20 20 20 64 69 72 65 63 74 6f   #       directo
5b60: 72 79 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  ry configured fo
5b70: 72 20 74 68 69 73 20 73 79 73 74 65 6d 2e 0d 0a  r this system...
5b80: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
5b90: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
5ba0: 3a 3a 64 61 74 61 62 61 73 65 5f 64 69 72 65 63  ::database_direc
5bb0: 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20  tory] && \..    
5bc0: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
5bd0: 6e 67 74 68 20 24 3a 3a 64 61 74 61 62 61 73 65  ngth $::database
5be0: 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d  _directory] > 0}
5bf0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
5c00: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
5c10: 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e  TE: The location
5c20: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
5c30: 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
5c40: 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d  een overridden;.
5c50: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
5c60: 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   therefore, use 
5c70: 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  it...        #..
5c80: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
5c90: 3a 3a 64 61 74 61 62 61 73 65 5f 64 69 72 65 63  ::database_direc
5ca0: 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c  tory..      } el
5cb0: 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73  seif {[info exis
5cc0: 74 73 20 3a 3a 73 63 72 61 74 63 68 5f 64 69 72  ts ::scratch_dir
5cd0: 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20  ectory] && \..  
5ce0: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
5cf0: 6c 65 6e 67 74 68 20 24 3a 3a 73 63 72 61 74 63  length $::scratc
5d00: 68 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30  h_directory] > 0
5d10: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
5d20: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
5d30: 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f  OTE: The locatio
5d40: 6e 20 6f 66 20 74 68 65 20 73 63 72 61 74 63 68  n of the scratch
5d50: 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
5d60: 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d  een overridden;.
5d70: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
5d80: 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   therefore, use 
5d90: 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  it...        #..
5da0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
5db0: 3a 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63 74  ::scratch_direct
5dc0: 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  ory..      } els
5dd0: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  e {..        ret
5de0: 75 72 6e 20 5b 67 65 74 54 65 6d 70 6f 72 61 72  urn [getTemporar
5df0: 79 50 61 74 68 5d 0d 0a 20 20 20 20 20 20 7d 0d  yPath]..      }.
5e00: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
5e10: 72 6f 63 20 67 65 74 54 65 6d 70 6f 72 61 72 79  roc getTemporary
5e20: 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a  Directory {} {..
5e30: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
5e40: 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63   NOTE: This proc
5e50: 65 64 75 72 65 20 72 65 74 75 72 6e 73 20 74 68  edure returns th
5e60: 65 20 64 69 72 65 63 74 6f 72 79 20 77 68 65 72  e directory wher
5e70: 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  e the temporary 
5e80: 66 69 6c 65 73 0d 0a 20 20 20 20 20 20 23 20 20  files..      #  
5e90: 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 6c       should be l
5ea0: 6f 63 61 74 65 64 2e 20 20 42 79 20 64 65 66 61  ocated.  By defa
5eb0: 75 6c 74 2c 20 74 68 69 73 20 6a 75 73 74 20 75  ult, this just u
5ec0: 73 65 73 20 74 68 65 20 74 65 6d 70 6f 72 61 72  ses the temporar
5ed0: 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
5ee0: 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 66 69   directory confi
5ef0: 67 75 72 65 64 20 66 6f 72 20 74 68 69 73 20 73  gured for this s
5f00: 79 73 74 65 6d 2e 0d 0a 20 20 20 20 20 20 23 0d  ystem...      #.
5f10: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
5f20: 20 65 78 69 73 74 73 20 3a 3a 74 65 6d 70 6f 72   exists ::tempor
5f30: 61 72 79 5f 64 69 72 65 63 74 6f 72 79 5d 20 26  ary_directory] &
5f40: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
5f50: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
5f60: 3a 74 65 6d 70 6f 72 61 72 79 5f 64 69 72 65 63  :temporary_direc
5f70: 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20  tory] > 0} then 
5f80: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
5f90: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
5fa0: 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  e location of th
5fb0: 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65  e temporary dire
5fc0: 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 6f  ctory has been o
5fd0: 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20  verridden;..    
5fe0: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 72      #       ther
5ff0: 65 66 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a  efore, use it...
6000: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
6010: 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 6d     return $::tem
6020: 70 6f 72 61 72 79 5f 64 69 72 65 63 74 6f 72 79  porary_directory
6030: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66  ..      } elseif
6040: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
6050: 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63 74 6f  :scratch_directo
6060: 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  ry] && \..      
6070: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
6080: 74 68 20 24 3a 3a 73 63 72 61 74 63 68 5f 64 69  th $::scratch_di
6090: 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68  rectory] > 0} th
60a0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
60b0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
60c0: 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   The location of
60d0: 20 74 68 65 20 73 63 72 61 74 63 68 20 64 69 72   the scratch dir
60e0: 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
60f0: 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20  overridden;..   
6100: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
6110: 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d  refore, use it..
6120: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
6130: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 73 63      return $::sc
6140: 72 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79 0d  ratch_directory.
6150: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
6160: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
6170: 5b 67 65 74 54 65 6d 70 6f 72 61 72 79 50 61 74  [getTemporaryPat
6180: 68 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  h]..      }..   
6190: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
61a0: 67 65 74 54 65 73 74 4f 76 65 72 72 69 64 65 73  getTestOverrides
61b0: 50 72 65 61 6d 62 6c 65 20 7b 20 7b 65 78 74 72  Preamble { {extr
61c0: 61 56 61 72 4e 61 6d 65 73 20 22 22 7d 20 7d 20  aVarNames ""} } 
61d0: 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 76 61 72  {..      set var
61e0: 4e 61 6d 65 73 20 5b 6c 69 73 74 5d 0d 0a 0d 0a  Names [list]....
61f0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
6200: 20 4e 4f 54 45 3a 20 49 66 20 61 76 61 69 6c 61   NOTE: If availa
6210: 62 6c 65 2c 20 73 74 61 72 74 20 77 69 74 68 20  ble, start with 
6220: 74 68 65 20 6d 61 73 74 65 72 20 6c 69 73 74 20  the master list 
6230: 6f 66 20 74 65 73 74 20 6f 76 65 72 72 69 64 65  of test override
6240: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
6250: 76 61 72 69 61 62 6c 65 73 2e 0d 0a 20 20 20 20  variables...    
6260: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
6270: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65  info exists ::te
6280: 73 74 5f 6f 76 65 72 72 69 64 65 73 5d 20 26 26  st_overrides] &&
6290: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 6c   \..          [l
62a0: 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 6f  length $::test_o
62b0: 76 65 72 72 69 64 65 73 5d 20 3e 20 30 7d 20 74  verrides] > 0} t
62c0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 65  hen {..        e
62d0: 76 61 6c 20 6c 61 70 70 65 6e 64 20 76 61 72 4e  val lappend varN
62e0: 61 6d 65 73 20 24 3a 3a 74 65 73 74 5f 6f 76 65  ames $::test_ove
62f0: 72 72 69 64 65 73 0d 0a 20 20 20 20 20 20 7d 0d  rrides..      }.
6300: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
6310: 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 72 65 71    # NOTE: If req
6320: 75 65 73 74 65 64 20 62 79 20 6f 75 72 20 63 61  uested by our ca
6330: 6c 6c 65 72 2c 20 61 64 64 20 61 6e 79 20 61 64  ller, add any ad
6340: 64 69 74 69 6f 6e 61 6c 20 76 61 72 69 61 62 6c  ditional variabl
6350: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
6360: 20 6e 61 6d 65 73 20 74 6f 20 63 6f 70 79 20 6e   names to copy n
6370: 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ow...      #..  
6380: 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68      if {[llength
6390: 20 24 65 78 74 72 61 56 61 72 4e 61 6d 65 73 5d   $extraVarNames]
63a0: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
63b0: 20 20 20 20 20 20 65 76 61 6c 20 6c 61 70 70 65        eval lappe
63c0: 6e 64 20 76 61 72 4e 61 6d 65 73 20 24 65 78 74  nd varNames $ext
63d0: 72 61 56 61 72 4e 61 6d 65 73 0d 0a 20 20 20 20  raVarNames..    
63e0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
63f0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75        # NOTE: Bu
6400: 69 6c 64 20 74 68 65 20 73 63 72 69 70 74 20 66  ild the script f
6410: 72 61 67 6d 65 6e 74 20 74 6f 20 62 65 20 72 65  ragment to be re
6420: 74 75 72 6e 65 64 20 62 79 20 70 72 6f 63 65 73  turned by proces
6430: 73 69 6e 67 20 65 61 63 68 0d 0a 20 20 20 20 20  sing each..     
6440: 20 23 20 20 20 20 20 20 20 76 61 72 69 61 62 6c   #       variabl
6450: 65 20 6e 61 6d 65 20 61 6e 64 20 61 64 64 69 6e  e name and addin
6460: 67 20 74 68 65 20 6e 65 63 65 63 65 73 73 61 72  g the nececessar
6470: 79 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e  y script fragmen
6480: 74 73 20 66 6f 72 0d 0a 20 20 20 20 20 20 23 20  ts for..      # 
6490: 20 20 20 20 20 20 65 61 63 68 20 6f 6e 65 2e 0d        each one..
64a0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
64b0: 73 65 74 20 72 65 73 75 6c 74 20 22 22 0d 0a 0d  set result ""...
64c0: 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 76  .      foreach v
64d0: 61 72 4e 61 6d 65 20 24 76 61 72 4e 61 6d 65 73  arName $varNames
64e0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
64f0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42         # NOTE: B
6500: 75 69 6c 64 20 74 68 65 20 71 75 61 6c 69 66 69  uild the qualifi
6510: 65 64 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  ed global variab
6520: 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20  le name...      
6530: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74    #..        set
6540: 20 66 75 6c 6c 56 61 72 4e 61 6d 65 20 5b 61 70   fullVarName [ap
6550: 70 65 6e 64 41 72 67 73 20 3a 3a 20 24 76 61 72  pendArgs :: $var
6560: 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  Name]....       
6570: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
6580: 54 45 3a 20 44 6f 65 73 20 74 68 65 20 76 61 72  TE: Does the var
6590: 69 61 62 6c 65 20 65 78 69 73 74 20 69 6e 20 74  iable exist in t
65a0: 68 69 73 20 69 6e 74 65 72 70 72 65 74 65 72 20  his interpreter 
65b0: 63 6f 6e 74 65 78 74 3f 0d 0a 20 20 20 20 20 20  context?..      
65c0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
65d0: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 24 66  {[info exists $f
65e0: 75 6c 6c 56 61 72 4e 61 6d 65 5d 7d 20 74 68 65  ullVarName]} the
65f0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  n {..          #
6600: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
6610: 54 45 3a 20 41 70 70 65 6e 64 20 61 20 73 63 72  TE: Append a scr
6620: 69 70 74 20 66 72 61 67 6d 65 6e 74 20 74 6f 20  ipt fragment to 
6630: 74 68 65 20 72 65 73 75 6c 74 20 74 68 61 74 20  the result that 
6640: 77 69 6c 6c 20 63 6f 72 72 65 63 74 6c 79 0d 0a  will correctly..
6650: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
6660: 20 20 63 6f 70 79 20 61 6e 79 20 63 6f 6e 74 61    copy any conta
6670: 69 6e 65 64 20 76 61 6c 75 65 20 74 6f 20 61 6e  ined value to an
6680: 6f 74 68 65 72 20 69 6e 74 65 72 70 72 65 74 65  other interprete
6690: 72 20 63 6f 6e 74 65 78 74 2e 0d 0a 20 20 20 20  r context...    
66a0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
66b0: 20 20 20 61 70 70 65 6e 64 20 72 65 73 75 6c 74     append result
66c0: 20 5c 6e 20 22 73 65 74 20 22 20 24 66 75 6c 6c   \n "set " $full
66d0: 56 61 72 4e 61 6d 65 20 22 20 5c 7b 22 20 5b 73  VarName " \{" [s
66e0: 65 74 20 24 66 75 6c 6c 56 61 72 4e 61 6d 65 5d  et $fullVarName]
66f0: 20 5c 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a   \}..        }..
6700: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
6710: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
6720: 3a 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 20  : If the result 
6730: 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20  contains one or 
6740: 6d 6f 72 65 20 73 63 72 69 70 74 20 66 72 61 67  more script frag
6750: 6d 65 6e 74 73 2c 20 61 70 70 65 6e 64 20 61 0d  ments, append a.
6760: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e  .      #       n
6770: 65 77 6c 69 6e 65 2e 0d 0a 20 20 20 20 20 20 23  ewline...      #
6780: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
6790: 69 6e 67 20 6c 65 6e 67 74 68 20 24 72 65 73 75  ing length $resu
67a0: 6c 74 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  lt] > 0} then {.
67b0: 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20  .        append 
67c0: 72 65 73 75 6c 74 20 5c 6e 0d 0a 20 20 20 20 20  result \n..     
67d0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
67e0: 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20  rn $result..    
67f0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
6800: 65 74 41 70 70 44 6f 6d 61 69 6e 50 72 65 61 6d  etAppDomainPream
6810: 62 6c 65 20 7b 20 7b 70 72 65 66 69 78 20 22 22  ble { {prefix ""
6820: 7d 20 7b 73 75 66 66 69 78 20 22 22 7d 20 7d 20  } {suffix ""} } 
6830: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
6840: 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70    # NOTE: This p
6850: 72 6f 63 65 64 75 72 65 20 72 65 74 75 72 6e 73  rocedure returns
6860: 20 61 20 74 65 73 74 20 73 65 74 75 70 20 73 63   a test setup sc
6870: 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20 73 75  ript fragment su
6880: 69 74 61 62 6c 65 20 66 6f 72 0d 0a 20 20 20 20  itable for..    
6890: 20 20 23 20 20 20 20 20 20 20 65 76 61 6c 75 61    #       evalua
68a0: 74 69 6f 6e 20 62 79 20 61 6e 20 69 6e 74 65 72  tion by an inter
68b0: 70 72 65 74 65 72 20 63 72 65 61 74 65 64 20 69  preter created i
68c0: 6e 20 61 6e 20 69 73 6f 6c 61 74 65 64 20 61 70  n an isolated ap
68d0: 70 6c 69 63 61 74 69 6f 6e 0d 0a 20 20 20 20 20  plication..     
68e0: 20 23 20 20 20 20 20 20 20 64 6f 6d 61 69 6e 2e   #       domain.
68f0: 20 20 54 68 65 20 73 63 72 69 70 74 20 66 72 61    The script fra
6900: 67 6d 65 6e 74 20 62 65 69 6e 67 20 72 65 74 75  gment being retu
6910: 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 73 75 72  rned will be sur
6920: 72 6f 75 6e 64 65 64 20 62 79 0d 0a 20 20 20 20  rounded by..    
6930: 20 20 23 20 20 20 20 20 20 20 74 68 65 20 70 72    #       the pr
6940: 65 66 69 78 20 61 6e 64 20 73 75 66 66 69 78 20  efix and suffix 
6950: 22 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74  "script fragment
6960: 73 22 20 73 70 65 63 69 66 69 65 64 20 62 79 20  s" specified by 
6970: 6f 75 72 20 63 61 6c 6c 65 72 2c 0d 0a 20 20 20  our caller,..   
6980: 20 20 20 23 20 20 20 20 20 20 20 69 66 20 61 6e     #       if an
6990: 79 2e 20 20 54 68 65 20 65 6e 74 69 72 65 20 73  y.  The entire s
69a0: 63 72 69 70 74 20 62 65 69 6e 67 20 72 65 74 75  cript being retu
69b0: 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 73 75 62  rned will be sub
69c0: 73 74 69 74 75 74 65 64 20 76 69 61 0d 0a 20 20  stituted via..  
69d0: 20 20 20 20 23 20 20 20 20 20 20 20 5b 73 75 62      #       [sub
69e0: 73 74 5d 2c 20 69 6e 20 74 68 65 20 63 6f 6e 74  st], in the cont
69f0: 65 78 74 20 6f 66 20 6f 75 72 20 63 61 6c 6c 65  ext of our calle
6a00: 72 2c 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20  r, before being 
6a10: 72 65 74 75 72 6e 65 64 2e 0d 0a 20 20 20 20 20  returned...     
6a20: 20 23 20 20 20 20 20 20 20 54 68 69 73 20 73 74   #       This st
6a30: 65 70 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  ep is necessary 
6a40: 73 6f 20 74 68 61 74 20 73 6f 6d 65 20 6c 69 6d  so that some lim
6a50: 69 74 65 64 20 63 6f 6e 74 65 78 74 20 69 6e 66  ited context inf
6a60: 6f 72 6d 61 74 69 6f 6e 2c 0d 0a 20 20 20 20 20  ormation,..     
6a70: 20 23 20 20 20 20 20 20 20 70 72 69 6d 61 72 69   #       primari
6a80: 6c 79 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68  ly related to th
6a90: 65 20 74 65 73 74 69 6e 67 20 64 69 72 65 63 74  e testing direct
6aa0: 6f 72 69 65 73 2c 20 63 61 6e 20 62 65 20 74 72  ories, can be tr
6ab0: 61 6e 73 66 65 72 72 65 64 0d 0a 20 20 20 20 20  ansferred..     
6ac0: 20 23 20 20 20 20 20 20 20 74 6f 20 74 68 65 20   #       to the 
6ad0: 69 6e 74 65 72 70 72 65 74 65 72 20 69 6e 20 74  interpreter in t
6ae0: 68 65 20 69 73 6f 6c 61 74 65 64 20 61 70 70 6c  he isolated appl
6af0: 69 63 61 74 69 6f 6e 20 64 6f 6d 61 69 6e 2c 20  ication domain, 
6b00: 6d 61 6b 69 6e 67 20 69 74 0d 0a 20 20 20 20 20  making it..     
6b10: 20 23 20 20 20 20 20 20 20 61 62 6c 65 20 74 6f   #       able to
6b20: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 75   successfully ru
6b30: 6e 20 74 65 73 74 73 20 74 68 61 74 20 72 65 71  n tests that req
6b40: 75 69 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  uire one or more
6b50: 20 6f 66 20 74 68 65 0d 0a 20 20 20 20 20 20 23   of the..      #
6b60: 20 20 20 20 20 20 20 66 69 6c 65 73 20 69 6e 20         files in 
6b70: 6f 6e 65 20 6f 66 20 74 68 65 20 74 65 73 74 69  one of the testi
6b80: 6e 67 20 64 69 72 65 63 74 6f 72 69 65 73 2e 20  ng directories. 
6b90: 20 43 61 6c 6c 65 72 73 20 73 68 6f 75 6c 64 20   Callers should 
6ba0: 6b 65 65 70 20 69 6e 0d 0a 20 20 20 20 20 20 23  keep in..      #
6bb0: 20 20 20 20 20 20 20 6d 69 6e 64 20 74 68 61 74         mind that
6bc0: 20 74 68 65 20 74 65 73 74 20 73 63 72 69 70 74   the test script
6bd0: 20 66 72 61 67 6d 65 6e 74 20 62 65 69 6e 67 20   fragment being 
6be0: 72 65 74 75 72 6e 65 64 20 63 61 6e 6e 6f 74 20  returned cannot 
6bf0: 72 65 6c 79 20 6f 6e 0d 0a 20 20 20 20 20 20 23  rely on..      #
6c00: 20 20 20 20 20 20 20 61 6e 79 20 73 63 72 69 70         any scrip
6c10: 74 20 6c 69 62 72 61 72 79 20 70 72 6f 63 65 64  t library proced
6c20: 75 72 65 73 20 74 68 61 74 20 61 72 65 20 6e 6f  ures that are no
6c30: 74 20 70 72 6f 76 69 64 65 64 20 62 79 20 74 68  t provided by th
6c40: 65 20 45 61 67 6c 65 0d 0a 20 20 20 20 20 20 23  e Eagle..      #
6c50: 20 20 20 20 20 20 20 6c 69 62 72 61 72 79 20 70         library p
6c60: 61 63 6b 61 67 65 20 28 69 2e 65 2e 20 22 69 6e  ackage (i.e. "in
6c70: 69 74 2e 65 61 67 6c 65 22 29 2c 20 69 6e 63 6c  it.eagle"), incl
6c80: 75 64 69 6e 67 20 74 68 6f 73 65 20 70 72 6f 76  uding those prov
6c90: 69 64 65 64 20 62 79 0d 0a 20 20 20 20 20 20 23  ided by..      #
6ca0: 20 20 20 20 20 20 20 74 68 65 20 45 61 67 6c 65         the Eagle
6cb0: 20 74 65 73 74 20 70 61 63 6b 61 67 65 2c 20 75   test package, u
6cc0: 6e 6c 65 73 73 20 74 68 65 20 66 69 6c 65 20 63  nless the file c
6cd0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 6d 20 69  ontaining them i
6ce0: 73 20 6c 6f 61 64 65 64 0d 0a 20 20 20 20 20 20  s loaded..      
6cf0: 23 20 20 20 20 20 20 20 6d 61 6e 75 61 6c 6c 79  #       manually
6d00: 20 76 69 61 20 73 6f 6d 65 20 6f 74 68 65 72 20   via some other 
6d10: 6d 65 63 68 61 6e 69 73 6d 20 28 65 2e 67 2e 20  mechanism (e.g. 
6d20: 62 79 20 69 6e 63 6c 75 64 69 6e 67 20 61 70 70  by including app
6d30: 72 6f 70 72 69 61 74 65 0d 0a 20 20 20 20 20 20  ropriate..      
6d40: 23 20 20 20 20 20 20 20 5b 70 61 63 6b 61 67 65  #       [package
6d50: 20 72 65 71 75 69 72 65 5d 20 6f 72 20 5b 73 6f   require] or [so
6d60: 75 72 63 65 5d 20 63 6f 6d 6d 61 6e 64 73 20 69  urce] commands i
6d70: 6e 20 74 68 65 20 70 72 65 66 69 78 20 6f 72 20  n the prefix or 
6d80: 73 75 66 66 69 78 0d 0a 20 20 20 20 20 20 23 20  suffix..      # 
6d90: 20 20 20 20 20 20 73 63 72 69 70 74 20 66 72 61        script fra
6da0: 67 6d 65 6e 74 73 29 2e 20 20 41 6c 73 6f 2c 20  gments).  Also, 
6db0: 61 6c 6c 20 76 61 72 69 61 62 6c 65 20 72 65 66  all variable ref
6dc0: 65 72 65 6e 63 65 73 20 61 6e 64 20 61 6c 6c 20  erences and all 
6dd0: 6e 65 73 74 65 64 0d 0a 20 20 20 20 20 20 23 20  nested..      # 
6de0: 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64 73 20 28        commands (
6df0: 69 2e 65 2e 20 74 68 6f 73 65 20 69 6e 20 73 71  i.e. those in sq
6e00: 75 61 72 65 20 62 72 61 63 6b 65 74 73 29 20 63  uare brackets) c
6e10: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
6e20: 66 69 6e 61 6c 0d 0a 20 20 20 20 20 20 23 20 20  final..      #  
6e30: 20 20 20 20 20 73 63 72 69 70 74 20 66 72 61 67       script frag
6e40: 6d 65 6e 74 20 77 69 6c 6c 20 65 6e 64 20 75 70  ment will end up
6e50: 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64   being evaluated
6e60: 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20   in the context 
6e70: 6f 66 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  of the..      # 
6e80: 20 20 20 20 20 20 63 61 6c 6c 69 6e 67 20 69 6e        calling in
6e90: 74 65 72 70 72 65 74 65 72 20 61 6e 64 20 6e 6f  terpreter and no
6ea0: 74 20 74 68 65 20 74 61 72 67 65 74 20 69 6e 74  t the target int
6eb0: 65 72 70 72 65 74 65 72 20 63 72 65 61 74 65 64  erpreter created
6ec0: 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23   in the..      #
6ed0: 20 20 20 20 20 20 20 69 73 6f 6c 61 74 65 64 20         isolated 
6ee0: 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 6f 6d 61  application doma
6ef0: 69 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 64 6f  in unless the do
6f00: 6c 6c 61 72 20 73 69 67 6e 73 20 61 6e 64 2f 6f  llar signs and/o
6f10: 72 20 73 71 75 61 72 65 0d 0a 20 20 20 20 20 20  r square..      
6f20: 23 20 20 20 20 20 20 20 62 72 61 63 6b 65 74 73  #       brackets
6f30: 20 61 72 65 20 73 70 65 63 69 61 6c 6c 79 20 71   are specially q
6f40: 75 6f 74 65 64 20 77 69 74 68 20 62 61 63 6b 73  uoted with backs
6f50: 6c 61 73 68 65 73 2e 0d 0a 20 20 20 20 20 20 23  lashes...      #
6f60: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b  ..      return [
6f70: 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20  uplevel 1 [list 
6f80: 73 75 62 73 74 20 5b 61 70 70 65 6e 64 41 72 67  subst [appendArg
6f90: 73 20 24 70 72 65 66 69 78 20 7b 0d 0a 20 20 20  s $prefix {..   
6fa0: 20 20 20 20 20 69 66 20 7b 5b 68 61 73 52 75 6e       if {[hasRun
6fb0: 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76  timeOption nativ
6fc0: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
6fd0: 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
6fe0: 6f 6b 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e  oke Interpreter.
6ff0: 47 65 74 41 63 74 69 76 65 20 41 64 64 52 75 6e  GetActive AddRun
7000: 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76  timeOption nativ
7010: 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  e..        }..  
7020: 20 20 20 20 7d 20 5b 67 65 74 54 65 73 74 4f 76      } [getTestOv
7030: 65 72 72 69 64 65 73 50 72 65 61 6d 62 6c 65 20  erridesPreamble 
7040: 5b 6c 69 73 74 20 70 61 74 68 20 74 65 73 74 5f  [list path test_
7050: 63 68 61 6e 6e 65 6c 5d 5d 20 24 73 75 66 66 69  channel]] $suffi
7060: 78 5d 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  x]]]..    }.....
7070: 20 20 20 20 70 72 6f 63 20 74 72 79 43 6f 70 79      proc tryCopy
7080: 42 69 6e 61 72 79 46 69 6c 65 20 7b 20 66 69 6c  BinaryFile { fil
7090: 65 4e 61 6d 65 20 7b 6e 65 77 46 69 6c 65 4e 61  eName {newFileNa
70a0: 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20  me ""} } {..    
70b0: 20 20 73 65 74 20 73 6f 75 72 63 65 46 69 6c 65    set sourceFile
70c0: 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46  Name [getBinaryF
70d0: 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d  ileName $fileNam
70e0: 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  e]....      if {
70f0: 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 73  ![file exists $s
7100: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 5d 7d 20  ourceFileName]} 
7110: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
7120: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
7130: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
7140: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
7150: 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 63   "---- skipped c
7160: 6f 70 79 69 6e 67 20 62 69 6e 61 72 79 20 66 69  opying binary fi
7170: 6c 65 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69  le \"" $sourceFi
7180: 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  leName \..      
7190: 20 20 20 20 20 20 22 5c 22 2c 20 69 74 20 64 6f        "\", it do
71a0: 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d  es not exist\n"]
71b0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75  ....        retu
71c0: 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  rn..      }.... 
71d0: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
71e0: 20 6c 65 6e 67 74 68 20 24 6e 65 77 46 69 6c 65   length $newFile
71f0: 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  Name] > 0} then 
7200: 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74  {..        set t
7210: 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67  argetFileName [g
7220: 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20  etBuildFileName 
7230: 24 6e 65 77 46 69 6c 65 4e 61 6d 65 5d 0d 0a 20  $newFileName].. 
7240: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
7250: 20 20 20 20 20 20 20 73 65 74 20 74 61 72 67 65         set targe
7260: 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 75  tFileName [getBu
7270: 69 6c 64 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c  ildFileName $fil
7280: 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 0d  eName]..      }.
7290: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  ...      if {[ca
72a0: 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
72b0: 20 20 20 20 20 66 69 6c 65 20 63 6f 70 79 20 2d       file copy -
72c0: 66 6f 72 63 65 20 24 73 6f 75 72 63 65 46 69 6c  force $sourceFil
72d0: 65 4e 61 6d 65 20 24 74 61 72 67 65 74 46 69 6c  eName $targetFil
72e0: 65 4e 61 6d 65 7d 5d 20 3d 3d 20 30 7d 20 74 68  eName}] == 0} th
72f0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  en {..        tp
7300: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
7310: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
7320: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
7330: 2d 2d 2d 2d 20 63 6f 70 69 65 64 20 62 69 6e 61  ---- copied bina
7340: 72 79 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22  ry file from \""
7350: 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65   $sourceFileName
7360: 20 22 5c 22 20 74 6f 20 5c 22 22 20 5c 0d 0a 20   "\" to \"" \.. 
7370: 20 20 20 20 20 20 20 20 20 20 20 24 74 61 72 67             $targ
7380: 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d  etFileName \"\n]
7390: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
73a0: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
73b0: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
73c0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
73d0: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
73e0: 20 66 61 69 6c 65 64 20 74 6f 20 63 6f 70 79 20   failed to copy 
73f0: 62 69 6e 61 72 79 20 66 69 6c 65 20 66 72 6f 6d  binary file from
7400: 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65   \"" $sourceFile
7410: 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  Name \..        
7420: 20 20 20 20 22 5c 22 20 74 6f 20 5c 22 22 20 24      "\" to \"" $
7430: 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5c  targetFileName \
7440: 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  "\n]..      }.. 
7450: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
7460: 63 20 74 72 79 43 6f 70 79 42 75 69 6c 64 46 69  c tryCopyBuildFi
7470: 6c 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 6e  le { fileName {n
7480: 65 77 46 69 6c 65 4e 61 6d 65 20 22 22 7d 20 7d  ewFileName ""} }
7490: 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 73 6f   {..      set so
74a0: 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5b 67 65  urceFileName [ge
74b0: 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 24  tBuildFileName $
74c0: 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20  fileName]....   
74d0: 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78     if {![file ex
74e0: 69 73 74 73 20 24 73 6f 75 72 63 65 46 69 6c 65  ists $sourceFile
74f0: 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
7500: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
7510: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
7520: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
7530: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b          "---- sk
7540: 69 70 70 65 64 20 63 6f 70 79 69 6e 67 20 62 75  ipped copying bu
7550: 69 6c 64 20 66 69 6c 65 20 5c 22 22 20 24 73 6f  ild file \"" $so
7560: 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a  urceFileName \..
7570: 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c              "\",
7580: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
7590: 73 74 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20  st\n"]....      
75a0: 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20    return..      
75b0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  }....      if {[
75c0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e  string length $n
75d0: 65 77 46 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d  ewFileName] > 0}
75e0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
75f0: 20 73 65 74 20 74 61 72 67 65 74 46 69 6c 65 4e   set targetFileN
7600: 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69  ame [getBinaryFi
7610: 6c 65 4e 61 6d 65 20 24 6e 65 77 46 69 6c 65 4e  leName $newFileN
7620: 61 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  ame]..      } el
7630: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  se {..        se
7640: 74 20 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65  t targetFileName
7650: 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
7660: 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a  ame $fileName]..
7670: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
7680: 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
7690: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c               fil
76a0: 65 20 63 6f 70 79 20 2d 66 6f 72 63 65 20 24 73  e copy -force $s
76b0: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 24 74  ourceFileName $t
76c0: 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 7d 5d 20  argetFileName}] 
76d0: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
76e0: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
76f0: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
7700: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
7710: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70         "---- cop
7720: 69 65 64 20 62 75 69 6c 64 20 66 69 6c 65 20 66  ied build file f
7730: 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63 65 46  rom \"" $sourceF
7740: 69 6c 65 4e 61 6d 65 20 22 5c 22 20 74 6f 20 5c  ileName "\" to \
7750: 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
7760: 20 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d    $targetFileNam
7770: 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d  e \"\n]..      }
7780: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
7790: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
77a0: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
77b0: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
77c0: 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74    "---- failed t
77d0: 6f 20 63 6f 70 79 20 62 75 69 6c 64 20 66 69 6c  o copy build fil
77e0: 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72  e from \"" $sour
77f0: 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20  ceFileName \..  
7800: 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 74 6f            "\" to
7810: 20 5c 22 22 20 24 74 61 72 67 65 74 46 69 6c 65   \"" $targetFile
7820: 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20  Name \"\n]..    
7830: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
7840: 20 20 20 70 72 6f 63 20 74 72 79 44 65 6c 65 74     proc tryDelet
7850: 65 42 69 6e 61 72 79 46 69 6c 65 20 7b 20 66 69  eBinaryFile { fi
7860: 6c 65 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20  leName } {..    
7870: 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b    set fileName [
7880: 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
7890: 65 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a  e $fileName]....
78a0: 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65        if {![file
78b0: 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d   exists $fileNam
78c0: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
78d0: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
78e0: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
78f0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
7900: 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70       "---- skipp
7910: 65 64 20 64 65 6c 65 74 69 6e 67 20 62 69 6e 61  ed deleting bina
7920: 72 79 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c  ry file \"" $fil
7930: 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  eName \..       
7940: 20 20 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65       "\", it doe
7950: 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d  s not exist\n"].
7960: 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ...        retur
7970: 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  n..      }....  
7980: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
7990: 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66 69 6c  file delete $fil
79a0: 65 4e 61 6d 65 7d 5d 20 3d 3d 20 30 7d 20 74 68  eName}] == 0} th
79b0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  en {..        tp
79c0: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
79d0: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
79e0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
79f0: 2d 2d 2d 2d 20 64 65 6c 65 74 65 64 20 62 69 6e  ---- deleted bin
7a00: 61 72 79 20 66 69 6c 65 20 5c 22 22 20 24 66 69  ary file \"" $fi
7a10: 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20  leName \"\n]..  
7a20: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
7a30: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
7a40: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
7a50: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
7a60: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69         "---- fai
7a70: 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 62 69  led to delete bi
7a80: 6e 61 72 79 20 66 69 6c 65 20 5c 22 22 20 24 66  nary file \"" $f
7a90: 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20  ileName \"\n].. 
7aa0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
7ab0: 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79 44 65  ..    proc tryDe
7ac0: 6c 65 74 65 42 75 69 6c 64 46 69 6c 65 20 7b 20  leteBuildFile { 
7ad0: 66 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20  fileName } {..  
7ae0: 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65      set fileName
7af0: 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61   [getBuildFileNa
7b00: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d  me $fileName]...
7b10: 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c  .      if {![fil
7b20: 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61  e exists $fileNa
7b30: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
7b40: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
7b50: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
7b60: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
7b70: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70        "---- skip
7b80: 70 65 64 20 64 65 6c 65 74 69 6e 67 20 62 75 69  ped deleting bui
7b90: 6c 64 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c  ld file \"" $fil
7ba0: 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  eName \..       
7bb0: 20 20 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65       "\", it doe
7bc0: 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d  s not exist\n"].
7bd0: 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ...        retur
7be0: 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  n..      }....  
7bf0: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
7c00: 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66 69 6c  file delete $fil
7c10: 65 4e 61 6d 65 7d 5d 20 3d 3d 20 30 7d 20 74 68  eName}] == 0} th
7c20: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  en {..        tp
7c30: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
7c40: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
7c50: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
7c60: 2d 2d 2d 2d 20 64 65 6c 65 74 65 64 20 62 75 69  ---- deleted bui
7c70: 6c 64 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c  ld file \"" $fil
7c80: 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  eName \"\n]..   
7c90: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
7ca0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
7cb0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
7cc0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
7cd0: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c        "---- fail
7ce0: 65 64 20 74 6f 20 64 65 6c 65 74 65 20 62 75 69  ed to delete bui
7cf0: 6c 64 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c  ld file \"" $fil
7d00: 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  eName \"\n]..   
7d10: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
7d20: 20 20 20 20 70 72 6f 63 20 74 72 79 43 6f 70 79      proc tryCopy
7d30: 41 73 73 65 6d 62 6c 79 20 7b 20 66 69 6c 65 4e  Assembly { fileN
7d40: 61 6d 65 20 7b 70 64 62 20 74 72 75 65 7d 20 7d  ame {pdb true} }
7d50: 20 7b 0d 0a 20 20 20 20 20 20 74 72 79 43 6f 70   {..      tryCop
7d60: 79 42 75 69 6c 64 46 69 6c 65 20 24 66 69 6c 65  yBuildFile $file
7d70: 4e 61 6d 65 0d 0a 0d 0a 20 20 20 20 20 20 69 66  Name....      if
7d80: 20 7b 24 70 64 62 7d 20 74 68 65 6e 20 7b 0d 0a   {$pdb} then {..
7d90: 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 42          tryCopyB
7da0: 75 69 6c 64 46 69 6c 65 20 5b 61 70 70 65 6e 64  uildFile [append
7db0: 41 72 67 73 20 5b 66 69 6c 65 20 72 6f 6f 74 6e  Args [file rootn
7dc0: 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 20 2e  ame $fileName] .
7dd0: 70 64 62 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  pdb]..      }.. 
7de0: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
7df0: 63 20 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d  c tryDeleteAssem
7e00: 62 6c 79 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b  bly { fileName {
7e10: 70 64 62 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20  pdb true} } {.. 
7e20: 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 42 69       tryDeleteBi
7e30: 6e 61 72 79 46 69 6c 65 20 24 66 69 6c 65 4e 61  naryFile $fileNa
7e40: 6d 65 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  me....      if {
7e50: 24 70 64 62 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  $pdb} then {..  
7e60: 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 42        tryDeleteB
7e70: 69 6e 61 72 79 46 69 6c 65 20 5b 61 70 70 65 6e  inaryFile [appen
7e80: 64 41 72 67 73 20 5b 66 69 6c 65 20 72 6f 6f 74  dArgs [file root
7e90: 6e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 20  name $fileName] 
7ea0: 2e 70 64 62 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  .pdb]..      }..
7eb0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
7ec0: 6f 63 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62  oc tryLoadAssemb
7ed0: 6c 79 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20  ly { fileName } 
7ee0: 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c  {..      set fil
7ef0: 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79  eName [getBinary
7f00: 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61  FileName $fileNa
7f10: 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  me]....      if 
7f20: 7b 5b 63 61 74 63 68 20 7b 73 65 74 20 61 73 73  {[catch {set ass
7f30: 65 6d 62 6c 79 20 5c 0d 0a 20 20 20 20 20 20 20  embly \..       
7f40: 20 20 20 20 20 20 20 5b 6f 62 6a 65 63 74 20 6c         [object l
7f50: 6f 61 64 20 2d 6c 6f 61 64 74 79 70 65 20 46 69  oad -loadtype Fi
7f60: 6c 65 20 2d 61 6c 69 61 73 20 24 66 69 6c 65 4e  le -alias $fileN
7f70: 61 6d 65 5d 7d 5d 20 3d 3d 20 30 7d 20 74 68 65  ame]}] == 0} the
7f80: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
7f90: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
7fa0: 4e 6f 77 2c 20 61 64 64 20 74 68 65 20 6e 65 63  Now, add the nec
7fb0: 65 73 73 61 72 79 20 74 65 73 74 20 63 6f 6e 73  essary test cons
7fc0: 74 72 61 69 6e 74 2e 0d 0a 20 20 20 20 20 20 20  traint...       
7fd0: 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43   #..        addC
7fe0: 6f 6e 73 74 72 61 69 6e 74 20 5b 66 69 6c 65 20  onstraint [file 
7ff0: 72 6f 6f 74 6e 61 6d 65 20 5b 66 69 6c 65 20 74  rootname [file t
8000: 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d  ail $fileName]].
8010: 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
8020: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 47 72        # NOTE: Gr
8030: 61 62 20 74 68 65 20 69 6d 61 67 65 20 72 75 6e  ab the image run
8040: 74 69 6d 65 20 76 65 72 73 69 6f 6e 20 66 72 6f  time version fro
8050: 6d 20 74 68 65 20 61 73 73 65 6d 62 6c 79 20 62  m the assembly b
8060: 65 63 61 75 73 65 0d 0a 20 20 20 20 20 20 20 20  ecause..        
8070: 23 20 20 20 20 20 20 20 73 65 76 65 72 61 6c 20  #       several 
8080: 74 65 73 74 73 20 72 65 6c 79 20 6f 6e 20 69 74  tests rely on it
8090: 20 68 61 76 69 6e 67 20 61 20 63 65 72 74 61 69   having a certai
80a0: 6e 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20  n value...      
80b0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64    #..        add
80c0: 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
80d0: 6e 64 41 72 67 73 20 5b 66 69 6c 65 20 74 61 69  ndArgs [file tai
80e0: 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 20 5f 20 5c  l $fileName] _ \
80f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 24  ..            [$
8100: 61 73 73 65 6d 62 6c 79 20 49 6d 61 67 65 52 75  assembly ImageRu
8110: 6e 74 69 6d 65 56 65 72 73 69 6f 6e 5d 5d 0d 0a  ntimeVersion]]..
8120: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
8130: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74       # NOTE: Ret
8140: 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74  urn the full pat
8150: 68 20 6f 66 20 74 68 65 20 6c 6f 61 64 65 64 20  h of the loaded 
8160: 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  file...        #
8170: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
8180: 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20   $fileName..    
8190: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74    }....      ret
81a0: 75 72 6e 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 0c  urn ""..    }...
81b0: 0d 0a 20 20 20 20 70 72 6f 63 20 69 73 53 51 4c  ..    proc isSQL
81c0: 69 74 65 52 65 61 64 79 20 7b 7d 20 7b 0d 0a 20  iteReady {} {.. 
81d0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
81e0: 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65  NOTE: This proce
81f0: 64 75 72 65 20 6d 75 73 74 20 72 65 74 75 72 6e  dure must return
8200: 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 6c 79 20 69   non-zero only i
8210: 66 20 74 68 65 20 53 51 4c 69 74 65 20 6e 61 74  f the SQLite nat
8220: 69 76 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ive..      #    
8230: 20 20 20 6c 69 62 72 61 72 79 20 61 6e 64 20 74     library and t
8240: 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  he System.Data.S
8250: 51 4c 69 74 65 20 6d 61 6e 61 67 65 64 20 61 73  QLite managed as
8260: 73 65 6d 62 6c 79 20 61 72 65 20 6c 6f 61 64 65  sembly are loade
8270: 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
8280: 20 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20 75   and ready for u
8290: 73 65 20 62 79 20 74 68 65 20 74 65 73 74 20 73  se by the test s
82a0: 75 69 74 65 2e 20 20 43 75 72 72 65 6e 74 6c 79  uite.  Currently
82b0: 2c 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  , this procedure
82c0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
82d0: 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
82e0: 20 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20   only after the 
82f0: 5b 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79  [tryLoadAssembly
8300: 5d 20 70 72 6f 63 65 64 75 72 65 20 68 61 73 0d  ] procedure has.
8310: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62  .      #       b
8320: 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 70 72  een called to pr
8330: 6f 62 65 20 66 6f 72 20 74 68 65 20 53 79 73 74  obe for the Syst
8340: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 6d  em.Data.SQLite m
8350: 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 0d  anaged assembly.
8360: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
8370: 6e 64 20 74 68 65 20 5b 63 68 65 63 6b 46 6f 72  nd the [checkFor
8380: 53 51 4c 69 74 65 5d 20 70 72 6f 63 65 64 75 72  SQLite] procedur
8390: 65 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65  e has been calle
83a0: 64 20 74 6f 20 70 72 6f 62 65 20 66 6f 72 0d 0a  d to probe for..
83b0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
83c0: 65 20 53 51 4c 69 74 65 20 6e 61 74 69 76 65 20  e SQLite native 
83d0: 6c 69 62 72 61 72 79 3b 20 6f 74 68 65 72 77 69  library; otherwi
83e0: 73 65 2c 20 74 68 69 73 20 70 72 6f 63 65 64 75  se, this procedu
83f0: 72 65 20 77 69 6c 6c 20 73 69 6d 70 6c 79 0d 0a  re will simply..
8400: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6c        #       al
8410: 77 61 79 73 20 72 65 74 75 72 6e 20 7a 65 72 6f  ways return zero
8420: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
8430: 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b    return [expr {
8440: 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
8450: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
8460: 74 65 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  te] && \..      
8470: 20 20 20 20 5b 68 61 76 65 43 6f 6e 73 74 72 61      [haveConstra
8480: 69 6e 74 20 53 51 4c 69 74 65 5d 7d 5d 0d 0a 20  int SQLite]}].. 
8490: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
84a0: 63 20 6d 61 74 63 68 4d 61 63 68 69 6e 65 20 7b  c matchMachine {
84b0: 20 70 6c 61 74 66 6f 72 6d 20 7d 20 7b 0d 0a 20   platform } {.. 
84c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
84d0: 4e 4f 54 45 3a 20 41 6e 20 65 6d 70 74 79 20 73  NOTE: An empty s
84e0: 74 72 69 6e 67 20 66 6f 72 20 74 68 65 20 70 6c  tring for the pl
84f0: 61 74 66 6f 72 6d 20 6d 65 61 6e 73 20 74 68 61  atform means tha
8500: 74 20 74 68 65 20 62 75 69 6c 64 20 69 73 20 6e  t the build is n
8510: 6f 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ot..      #     
8520: 20 20 5b 70 72 69 6d 61 72 69 6c 79 5d 20 61 20    [primarily] a 
8530: 6e 61 74 69 76 65 20 62 75 69 6c 64 3b 20 74 68  native build; th
8540: 65 72 65 66 6f 72 65 2c 20 69 74 20 61 6c 77 61  erefore, it alwa
8550: 79 73 20 6d 61 74 63 68 65 73 2e 0d 0a 20 20 20  ys matches...   
8560: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
8570: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
8580: 70 6c 61 74 66 6f 72 6d 5d 20 3d 3d 20 30 7d 20  platform] == 0} 
8590: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
85a0: 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20  return true..   
85b0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
85c0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44  .      # NOTE: D
85d0: 6f 65 73 20 74 68 65 20 73 70 65 63 69 66 69 65  oes the specifie
85e0: 64 20 70 6c 61 74 66 6f 72 6d 20 6d 61 74 63 68  d platform match
85f0: 20 75 70 20 74 6f 20 74 68 65 20 63 75 72 72 65   up to the curre
8600: 6e 74 20 70 72 6f 63 65 73 73 3f 0d 0a 20 20 20  nt process?..   
8610: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
8620: 24 70 6c 61 74 66 6f 72 6d 20 65 71 20 5b 6d 61  $platform eq [ma
8630: 63 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72 6d 20  chineToPlatform 
8640: 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28  $::tcl_platform(
8650: 6d 61 63 68 69 6e 65 29 5d 7d 20 74 68 65 6e 20  machine)]} then 
8660: 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
8670: 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d  n true..      }.
8680: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
8690: 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 73 70    # NOTE: The sp
86a0: 65 63 69 66 69 65 64 20 70 6c 61 74 66 6f 72 6d  ecified platform
86b0: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
86c0: 75 70 20 77 69 74 68 20 74 68 65 20 70 6c 61 74  up with the plat
86d0: 66 6f 72 6d 0d 0a 20 20 20 20 20 20 23 20 20 20  form..      #   
86e0: 20 20 20 20 66 6f 72 20 74 68 65 20 63 75 72 72      for the curr
86f0: 65 6e 74 20 70 72 6f 63 65 73 73 2e 0d 0a 20 20  ent process...  
8700: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74      #..      ret
8710: 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d  urn false..    }
8720: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68  .....    proc ch
8730: 65 63 6b 46 6f 72 53 51 4c 69 74 65 42 75 69 6c  eckForSQLiteBuil
8740: 64 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 73 65  ds { channel {se
8750: 6c 65 63 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  lect false} } {.
8760: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
8770: 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f  # NOTE: Check fo
8780: 72 20 65 76 65 72 79 20 70 6f 73 73 69 62 6c 65  r every possible
8790: 20 76 61 6c 69 64 20 63 6f 6d 62 69 6e 61 74 69   valid combinati
87a0: 6f 6e 20 6f 66 20 76 61 6c 75 65 73 20 75 73 65  on of values use
87b0: 64 20 77 68 65 6e 0d 0a 20 20 20 20 20 20 23 20  d when..      # 
87c0: 20 20 20 20 20 20 6c 6f 63 61 74 69 6e 67 20 6f        locating o
87d0: 75 74 20 74 68 65 20 62 75 69 6c 64 20 6f 75 74  ut the build out
87e0: 70 75 74 20 64 69 72 65 63 74 6f 72 79 2c 20 73  put directory, s
87f0: 68 6f 77 69 6e 67 20 65 61 63 68 20 61 76 61 69  howing each avai
8800: 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20 23 20 20  lable..      #  
8810: 20 20 20 20 20 62 75 69 6c 64 20 76 61 72 69 61       build varia
8820: 74 69 6f 6e 20 61 6c 6f 6e 67 20 74 68 65 20 77  tion along the w
8830: 61 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ay...      #..  
8840: 20 20 20 20 66 6f 72 65 61 63 68 20 6e 61 74 69      foreach nati
8850: 76 65 20 5b 6c 69 73 74 20 66 61 6c 73 65 20 74  ve [list false t
8860: 72 75 65 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20  rue] {..        
8870: 66 6f 72 65 61 63 68 20 79 65 61 72 20 5b 67 65  foreach year [ge
8880: 74 42 75 69 6c 64 59 65 61 72 73 5d 20 7b 0d 0a  tBuildYears] {..
8890: 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
88a0: 68 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  h configuration 
88b0: 5b 67 65 74 42 75 69 6c 64 43 6f 6e 66 69 67 75  [getBuildConfigu
88c0: 72 61 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20  rations] {..    
88d0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
88e0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46         # NOTE: F
88f0: 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 65 66  igure out the ef
8900: 66 65 63 74 69 76 65 20 62 75 69 6c 64 20 70 6c  fective build pl
8910: 61 74 66 6f 72 6d 2e 20 20 54 68 69 73 20 69 73  atform.  This is
8920: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
8930: 20 20 20 20 20 20 62 61 73 65 64 20 6f 6e 20 77        based on w
8940: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
8950: 5b 70 72 69 6d 61 72 69 6c 79 5d 20 6e 61 74 69  [primarily] nati
8960: 76 65 20 62 75 69 6c 64 0d 0a 20 20 20 20 20 20  ve build..      
8970: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 73        #       is
8980: 20 62 65 69 6e 67 20 75 73 65 64 2e 20 20 46 6f   being used.  Fo
8990: 72 20 5b 70 72 69 6d 61 72 69 6c 79 5d 20 6e 6f  r [primarily] no
89a0: 6e 2d 6e 61 74 69 76 65 20 62 75 69 6c 64 73 2c  n-native builds,
89b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
89c0: 20 20 20 20 20 20 74 68 69 73 20 77 69 6c 6c 20        this will 
89d0: 62 65 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  be an empty stri
89e0: 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ng...           
89f0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
8a00: 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 5b 67 65  set platform [ge
8a10: 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20 24  tBuildPlatform $
8a20: 6e 61 74 69 76 65 5d 0d 0a 0d 0a 20 20 20 20 20  native]....     
8a30: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
8a40: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
8a50: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
8a60: 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b       "---- check
8a70: 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e 44  ing for System.D
8a80: 61 74 61 2e 53 51 4c 69 74 65 20 62 75 69 6c 64  ata.SQLite build
8a90: 20 5c 22 22 20 5b 65 78 70 72 20 5c 0d 0a 20 20   \"" [expr \..  
8aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 24                {$
8ab0: 6e 61 74 69 76 65 20 3f 20 22 6e 61 74 69 76 65  native ? "native
8ac0: 2f 22 20 3a 20 22 22 7d 5d 20 5b 65 78 70 72 20  /" : ""}] [expr 
8ad0: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
8ae0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
8af0: 20 20 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20     $platform] > 
8b00: 30 20 3f 20 5b 61 70 70 65 6e 64 41 72 67 73 20  0 ? [appendArgs 
8b10: 24 70 6c 61 74 66 6f 72 6d 20 2f 5d 20 3a 20 22  $platform /] : "
8b20: 22 7d 5d 20 24 79 65 61 72 20 5c 0d 0a 20 20 20  "}] $year \..   
8b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 20 24               / $
8b40: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 22 5c  configuration "\
8b50: 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20  "... "]....     
8b60: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
8b70: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75        # NOTE: Bu
8b80: 69 6c 64 20 74 68 65 20 66 75 6c 6c 79 20 71 75  ild the fully qu
8b90: 61 6c 69 66 69 65 64 20 64 69 72 65 63 74 6f 72  alified director
8ba0: 79 20 77 68 65 72 65 20 74 68 65 20 6e 65 63 65  y where the nece
8bb0: 73 73 61 72 79 0d 0a 20 20 20 20 20 20 20 20 20  ssary..         
8bc0: 20 20 20 23 20 20 20 20 20 20 20 63 6f 6d 70 6f     #       compo
8bd0: 6e 65 6e 74 73 20 66 6f 72 20 53 79 73 74 65 6d  nents for System
8be0: 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 73 68 6f  .Data.SQLite sho
8bf0: 75 6c 64 20 62 65 20 66 6f 75 6e 64 2e 0d 0a 20  uld be found... 
8c00: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
8c10: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 64 69            set di
8c20: 72 65 63 74 6f 72 79 20 5b 6a 6f 69 6e 42 75 69  rectory [joinBui
8c30: 6c 64 44 69 72 65 63 74 6f 72 79 20 24 6e 61 74  ldDirectory $nat
8c40: 69 76 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ive \..         
8c50: 20 20 20 20 20 20 20 5b 67 65 74 42 75 69 6c 64         [getBuild
8c60: 42 61 73 65 44 69 72 65 63 74 6f 72 79 5d 20 24  BaseDirectory] $
8c70: 79 65 61 72 20 24 70 6c 61 74 66 6f 72 6d 20 24  year $platform $
8c80: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a  configuration]..
8c90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
8ca0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
8cb0: 4f 54 45 3a 20 44 6f 20 74 68 65 20 6e 65 63 65  OTE: Do the nece
8cc0: 73 73 61 72 79 20 66 69 6c 65 73 20 65 78 69 73  ssary files exis
8cd0: 74 3f 20 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e  t?  Currently, n
8ce0: 6f 20 6f 74 68 65 72 20 73 74 65 70 73 0d 0a 20  o other steps.. 
8cf0: 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
8d00: 20 20 20 61 72 65 20 74 61 6b 65 6e 20 74 6f 20     are taken to 
8d10: 76 65 72 69 66 79 20 74 68 69 73 20 62 75 69 6c  verify this buil
8d20: 64 20 69 73 20 61 63 74 75 61 6c 6c 79 20 76 69  d is actually vi
8d30: 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20  able...         
8d40: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
8d50: 20 20 69 66 20 7b 5b 69 73 42 75 69 6c 64 41 76    if {[isBuildAv
8d60: 61 69 6c 61 62 6c 65 20 24 6e 61 74 69 76 65 20  ailable $native 
8d70: 24 64 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65  $directory]} the
8d80: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
8d90: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
8da0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 68 65 6e      # NOTE: When
8db0: 20 69 6e 20 22 73 65 6c 65 63 74 22 20 6d 6f 64   in "select" mod
8dc0: 65 2c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  e, automatically
8dd0: 20 73 65 6c 65 63 74 20 74 68 65 20 66 69 72 73   select the firs
8de0: 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t..             
8df0: 20 23 20 20 20 20 20 20 20 61 76 61 69 6c 61 62   #       availab
8e00: 6c 65 20 62 75 69 6c 64 20 6f 66 20 53 79 73 74  le build of Syst
8e10: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 61  em.Data.SQLite a
8e20: 6e 64 20 74 68 65 6e 20 72 65 74 75 72 6e 0d 0a  nd then return..
8e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
8e40: 20 20 20 20 20 20 69 6d 6d 65 64 69 61 74 65 6c        immediatel
8e50: 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y...            
8e60: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
8e70: 20 20 20 69 66 20 7b 24 73 65 6c 65 63 74 20 26     if {$select &
8e80: 26 20 5b 6d 61 74 63 68 4d 61 63 68 69 6e 65 20  & [matchMachine 
8e90: 24 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e  $platform]} then
8ea0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
8eb0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
8ec0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d         # NOTE: M
8ed0: 61 6e 75 61 6c 6c 79 20 6f 76 65 72 72 69 64 65  anually override
8ee0: 20 61 6c 6c 20 74 68 65 20 62 75 69 6c 64 20 64   all the build d
8ef0: 69 72 65 63 74 6f 72 79 20 73 65 6c 65 63 74 69  irectory selecti
8f00: 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  on..            
8f10: 20 20 20 20 23 20 20 20 20 20 20 20 72 65 6c 61      #       rela
8f20: 74 65 64 20 74 65 73 74 20 73 65 74 74 69 6e 67  ted test setting
8f30: 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 6f  s in order to fo
8f40: 72 63 65 20 74 68 69 73 20 62 75 69 6c 64 0d 0a  rce this build..
8f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f60: 23 20 20 20 20 20 20 20 6f 66 20 53 79 73 74 65  #       of Syste
8f70: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 74 6f  m.Data.SQLite to
8f80: 20 62 65 20 75 73 65 64 2e 0d 0a 20 20 20 20 20   be used...     
8f90: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
8fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 62                ob
8fb0: 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49 6e 74 65  ject invoke Inte
8fc0: 72 70 72 65 74 65 72 2e 47 65 74 41 63 74 69 76  rpreter.GetActiv
8fd0: 65 20 5b 65 78 70 72 20 7b 24 6e 61 74 69 76 65  e [expr {$native
8fe0: 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   ? \..          
8ff0: 20 20 20 20 20 20 20 20 20 20 22 41 64 64 52 75            "AddRu
9000: 6e 74 69 6d 65 4f 70 74 69 6f 6e 22 20 3a 20 22  ntimeOption" : "
9010: 52 65 6d 6f 76 65 52 75 6e 74 69 6d 65 4f 70 74  RemoveRuntimeOpt
9020: 69 6f 6e 22 7d 5d 20 20 6e 61 74 69 76 65 0d 0a  ion"}]  native..
9030: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
9040: 20 20 73 65 74 20 3a 3a 74 65 73 74 5f 79 65 61    set ::test_yea
9050: 72 20 24 79 65 61 72 0d 0a 20 20 20 20 20 20 20  r $year..       
9060: 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 74           set ::t
9070: 65 73 74 5f 70 6c 61 74 66 6f 72 6d 20 24 70 6c  est_platform $pl
9080: 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20  atform..        
9090: 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65          set ::te
90a0: 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  st_configuration
90b0: 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0d   $configuration.
90c0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
90d0: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
90e0: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
90f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9100: 20 20 20 20 20 22 79 65 73 2c 20 73 65 6c 65 63       "yes, selec
9110: 74 65 64 20 28 22 20 5b 65 78 70 72 20 7b 24 6e  ted (" [expr {$n
9120: 61 74 69 76 65 20 3f 20 22 6e 61 74 69 76 65 2f  ative ? "native/
9130: 22 20 3a 20 22 22 7d 5d 20 5c 0d 0a 20 20 20 20  " : ""}] \..    
9140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9150: 5b 65 78 70 72 20 7b 5b 73 74 72 69 6e 67 20 6c  [expr {[string l
9160: 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d  ength $platform]
9170: 20 3e 20 30 20 3f 20 5b 61 70 70 65 6e 64 41 72   > 0 ? [appendAr
9180: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
9190: 20 20 20 20 20 20 20 20 20 20 24 70 6c 61 74 66            $platf
91a0: 6f 72 6d 20 2f 5d 20 3a 20 22 22 7d 5d 20 24 79  orm /] : ""}] $y
91b0: 65 61 72 20 2f 20 24 63 6f 6e 66 69 67 75 72 61  ear / $configura
91c0: 74 69 6f 6e 20 22 29 5c 6e 22 5d 0d 0a 0d 0a 20  tion ")\n"].... 
91d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
91e0: 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20  eturn true..    
91f0: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
9200: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
9210: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
9220: 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20  el yes\n..      
9230: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
9240: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
9250: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
9260: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
9270: 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  \n..            
9280: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
9290: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
92a0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
92b0: 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d  rn false..    }.
92c0: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65  ....    proc che
92d0: 63 6b 46 6f 72 53 51 4c 69 74 65 52 65 6c 65 61  ckForSQLiteRelea
92e0: 73 65 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 73  ses { channel {s
92f0: 65 6c 65 63 74 20 66 61 6c 73 65 7d 20 7d 20 7b  elect false} } {
9300: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
9310: 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66   # NOTE: Check f
9320: 6f 72 20 70 61 73 74 20 72 65 6c 65 61 73 65 73  or past releases
9330: 20 6f 66 20 53 79 73 74 65 6d 2e 44 61 74 61 2e   of System.Data.
9340: 53 51 4c 69 74 65 20 69 6e 20 74 68 65 20 64 69  SQLite in the di
9350: 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 23  rectory..      #
9360: 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 65 64         contained
9370: 20 69 6e 20 74 68 65 20 22 53 79 73 74 65 6d 2e   in the "System.
9380: 44 61 74 61 2e 53 51 4c 69 74 65 22 20 65 6e 76  Data.SQLite" env
9390: 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c  ironment variabl
93a0: 65 2c 20 69 66 0d 0a 20 20 20 20 20 20 23 20 20  e, if..      #  
93b0: 20 20 20 20 20 70 72 65 73 65 6e 74 2e 0d 0a 20       present... 
93c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
93d0: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
93e0: 3a 65 6e 76 28 53 79 73 74 65 6d 2e 44 61 74 61  :env(System.Data
93f0: 2e 53 51 4c 69 74 65 29 5d 20 26 26 20 5c 0d 0a  .SQLite)] && \..
9400: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
9410: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 65 6e 76 28  g length $::env(
9420: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
9430: 74 65 29 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  te)] > 0} then {
9440: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
9450: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69       # NOTE: Bui
9460: 6c 64 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61  ld the fully qua
9470: 6c 69 66 69 65 64 20 64 69 72 65 63 74 6f 72 79  lified directory
9480: 20 77 68 65 72 65 20 74 68 65 20 6e 65 63 65 73   where the neces
9490: 73 61 72 79 0d 0a 20 20 20 20 20 20 20 20 23 20  sary..        # 
94a0: 20 20 20 20 20 20 63 6f 6d 70 6f 6e 65 6e 74 73        components
94b0: 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61   for System.Data
94c0: 2e 53 51 4c 69 74 65 20 73 68 6f 75 6c 64 20 62  .SQLite should b
94d0: 65 20 66 6f 75 6e 64 2e 0d 0a 20 20 20 20 20 20  e found...      
94e0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74    #..        set
94f0: 20 64 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65   directory [file
9500: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
9510: 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20  e join \..      
9520: 20 20 20 20 20 20 24 3a 3a 65 6e 76 28 53 79 73        $::env(Sys
9530: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 29  tem.Data.SQLite)
9540: 20 5b 67 65 74 52 65 6c 65 61 73 65 56 65 72 73   [getReleaseVers
9550: 69 6f 6e 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  ion]]]....      
9560: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
9570: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
9580: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
9590: 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53  - checking for S
95a0: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
95b0: 65 20 72 65 6c 65 61 73 65 20 5c 22 22 20 5c 0d  e release \"" \.
95c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 64 69  .            $di
95d0: 72 65 63 74 6f 72 79 20 22 5c 22 2e 2e 2e 20 22  rectory "\"... "
95e0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  ]....        if 
95f0: 7b 5b 69 73 52 65 6c 65 61 73 65 41 76 61 69 6c  {[isReleaseAvail
9600: 61 62 6c 65 20 24 64 69 72 65 63 74 6f 72 79 20  able $directory 
9610: 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20  platform]} then 
9620: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
9630: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
9640: 24 70 6c 61 74 66 6f 72 6d 5d 20 3d 3d 20 30 7d  $platform] == 0}
9650: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
9660: 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72       set platfor
9670: 6d 20 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20  m unknown..     
9680: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
9690: 20 20 20 20 69 66 20 7b 24 73 65 6c 65 63 74 20      if {$select 
96a0: 26 26 20 5b 6d 61 74 63 68 4d 61 63 68 69 6e 65  && [matchMachine
96b0: 20 24 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65   $platform]} the
96c0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
96d0: 20 73 65 74 20 3a 3a 62 75 69 6c 64 5f 64 69 72   set ::build_dir
96e0: 65 63 74 6f 72 79 20 24 64 69 72 65 63 74 6f 72  ectory $director
96f0: 79 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  y....           
9700: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
9710: 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73  [appendArgs "yes
9720: 2c 20 73 65 6c 65 63 74 65 64 20 28 22 20 24 70  , selected (" $p
9730: 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a  latform ")\n"]..
9740: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
9750: 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20  turn true..     
9760: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
9770: 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
9780: 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
9790: 64 41 72 67 73 20 22 79 65 73 20 28 22 20 24 70  dArgs "yes (" $p
97a0: 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a  latform ")\n"]..
97b0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
97c0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
97d0: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
97e0: 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 0d 0a  channel no\n....
97f0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
9800: 68 20 70 61 74 68 20 5b 6c 73 6f 72 74 20 2d 64  h path [lsort -d
9810: 65 63 72 65 61 73 69 6e 67 20 5b 66 69 6c 65 20  ecreasing [file 
9820: 6c 69 73 74 20 24 64 69 72 65 63 74 6f 72 79 20  list $directory 
9830: 2a 5d 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  *]] {..         
9840: 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69     if {[file exi
9850: 73 74 73 20 24 70 61 74 68 5d 20 26 26 20 5b 66  sts $path] && [f
9860: 69 6c 65 20 69 73 64 69 72 65 63 74 6f 72 79 20  ile isdirectory 
9870: 24 70 61 74 68 5d 7d 20 74 68 65 6e 20 7b 0d 0a  $path]} then {..
9880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
9890: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
98a0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
98b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
98c0: 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
98d0: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
98e0: 69 74 65 20 72 65 6c 65 61 73 65 20 5c 22 22 20  ite release \"" 
98f0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
9900: 20 20 20 20 20 24 70 61 74 68 20 22 5c 22 2e 2e       $path "\"..
9910: 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  . "]....        
9920: 20 20 20 20 20 20 69 66 20 7b 5b 69 73 52 65 6c        if {[isRel
9930: 65 61 73 65 41 76 61 69 6c 61 62 6c 65 20 24 70  easeAvailable $p
9940: 61 74 68 20 70 6c 61 74 66 6f 72 6d 5d 7d 20 74  ath platform]} t
9950: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
9960: 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
9970: 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66  ng length $platf
9980: 6f 72 6d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  orm] == 0} then 
9990: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
99a0: 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72       set platfor
99b0: 6d 20 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20  m unknown..     
99c0: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
99d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99e0: 69 66 20 7b 24 73 65 6c 65 63 74 20 26 26 20 5b  if {$select && [
99f0: 6d 61 74 63 68 4d 61 63 68 69 6e 65 20 24 70 6c  matchMachine $pl
9a00: 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d  atform]} then {.
9a10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9a20: 20 20 20 73 65 74 20 3a 3a 62 75 69 6c 64 5f 64     set ::build_d
9a30: 69 72 65 63 74 6f 72 79 20 24 70 61 74 68 0d 0a  irectory $path..
9a40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
9a50: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
9a60: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  el [appendArgs "
9a70: 79 65 73 2c 20 73 65 6c 65 63 74 65 64 20 28 22  yes, selected ("
9a80: 20 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22   $platform ")\n"
9a90: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
9aa0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
9ab0: 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue..            
9ac0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
9ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ae0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
9af0: 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73 20  appendArgs "yes 
9b00: 28 22 20 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c  (" $platform ")\
9b10: 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n"]..           
9b20: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
9b30: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
9b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b50: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e  tputs $channel n
9b60: 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  o\n..           
9b70: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
9b80: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
9b90: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
9ba0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
9bb0: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
9bc0: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
9bd0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
9be0: 2d 2d 2d 2d 20 65 6e 76 69 72 6f 6e 6d 65 6e 74  ---- environment
9bf0: 20 76 61 72 69 61 62 6c 65 20 5c 22 53 79 73 74   variable \"Syst
9c00: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 5c 22  em.Data.SQLite\"
9c10: 20 69 73 20 6e 6f 74 20 22 20 5c 0d 0a 20 20 20   is not " \..   
9c20: 20 20 20 20 20 20 20 20 20 22 73 65 74 2c 20 73           "set, s
9c30: 6b 69 70 70 69 6e 67 20 63 68 65 63 6b 20 66 6f  kipping check fo
9c40: 72 20 72 65 6c 65 61 73 65 73 2e 2e 2e 5c 6e 22  r releases...\n"
9c50: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ]..      }....  
9c60: 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
9c70: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
9c80: 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51 4c  proc checkForSQL
9c90: 69 74 65 4c 69 62 72 61 72 79 20 7b 20 63 68 61  iteLibrary { cha
9ca0: 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20  nnel } {..      
9cb0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
9cc0: 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
9cd0: 72 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69  r SQLite core li
9ce0: 62 72 61 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20  brary... "....  
9cf0: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
9d00: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
9d10: 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
9d20: 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
9d30: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
9d40: 74 65 2e 53 51 4c 69 74 65 33 20 5c 0d 0a 20 20  te.SQLite3 \..  
9d50: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 69              SQLi
9d60: 74 65 56 65 72 73 69 6f 6e 7d 20 76 65 72 73 69  teVersion} versi
9d70: 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  on] == 0} then {
9d80: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
9d90: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
9da0: 63 6b 20 69 66 20 74 68 65 20 72 65 74 75 72 6e  ck if the return
9db0: 65 64 20 76 65 72 73 69 6f 6e 20 77 61 73 20 6e  ed version was n
9dc0: 75 6c 6c 2e 20 20 49 66 20 73 6f 2c 20 6d 61 6b  ull.  If so, mak
9dd0: 65 20 69 74 20 65 61 73 79 0d 0a 20 20 20 20 20  e it easy..     
9de0: 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 73 70     #       to sp
9df0: 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ot...        #..
9e00: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
9e10: 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72 73  ing length $vers
9e20: 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ion] == 0} then 
9e30: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
9e40: 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20   version null.. 
9e50: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
9e60: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
9e70: 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
9e80: 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f 73 73  o query the Foss
9e90: 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69  il source identi
9ea0: 66 69 65 72 20 66 6f 72 20 74 68 65 20 53 51 4c  fier for the SQL
9eb0: 69 74 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ite..        #  
9ec0: 20 20 20 20 20 63 6f 72 65 20 6c 69 62 72 61 72       core librar
9ed0: 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  y...        #.. 
9ee0: 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
9ef0: 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
9f00: 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
9f10: 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
9f20: 62 6c 69 63 20 53 79 73 74 65 6d 2e 44 61 74 61  blic System.Data
9f30: 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20  .SQLite.SQLite3 
9f40: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
9f50: 20 20 20 53 51 4c 69 74 65 53 6f 75 72 63 65 49     SQLiteSourceI
9f60: 64 7d 20 73 6f 75 72 63 65 49 64 5d 7d 20 74 68  d} sourceId]} th
9f70: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
9f80: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
9f90: 4f 54 45 3a 20 57 65 20 66 61 69 6c 65 64 20 74  OTE: We failed t
9fa0: 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f 73 73  o query the Foss
9fb0: 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69  il source identi
9fc0: 66 69 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20  fier...         
9fd0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   #..          se
9fe0: 74 20 73 6f 75 72 63 65 49 64 20 75 6e 6b 6e 6f  t sourceId unkno
9ff0: 77 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  wn..        }...
a000: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
a010: 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
a020: 6b 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 65  k if the returne
a030: 64 20 46 6f 73 73 69 6c 20 73 6f 75 72 63 65 20  d Fossil source 
a040: 69 64 65 6e 74 69 66 69 65 72 20 77 61 73 20 6e  identifier was n
a050: 75 6c 6c 2e 20 20 49 66 0d 0a 20 20 20 20 20 20  ull.  If..      
a060: 20 20 23 20 20 20 20 20 20 20 73 6f 2c 20 6d 61    #       so, ma
a070: 6b 65 20 69 74 20 65 61 73 79 20 74 6f 20 73 70  ke it easy to sp
a080: 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ot...        #..
a090: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
a0a0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 6f 75 72  ing length $sour
a0b0: 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ceId] == 0} then
a0c0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
a0d0: 74 20 73 6f 75 72 63 65 49 64 20 6e 75 6c 6c 0d  t sourceId null.
a0e0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
a0f0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
a100: 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 74 68   # NOTE: Yes, th
a110: 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69  e SQLite core li
a120: 62 72 61 72 79 20 61 70 70 65 61 72 73 20 74 6f  brary appears to
a130: 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a   be available...
a140: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
a150: 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
a160: 20 53 51 4c 69 74 65 0d 0a 0d 0a 20 20 20 20 20   SQLite....     
a170: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
a180: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79  l [appendArgs "y
a190: 65 73 20 28 22 20 24 76 65 72 73 69 6f 6e 20 22  es (" $version "
a1a0: 20 22 20 24 73 6f 75 72 63 65 49 64 20 22 29 5c   " $sourceId ")\
a1b0: 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  n"]..      } els
a1c0: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e {..        tpu
a1d0: 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e  ts $channel no\n
a1e0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
a1f0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68  .....    proc ch
a200: 65 63 6b 46 6f 72 53 51 4c 69 74 65 49 6e 74 65  eckForSQLiteInte
a210: 72 6f 70 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20  rop { channel } 
a220: 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24  {..      tputs $
a230: 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68  channel "---- ch
a240: 65 63 6b 69 6e 67 20 66 6f 72 20 53 51 4c 69 74  ecking for SQLit
a250: 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62  e interop assemb
a260: 6c 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  ly... "....     
a270: 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
a280: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a               obj
a290: 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
a2a0: 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 53 79 73  s +NonPublic Sys
a2b0: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
a2c0: 53 51 4c 69 74 65 33 20 5c 0d 0a 20 20 20 20 20  SQLite3 \..     
a2d0: 20 20 20 20 20 20 20 20 20 49 6e 74 65 72 6f 70           Interop
a2e0: 56 65 72 73 69 6f 6e 7d 20 76 65 72 73 69 6f 6e  Version} version
a2f0: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
a300: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
a310: 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
a320: 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 65 64   if the returned
a330: 20 76 65 72 73 69 6f 6e 20 77 61 73 20 6e 75 6c   version was nul
a340: 6c 2e 20 20 49 66 20 73 6f 2c 20 6d 61 6b 65 20  l.  If so, make 
a350: 69 74 20 65 61 73 79 0d 0a 20 20 20 20 20 20 20  it easy..       
a360: 20 23 20 20 20 20 20 20 20 74 6f 20 73 70 6f 74   #       to spot
a370: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
a380: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
a390: 67 20 6c 65 6e 67 74 68 20 24 76 65 72 73 69 6f  g length $versio
a3a0: 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  n] == 0} then {.
a3b0: 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 76  .          set v
a3c0: 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20 20 20  ersion null..   
a3d0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
a3e0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
a3f0: 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20  OTE: Attempt to 
a400: 71 75 65 72 79 20 74 68 65 20 46 6f 73 73 69 6c  query the Fossil
a410: 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69 66 69   source identifi
a420: 65 72 20 66 6f 72 20 74 68 65 20 53 51 4c 69 74  er for the SQLit
a430: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
a440: 20 20 20 63 6f 72 65 20 6c 69 62 72 61 72 79 2e     core library.
a450: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
a460: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
a470: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
a480: 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
a490: 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
a4a0: 69 63 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  ic System.Data.S
a4b0: 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 5c 0d  QLite.SQLite3 \.
a4c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a4d0: 20 49 6e 74 65 72 6f 70 53 6f 75 72 63 65 49 64   InteropSourceId
a4e0: 7d 20 73 6f 75 72 63 65 49 64 5d 7d 20 74 68 65  } sourceId]} the
a4f0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  n {..          #
a500: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
a510: 54 45 3a 20 57 65 20 66 61 69 6c 65 64 20 74 6f  TE: We failed to
a520: 20 71 75 65 72 79 20 74 68 65 20 46 6f 73 73 69   query the Fossi
a530: 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69 66  l source identif
a540: 69 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ier...          
a550: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  #..          set
a560: 20 73 6f 75 72 63 65 49 64 20 75 6e 6b 6e 6f 77   sourceId unknow
a570: 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  n..        }....
a580: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
a590: 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
a5a0: 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 65 64   if the returned
a5b0: 20 46 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69   Fossil source i
a5c0: 64 65 6e 74 69 66 69 65 72 20 77 61 73 20 6e 75  dentifier was nu
a5d0: 6c 6c 2e 20 20 49 66 0d 0a 20 20 20 20 20 20 20  ll.  If..       
a5e0: 20 23 20 20 20 20 20 20 20 73 6f 2c 20 6d 61 6b   #       so, mak
a5f0: 65 20 69 74 20 65 61 73 79 20 74 6f 20 73 70 6f  e it easy to spo
a600: 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
a610: 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
a620: 6e 67 20 6c 65 6e 67 74 68 20 24 73 6f 75 72 63  ng length $sourc
a630: 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  eId] == 0} then 
a640: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
a650: 20 73 6f 75 72 63 65 49 64 20 6e 75 6c 6c 0d 0a   sourceId null..
a660: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
a670: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
a680: 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 74 68 65  # NOTE: Yes, the
a690: 20 53 51 4c 69 74 65 20 69 6e 74 65 72 6f 70 20   SQLite interop 
a6a0: 61 73 73 65 6d 62 6c 79 20 61 70 70 65 61 72 73  assembly appears
a6b0: 20 74 6f 20 62 65 20 61 76 61 69 6c 61 62 6c 65   to be available
a6c0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
a6d0: 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
a6e0: 69 6e 74 20 53 51 4c 69 74 65 49 6e 74 65 72 6f  int SQLiteIntero
a6f0: 70 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75  p....        tpu
a700: 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
a710: 65 6e 64 41 72 67 73 20 22 79 65 73 20 28 22 20  endArgs "yes (" 
a720: 24 76 65 72 73 69 6f 6e 20 22 20 22 20 24 73 6f  $version " " $so
a730: 75 72 63 65 49 64 20 22 29 5c 6e 22 5d 0d 0a 20  urceId ")\n"].. 
a740: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
a750: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
a760: 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20  annel no\n..    
a770: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
a780: 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72     proc checkFor
a790: 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73  SQLiteDefineCons
a7a0: 74 61 6e 74 20 7b 20 63 68 61 6e 6e 65 6c 20 6e  tant { channel n
a7b0: 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74  ame } {..      t
a7c0: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
a7d0: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
a7e0: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65         "---- che
a7f0: 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d  cking for System
a800: 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 64 65 66  .Data.SQLite def
a810: 69 6e 65 20 63 6f 6e 73 74 61 6e 74 20 5c 22 22  ine constant \""
a820: 20 24 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20   $name \..      
a830: 20 20 20 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d      "\"... "]...
a840: 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63  .      if {[catc
a850: 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
a860: 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
a870: 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
a880: 69 63 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  ic System.Data.S
a890: 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 5c 0d  QLite.SQLite3 \.
a8a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 44  .              D
a8b0: 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73 7d 20  efineConstants} 
a8c0: 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73 5d  defineConstants]
a8d0: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
a8e0: 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 73 65 61         if {[lsea
a8f0: 72 63 68 20 2d 65 78 61 63 74 20 2d 6e 6f 63 61  rch -exact -noca
a900: 73 65 20 24 64 65 66 69 6e 65 43 6f 6e 73 74 61  se $defineConsta
a910: 6e 74 73 20 24 6e 61 6d 65 5d 20 21 3d 20 2d 31  nts $name] != -1
a920: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
a930: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
a940: 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 74 68   # NOTE: Yes, th
a950: 69 73 20 64 65 66 69 6e 65 20 63 6f 6e 73 74 61  is define consta
a960: 6e 74 20 77 61 73 20 65 6e 61 62 6c 65 64 20 77  nt was enabled w
a970: 68 65 6e 20 74 68 65 20 6d 61 6e 61 67 65 64 0d  hen the managed.
a980: 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
a990: 20 20 20 61 73 73 65 6d 62 6c 79 20 77 61 73 20     assembly was 
a9a0: 63 6f 6d 70 69 6c 65 64 2e 0d 0a 20 20 20 20 20  compiled...     
a9b0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
a9c0: 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
a9d0: 5b 61 70 70 65 6e 64 41 72 67 73 20 64 65 66 69  [appendArgs defi
a9e0: 6e 65 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74 65  neConstant.Syste
a9f0: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 20 24  m.Data.SQLite. $
aa00: 6e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  name]....       
aa10: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
aa20: 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 20  l yes\n..       
aa30: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
aa40: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
aa50: 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20  nel no\n..      
aa60: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73    }..      } els
aa70: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e {..        tpu
aa80: 74 73 20 24 63 68 61 6e 6e 65 6c 20 65 72 72 6f  ts $channel erro
aa90: 72 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  r\n..      }..  
aaa0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
aab0: 20 67 65 74 44 61 74 65 54 69 6d 65 46 6f 72 6d   getDateTimeForm
aac0: 61 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  at {} {..      #
aad0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
aae0: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 73  This procedure s
aaf0: 69 6d 70 6c 79 20 72 65 74 75 72 6e 73 20 74 68  imply returns th
ab00: 65 20 22 64 65 66 61 75 6c 74 22 20 44 61 74 65  e "default" Date
ab10: 54 69 6d 65 20 66 6f 72 6d 61 74 20 75 73 65 64  Time format used
ab20: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
ab30: 62 79 20 74 68 65 20 74 65 73 74 20 73 75 69 74  by the test suit
ab40: 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
ab50: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
ab60: 73 74 73 20 3a 3a 64 61 74 65 74 69 6d 65 5f 66  sts ::datetime_f
ab70: 6f 72 6d 61 74 5d 20 26 26 20 5c 0d 0a 20 20 20  ormat] && \..   
ab80: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
ab90: 65 6e 67 74 68 20 24 3a 3a 64 61 74 65 74 69 6d  ength $::datetim
aba0: 65 5f 66 6f 72 6d 61 74 5d 20 3e 20 30 7d 20 74  e_format] > 0} t
abb0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
abc0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
abd0: 3a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 61 6e  : Return the man
abe0: 75 61 6c 6c 79 20 6f 76 65 72 72 69 64 64 65 6e  ually overridden
abf0: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 44   value for the D
ac00: 61 74 65 54 69 6d 65 20 66 6f 72 6d 61 74 2e 0d  ateTime format..
ac10: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
ac20: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 64 61      return $::da
ac30: 74 65 74 69 6d 65 5f 66 6f 72 6d 61 74 0d 0a 20  tetime_format.. 
ac40: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
ac50: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
ac60: 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e    # NOTE: Return
ac70: 20 61 6e 20 49 53 4f 38 36 30 31 20 44 61 74 65   an ISO8601 Date
ac80: 54 69 6d 65 20 66 6f 72 6d 61 74 20 63 6f 6d 70  Time format comp
ac90: 61 74 69 62 6c 65 20 77 69 74 68 20 53 51 4c 69  atible with SQLi
aca0: 74 65 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20  te,..        #  
acb0: 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
acc0: 2e 53 51 4c 69 74 65 2c 20 61 6e 64 20 73 75 69  .SQLite, and sui
acd0: 74 61 62 6c 65 20 66 6f 72 20 72 6f 75 6e 64 2d  table for round-
ace0: 74 72 69 70 70 69 6e 67 20 77 69 74 68 20 74 68  tripping with th
acf0: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
ad00: 20 20 20 44 61 74 65 54 69 6d 65 20 63 6c 61 73     DateTime clas
ad10: 73 20 6f 66 20 74 68 65 20 66 72 61 6d 65 77 6f  s of the framewo
ad20: 72 6b 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c  rk.  If this val
ad30: 75 65 20 69 73 20 63 68 61 6e 67 65 64 2c 0d 0a  ue is changed,..
ad40: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
ad50: 76 61 72 69 6f 75 73 20 74 65 73 74 73 20 6d 61  various tests ma
ad60: 79 20 66 61 69 6c 2e 0d 0a 20 20 20 20 20 20 20  y fail...       
ad70: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
ad80: 72 6e 20 22 79 79 79 79 2d 4d 4d 2d 64 64 20 48  rn "yyyy-MM-dd H
ad90: 48 3a 6d 6d 3a 73 73 2e 46 46 46 46 46 46 46 4b  H:mm:ss.FFFFFFFK
ada0: 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  "..      }..    
adb0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 65  }.....    proc e
adc0: 6e 75 6d 65 72 61 62 6c 65 54 6f 4c 69 73 74 20  numerableToList 
add0: 7b 20 65 6e 75 6d 65 72 61 62 6c 65 20 7d 20 7b  { enumerable } {
ade0: 0d 0a 20 20 20 20 20 20 73 65 74 20 72 65 73 75  ..      set resu
adf0: 6c 74 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20  lt [list]....   
ae00: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
ae10: 65 6e 67 74 68 20 24 65 6e 75 6d 65 72 61 62 6c  ength $enumerabl
ae20: 65 5d 20 3d 3d 20 30 20 7c 7c 20 24 65 6e 75 6d  e] == 0 || $enum
ae30: 65 72 61 62 6c 65 20 65 71 20 22 6e 75 6c 6c 22  erable eq "null"
ae40: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
ae50: 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74    return $result
ae60: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
ae70: 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63     object foreac
ae80: 68 20 2d 61 6c 69 61 73 20 69 74 65 6d 20 24 65  h -alias item $e
ae90: 6e 75 6d 65 72 61 62 6c 65 20 7b 0d 0a 20 20 20  numerable {..   
aea0: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
aeb0: 20 6c 65 6e 67 74 68 20 24 69 74 65 6d 5d 20 3e   length $item] >
aec0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
aed0: 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65        lappend re
aee0: 73 75 6c 74 20 5b 24 69 74 65 6d 20 54 6f 53 74  sult [$item ToSt
aef0: 72 69 6e 67 5d 0d 0a 20 20 20 20 20 20 20 20 7d  ring]..        }
af00: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
af10: 20 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c     return $resul
af20: 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  t..    }.....   
af30: 20 70 72 6f 63 20 63 61 74 63 68 41 6e 64 52 65   proc catchAndRe
af40: 74 75 72 6e 20 7b 20 73 63 72 69 70 74 20 7b 73  turn { script {s
af50: 74 61 63 6b 54 72 61 63 65 20 66 61 6c 73 65 7d  tackTrace false}
af60: 20 7b 73 74 72 69 63 74 20 74 72 75 65 7d 20 7d   {strict true} }
af70: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
af80: 20 20 20 23 20 4e 4f 54 45 3a 20 45 76 61 6c 75     # NOTE: Evalu
af90: 61 74 65 20 74 68 65 20 73 63 72 69 70 74 20 70  ate the script p
afa0: 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20 63  rovided by our c
afb0: 61 6c 6c 65 72 20 69 6e 20 74 68 65 69 72 20 63  aller in their c
afc0: 6f 6e 74 65 78 74 2c 0d 0a 20 20 20 20 20 20 23  ontext,..      #
afd0: 20 20 20 20 20 20 20 63 61 70 74 75 72 69 6e 67         capturing
afe0: 20 62 6f 74 68 20 74 68 65 20 72 65 73 75 6c 74   both the result
aff0: 20 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e 20   and the return 
b000: 63 6f 64 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  code...      #..
b010: 20 20 20 20 20 20 73 65 74 20 63 6f 64 65 20 5b        set code [
b020: 63 61 74 63 68 20 7b 75 70 6c 65 76 65 6c 20 31  catch {uplevel 1
b030: 20 24 73 63 72 69 70 74 7d 20 72 65 73 75 6c 74   $script} result
b040: 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ]....      #..  
b050: 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 69 64 20      # NOTE: Did 
b060: 74 68 65 20 73 63 72 69 70 74 20 70 72 6f 76 69  the script provi
b070: 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65  ded by our calle
b080: 72 20 4e 4f 54 20 72 61 69 73 65 20 61 6e 20 65  r NOT raise an e
b090: 72 72 6f 72 3f 0d 0a 20 20 20 20 20 20 23 0d 0a  rror?..      #..
b0a0: 20 20 20 20 20 20 69 66 20 7b 24 73 74 72 69 63        if {$stric
b0b0: 74 20 26 26 20 24 63 6f 64 65 20 3d 3d 20 30 20  t && $code == 0 
b0c0: 7c 7c 20 21 24 73 74 72 69 63 74 20 26 26 20 24  || !$strict && $
b0d0: 63 6f 64 65 20 21 3d 20 31 7d 20 74 68 65 6e 20  code != 1} then 
b0e0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
b0f0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 75        # NOTE: Su
b100: 63 63 65 73 73 2e 20 20 52 65 74 75 72 6e 20 61  ccess.  Return a
b110: 20 6c 69 73 74 20 77 69 74 68 20 74 68 65 20 72   list with the r
b120: 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 74  eturn code and t
b130: 68 65 20 72 65 73 75 6c 74 2e 0d 0a 20 20 20 20  he result...    
b140: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
b150: 65 74 75 72 6e 20 5b 6c 69 73 74 20 24 63 6f 64  eturn [list $cod
b160: 65 20 24 72 65 73 75 6c 74 5d 0d 0a 20 20 20 20  e $result]..    
b170: 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 73 74 61    } elseif {$sta
b180: 63 6b 54 72 61 63 65 7d 20 74 68 65 6e 20 7b 0d  ckTrace} then {.
b190: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
b1a0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 69 6c      # NOTE: Fail
b1b0: 75 72 65 2e 20 20 4f 75 72 20 63 61 6c 6c 65 72  ure.  Our caller
b1c0: 20 77 61 6e 74 73 20 61 20 66 75 6c 6c 20 73 74   wants a full st
b1d0: 61 63 6b 20 74 72 61 63 65 20 28 69 66 20 61 70  ack trace (if ap
b1e0: 70 6c 69 63 61 62 6c 65 29 2c 0d 0a 20 20 20 20  plicable),..    
b1f0: 20 20 20 20 23 20 20 20 20 20 20 20 72 65 74 75      #       retu
b200: 72 6e 20 61 20 6c 69 73 74 20 77 69 74 68 20 74  rn a list with t
b210: 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61  he return code a
b220: 6e 64 20 74 68 65 20 72 65 73 75 6c 74 20 76 65  nd the result ve
b230: 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20  rbatim...       
b240: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
b250: 72 6e 20 5b 6c 69 73 74 20 24 63 6f 64 65 20 24  rn [list $code $
b260: 72 65 73 75 6c 74 5d 0d 0a 20 20 20 20 20 20 7d  result]..      }
b270: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
b280: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
b290: 54 45 3a 20 46 61 69 6c 75 72 65 2e 20 20 4f 75  TE: Failure.  Ou
b2a0: 72 20 63 61 6c 6c 65 72 20 64 6f 65 73 20 6e 6f  r caller does no
b2b0: 74 20 77 61 6e 74 20 61 20 66 75 6c 6c 20 73 74  t want a full st
b2c0: 61 63 6b 20 74 72 61 63 65 20 28 69 66 0d 0a 20  ack trace (if.. 
b2d0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
b2e0: 70 70 6c 69 63 61 62 6c 65 29 2c 20 72 65 74 75  pplicable), retu
b2f0: 72 6e 20 61 20 6c 69 73 74 20 77 69 74 68 20 74  rn a list with t
b300: 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 2c 20  he return code, 
b310: 74 68 65 20 65 72 72 6f 72 0d 0a 20 20 20 20 20  the error..     
b320: 20 20 20 23 20 20 20 20 20 20 20 63 6f 64 65 20     #       code 
b330: 66 6f 72 20 74 68 65 20 69 6e 74 65 72 70 72 65  for the interpre
b340: 74 65 72 2c 20 61 6e 64 20 74 68 65 20 65 72 72  ter, and the err
b350: 6f 72 20 6d 65 73 73 61 67 65 20 75 70 20 74 6f  or message up to
b360: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
b370: 20 20 20 20 20 20 70 6f 69 6e 74 20 77 68 65 72        point wher
b380: 65 20 74 68 65 20 73 74 61 63 6b 20 74 72 61 63  e the stack trac
b390: 65 20 73 68 6f 75 6c 64 20 73 74 61 72 74 2e 0d  e should start..
b3a0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
b3b0: 20 20 20 20 73 65 74 20 69 6e 64 65 78 20 5b 73      set index [s
b3c0: 74 72 69 6e 67 20 66 69 72 73 74 20 22 20 20 20  tring first "   
b3d0: 61 74 20 22 20 24 72 65 73 75 6c 74 5d 3b 20 23  at " $result]; #
b3e0: 20 48 41 43 4b 3a 20 52 65 6c 69 61 62 6c 65 3f   HACK: Reliable?
b3f0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75  ....        retu
b400: 72 6e 20 5b 6c 69 73 74 20 24 63 6f 64 65 20 24  rn [list $code $
b410: 3a 3a 65 72 72 6f 72 43 6f 64 65 20 5b 65 78 70  ::errorCode [exp
b420: 72 20 7b 24 69 6e 64 65 78 20 21 3d 20 2d 31 20  r {$index != -1 
b430: 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ? \..           
b440: 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 5b 73   [string trim [s
b450: 74 72 69 6e 67 20 72 61 6e 67 65 20 24 72 65 73  tring range $res
b460: 75 6c 74 20 30 20 24 69 6e 64 65 78 5d 5d 20 3a  ult 0 $index]] :
b470: 20 24 72 65 73 75 6c 74 7d 5d 5d 0d 0a 20 20 20   $result}]]..   
b480: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
b490: 20 20 20 20 70 72 6f 63 20 63 6f 6d 70 69 6c 65      proc compile
b4a0: 43 53 68 61 72 70 57 69 74 68 20 7b 0d 0a 20 20  CSharpWith {..  
b4b0: 20 20 20 20 20 20 20 20 20 20 74 65 78 74 20 6d            text m
b4c0: 65 6d 6f 72 79 20 73 79 6d 62 6f 6c 73 20 73 74  emory symbols st
b4d0: 72 69 63 74 20 72 65 73 75 6c 74 73 56 61 72 4e  rict resultsVarN
b4e0: 61 6d 65 20 65 72 72 6f 72 73 56 61 72 4e 61 6d  ame errorsVarNam
b4f0: 65 20 66 69 6c 65 4e 61 6d 65 73 0d 0a 20 20 20  e fileNames..   
b500: 20 20 20 20 20 20 20 20 20 61 72 67 73 20 7d 20           args } 
b510: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
b520: 20 20 23 20 4e 4f 54 45 3a 20 53 69 6e 63 65 20    # NOTE: Since 
b530: 77 65 20 61 72 65 20 67 6f 69 6e 67 20 74 6f 20  we are going to 
b540: 75 73 65 20 74 68 69 73 20 6d 65 74 68 6f 64 20  use this method 
b550: 6e 61 6d 65 20 61 20 6c 6f 74 2c 20 61 73 73 69  name a lot, assi
b560: 67 6e 20 69 74 20 74 6f 20 61 0d 0a 20 20 20 20  gn it to a..    
b570: 20 20 23 20 20 20 20 20 20 20 76 61 72 69 61 62    #       variab
b580: 6c 65 20 66 69 72 73 74 2e 0d 0a 20 20 20 20 20  le first...     
b590: 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 61 64   #..      set ad
b5a0: 64 20 52 65 66 65 72 65 6e 63 65 64 41 73 73 65  d ReferencedAsse
b5b0: 6d 62 6c 69 65 73 2e 41 64 64 0d 0a 0d 0a 20 20  mblies.Add....  
b5c0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
b5d0: 4f 54 45 3a 20 43 72 65 61 74 65 20 74 68 65 20  OTE: Create the 
b5e0: 62 61 73 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  base command to 
b5f0: 65 76 61 6c 75 61 74 65 20 61 6e 64 20 61 64 64  evaluate and add
b600: 20 74 68 65 20 70 72 6f 70 65 72 74 79 20 73 65   the property se
b610: 74 74 69 6e 67 73 0d 0a 20 20 20 20 20 20 23 20  ttings..      # 
b620: 20 20 20 20 20 20 74 68 61 74 20 61 72 65 20 61        that are a
b630: 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 6e 65 65  lmost always nee
b640: 64 65 64 20 62 79 20 6f 75 72 20 75 6e 69 74 20  ded by our unit 
b650: 74 65 73 74 73 20 28 69 2e 65 2e 20 74 68 65 20  tests (i.e. the 
b660: 53 79 73 74 65 6d 0d 0a 20 20 20 20 20 20 23 20  System..      # 
b670: 20 20 20 20 20 20 61 6e 64 20 53 79 73 74 65 6d        and System
b680: 2e 44 61 74 61 20 61 73 73 65 6d 62 6c 79 20 72  .Data assembly r
b690: 65 66 65 72 65 6e 63 65 73 29 2e 0d 0a 20 20 20  eferences)...   
b6a0: 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
b6b0: 63 6f 6d 6d 61 6e 64 20 5b 6c 69 73 74 20 63 6f  command [list co
b6c0: 6d 70 69 6c 65 43 53 68 61 72 70 20 24 74 65 78  mpileCSharp $tex
b6d0: 74 20 24 6d 65 6d 6f 72 79 20 24 73 79 6d 62 6f  t $memory $symbo
b6e0: 6c 73 20 24 73 74 72 69 63 74 20 72 65 73 75 6c  ls $strict resul
b6f0: 74 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ts \..          
b700: 65 72 72 6f 72 73 20 24 61 64 64 20 53 79 73 74  errors $add Syst
b710: 65 6d 2e 64 6c 6c 20 24 61 64 64 20 53 79 73 74  em.dll $add Syst
b720: 65 6d 2e 44 61 74 61 2e 64 6c 6c 20 24 61 64 64  em.Data.dll $add
b730: 20 53 79 73 74 65 6d 2e 58 6d 6c 2e 64 6c 6c 5d   System.Xml.dll]
b740: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
b750: 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 61     # NOTE: Add a
b760: 6c 6c 20 74 68 65 20 70 72 6f 76 69 64 65 64 20  ll the provided 
b770: 66 69 6c 65 20 6e 61 6d 65 73 20 61 73 20 61 73  file names as as
b780: 73 65 6d 62 6c 79 20 72 65 66 65 72 65 6e 63 65  sembly reference
b790: 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s...      #..   
b7a0: 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
b7b0: 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 73 20 7b  ame $fileNames {
b7c0: 0d 0a 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e  ..        lappen
b7d0: 64 20 63 6f 6d 6d 61 6e 64 20 24 61 64 64 20 5b  d command $add [
b7e0: 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
b7f0: 65 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20  e $fileName]..  
b800: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
b810: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
b820: 41 64 64 20 74 68 65 20 65 78 74 72 61 20 61 72  Add the extra ar
b830: 67 75 6d 65 6e 74 73 2c 20 69 66 20 61 6e 79 2c  guments, if any,
b840: 20 74 6f 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20   to the command 
b850: 74 6f 20 65 76 61 6c 75 61 74 65 2e 0d 0a 20 20  to evaluate...  
b860: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 65 76 61      #..      eva
b870: 6c 20 6c 61 70 70 65 6e 64 20 63 6f 6d 6d 61 6e  l lappend comman
b880: 64 20 24 61 72 67 73 0d 0a 0d 0a 20 20 20 20 20  d $args....     
b890: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
b8a0: 3a 20 41 6c 69 61 73 20 74 68 65 20 63 6f 6d 70  : Alias the comp
b8b0: 69 6c 65 72 20 6c 6f 63 61 6c 20 72 65 73 75 6c  iler local resul
b8c0: 74 73 20 61 6e 64 20 65 72 72 6f 72 73 20 76 61  ts and errors va
b8d0: 72 69 61 62 6c 65 73 20 74 6f 20 74 68 65 0d 0a  riables to the..
b8e0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61        #       va
b8f0: 72 69 61 62 6c 65 20 6e 61 6d 65 73 20 70 72 6f  riable names pro
b900: 76 69 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c  vided by our cal
b910: 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ler...      #.. 
b920: 20 20 20 20 20 75 70 76 61 72 20 31 20 24 72 65       upvar 1 $re
b930: 73 75 6c 74 73 56 61 72 4e 61 6d 65 20 72 65 73  sultsVarName res
b940: 75 6c 74 73 0d 0a 20 20 20 20 20 20 75 70 76 61  ults..      upva
b950: 72 20 31 20 24 65 72 72 6f 72 73 56 61 72 4e 61  r 1 $errorsVarNa
b960: 6d 65 20 65 72 72 6f 72 73 0d 0a 0d 0a 20 20 20  me errors....   
b970: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
b980: 54 45 3a 20 45 76 61 6c 75 61 74 65 20 74 68 65  TE: Evaluate the
b990: 20 63 6f 6e 73 74 72 75 63 74 65 64 20 5b 63 6f   constructed [co
b9a0: 6d 70 69 6c 65 43 53 68 61 72 70 5d 20 63 6f 6d  mpileCSharp] com
b9b0: 6d 61 6e 64 20 61 6e 64 20 72 65 74 75 72 6e 20  mand and return 
b9c0: 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
b9d0: 20 20 20 72 65 73 75 6c 74 2e 0d 0a 20 20 20 20     result...    
b9e0: 20 20 23 0d 0a 20 20 20 20 20 20 65 76 61 6c 20    #..      eval 
b9f0: 24 63 6f 6d 6d 61 6e 64 0d 0a 20 20 20 20 7d 0d  $command..    }.
ba00: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73 4d  ....    proc isM
ba10: 65 6d 6f 72 79 44 62 20 7b 20 66 69 6c 65 4e 61  emoryDb { fileNa
ba20: 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  me } {..      #.
ba30: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
ba40: 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  s the specified 
ba50: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
ba60: 6d 65 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e 2d  me really an in-
ba70: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 3f  memory database?
ba80: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
ba90: 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 24   return [expr {$
baa0: 66 69 6c 65 4e 61 6d 65 20 65 71 20 22 3a 6d 65  fileName eq ":me
bab0: 6d 6f 72 79 3a 22 20 7c 7c 20 5c 0d 0a 20 20 20  mory:" || \..   
bac0: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 72         [string r
bad0: 61 6e 67 65 20 24 66 69 6c 65 4e 61 6d 65 20 30  ange $fileName 0
bae0: 20 31 32 5d 20 65 71 20 22 66 69 6c 65 3a 3a 6d   12] eq "file::m
baf0: 65 6d 6f 72 79 3a 22 7d 5d 0d 0a 20 20 20 20 7d  emory:"}]..    }
bb00: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73  .....    proc is
bb10: 54 61 62 6c 65 49 6e 44 62 20 7b 20 6e 61 6d 65  TableInDb { name
bb20: 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20 7d 20   {varName db} } 
bb30: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
bb40: 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20    # NOTE: Refer 
bb50: 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65 64  to the specified
bb60: 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20   variable (e.g. 
bb70: 22 64 62 22 29 20 69 6e 20 74 68 65 20 63 6f 6e  "db") in the con
bb80: 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20  text of our..   
bb90: 20 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c 65     #       calle
bba0: 72 2e 20 20 49 74 20 63 6f 6e 74 61 69 6e 73 20  r.  It contains 
bbb0: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
bbc0: 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 74  nection handle t
bbd0: 68 61 74 20 77 69 6c 6c 20 62 65 0d 0a 20 20 20  hat will be..   
bbe0: 20 20 20 23 20 20 20 20 20 20 20 75 73 65 64 20     #       used 
bbf0: 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20 71  to execute the q
bc00: 75 65 72 79 20 75 73 65 64 20 74 6f 20 64 65 74  uery used to det
bc10: 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 61  ermine if the na
bc20: 6d 65 64 20 74 61 62 6c 65 20 69 73 0d 0a 20 20  med table is..  
bc30: 20 20 20 20 23 20 20 20 20 20 20 20 70 72 65 73      #       pres
bc40: 65 6e 74 20 69 6e 20 74 68 61 74 20 64 61 74 61  ent in that data
bc50: 62 61 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  base...      #..
bc60: 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76        upvar 1 $v
bc70: 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20  arName db....   
bc80: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
bc90: 54 45 3a 20 45 78 65 63 75 74 65 20 74 68 65 20  TE: Execute the 
bca0: 53 51 4c 20 71 75 65 72 79 20 61 67 61 69 6e 73  SQL query agains
bcb0: 74 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  t the sqlite_mas
bcc0: 74 65 72 20 74 61 62 6c 65 20 74 6f 20 63 68 65  ter table to che
bcd0: 63 6b 20 69 66 0d 0a 20 20 20 20 20 20 23 20 20  ck if..      #  
bce0: 20 20 20 20 20 74 68 65 20 6e 61 6d 65 64 20 74       the named t
bcf0: 61 62 6c 65 20 69 73 20 70 72 65 73 65 6e 74 20  able is present 
bd00: 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a  and return non-z
bd10: 65 72 6f 20 69 66 20 69 74 20 69 73 2e 0d 0a 20  ero if it is... 
bd20: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
bd30: 74 75 72 6e 20 5b 65 78 70 72 20 7b 5b 73 71 6c  turn [expr {[sql
bd40: 20 65 78 65 63 75 74 65 20 2d 65 78 65 63 75 74   execute -execut
bd50: 65 20 73 63 61 6c 61 72 20 24 64 62 20 5c 0d 0a  e scalar $db \..
bd60: 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
bd70: 54 20 43 4f 55 4e 54 28 2a 29 20 46 52 4f 4d 20  T COUNT(*) FROM 
bd80: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48  sqlite_master WH
bd90: 45 52 45 20 74 79 70 65 20 3d 20 27 74 61 62 6c  ERE type = 'tabl
bda0: 65 27 20 41 4e 44 20 6e 61 6d 65 20 3d 20 3f 3b  e' AND name = ?;
bdb0: 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  " \..          [
bdc0: 6c 69 73 74 20 70 61 72 61 6d 31 20 53 74 72 69  list param1 Stri
bdd0: 6e 67 20 24 6e 61 6d 65 5d 5d 20 3e 20 30 7d 5d  ng $name]] > 0}]
bde0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
bdf0: 70 72 6f 63 20 74 72 69 6d 53 71 6c 20 7b 20 73  proc trimSql { s
be00: 71 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 72 65  ql } {..      re
be10: 74 75 72 6e 20 5b 72 65 67 73 75 62 20 2d 61 6c  turn [regsub -al
be20: 6c 20 2d 2d 20 7b 5c 73 2b 7d 20 5b 73 74 72 69  l -- {\s+} [stri
be30: 6e 67 20 74 72 69 6d 20 24 73 71 6c 5d 20 22 20  ng trim $sql] " 
be40: 22 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  "]..    }.....  
be50: 20 20 70 72 6f 63 20 65 78 65 63 75 74 65 53 71    proc executeSq
be60: 6c 20 7b 20 73 71 6c 20 7b 65 78 65 63 75 74 65  l { sql {execute
be70: 20 6e 6f 6e 65 7d 20 7b 66 69 6c 65 4e 61 6d 65   none} {fileName
be80: 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20   ""} } {..      
be90: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
bea0: 74 68 20 24 66 69 6c 65 4e 61 6d 65 5d 20 3d 3d  th $fileName] ==
beb0: 20 30 7d 20 74 68 65 6e 20 7b 73 65 74 20 66 69   0} then {set fi
bec0: 6c 65 4e 61 6d 65 20 3a 6d 65 6d 6f 72 79 3a 7d  leName :memory:}
bed0: 0d 0a 20 20 20 20 20 20 73 65 74 75 70 44 62 20  ..      setupDb 
bee0: 24 66 69 6c 65 4e 61 6d 65 20 22 22 20 22 22 20  $fileName "" "" 
bef0: 22 22 20 22 22 20 22 22 20 66 61 6c 73 65 20 66  "" "" "" false f
bf00: 61 6c 73 65 20 66 61 6c 73 65 20 66 61 6c 73 65  alse false false
bf10: 20 6d 65 6d 44 62 0d 0a 0d 0a 20 20 20 20 20 20   memDb....      
bf20: 74 72 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  try {..        r
bf30: 65 74 75 72 6e 20 5b 73 71 6c 20 65 78 65 63 75  eturn [sql execu
bf40: 74 65 20 2d 65 78 65 63 75 74 65 20 24 65 78 65  te -execute $exe
bf50: 63 75 74 65 20 24 6d 65 6d 44 62 20 24 73 71 6c  cute $memDb $sql
bf60: 5d 0d 0a 20 20 20 20 20 20 7d 20 66 69 6e 61 6c  ]..      } final
bf70: 6c 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6c  ly {..        cl
bf80: 65 61 6e 75 70 44 62 20 24 66 69 6c 65 4e 61 6d  eanupDb $fileNam
bf90: 65 20 6d 65 6d 44 62 20 66 61 6c 73 65 20 66 61  e memDb false fa
bfa0: 6c 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  lse..      }..  
bfb0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
bfc0: 20 73 65 74 75 70 44 62 20 7b 0d 0a 20 20 20 20   setupDb {..    
bfd0: 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65          fileName
bfe0: 20 7b 6d 6f 64 65 20 22 22 7d 20 7b 64 61 74 65   {mode ""} {date
bff0: 54 69 6d 65 46 6f 72 6d 61 74 20 22 22 7d 20 7b  TimeFormat ""} {
c000: 64 61 74 65 54 69 6d 65 4b 69 6e 64 20 22 22 7d  dateTimeKind ""}
c010: 20 7b 66 6c 61 67 73 20 22 22 7d 0d 0a 20 20 20   {flags ""}..   
c020: 20 20 20 20 20 20 20 20 20 7b 65 78 74 72 61 20           {extra 
c030: 22 22 7d 20 7b 71 75 61 6c 69 66 79 20 74 72 75  ""} {qualify tru
c040: 65 7d 20 7b 64 65 6c 65 74 65 20 74 72 75 65 7d  e} {delete true}
c050: 20 7b 75 72 69 20 66 61 6c 73 65 7d 0d 0a 20 20   {uri false}..  
c060: 20 20 20 20 20 20 20 20 20 20 7b 74 65 6d 70 6f            {tempo
c070: 72 61 72 79 20 74 72 75 65 7d 20 7b 76 61 72 4e  rary true} {varN
c080: 61 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a 20 20 20  ame db} } {..   
c090: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
c0a0: 54 45 3a 20 46 69 72 73 74 2c 20 73 65 65 20 69  TE: First, see i
c0b0: 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 68 61 73  f our caller has
c0c0: 20 72 65 71 75 65 73 74 65 64 20 61 6e 20 69 6e   requested an in
c0d0: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
c0e0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
c0f0: 20 20 73 65 74 20 69 73 4d 65 6d 6f 72 79 20 5b    set isMemory [
c100: 69 73 4d 65 6d 6f 72 79 44 62 20 24 66 69 6c 65  isMemoryDb $file
c110: 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 23  Name]....      #
c120: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
c130: 46 6f 72 20 6e 6f 77 2c 20 61 6c 6c 20 74 65 73  For now, all tes
c140: 74 20 64 61 74 61 62 61 73 65 73 20 75 73 65 64  t databases used
c150: 20 62 79 20 74 68 65 20 74 65 73 74 20 73 75 69   by the test sui
c160: 74 65 20 61 72 65 20 70 6c 61 63 65 64 0d 0a 20  te are placed.. 
c170: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 74       #       int
c180: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64  o the database d
c190: 69 72 65 63 74 6f 72 79 2e 20 20 45 61 63 68 20  irectory.  Each 
c1a0: 64 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 6c  database and rel
c1b0: 61 74 65 64 20 66 69 6c 65 73 0d 0a 20 20 20 20  ated files..    
c1c0: 20 20 23 20 20 20 20 20 20 20 75 73 65 64 20 62    #       used b
c1d0: 79 20 61 20 74 65 73 74 20 73 68 6f 75 6c 64 20  y a test should 
c1e0: 62 65 20 63 6c 65 61 6e 65 64 20 75 70 20 62 79  be cleaned up by
c1f0: 20 74 68 61 74 20 74 65 73 74 20 75 73 69 6e 67   that test using
c200: 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
c210: 20 20 20 20 22 63 6c 65 61 6e 75 70 44 62 22 20      "cleanupDb" 
c220: 70 72 6f 63 65 64 75 72 65 2c 20 62 65 6c 6f 77  procedure, below
c230: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
c240: 20 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72 79    if {!$isMemory
c250: 20 26 26 20 24 71 75 61 6c 69 66 79 7d 20 74 68   && $qualify} th
c260: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  en {..        se
c270: 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65  t fileName [file
c280: 20 6a 6f 69 6e 20 5b 67 65 74 44 61 74 61 62 61   join [getDataba
c290: 73 65 44 69 72 65 63 74 6f 72 79 5d 20 5b 66 69  seDirectory] [fi
c2a0: 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d  le tail $fileNam
c2b0: 65 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  e]]..      }....
c2c0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
c2d0: 20 4e 4f 54 45 3a 20 42 79 20 64 65 66 61 75 6c   NOTE: By defaul
c2e0: 74 2c 20 64 65 6c 65 74 65 20 61 6e 79 20 70 72  t, delete any pr
c2f0: 65 2d 65 78 69 73 74 69 6e 67 20 64 61 74 61 62  e-existing datab
c300: 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ase with the sam
c310: 65 20 66 69 6c 65 0d 0a 20 20 20 20 20 20 23 20  e file..      # 
c320: 20 20 20 20 20 20 6e 61 6d 65 20 69 66 20 69 74        name if it
c330: 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74   currently exist
c340: 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s...      #..   
c350: 20 20 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72     if {!$isMemor
c360: 79 20 26 26 20 24 64 65 6c 65 74 65 20 26 26 20  y && $delete && 
c370: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69  [file exists $fi
c380: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
c390: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
c3a0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
c3b0: 6d 70 74 20 74 6f 20 64 65 6c 65 74 65 20 61 6e  mpt to delete an
c3c0: 79 20 70 72 65 2d 65 78 69 73 74 69 6e 67 20 64  y pre-existing d
c3d0: 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65  atabase with the
c3e0: 20 73 61 6d 65 20 66 69 6c 65 0d 0a 20 20 20 20   same file..    
c3f0: 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d 65      #       name
c400: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
c410: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
c420: 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66   {file delete $f
c430: 69 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72 5d 7d  ileName} error]}
c440: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
c450: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
c460: 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68  # NOTE: We someh
c470: 6f 77 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c  ow failed to del
c480: 65 74 65 20 74 68 65 20 66 69 6c 65 2c 20 72 65  ete the file, re
c490: 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20  port why...     
c4a0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
c4b0: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
c4c0: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
c4d0: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
c4e0: 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
c4f0: 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 64 65  NG: failed to de
c500: 6c 65 74 65 20 64 61 74 61 62 61 73 65 20 66 69  lete database fi
c510: 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65  le \"" $fileName
c520: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
c530: 20 20 22 5c 22 20 64 75 72 69 6e 67 20 73 65 74    "\" during set
c540: 75 70 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  up, error: " \n\
c550: 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20  t $error \n]..  
c560: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
c570: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
c580: 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72     # NOTE: Refer
c590: 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65   to the specifie
c5a0: 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e  d variable (e.g.
c5b0: 20 22 64 62 22 29 20 69 6e 20 74 68 65 20 63 6f   "db") in the co
c5c0: 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20  ntext of our..  
c5d0: 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c      #       call
c5e0: 65 72 2e 20 20 54 68 65 20 68 61 6e 64 6c 65 20  er.  The handle 
c5f0: 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 64 61  to the opened da
c600: 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65 20 73  tabase will be s
c610: 74 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a 20 20  tored there...  
c620: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76      #..      upv
c630: 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 64 62  ar 1 $varName db
c640: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
c650: 20 20 20 23 20 4e 4f 54 45 3a 20 53 74 61 72 74     # NOTE: Start
c660: 20 62 75 69 6c 64 69 6e 67 20 74 68 65 20 63 6f   building the co
c670: 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 2e  nnection string.
c680: 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 71 75 69    The only requi
c690: 72 65 64 20 70 6f 72 74 69 6f 6e 0d 0a 20 20 20  red portion..   
c6a0: 20 20 20 23 20 20 20 20 20 20 20 6f 66 20 74 68     #       of th
c6b0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72  e connection str
c6c0: 69 6e 67 20 69 73 20 74 68 65 20 64 61 74 61 20  ing is the data 
c6d0: 73 6f 75 72 63 65 2c 20 77 68 69 63 68 20 63 6f  source, which co
c6e0: 6e 74 61 69 6e 73 20 74 68 65 0d 0a 20 20 20 20  ntains the..    
c6f0: 20 20 23 20 20 20 20 20 20 20 64 61 74 61 62 61    #       databa
c700: 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 74 73  se file name its
c710: 65 6c 66 2e 20 20 49 66 20 6f 75 72 20 63 61 6c  elf.  If our cal
c720: 6c 65 72 20 77 61 6e 74 73 20 74 6f 20 75 73 65  ler wants to use
c730: 20 61 20 55 52 49 20 61 73 0d 0a 20 20 20 20 20   a URI as..     
c740: 20 23 20 20 20 20 20 20 20 74 68 65 20 64 61 74   #       the dat
c750: 61 20 73 6f 75 72 63 65 2c 20 75 73 65 20 74 68  a source, use th
c760: 65 20 46 75 6c 6c 55 72 69 20 63 6f 6e 6e 65 63  e FullUri connec
c770: 74 69 6f 6e 20 73 74 72 69 6e 67 20 70 72 6f 70  tion string prop
c780: 65 72 74 79 20 74 6f 0d 0a 20 20 20 20 20 20 23  erty to..      #
c790: 20 20 20 20 20 20 20 70 72 65 76 65 6e 74 20 74         prevent t
c7a0: 68 65 20 64 61 74 61 20 73 6f 75 72 63 65 20 73  he data source s
c7b0: 74 72 69 6e 67 20 66 72 6f 6d 20 62 65 69 6e 67  tring from being
c7c0: 20 6d 61 6e 67 6c 65 64 2e 0d 0a 20 20 20 20 20   mangled...     
c7d0: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 75   #..      if {$u
c7e0: 72 69 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ri} then {..    
c7f0: 20 20 20 20 73 65 74 20 63 6f 6e 6e 65 63 74 69      set connecti
c800: 6f 6e 20 7b 46 75 6c 6c 55 72 69 3d 24 7b 66 69  on {FullUri=${fi
c810: 6c 65 4e 61 6d 65 7d 7d 0d 0a 20 20 20 20 20 20  leName}}..      
c820: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
c830: 20 20 73 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e    set connection
c840: 20 7b 44 61 74 61 20 53 6f 75 72 63 65 3d 24 7b   {Data Source=${
c850: 66 69 6c 65 4e 61 6d 65 7d 7d 0d 0a 20 20 20 20  fileName}}..    
c860: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
c870: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 69        # NOTE: Si
c880: 6e 63 65 20 74 68 69 73 20 70 72 6f 63 65 64 75  nce this procedu
c890: 72 65 20 68 61 73 20 6e 6f 20 73 70 65 63 69 61  re has no specia
c8a0: 6c 20 6b 6e 6f 77 6c 65 64 67 65 20 6f 66 20 77  l knowledge of w
c8b0: 68 61 74 20 74 68 65 20 64 65 66 61 75 6c 74 0d  hat the default.
c8c0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
c8d0: 65 74 74 69 6e 67 20 69 73 20 66 6f 72 20 74 68  etting is for th
c8e0: 65 20 54 6f 46 75 6c 6c 50 61 74 68 20 63 6f 6e  e ToFullPath con
c8f0: 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 70  nection string p
c900: 72 6f 70 65 72 79 2c 20 61 6c 77 61 79 73 0d 0a  ropery, always..
c910: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 64        #       ad
c920: 64 20 74 68 65 20 76 61 6c 75 65 20 77 65 20 6b  d the value we k
c930: 6e 6f 77 20 61 62 6f 75 74 20 74 6f 20 74 68 65  now about to the
c940: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69   connection stri
c950: 6e 67 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ng...      #..  
c960: 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65      append conne
c970: 63 74 69 6f 6e 20 7b 3b 54 6f 46 75 6c 6c 50 61  ction {;ToFullPa
c980: 74 68 3d 24 7b 71 75 61 6c 69 66 79 7d 7d 0d 0a  th=${qualify}}..
c990: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
c9a0: 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20   # NOTE: If our 
c9b0: 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64  caller specified
c9c0: 20 61 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c   a journal mode,
c9d0: 20 61 64 64 20 74 68 65 20 6e 65 63 65 73 73 61   add the necessa
c9e0: 72 79 20 70 6f 72 74 69 6f 6e 0d 0a 20 20 20 20  ry portion..    
c9f0: 20 20 23 20 20 20 20 20 20 20 6f 66 20 74 68 65    #       of the
ca00: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69   connection stri
ca10: 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23  ng now...      #
ca20: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
ca30: 69 6e 67 20 6c 65 6e 67 74 68 20 24 6d 6f 64 65  ing length $mode
ca40: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
ca50: 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f         append co
ca60: 6e 6e 65 63 74 69 6f 6e 20 7b 3b 4a 6f 75 72 6e  nnection {;Journ
ca70: 61 6c 20 4d 6f 64 65 3d 24 7b 6d 6f 64 65 7d 7d  al Mode=${mode}}
ca80: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
ca90: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
caa0: 54 45 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65  TE: If our calle
cab0: 72 20 73 70 65 63 69 66 69 65 64 20 61 20 44 61  r specified a Da
cac0: 74 65 54 69 6d 65 20 66 6f 72 6d 61 74 2c 20 61  teTime format, a
cad0: 64 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  dd the necessary
cae0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
caf0: 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 63  portion of the c
cb00: 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67  onnection string
cb10: 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a   now...      #..
cb20: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
cb30: 67 20 6c 65 6e 67 74 68 20 24 64 61 74 65 54 69  g length $dateTi
cb40: 6d 65 46 6f 72 6d 61 74 5d 20 3e 20 30 7d 20 74  meFormat] > 0} t
cb50: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61  hen {..        a
cb60: 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e  ppend connection
cb70: 20 7b 3b 44 61 74 65 54 69 6d 65 46 6f 72 6d 61   {;DateTimeForma
cb80: 74 3d 24 7b 64 61 74 65 54 69 6d 65 46 6f 72 6d  t=${dateTimeForm
cb90: 61 74 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  at}}..      }...
cba0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
cbb0: 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20 63  # NOTE: If our c
cbc0: 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64 20  aller specified 
cbd0: 61 20 44 61 74 65 54 69 6d 65 4b 69 6e 64 2c 20  a DateTimeKind, 
cbe0: 61 64 64 20 74 68 65 20 6e 65 63 65 73 73 61 72  add the necessar
cbf0: 79 20 70 6f 72 74 69 6f 6e 0d 0a 20 20 20 20 20  y portion..     
cc00: 20 23 20 20 20 20 20 20 20 6f 66 20 74 68 65 20   #       of the 
cc10: 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e  connection strin
cc20: 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d  g now...      #.
cc30: 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
cc40: 6e 67 20 6c 65 6e 67 74 68 20 24 64 61 74 65 54  ng length $dateT
cc50: 69 6d 65 4b 69 6e 64 5d 20 3e 20 30 7d 20 74 68  imeKind] > 0} th
cc60: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70  en {..        ap
cc70: 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  pend connection 
cc80: 7b 3b 44 61 74 65 54 69 6d 65 4b 69 6e 64 3d 24  {;DateTimeKind=$
cc90: 7b 64 61 74 65 54 69 6d 65 4b 69 6e 64 7d 7d 0d  {dateTimeKind}}.
cca0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
ccb0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
ccc0: 45 3a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  E: If there are 
ccd0: 61 6e 79 20 67 6c 6f 62 61 6c 20 28 70 65 72 20  any global (per 
cce0: 74 65 73 74 20 72 75 6e 29 20 63 6f 6e 6e 65 63  test run) connec
ccf0: 74 69 6f 6e 20 66 6c 61 67 73 20 63 75 72 72 65  tion flags curre
cd00: 6e 74 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20  ntly..      #   
cd10: 20 20 20 20 73 65 74 2c 20 75 73 65 20 74 68 65      set, use the
cd20: 6d 20 6e 6f 77 20 28 69 2e 65 2e 20 62 79 20 63  m now (i.e. by c
cd30: 6f 6d 62 69 6e 69 6e 67 20 74 68 65 6d 20 77 69  ombining them wi
cd40: 74 68 20 74 68 65 20 6f 6e 65 73 20 66 6f 72 20  th the ones for 
cd50: 74 68 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20  this..      #   
cd60: 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e      connection).
cd70: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
cd80: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
cd90: 73 20 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66  s ::connection_f
cda0: 6c 61 67 73 5d 20 26 26 20 5c 0d 0a 20 20 20 20  lags] && \..    
cdb0: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
cdc0: 6e 67 74 68 20 24 3a 3a 63 6f 6e 6e 65 63 74 69  ngth $::connecti
cdd0: 6f 6e 5f 66 6c 61 67 73 5d 20 3e 20 30 7d 20 74  on_flags] > 0} t
cde0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
cdf0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
ce00: 3a 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f 67 29  : Show (and log)
ce10: 20 74 68 61 74 20 77 65 20 64 65 74 65 63 74 65   that we detecte
ce20: 64 20 73 6f 6d 65 20 67 6c 6f 62 61 6c 20 63 6f  d some global co
ce30: 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 2e 0d  nnection flags..
ce40: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
ce50: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
ce60: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
ce70: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
ce80: 20 20 20 20 20 22 2d 2d 2d 2d 20 67 6c 6f 62 61       "---- globa
ce90: 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61  l connection fla
cea0: 67 73 20 64 65 74 65 63 74 65 64 3a 20 22 20 24  gs detected: " $
ceb0: 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61  ::connection_fla
cec0: 67 73 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20  gs \n]....      
ced0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
cee0: 4f 54 45 3a 20 43 6f 6d 62 69 6e 65 20 61 6e 64  OTE: Combine and
cef0: 2f 6f 72 20 72 65 70 6c 61 63 65 20 74 68 65 20  /or replace the 
cf00: 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
cf10: 20 61 6e 64 20 74 68 65 6e 20 73 68 6f 77 20 74   and then show t
cf20: 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  he..        #   
cf30: 20 20 20 20 6e 65 77 20 76 61 6c 75 65 2e 0d 0a      new value...
cf40: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
cf50: 20 20 20 73 65 74 20 66 6c 61 67 73 20 5b 63 6f     set flags [co
cf60: 6d 62 69 6e 65 46 6c 61 67 73 20 24 66 6c 61 67  mbineFlags $flag
cf70: 73 20 24 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f  s $::connection_
cf80: 66 6c 61 67 73 5d 0d 0a 0d 0a 20 20 20 20 20 20  flags]....      
cf90: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
cfa0: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
cfb0: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
cfc0: 20 20 20 22 2d 2d 2d 2d 20 63 6f 6d 62 69 6e 65     "---- combine
cfd0: 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61  d connection fla
cfe0: 67 73 20 61 72 65 3a 20 22 20 24 66 6c 61 67 73  gs are: " $flags
cff0: 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d   \n]..      }...
d000: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
d010: 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20 63  # NOTE: If our c
d020: 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64 20  aller specified 
d030: 73 6f 6d 65 20 53 51 4c 69 74 65 43 6f 6e 6e 65  some SQLiteConne
d040: 63 74 69 6f 6e 46 6c 61 67 73 2c 20 61 64 64 20  ctionFlags, add 
d050: 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
d060: 20 20 20 6e 65 63 65 73 73 61 72 79 20 70 6f 72     necessary por
d070: 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6e 6e  tion of the conn
d080: 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f  ection string no
d090: 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  w...      #..   
d0a0: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
d0b0: 65 6e 67 74 68 20 24 66 6c 61 67 73 5d 20 3e 20  ength $flags] > 
d0c0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
d0d0: 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63     append connec
d0e0: 74 69 6f 6e 20 7b 3b 46 6c 61 67 73 3d 24 7b 66  tion {;Flags=${f
d0f0: 6c 61 67 73 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d  lags}}..      }.
d100: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
d110: 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72    # NOTE: If our
d120: 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65   caller specifie
d130: 64 20 61 6e 20 65 78 74 72 61 20 70 61 79 6c 6f  d an extra paylo
d140: 61 64 20 74 6f 20 74 68 65 20 63 6f 6e 6e 65 63  ad to the connec
d150: 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  tion..      #   
d160: 20 20 20 20 73 74 72 69 6e 67 2c 20 61 70 70 65      string, appe
d170: 6e 64 20 69 74 20 6e 6f 77 2e 0d 0a 20 20 20 20  nd it now...    
d180: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
d190: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 65  string length $e
d1a0: 78 74 72 61 5d 20 3e 20 30 7d 20 74 68 65 6e 20  xtra] > 0} then 
d1b0: 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  {..        appen
d1c0: 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 3b 20  d connection \; 
d1d0: 24 65 78 74 72 61 0d 0a 20 20 20 20 20 20 7d 0d  $extra..      }.
d1e0: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
d1f0: 20 20 23 20 4e 4f 54 45 3a 20 4f 70 65 6e 20 74    # NOTE: Open t
d200: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
d210: 65 63 74 69 6f 6e 20 6e 6f 77 2c 20 70 6c 61 63  ection now, plac
d220: 69 6e 67 20 74 68 65 20 6f 70 61 71 75 65 20 68  ing the opaque h
d230: 61 6e 64 6c 65 20 76 61 6c 75 65 0d 0a 20 20 20  andle value..   
d240: 20 20 20 23 20 20 20 20 20 20 20 69 6e 74 6f 20     #       into 
d250: 74 68 65 20 76 61 72 69 61 62 6c 65 20 73 70 65  the variable spe
d260: 63 69 66 69 65 64 20 62 79 20 6f 75 72 20 63 61  cified by our ca
d270: 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ller...      #..
d280: 20 20 20 20 20 20 73 65 74 20 64 62 20 5b 73 71        set db [sq
d290: 6c 20 6f 70 65 6e 20 2d 74 79 70 65 20 53 51 4c  l open -type SQL
d2a0: 69 74 65 20 5b 73 75 62 73 74 20 24 63 6f 6e 6e  ite [subst $conn
d2b0: 65 63 74 69 6f 6e 5d 5d 0d 0a 0d 0a 20 20 20 20  ection]]....    
d2c0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
d2d0: 45 3a 20 43 6f 6e 66 69 67 75 72 65 20 74 68 65  E: Configure the
d2e0: 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63   temporary direc
d2f0: 74 6f 72 79 20 66 6f 72 20 74 68 65 20 6e 65 77  tory for the new
d300: 6c 79 20 6f 70 65 6e 65 64 20 64 61 74 61 62 61  ly opened databa
d310: 73 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  se..      #     
d320: 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 77    connection now
d330: 20 75 6e 6c 65 73 73 20 6f 75 72 20 63 61 6c 6c   unless our call
d340: 65 72 20 66 6f 72 62 69 64 73 20 69 74 2e 0d 0a  er forbids it...
d350: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
d360: 66 20 7b 24 74 65 6d 70 6f 72 61 72 79 20 26 26  f {$temporary &&
d370: 20 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   ![info exists :
d380: 3a 6e 6f 28 73 65 74 54 65 6d 70 6f 72 61 72 79  :no(setTemporary
d390: 44 69 72 65 63 74 6f 72 79 29 5d 7d 20 74 68 65  Directory)]} the
d3a0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 71 6c  n {..        sql
d3b0: 20 65 78 65 63 75 74 65 20 24 64 62 20 5b 61 70   execute $db [ap
d3c0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
d3d0: 20 20 20 20 20 20 20 20 22 50 52 41 47 4d 41 20          "PRAGMA 
d3e0: 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63  temp_store_direc
d3f0: 74 6f 72 79 20 3d 20 5c 22 22 20 5b 67 65 74 54  tory = \"" [getT
d400: 65 6d 70 6f 72 61 72 79 44 69 72 65 63 74 6f 72  emporaryDirector
d410: 79 5d 20 5c 22 5c 3b 5d 0d 0a 20 20 20 20 20 20  y] \"\;]..      
d420: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
d430: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 6c 77 61      # NOTE: Alwa
d440: 79 73 20 72 65 74 75 72 6e 20 74 68 65 20 63 6f  ys return the co
d450: 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20  nnection handle 
d460: 75 70 6f 6e 20 73 75 63 63 65 73 73 2e 0d 0a 20  upon success... 
d470: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
d480: 74 75 72 6e 20 24 64 62 0d 0a 20 20 20 20 7d 0d  turn $db..    }.
d490: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
d4a0: 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20 7b  DbConnection { {
d4b0: 76 61 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b 0d  varName db} } {.
d4c0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
d4d0: 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f  # NOTE: Refer to
d4e0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76   the specified v
d4f0: 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64  ariable (e.g. "d
d500: 62 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  b") in the conte
d510: 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20  xt of our..     
d520: 20 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e   #       caller.
d530: 20 20 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20    The handle to 
d540: 74 68 65 20 64 61 74 61 62 61 73 65 20 70 72 65  the database pre
d550: 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 76  viously opened v
d560: 69 61 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  ia the..      # 
d570: 20 20 20 20 20 20 5b 73 65 74 75 70 44 62 5d 20        [setupDb] 
d580: 70 72 6f 63 65 64 75 72 65 20 73 68 6f 75 6c 64  procedure should
d590: 20 62 65 20 73 74 6f 72 65 64 20 74 68 65 72 65   be stored there
d5a0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
d5b0: 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
d5c0: 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23  me db....      #
d5d0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
d5e0: 54 68 69 73 20 72 65 74 75 72 6e 73 20 74 68 65  This returns the
d5f0: 20 41 44 4f 2e 4e 45 54 20 49 44 62 43 6f 6e 6e   ADO.NET IDbConn
d600: 65 63 74 69 6f 6e 20 6f 62 6a 65 63 74 20 69 6e  ection object in
d610: 73 74 61 6e 63 65 20 66 6f 72 20 74 68 65 0d 0a  stance for the..
d620: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 70        #       sp
d630: 65 63 69 66 69 65 64 20 64 61 74 61 62 73 65 20  ecified databse 
d640: 68 61 6e 64 6c 65 2e 20 20 53 69 6e 63 65 20 67  handle.  Since g
d650: 65 74 74 69 6e 67 20 74 68 69 73 20 6f 62 6a 65  etting this obje
d660: 63 74 20 72 65 6c 69 65 73 20 75 70 6f 6e 0d 0a  ct relies upon..
d670: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61        #       Ea
d680: 67 6c 65 20 69 6e 74 65 72 6e 61 6c 73 2c 20 67  gle internals, g
d690: 72 65 61 74 20 63 61 72 65 20 73 68 6f 75 6c 64  reat care should
d6a0: 20 62 65 20 74 61 6b 65 6e 20 74 6f 20 61 76 6f   be taken to avo
d6b0: 69 64 20 64 69 73 70 6f 73 69 6e 67 20 6f 66 0d  id disposing of.
d6c0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
d6d0: 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 6f 74  his object or ot
d6e0: 68 65 72 77 69 73 65 20 70 75 74 74 69 6e 67 20  herwise putting 
d6f0: 69 74 20 69 6e 74 6f 20 61 6e 20 69 6e 76 61 6c  it into an inval
d700: 69 64 20 73 74 61 74 65 2e 0d 0a 20 20 20 20 20  id state...     
d710: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
d720: 6e 66 6f 20 65 78 69 73 74 73 20 64 62 5d 7d 20  nfo exists db]} 
d730: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
d740: 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
d750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 62                ob
d760: 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
d770: 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d 6f  gs +NonPublic -o
d780: 62 6a 65 63 74 66 6c 61 67 73 20 2b 4e 6f 44 69  bjectflags +NoDi
d790: 73 70 6f 73 65 20 5c 0d 0a 20 20 20 20 20 20 20  spose \..       
d7a0: 20 20 20 20 20 20 20 20 20 2d 61 6c 69 61 73 20           -alias 
d7b0: 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74 41  Interpreter.GetA
d7c0: 63 74 69 76 65 2e 63 6f 6e 6e 65 63 74 69 6f 6e  ctive.connection
d7d0: 73 20 49 74 65 6d 20 24 64 62 7d 20 5c 0d 0a 20  s Item $db} \.. 
d7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
d7f0: 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65  esult] == 0} the
d800: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  n {..          #
d810: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
d820: 54 45 3a 20 53 75 63 63 65 73 73 2c 20 72 65 74  TE: Success, ret
d830: 75 72 6e 20 74 68 65 20 6f 70 61 71 75 65 20 6f  urn the opaque o
d840: 62 6a 65 63 74 20 68 61 6e 64 6c 65 2e 0d 0a 20  bject handle... 
d850: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
d860: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65        return $re
d870: 73 75 6c 74 0d 0a 20 20 20 20 20 20 20 20 7d 20  sult..        } 
d880: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
d890: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
d8a0: 20 4e 4f 54 45 3a 20 46 61 69 6c 75 72 65 2c 20   NOTE: Failure, 
d8b0: 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20  report why...   
d8c0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
d8d0: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
d8e0: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
d8f0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
d900: 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
d910: 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
d920: 67 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  get connection h
d930: 61 6e 64 6c 65 20 66 6f 72 20 64 61 74 61 62 61  andle for databa
d940: 73 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  se \"" \..      
d950: 20 20 20 20 20 20 20 20 24 64 62 20 22 5c 22 2c          $db "\",
d960: 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24   error: " \n\t $
d970: 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20  result \n]..    
d980: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
d990: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
d9a0: 6f 63 20 66 72 65 65 44 62 43 6f 6e 6e 65 63 74  oc freeDbConnect
d9b0: 69 6f 6e 20 7b 20 7b 76 61 72 4e 61 6d 65 20 63  ion { {varName c
d9c0: 6f 6e 6e 65 63 74 69 6f 6e 7d 20 7d 20 7b 0d 0a  onnection} } {..
d9d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
d9e0: 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20   NOTE: Refer to 
d9f0: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61  the specified va
da00: 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 63 6f  riable (e.g. "co
da10: 6e 6e 65 63 74 69 6f 6e 22 29 20 69 6e 20 74 68  nnection") in th
da20: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
da30: 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 20   context of our 
da40: 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 6f 70 61  caller.  The opa
da50: 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c  que object handl
da60: 65 20 66 6f 72 20 61 6e 20 41 44 4f 2e 4e 45 54  e for an ADO.NET
da70: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
da80: 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 65 76 69  connection previ
da90: 6f 75 73 6c 79 20 72 65 74 75 72 6e 65 64 20 62  ously returned b
daa0: 79 20 5b 67 65 74 44 62 43 6f 6e 6e 65 63 74 69  y [getDbConnecti
dab0: 6f 6e 5d 20 73 68 6f 75 6c 64 20 62 65 0d 0a 20  on] should be.. 
dac0: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 74 6f       #       sto
dad0: 72 65 64 20 74 68 65 72 65 2e 0d 0a 20 20 20 20  red there...    
dae0: 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72    #..      upvar
daf0: 20 31 20 24 76 61 72 4e 61 6d 65 20 63 6f 6e 6e   1 $varName conn
db00: 65 63 74 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20  ection....      
db10: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
db20: 20 41 74 74 65 6d 70 74 20 74 6f 20 72 65 6d 6f   Attempt to remo
db30: 76 65 20 74 68 65 20 6f 70 61 71 75 65 20 6f 62  ve the opaque ob
db40: 6a 65 63 74 20 68 61 6e 64 6c 65 20 66 72 6f 6d  ject handle from
db50: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
db60: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
db70: 6e 6f 77 2e 20 20 54 68 69 73 20 5b 6f 62 6a 65  now.  This [obje
db80: 63 74 20 64 69 73 70 6f 73 65 5d 20 63 61 6c 6c  ct dispose] call
db90: 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c   will not actual
dba0: 6c 79 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68  ly dispose of th
dbb0: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
dbc0: 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 62 6a 65   underlying obje
dbd0: 63 74 20 62 65 63 61 75 73 65 20 74 68 65 20 2b  ct because the +
dbe0: 4e 6f 44 69 73 70 6f 73 65 20 66 6c 61 67 20 77  NoDispose flag w
dbf0: 61 73 20 73 65 74 20 6f 6e 20 69 74 0d 0a 20 20  as set on it..  
dc00: 20 20 20 20 23 20 20 20 20 20 20 20 64 75 72 69      #       duri
dc10: 6e 67 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74  ng creation of t
dc20: 68 65 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74  he opaque object
dc30: 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20   handle...      
dc40: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
dc50: 66 6f 20 65 78 69 73 74 73 20 63 6f 6e 6e 65 63  fo exists connec
dc60: 74 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20 20 20 20  tion] && \..    
dc70: 20 20 20 20 20 20 5b 63 61 74 63 68 20 7b 6f 62        [catch {ob
dc80: 6a 65 63 74 20 64 69 73 70 6f 73 65 20 24 63 6f  ject dispose $co
dc90: 6e 6e 65 63 74 69 6f 6e 7d 20 65 72 72 6f 72 5d  nnection} error]
dca0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
dcb0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
dcc0: 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20  OTE: We somehow 
dcd0: 66 61 69 6c 65 64 20 74 6f 20 72 65 6d 6f 76 65  failed to remove
dce0: 20 74 68 65 20 68 61 6e 64 6c 65 2c 20 72 65 70   the handle, rep
dcf0: 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20  ort why...      
dd00: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75    #..        tpu
dd10: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
dd20: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
dd30: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 3d  ..            "=
dd40: 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
dd50: 6c 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 63 6f  led to remove co
dd60: 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20  nnection handle 
dd70: 5c 22 22 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 20  \"" $connection 
dd80: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
dd90: 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  \", error: " \n\
dda0: 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20  t $error \n]..  
ddb0: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
ddc0: 0a 20 20 20 20 70 72 6f 63 20 61 64 64 44 62 43  .    proc addDbC
ddd0: 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20 63 6f 6e 6e  onnection { conn
dde0: 65 63 74 69 6f 6e 20 7b 76 61 72 4e 61 6d 65 20  ection {varName 
ddf0: 64 62 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  db} } {..      #
de00: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
de10: 52 65 66 65 72 20 74 6f 20 74 68 65 20 73 70 65  Refer to the spe
de20: 63 69 66 69 65 64 20 76 61 72 69 61 62 6c 65 20  cified variable 
de30: 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74  (e.g. "db") in t
de40: 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75  he context of ou
de50: 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  r..      #      
de60: 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20   caller...      
de70: 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31  #..      upvar 1
de80: 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a   $varName db....
de90: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
dea0: 20 4e 4f 54 45 3a 20 43 72 65 61 74 65 20 61 20   NOTE: Create a 
deb0: 63 6f 72 72 65 63 74 6c 79 20 66 6f 72 6d 61 74  correctly format
dec0: 74 65 64 20 6e 61 6d 65 20 66 6f 72 20 74 68 65  ted name for the
ded0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
dee0: 74 69 6f 6e 20 74 6f 0d 0a 20 20 20 20 20 20 23  tion to..      #
def0: 20 20 20 20 20 20 20 62 65 20 61 64 64 65 64 20         be added 
df00: 74 6f 20 74 68 65 20 6c 69 73 74 20 6d 61 6e 61  to the list mana
df10: 67 65 64 20 62 79 20 74 68 65 20 45 61 67 6c 65  ged by the Eagle
df20: 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20   interpreter... 
df30: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65       #..      se
df40: 74 20 64 62 20 5b 6f 62 6a 65 63 74 20 69 6e 76  t db [object inv
df50: 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
df60: 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
df70: 20 20 20 45 61 67 6c 65 2e 5f 43 6f 6d 70 6f 6e     Eagle._Compon
df80: 65 6e 74 73 2e 50 72 69 76 61 74 65 2e 46 6f 72  ents.Private.For
df90: 6d 61 74 4f 70 73 20 44 61 74 61 62 61 73 65 4f  matOps DatabaseO
dfa0: 62 6a 65 63 74 4e 61 6d 65 20 24 63 6f 6e 6e 65  bjectName $conne
dfb0: 63 74 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20  ction \..       
dfc0: 20 20 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74     SQLiteConnect
dfd0: 69 6f 6e 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f  ion [object invo
dfe0: 6b 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47  ke Interpreter.G
dff0: 65 74 41 63 74 69 76 65 20 4e 65 78 74 49 64 5d  etActive NextId]
e000: 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ]....      #..  
e010: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20      # NOTE: Add 
e020: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
e030: 6e 65 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 64  nection provided
e040: 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 20 74   by our caller t
e050: 6f 20 74 68 65 20 6c 69 73 74 0d 0a 20 20 20 20  o the list..    
e060: 20 20 23 20 20 20 20 20 20 20 6f 66 20 74 68 6f    #       of tho
e070: 73 65 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 65 20  se known to the 
e080: 45 61 67 6c 65 20 69 6e 74 65 72 70 72 65 74 65  Eagle interprete
e090: 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  r...      #..   
e0a0: 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
e0b0: 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
e0c0: 69 63 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47  ic Interpreter.G
e0d0: 65 74 41 63 74 69 76 65 2e 63 6f 6e 6e 65 63 74  etActive.connect
e0e0: 69 6f 6e 73 20 41 64 64 20 5c 0d 0a 20 20 20 20  ions Add \..    
e0f0: 20 20 20 20 20 20 24 64 62 20 24 63 6f 6e 6e 65        $db $conne
e100: 63 74 69 6f 6e 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  ction..    }....
e110: 0a 20 20 20 20 70 72 6f 63 20 63 6c 65 61 6e 75  .    proc cleanu
e120: 70 44 62 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b  pDb { fileName {
e130: 76 61 72 4e 61 6d 65 20 64 62 7d 20 7b 63 6f 6c  varName db} {col
e140: 6c 65 63 74 20 74 72 75 65 7d 20 7b 71 75 61 6c  lect true} {qual
e150: 69 66 79 20 74 72 75 65 7d 0d 0a 20 20 20 20 20  ify true}..     
e160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e170: 7b 64 65 6c 65 74 65 20 74 72 75 65 7d 20 7d 20  {delete true} } 
e180: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
e190: 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
e1a0: 74 20 74 6f 20 66 6f 72 63 65 20 61 6c 6c 20 70  t to force all p
e1b0: 65 6e 64 69 6e 67 20 22 67 61 72 62 61 67 65 22  ending "garbage"
e1c0: 20 6f 62 6a 65 63 74 73 20 74 6f 20 62 65 20 63   objects to be c
e1d0: 6f 6c 6c 65 63 74 65 64 2c 0d 0a 20 20 20 20 20  ollected,..     
e1e0: 20 23 20 20 20 20 20 20 20 69 6e 63 6c 75 64 69   #       includi
e1f0: 6e 67 20 53 51 4c 69 74 65 20 73 74 61 74 65 6d  ng SQLite statem
e200: 65 6e 74 73 20 61 6e 64 20 62 61 63 6b 75 70 20  ents and backup 
e210: 6f 62 6a 65 63 74 73 3b 20 74 68 69 73 20 73 68  objects; this sh
e220: 6f 75 6c 64 20 61 6c 6c 6f 77 0d 0a 20 20 20 20  ould allow..    
e230: 20 20 23 20 20 20 20 20 20 20 74 68 65 20 75 6e    #       the un
e240: 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73  derlying databas
e250: 65 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c  e file to be del
e260: 65 74 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  eted...      #..
e270: 20 20 20 20 20 20 69 66 20 7b 24 63 6f 6c 6c 65        if {$colle
e280: 63 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ct} then {..    
e290: 20 20 20 20 63 6f 6c 6c 65 63 74 47 61 72 62 61      collectGarba
e2a0: 67 65 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ge $::test_chann
e2b0: 65 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  el..      }.... 
e2c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
e2d0: 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74  NOTE: Refer to t
e2e0: 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72  he specified var
e2f0: 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22  iable (e.g. "db"
e300: 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74  ) in the context
e310: 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23   of our..      #
e320: 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20 20         caller.  
e330: 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 74 68  The handle to th
e340: 65 20 64 61 74 61 62 61 73 65 20 70 72 65 76 69  e database previ
e350: 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 76 69 61  ously opened via
e360: 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
e370: 20 20 20 20 5b 73 65 74 75 70 44 62 5d 20 70 72      [setupDb] pr
e380: 6f 63 65 64 75 72 65 20 73 68 6f 75 6c 64 20 62  ocedure should b
e390: 65 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e 0d  e stored there..
e3a0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
e3b0: 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65  upvar 1 $varName
e3c0: 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a   db....      #..
e3d0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6c        # NOTE: Cl
e3e0: 6f 73 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ose the connecti
e3f0: 6f 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  on to the databa
e400: 73 65 20 6e 6f 77 2e 20 20 54 68 69 73 20 73 68  se now.  This sh
e410: 6f 75 6c 64 20 61 6c 6c 6f 77 20 75 73 0d 0a 20  ould allow us.. 
e420: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20       #       to 
e430: 64 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72  delete the under
e440: 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  lying database f
e450: 69 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ile...      #.. 
e460: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
e470: 78 69 73 74 73 20 64 62 5d 20 26 26 20 5b 63 61  xists db] && [ca
e480: 74 63 68 20 7b 73 71 6c 20 63 6c 6f 73 65 20 24  tch {sql close $
e490: 64 62 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e  db} error]} then
e4a0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
e4b0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57         # NOTE: W
e4c0: 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64  e somehow failed
e4d0: 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 64 61   to close the da
e4e0: 74 61 62 61 73 65 2c 20 72 65 70 6f 72 74 20 77  tabase, report w
e4f0: 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  hy...        #..
e500: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
e510: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
e520: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
e530: 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
e540: 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
e550: 6f 20 63 6c 6f 73 65 20 64 61 74 61 62 61 73 65  o close database
e560: 20 5c 22 22 20 24 64 62 20 22 5c 22 2c 20 65 72   \"" $db "\", er
e570: 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20  ror: " \..      
e580: 20 20 20 20 20 20 5c 6e 5c 74 20 24 65 72 72 6f        \n\t $erro
e590: 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  r \n]..      }..
e5a0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
e5b0: 20 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20   # NOTE: First, 
e5c0: 73 65 65 20 69 66 20 6f 75 72 20 63 61 6c 6c 65  see if our calle
e5d0: 72 20 68 61 73 20 72 65 71 75 65 73 74 65 64 20  r has requested 
e5e0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
e5f0: 61 62 61 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d  abase...      #.
e600: 0a 20 20 20 20 20 20 73 65 74 20 69 73 4d 65 6d  .      set isMem
e610: 6f 72 79 20 5b 69 73 4d 65 6d 6f 72 79 44 62 20  ory [isMemoryDb 
e620: 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20  $fileName]....  
e630: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
e640: 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 66  OTE: Build the f
e650: 75 6c 6c 20 70 61 74 68 20 74 6f 20 74 68 65 20  ull path to the 
e660: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
e670: 6d 65 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 61 6c  me.  For now, al
e680: 6c 20 74 65 73 74 0d 0a 20 20 20 20 20 20 23 20  l test..      # 
e690: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66        database f
e6a0: 69 6c 65 73 20 61 72 65 20 73 74 6f 72 65 64 20  iles are stored 
e6b0: 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  in the temporary
e6c0: 20 64 69 72 65 63 74 6f 72 79 2e 0d 0a 20 20 20   directory...   
e6d0: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
e6e0: 21 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24 71  !$isMemory && $q
e6f0: 75 61 6c 69 66 79 7d 20 74 68 65 6e 20 7b 0d 0a  ualify} then {..
e700: 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65          set file
e710: 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  Name [file join 
e720: 5b 67 65 74 44 61 74 61 62 61 73 65 44 69 72 65  [getDatabaseDire
e730: 63 74 6f 72 79 5d 20 5b 66 69 6c 65 20 74 61 69  ctory] [file tai
e740: 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20  l $fileName]].. 
e750: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
e760: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
e770: 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 66 69   Check if the fi
e780: 6c 65 20 73 74 69 6c 6c 20 65 78 69 73 74 73 2e  le still exists.
e790: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
e7a0: 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72 79 20   if {!$isMemory 
e7b0: 26 26 20 24 64 65 6c 65 74 65 20 26 26 20 5b 66  && $delete && [f
e7c0: 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65  ile exists $file
e7d0: 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
e7e0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
e7f0: 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 64    # NOTE: Skip d
e800: 65 6c 65 74 69 6e 67 20 64 61 74 61 62 61 73 65  eleting database
e810: 20 66 69 6c 65 73 20 69 66 20 73 6f 6d 65 62 6f   files if somebo
e820: 64 79 20 73 65 74 73 20 74 68 65 20 67 6c 6f 62  dy sets the glob
e830: 61 6c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  al..        #   
e840: 20 20 20 20 76 61 72 69 61 62 6c 65 20 74 6f 20      variable to 
e850: 70 72 65 76 65 6e 74 20 69 74 2e 0d 0a 20 20 20  prevent it...   
e860: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
e870: 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
e880: 73 20 3a 3a 6e 6f 28 63 6c 65 61 6e 75 70 44 62  s ::no(cleanupDb
e890: 46 69 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  File)]} then {..
e8a0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
e8b0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41         # NOTE: A
e8c0: 74 74 65 6d 70 74 20 74 6f 20 64 65 6c 65 74 65  ttempt to delete
e8d0: 20 74 68 65 20 74 65 73 74 20 64 61 74 61 62 61   the test databa
e8e0: 73 65 20 66 69 6c 65 20 6e 6f 77 2e 0d 0a 20 20  se file now...  
e8f0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
e900: 20 20 20 20 20 69 66 20 7b 5b 73 65 74 20 63 6f       if {[set co
e910: 64 65 20 5b 63 61 74 63 68 20 7b 66 69 6c 65 20  de [catch {file 
e920: 64 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65  delete $fileName
e930: 7d 20 65 72 72 6f 72 5d 5d 7d 20 74 68 65 6e 20  } error]]} then 
e940: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  {..            #
e950: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
e960: 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77  NOTE: We somehow
e970: 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74   failed to delet
e980: 65 20 74 68 65 20 66 69 6c 65 2c 20 72 65 70 6f  e the file, repo
e990: 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20  rt why...       
e9a0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
e9b0: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
e9c0: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
e9d0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
e9e0: 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
e9f0: 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
ea00: 6f 20 64 65 6c 65 74 65 20 64 61 74 61 62 61 73  o delete databas
ea10: 65 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65  e file \"" $file
ea20: 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  Name \..        
ea30: 20 20 20 20 20 20 20 20 22 5c 22 20 64 75 72 69          "\" duri
ea40: 6e 67 20 63 6c 65 61 6e 75 70 2c 20 65 72 72 6f  ng cleanup, erro
ea50: 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72  r: " \n\t $error
ea60: 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
ea70: 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  }..        } els
ea80: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  e {..          #
ea90: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
eaa0: 54 45 3a 20 53 68 6f 77 20 74 68 61 74 20 77 65  TE: Show that we
eab0: 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e   skipped deletin
eac0: 67 20 74 68 65 20 66 69 6c 65 2e 0d 0a 20 20 20  g the file...   
ead0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
eae0: 20 20 20 20 73 65 74 20 63 6f 64 65 20 30 0d 0a      set code 0..
eaf0: 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
eb00: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
eb10: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
eb20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
eb30: 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 73 6b  ==== WARNING: sk
eb40: 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20 64  ipped deleting d
eb50: 61 74 61 62 61 73 65 20 66 69 6c 65 20 5c 22 22  atabase file \""
eb60: 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20   $fileName \..  
eb70: 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20              "\" 
eb80: 64 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 5c 6e  during cleanup\n
eb90: 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  "]..        }.. 
eba0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
ebb0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
ebc0: 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 66 69    # NOTE: The fi
ebd0: 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  le does not exis
ebe0: 74 2c 20 73 75 63 63 65 73 73 21 0d 0a 20 20 20  t, success!..   
ebf0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
ec00: 73 65 74 20 63 6f 64 65 20 30 0d 0a 20 20 20 20  set code 0..    
ec10: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74    }....      ret
ec20: 75 72 6e 20 24 63 6f 64 65 0d 0a 20 20 20 20 7d  urn $code..    }
ec30: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 65  .....    proc se
ec40: 74 75 70 44 62 49 6e 74 65 72 72 75 70 74 43 61  tupDbInterruptCa
ec50: 6c 6c 62 61 63 6b 20 7b 20 63 68 61 6e 6e 65 6c  llback { channel
ec60: 20 6c 6f 67 20 7d 20 7b 0d 0a 20 20 20 20 20 20   log } {..      
ec70: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
ec80: 2d 2d 2d 2d 20 73 65 74 74 69 6e 67 20 75 70 20  ---- setting up 
ec90: 64 65 62 75 67 67 65 72 20 69 6e 74 65 72 72 75  debugger interru
eca0: 70 74 20 63 61 6c 6c 62 61 63 6b 2e 2e 2e 20 22  pt callback... "
ecb0: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63  ....      if {[c
ecc0: 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
ecd0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
ece0: 45 3a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  E: Make sure the
ecf0: 20 73 63 72 69 70 74 20 64 65 62 75 67 67 65 72   script debugger
ed00: 20 61 6e 64 20 74 68 65 20 69 73 6f 6c 61 74 65   and the isolate
ed10: 64 20 69 6e 74 65 72 70 72 65 74 65 72 20 61 72  d interpreter ar
ed20: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
ed30: 20 20 20 73 65 74 75 70 20 61 6e 64 20 72 65 61     setup and rea
ed40: 64 79 20 66 6f 72 20 75 73 65 2e 0d 0a 20 20 20  dy for use...   
ed50: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
ed60: 64 65 62 75 67 20 73 65 74 75 70 20 74 72 75 65  debug setup true
ed70: 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20 20   true....       
ed80: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
ed90: 54 45 3a 20 4c 6f 61 64 20 74 68 65 20 6e 65 63  TE: Load the nec
eda0: 65 73 73 61 72 79 20 70 61 63 6b 61 67 65 73 20  essary packages 
edb0: 69 6e 74 6f 20 74 68 65 20 69 73 6f 6c 61 74 65  into the isolate
edc0: 64 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a  d interpreter...
edd0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
ede0: 20 20 20 64 65 62 75 67 20 65 76 61 6c 20 7b 0d     debug eval {.
edf0: 0a 20 20 20 20 20 20 20 20 20 20 70 61 63 6b 61  .          packa
ee00: 67 65 20 72 65 71 75 69 72 65 20 45 61 67 6c 65  ge require Eagle
ee10: 0d 0a 20 20 20 20 20 20 20 20 20 20 70 61 63 6b  ..          pack
ee20: 61 67 65 20 72 65 71 75 69 72 65 20 45 61 67 6c  age require Eagl
ee30: 65 2e 4c 69 62 72 61 72 79 0d 0a 20 20 20 20 20  e.Library..     
ee40: 20 20 20 20 20 70 61 63 6b 61 67 65 20 72 65 71       package req
ee50: 75 69 72 65 20 45 61 67 6c 65 2e 54 65 73 74 0d  uire Eagle.Test.
ee60: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
ee70: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
ee80: 20 23 20 4e 4f 54 45 3a 20 43 6f 70 79 20 74 68   # NOTE: Copy th
ee90: 65 20 6e 65 63 65 73 73 61 72 79 20 76 61 72 69  e necessary vari
eea0: 61 62 6c 65 73 20 69 6e 74 6f 20 74 68 65 20 69  ables into the i
eeb0: 73 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72 65  solated interpre
eec0: 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ter...        #.
eed0: 0a 20 20 20 20 20 20 20 20 64 65 62 75 67 20 69  .        debug i
eee0: 6e 76 6f 6b 65 20 30 20 73 65 74 20 3a 3a 74 65  nvoke 0 set ::te
eef0: 73 74 5f 63 68 61 6e 6e 65 6c 20 24 63 68 61 6e  st_channel $chan
ef00: 6e 65 6c 3b 20 23 20 4e 4f 54 45 3a 20 46 6f 72  nel; # NOTE: For
ef10: 20 5b 74 70 75 74 73 5d 2e 0d 0a 20 20 20 20 20   [tputs]...     
ef20: 20 20 20 64 65 62 75 67 20 69 6e 76 6f 6b 65 20     debug invoke 
ef30: 30 20 73 65 74 20 3a 3a 74 65 73 74 5f 6c 6f 67  0 set ::test_log
ef40: 20 24 6c 6f 67 3b 20 23 20 4e 4f 54 45 3a 20 46   $log; # NOTE: F
ef50: 6f 72 20 5b 74 6c 6f 67 5d 2e 0d 0a 0d 0a 20 20  or [tlog].....  
ef60: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
ef70: 20 23 20 4e 4f 54 45 3a 20 49 6e 73 74 61 6c 6c   # NOTE: Install
ef80: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 73 63   the callback sc
ef90: 72 69 70 74 20 74 6f 20 62 65 20 65 76 61 6c 75  ript to be evalu
efa0: 61 74 65 64 20 69 6e 20 74 68 65 20 69 73 6f 6c  ated in the isol
efb0: 61 74 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20  ated..        # 
efc0: 20 20 20 20 20 20 69 6e 74 65 72 70 72 65 74 65        interprete
efd0: 72 20 77 68 65 6e 20 74 68 69 73 20 69 6e 74 65  r when this inte
efe0: 72 70 72 65 74 65 72 20 69 73 20 69 6e 74 65 72  rpreter is inter
eff0: 72 75 70 74 65 64 20 62 79 20 73 63 72 69 70 74  rupted by script
f000: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
f010: 20 20 63 61 6e 63 65 6c 6c 61 74 69 6f 6e 2c 20    cancellation, 
f020: 65 74 63 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  etc...        #.
f030: 0a 20 20 20 20 20 20 20 20 64 65 62 75 67 20 63  .        debug c
f040: 61 6c 6c 62 61 63 6b 20 61 70 70 6c 79 20 7b 7b  allback apply {{
f050: 73 65 6e 64 65 72 20 65 7d 20 7b 0d 0a 20 20 20  sender e} {..   
f060: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
f070: 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
f080: 6b 20 69 66 20 74 68 69 73 20 63 61 6c 6c 62 61  k if this callba
f090: 63 6b 20 69 73 20 6f 6e 65 20 74 68 61 74 20 77  ck is one that w
f0a0: 65 20 63 61 72 65 20 61 62 6f 75 74 2e 0d 0a 20  e care about... 
f0b0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
f0c0: 20 20 20 20 20 20 69 66 20 7b 22 43 61 6e 63 65        if {"Cance
f0d0: 6c 65 64 22 20 69 6e 20 5b 73 70 6c 69 74 20 5b  led" in [split [
f0e0: 24 65 20 49 6e 74 65 72 72 75 70 74 54 79 70 65  $e InterruptType
f0f0: 5d 20 22 2c 20 22 5d 7d 20 74 68 65 6e 20 7b 0d  ] ", "]} then {.
f100: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
f110: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
f120: 54 45 3a 20 49 74 65 72 61 74 65 20 74 68 72 6f  TE: Iterate thro
f130: 75 67 68 20 61 6c 6c 20 64 61 74 61 62 61 73 65  ugh all database
f140: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6b 6e 6f   connections kno
f150: 77 6e 20 74 6f 20 74 68 65 0d 0a 20 20 20 20 20  wn to the..     
f160: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70         #       p
f170: 61 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65  arent interprete
f180: 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  r...            
f190: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  #..            o
f1a0: 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20 2d 61  bject foreach -a
f1b0: 6c 69 61 73 20 70 61 69 72 20 5c 0d 0a 20 20 20  lias pair \..   
f1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 6f 62               [ob
f1d0: 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
f1e0: 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 24 65  gs +NonPublic $e
f1f0: 20 49 6e 74 65 72 70 72 65 74 65 72 2e 63 6f 6e   Interpreter.con
f200: 6e 65 63 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20  nections] {..   
f210: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
f220: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
f230: 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 63  TE: Attempt to c
f240: 61 6e 63 65 6c 20 61 6e 79 20 53 51 4c 20 71 75  ancel any SQL qu
f250: 65 72 69 65 73 20 69 6e 20 70 72 6f 67 72 65 73  eries in progres
f260: 73 20 6f 6e 20 74 68 69 73 0d 0a 20 20 20 20 20  s on this..     
f270: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
f280: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
f290: 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20 20  tion...         
f2a0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
f2b0: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
f2c0: 20 7b 24 70 61 69 72 20 56 61 6c 75 65 2e 43 61   {$pair Value.Ca
f2d0: 6e 63 65 6c 7d 20 65 72 72 6f 72 5d 7d 20 74 68  ncel} error]} th
f2e0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
f2f0: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
f300: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
f310: 65 6e 64 41 72 67 73 20 5c 6e 20 5c 0d 0a 20 20  endArgs \n \..  
f320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f330: 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
f340: 20 66 61 69 6c 65 64 20 74 6f 20 63 61 6e 63 65   failed to cance
f350: 6c 20 71 75 65 72 79 20 66 6f 72 20 63 6f 6e 6e  l query for conn
f360: 65 63 74 69 6f 6e 20 5c 22 22 20 5c 0d 0a 20 20  ection \"" \..  
f370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f380: 20 20 5b 24 70 61 69 72 20 4b 65 79 5d 20 22 5c    [$pair Key] "\
f390: 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  ", error: " \n\t
f3a0: 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20   $error \n]..   
f3b0: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
f3c0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
f3d0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
f3e0: 20 20 7d 7d 0d 0a 20 20 20 20 20 20 7d 20 65 72    }}..      } er
f3f0: 72 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ror] == 0} then 
f400: 7b 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  {..        addCo
f410: 6e 73 74 72 61 69 6e 74 20 69 6e 74 65 72 72 75  nstraint interru
f420: 70 74 43 61 6c 6c 62 61 63 6b 2e 73 71 6c 69 74  ptCallback.sqlit
f430: 65 33 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70  e3....        tp
f440: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73  uts $channel yes
f450: 5c 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  \n..      } else
f460: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
f470: 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
f480: 6e 64 41 72 67 73 20 22 6e 6f 2c 20 65 72 72 6f  ndArgs "no, erro
f490: 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72  r: " \n\t $error
f4a0: 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20   \n]..      }.. 
f4b0: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
f4c0: 63 20 63 6c 65 61 6e 75 70 46 69 6c 65 20 7b 20  c cleanupFile { 
f4d0: 66 69 6c 65 4e 61 6d 65 20 7b 63 6f 6c 6c 65 63  fileName {collec
f4e0: 74 20 74 72 75 65 7d 20 7b 66 6f 72 63 65 20 66  t true} {force f
f4f0: 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  alse} } {..     
f500: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
f510: 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 66 6f 72  : Attempt to for
f520: 63 65 20 61 6c 6c 20 70 65 6e 64 69 6e 67 20 22  ce all pending "
f530: 67 61 72 62 61 67 65 22 20 6f 62 6a 65 63 74 73  garbage" objects
f540: 20 74 6f 20 62 65 20 63 6f 6c 6c 65 63 74 65 64   to be collected
f550: 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  ,..      #      
f560: 20 69 6e 63 6c 75 64 69 6e 67 20 53 51 4c 69 74   including SQLit
f570: 65 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6e 64  e statements and
f580: 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 3b   backup objects;
f590: 20 74 68 69 73 20 73 68 6f 75 6c 64 20 61 6c 6c   this should all
f5a0: 6f 77 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ow..      #     
f5b0: 20 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67    the underlying
f5c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
f5d0: 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 0d 0a 20  o be deleted... 
f5e0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
f5f0: 20 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65 6e   {$collect} then
f600: 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c 6c   {..        coll
f610: 65 63 74 47 61 72 62 61 67 65 20 24 3a 3a 74 65  ectGarbage $::te
f620: 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20  st_channel..    
f630: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
f640: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
f650: 65 63 6b 20 69 66 20 74 68 65 20 66 69 6c 65 20  eck if the file 
f660: 73 74 69 6c 6c 20 65 78 69 73 74 73 2e 0d 0a 20  still exists... 
f670: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
f680: 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24   {[file exists $
f690: 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  fileName]} then 
f6a0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
f6b0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b        # NOTE: Sk
f6c0: 69 70 20 64 65 6c 65 74 69 6e 67 20 74 65 73 74  ip deleting test
f6d0: 20 66 69 6c 65 73 20 69 66 20 73 6f 6d 65 62 6f   files if somebo
f6e0: 64 79 20 73 65 74 73 20 74 68 65 20 67 6c 6f 62  dy sets the glob
f6f0: 61 6c 20 76 61 72 69 61 62 6c 65 0d 0a 20 20 20  al variable..   
f700: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20       #       to 
f710: 70 72 65 76 65 6e 74 20 69 74 2e 0d 0a 20 20 20  prevent it...   
f720: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
f730: 69 66 20 7b 24 66 6f 72 63 65 20 7c 7c 20 21 5b  if {$force || ![
f740: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
f750: 28 63 6c 65 61 6e 75 70 46 69 6c 65 29 5d 7d 20  (cleanupFile)]} 
f760: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
f770: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
f780: 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
f790: 6f 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 73  o delete the tes
f7a0: 74 20 66 69 6c 65 20 6e 6f 77 2e 0d 0a 20 20 20  t file now...   
f7b0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
f7c0: 20 20 20 20 69 66 20 7b 5b 73 65 74 20 63 6f 64      if {[set cod
f7d0: 65 20 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64  e [catch {file d
f7e0: 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d  elete $fileName}
f7f0: 20 65 72 72 6f 72 5d 5d 7d 20 74 68 65 6e 20 7b   error]]} then {
f800: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
f810: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
f820: 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20  OTE: We somehow 
f830: 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65  failed to delete
f840: 20 74 68 65 20 66 69 6c 65 2c 20 72 65 70 6f 72   the file, repor
f850: 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20  t why...        
f860: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
f870: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
f880: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
f890: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
f8a0: 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
f8b0: 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
f8c0: 20 64 65 6c 65 74 65 20 74 65 73 74 20 66 69 6c   delete test fil
f8d0: 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20  e \"" $fileName 
f8e0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
f8f0: 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c     "\" during cl
f900: 65 61 6e 75 70 2c 20 65 72 72 6f 72 3a 20 22 20  eanup, error: " 
f910: 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
f920: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
f930: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
f940: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
f950: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
f960: 68 6f 77 20 74 68 61 74 20 77 65 20 73 6b 69 70  how that we skip
f970: 70 65 64 20 64 65 6c 65 74 69 6e 67 20 74 68 65  ped deleting the
f980: 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20   file...        
f990: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73    #..          s
f9a0: 65 74 20 63 6f 64 65 20 30 0d 0a 0d 0a 20 20 20  et code 0....   
f9b0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
f9c0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
f9d0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
f9e0: 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
f9f0: 57 41 52 4e 49 4e 47 3a 20 73 6b 69 70 70 65 64  WARNING: skipped
fa00: 20 64 65 6c 65 74 69 6e 67 20 74 65 73 74 20 66   deleting test f
fa10: 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d  ile \"" $fileNam
fa20: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
fa30: 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c     "\" during cl
fa40: 65 61 6e 75 70 5c 6e 22 5d 0d 0a 20 20 20 20 20  eanup\n"]..     
fa50: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
fa60: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
fa70: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
fa80: 20 54 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e   The file does n
fa90: 6f 74 20 65 78 69 73 74 2c 20 73 75 63 63 65 73  ot exist, succes
faa0: 73 21 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  s!..        #.. 
fab0: 20 20 20 20 20 20 20 73 65 74 20 63 6f 64 65 20         set code 
fac0: 30 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  0..      }....  
fad0: 20 20 20 20 72 65 74 75 72 6e 20 24 63 6f 64 65      return $code
fae0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
faf0: 70 72 6f 63 20 63 6f 6c 6c 65 63 74 47 61 72 62  proc collectGarb
fb00: 61 67 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 6d  age { channel {m
fb10: 69 6c 6c 69 73 65 63 6f 6e 64 73 20 31 30 30 30  illiseconds 1000
fb20: 7d 20 7b 71 75 69 65 74 20 74 72 75 65 7d 20 7d  } {quiet true} }
fb30: 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63   {..      if {[c
fb40: 61 74 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76  atch {object inv
fb50: 6f 6b 65 20 47 43 20 47 65 74 54 6f 74 61 6c 4d  oke GC GetTotalM
fb60: 65 6d 6f 72 79 20 66 61 6c 73 65 7d 20 72 65 73  emory false} res
fb70: 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ult] == 0} then 
fb80: 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  {..        if {!
fb90: 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
fba0: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
fbb0: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
fbc0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
fbd0: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6d 65 6d 6f        "---- memo
fbe0: 72 79 20 69 6e 20 75 73 65 20 62 79 20 74 68 65  ry in use by the
fbf0: 20 43 4c 52 20 62 65 66 6f 72 65 20 63 6f 6c 6c   CLR before coll
fc00: 65 63 74 69 6f 6e 2e 2e 2e 20 22 20 5c 0d 0a 20  ection... " \.. 
fc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 24 72 65               $re
fc20: 73 75 6c 74 20 22 20 62 79 74 65 73 5c 6e 22 5d  sult " bytes\n"]
fc30: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
fc40: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
fc50: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
fc60: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
fc70: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
fc80: 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
fc90: 69 6c 65 64 20 74 6f 20 67 65 74 20 43 4c 52 20  iled to get CLR 
fca0: 6d 65 6d 6f 72 79 20 75 73 61 67 65 2c 20 65 72  memory usage, er
fcb0: 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20  ror: " \..      
fcc0: 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73 75        \n\t $resu
fcd0: 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d  lt \n]..      }.
fce0: 0a 0d 0a 20 20 20 20 20 20 23 23 23 23 23 23 23  ...      #######
fcf0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
fd00: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
fd10: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
fd20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
fd30: 23 23 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ##....      #.. 
fd40: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 70       # NOTE: Rep
fd50: 65 61 74 65 64 6c 79 20 61 74 74 65 6d 70 74 20  eatedly attempt 
fd60: 74 6f 20 63 6f 6c 6c 65 63 74 20 67 61 72 62 61  to collect garba
fd70: 67 65 20 75 6e 74 69 6c 20 74 68 65 20 61 6c 6c  ge until the all
fd80: 6f 74 74 65 64 20 6e 75 6d 62 65 72 0d 0a 20 20  otted number..  
fd90: 20 20 20 20 23 20 20 20 20 20 20 20 6f 66 20 6d      #       of m
fda0: 69 6c 6c 69 73 65 63 6f 6e 64 73 20 68 61 73 20  illiseconds has 
fdb0: 65 6c 61 70 73 65 64 2e 20 20 41 6c 77 61 79 73  elapsed.  Always
fdc0: 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6f 6c 6c   attempt to coll
fdd0: 65 63 74 20 67 61 72 62 61 67 65 0d 0a 20 20 20  ect garbage..   
fde0: 20 20 20 23 20 20 20 20 20 20 20 61 74 20 6c 65     #       at le
fdf0: 61 73 74 20 6f 6e 63 65 2e 0d 0a 20 20 20 20 20  ast once...     
fe00: 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 73 74   #..      set st
fe10: 61 72 74 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e  art [clock secon
fe20: 64 73 5d 0d 0a 20 20 20 20 20 20 73 65 74 20 73  ds]..      set s
fe30: 74 6f 70 20 5b 65 78 70 72 20 7b 24 73 74 61 72  top [expr {$star
fe40: 74 20 2b 20 28 24 6d 69 6c 6c 69 73 65 63 6f 6e  t + ($millisecon
fe50: 64 73 20 2f 20 31 30 30 30 29 7d 5d 0d 0a 0d 0a  ds / 1000)}]....
fe60: 20 20 20 20 20 20 64 6f 20 7b 0d 0a 20 20 20 20        do {..    
fe70: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
fe80: 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
fe90: 6f 20 66 6f 72 63 65 20 61 20 66 75 6c 6c 20 67  o force a full g
fea0: 61 72 62 61 67 65 20 63 6f 6c 6c 65 63 74 69 6f  arbage collectio
feb0: 6e 20 6e 6f 77 2e 20 20 52 65 70 6f 72 74 20 61  n now.  Report a
fec0: 6e 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ny..        #   
fed0: 20 20 20 20 65 72 72 6f 72 20 74 68 61 74 20 69      error that i
fee0: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 66  s encountered if
fef0: 20 77 65 20 66 61 69 6c 2e 0d 0a 20 20 20 20 20   we fail...     
ff00: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
ff10: 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74   {[catch {object
ff20: 20 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54 6f   invoke GC GetTo
ff30: 74 61 6c 4d 65 6d 6f 72 79 20 74 72 75 65 7d 20  talMemory true} 
ff40: 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a  error]} then {..
ff50: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
ff60: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
ff70: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
ff80: 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
ff90: 49 4e 47 3a 20 66 61 69 6c 65 64 20 66 75 6c 6c  ING: failed full
ffa0: 20 67 61 72 62 61 67 65 20 63 6f 6c 6c 65 63 74   garbage collect
ffb0: 69 6f 6e 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d  ion, error: " \.
ffc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c  .              \
ffd0: 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a  n\t $error \n]..
ffe0: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
fff0: 20 20 20 20 20 73 65 74 20 6e 6f 77 20 5b 63 6c       set now [cl
10000 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 0d 0a 20 20  ock seconds]..  
10010 20 20 20 20 7d 20 77 68 69 6c 65 20 7b 24 73 74      } while {$st
10020 61 72 74 20 3c 3d 20 24 6e 6f 77 20 26 26 20 24  art <= $now && $
10030 6e 6f 77 20 3c 20 24 73 74 6f 70 7d 0d 0a 0d 0a  now < $stop}....
10040 20 20 20 20 20 20 23 23 23 23 23 23 23 23 23 23        ##########
10050 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
10060 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
10070 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
10080 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
10090 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  ...      if {[ca
100a0 74 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f  tch {object invo
100b0 6b 65 20 47 43 20 47 65 74 54 6f 74 61 6c 4d 65  ke GC GetTotalMe
100c0 6d 6f 72 79 20 66 61 6c 73 65 7d 20 72 65 73 75  mory false} resu
100d0 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  lt] == 0} then {
100e0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24  ..        if {!$
100f0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
10100 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
10110 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
10120 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
10130 20 20 20 20 20 22 2d 2d 2d 2d 20 6d 65 6d 6f 72       "---- memor
10140 79 20 69 6e 20 75 73 65 20 62 79 20 74 68 65 20  y in use by the 
10150 43 4c 52 20 61 66 74 65 72 20 63 6f 6c 6c 65 63  CLR after collec
10160 74 69 6f 6e 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20  tion... " \..   
10170 20 20 20 20 20 20 20 20 20 20 20 24 72 65 73 75             $resu
10180 6c 74 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a  lt " bytes\n"]..
10190 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
101a0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
101b0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
101c0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
101d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d  .            "==
101e0 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
101f0 65 64 20 74 6f 20 67 65 74 20 43 4c 52 20 6d 65  ed to get CLR me
10200 6d 6f 72 79 20 75 73 61 67 65 2c 20 65 72 72 6f  mory usage, erro
10210 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  r: " \..        
10220 20 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74      \n\t $result
10230 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20   \n]..      }.. 
10240 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
10250 63 20 67 65 74 53 51 4c 69 74 65 48 61 6e 64 6c  c getSQLiteHandl
10260 65 43 6f 75 6e 74 73 20 7b 20 63 68 61 6e 6e 65  eCounts { channe
10270 6c 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20  l {quiet false} 
10280 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 72  } {..      set r
10290 65 73 75 6c 74 20 5b 6c 69 73 74 5d 0d 0a 0d 0a  esult [list]....
102a0 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 43        if {[haveC
102b0 6f 6e 73 74 72 61 69 6e 74 20 5c 0d 0a 20 20 20  onstraint \..   
102c0 20 20 20 20 20 20 20 20 20 20 20 64 65 66 69 6e             defin
102d0 65 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74 65 6d  eConstant.System
102e0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 43 4f 55  .Data.SQLite.COU
102f0 4e 54 5f 48 41 4e 44 4c 45 5d 7d 20 74 68 65 6e  NT_HANDLE]} then
10300 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
10310 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41         # NOTE: A
10320 64 64 20 65 61 63 68 20 63 72 69 74 69 63 61 6c  dd each critical
10330 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 20 74 6f   handle count to
10340 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20 6c   the resulting l
10350 69 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ist...        #.
10360 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  .        foreach
10370 20 6e 61 6d 65 20 5b 6c 69 73 74 20 63 6f 6e 6e   name [list conn
10380 65 63 74 69 6f 6e 43 6f 75 6e 74 20 73 74 61 74  ectionCount stat
10390 65 6d 65 6e 74 43 6f 75 6e 74 20 62 61 63 6b 75  ementCount backu
103a0 70 43 6f 75 6e 74 5d 20 7b 0d 0a 20 20 20 20 20  pCount] {..     
103b0 20 20 20 20 20 73 65 74 20 76 61 6c 75 65 20 5b       set value [
103c0 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
103d0 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
103e0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
103f0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
10400 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65  ite.UnsafeNative
10410 4d 65 74 68 6f 64 73 20 24 6e 61 6d 65 5d 0d 0a  Methods $name]..
10420 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
10430 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
10440 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
10450 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
10460 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
10470 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
10480 20 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65   critical handle
10490 20 63 6f 75 6e 74 20 5c 22 22 20 24 6e 61 6d 65   count \"" $name
104a0 20 22 5c 22 20 69 73 20 22 20 24 76 61 6c 75 65   "\" is " $value
104b0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
104c0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 6c  }....          l
104d0 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 24 76  append result $v
104e0 61 6c 75 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d  alue..        }.
104f0 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20  .      } elseif 
10500 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
10510 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
10520 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
10530 20 61 63 74 75 61 6c 20 68 61 6e 64 6c 65 20 63   actual handle c
10540 6f 75 6e 74 73 20 61 72 65 20 6e 6f 74 20 61 76  ounts are not av
10550 61 69 6c 61 62 6c 65 3b 20 74 68 65 72 65 66 6f  ailable; therefo
10560 72 65 2c 20 6a 75 73 74 0d 0a 20 20 20 20 20 20  re, just..      
10570 20 20 23 20 20 20 20 20 20 20 72 65 74 75 72 6e    #       return
10580 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e 0d   an empty list..
10590 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
105a0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
105b0 65 6c 20 22 2d 2d 2d 2d 20 63 72 69 74 69 63 61  el "---- critica
105c0 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 73 20  l handle counts 
105d0 75 6e 61 76 61 69 6c 61 62 6c 65 5c 6e 22 0d 0a  unavailable\n"..
105e0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
105f0 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d   return $result.
10600 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
10610 72 6f 63 20 73 68 75 74 64 6f 77 6e 53 51 4c 69  roc shutdownSQLi
10620 74 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 66 6f  te { channel {fo
10630 72 63 65 20 66 61 6c 73 65 7d 20 7b 71 75 69 65  rce false} {quie
10640 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20  t false} } {..  
10650 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
10660 4f 54 45 3a 20 4d 61 6b 65 20 73 75 72 65 20 74  OTE: Make sure t
10670 68 61 74 20 53 51 4c 69 74 65 20 63 6f 72 65 20  hat SQLite core 
10680 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d 70 6c  library is compl
10690 65 74 65 6c 79 20 73 68 75 74 64 6f 77 6e 2e 20  etely shutdown. 
106a0 20 54 68 69 73 0d 0a 20 20 20 20 20 20 23 20 20   This..      #  
106b0 20 20 20 20 20 69 73 20 75 73 65 64 20 62 79 20       is used by 
106c0 74 65 73 74 73 20 74 68 61 74 20 63 68 61 6e 67  tests that chang
106d0 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
106e0 6f 70 74 69 6f 6e 73 20 61 6e 64 2f 6f 72 20 74  options and/or t
106f0 68 6f 73 65 0d 0a 20 20 20 20 20 20 23 20 20 20  hose..      #   
10700 20 20 20 20 74 68 61 74 20 6e 65 65 64 20 74 6f      that need to
10710 20 6d 61 6b 65 20 73 75 72 65 20 6c 6f 67 67 69   make sure loggi
10720 6e 67 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  ng is initialize
10730 64 20 28 69 2e 65 2e 20 6a 75 73 74 20 69 6e 20  d (i.e. just in 
10740 63 61 73 65 0d 0a 20 20 20 20 20 20 23 20 20 20  case..      #   
10750 20 20 20 20 74 68 65 20 53 51 4c 69 74 65 20 63      the SQLite c
10760 6f 72 65 20 6c 69 62 72 61 72 79 20 77 61 73 20  ore library was 
10770 69 6e 69 74 69 61 6c 69 7a 65 64 20 69 6e 20 74  initialized in t
10780 68 65 20 70 72 6f 63 65 73 73 20 70 72 69 6f 72  he process prior
10790 20 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20   to..      #    
107a0 20 20 20 74 68 65 20 53 51 4c 69 74 65 4c 6f 67     the SQLiteLog
107b0 20 63 6c 61 73 73 20 62 65 69 6e 67 20 61 62 6c   class being abl
107c0 65 20 74 6f 20 73 65 74 75 70 20 69 74 73 20 6c  e to setup its l
107d0 6f 67 67 69 6e 67 20 63 61 6c 6c 62 61 63 6b 29  ogging callback)
107e0 2e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  ...      #      
107f0 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20   Normally, this 
10800 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 70  should only be p
10810 65 72 66 6f 72 6d 65 64 20 69 66 20 53 51 4c 69  erformed if SQLi
10820 74 65 20 69 73 20 6c 6f 61 64 65 64 20 61 6e 64  te is loaded and
10830 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
10840 72 65 61 64 79 20 66 6f 72 20 75 73 65 20 62 79  ready for use by
10850 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e   the test suite.
10860 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
10870 20 69 66 20 7b 24 66 6f 72 63 65 20 7c 7c 20 5b   if {$force || [
10880 69 73 53 51 4c 69 74 65 52 65 61 64 79 5d 7d 20  isSQLiteReady]} 
10890 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
108a0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 42 55 47  #..        # BUG
108b0 46 49 58 3a 20 42 65 66 6f 72 65 20 63 61 6c 6c  FIX: Before call
108c0 69 6e 67 20 74 68 65 20 6e 61 74 69 76 65 20 73  ing the native s
108d0 68 75 74 64 6f 77 6e 20 66 75 6e 63 74 69 6f 6e  hutdown function
108e0 2c 20 6d 61 6b 65 20 73 75 72 65 20 62 6f 74 68  , make sure both
108f0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
10900 20 20 20 20 6f 66 20 74 68 65 20 50 52 41 47 4d      of the PRAGM
10910 41 20 72 65 6c 61 74 65 64 20 64 69 72 65 63 74  A related direct
10920 6f 72 79 20 6e 61 6d 65 73 20 61 72 65 20 66 72  ory names are fr
10930 65 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  eed...        #.
10940 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f  .        checkFo
10950 72 53 51 4c 69 74 65 44 69 72 65 63 74 6f 72 69  rSQLiteDirectori
10960 65 73 20 24 63 68 61 6e 6e 65 6c 20 74 72 75 65  es $channel true
10970 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
10980 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20 69  [catch {object i
10990 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
109a0 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
109b0 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
109c0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e  m.Data.SQLite.Un
109d0 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
109e0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
109f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 68 75       sqlite3_shu
10a00 74 64 6f 77 6e 7d 20 72 65 73 75 6c 74 5d 20 3d  tdown} result] =
10a10 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
10a20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
10a30 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
10a40 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
10a50 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
10a60 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
10a70 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c        "---- call
10a80 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77   sqlite3_shutdow
10a90 6e 28 29 2e 2e 2e 20 6f 6b 3a 20 22 20 24 72 65  n()... ok: " $re
10aa0 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  sult \n]..      
10ab0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
10ac0 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
10ad0 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
10ae0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
10af0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
10b00 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
10b10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
10b20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c    "---- call sql
10b30 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 2e  ite3_shutdown().
10b40 2e 2e 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  .. error: " \n\t
10b50 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20   $result \n]..  
10b60 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
10b70 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20     }..      }.. 
10b80 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
10b90 63 20 72 65 70 6f 72 74 53 51 4c 69 74 65 52 65  c reportSQLiteRe
10ba0 73 6f 75 72 63 65 73 20 7b 20 63 68 61 6e 6e 65  sources { channe
10bb0 6c 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20  l {quiet false} 
10bc0 7b 63 6f 6c 6c 65 63 74 20 74 72 75 65 7d 20 7d  {collect true} }
10bd0 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
10be0 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20     # NOTE: Skip 
10bf0 61 6c 6c 20 6f 75 74 70 75 74 20 69 66 20 77 65  all output if we
10c00 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20   are running in 
10c10 22 71 75 69 65 74 22 20 6d 6f 64 65 2e 0d 0a 20  "quiet" mode... 
10c20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
10c30 20 7b 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e   {[haveConstrain
10c40 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
10c50 20 20 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e     defineConstan
10c60 74 2e 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  t.System.Data.SQ
10c70 4c 69 74 65 2e 49 4e 54 45 52 4f 50 5f 56 49 52  Lite.INTEROP_VIR
10c80 54 55 41 4c 5f 54 41 42 4c 45 5d 20 26 26 20 5c  TUAL_TABLE] && \
10c90 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 68 61 76  ..          [hav
10ca0 65 43 6f 6e 73 74 72 61 69 6e 74 20 5c 0d 0a 20  eConstraint \.. 
10cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65 66               def
10cc0 69 6e 65 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74  ineConstant.Syst
10cd0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 54  em.Data.SQLite.T
10ce0 52 41 43 4b 5f 4d 45 4d 4f 52 59 5f 42 59 54 45  RACK_MEMORY_BYTE
10cf0 53 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  S]} then {..    
10d00 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
10d10 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
10d20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
10d30 6c 20 22 2d 2d 2d 2d 20 63 75 72 72 65 6e 74 20  l "---- current 
10d40 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79  memory in use by
10d50 20 53 51 4c 69 74 65 4d 65 6d 6f 72 79 2e 2e 2e   SQLiteMemory...
10d60 20 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   "..        }...
10d70 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
10d80 74 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f  tch {object invo
10d90 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
10da0 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
10db0 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
10dc0 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74  ata.SQLite.SQLit
10dd0 65 4d 65 6d 6f 72 79 20 5c 0d 0a 20 20 20 20 20  eMemory \..     
10de0 20 20 20 20 20 20 20 20 20 20 20 62 79 74 65 73             bytes
10df0 41 6c 6c 6f 63 61 74 65 64 7d 20 6d 65 6d 6f 72  Allocated} memor
10e00 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  y] == 0} then {.
10e10 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
10e20 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
10e30 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
10e40 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
10e50 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22  ndArgs $memory "
10e60 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20   bytes\n"]..    
10e70 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
10e80 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
10e90 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20       set memory 
10ea0 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20  unknown....     
10eb0 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
10ec0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
10ed0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
10ee0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
10ef0 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20   $memory \n]..  
10f00 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
10f10 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
10f20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
10f30 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
10f40 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
10f50 2d 2d 2d 20 6d 61 78 69 6d 75 6d 20 6d 65 6d 6f  --- maximum memo
10f60 72 79 20 69 6e 20 75 73 65 20 62 79 20 53 51 4c  ry in use by SQL
10f70 69 74 65 4d 65 6d 6f 72 79 2e 2e 2e 20 22 0d 0a  iteMemory... "..
10f80 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
10f90 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
10fa0 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d  {object invoke -
10fb0 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
10fc0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
10fd0 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
10fe0 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 4d 65 6d  SQLite.SQLiteMem
10ff0 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ory \..         
11000 20 20 20 20 20 20 20 6d 61 78 69 6d 75 6d 42 79         maximumBy
11010 74 65 73 41 6c 6c 6f 63 61 74 65 64 7d 20 6d 65  tesAllocated} me
11020 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  mory] == 0} then
11030 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
11040 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
11050 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
11060 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
11070 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72  ppendArgs $memor
11080 79 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20  y " bytes\n"].. 
11090 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
110a0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
110b0 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f          set memo
110c0 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20  ry unknown....  
110d0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
110e0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
110f0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
11100 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
11110 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d  rgs $memory \n].
11120 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
11130 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
11140 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24  ....      if {!$
11150 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
11160 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
11170 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 75 72 72  annel "---- curr
11180 65 6e 74 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73  ent memory in us
11190 65 20 62 79 20 53 51 4c 69 74 65 2e 2e 2e 20 22  e by SQLite... "
111a0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
111b0 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f     if {[catch {o
111c0 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
111d0 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
111e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
111f0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
11200 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d  te.UnsafeNativeM
11210 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20  ethods \..      
11220 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
11230 6d 65 6d 6f 72 79 5f 75 73 65 64 7d 20 6d 65 6d  memory_used} mem
11240 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ory] == 0} then 
11250 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  {..        if {!
11260 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
11270 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
11280 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
11290 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20 62  Args $memory " b
112a0 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  ytes\n"]..      
112b0 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73    }..      } els
112c0 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e {..        #..
112d0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
112e0 4d 61 79 62 65 20 74 68 65 20 53 51 4c 69 74 65  Maybe the SQLite
112f0 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20 69 73   core library is
11300 20 75 6e 61 76 61 69 6c 61 62 6c 65 3f 0d 0a 20   unavailable?.. 
11310 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
11320 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b    set memory unk
11330 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nown....        
11340 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
11350 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
11360 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
11370 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72  ppendArgs $memor
11380 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d  y \n]..        }
11390 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
113a0 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 24 6d     set result $m
113b0 65 6d 6f 72 79 3b 20 23 20 4e 4f 54 45 3a 20 52  emory; # NOTE: R
113c0 65 74 75 72 6e 20 6d 65 6d 6f 72 79 20 69 6e 2d  eturn memory in-
113d0 75 73 65 20 74 6f 20 6f 75 72 20 63 61 6c 6c 65  use to our calle
113e0 72 2e 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  r.....      if {
113f0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
11400 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
11410 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 6d 61  channel "---- ma
11420 78 69 6d 75 6d 20 6d 65 6d 6f 72 79 20 69 6e 20  ximum memory in 
11430 75 73 65 20 62 79 20 53 51 4c 69 74 65 2e 2e 2e  use by SQLite...
11440 20 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   "..      }.... 
11450 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
11460 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d  {object invoke -
11470 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
11480 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
11490 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
114a0 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76  Lite.UnsafeNativ
114b0 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20  eMethods \..    
114c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
114d0 33 5f 6d 65 6d 6f 72 79 5f 68 69 67 68 77 61 74  3_memory_highwat
114e0 65 72 20 30 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d  er 0} memory] ==
114f0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
11500 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
11510 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
11520 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
11530 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
11540 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e 22  emory " bytes\n"
11550 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
11560 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
11570 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
11580 20 23 20 4e 4f 54 45 3a 20 4d 61 79 62 65 20 74   # NOTE: Maybe t
11590 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c  he SQLite core l
115a0 69 62 72 61 72 79 20 69 73 20 75 6e 61 76 61 69  ibrary is unavai
115b0 6c 61 62 6c 65 3f 0d 0a 20 20 20 20 20 20 20 20  lable?..        
115c0 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d  #..        set m
115d0 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d  emory unknown...
115e0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71  .        if {!$q
115f0 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
11600 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
11610 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
11620 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a  gs $memory \n]..
11630 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
11640 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   }....      if {
11650 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65 6e 20 7b  $collect} then {
11660 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c 6c 65 63  ..        collec
11670 74 47 61 72 62 61 67 65 20 24 63 68 61 6e 6e 65  tGarbage $channe
11680 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  l..      }....  
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 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
116c0 22 2d 2d 2d 2d 20 63 75 72 72 65 6e 74 20 6d 65  "---- current me
116d0 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 74  mory in use by t
116e0 68 65 20 43 4c 52 2e 2e 2e 20 22 0d 0a 20 20 20  he CLR... "..   
116f0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
11700 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74   {[catch {object
11710 20 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54 6f   invoke GC GetTo
11720 74 61 6c 4d 65 6d 6f 72 79 20 66 61 6c 73 65 7d  talMemory false}
11730 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74   memory] == 0} t
11740 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
11750 66 20 7b 5b 73 74 72 69 6e 67 20 69 73 20 69 6e  f {[string is in
11760 74 65 67 65 72 20 2d 73 74 72 69 63 74 20 24 6d  teger -strict $m
11770 65 6d 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  emory]} then {..
11780 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
11790 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
117a0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
117b0 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
117c0 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20  dArgs $memory " 
117d0 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20  bytes\n"]..     
117e0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
117f0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
11800 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 69      set memory i
11810 6e 76 61 6c 69 64 0d 0a 0d 0a 20 20 20 20 20 20  nvalid....      
11820 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
11830 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
11840 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
11850 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
11860 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20  $memory \n]..   
11870 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
11880 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73    }..      } els
11890 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  e {..        set
118a0 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d   memory unknown.
118b0 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  ...        if {!
118c0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
118d0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
118e0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
118f0 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d  Args $memory \n]
11900 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
11910 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
11920 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20  turn $result..  
11930 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
11940 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44   checkForSQLiteD
11950 69 72 65 63 74 6f 72 69 65 73 20 7b 20 63 68 61  irectories { cha
11960 6e 6e 65 6c 20 7b 72 65 73 65 74 20 66 61 6c 73  nnel {reset fals
11970 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  e} } {..      #.
11980 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43  .      # NOTE: C
11990 68 65 63 6b 20 69 66 20 74 68 65 20 73 71 6c 69  heck if the sqli
119a0 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69  te3_win32_set_di
119b0 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e  rectory function
119c0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a   is available...
119d0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 74        #..      t
119e0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5c 0d  puts $channel \.
119f0 0a 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d  .          "----
11a00 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 66 75   checking for fu
11a10 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 5f 77  nction sqlite3_w
11a20 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
11a30 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  ry... "....     
11a40 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
11a50 3a 20 54 68 69 73 20 63 61 6c 6c 20 74 6f 20 74  : This call to t
11a60 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  he sqlite3_win32
11a70 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66  _set_directory f
11a80 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 74 68 65  unction uses the
11a90 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
11aa0 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 20 30 20  invalid value 0 
11ab0 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 61 72  for the first ar
11ac0 67 75 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f  gument.  This co
11ad0 64 65 20 69 73 20 64 65 73 69 67 6e 65 64 0d 0a  de is designed..
11ae0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f        #       to
11af0 20 63 68 65 63 6b 20 69 66 20 63 61 6c 6c 69 6e   check if callin
11b00 67 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 77  g the function w
11b10 69 6c 6c 20 72 61 69 73 65 20 61 6e 20 65 78 63  ill raise an exc
11b20 65 70 74 69 6f 6e 20 28 69 2e 65 2e 0d 0a 20 20  eption (i.e...  
11b30 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
11b40 61 63 74 75 61 6c 20 72 65 73 75 6c 74 20 6f 66  actual result of
11b50 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f   the function do
11b60 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 20 61 73  es not matter as
11b70 20 6c 6f 6e 67 20 61 73 20 6e 6f 0d 0a 20 20 20   long as no..   
11b80 20 20 20 23 20 20 20 20 20 20 20 64 69 72 65 63     #       direc
11b90 74 6f 72 79 20 69 73 20 63 68 61 6e 67 65 64 29  tory is changed)
11ba0 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
11bb0 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
11bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 62                ob
11bd0 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
11be0 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
11bf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  .              S
11c00 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
11c10 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  e.UnsafeNativeMe
11c20 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20  thods \..       
11c30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77         sqlite3_w
11c40 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
11c50 72 79 20 30 20 6e 75 6c 6c 7d 5d 20 3d 3d 20 30  ry 0 null}] == 0
11c60 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
11c70 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
11c80 4f 54 45 3a 20 43 61 6c 6c 69 6e 67 20 74 68 65  OTE: Calling the
11c90 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
11ca0 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66 75 6e  et_directory fun
11cb0 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 0d 0a  ction does not..
11cc0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
11cd0 63 61 75 73 65 20 61 6e 20 65 78 63 65 70 74 69  cause an excepti
11ce0 6f 6e 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 69  on; therefore, i
11cf0 74 20 6d 75 73 74 20 62 65 20 61 76 61 69 6c 61  t must be availa
11d00 62 6c 65 20 28 69 2e 65 2e 0d 0a 20 20 20 20 20  ble (i.e...     
11d10 20 20 20 23 20 20 20 20 20 20 20 65 76 65 6e 20     #       even 
11d20 74 68 6f 75 67 68 20 69 74 20 73 68 6f 75 6c 64  though it should
11d30 20 72 65 74 75 72 6e 20 61 20 66 61 69 6c 75 72   return a failur
11d40 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 6e  e return code in
11d50 20 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20 23   this..        #
11d60 20 20 20 20 20 20 20 63 61 73 65 29 2e 0d 0a 20         case)... 
11d70 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
11d80 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
11d90 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
11da0 74 5f 64 69 72 65 63 74 6f 72 79 0d 0a 0d 0a 20  t_directory.... 
11db0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
11dc0 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 0d 0a 20  annel yes\n.... 
11dd0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
11de0 20 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20 6f    # NOTE: Does o
11df0 75 72 20 63 61 6c 6c 65 72 20 77 61 6e 74 20 74  ur caller want t
11e00 6f 20 72 65 73 65 74 20 74 68 65 20 64 69 72 65  o reset the dire
11e10 63 74 6f 72 69 65 73 3f 0d 0a 20 20 20 20 20 20  ctories?..      
11e20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
11e30 7b 24 72 65 73 65 74 7d 20 74 68 65 6e 20 7b 0d  {$reset} then {.
11e40 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
11e50 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
11e60 4e 6f 77 20 6d 61 6b 65 20 73 75 72 65 20 74 68  Now make sure th
11e70 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  e database and t
11e80 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f  emporary directo
11e90 72 69 65 73 20 61 72 65 0d 0a 20 20 20 20 20 20  ries are..      
11ea0 20 20 20 20 23 20 20 20 20 20 20 20 72 65 73 65      #       rese
11eb0 74 20 74 68 65 69 72 20 64 65 66 61 75 6c 74 20  t their default 
11ec0 76 61 6c 75 65 73 2c 20 77 68 69 63 68 20 73 68  values, which sh
11ed0 6f 75 6c 64 20 62 65 20 6e 75 6c 6c 20 66 6f 72  ould be null for
11ee0 20 62 6f 74 68 2e 0d 0a 20 20 20 20 20 20 20 20   both...        
11ef0 20 20 23 20 20 20 20 20 20 20 53 69 6e 63 65 20    #       Since 
11f00 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  the sqlite3_win3
11f10 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20  2_set_directory 
11f20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 76 61 69  function is avai
11f30 6c 61 62 6c 65 2c 0d 0a 20 20 20 20 20 20 20 20  lable,..        
11f40 20 20 23 20 20 20 20 20 20 20 75 73 65 20 69 74    #       use it
11f50 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
11f60 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 7b 73            for {s
11f70 65 74 20 69 6e 64 65 78 20 31 7d 20 7b 24 69 6e  et index 1} {$in
11f80 64 65 78 20 3c 20 33 7d 20 7b 69 6e 63 72 20 69  dex < 3} {incr i
11f90 6e 64 65 78 7d 20 7b 0d 0a 20 20 20 20 20 20 20  ndex} {..       
11fa0 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
11fb0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
11fc0 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
11fd0 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
11fe0 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
11ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
12000 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
12010 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74  .UnsafeNativeMet
12020 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  hods \..        
12030 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
12040 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69  te3_win32_set_di
12050 72 65 63 74 6f 72 79 20 24 69 6e 64 65 78 20 6e  rectory $index n
12060 75 6c 6c 7d 20 5c 0d 0a 20 20 20 20 20 20 20 20  ull} \..        
12070 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75              resu
12080 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  lt] == 0} then {
12090 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
120a0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
120b0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
120c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120d0 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74  "---- call sqlit
120e0 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72  e3_win32_set_dir
120f0 65 63 74 6f 72 79 28 22 20 24 69 6e 64 65 78 20  ectory(" $index 
12100 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
12110 20 20 20 20 20 22 2c 20 6e 75 6c 6c 29 2e 2e 2e       ", null)...
12120 20 6f 6b 3a 20 22 20 24 72 65 73 75 6c 74 20 5c   ok: " $result \
12130 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
12140 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
12150 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
12160 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
12170 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
12180 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61          "---- ca
12190 6c 6c 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  ll sqlite3_win32
121a0 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28 22  _set_directory("
121b0 20 24 69 6e 64 65 78 20 5c 0d 0a 20 20 20 20 20   $index \..     
121c0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2c 20               ", 
121d0 6e 75 6c 6c 29 2e 2e 2e 20 65 72 72 6f 72 3a 20  null)... error: 
121e0 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c  " \n\t $result \
121f0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
12200 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
12210 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
12220 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
12230 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
12240 6c 20 6e 6f 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20  l no\n....      
12250 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
12260 4f 54 45 3a 20 44 6f 65 73 20 6f 75 72 20 63 61  OTE: Does our ca
12270 6c 6c 65 72 20 77 61 6e 74 20 74 6f 20 72 65 73  ller want to res
12280 65 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 69  et the directori
12290 65 73 3f 20 20 54 68 69 73 20 63 61 6e 20 6f 6e  es?  This can on
122a0 6c 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ly..        #   
122b0 20 20 20 20 62 65 20 70 65 72 66 6f 72 6d 65 64      be performed
122c0 20 69 66 20 53 51 4c 69 74 65 20 69 73 20 6c 6f   if SQLite is lo
122d0 61 64 65 64 20 61 6e 64 20 72 65 61 64 79 20 66  aded and ready f
122e0 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 74 65  or use by the te
122f0 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  st..        #   
12300 20 20 20 20 73 75 69 74 65 2e 0d 0a 20 20 20 20      suite...    
12310 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
12320 66 20 7b 24 72 65 73 65 74 20 26 26 20 5b 69 73  f {$reset && [is
12330 53 51 4c 69 74 65 52 65 61 64 79 5d 7d 20 74 68  SQLiteReady]} th
12340 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
12350 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
12360 4f 54 45 3a 20 4e 6f 77 20 6d 61 6b 65 20 73 75  OTE: Now make su
12370 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
12380 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 64 69  and temporary di
12390 72 65 63 74 6f 72 69 65 73 20 61 72 65 0d 0a 20  rectories are.. 
123a0 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
123b0 20 72 65 73 65 74 20 74 68 65 69 72 20 64 65 66   reset their def
123c0 61 75 6c 74 20 76 61 6c 75 65 73 2c 20 77 68 69  ault values, whi
123d0 63 68 20 73 68 6f 75 6c 64 20 62 65 20 6e 75 6c  ch should be nul
123e0 6c 20 66 6f 72 20 62 6f 74 68 2e 0d 0a 20 20 20  l for both...   
123f0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 53         #       S
12400 69 6e 63 65 20 74 68 65 20 73 71 6c 69 74 65 33  ince the sqlite3
12410 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63  _win32_set_direc
12420 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20 64 6f  tory function do
12430 65 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20  es not..        
12440 20 20 23 20 20 20 20 20 20 20 61 70 70 65 61 72    #       appear
12450 20 74 6f 20 62 65 20 61 76 61 69 6c 61 62 6c 65   to be available
12460 2c 20 75 73 65 20 74 68 65 20 61 73 73 6f 63 69  , use the associ
12470 61 74 65 64 20 50 52 41 47 4d 41 20 63 6f 6d 6d  ated PRAGMA comm
12480 61 6e 64 73 0d 0a 20 20 20 20 20 20 20 20 20 20  ands..          
12490 23 20 20 20 20 20 20 20 69 6e 73 74 65 61 64 2e  #       instead.
124a0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
124b0 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
124c0 20 64 69 72 65 63 74 6f 72 79 20 5b 6c 69 73 74   directory [list
124d0 20 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65   data_store_dire
124e0 63 74 6f 72 79 20 74 65 6d 70 5f 73 74 6f 72 65  ctory temp_store
124f0 5f 64 69 72 65 63 74 6f 72 79 5d 20 7b 0d 0a 20  _directory] {.. 
12500 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73             set s
12510 71 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  ql [appendArgs "
12520 50 52 41 47 4d 41 20 22 20 24 64 69 72 65 63 74  PRAGMA " $direct
12530 6f 72 79 20 22 20 3d 20 5c 22 5c 22 3b 22 5d 0d  ory " = \"\";"].
12540 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
12550 66 20 7b 5b 63 61 74 63 68 20 7b 65 78 65 63 75  f {[catch {execu
12560 74 65 53 71 6c 20 24 73 71 6c 7d 20 72 65 73 75  teSql $sql} resu
12570 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  lt] == 0} then {
12580 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
12590 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
125a0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
125b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125c0 22 2d 2d 2d 2d 20 65 78 65 63 75 74 65 20 50 52  "---- execute PR
125d0 41 47 4d 41 20 22 20 24 64 69 72 65 63 74 6f 72  AGMA " $director
125e0 79 20 22 2e 2e 2e 20 6f 6b 3a 20 5c 22 22 20 5c  y "... ok: \"" \
125f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
12600 20 20 20 20 24 72 65 73 75 6c 74 20 5c 22 5c 6e      $result \"\n
12610 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
12620 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
12630 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
12640 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
12650 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
12660 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 65 78 65         "---- exe
12670 63 75 74 65 20 50 52 41 47 4d 41 20 22 20 24 64  cute PRAGMA " $d
12680 69 72 65 63 74 6f 72 79 20 22 2e 2e 2e 20 65 72  irectory "... er
12690 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20  ror: " \..      
126a0 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74              \n\t
126b0 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20   $result \n]..  
126c0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
126d0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
126e0 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
126f0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
12700 20 4e 4f 54 45 3a 20 46 69 6e 61 6c 6c 79 2c 20   NOTE: Finally, 
12710 73 68 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74  show the current
12720 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61   value of the da
12730 74 61 62 61 73 65 20 61 6e 64 20 74 65 6d 70 6f  tabase and tempo
12740 72 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20  rary..      #   
12750 20 20 20 20 64 69 72 65 63 74 6f 72 69 65 73 2e      directories.
12760 20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20    This can only 
12770 62 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20  be performed if 
12780 53 51 4c 69 74 65 20 69 73 20 6c 6f 61 64 65 64  SQLite is loaded
12790 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
127a0 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20 75 73  and ready for us
127b0 65 20 62 79 20 74 68 65 20 74 65 73 74 20 73 75  e by the test su
127c0 69 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ite...      #.. 
127d0 20 20 20 20 20 69 66 20 7b 5b 69 73 53 51 4c 69       if {[isSQLi
127e0 74 65 52 65 61 64 79 5d 7d 20 74 68 65 6e 20 7b  teReady]} then {
127f0 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  ..        foreac
12800 68 20 64 69 72 65 63 74 6f 72 79 20 5b 6c 69 73  h directory [lis
12810 74 20 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72  t data_store_dir
12820 65 63 74 6f 72 79 20 74 65 6d 70 5f 73 74 6f 72  ectory temp_stor
12830 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 7b 0d 0a  e_directory] {..
12840 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
12850 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
12860 41 72 67 73 20 22 2d 2d 2d 2d 20 63 68 65 63 6b  Args "---- check
12870 69 6e 67 20 22 20 24 64 69 72 65 63 74 6f 72 79  ing " $directory
12880 20 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20   "... "]....    
12890 20 20 20 20 20 20 73 65 74 20 73 71 6c 20 5b 61        set sql [a
128a0 70 70 65 6e 64 41 72 67 73 20 22 50 52 41 47 4d  ppendArgs "PRAGM
128b0 41 20 22 20 24 64 69 72 65 63 74 6f 72 79 20 5c  A " $directory \
128c0 3b 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  ;]....          
128d0 69 66 20 7b 5b 63 61 74 63 68 20 7b 65 78 65 63  if {[catch {exec
128e0 75 74 65 53 71 6c 20 24 73 71 6c 20 73 63 61 6c  uteSql $sql scal
128f0 61 72 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30  ar} result] == 0
12900 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
12910 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
12920 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
12930 20 22 6f 6b 3a 20 5c 22 22 20 24 72 65 73 75 6c   "ok: \"" $resul
12940 74 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  t \"\n]..       
12950 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
12960 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
12970 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
12980 72 67 73 20 22 65 72 72 6f 72 3a 20 22 20 5c 6e  rgs "error: " \n
12990 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a  \t $result \n]..
129a0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
129b0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
129c0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
129d0 72 6f 63 20 6c 6f 61 64 53 51 4c 69 74 65 54 65  roc loadSQLiteTe
129e0 73 74 53 65 74 74 69 6e 67 73 20 7b 20 63 68 61  stSettings { cha
129f0 6e 6e 65 6c 20 7b 73 75 66 66 69 78 20 22 22 7d  nnel {suffix ""}
12a00 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d   {quiet false} }
12a10 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
12a20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20     # NOTE: Skip 
12a30 6c 6f 61 64 69 6e 67 20 74 68 65 20 73 65 74 74  loading the sett
12a40 69 6e 67 73 20 69 66 20 74 68 65 69 72 20 75 73  ings if their us
12a50 61 67 65 20 68 61 73 20 62 65 65 6e 20 64 69 73  age has been dis
12a60 61 62 6c 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d  abled...      #.
12a70 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66  .      if {![inf
12a80 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71  o exists ::no(sq
12a90 6c 69 74 65 54 65 73 74 53 65 74 74 69 6e 67 73  liteTestSettings
12aa0 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
12ab0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
12ac0 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 63 75 73 74   NOTE: Load cust
12ad0 6f 6d 20 70 65 72 2d 75 73 65 72 20 61 6e 64 2f  om per-user and/
12ae0 6f 72 20 70 65 72 2d 68 6f 73 74 20 74 65 73 74  or per-host test
12af0 20 73 65 74 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a   settings now...
12b00 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
12b10 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
12b20 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f  sts ::tcl_platfo
12b30 72 6d 28 75 73 65 72 29 5d 7d 20 74 68 65 6e 20  rm(user)]} then 
12b40 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
12b50 20 75 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c   userSettingsFil
12b60 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  eName [file join
12b70 20 5b 67 65 74 43 6f 6d 6d 6f 6e 44 69 72 65 63   [getCommonDirec
12b80 74 6f 72 79 5d 20 5c 0d 0a 20 20 20 20 20 20 20  tory] \..       
12b90 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72         [appendAr
12ba0 67 73 20 73 65 74 74 69 6e 67 73 20 24 73 75 66  gs settings $suf
12bb0 66 69 78 20 2e 20 24 3a 3a 74 63 6c 5f 70 6c 61  fix . $::tcl_pla
12bc0 74 66 6f 72 6d 28 75 73 65 72 29 20 2e 65 61 67  tform(user) .eag
12bd0 6c 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  le]]....        
12be0 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73    if {[file exis
12bf0 74 73 20 24 75 73 65 72 53 65 74 74 69 6e 67 73  ts $userSettings
12c00 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  FileName]} then 
12c10 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
12c20 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
12c30 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
12c40 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
12c50 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
12c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c70 20 20 22 2d 2d 2d 2d 20 6c 6f 61 64 69 6e 67 20    "---- loading 
12c80 70 65 72 2d 75 73 65 72 20 74 65 73 74 20 73 65  per-user test se
12c90 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20  ttings file \"" 
12ca0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
12cb0 20 20 20 20 20 24 75 73 65 72 53 65 74 74 69 6e       $userSettin
12cc0 67 73 46 69 6c 65 4e 61 6d 65 20 5c 22 2e 2e 2e  gsFileName \"...
12cd0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n]..           
12ce0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
12cf0 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 75 70    if {[catch {up
12d00 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 73 6f  level 1 [list so
12d10 75 72 63 65 20 24 75 73 65 72 53 65 74 74 69 6e  urce $userSettin
12d20 67 73 46 69 6c 65 4e 61 6d 65 5d 7d 20 5c 0d 0a  gsFileName]} \..
12d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d40 20 20 20 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e      error]} then
12d50 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
12d60 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
12d70 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
12d80 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
12d90 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
12da0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
12db0 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
12dc0 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
12dd0 6f 20 6c 6f 61 64 20 70 65 72 2d 75 73 65 72 20  o load per-user 
12de0 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22  settings file \"
12df0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
12e00 20 20 20 20 20 20 20 20 20 24 75 73 65 72 53 65           $userSe
12e10 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22  ttingsFileName "
12e20 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  \", error: " \n\
12e30 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20  t $error \n]..  
12e40 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
12e50 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
12e60 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
12e70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
12e80 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
12e90 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
12ea0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
12eb0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
12ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ed0 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6c   "---- skipped l
12ee0 6f 61 64 69 6e 67 20 70 65 72 2d 75 73 65 72 20  oading per-user 
12ef0 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 66 69  test settings fi
12f00 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  le \"" \..      
12f10 20 20 20 20 20 20 20 20 20 20 20 20 24 75 73 65              $use
12f20 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d  rSettingsFileNam
12f30 65 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e  e "\", it does n
12f40 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20  ot exist\n"]..  
12f50 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
12f60 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
12f70 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
12f80 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12f90 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12fa0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12fb0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12fc0 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20 20  ######....      
12fd0 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
12fe0 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72  ts ::tcl_platfor
12ff0 6d 28 68 6f 73 74 29 5d 7d 20 74 68 65 6e 20 7b  m(host)]} then {
13000 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
13010 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65  hostSettingsFile
13020 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  Name [file join 
13030 5b 67 65 74 43 6f 6d 6d 6f 6e 44 69 72 65 63 74  [getCommonDirect
13040 6f 72 79 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20  ory] \..        
13050 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72 67        [appendArg
13060 73 20 73 65 74 74 69 6e 67 73 20 24 73 75 66 66  s settings $suff
13070 69 78 20 2e 20 24 3a 3a 74 63 6c 5f 70 6c 61 74  ix . $::tcl_plat
13080 66 6f 72 6d 28 68 6f 73 74 29 20 2e 65 61 67 6c  form(host) .eagl
13090 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  e]]....         
130a0 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74   if {[file exist
130b0 73 20 24 68 6f 73 74 53 65 74 74 69 6e 67 73 46  s $hostSettingsF
130c0 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
130d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
130e0 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
130f0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
13100 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
13110 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
13120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13130 20 22 2d 2d 2d 2d 20 6c 6f 61 64 69 6e 67 20 70   "---- loading p
13140 65 72 2d 68 6f 73 74 20 74 65 73 74 20 73 65 74  er-host test set
13150 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c  tings file \"" \
13160 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
13170 20 20 20 20 24 68 6f 73 74 53 65 74 74 69 6e 67      $hostSetting
13180 73 46 69 6c 65 4e 61 6d 65 20 5c 22 2e 2e 2e 5c  sFileName \"...\
13190 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
131a0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
131b0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 75 70 6c   if {[catch {upl
131c0 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 73 6f 75  evel 1 [list sou
131d0 72 63 65 20 24 68 6f 73 74 53 65 74 74 69 6e 67  rce $hostSetting
131e0 73 46 69 6c 65 4e 61 6d 65 5d 7d 20 5c 0d 0a 20  sFileName]} \.. 
131f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13200 20 20 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20     error]} then 
13210 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
13220 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
13230 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
13240 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
13250 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
13260 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
13270 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
13280 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
13290 20 6c 6f 61 64 20 70 65 72 2d 68 6f 73 74 20 73   load per-host s
132a0 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22  ettings file \""
132b0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
132c0 20 20 20 20 20 20 20 20 24 68 6f 73 74 53 65 74          $hostSet
132d0 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c  tingsFileName "\
132e0 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  ", error: " \n\t
132f0 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20   $error \n]..   
13300 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
13310 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
13320 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
13330 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
13340 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
13350 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
13360 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
13370 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
13380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13390 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6c 6f  "---- skipped lo
133a0 61 64 69 6e 67 20 70 65 72 2d 68 6f 73 74 20 74  ading per-host t
133b0 65 73 74 20 73 65 74 74 69 6e 67 73 20 66 69 6c  est settings fil
133c0 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  e \"" \..       
133d0 20 20 20 20 20 20 20 20 20 20 20 24 68 6f 73 74             $host
133e0 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65  SettingsFileName
133f0 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f   "\", it does no
13400 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20  t exist\n"]..   
13410 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
13420 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
13430 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20   }..      }..   
13440 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
13450 72 75 6e 53 51 4c 69 74 65 54 65 73 74 50 72 6f  runSQLiteTestPro
13460 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20 20 20 20  logue {} {..    
13470 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
13480 45 3a 20 53 6b 69 70 20 72 75 6e 6e 69 6e 67 20  E: Skip running 
13490 6f 75 72 20 63 75 73 74 6f 6d 20 70 72 6f 6c 6f  our custom prolo
134a0 67 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20  gue if the main 
134b0 6f 6e 65 20 68 61 73 20 62 65 65 6e 0d 0a 20 20  one has been..  
134c0 20 20 20 20 23 20 20 20 20 20 20 20 73 6b 69 70      #       skip
134d0 70 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ped...      #.. 
134e0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
134f0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 70 72 6f 6c  exists ::no(prol
13500 6f 67 75 65 2e 65 61 67 6c 65 29 5d 7d 20 74 68  ogue.eagle)]} th
13510 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
13520 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
13530 20 4c 6f 61 64 20 74 68 65 20 22 62 65 66 6f 72   Load the "befor
13540 65 2d 63 6f 6e 73 74 72 61 69 6e 74 73 22 20 63  e-constraints" c
13550 75 73 74 6f 6d 20 70 65 72 2d 75 73 65 72 20 61  ustom per-user a
13560 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74 0d 0a  nd/or per-host..
13570 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
13580 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 6e 6f  test settings no
13590 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  w...        #.. 
135a0 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31         uplevel 1
135b0 20 5b 6c 69 73 74 20 6c 6f 61 64 53 51 4c 69 74   [list loadSQLit
135c0 65 54 65 73 74 53 65 74 74 69 6e 67 73 20 24 3a  eTestSettings $:
135d0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 2e 62  :test_channel .b
135e0 65 66 6f 72 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  efore]....      
135f0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
13600 4f 54 45 3a 20 53 6b 69 70 20 61 6c 6c 20 53 79  OTE: Skip all Sy
13610 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
13620 20 72 65 6c 61 74 65 64 20 66 69 6c 65 20 68 61   related file ha
13630 6e 64 6c 69 6e 67 20 28 64 65 6c 65 74 69 6e 67  ndling (deleting
13640 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ,..        #    
13650 20 20 20 63 6f 70 79 69 6e 67 2c 20 61 6e 64 20     copying, and 
13660 6c 6f 61 64 69 6e 67 29 20 69 66 20 77 65 20 61  loading) if we a
13670 72 65 20 73 6f 20 69 6e 73 74 72 75 63 74 65 64  re so instructed
13680 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
13690 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
136a0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c   exists ::no(sql
136b0 69 74 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  iteFiles)]} then
136c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
136d0 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
136e0 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74  E: Skip trying t
136f0 6f 20 64 65 6c 65 74 65 20 61 6e 79 20 66 69 6c  o delete any fil
13700 65 73 20 69 66 20 77 65 20 61 72 65 20 73 6f 20  es if we are so 
13710 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20  instructed...   
13720 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
13730 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
13740 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74  xists ::no(delet
13750 65 53 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20  eSqliteFiles)]} 
13760 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
13770 20 20 20 20 74 72 79 44 65 6c 65 74 65 41 73 73      tryDeleteAss
13780 65 6d 62 6c 79 20 73 71 6c 69 74 65 33 2e 64 6c  embly sqlite3.dl
13790 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  l..            r
137a0 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  emoveConstraint 
137b0 66 69 6c 65 5f 73 71 6c 69 74 65 33 2e 64 6c 6c  file_sqlite3.dll
137c0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
137d0 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c  tryDeleteAssembl
137e0 79 20 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70  y SQLite.Interop
137f0 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20  .dll..          
13800 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69    removeConstrai
13810 6e 74 20 66 69 6c 65 5f 53 51 4c 69 74 65 2e 49  nt file_SQLite.I
13820 6e 74 65 72 6f 70 2e 64 6c 6c 0d 0a 0d 0a 20 20  nterop.dll....  
13830 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c            tryDel
13840 65 74 65 41 73 73 65 6d 62 6c 79 20 53 79 73 74  eteAssembly Syst
13850 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
13860 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll..            
13870 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74  removeConstraint
13880 20 66 69 6c 65 5f 53 79 73 74 65 6d 2e 44 61 74   file_System.Dat
13890 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 0d 0a 0d 0a  a.SQLite.dll....
138a0 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44              tryD
138b0 65 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 53 79  eleteAssembly Sy
138c0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
138d0 2e 4c 69 6e 71 2e 64 6c 6c 0d 0a 20 20 20 20 20  .Linq.dll..     
138e0 20 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e         removeCon
138f0 73 74 72 61 69 6e 74 20 66 69 6c 65 5f 53 79 73  straint file_Sys
13900 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
13910 4c 69 6e 71 2e 64 6c 6c 0d 0a 20 20 20 20 20 20  Linq.dll..      
13920 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
13930 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
13940 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f  # NOTE: Check fo
13950 72 20 74 68 65 20 22 61 75 74 6f 53 65 6c 65 63  r the "autoSelec
13960 74 22 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f  t" runtime optio
13970 6e 2e 20 20 49 66 20 70 72 65 73 65 6e 74 2c 0d  n.  If present,.
13980 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
13990 20 20 20 61 74 74 65 6d 70 74 20 74 6f 20 61 75     attempt to au
139a0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65 6c 65  tomatically sele
139b0 63 74 20 74 68 65 20 66 69 72 73 74 20 61 76 61  ct the first ava
139c0 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20  ilable..        
139d0 20 20 23 20 20 20 20 20 20 20 62 75 69 6c 64 20    #       build 
139e0 28 6f 72 20 22 72 65 6c 65 61 73 65 22 29 20 6f  (or "release") o
139f0 66 20 53 51 4c 69 74 65 20 61 6e 64 20 53 79 73  f SQLite and Sys
13a00 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 0d  tem.Data.SQLite.
13a10 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
13a20 20 20 20 66 6f 72 20 75 73 65 20 77 69 74 68 20     for use with 
13a30 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d  the test suite..
13a40 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
13a50 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61 73          if {[has
13a60 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 61 75  RuntimeOption au
13a70 74 6f 53 65 6c 65 63 74 5d 7d 20 74 68 65 6e 20  toSelect]} then 
13a80 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
13a90 66 20 7b 21 5b 63 68 65 63 6b 46 6f 72 53 51 4c  f {![checkForSQL
13aa0 69 74 65 42 75 69 6c 64 73 20 24 3a 3a 74 65 73  iteBuilds $::tes
13ab0 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75 65 5d 7d  t_channel true]}
13ac0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
13ad0 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53         checkForS
13ae0 51 4c 69 74 65 52 65 6c 65 61 73 65 73 20 24 3a  QLiteReleases $:
13af0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72  :test_channel tr
13b00 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue..            
13b10 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
13b20 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
13b30 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
13b40 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74 6f 20   Skip trying to 
13b50 76 65 72 69 66 79 20 74 68 65 20 62 75 69 6c 64  verify the build
13b60 20 64 69 72 65 63 74 6f 72 79 20 69 66 20 77 65   directory if we
13b70 20 61 72 65 20 73 6f 0d 0a 20 20 20 20 20 20 20   are so..       
13b80 20 20 20 23 20 20 20 20 20 20 20 69 6e 73 74 72     #       instr
13b90 75 63 74 65 64 3b 20 6f 74 68 65 72 77 69 73 65  ucted; otherwise
13ba0 2c 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20 61  , make sure it a
13bb0 63 74 75 61 6c 6c 79 20 65 78 69 73 74 73 20 6f  ctually exists o
13bc0 72 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  r..          #  
13bd0 20 20 20 20 20 68 61 6c 74 20 74 68 65 20 65 6e       halt the en
13be0 74 69 72 65 20 74 65 73 74 69 6e 67 20 70 72 6f  tire testing pro
13bf0 63 65 73 73 20 69 66 20 69 74 20 64 6f 65 73 20  cess if it does 
13c00 6e 6f 74 20 65 78 69 73 74 2e 0d 0a 20 20 20 20  not exist...    
13c10 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
13c20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
13c30 69 73 74 73 20 3a 3a 6e 6f 28 76 65 72 69 66 79  ists ::no(verify
13c40 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79 29 5d  BuildDirectory)]
13c50 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
13c60 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
13c70 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 20       # NOTE: At 
13c80 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20  this point, the 
13c90 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20  build directory 
13ca0 4d 55 53 54 20 65 78 69 73 74 20 61 73 20 61 0d  MUST exist as a.
13cb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20  .            #  
13cc0 20 20 20 20 20 76 61 6c 69 64 20 64 69 72 65 63       valid direc
13cd0 74 6f 72 79 20 66 6f 72 20 74 68 65 20 74 65 73  tory for the tes
13ce0 74 69 6e 67 20 70 72 6f 63 65 73 73 20 74 6f 20  ting process to 
13cf0 63 6f 6e 74 69 6e 75 65 2e 0d 0a 20 20 20 20 20  continue...     
13d00 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
13d10 20 20 20 20 20 20 73 65 74 20 64 69 72 65 63 74        set direct
13d20 6f 72 79 20 5b 67 65 74 42 75 69 6c 64 44 69 72  ory [getBuildDir
13d30 65 63 74 6f 72 79 5d 0d 0a 0d 0a 20 20 20 20 20  ectory]....     
13d40 20 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c         if {![fil
13d50 65 20 65 78 69 73 74 73 20 24 64 69 72 65 63 74  e exists $direct
13d60 6f 72 79 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20  ory] || \..     
13d70 20 20 20 20 20 20 20 20 20 20 20 21 5b 66 69 6c             ![fil
13d80 65 20 69 73 64 69 72 65 63 74 6f 72 79 20 24 64  e isdirectory $d
13d90 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20  irectory]} then 
13da0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
13db0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
13dc0 20 20 23 20 4e 4f 54 45 3a 20 4a 75 73 74 20 70    # NOTE: Just p
13dd0 72 69 6f 72 20 74 6f 20 61 63 74 75 61 6c 6c 79  rior to actually
13de0 20 68 61 6c 74 69 6e 67 20 74 68 65 20 74 65 73   halting the tes
13df0 74 69 6e 67 20 70 72 6f 63 65 73 73 2c 0d 0a 20  ting process,.. 
13e00 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
13e10 20 20 20 20 20 61 64 64 20 61 6e 20 65 72 72 6f       add an erro
13e20 72 20 74 6f 20 74 68 65 20 74 65 73 74 20 6c 6f  r to the test lo
13e30 67 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20  g file...       
13e40 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
13e50 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
13e60 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
13e70 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
13e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
13e90 2d 2d 2d 2d 20 63 6f 75 6c 64 20 6e 6f 74 20 76  ---- could not v
13ea0 65 72 69 66 79 20 62 75 69 6c 64 20 64 69 72 65  erify build dire
13eb0 63 74 6f 72 79 20 5c 22 22 20 24 64 69 72 65 63  ctory \"" $direc
13ec0 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20  tory \..        
13ed0 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 61            "\", a
13ee0 6c 6c 20 74 65 73 74 69 6e 67 20 68 61 6c 74 65  ll testing halte
13ef0 64 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  d\n"]....       
13f00 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
13f10 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
13f20 52 61 69 73 69 6e 67 20 61 20 73 63 72 69 70 74  Raising a script
13f30 20 65 72 72 6f 72 20 66 72 6f 6d 20 74 68 69 73   error from this
13f40 20 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 68 61   point should ha
13f50 6c 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  lt..            
13f60 20 20 23 20 20 20 20 20 20 20 74 68 65 20 74 65    #       the te
13f70 73 74 69 6e 67 20 70 72 6f 63 65 73 73 2e 0d 0a  sting process...
13f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
13f90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65  .              e
13fa0 72 72 6f 72 20 5b 61 70 70 65 6e 64 41 72 67 73  rror [appendArgs
13fb0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
13fc0 20 20 20 20 20 20 22 63 6f 75 6c 64 20 6e 6f 74        "could not
13fd0 20 76 65 72 69 66 79 20 62 75 69 6c 64 20 64 69   verify build di
13fe0 72 65 63 74 6f 72 79 20 5c 22 22 20 24 64 69 72  rectory \"" $dir
13ff0 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20  ectory \..      
14000 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c              "\",
14010 20 61 6c 6c 20 74 65 73 74 69 6e 67 20 68 61 6c   all testing hal
14020 74 65 64 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  ted"]..         
14030 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
14040 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23  }....          #
14050 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
14060 54 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20  TE: Skip trying 
14070 74 6f 20 63 6f 70 79 20 61 6e 79 20 66 69 6c 65  to copy any file
14080 73 20 69 66 20 77 65 20 61 72 65 20 73 6f 20 69  s if we are so i
14090 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20  nstructed...    
140a0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
140b0 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
140c0 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71  ists ::no(copySq
140d0 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20 74 68 65  liteFiles)]} the
140e0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
140f0 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79   tryCopyAssembly
14100 20 73 71 6c 69 74 65 33 2e 64 6c 6c 0d 0a 20 20   sqlite3.dll..  
14110 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70            tryCop
14120 79 41 73 73 65 6d 62 6c 79 20 53 51 4c 69 74 65  yAssembly SQLite
14130 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 0d 0a 20 20  .Interop.dll..  
14140 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70            tryCop
14150 79 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65 6d  yAssembly System
14160 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
14170 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72  ..            tr
14180 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 53 79  yCopyAssembly Sy
14190 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
141a0 2e 4c 69 6e 71 2e 64 6c 6c 0d 0a 20 20 20 20 20  .Linq.dll..     
141b0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
141c0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
141d0 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72   # NOTE: Skip tr
141e0 79 69 6e 67 20 74 6f 20 6c 6f 61 64 20 61 6e 79  ying to load any
141f0 20 66 69 6c 65 73 20 69 66 20 77 65 20 61 72 65   files if we are
14200 20 73 6f 20 69 6e 73 74 72 75 63 74 65 64 2e 0d   so instructed..
14210 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
14220 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
14230 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c  fo exists ::no(l
14240 6f 61 64 53 71 6c 69 74 65 46 69 6c 65 73 29 5d  oadSqliteFiles)]
14250 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
14260 20 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73        tryLoadAss
14270 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74  embly System.Dat
14280 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 0d 0a 20 20  a.SQLite.dll..  
14290 20 20 20 20 20 20 20 20 20 20 74 72 79 4c 6f 61            tryLoa
142a0 64 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65 6d  dAssembly System
142b0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e  .Data.SQLite.Lin
142c0 71 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20  q.dll..         
142d0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
142e0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
142f0 4f 54 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67  OTE: Skip trying
14300 20 74 6f 20 64 65 6c 65 74 65 20 65 78 74 65 72   to delete exter
14310 6e 61 6c 20 66 69 6c 65 73 20 69 66 20 77 65 20  nal files if we 
14320 61 72 65 20 73 6f 20 69 6e 73 74 72 75 63 74 65  are so instructe
14330 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  d...          #.
14340 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
14350 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
14360 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 45 78  o(deleteSqliteEx
14370 74 65 72 6e 61 6c 46 69 6c 65 73 29 5d 7d 20 74  ternalFiles)]} t
14380 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
14390 20 20 20 74 72 79 44 65 6c 65 74 65 42 75 69 6c     tryDeleteBuil
143a0 64 46 69 6c 65 20 49 6e 73 74 61 6c 6c 65 72 2e  dFile Installer.
143b0 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 0d 0a  exe.mda.config..
143c0 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44              tryD
143d0 65 6c 65 74 65 42 75 69 6c 64 46 69 6c 65 20 74  eleteBuildFile t
143e0 65 73 74 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66  est.exe.mda.conf
143f0 69 67 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ig..            
14400 74 72 79 44 65 6c 65 74 65 42 75 69 6c 64 46 69  tryDeleteBuildFi
14410 6c 65 20 74 65 73 74 6c 69 6e 71 2e 65 78 65 2e  le testlinq.exe.
14420 6d 64 61 2e 63 6f 6e 66 69 67 0d 0a 20 20 20 20  mda.config..    
14430 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
14440 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
14450 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74    # NOTE: Skip t
14460 72 79 69 6e 67 20 74 6f 20 63 6f 70 79 20 65 78  rying to copy ex
14470 74 65 72 6e 61 6c 20 66 69 6c 65 73 20 69 66 20  ternal files if 
14480 77 65 20 61 72 65 20 73 6f 20 69 6e 73 74 72 75  we are so instru
14490 63 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20  cted...         
144a0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   #..          if
144b0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
144c0 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 45  ::no(copySqliteE
144d0 78 74 65 72 6e 61 6c 46 69 6c 65 73 29 5d 7d 20  xternalFiles)]} 
144e0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
144f0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
14500 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 70 79 20     # NOTE: Copy 
14510 74 68 65 20 4d 44 41 20 63 6f 6e 66 69 67 75 72  the MDA configur
14520 61 74 69 6f 6e 20 66 69 6c 65 20 66 6f 72 20 74  ation file for t
14530 68 65 20 45 61 67 6c 65 20 73 68 65 6c 6c 20 74  he Eagle shell t
14540 6f 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20  o the..         
14550 20 20 20 23 20 20 20 20 20 20 20 62 75 69 6c 64     #       build
14560 20 6f 75 74 70 75 74 20 64 69 72 65 63 74 6f 72   output director
14570 79 3b 20 68 6f 77 65 76 65 72 2c 20 75 73 65 20  y; however, use 
14580 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
14590 6c 65 67 61 63 79 0d 0a 20 20 20 20 20 20 20 20  legacy..        
145a0 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74      #       test
145b0 20 65 78 65 63 75 74 61 62 6c 65 2e 20 20 54 68   executable.  Th
145c0 69 73 20 77 69 6c 6c 20 6d 61 6b 65 20 73 75 72  is will make sur
145d0 65 20 74 68 61 74 20 74 68 65 20 6c 65 67 61 63  e that the legac
145e0 79 20 74 65 73 74 73 0d 0a 20 20 20 20 20 20 20  y tests..       
145f0 20 20 20 20 20 23 20 20 20 20 20 20 20 72 75 6e       #       run
14600 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 73   with the same s
14610 65 74 20 6f 66 20 4d 44 41 73 20 63 6f 6e 66 69  et of MDAs confi
14620 67 75 72 65 64 2e 0d 0a 20 20 20 20 20 20 20 20  gured...        
14630 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
14640 20 20 20 74 72 79 43 6f 70 79 42 69 6e 61 72 79     tryCopyBinary
14650 46 69 6c 65 20 45 61 67 6c 65 53 68 65 6c 6c 2e  File EagleShell.
14660 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 49  exe.mda.config I
14670 6e 73 74 61 6c 6c 65 72 2e 65 78 65 2e 6d 64 61  nstaller.exe.mda
14680 2e 63 6f 6e 66 69 67 0d 0a 20 20 20 20 20 20 20  .config..       
14690 20 20 20 20 20 74 72 79 43 6f 70 79 42 69 6e 61       tryCopyBina
146a0 72 79 46 69 6c 65 20 45 61 67 6c 65 53 68 65 6c  ryFile EagleShel
146b0 6c 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67  l.exe.mda.config
146c0 20 74 65 73 74 2e 65 78 65 2e 6d 64 61 2e 63 6f   test.exe.mda.co
146d0 6e 66 69 67 0d 0a 20 20 20 20 20 20 20 20 20 20  nfig..          
146e0 20 20 74 72 79 43 6f 70 79 42 69 6e 61 72 79 46    tryCopyBinaryF
146f0 69 6c 65 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65  ile EagleShell.e
14700 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 74 65  xe.mda.config te
14710 73 74 6c 69 6e 71 2e 65 78 65 2e 6d 64 61 2e 63  stlinq.exe.mda.c
14720 6f 6e 66 69 67 0d 0a 20 20 20 20 20 20 20 20 20  onfig..         
14730 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
14740 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b  .        catch {
14750 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
14760 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
14770 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
14780 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
14790 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f  ---- file versio
147a0 6e 20 6f 66 20 5c 22 73 71 6c 69 74 65 33 2e 64  n of \"sqlite3.d
147b0 6c 6c 5c 22 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20  ll\"... " \..   
147c0 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
147d0 20 76 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e   version [getBin
147e0 61 72 79 46 69 6c 65 4e 61 6d 65 20 73 71 6c 69  aryFileName sqli
147f0 74 65 33 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20  te3.dll]] \n].. 
14800 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
14810 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
14820 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
14830 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
14840 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
14850 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
14860 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20  file version of 
14870 5c 22 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70  \"SQLite.Interop
14880 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5c 0d 0a 20  .dll\"... " \.. 
14890 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69               [fi
148a0 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67 65 74 42  le version [getB
148b0 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 53 51  inaryFileName SQ
148c0 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c  Lite.Interop.dll
148d0 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ]] \n]..        
148e0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74  }....        cat
148f0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
14900 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
14910 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
14920 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
14930 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65     "---- file ve
14940 72 73 69 6f 6e 20 6f 66 20 5c 22 53 79 73 74 65  rsion of \"Syste
14950 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
14960 6c 5c 22 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20  l\"... " \..    
14970 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
14980 76 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61  version [getBina
14990 72 79 46 69 6c 65 4e 61 6d 65 20 53 79 73 74 65  ryFileName Syste
149a0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
149b0 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  l]] \n]..       
149c0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61   }....        ca
149d0 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
149e0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
149f0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
14a00 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
14a10 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76      "---- file v
14a20 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53 79 73 74  ersion of \"Syst
14a30 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c  em.Data.SQLite.L
14a40 69 6e 71 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5c  inq.dll\"... " \
14a50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
14a60 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67  [file version [g
14a70 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  etBinaryFileName
14a80 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
14a90 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 5d 5d 20 5c  ite.Linq.dll]] \
14aa0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  n]..        }...
14ab0 0a 20 20 20 20 20 20 20 20 73 65 74 20 61 73 73  .        set ass
14ac0 65 6d 62 6c 69 65 73 20 5b 6f 62 6a 65 63 74 20  emblies [object 
14ad0 69 6e 76 6f 6b 65 20 41 70 70 44 6f 6d 61 69 6e  invoke AppDomain
14ae0 2e 43 75 72 72 65 6e 74 44 6f 6d 61 69 6e 20 47  .CurrentDomain G
14af0 65 74 41 73 73 65 6d 62 6c 69 65 73 5d 0d 0a 0d  etAssemblies]...
14b00 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20  .        object 
14b10 66 6f 72 65 61 63 68 20 61 73 73 65 6d 62 6c 79  foreach assembly
14b20 20 24 61 73 73 65 6d 62 6c 69 65 73 20 7b 0d 0a   $assemblies {..
14b30 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73            if {[s
14b40 74 72 69 6e 67 20 6d 61 74 63 68 20 5c 7b 53 79  tring match \{Sy
14b50 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
14b60 2a 20 24 61 73 73 65 6d 62 6c 79 5d 7d 20 74 68  * $assembly]} th
14b70 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
14b80 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
14b90 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
14ba0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
14bb0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 6f 75         "---- fou
14bc0 6e 64 20 61 73 73 65 6d 62 6c 79 3a 20 22 20 24  nd assembly: " $
14bd0 61 73 73 65 6d 62 6c 79 20 5c 6e 5d 0d 0a 20 20  assembly \n]..  
14be0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
14bf0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
14c00 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
14c10 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
14c20 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20  _channel \..    
14c30 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
14c40 64 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74 73  define constants
14c50 20 66 6f 72 20 5c 22 53 79 73 74 65 6d 2e 44 61   for \"System.Da
14c60 74 61 2e 53 51 4c 69 74 65 5c 22 2e 2e 2e 20 22  ta.SQLite\"... "
14c70 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
14c80 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74   {[catch {object
14c90 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
14ca0 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
14cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
14cc0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
14cd0 65 2e 53 51 4c 69 74 65 33 20 44 65 66 69 6e 65  e.SQLite3 Define
14ce0 43 6f 6e 73 74 61 6e 74 73 7d 20 5c 0d 0a 20 20  Constants} \..  
14cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d00 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73 5d  defineConstants]
14d10 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
14d20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
14d30 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
14d40 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 66 6f   [appendArgs [fo
14d50 72 6d 61 74 4c 69 73 74 20 5b 6c 73 6f 72 74 20  rmatList [lsort 
14d60 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
14d70 20 20 20 24 64 65 66 69 6e 65 43 6f 6e 73 74 61     $defineConsta
14d80 6e 74 73 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d  nts] <none>] \n]
14d90 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
14da0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
14db0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
14dc0 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c  channel unknown\
14dd0 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  n..          }..
14de0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
14df0 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
14e00 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
14e10 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d  :test_channel \.
14e20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
14e30 2d 2d 2d 2d 20 73 6f 75 72 63 65 20 76 65 72 73  ---- source vers
14e40 69 6f 6e 20 6f 66 20 5c 22 53 79 73 74 65 6d 2e  ion of \"System.
14e50 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c  Data.SQLite.dll\
14e60 22 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  "... "....      
14e70 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
14e80 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
14e90 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
14ea0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
14eb0 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
14ec0 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 43 6f  .SQLite.SQLiteCo
14ed0 6e 6e 65 63 74 69 6f 6e 20 50 72 6f 76 69 64 65  nnection Provide
14ee0 72 56 65 72 73 69 6f 6e 7d 20 5c 0d 0a 20 20 20  rVersion} \..   
14ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76                 v
14f00 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68  ersion] == 0} th
14f10 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
14f20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
14f30 6e 67 74 68 20 24 76 65 72 73 69 6f 6e 5d 20 3d  ngth $version] =
14f40 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
14f50 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 76             set v
14f60 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20 20 20  ersion null..   
14f70 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
14f80 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
14f90 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
14fa0 70 70 65 6e 64 41 72 67 73 20 24 76 65 72 73 69  ppendArgs $versi
14fb0 6f 6e 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  on \n]..        
14fc0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
14fd0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
14fe0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e  :test_channel un
14ff0 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20  known\n..       
15000 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
15010 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68  ...        catch
15020 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
15030 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
15040 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  nel \..         
15050 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6f 75 72 63       "---- sourc
15060 65 20 63 68 65 63 6b 6f 75 74 20 6f 66 20 5c 22  e checkout of \"
15070 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
15080 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 0d 0a 0d  te.dll\"... "...
15090 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
150a0 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e  catch {object in
150b0 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
150c0 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
150d0 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
150e0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53  em.Data.SQLite.S
150f0 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20  QLiteConnection 
15100 50 72 6f 76 69 64 65 72 53 6f 75 72 63 65 49 64  ProviderSourceId
15110 7d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  } \..           
15120 20 20 20 20 20 20 20 73 6f 75 72 63 65 49 64 5d         sourceId]
15130 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
15140 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
15150 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73  string length $s
15160 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74  ourceId] == 0} t
15170 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
15180 20 20 20 20 20 73 65 74 20 73 6f 75 72 63 65 49       set sourceI
15190 64 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20  d null..        
151a0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
151b0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
151c0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
151d0 41 72 67 73 20 24 73 6f 75 72 63 65 49 64 20 5c  Args $sourceId \
151e0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  n]..          } 
151f0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
15200 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
15210 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77  t_channel unknow
15220 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  n\n..          }
15230 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
15240 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
15250 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
15260 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 62 75  the available bu
15270 69 6c 64 73 20 28 61 6e 64 20 22 72 65 6c 65 61  ilds (and "relea
15280 73 65 73 22 29 20 6f 66 20 53 51 4c 69 74 65 20  ses") of SQLite 
15290 61 6e 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20  and..        #  
152a0 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
152b0 2e 53 51 4c 69 74 65 2e 0d 0a 20 20 20 20 20 20  .SQLite...      
152c0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65    #..        che
152d0 63 6b 46 6f 72 53 51 4c 69 74 65 42 75 69 6c 64  ckForSQLiteBuild
152e0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
152f0 6c 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  l..        check
15300 46 6f 72 53 51 4c 69 74 65 52 65 6c 65 61 73 65  ForSQLiteRelease
15310 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
15320 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  l....        #..
15330 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
15340 4e 6f 77 2c 20 77 65 20 6e 65 65 64 20 74 6f 20  Now, we need to 
15350 6b 6e 6f 77 20 69 66 20 74 68 65 20 53 51 4c 69  know if the SQLi
15360 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20  te core library 
15370 69 73 20 61 76 61 69 6c 61 62 6c 65 0d 0a 20 20  is available..  
15380 20 20 20 20 20 20 23 20 20 20 20 20 20 20 28 69        #       (i
15390 2e 65 2e 20 62 65 63 61 75 73 65 20 74 68 65 20  .e. because the 
153a0 6d 61 6e 61 67 65 64 2d 6f 6e 6c 79 20 53 79 73  managed-only Sys
153b0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
153c0 61 73 73 65 6d 62 6c 79 20 63 61 6e 0d 0a 20 20  assembly can..  
153d0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6c 6f        #       lo
153e0 61 64 20 77 69 74 68 6f 75 74 20 69 74 3b 20 68  ad without it; h
153f0 6f 77 65 76 65 72 2c 20 69 74 20 63 61 6e 6e 6f  owever, it canno
15400 74 20 64 6f 20 61 6e 79 74 68 69 6e 67 20 75 73  t do anything us
15410 65 66 75 6c 20 77 69 74 68 6f 75 74 0d 0a 20 20  eful without..  
15420 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 74        #       it
15430 29 2e 20 20 49 66 20 77 65 20 61 72 65 20 75 73  ).  If we are us
15440 69 6e 67 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f  ing the mixed-mo
15450 64 65 20 61 73 73 65 6d 62 6c 79 20 61 6e 64 20  de assembly and 
15460 77 65 20 61 6c 72 65 61 64 79 0d 0a 20 20 20 20  we already..    
15470 20 20 20 20 23 20 20 20 20 20 20 20 66 6f 75 6e      #       foun
15480 64 20 69 74 20 28 61 62 6f 76 65 29 2c 20 74 68  d it (above), th
15490 69 73 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  is should always
154a0 20 73 75 63 63 65 65 64 2e 0d 0a 20 20 20 20 20   succeed...     
154b0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68     #..        ch
154c0 65 63 6b 46 6f 72 53 51 4c 69 74 65 4c 69 62 72  eckForSQLiteLibr
154d0 61 72 79 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  ary $::test_chan
154e0 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  nel....        #
154f0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
15500 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 53  : Check if the S
15510 51 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73  QLite interop as
15520 73 65 6d 62 6c 79 20 69 73 20 61 76 61 69 6c 61  sembly is availa
15530 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ble...        #.
15540 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f  .        checkFo
15550 72 53 51 4c 69 74 65 49 6e 74 65 72 6f 70 20 24  rSQLiteInterop $
15560 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a  ::test_channel..
15570 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
15580 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
15590 63 6b 20 74 68 65 20 53 51 4c 69 74 65 20 64 61  ck the SQLite da
155a0 74 61 62 61 73 65 20 61 6e 64 20 74 65 6d 70 6f  tabase and tempo
155b0 72 61 72 79 20 64 69 72 65 63 74 6f 72 69 65 73  rary directories
155c0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
155d0 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51        checkForSQ
155e0 4c 69 74 65 44 69 72 65 63 74 6f 72 69 65 73 20  LiteDirectories 
155f0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d  $::test_channel.
15600 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
15610 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74        # NOTE: At
15620 74 65 6d 70 74 20 74 6f 20 64 65 74 65 72 6d 69  tempt to determi
15630 6e 65 20 69 66 20 76 61 72 69 6f 75 73 20 63 6f  ne if various co
15640 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
15650 6e 73 20 6e 65 65 64 65 64 20 66 6f 72 0d 0a 20  ns needed for.. 
15660 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
15670 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  est constraints 
15680 77 65 72 65 20 65 6e 61 62 6c 65 64 20 66 6f 72  were enabled for
15690 20 74 68 65 20 6d 61 6e 61 67 65 64 20 61 73 73   the managed ass
156a0 65 6d 62 6c 79 2e 20 20 54 68 65 72 65 0d 0a 20  embly.  There.. 
156b0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
156c0 72 65 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 2d  re some compile-
156d0 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 74 68 61  time options tha
156e0 74 20 6d 75 73 74 20 61 6c 73 6f 20 68 61 76 65  t must also have
156f0 20 62 65 65 6e 20 65 6e 61 62 6c 65 64 0d 0a 20   been enabled.. 
15700 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66         #       f
15710 6f 72 20 74 68 65 20 69 6e 74 65 72 6f 70 20 61  or the interop a
15720 73 73 65 6d 62 6c 79 20 69 6e 20 6f 72 64 65 72  ssembly in order
15730 20 74 6f 20 62 65 20 65 66 66 65 63 74 69 76 65   to be effective
15740 2e 20 20 46 6f 72 20 74 68 6f 73 65 0d 0a 20 20  .  For those..  
15750 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 70        #       op
15760 74 69 6f 6e 73 2c 20 69 74 20 77 69 6c 6c 20 62  tions, it will b
15770 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 69  e assumed that i
15780 74 20 77 61 73 20 65 6e 61 62 6c 65 64 20 66 6f  t was enabled fo
15790 72 20 74 68 65 20 69 6e 74 65 72 6f 70 0d 0a 20  r the interop.. 
157a0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
157b0 73 73 65 6d 62 6c 79 20 69 66 20 69 74 20 77 61  ssembly if it wa
157c0 73 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 68  s enabled for th
157d0 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62  e managed assemb
157e0 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ly...        #..
157f0 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
15800 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 5b  defineConstant [
15810 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  list \..        
15820 20 20 20 20 43 48 45 43 4b 5f 53 54 41 54 45 20      CHECK_STATE 
15830 43 4f 55 4e 54 5f 48 41 4e 44 4c 45 20 44 45 42  COUNT_HANDLE DEB
15840 55 47 20 49 4e 54 45 52 4f 50 5f 43 4f 44 45 43  UG INTEROP_CODEC
15850 20 49 4e 54 45 52 4f 50 5f 44 45 42 55 47 20 5c   INTEROP_DEBUG \
15860 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 4e  ..            IN
15870 54 45 52 4f 50 5f 45 58 54 45 4e 53 49 4f 4e 5f  TEROP_EXTENSION_
15880 46 55 4e 43 54 49 4f 4e 53 20 49 4e 54 45 52 4f  FUNCTIONS INTERO
15890 50 5f 4c 45 47 41 43 59 5f 43 4c 4f 53 45 20 49  P_LEGACY_CLOSE I
158a0 4e 54 45 52 4f 50 5f 4c 4f 47 20 5c 0d 0a 20 20  NTEROP_LOG \..  
158b0 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f            INTERO
158c0 50 5f 54 45 53 54 5f 45 58 54 45 4e 53 49 4f 4e  P_TEST_EXTENSION
158d0 20 49 4e 54 45 52 4f 50 5f 56 49 52 54 55 41 4c   INTEROP_VIRTUAL
158e0 5f 54 41 42 4c 45 20 4e 45 54 5f 32 30 20 4e 45  _TABLE NET_20 NE
158f0 54 5f 33 35 20 5c 0d 0a 20 20 20 20 20 20 20 20  T_35 \..        
15900 20 20 20 20 4e 45 54 5f 34 30 20 4e 45 54 5f 34      NET_40 NET_4
15910 35 20 4e 45 54 5f 34 35 31 20 4e 45 54 5f 43 4f  5 NET_451 NET_CO
15920 4d 50 41 43 54 5f 32 30 20 50 4c 41 54 46 4f 52  MPACT_20 PLATFOR
15930 4d 5f 43 4f 4d 50 41 43 54 46 52 41 4d 45 57 4f  M_COMPACTFRAMEWO
15940 52 4b 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  RK \..          
15950 20 20 50 52 45 4c 4f 41 44 5f 4e 41 54 49 56 45    PRELOAD_NATIVE
15960 5f 4c 49 42 52 41 52 59 20 52 45 54 41 52 47 45  _LIBRARY RETARGE
15970 54 41 42 4c 45 20 53 51 4c 49 54 45 5f 53 54 41  TABLE SQLITE_STA
15980 4e 44 41 52 44 20 5c 0d 0a 20 20 20 20 20 20 20  NDARD \..       
15990 20 20 20 20 20 54 48 52 4f 57 5f 4f 4e 5f 44 49       THROW_ON_DI
159a0 53 50 4f 53 45 44 20 54 52 41 43 45 20 54 52 41  SPOSED TRACE TRA
159b0 43 45 5f 43 4f 4e 4e 45 43 54 49 4f 4e 20 54 52  CE_CONNECTION TR
159c0 41 43 45 5f 48 41 4e 44 4c 45 20 5c 0d 0a 20 20  ACE_HANDLE \..  
159d0 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45 5f            TRACE_
159e0 50 52 45 4c 4f 41 44 20 54 52 41 43 45 5f 53 54  PRELOAD TRACE_ST
159f0 41 54 45 4d 45 4e 54 20 54 52 41 43 45 5f 57 41  ATEMENT TRACE_WA
15a00 52 4e 49 4e 47 20 54 52 41 43 4b 5f 4d 45 4d 4f  RNING TRACK_MEMO
15a10 52 59 5f 42 59 54 45 53 20 5c 0d 0a 20 20 20 20  RY_BYTES \..    
15a20 20 20 20 20 20 20 20 20 55 53 45 5f 49 4e 54 45          USE_INTE
15a30 52 4f 50 5f 44 4c 4c 20 55 53 45 5f 50 52 45 50  ROP_DLL USE_PREP
15a40 41 52 45 5f 56 32 20 57 49 4e 44 4f 57 53 5d 20  ARE_V2 WINDOWS] 
15a50 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
15a60 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
15a70 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 63  : Check if the c
15a80 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69  ompile-time opti
15a90 6f 6e 20 69 73 20 6c 69 73 74 65 64 20 69 6e 20  on is listed in 
15aa0 74 68 65 20 6c 69 73 74 20 6f 66 0d 0a 20 20 20  the list of..   
15ab0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22         #       "
15ac0 64 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74 73  define constants
15ad0 22 20 6b 65 70 74 20 74 72 61 63 6b 20 6f 66 20  " kept track of 
15ae0 62 79 20 74 68 65 20 6d 61 6e 61 67 65 64 20 61  by the managed a
15af0 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20  ssembly...      
15b00 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
15b10 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44   checkForSQLiteD
15b20 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 24 3a  efineConstant $:
15b30 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 64  :test_channel $d
15b40 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 0d 0a 20  efineConstant.. 
15b50 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
15b60 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
15b70 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65   NOTE: Check the
15b80 20 63 75 72 72 65 6e 74 20 62 75 69 6c 64 20 79   current build y
15b90 65 61 72 2e 20 20 42 61 73 69 63 61 6c 6c 79 2c  ear.  Basically,
15ba0 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 0d   this indicates.
15bb0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
15bc0 20 77 68 69 63 68 20 76 65 72 73 69 6f 6e 20 6f   which version o
15bd0 66 20 4d 53 42 75 69 6c 64 20 61 6e 64 2f 6f 72  f MSBuild and/or
15be0 20 56 69 73 75 61 6c 20 53 74 75 64 69 6f 20 77   Visual Studio w
15bf0 61 73 20 75 73 65 64 20 74 6f 0d 0a 20 20 20 20  as used to..    
15c00 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6d 70      #       comp
15c10 69 6c 65 20 74 68 65 20 61 73 73 65 6d 62 6c 79  ile the assembly
15c20 20 62 69 6e 61 72 69 65 73 20 75 6e 64 65 72 20   binaries under 
15c30 74 65 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  test...        #
15c40 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
15c50 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
15c60 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
15c70 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
15c80 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  r System.Data.SQ
15c90 4c 69 74 65 20 62 75 69 6c 64 20 79 65 61 72 2e  Lite build year.
15ca0 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20  .. "....        
15cb0 73 65 74 20 79 65 61 72 20 5b 67 65 74 42 75 69  set year [getBui
15cc0 6c 64 59 65 61 72 5d 0d 0a 20 20 20 20 20 20 20  ldYear]..       
15cd0 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b   addConstraint [
15ce0 61 70 70 65 6e 64 41 72 67 73 20 62 75 69 6c 64  appendArgs build
15cf0 59 65 61 72 2e 20 24 79 65 61 72 5d 0d 0a 20 20  Year. $year]..  
15d00 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
15d10 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
15d20 65 6e 64 41 72 67 73 20 5c 22 20 24 79 65 61 72  endArgs \" $year
15d30 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20   \"\n]....      
15d40 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
15d50 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20 63  OTE: Check the c
15d60 75 72 72 65 6e 74 20 62 75 69 6c 64 20 63 6f 6e  urrent build con
15d70 66 69 67 75 72 61 74 69 6f 6e 2e 20 20 54 68 69  figuration.  Thi
15d80 73 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c  s should normall
15d90 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
15da0 20 20 20 62 65 20 65 69 74 68 65 72 20 22 44 65     be either "De
15db0 62 75 67 22 20 6f 72 20 22 52 65 6c 65 61 73 65  bug" or "Release
15dc0 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  "...        #.. 
15dd0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
15de0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a  test_channel \..
15df0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
15e00 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53  - checking for S
15e10 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
15e20 65 20 62 75 69 6c 64 20 63 6f 6e 66 69 67 75 72  e build configur
15e30 61 74 69 6f 6e 2e 2e 2e 20 22 0d 0a 0d 0a 20 20  ation... "....  
15e40 20 20 20 20 20 20 73 65 74 20 63 6f 6e 66 69 67        set config
15e50 75 72 61 74 69 6f 6e 20 5b 67 65 74 42 75 69 6c  uration [getBuil
15e60 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 0d  dConfiguration].
15e70 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73  .        addCons
15e80 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
15e90 67 73 20 62 75 69 6c 64 43 6f 6e 66 69 67 75 72  gs buildConfigur
15ea0 61 74 69 6f 6e 2e 20 24 63 6f 6e 66 69 67 75 72  ation. $configur
15eb0 61 74 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ation]..        
15ec0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
15ed0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
15ee0 73 20 5c 22 20 24 63 6f 6e 66 69 67 75 72 61 74  s \" $configurat
15ef0 69 6f 6e 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20  ion \"\n]....   
15f00 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
15f10 23 20 4e 4f 54 45 3a 20 54 72 79 20 74 6f 20 73  # NOTE: Try to s
15f20 65 74 75 70 20 61 6e 20 69 6e 74 65 72 72 75 70  etup an interrup
15f30 74 20 63 61 6c 6c 62 61 63 6b 20 75 73 69 6e 67  t callback using
15f40 20 74 68 65 20 73 63 72 69 70 74 20 64 65 62 75   the script debu
15f50 67 67 65 72 0d 0a 20 20 20 20 20 20 20 20 23 20  gger..        # 
15f60 20 20 20 20 20 20 74 68 61 74 20 77 69 6c 6c 20        that will 
15f70 63 61 6e 63 65 6c 20 61 6c 6c 20 53 51 4c 20 71  cancel all SQL q
15f80 75 65 72 69 65 73 20 69 6e 20 70 72 6f 67 72 65  ueries in progre
15f90 73 73 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62  ss for all datab
15fa0 61 73 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ase..        #  
15fb0 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73       connections
15fc0 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 69 73 20 69   known to this i
15fd0 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20  nterpreter...   
15fe0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
15ff0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
16000 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 49 6e 74  s ::no(sqliteInt
16010 65 72 72 75 70 74 43 61 6c 6c 62 61 63 6b 29 5d  erruptCallback)]
16020 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
16030 20 20 20 20 73 65 74 75 70 44 62 49 6e 74 65 72      setupDbInter
16040 72 75 70 74 43 61 6c 6c 62 61 63 6b 20 24 3a 3a  ruptCallback $::
16050 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 3a 3a  test_channel $::
16060 74 65 73 74 5f 6c 6f 67 0d 0a 20 20 20 20 20 20  test_log..      
16070 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
16080 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
16090 3a 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20  : Check for the 
160a0 6e 61 74 69 76 65 20 72 75 6e 74 69 6d 65 20 6f  native runtime o
160b0 70 74 69 6f 6e 2c 20 77 68 69 63 68 20 77 6f 75  ption, which wou
160c0 6c 64 20 6d 65 61 6e 20 77 65 20 61 72 65 0d 0a  ld mean we are..
160d0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
160e0 75 73 69 6e 67 20 74 68 65 20 6d 69 78 65 64 2d  using the mixed-
160f0 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 2e 0d 0a  mode assembly...
16100 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
16110 20 20 20 63 68 65 63 6b 46 6f 72 52 75 6e 74 69     checkForRunti
16120 6d 65 4f 70 74 69 6f 6e 20 24 3a 3a 74 65 73 74  meOption $::test
16130 5f 63 68 61 6e 6e 65 6c 20 6e 61 74 69 76 65 0d  _channel native.
16140 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
16150 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
16160 65 63 6b 20 69 66 20 74 68 65 20 74 65 73 74 20  eck if the test 
16170 73 75 69 74 65 20 73 68 6f 75 6c 64 20 63 6f 75  suite should cou
16180 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
16190 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0d 0a 20 20   connections..  
161a0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22 6f        #       "o
161b0 70 65 6e 65 64 22 20 61 6e 64 20 22 63 6c 6f 73  pened" and "clos
161c0 65 64 22 20 66 72 6f 6d 20 74 68 65 20 70 6f 6f  ed" from the poo
161d0 6c 20 77 68 65 6e 20 64 65 74 65 72 6d 69 6e 69  l when determini
161e0 6e 67 20 69 66 20 61 20 74 65 73 74 0d 0a 20 20  ng if a test..  
161f0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 61        #       pa
16200 73 73 65 64 2e 20 20 44 69 73 61 62 6c 69 6e 67  ssed.  Disabling
16210 20 74 68 69 73 20 62 65 68 61 76 69 6f 72 20 69   this behavior i
16220 73 20 73 6f 6d 65 74 69 6d 65 73 20 6e 65 63 65  s sometimes nece
16230 73 73 61 72 79 20 28 65 2e 67 2e 0d 0a 20 20 20  ssary (e.g...   
16240 20 20 20 20 20 23 20 20 20 20 20 20 20 64 75 72       #       dur
16250 69 6e 67 20 74 68 65 20 72 65 6c 65 61 73 65 20  ing the release 
16260 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73 29  testing process)
16270 20 62 65 63 61 75 73 65 20 74 68 65 72 65 20 61   because there a
16280 72 65 20 73 65 76 65 72 61 6c 0d 0a 20 20 20 20  re several..    
16290 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74      #       test
162a0 73 20 74 68 61 74 20 72 65 6c 79 20 6f 6e 20 74  s that rely on t
162b0 68 65 20 22 6f 70 65 6e 65 64 20 66 72 6f 6d 20  he "opened from 
162c0 70 6f 6f 6c 22 20 63 6f 75 6e 74 20 62 65 69 6e  pool" count bein
162d0 67 20 67 72 65 61 74 65 72 0d 0a 20 20 20 20 20  g greater..     
162e0 20 20 20 23 20 20 20 20 20 20 20 74 68 61 6e 20     #       than 
162f0 7a 65 72 6f 2e 20 20 54 68 65 73 65 20 74 65 73  zero.  These tes
16300 74 73 20 6d 61 79 20 66 61 69 6c 20 64 75 65 20  ts may fail due 
16310 74 6f 20 74 68 65 20 6e 6f 6e 2d 64 65 74 65 72  to the non-deter
16320 6d 69 6e 69 73 74 69 63 0d 0a 20 20 20 20 20 20  ministic..      
16330 20 20 23 20 20 20 20 20 20 20 62 65 68 61 76 69    #       behavi
16340 6f 72 20 6f 66 20 74 68 65 20 43 4c 52 20 47 43  or of the CLR GC
16350 2c 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 72  , even when ther
16360 65 20 69 73 20 6e 6f 20 62 75 67 20 69 6e 20 74  e is no bug in t
16370 68 65 20 63 6f 64 65 0d 0a 20 20 20 20 20 20 20  he code..       
16380 20 23 20 20 20 20 20 20 20 62 65 69 6e 67 20 74   #       being t
16390 65 73 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20  ested...        
163a0 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  #..        check
163b0 46 6f 72 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  ForRuntimeOption
163c0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
163d0 20 6e 6f 50 6f 6f 6c 43 6f 75 6e 74 73 0d 0a 0d   noPoolCounts...
163e0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
163f0 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 70 6f      # NOTE: Repo
16400 72 74 20 74 68 65 20 72 65 73 6f 75 72 63 65 20  rt the resource 
16410 75 73 61 67 65 20 70 72 69 6f 72 20 74 6f 20 72  usage prior to r
16420 75 6e 6e 69 6e 67 20 61 6e 79 20 74 65 73 74 73  unning any tests
16430 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
16440 20 20 20 20 20 20 72 65 70 6f 72 74 53 51 4c 69        reportSQLi
16450 74 65 52 65 73 6f 75 72 63 65 73 20 24 3a 3a 74  teResources $::t
16460 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20  est_channel.... 
16470 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
16480 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74    # NOTE: Show t
16490 68 65 20 61 63 74 69 76 65 20 74 65 73 74 20 63  he active test c
164a0 6f 6e 73 74 72 61 69 6e 74 73 2e 0d 0a 20 20 20  onstraints...   
164b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
164c0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
164d0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
164e0 73 20 22 2d 2d 2d 2d 20 63 6f 6e 73 74 72 61 69  s "---- constrai
164f0 6e 74 73 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20  nts: " \..      
16500 20 20 20 20 20 20 5b 66 6f 72 6d 61 74 4c 69 73        [formatLis
16510 74 20 5b 6c 73 6f 72 74 20 5b 67 65 74 43 6f 6e  t [lsort [getCon
16520 73 74 72 61 69 6e 74 73 5d 5d 20 3c 6e 6f 6e 65  straints]] <none
16530 3e 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20  >] \n]....      
16540 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
16550 4f 54 45 3a 20 53 61 76 65 20 74 68 65 20 74 65  OTE: Save the te
16560 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66  st constraints f
16570 6f 72 20 75 73 65 20 62 79 20 74 68 72 65 61 64  or use by thread
16580 73 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 69  s created in thi
16590 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  s..        #    
165a0 20 20 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64     application d
165b0 6f 6d 61 69 6e 2e 20 20 54 68 69 73 20 69 73 20  omain.  This is 
165c0 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73  necessary becaus
165d0 65 20 61 6c 6c 20 74 68 65 20 45 61 67 6c 65 0d  e all the Eagle.
165e0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
165f0 20 22 74 65 73 74 20 63 6f 6e 74 65 78 74 22 20   "test context" 
16600 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 70  information is p
16610 65 72 2d 74 68 72 65 61 64 2e 0d 0a 20 20 20 20  er-thread...    
16620 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
16630 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
16640 20 3a 3a 74 65 73 74 5f 63 6f 6e 73 74 72 61 69   ::test_constrai
16650 6e 74 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  nts]} then {..  
16660 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65          set ::te
16670 73 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 24  st_constraints $
16680 3a 3a 65 61 67 6c 65 5f 74 65 73 74 73 28 63 6f  ::eagle_tests(co
16690 6e 73 74 72 61 69 6e 74 73 29 0d 0a 20 20 20 20  nstraints)..    
166a0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
166b0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
166c0 54 45 3a 20 4c 6f 61 64 20 74 68 65 20 22 61 66  TE: Load the "af
166d0 74 65 72 2d 63 6f 6e 73 74 72 61 69 6e 74 73 22  ter-constraints"
166e0 20 63 75 73 74 6f 6d 20 70 65 72 2d 75 73 65 72   custom per-user
166f0 20 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74   and/or per-host
16700 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
16710 20 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20    test settings 
16720 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  now...        #.
16730 0a 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c  .        uplevel
16740 20 31 20 5b 6c 69 73 74 20 6c 6f 61 64 53 51 4c   1 [list loadSQL
16750 69 74 65 54 65 73 74 53 65 74 74 69 6e 67 73 20  iteTestSettings 
16760 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
16770 2e 61 66 74 65 72 5d 0d 0a 0d 0a 20 20 20 20 20  .after]....     
16780 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
16790 4e 4f 54 45 3a 20 53 68 6f 77 20 77 68 65 6e 20  NOTE: Show when 
167a0 6f 75 72 20 74 65 73 74 73 20 61 63 74 75 61 6c  our tests actual
167b0 6c 79 20 62 65 67 61 6e 20 28 6e 6f 77 29 2e 0d  ly began (now)..
167c0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
167d0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
167e0 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
167f0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
16800 20 20 20 20 20 22 2d 2d 2d 2d 20 53 79 73 74 65       "---- Syste
16810 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 74 65  m.Data.SQLite te
16820 73 74 73 20 62 65 67 61 6e 20 61 74 20 22 20 5c  sts began at " \
16830 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 63  ..            [c
16840 6c 6f 63 6b 20 66 6f 72 6d 61 74 20 5b 63 6c 6f  lock format [clo
16850 63 6b 20 73 65 63 6f 6e 64 73 5d 5d 20 5c 6e 5d  ck seconds]] \n]
16860 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
16870 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 75  .....    proc ru
16880 6e 53 51 4c 69 74 65 54 65 73 74 45 70 69 6c 6f  nSQLiteTestEpilo
16890 67 75 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  gue {} {..      
168a0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
168b0 20 53 6b 69 70 20 72 75 6e 6e 69 6e 67 20 6f 75   Skip running ou
168c0 72 20 63 75 73 74 6f 6d 20 65 70 69 6c 6f 67 75  r custom epilogu
168d0 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20 6f 6e  e if the main on
168e0 65 20 68 61 73 20 62 65 65 6e 0d 0a 20 20 20 20  e has been..    
168f0 20 20 23 20 20 20 20 20 20 20 73 6b 69 70 70 65    #       skippe
16900 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  d...      #..   
16910 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
16920 69 73 74 73 20 3a 3a 6e 6f 28 65 70 69 6c 6f 67  ists ::no(epilog
16930 75 65 2e 65 61 67 6c 65 29 5d 7d 20 74 68 65 6e  ue.eagle)]} then
16940 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
16950 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
16960 68 6f 77 20 77 68 65 6e 20 6f 75 72 20 74 65 73  how when our tes
16970 74 73 20 61 63 74 75 61 6c 6c 79 20 65 6e 64 65  ts actually ende
16980 64 20 28 6e 6f 77 29 2e 0d 0a 20 20 20 20 20 20  d (now)...      
16990 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75    #..        tpu
169a0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
169b0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
169c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
169d0 2d 2d 2d 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  --- System.Data.
169e0 53 51 4c 69 74 65 20 74 65 73 74 73 20 65 6e 64  SQLite tests end
169f0 65 64 20 61 74 20 22 20 5c 0d 0a 20 20 20 20 20  ed at " \..     
16a00 20 20 20 20 20 20 20 5b 63 6c 6f 63 6b 20 66 6f         [clock fo
16a10 72 6d 61 74 20 5b 63 6c 6f 63 6b 20 73 65 63 6f  rmat [clock seco
16a20 6e 64 73 5d 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20  nds]] \n]....   
16a30 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
16a40 23 20 42 55 47 46 49 58 3a 20 42 65 66 6f 72 65  # BUGFIX: Before
16a50 20 63 68 65 63 6b 69 6e 67 20 74 68 65 20 66 69   checking the fi
16a60 6e 61 6c 20 72 65 73 6f 75 72 63 65 73 20 69 6e  nal resources in
16a70 20 75 73 65 20 62 79 20 53 51 4c 69 74 65 2c 20   use by SQLite, 
16a80 6d 61 6b 65 0d 0a 20 20 20 20 20 20 20 20 23 20  make..        # 
16a90 20 20 20 20 20 20 20 20 73 75 72 65 20 62 6f 74          sure bot
16aa0 68 20 6f 66 20 74 68 65 20 50 52 41 47 4d 41 20  h of the PRAGMA 
16ab0 72 65 6c 61 74 65 64 20 64 69 72 65 63 74 6f 72  related director
16ac0 79 20 6e 61 6d 65 73 20 61 72 65 20 66 72 65 65  y names are free
16ad0 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  d...        #.. 
16ae0 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53         checkForS
16af0 51 4c 69 74 65 44 69 72 65 63 74 6f 72 69 65 73  QLiteDirectories
16b00 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
16b10 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20 20   true....       
16b20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
16b30 54 45 3a 20 41 6c 73 6f 20 72 65 70 6f 72 74 20  TE: Also report 
16b40 74 68 65 20 72 65 73 6f 75 72 63 65 20 75 73 61  the resource usa
16b50 67 65 20 61 66 74 65 72 20 72 75 6e 6e 69 6e 67  ge after running
16b60 20 74 68 65 20 74 65 73 74 73 2e 0d 0a 20 20 20   the tests...   
16b70 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
16b80 72 65 70 6f 72 74 53 51 4c 69 74 65 52 65 73 6f  reportSQLiteReso
16b90 75 72 63 65 73 20 24 3a 3a 74 65 73 74 5f 63 68  urces $::test_ch
16ba0 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20  annel....       
16bb0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
16bc0 54 45 3a 20 52 65 70 6f 72 74 20 74 68 65 20 63  TE: Report the c
16bd0 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65 20 63  ritical handle c
16be0 6f 75 6e 74 73 20 61 66 74 65 72 20 72 75 6e 6e  ounts after runn
16bf0 69 6e 67 20 74 68 65 20 74 65 73 74 73 2e 0d 0a  ing the tests...
16c00 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
16c10 20 20 20 67 65 74 53 51 4c 69 74 65 48 61 6e 64     getSQLiteHand
16c20 6c 65 43 6f 75 6e 74 73 20 24 3a 3a 74 65 73 74  leCounts $::test
16c30 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20 20  _channel..      
16c40 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
16c50 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
16c60 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16c70 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16c80 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16c90 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20  ############..  
16ca0 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
16cb0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 20  ############### 
16cc0 45 4e 44 20 45 61 67 6c 65 20 4f 4e 4c 59 20 23  END Eagle ONLY #
16cd0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16ce0 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 20  #############.. 
16cf0 20 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23     #############
16d00 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16d10 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16d20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
16d30 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
16d40 20 20 7d 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23 20    }....  #..  # 
16d50 4e 4f 54 45 3a 20 53 61 76 65 20 74 68 65 20 6e  NOTE: Save the n
16d60 61 6d 65 20 6f 66 20 74 68 65 20 64 69 72 65 63  ame of the direc
16d70 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20  tory containing 
16d80 74 68 69 73 20 66 69 6c 65 2e 0d 0a 20 20 23 0d  this file...  #.
16d90 0a 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78  .  if {![info ex
16da0 69 73 74 73 20 63 6f 6d 6d 6f 6e 5f 64 69 72 65  ists common_dire
16db0 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ctory]} then {..
16dc0 20 20 20 20 73 65 74 20 63 6f 6d 6d 6f 6e 5f 64      set common_d
16dd0 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65 20 64  irectory [file d
16de0 69 72 6e 61 6d 65 20 5b 69 6e 66 6f 20 73 63 72  irname [info scr
16df0 69 70 74 5d 5d 0d 0a 20 20 7d 0d 0a 0d 0a 20 20  ipt]]..  }....  
16e00 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 50 72 6f  #..  # NOTE: Pro
16e10 76 69 64 65 20 74 68 65 20 53 79 73 74 65 6d 2e  vide the System.
16e20 44 61 74 61 2e 53 51 4c 69 74 65 20 74 65 73 74  Data.SQLite test
16e30 20 70 61 63 6b 61 67 65 20 74 6f 20 74 68 65 20   package to the 
16e40 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20  interpreter...  
16e50 23 0d 0a 20 20 70 61 63 6b 61 67 65 20 70 72 6f  #..  package pro
16e60 76 69 64 65 20 53 79 73 74 65 6d 2e 44 61 74 61  vide System.Data
16e70 2e 53 51 4c 69 74 65 2e 54 65 73 74 20 31 2e 30  .SQLite.Test 1.0
16e80 0d 0a 7d 0d 0a                                   ..}..