System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 347ada2390719df335fe1e59a9c90d45b6c6adc1:


0000: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0010: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0020: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0030: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0040: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
0050: 0a 23 0d 0a 23 20 63 6f 6d 6d 6f 6e 2e 65 61 67  .#..# common.eag
0060: 6c 65 20 2d 2d 0d 0a 23 0d 0a 23 20 57 72 69 74  le --..#..# Writ
0070: 74 65 6e 20 62 79 20 4a 6f 65 20 4d 69 73 74 61  ten by Joe Mista
0080: 63 68 6b 69 6e 2e 0d 0a 23 20 52 65 6c 65 61 73  chkin...# Releas
0090: 65 64 20 74 6f 20 74 68 65 20 70 75 62 6c 69 63  ed to the public
00a0: 20 64 6f 6d 61 69 6e 2c 20 75 73 65 20 61 74 20   domain, use at 
00b0: 79 6f 75 72 20 6f 77 6e 20 72 69 73 6b 21 0d 0a  your own risk!..
00c0: 23 0d 0a 23 23 23 23 23 23 23 23 23 23 23 23 23  #..#############
00d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
00e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
00f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0100: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0110: 23 23 0d 0a 0d 0a 23 0d 0a 23 20 4e 4f 54 45 3a  ##....#..# NOTE:
0120: 20 55 73 65 20 6f 75 72 20 6f 77 6e 20 6e 61 6d   Use our own nam
0130: 65 73 70 61 63 65 20 68 65 72 65 20 62 65 63 61  espace here beca
0140: 75 73 65 20 65 76 65 6e 20 74 68 6f 75 67 68 20  use even though 
0150: 77 65 20 64 6f 20 6e 6f 74 20 64 69 72 65 63 74  we do not direct
0160: 6c 79 0d 0a 23 20 20 20 20 20 20 20 73 75 70 70  ly..#       supp
0170: 6f 72 74 20 6e 61 6d 65 73 70 61 63 65 73 20 6f  ort namespaces o
0180: 75 72 73 65 6c 76 65 73 2c 20 77 65 20 64 6f 20  urselves, we do 
0190: 6e 6f 74 20 77 61 6e 74 20 74 6f 20 70 6f 6c 6c  not want to poll
01a0: 75 74 65 20 74 68 65 20 67 6c 6f 62 61 6c 0d 0a  ute the global..
01b0: 23 20 20 20 20 20 20 20 6e 61 6d 65 73 70 61 63  #       namespac
01c0: 65 20 69 66 20 74 68 69 73 20 73 63 72 69 70 74  e if this script
01d0: 20 61 63 74 75 61 6c 6c 79 20 65 6e 64 73 20 75   actually ends u
01e0: 70 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65  p being evaluate
01f0: 64 20 69 6e 20 54 63 6c 2e 0d 0a 23 0d 0a 6e 61  d in Tcl...#..na
0200: 6d 65 73 70 61 63 65 20 65 76 61 6c 20 3a 3a 45  mespace eval ::E
0210: 61 67 6c 65 20 7b 0d 0a 20 20 69 66 20 7b 5b 69  agle {..  if {[i
0220: 73 45 61 67 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d  sEagle]} then {.
0230: 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23  .    ###########
0240: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0250: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0260: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0270: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0280: 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23  ..    ##########
0290: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02a0: 23 23 20 42 45 47 49 4e 20 45 61 67 6c 65 20 4f  ## BEGIN Eagle O
02b0: 4e 4c 59 20 23 23 23 23 23 23 23 23 23 23 23 23  NLY ############
02c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02d0: 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23  #..    #########
02e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0300: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0310: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0320: 23 23 0d 0a 0d 0a 20 20 20 20 70 72 6f 63 20 67  ##....    proc g
0330: 65 74 42 75 69 6c 64 59 65 61 72 20 7b 7d 20 7b  etBuildYear {} {
0340: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
0350: 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66 20   # NOTE: See if 
0360: 74 68 65 20 22 79 65 61 72 22 20 73 65 74 74 69  the "year" setti
0370: 6e 67 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  ng has been over
0380: 72 69 64 64 65 6e 20 62 79 20 74 68 65 20 75 73  ridden by the us
0390: 65 72 20 28 65 2e 67 2e 0d 0a 20 20 20 20 20 20  er (e.g...      
03a0: 23 20 20 20 20 20 20 20 6f 6e 20 74 68 65 20 63  #       on the c
03b0: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 20 20 54  ommand line).  T
03c0: 68 69 73 20 68 65 6c 70 73 20 63 6f 6e 74 72 6f  his helps contro
03d0: 6c 20 65 78 61 63 74 6c 79 20 77 68 69 63 68 20  l exactly which 
03e0: 73 65 74 20 6f 66 0d 0a 20 20 20 20 20 20 23 20  set of..      # 
03f0: 20 20 20 20 20 20 62 69 6e 61 72 69 65 73 20 77        binaries w
0400: 65 20 61 72 65 20 74 65 73 74 69 6e 67 2c 20 74  e are testing, t
0410: 68 6f 73 65 20 70 72 6f 64 75 63 65 64 20 75 73  hose produced us
0420: 69 6e 67 20 74 68 65 20 56 69 73 75 61 6c 20 53  ing the Visual S
0430: 74 75 64 69 6f 0d 0a 20 20 20 20 20 20 23 20 20  tudio..      #  
0440: 20 20 20 20 20 32 30 30 35 2c 20 32 30 30 38 2c       2005, 2008,
0450: 20 32 30 31 30 2c 20 32 30 31 32 2c 20 6f 72 20   2010, 2012, or 
0460: 32 30 31 33 20 62 75 69 6c 64 20 73 79 73 74 65  2013 build syste
0470: 6d 73 2e 20 20 54 6f 20 6f 76 65 72 72 69 64 65  ms.  To override
0480: 20 74 68 69 73 0d 0a 20 20 20 20 20 20 23 20 20   this..      #  
0490: 20 20 20 20 20 76 61 6c 75 65 20 76 69 61 20 74       value via t
04a0: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2c  he command line,
04b0: 20 65 6e 74 65 72 20 61 20 63 6f 6d 6d 61 6e 64   enter a command
04c0: 20 73 69 6d 69 6c 61 72 20 74 6f 20 6f 6e 65 20   similar to one 
04d0: 6f 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  of..      #     
04e0: 20 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    the following 
04f0: 28 61 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65  (all on one line
0500: 29 3a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ):..      #..   
0510: 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65     #       Eagle
0520: 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e  Shell.exe -anyIn
0530: 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65  itialize "set te
0540: 73 74 5f 79 65 61 72 20 32 30 30 35 22 0d 0a 20  st_year 2005".. 
0550: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 2d       #         -
0560: 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61  file .\path\to\a
0570: 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20  ll.eagle..      
0580: 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  #..      #      
0590: 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20   EagleShell.exe 
05a0: 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20 22  -anyInitialize "
05b0: 73 65 74 20 74 65 73 74 5f 79 65 61 72 20 32 30  set test_year 20
05c0: 30 38 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20  08"..      #    
05d0: 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74       -file .\pat
05e0: 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a  h\to\all.eagle..
05f0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
0600: 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c         EagleShel
0610: 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61  l.exe -anyInitia
0620: 6c 69 7a 65 20 22 73 65 74 20 74 65 73 74 5f 79  lize "set test_y
0630: 65 61 72 20 32 30 31 30 22 0d 0a 20 20 20 20 20  ear 2010"..     
0640: 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65   #         -file
0650: 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65   .\path\to\all.e
0660: 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20  agle..      #.. 
0670: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
0680: 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79  leShell.exe -any
0690: 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20  Initialize "set 
06a0: 74 65 73 74 5f 79 65 61 72 20 32 30 31 32 22 0d  test_year 2012".
06b0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20  .      #        
06c0: 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f   -file .\path\to
06d0: 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20  \all.eagle..    
06e0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20    #..      #    
06f0: 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78     EagleShell.ex
0700: 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65  e -anyInitialize
0710: 20 22 73 65 74 20 74 65 73 74 5f 79 65 61 72 20   "set test_year 
0720: 32 30 31 33 22 0d 0a 20 20 20 20 20 20 23 20 20  2013"..      #  
0730: 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70         -file .\p
0740: 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65  ath\to\all.eagle
0750: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
0760: 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68   #       EagleSh
0770: 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74  ell.exe -anyInit
0780: 69 61 6c 69 7a 65 20 22 75 6e 73 65 74 20 2d 6e  ialize "unset -n
0790: 6f 63 6f 6d 70 6c 61 69 6e 20 74 65 73 74 5f 79  ocomplain test_y
07a0: 65 61 72 22 0d 0a 20 20 20 20 20 20 23 20 20 20  ear"..      #   
07b0: 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61        -file .\pa
07c0: 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d  th\to\all.eagle.
07d0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
07e0: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
07f0: 20 3a 3a 74 65 73 74 5f 79 65 61 72 5d 20 26 26   ::test_year] &&
0800: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
0810: 24 3a 3a 74 65 73 74 5f 79 65 61 72 5d 20 3e 20  $::test_year] > 
0820: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
0830: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
0840: 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70  NOTE: Use the sp
0850: 65 63 69 66 69 65 64 20 74 65 73 74 20 79 65 61  ecified test yea
0860: 72 2e 20 20 49 66 20 74 68 69 73 20 76 61 72 69  r.  If this vari
0870: 61 62 6c 65 20 69 73 20 6e 6f 74 20 73 65 74 2c  able is not set,
0880: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
0890: 20 20 20 20 20 20 64 65 66 61 75 6c 74 20 76 61        default va
08a0: 6c 75 65 20 77 69 6c 6c 20 62 65 20 62 61 73 65  lue will be base
08b0: 64 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  d on whether or 
08c0: 6e 6f 74 20 45 61 67 6c 65 20 68 61 73 20 62 65  not Eagle has be
08d0: 65 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  en..        #   
08e0: 20 20 20 20 63 6f 6d 70 69 6c 65 64 20 61 67 61      compiled aga
08f0: 69 6e 73 74 20 74 68 65 20 43 4c 52 20 76 32 2e  inst the CLR v2.
0900: 30 20 6f 72 20 43 4c 52 20 76 34 2e 30 2e 0d 0a  0 or CLR v4.0...
0910: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
0920: 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73     return $::tes
0930: 74 5f 79 65 61 72 0d 0a 20 20 20 20 20 20 7d 20  t_year..      } 
0940: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
0950: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
0960: 45 3a 20 49 66 20 45 61 67 6c 65 20 68 61 73 20  E: If Eagle has 
0970: 62 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20 61 67  been compiled ag
0980: 61 69 6e 73 74 20 74 68 65 20 43 4c 52 20 76 34  ainst the CLR v4
0990: 2e 30 2c 20 75 73 65 20 22 32 30 31 30 22 20 62  .0, use "2010" b
09a0: 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
09b0: 20 20 20 64 65 66 61 75 6c 74 20 28 77 65 20 63     default (we c
09c0: 6f 75 6c 64 20 75 73 65 20 22 32 30 31 32 22 20  ould use "2012" 
09d0: 6f 72 20 22 32 30 31 33 22 20 69 6e 20 74 68 61  or "2013" in tha
09e0: 74 20 63 61 73 65 20 61 73 20 77 65 6c 6c 29 20  t case as well) 
09f0: 61 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  as..        #   
0a00: 20 20 20 20 74 68 65 20 74 65 73 74 20 79 65 61      the test yea
0a10: 72 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 75 73  r; otherwise, us
0a20: 65 20 22 32 30 30 38 22 20 62 79 20 64 65 66 61  e "2008" by defa
0a30: 75 6c 74 20 28 77 65 20 63 6f 75 6c 64 20 75 73  ult (we could us
0a40: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
0a50: 20 20 20 22 32 30 30 35 22 20 69 6e 20 74 68 61     "2005" in tha
0a60: 74 20 63 61 73 65 20 61 73 20 77 65 6c 6c 29 2e  t case as well).
0a70: 20 20 49 66 20 61 6e 6f 74 68 65 72 20 6d 61 6a    If another maj
0a80: 6f 72 20 5b 69 6e 63 6f 6d 70 61 74 69 62 6c 65  or [incompatible
0a90: 5d 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ]..        #    
0aa0: 20 20 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68     version of th
0ab0: 65 20 43 4c 52 20 69 73 20 72 65 6c 65 61 73 65  e CLR is release
0ac0: 64 2c 20 74 68 69 73 20 63 68 65 63 6b 20 77 69  d, this check wi
0ad0: 6c 6c 20 68 61 76 65 20 74 6f 20 62 65 0d 0a 20  ll have to be.. 
0ae0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
0af0: 68 61 6e 67 65 64 2e 20 20 54 68 65 20 64 65 66  hanged.  The def
0b00: 61 75 6c 74 20 74 65 73 74 20 79 65 61 72 20 74  ault test year t
0b10: 6f 20 75 73 65 20 66 6f 72 20 61 20 70 61 72 74  o use for a part
0b20: 69 63 75 6c 61 72 20 43 4c 52 0d 0a 20 20 20 20  icular CLR..    
0b30: 20 20 20 20 23 20 20 20 20 20 20 20 76 65 72 73      #       vers
0b40: 69 6f 6e 20 6d 61 79 20 62 65 20 6f 76 65 72 72  ion may be overr
0b50: 69 64 64 65 6e 20 62 79 20 73 65 74 74 69 6e 67  idden by setting
0b60: 20 74 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 69   the global vari
0b70: 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20  able..        # 
0b80: 20 20 20 20 20 20 22 74 65 73 74 5f 79 65 61 72        "test_year
0b90: 5f 63 6c 72 5f 76 24 58 22 2c 20 77 68 65 72 65  _clr_v$X", where
0ba0: 20 22 24 58 22 20 6d 61 79 20 5b 63 75 72 72 65   "$X" may [curre
0bb0: 6e 74 6c 79 5d 20 62 65 20 65 69 74 68 65 72 20  ntly] be either 
0bc0: 22 32 22 0d 0a 20 20 20 20 20 20 20 20 23 20 20  "2"..        #  
0bd0: 20 20 20 20 20 6f 72 20 22 34 22 2e 0d 0a 20 20       or "4"...  
0be0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
0bf0: 20 69 66 20 7b 5b 68 61 76 65 43 6f 6e 73 74 72   if {[haveConstr
0c00: 61 69 6e 74 20 69 6d 61 67 65 52 75 6e 74 69 6d  aint imageRuntim
0c10: 65 34 30 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e40]} then {..  
0c20: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66          if {[inf
0c30: 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f  o exists ::test_
0c40: 79 65 61 72 5f 63 6c 72 5f 76 34 5d 20 26 26 20  year_clr_v4] && 
0c50: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
0c60: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
0c70: 24 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c 72  $::test_year_clr
0c80: 5f 76 34 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  _v4] > 0} then {
0c90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
0ca0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
0cb0: 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65  OTE: Use the spe
0cc0: 63 69 66 69 65 64 20 74 65 73 74 20 79 65 61 72  cified test year
0cd0: 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76 34 2e   for the CLR v4.
0ce0: 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  0...            
0cf0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  #..            r
0d00: 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 79 65  eturn $::test_ye
0d10: 61 72 5f 63 6c 72 5f 76 34 0d 0a 20 20 20 20 20  ar_clr_v4..     
0d20: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
0d30: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
0d40: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
0d50: 3a 20 55 73 65 20 74 68 65 20 64 65 66 61 75 6c  : Use the defaul
0d60: 74 20 74 65 73 74 20 79 65 61 72 20 66 6f 72 20  t test year for 
0d70: 74 68 65 20 43 4c 52 20 76 34 2e 30 2e 0d 0a 20  the CLR v4.0... 
0d80: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
0d90: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
0da0: 20 32 30 31 30 3b 20 23 20 54 4f 44 4f 3a 20 47   2010; # TODO: G
0db0: 6f 6f 64 20 22 66 61 6c 6c 62 61 63 6b 22 20 64  ood "fallback" d
0dc0: 65 66 61 75 6c 74 3f 0d 0a 20 20 20 20 20 20 20  efault?..       
0dd0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
0de0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
0df0: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
0e00: 74 73 20 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63  ts ::test_year_c
0e10: 6c 72 5f 76 32 5d 20 26 26 20 5c 0d 0a 20 20 20  lr_v2] && \..   
0e20: 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69             [stri
0e30: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73  ng length $::tes
0e40: 74 5f 79 65 61 72 5f 63 6c 72 5f 76 32 5d 20 3e  t_year_clr_v2] >
0e50: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
0e60: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
0e70: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55         # NOTE: U
0e80: 73 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64  se the specified
0e90: 20 74 65 73 74 20 79 65 61 72 20 66 6f 72 20 74   test year for t
0ea0: 68 65 20 43 4c 52 20 76 32 2e 30 2e 0d 0a 20 20  he CLR v2.0...  
0eb0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
0ec0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
0ed0: 24 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c 72  $::test_year_clr
0ee0: 5f 76 32 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  _v2..          }
0ef0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
0f00: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
0f10: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
0f20: 74 68 65 20 64 65 66 61 75 6c 74 20 74 65 73 74  the default test
0f30: 20 79 65 61 72 20 66 6f 72 20 74 68 65 20 43 4c   year for the CL
0f40: 52 20 76 32 2e 30 2e 0d 0a 20 20 20 20 20 20 20  R v2.0...       
0f50: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
0f60: 20 20 20 20 72 65 74 75 72 6e 20 32 30 30 38 3b      return 2008;
0f70: 20 23 20 54 4f 44 4f 3a 20 47 6f 6f 64 20 22 66   # TODO: Good "f
0f80: 61 6c 6c 62 61 63 6b 22 20 64 65 66 61 75 6c 74  allback" default
0f90: 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ?..          }..
0fa0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
0fb0: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
0fc0: 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 59    proc getBuildY
0fd0: 65 61 72 73 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  ears {} {..     
0fe0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
0ff0: 3a 20 53 65 65 20 69 66 20 74 68 65 20 6c 69 73  : See if the lis
1000: 74 20 6f 66 20 74 65 73 74 20 79 65 61 72 73 20  t of test years 
1010: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64  has been overrid
1020: 64 65 6e 20 62 79 20 74 68 65 20 75 73 65 72 0d  den by the user.
1030: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 28  .      #       (
1040: 65 2e 67 2e 20 6f 6e 20 74 68 65 20 63 6f 6d 6d  e.g. on the comm
1050: 61 6e 64 20 6c 69 6e 65 29 2e 0d 0a 20 20 20 20  and line)...    
1060: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
1070: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65  info exists ::te
1080: 73 74 5f 79 65 61 72 73 5d 20 26 26 20 5b 6c 6c  st_years] && [ll
1090: 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 79 65  ength $::test_ye
10a0: 61 72 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ars] > 0} then {
10b0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
10c0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65       # NOTE: Use
10d0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c   the specified l
10e0: 69 73 74 20 6f 66 20 74 65 73 74 20 79 65 61 72  ist of test year
10f0: 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  s...        #.. 
1100: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
1110: 3a 74 65 73 74 5f 79 65 61 72 73 0d 0a 20 20 20  :test_years..   
1120: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1130: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1140: 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20  # NOTE: Use the 
1150: 64 65 66 61 75 6c 74 20 6c 69 73 74 20 6f 66 20  default list of 
1160: 74 65 73 74 20 79 65 61 72 73 20 28 69 2e 65 2e  test years (i.e.
1170: 20 61 6c 6c 29 2e 0d 0a 20 20 20 20 20 20 20 20   all)...        
1180: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
1190: 6e 20 5b 6c 69 73 74 20 32 30 30 35 20 32 30 30  n [list 2005 200
11a0: 38 20 32 30 31 30 20 32 30 31 32 20 32 30 31 33  8 2010 2012 2013
11b0: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
11c0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
11d0: 65 74 42 75 69 6c 64 4e 65 74 46 78 20 7b 7d 20  etBuildNetFx {} 
11e0: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
11f0: 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66    # NOTE: See if
1200: 20 74 68 65 20 74 65 73 74 20 2e 4e 45 54 20 46   the test .NET F
1210: 72 61 6d 65 77 6f 72 6b 20 73 65 74 74 69 6e 67  ramework setting
1220: 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69   has been overri
1230: 64 64 65 6e 20 62 79 0d 0a 20 20 20 20 20 20 23  dden by..      #
1240: 20 20 20 20 20 20 20 74 68 65 20 75 73 65 72 20         the user 
1250: 28 65 2e 67 2e 20 6f 6e 20 74 68 65 20 63 6f 6d  (e.g. on the com
1260: 6d 61 6e 64 20 6c 69 6e 65 29 2e 0d 0a 20 20 20  mand line)...   
1270: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
1280: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
1290: 65 73 74 5f 6e 65 74 5f 66 78 5d 20 26 26 20 5c  est_net_fx] && \
12a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
12b0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65  ing length $::te
12c0: 73 74 5f 6e 65 74 5f 66 78 5d 20 3e 20 30 7d 20  st_net_fx] > 0} 
12d0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
12e0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
12f0: 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63 69  E: Use the speci
1300: 66 69 65 64 20 74 65 73 74 20 2e 4e 45 54 20 46  fied test .NET F
1310: 72 61 6d 65 77 6f 72 6b 2e 0d 0a 20 20 20 20 20  ramework...     
1320: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
1330: 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 6e 65 74  turn $::test_net
1340: 5f 66 78 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  _fx..      } els
1350: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  e {..        set
1360: 20 79 65 61 72 20 5b 67 65 74 42 75 69 6c 64 59   year [getBuildY
1370: 65 61 72 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ear]....        
1380: 73 77 69 74 63 68 20 2d 65 78 61 63 74 20 2d 2d  switch -exact --
1390: 20 24 79 65 61 72 20 7b 0d 0a 20 20 20 20 20 20   $year {..      
13a0: 20 20 20 20 32 30 30 35 20 7b 0d 0a 20 20 20 20      2005 {..    
13b0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e          return n
13c0: 65 74 46 78 32 30 0d 0a 20 20 20 20 20 20 20 20  etFx20..        
13d0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 32    }..          2
13e0: 30 30 38 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  008 {..         
13f0: 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78 33     return netFx3
1400: 35 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  5..          }..
1410: 20 20 20 20 20 20 20 20 20 20 32 30 31 30 20 7b            2010 {
1420: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
1430: 74 75 72 6e 20 6e 65 74 46 78 34 30 0d 0a 20 20  turn netFx40..  
1440: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1450: 20 20 20 20 20 32 30 31 32 20 7b 0d 0a 20 20 20       2012 {..   
1460: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1470: 6e 65 74 46 78 34 35 0d 0a 20 20 20 20 20 20 20  netFx45..       
1480: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
1490: 32 30 31 33 20 7b 0d 0a 20 20 20 20 20 20 20 20  2013 {..        
14a0: 20 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78      return netFx
14b0: 34 35 31 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  451..          }
14c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 64 65 66 61  ..          defa
14d0: 75 6c 74 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  ult {..         
14e0: 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78 33     return netFx3
14f0: 35 3b 20 23 20 54 4f 44 4f 3a 20 47 6f 6f 64 20  5; # TODO: Good 
1500: 22 66 61 6c 6c 62 61 63 6b 22 20 64 65 66 61 75  "fallback" defau
1510: 6c 74 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  lt?..          }
1520: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
1530: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
1540: 20 20 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c      proc getBuil
1550: 64 50 6c 61 74 66 6f 72 6d 20 7b 20 6e 61 74 69  dPlatform { nati
1560: 76 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66  ve } {..      if
1570: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
1580: 3a 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d 5d 20  :test_platform] 
1590: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
15a0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
15b0: 3a 3a 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d 5d  ::test_platform]
15c0: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
15d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
15e0: 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65   # NOTE: Use the
15f0: 20 73 70 65 63 69 66 69 65 64 20 74 65 73 74 20   specified test 
1600: 70 6c 61 74 66 6f 72 6d 2e 20 20 49 66 20 74 68  platform.  If th
1610: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 6e  is variable is n
1620: 6f 74 20 73 65 74 2c 0d 0a 20 20 20 20 20 20 20  ot set,..       
1630: 20 23 20 20 20 20 20 20 20 74 68 65 20 64 65 66   #       the def
1640: 61 75 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c 20  ault value will 
1650: 62 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  be based on the 
1660: 6d 61 63 68 69 6e 65 20 61 72 63 68 69 74 65 63  machine architec
1670: 74 75 72 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  ture...        #
1680: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
1690: 20 5b 65 78 70 72 20 7b 24 6e 61 74 69 76 65 20   [expr {$native 
16a0: 3f 20 24 3a 3a 74 65 73 74 5f 70 6c 61 74 66 6f  ? $::test_platfo
16b0: 72 6d 20 3a 20 22 22 7d 5d 0d 0a 20 20 20 20 20  rm : ""}]..     
16c0: 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f   } elseif {[info
16d0: 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 6d   exists ::test_m
16e0: 61 63 68 69 6e 65 5d 20 26 26 20 5c 0d 0a 20 20  achine] && \..  
16f0: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
1700: 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 6d  length $::test_m
1710: 61 63 68 69 6e 65 5d 20 3e 20 30 7d 20 74 68 65  achine] > 0} the
1720: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
1730: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1740: 46 6f 72 20 6e 61 74 69 76 65 20 62 75 69 6c 64  For native build
1750: 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 6c  s, return the pl
1760: 61 74 66 6f 72 6d 20 6e 61 6d 65 20 63 6f 72 72  atform name corr
1770: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 0d 0a 20 20  esponding to..  
1780: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
1790: 65 20 74 65 73 74 20 6d 61 63 68 69 6e 65 20 61  e test machine a
17a0: 72 63 68 69 74 65 63 74 75 72 65 3b 20 6f 74 68  rchitecture; oth
17b0: 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61  erwise, return a
17c0: 6e 20 65 6d 70 74 79 0d 0a 20 20 20 20 20 20 20  n empty..       
17d0: 20 23 20 20 20 20 20 20 20 73 74 72 69 6e 67 2e   #       string.
17e0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
17f0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70       return [exp
1800: 72 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 24  r {..          $
1810: 6e 61 74 69 76 65 20 3f 20 5b 6d 61 63 68 69 6e  native ? [machin
1820: 65 54 6f 50 6c 61 74 66 6f 72 6d 20 24 3a 3a 74  eToPlatform $::t
1830: 65 73 74 5f 6d 61 63 68 69 6e 65 5d 20 3a 20 22  est_machine] : "
1840: 22 0d 0a 20 20 20 20 20 20 20 20 7d 5d 0d 0a 20  "..        }].. 
1850: 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b       } elseif {[
1860: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63  info exists ::tc
1870: 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61 63 68 69  l_platform(machi
1880: 6e 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ne)]} then {..  
1890: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
18a0: 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 6e 61 74   # NOTE: For nat
18b0: 69 76 65 20 62 75 69 6c 64 73 2c 20 72 65 74 75  ive builds, retu
18c0: 72 6e 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 20  rn the platform 
18d0: 6e 61 6d 65 20 63 6f 72 72 65 73 70 6f 6e 64 69  name correspondi
18e0: 6e 67 20 74 6f 0d 0a 20 20 20 20 20 20 20 20 23  ng to..        #
18f0: 20 20 20 20 20 20 20 74 68 65 20 6d 61 63 68 69         the machi
1900: 6e 65 20 61 72 63 68 69 74 65 63 74 75 72 65 3b  ne architecture;
1910: 20 6f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   otherwise, retu
1920: 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  rn an empty stri
1930: 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ng...        #..
1940: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
1950: 65 78 70 72 20 7b 0d 0a 20 20 20 20 20 20 20 20  expr {..        
1960: 20 20 24 6e 61 74 69 76 65 20 3f 20 5b 6d 61 63    $native ? [mac
1970: 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72 6d 20 24  hineToPlatform $
1980: 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d  ::tcl_platform(m
1990: 61 63 68 69 6e 65 29 5d 20 3a 20 22 22 0d 0a 20  achine)] : "".. 
19a0: 20 20 20 20 20 20 20 7d 5d 0d 0a 20 20 20 20 20         }]..     
19b0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
19c0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
19d0: 4e 4f 54 45 3a 20 4e 6f 20 6d 61 63 68 69 6e 65  NOTE: No machine
19e0: 20 61 72 63 68 69 74 65 63 74 75 72 65 20 69 73   architecture is
19f0: 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 74 75   available, retu
1a00: 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  rn an empty stri
1a10: 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ng...        #  
1a20: 20 20 20 20 20 49 74 20 69 73 20 69 6d 70 6f 72       It is impor
1a30: 74 61 6e 74 20 74 6f 20 72 65 74 75 72 6e 20 61  tant to return a
1a40: 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20 68  n empty string h
1a50: 65 72 65 20 62 65 63 61 75 73 65 20 74 68 65 0d  ere because the.
1a60: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
1a70: 20 72 65 73 75 6c 74 20 6f 66 20 74 68 69 73 20   result of this 
1a80: 70 72 6f 63 65 64 75 72 65 20 6d 61 79 20 62 65  procedure may be
1a90: 20 75 73 65 64 20 77 69 74 68 20 5b 66 69 6c 65   used with [file
1aa0: 20 6a 6f 69 6e 5d 2e 0d 0a 20 20 20 20 20 20 20   join]...       
1ab0: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
1ac0: 72 6e 20 22 22 0d 0a 20 20 20 20 20 20 7d 0d 0a  rn ""..      }..
1ad0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
1ae0: 6f 63 20 67 65 74 42 75 69 6c 64 43 6f 6e 66 69  oc getBuildConfi
1af0: 67 75 72 61 74 69 6f 6e 20 7b 7d 20 7b 0d 0a 20  guration {} {.. 
1b00: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
1b10: 4e 4f 54 45 3a 20 53 65 65 20 69 66 20 74 68 65  NOTE: See if the
1b20: 20 22 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22   "configuration"
1b30: 20 73 65 74 74 69 6e 67 20 68 61 73 20 62 65 65   setting has bee
1b40: 6e 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20  n overridden by 
1b50: 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
1b60: 20 20 20 75 73 65 72 20 28 65 2e 67 2e 20 6f 6e     user (e.g. on
1b70: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
1b80: 65 29 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20  e).  This helps 
1b90: 63 6f 6e 74 72 6f 6c 20 65 78 61 63 74 6c 79 0d  control exactly.
1ba0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77  .      #       w
1bb0: 68 69 63 68 20 73 65 74 20 6f 66 20 62 69 6e 61  hich set of bina
1bc0: 72 69 65 73 20 77 65 20 61 72 65 20 74 65 73 74  ries we are test
1bd0: 69 6e 67 20 28 69 2e 65 2e 20 74 68 6f 73 65 20  ing (i.e. those 
1be0: 62 75 69 6c 74 20 69 6e 20 74 68 65 0d 0a 20 20  built in the..  
1bf0: 20 20 20 20 23 20 20 20 20 20 20 20 22 44 65 62      #       "Deb
1c00: 75 67 22 20 6f 72 20 22 52 65 6c 65 61 73 65 22  ug" or "Release"
1c10: 20 62 75 69 6c 64 20 63 6f 6e 66 69 67 75 72 61   build configura
1c20: 74 69 6f 6e 73 29 2e 20 20 54 6f 20 6f 76 65 72  tions).  To over
1c30: 72 69 64 65 20 74 68 69 73 0d 0a 20 20 20 20 20  ride this..     
1c40: 20 23 20 20 20 20 20 20 20 76 61 6c 75 65 20 76   #       value v
1c50: 69 61 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c  ia the command l
1c60: 69 6e 65 2c 20 65 6e 74 65 72 20 61 20 63 6f 6d  ine, enter a com
1c70: 6d 61 6e 64 20 73 69 6d 69 6c 61 72 20 74 6f 20  mand similar to 
1c80: 6f 6e 65 20 6f 66 0d 0a 20 20 20 20 20 20 23 20  one of..      # 
1c90: 20 20 20 20 20 20 74 68 65 20 66 6f 6c 6c 6f 77        the follow
1ca0: 69 6e 67 20 28 61 6c 6c 20 6f 6e 20 6f 6e 65 20  ing (all on one 
1cb0: 6c 69 6e 65 29 3a 0d 0a 20 20 20 20 20 20 23 0d  line):..      #.
1cc0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45  .      #       E
1cd0: 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61  agleShell.exe -a
1ce0: 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65  nyInitialize "se
1cf0: 74 20 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61  t test_configura
1d00: 74 69 6f 6e 20 44 65 62 75 67 22 0d 0a 20 20 20  tion Debug"..   
1d10: 20 20 20 23 20 20 20 20 20 20 20 20 20 2d 66 69     #         -fi
1d20: 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c  le .\path\to\all
1d30: 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d  .eagle..      #.
1d40: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45  .      #       E
1d50: 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61  agleShell.exe -a
1d60: 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65  nyInitialize "se
1d70: 74 20 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61  t test_configura
1d80: 74 69 6f 6e 20 52 65 6c 65 61 73 65 22 0d 0a 20  tion Release".. 
1d90: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 2d       #         -
1da0: 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61  file .\path\to\a
1db0: 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20  ll.eagle..      
1dc0: 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  #..      #      
1dd0: 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20   EagleShell.exe 
1de0: 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c  -file .\path\to\
1df0: 61 6c 6c 2e 65 61 67 6c 65 20 2d 70 72 65 54 65  all.eagle -preTe
1e00: 73 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  st..      #     
1e10: 20 20 20 20 22 75 6e 73 65 74 20 2d 6e 6f 63 6f      "unset -noco
1e20: 6d 70 6c 61 69 6e 20 74 65 73 74 5f 63 6f 6e 66  mplain test_conf
1e30: 69 67 75 72 61 74 69 6f 6e 22 0d 0a 20 20 20 20  iguration"..    
1e40: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
1e50: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65  info exists ::te
1e60: 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  st_configuration
1e70: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
1e80: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
1e90: 20 24 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75   $::test_configu
1ea0: 72 61 74 69 6f 6e 5d 20 3e 20 30 7d 20 74 68 65  ration] > 0} the
1eb0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
1ec0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1ed0: 55 73 65 20 74 68 65 20 73 70 65 63 69 66 69 65  Use the specifie
1ee0: 64 20 74 65 73 74 20 63 6f 6e 66 69 67 75 72 61  d test configura
1ef0: 74 69 6f 6e 2e 20 20 54 68 65 20 64 65 66 61 75  tion.  The defau
1f00: 6c 74 20 76 61 6c 75 65 20 75 73 65 64 0d 0a 20  lt value used.. 
1f10: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66         #       f
1f20: 6f 72 20 74 68 69 73 20 76 61 72 69 61 62 6c 65  or this variable
1f30: 20 69 73 20 74 79 70 69 63 61 6c 6c 79 20 22 52   is typically "R
1f40: 65 6c 65 61 73 65 22 2c 20 61 73 20 73 65 74 20  elease", as set 
1f50: 62 79 20 74 68 65 20 74 65 73 74 0d 0a 20 20 20  by the test..   
1f60: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 75 69       #       sui
1f70: 74 65 20 69 74 73 65 6c 66 2e 0d 0a 20 20 20 20  te itself...    
1f80: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
1f90: 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 63 6f  eturn $::test_co
1fa0: 6e 66 69 67 75 72 61 74 69 6f 6e 0d 0a 20 20 20  nfiguration..   
1fb0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1fc0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1fd0: 23 20 4e 4f 54 45 3a 20 4e 6f 72 6d 61 6c 6c 79  # NOTE: Normally
1fe0: 2c 20 77 65 20 77 69 6c 6c 20 6e 65 76 65 72 20  , we will never 
1ff0: 68 69 74 20 74 68 69 73 20 63 61 73 65 20 62 65  hit this case be
2000: 63 61 75 73 65 20 74 68 65 20 76 61 6c 75 65 20  cause the value 
2010: 6f 66 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  of the..        
2020: 23 20 20 20 20 20 20 20 74 65 73 74 20 63 6f 6e  #       test con
2030: 66 69 67 75 72 61 74 69 6f 6e 20 76 61 72 69 61  figuration varia
2040: 62 6c 65 20 69 73 20 61 6c 77 61 79 73 20 73 65  ble is always se
2050: 74 20 62 79 20 74 68 65 20 74 65 73 74 20 73 75  t by the test su
2060: 69 74 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ite..        #  
2070: 20 20 20 20 20 69 74 73 65 6c 66 3b 20 68 6f 77       itself; how
2080: 65 76 65 72 2c 20 69 74 20 63 61 6e 20 62 65 20  ever, it can be 
2090: 6f 76 65 72 72 69 64 64 65 6e 20 75 73 69 6e 67  overridden using
20a0: 20 74 68 65 20 75 6e 73 65 74 20 63 6f 6d 6d 61   the unset comma
20b0: 6e 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  nd..        #   
20c0: 20 20 20 20 66 72 6f 6d 20 74 68 65 20 2d 70 72      from the -pr
20d0: 65 54 65 73 74 20 6f 70 74 69 6f 6e 20 74 6f 20  eTest option to 
20e0: 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d  the test suite..
20f0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
2100: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 65 61      return $::ea
2110: 67 6c 65 5f 70 6c 61 74 66 6f 72 6d 28 63 6f 6e  gle_platform(con
2120: 66 69 67 75 72 61 74 69 6f 6e 29 0d 0a 20 20 20  figuration)..   
2130: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
2140: 20 20 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c      proc getBuil
2150: 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20  dConfigurations 
2160: 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
2170: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 65       # NOTE: See
2180: 20 69 66 20 74 68 65 20 6c 69 73 74 20 6f 66 20   if the list of 
2190: 74 65 73 74 20 63 6f 6e 66 69 67 75 72 61 74 69  test configurati
21a0: 6f 6e 73 20 68 61 73 20 62 65 65 6e 20 6f 76 65  ons has been ove
21b0: 72 72 69 64 64 65 6e 20 62 79 0d 0a 20 20 20 20  rridden by..    
21c0: 20 20 23 20 20 20 20 20 20 20 74 68 65 20 75 73    #       the us
21d0: 65 72 20 28 65 2e 67 2e 20 6f 6e 20 74 68 65 20  er (e.g. on the 
21e0: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 0d 0a  command line)...
21f0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
2200: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
2210: 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61  ::test_configura
2220: 74 69 6f 6e 73 5d 20 26 26 20 5c 0d 0a 20 20 20  tions] && \..   
2230: 20 20 20 20 20 20 20 5b 6c 6c 65 6e 67 74 68 20         [llength 
2240: 24 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72  $::test_configur
2250: 61 74 69 6f 6e 73 5d 20 3e 20 30 7d 20 74 68 65  ations] > 0} the
2260: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
2270: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
2280: 55 73 65 20 74 68 65 20 73 70 65 63 69 66 69 65  Use the specifie
2290: 64 20 6c 69 73 74 20 6f 66 20 74 65 73 74 20 63  d list of test c
22a0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 2e 0d 0a  onfigurations...
22b0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
22c0: 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73     return $::tes
22d0: 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  t_configurations
22e0: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
22f0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2300: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65       # NOTE: Use
2310: 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c 69 73   the default lis
2320: 74 20 6f 66 20 74 65 73 74 20 63 6f 6e 66 69 67  t of test config
2330: 75 72 61 74 69 6f 6e 73 2e 0d 0a 20 20 20 20 20  urations...     
2340: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
2350: 74 75 72 6e 20 5b 6c 69 73 74 20 44 65 62 75 67  turn [list Debug
2360: 20 52 65 6c 65 61 73 65 5d 0d 0a 20 20 20 20 20   Release]..     
2370: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
2380: 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 42    proc getBuildB
2390: 61 73 65 44 69 72 65 63 74 6f 72 79 20 7b 7d 20  aseDirectory {} 
23a0: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
23b0: 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65    # NOTE: Figure
23c0: 20 6f 75 74 20 74 68 65 20 62 61 73 65 20 64 69   out the base di
23d0: 72 65 63 74 6f 72 79 20 77 68 65 72 65 20 61 6c  rectory where al
23e0: 6c 20 74 68 65 20 62 75 69 6c 64 73 20 73 68 6f  l the builds sho
23f0: 75 6c 64 20 62 65 0d 0a 20 20 20 20 20 20 23 20  uld be..      # 
2400: 20 20 20 20 20 20 6c 6f 63 61 74 65 64 2e 20 20        located.  
2410: 54 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65  This will be the
2420: 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20   directory that 
2430: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 61 63 74  contains the act
2440: 75 61 6c 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ual..      #    
2450: 20 20 20 62 75 69 6c 64 20 6f 75 74 70 75 74 20     build output 
2460: 64 69 72 65 63 74 6f 72 79 20 28 65 2e 67 2e 20  directory (e.g. 
2470: 70 61 72 65 6e 74 20 6f 66 20 22 62 69 6e 22 29  parent of "bin")
2480: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
2490: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
24a0: 74 73 20 3a 3a 62 75 69 6c 64 5f 62 61 73 65 5f  ts ::build_base_
24b0: 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d  directory] && \.
24c0: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
24d0: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 62 75 69  ng length $::bui
24e0: 6c 64 5f 62 61 73 65 5f 64 69 72 65 63 74 6f 72  ld_base_director
24f0: 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  y] > 0} then {..
2500: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2510: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c     # NOTE: The l
2520: 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 62  ocation of the b
2530: 75 69 6c 64 20 62 61 73 65 20 64 69 72 65 63 74  uild base direct
2540: 6f 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65  ory has been ove
2550: 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20  rridden;..      
2560: 20 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66    #       theref
2570: 6f 72 65 2c 20 75 73 65 20 69 74 20 76 65 72 62  ore, use it verb
2580: 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23  atim...        #
2590: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
25a0: 20 24 3a 3a 62 75 69 6c 64 5f 62 61 73 65 5f 64   $::build_base_d
25b0: 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20  irectory..      
25c0: 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20  } elseif {[info 
25d0: 65 78 69 73 74 73 20 3a 3a 63 6f 6d 6d 6f 6e 5f  exists ::common_
25e0: 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d  directory] && \.
25f0: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
2600: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 63 6f 6d  ng length $::com
2610: 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e  mon_directory] >
2620: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
2630: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
2640: 20 4e 4f 54 45 3a 20 4e 65 78 74 2c 20 66 61 6c   NOTE: Next, fal
2650: 6c 62 61 63 6b 20 74 6f 20 74 68 65 20 70 61 72  lback to the par
2660: 65 6e 74 20 64 69 72 65 63 74 6f 72 79 20 6f 66  ent directory of
2670: 20 74 68 65 20 6f 6e 65 20 63 6f 6e 74 61 69 6e   the one contain
2680: 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ing..        #  
2690: 20 20 20 20 20 74 68 69 73 20 66 69 6c 65 20 28       this file (
26a0: 69 2e 65 2e 20 22 63 6f 6d 6d 6f 6e 2e 65 61 67  i.e. "common.eag
26b0: 6c 65 22 29 2c 20 69 66 20 61 76 61 69 6c 61 62  le"), if availab
26c0: 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  le...        #..
26d0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
26e0: 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 3a 3a  file dirname $::
26f0: 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79  common_directory
2700: 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69  ]..      } elsei
2710: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
2720: 3a 3a 70 61 74 68 5d 20 26 26 20 5c 0d 0a 20 20  ::path] && \..  
2730: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
2740: 6c 65 6e 67 74 68 20 24 3a 3a 70 61 74 68 5d 20  length $::path] 
2750: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
2760: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2770: 23 20 4e 4f 54 45 3a 20 46 69 6e 61 6c 6c 79 2c  # NOTE: Finally,
2780: 20 66 61 6c 6c 62 61 63 6b 20 74 6f 20 74 68 65   fallback to the
2790: 20 70 61 72 65 6e 74 20 64 69 72 65 63 74 6f 72   parent director
27a0: 79 20 6f 66 20 74 68 65 20 45 61 67 6c 65 54 65  y of the EagleTe
27b0: 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  st..        #   
27c0: 20 20 20 20 70 61 74 68 2e 20 20 54 68 65 20 45      path.  The E
27d0: 61 67 6c 65 54 65 73 74 20 70 61 63 6b 61 67 65  agleTest package
27e0: 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
27f0: 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 0d 0a   this variable..
2800: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2810: 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 74  will be set to t
2820: 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e  he directory con
2830: 74 61 69 6e 69 6e 67 20 74 68 65 20 66 69 72 73  taining the firs
2840: 74 20 66 69 6c 65 20 74 6f 0d 0a 20 20 20 20 20  t file to..     
2850: 20 20 20 23 20 20 20 20 20 20 20 65 78 65 63 75     #       execu
2860: 74 65 20 74 68 65 20 5b 72 75 6e 54 65 73 74 50  te the [runTestP
2870: 72 6f 6c 6f 67 75 65 5d 20 73 63 72 69 70 74 20  rologue] script 
2880: 6c 69 62 72 61 72 79 20 70 72 6f 63 65 64 75 72  library procedur
2890: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
28a0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66         return [f
28b0: 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 3a 3a 70  ile dirname $::p
28c0: 61 74 68 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  ath]..      } el
28d0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
28e0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
28f0: 20 4e 6f 20 70 61 74 68 20 69 73 20 61 76 61 69   No path is avai
2900: 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 6e  lable, return an
2910: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 20   empty string.  
2920: 54 68 69 73 20 70 6f 69 6e 74 0d 0a 20 20 20 20  This point..    
2930: 20 20 20 20 23 20 20 20 20 20 20 20 73 68 6f 75      #       shou
2940: 6c 64 20 6e 6f 74 20 62 65 20 72 65 61 63 68 65  ld not be reache
2950: 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  d...        #.. 
2960: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22         return ""
2970: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
2980: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73  .....    proc is
2990: 4d 69 78 65 64 4d 6f 64 65 41 73 73 65 6d 62 6c  MixedModeAssembl
29a0: 79 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 76 61  y { fileName {va
29b0: 72 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20  rName ""} } {.. 
29c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
29d0: 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20 6d 61 6b  NOTE: First, mak
29e0: 65 20 73 75 72 65 20 74 68 65 20 74 65 73 74 20  e sure the test 
29f0: 73 75 69 74 65 20 69 6e 66 72 61 73 74 72 75 63  suite infrastruc
2a00: 74 75 72 65 20 69 73 20 61 6c 6c 6f 77 65 64 20  ture is allowed 
2a10: 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  to..      #     
2a20: 20 20 75 73 65 20 74 68 65 20 5b 65 78 65 63 5d    use the [exec]
2a30: 20 63 6f 6d 6d 61 6e 64 2e 0d 0a 20 20 20 20 20   command...     
2a40: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b   #..      if {![
2a50: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
2a60: 28 65 78 65 63 29 5d 20 26 26 20 21 5b 69 6e 66  (exec)] && ![inf
2a70: 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f  o exists ::no(co
2a80: 72 46 6c 61 67 73 29 5d 7d 20 74 68 65 6e 20 7b  rFlags)]} then {
2a90: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2aa0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
2ab0: 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  the location of 
2ac0: 43 6f 72 46 6c 61 67 73 20 69 73 20 70 72 65 73  CorFlags is pres
2ad0: 65 6e 74 20 69 6e 20 74 68 65 20 65 6e 76 69 72  ent in the envir
2ae0: 6f 6e 6d 65 6e 74 2c 0d 0a 20 20 20 20 20 20 20  onment,..       
2af0: 20 23 20 20 20 20 20 20 20 75 73 65 20 69 74 3b   #       use it;
2b00: 20 6f 74 68 65 72 77 69 73 65 20 61 73 73 75 6d   otherwise assum
2b10: 65 20 69 74 20 69 73 20 69 6e 20 74 68 65 20 50  e it is in the P
2b20: 41 54 48 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ATH...        #.
2b30: 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 72  .        set cor
2b40: 46 6c 61 67 73 20 5b 65 78 70 72 20 7b 0d 0a 20  Flags [expr {.. 
2b50: 20 20 20 20 20 20 20 20 20 5b 69 6e 66 6f 20 65           [info e
2b60: 78 69 73 74 73 20 3a 3a 65 6e 76 28 43 6f 72 46  xists ::env(CorF
2b70: 6c 61 67 73 29 5d 20 3f 20 24 3a 3a 65 6e 76 28  lags)] ? $::env(
2b80: 43 6f 72 46 6c 61 67 73 29 20 3a 20 22 43 6f 72  CorFlags) : "Cor
2b90: 46 6c 61 67 73 22 0d 0a 20 20 20 20 20 20 20 20  Flags"..        
2ba0: 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  }]....        #.
2bb0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
2bc0: 20 41 74 74 65 6d 70 74 20 74 6f 20 65 78 65 63   Attempt to exec
2bd0: 75 74 65 20 43 6f 72 46 6c 61 67 73 20 6f 6e 20  ute CorFlags on 
2be0: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
2bf0: 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  le...        #..
2c00: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
2c10: 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
2c20: 65 78 65 63 20 2d 2d 20 24 63 6f 72 46 6c 61 67  exec -- $corFlag
2c30: 73 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  s [file nativena
2c40: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20  me $fileName].. 
2c50: 20 20 20 20 20 20 20 7d 20 65 78 65 63 5d 20 3d         } exec] =
2c60: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
2c70: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2c80: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 72      # NOTE: If r
2c90: 65 71 75 65 73 74 65 64 20 62 79 20 6f 75 72 20  equested by our 
2ca0: 63 61 6c 6c 65 72 2c 20 61 74 74 65 6d 70 74 20  caller, attempt 
2cb0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
2cc0: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
2cd0: 20 20 20 20 70 6c 61 74 66 6f 72 6d 20 66 6f 72      platform for
2ce0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
2cf0: 69 6c 65 20 61 73 20 77 65 6c 6c 2e 0d 0a 20 20  ile as well...  
2d00: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2d10: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
2d20: 20 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d 65   length $varName
2d30: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
2d40: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
2d50: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
2d60: 3a 20 53 74 6f 72 65 20 74 68 65 20 70 6c 61 74  : Store the plat
2d70: 66 6f 72 6d 20 69 6e 20 74 68 65 20 6e 61 6d 65  form in the name
2d80: 64 20 76 61 72 69 61 62 6c 65 20 69 6e 20 74 68  d variable in th
2d90: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  e..            #
2da0: 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 20 6f         context o
2db0: 66 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20  f our caller... 
2dc0: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
2dd0: 20 20 20 20 20 20 20 20 20 20 75 70 76 61 72 20            upvar 
2de0: 31 20 24 76 61 72 4e 61 6d 65 20 70 6c 61 74 66  1 $varName platf
2df0: 6f 72 6d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  orm....         
2e00: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
2e10: 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
2e20: 74 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65  t to extract the
2e30: 20 50 45 20 6c 69 6e 65 20 66 72 6f 6d 20 74 68   PE line from th
2e40: 65 20 63 61 70 74 75 72 65 64 0d 0a 20 20 20 20  e captured..    
2e50: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2e60: 6f 75 74 70 75 74 2e 20 20 49 66 20 74 68 69 73  output.  If this
2e70: 20 76 61 6c 75 65 20 69 73 20 22 50 45 33 32 22   value is "PE32"
2e80: 20 6f 72 20 22 50 45 33 32 2b 22 2c 20 74 68 65   or "PE32+", the
2e90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
2ea0: 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 20 66        assembly f
2eb0: 69 6c 65 20 69 73 20 33 32 2d 62 69 74 20 6f 72  ile is 32-bit or
2ec0: 20 36 34 2d 62 69 74 2c 20 72 65 73 70 65 63 74   64-bit, respect
2ed0: 69 76 65 6c 79 3b 0d 0a 20 20 20 20 20 20 20 20  ively;..        
2ee0: 20 20 20 20 23 20 20 20 20 20 20 20 6f 74 68 65      #       othe
2ef0: 72 77 69 73 65 2c 20 69 74 73 20 74 79 70 65 20  rwise, its type 
2f00: 69 73 20 75 6e 6b 6e 6f 77 6e 2e 0d 0a 20 20 20  is unknown...   
2f10: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
2f20: 20 20 20 20 20 20 20 20 73 65 74 20 70 61 74 74          set patt
2f30: 65 72 6e 20 7b 5e 50 45 20 20 20 20 20 20 20 20  ern {^PE        
2f40: 3a 20 28 50 45 33 32 7c 50 45 33 32 5c 2b 29 5c  : (PE32|PE32\+)\
2f50: 73 2b 24 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  s+$}....        
2f60: 20 20 20 20 69 66 20 7b 5b 72 65 67 65 78 70 20      if {[regexp 
2f70: 2d 6c 69 6e 65 20 2d 2d 20 24 70 61 74 74 65 72  -line -- $patter
2f80: 6e 20 24 65 78 65 63 20 64 75 6d 6d 79 20 70 65  n $exec dummy pe
2f90: 33 32 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  32]} then {..   
2fa0: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
2fb0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 48 41              # HA
2fc0: 43 4b 3a 20 54 68 69 73 20 5b 73 77 69 74 63 68  CK: This [switch
2fd0: 5d 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 33  ] assumes that 3
2fe0: 32 2d 62 69 74 20 65 78 65 63 75 74 61 62 6c 65  2-bit executable
2ff0: 73 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20 20  s are..         
3000: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6c 77       #       alw
3010: 61 79 73 20 78 38 36 20 61 6e 64 20 74 68 61 74  ays x86 and that
3020: 20 36 34 2d 62 69 74 20 65 78 65 63 75 74 61 62   64-bit executab
3030: 6c 65 73 20 61 72 65 20 61 6c 77 61 79 73 0d 0a  les are always..
3040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
3050: 20 20 20 20 20 20 78 36 34 2e 0d 0a 20 20 20 20        x64...    
3060: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
3070: 20 20 20 20 20 20 20 20 20 20 20 73 77 69 74 63             switc
3080: 68 20 2d 65 78 61 63 74 20 2d 2d 20 24 70 65 33  h -exact -- $pe3
3090: 32 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  2 {..           
30a0: 20 20 20 20 20 50 45 33 32 20 7b 0d 0a 20 20 20       PE32 {..   
30b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
30c0: 65 74 20 70 6c 61 74 66 6f 72 6d 20 57 69 6e 33  et platform Win3
30d0: 32 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2..             
30e0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
30f0: 20 20 20 20 20 20 50 45 33 32 2b 20 7b 0d 0a 20        PE32+ {.. 
3100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3110: 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 78 36   set platform x6
3120: 34 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  4..             
3130: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
3140: 20 20 20 20 20 20 64 65 66 61 75 6c 74 20 7b 0d        default {.
3150: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3160: 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20     set platform 
3170: 22 22 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ""..            
3180: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
3190: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
31a0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
31b0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
31c0: 70 6c 61 74 66 6f 72 6d 20 22 22 0d 0a 20 20 20  platform ""..   
31d0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
31e0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
31f0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
3200: 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
3210: 74 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65  t to extract the
3220: 20 49 4c 4f 4e 4c 59 20 6c 69 6e 65 20 66 72 6f   ILONLY line fro
3230: 6d 20 74 68 65 20 63 61 70 74 75 72 65 64 0d 0a  m the captured..
3240: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
3250: 20 20 6f 75 74 70 75 74 2e 20 20 49 66 20 74 68    output.  If th
3260: 69 73 20 76 61 6c 75 65 20 69 73 20 7a 65 72 6f  is value is zero
3270: 2c 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  , the specified 
3280: 66 69 6c 65 20 6d 75 73 74 0d 0a 20 20 20 20 20  file must..     
3290: 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65 20       #       be 
32a0: 61 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73  a mixed-mode ass
32b0: 65 6d 62 6c 79 3b 20 6f 74 68 65 72 77 69 73 65  embly; otherwise
32c0: 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  , it contains on
32d0: 6c 79 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  ly..          # 
32e0: 20 20 20 20 20 20 6d 61 6e 61 67 65 64 20 63 6f        managed co
32f0: 6d 70 6f 6e 65 6e 74 73 2e 0d 0a 20 20 20 20 20  mponents...     
3300: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
3310: 20 20 73 65 74 20 70 61 74 74 65 72 6e 20 7b 5e    set pattern {^
3320: 49 4c 4f 4e 4c 59 20 20 20 20 3a 20 28 30 7c 31  ILONLY    : (0|1
3330: 29 5c 73 2b 24 7d 0d 0a 0d 0a 20 20 20 20 20 20  )\s+$}....      
3340: 20 20 20 20 69 66 20 7b 21 5b 72 65 67 65 78 70      if {![regexp
3350: 20 2d 6c 69 6e 65 20 2d 2d 20 24 70 61 74 74 65   -line -- $patte
3360: 72 6e 20 24 65 78 65 63 20 64 75 6d 6d 79 20 69  rn $exec dummy i
3370: 6c 4f 6e 6c 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  lOnly]} then {..
3380: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
3390: 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20  rn false..      
33a0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
33b0: 20 20 20 69 66 20 7b 21 24 69 6c 4f 6e 6c 79 7d     if {!$ilOnly}
33c0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
33d0: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
33e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
33f0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
3400: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
3410: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74      # NOTE: If t
3420: 68 65 20 74 65 73 74 20 73 75 69 74 65 20 63 61  he test suite ca
3430: 6e 6e 6f 74 20 75 73 65 20 5b 65 78 65 63 5d 20  nnot use [exec] 
3440: 6f 72 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  or execution of 
3450: 43 6f 72 46 6c 61 67 73 0d 0a 20 20 20 20 20 20  CorFlags..      
3460: 23 20 20 20 20 20 20 20 66 61 69 6c 65 64 2c 20  #       failed, 
3470: 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 0d 0a 20  return false... 
3480: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
3490: 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20  turn false..    
34a0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69  }.....    proc i
34b0: 73 42 75 69 6c 64 41 76 61 69 6c 61 62 6c 65 20  sBuildAvailable 
34c0: 7b 20 6e 61 74 69 76 65 20 64 69 72 65 63 74 6f  { native directo
34d0: 72 79 20 7b 76 61 72 4e 61 6d 65 20 22 22 7d 20  ry {varName ""} 
34e0: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
34f0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c      # NOTE: Buil
3500: 64 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c  d the fully qual
3510: 69 66 69 65 64 20 66 69 6c 65 20 6e 61 6d 65 20  ified file name 
3520: 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79 20  for the primary 
3530: 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20  assembly..      
3540: 23 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 69  #       containi
3550: 6e 67 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61  ng the System.Da
3560: 74 61 2e 53 51 4c 69 74 65 20 6d 61 6e 61 67 65  ta.SQLite manage
3570: 64 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e 20 20 49  d components.  I
3580: 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  t..      #      
3590: 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 74 65 64   should be noted
35a0: 20 74 68 61 74 20 74 68 69 73 20 61 73 73 65 6d   that this assem
35b0: 62 6c 79 20 66 69 6c 65 20 6d 61 79 20 61 6c 73  bly file may als
35c0: 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 0d 0a 20  o contain the.. 
35d0: 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 74       #       nat
35e0: 69 76 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 2c 20  ive components, 
35f0: 69 66 20 61 20 6e 61 74 69 76 65 20 62 75 69 6c  if a native buil
3600: 64 20 69 73 20 69 6e 20 75 73 65 2e 0d 0a 20 20  d is in use...  
3610: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
3620: 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20   fileName [file 
3630: 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
3640: 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79   join $directory
3650: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 53 79   \..          Sy
3660: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
3670: 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  .dll]]....      
3680: 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74  if {![file exist
3690: 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  s $fileName]} th
36a0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
36b0: 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20  turn false..    
36c0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
36d0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74        # NOTE: At
36e0: 74 65 6d 70 74 20 74 6f 20 61 75 74 6f 6d 61 74  tempt to automat
36f0: 69 63 61 6c 6c 79 20 64 65 74 65 63 74 20 69 66  ically detect if
3700: 20 74 68 65 20 70 72 69 6d 61 72 79 20 61 73 73   the primary ass
3710: 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 23 20 20  embly..      #  
3720: 20 20 20 20 20 63 6f 6e 74 61 69 6e 73 20 61 6e       contains an
3730: 79 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e 65  y native compone
3740: 6e 74 73 2c 20 69 66 20 6e 65 63 65 73 73 61 72  nts, if necessar
3750: 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  y...      #..   
3760: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
3770: 65 6e 67 74 68 20 24 6e 61 74 69 76 65 5d 20 3d  ength $native] =
3780: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
3790: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
37a0: 20 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d 65   length $varName
37b0: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
37c0: 20 20 20 20 20 20 20 20 20 75 70 76 61 72 20 31           upvar 1
37d0: 20 24 76 61 72 4e 61 6d 65 20 24 76 61 72 4e 61   $varName $varNa
37e0: 6d 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  me..        }...
37f0: 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 61 74  .        set nat
3800: 69 76 65 20 5b 69 73 4d 69 78 65 64 4d 6f 64 65  ive [isMixedMode
3810: 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61  Assembly $fileNa
3820: 6d 65 20 24 76 61 72 4e 61 6d 65 5d 0d 0a 20 20  me $varName]..  
3830: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
3840: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
3850: 49 66 20 74 68 65 20 70 72 69 6d 61 72 79 20 61  If the primary a
3860: 73 73 65 6d 62 6c 79 20 61 6c 73 6f 20 63 6f 6e  ssembly also con
3870: 74 61 69 6e 73 20 74 68 65 20 6e 61 74 69 76 65  tains the native
3880: 20 63 6f 6d 70 6f 6e 65 6e 74 73 2c 0d 0a 20 20   components,..  
3890: 20 20 20 20 23 20 20 20 20 20 20 20 77 65 20 68      #       we h
38a0: 61 76 65 20 65 76 65 72 79 74 68 69 6e 67 20 77  ave everything w
38b0: 65 20 6e 65 65 64 2e 0d 0a 20 20 20 20 20 20 23  e need...      #
38c0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 6e 61 74  ..      if {$nat
38d0: 69 76 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ive} then {..   
38e0: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
38f0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
3900: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
3910: 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 66 75  TE: Build the fu
3920: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 66 69  lly qualified fi
3930: 6c 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  le name for the 
3940: 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79  interop assembly
3950: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
3960: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 53  containing the S
3970: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
3980: 65 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e 65  e native compone
3990: 6e 74 73 2e 20 20 49 66 20 74 68 69 73 0d 0a 20  nts.  If this.. 
39a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 66 69 6c       #       fil
39b0: 65 20 65 78 69 73 74 73 2c 20 77 65 20 73 68 6f  e exists, we sho
39c0: 75 6c 64 20 68 61 76 65 20 65 76 65 72 79 74 68  uld have everyth
39d0: 69 6e 67 20 77 65 20 6e 65 65 64 2e 0d 0a 20 20  ing we need...  
39e0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
39f0: 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20   fileName [file 
3a00: 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
3a10: 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79   join $directory
3a20: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 53 51   \..          SQ
3a30: 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c  Lite.Interop.dll
3a40: 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  ]]....      if {
3a50: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69  [file exists $fi
3a60: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
3a70: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
3a80: 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  true..      }...
3a90: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
3aa0: 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68  # NOTE: Build th
3ab0: 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  e fully qualifie
3ac0: 64 20 66 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20  d file name for 
3ad0: 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 0d  the SQLite core.
3ae0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6c  .      #       l
3af0: 69 62 72 61 72 79 2e 20 20 49 66 20 74 68 69 73  ibrary.  If this
3b00: 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 77 65   file exists, we
3b10: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 65 76 65   should have eve
3b20: 72 79 74 68 69 6e 67 20 77 65 0d 0a 20 20 20 20  rything we..    
3b30: 20 20 23 20 20 20 20 20 20 20 6e 65 65 64 2e 0d    #       need..
3b40: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
3b50: 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69  set fileName [fi
3b60: 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
3b70: 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74  ile join $direct
3b80: 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ory \..         
3b90: 20 73 71 6c 69 74 65 33 2e 64 6c 6c 5d 5d 0d 0a   sqlite3.dll]]..
3ba0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c  ..      if {[fil
3bb0: 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61  e exists $fileNa
3bc0: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
3bd0: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
3be0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
3bf0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
3c00: 54 45 3a 20 4f 6e 65 20 6f 72 20 6d 6f 72 65 20  TE: One or more 
3c10: 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e 65 6e 74  native component
3c20: 73 20 6e 65 65 64 65 64 20 62 79 20 53 79 73 74  s needed by Syst
3c30: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 0d 0a  em.Data.SQLite..
3c40: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 72        #       ar
3c50: 65 20 6d 69 73 73 69 6e 67 2e 0d 0a 20 20 20 20  e missing...    
3c60: 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72    #..      retur
3c70: 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a  n false..    }..
3c80: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73 52 65  ...    proc isRe
3c90: 6c 65 61 73 65 41 76 61 69 6c 61 62 6c 65 20 7b  leaseAvailable {
3ca0: 20 64 69 72 65 63 74 6f 72 79 20 7b 76 61 72 4e   directory {varN
3cb0: 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20  ame ""} } {..   
3cc0: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
3cd0: 65 6e 67 74 68 20 24 76 61 72 4e 61 6d 65 5d 20  ength $varName] 
3ce0: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
3cf0: 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61       upvar 1 $va
3d00: 72 4e 61 6d 65 20 24 76 61 72 4e 61 6d 65 0d 0a  rName $varName..
3d10: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
3d20: 20 72 65 74 75 72 6e 20 5b 69 73 42 75 69 6c 64   return [isBuild
3d30: 41 76 61 69 6c 61 62 6c 65 20 22 22 20 24 64 69  Available "" $di
3d40: 72 65 63 74 6f 72 79 20 24 76 61 72 4e 61 6d 65  rectory $varName
3d50: 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  ]..    }.....   
3d60: 20 70 72 6f 63 20 6a 6f 69 6e 42 75 69 6c 64 44   proc joinBuildD
3d70: 69 72 65 63 74 6f 72 79 20 7b 20 6e 61 74 69 76  irectory { nativ
3d80: 65 20 70 61 74 68 20 79 65 61 72 20 70 6c 61 74  e path year plat
3d90: 66 6f 72 6d 20 63 6f 6e 66 69 67 75 72 61 74 69  form configurati
3da0: 6f 6e 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  on } {..      #.
3db0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46  .      # NOTE: F
3dc0: 69 67 75 72 65 20 6f 75 74 20 61 6e 64 20 74 68  igure out and th
3dd0: 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 66 75  en return the fu
3de0: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 70 61  lly qualified pa
3df0: 74 68 20 74 6f 20 74 68 65 20 62 75 69 6c 64 0d  th to the build.
3e00: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64  .      #       d
3e10: 69 72 65 63 74 6f 72 79 20 62 61 73 65 64 20 6f  irectory based o
3e20: 6e 20 61 6c 6c 20 74 68 65 20 61 72 67 75 6d 65  n all the argume
3e30: 6e 74 73 20 70 72 6f 76 69 64 65 64 20 62 79 20  nts provided by 
3e40: 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20  our caller...   
3e50: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
3e60: 24 6e 61 74 69 76 65 7d 20 74 68 65 6e 20 7b 0d  $native} then {.
3e70: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
3e80: 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 70 61 74 68  [file join $path
3e90: 20 62 69 6e 20 24 79 65 61 72 20 24 70 6c 61 74   bin $year $plat
3ea0: 66 6f 72 6d 20 24 63 6f 6e 66 69 67 75 72 61 74  form $configurat
3eb0: 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  ion]..      } el
3ec0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  se {..        re
3ed0: 74 75 72 6e 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  turn [file join 
3ee0: 24 70 61 74 68 20 62 69 6e 20 24 79 65 61 72 20  $path bin $year 
3ef0: 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 62  $configuration b
3f00: 69 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  in]..      }..  
3f10: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
3f20: 20 67 65 74 42 75 69 6c 64 44 69 72 65 63 74 6f   getBuildDirecto
3f30: 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ry {} {..      #
3f40: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
3f50: 53 65 65 20 69 66 20 74 68 65 20 22 6e 61 74 69  See if the "nati
3f60: 76 65 22 20 72 75 6e 74 69 6d 65 20 6f 70 74 69  ve" runtime opti
3f70: 6f 6e 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  on has been set.
3f80: 20 20 49 66 20 73 6f 2c 20 75 73 65 20 74 68 65    If so, use the
3f90: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
3fa0: 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20 74 68  directory for th
3fb0: 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73  e mixed-mode ass
3fc0: 65 6d 62 6c 79 20 28 61 2e 6b 2e 61 2e 20 74 68  embly (a.k.a. th
3fd0: 65 20 6e 61 74 69 76 65 20 69 6e 74 65 72 6f 70  e native interop
3fe0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
3ff0: 61 73 73 65 6d 62 6c 79 29 2e 20 20 54 6f 20 65  assembly).  To e
4000: 6e 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6f  nable this optio
4010: 6e 20 76 69 61 20 74 68 65 20 63 6f 6d 6d 61 6e  n via the comman
4020: 64 20 6c 69 6e 65 2c 20 65 6e 74 65 72 20 61 0d  d line, enter a.
4030: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
4040: 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c 61 72 20 74  ommand similar t
4050: 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c  o one of the fol
4060: 6c 6f 77 69 6e 67 20 28 61 6c 6c 20 6f 6e 20 6f  lowing (all on o
4070: 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20 20 20  ne line):..     
4080: 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20   #..      #     
4090: 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65    EagleShell.exe
40a0: 20 2d 69 6e 69 74 69 61 6c 69 7a 65 20 2d 72 75   -initialize -ru
40b0: 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69  ntimeOption nati
40c0: 76 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ve..      #     
40d0: 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68      -file .\path
40e0: 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20  \to\all.eagle.. 
40f0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
4100: 20 20 20 20 20 20 54 6f 20 65 6e 61 62 6c 65 20        To enable 
4110: 74 68 69 73 20 6f 70 74 69 6f 6e 20 76 69 61 20  this option via 
4120: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
4130: 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 22 62   prior to the "b
4140: 65 74 61 20 31 36 22 0d 0a 20 20 20 20 20 20 23  eta 16"..      #
4150: 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 20 6f         release o
4160: 66 20 45 61 67 6c 65 2c 20 74 68 65 20 66 6f 6c  f Eagle, the fol
4170: 6c 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e 64 20 6d  lowing command m
4180: 75 73 74 20 62 65 20 75 73 65 64 20 69 6e 73 74  ust be used inst
4190: 65 61 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ead..      #    
41a0: 20 20 20 28 61 6c 73 6f 20 61 6c 6c 20 6f 6e 20     (also all on 
41b0: 6f 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20 20  one line):..    
41c0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20    #..      #    
41d0: 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78     EagleShell.ex
41e0: 65 20 2d 69 6e 69 74 69 61 6c 69 7a 65 20 2d 70  e -initialize -p
41f0: 6f 73 74 49 6e 69 74 69 61 6c 69 7a 65 0d 0a 20  ostInitialize.. 
4200: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 22       #         "
4210: 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49 6e  object invoke In
4220: 74 65 72 70 72 65 74 65 72 2e 47 65 74 41 63 74  terpreter.GetAct
4230: 69 76 65 20 41 64 64 52 75 6e 74 69 6d 65 4f 70  ive AddRuntimeOp
4240: 74 69 6f 6e 20 6e 61 74 69 76 65 22 0d 0a 20 20  tion native"..  
4250: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 2d 66      #         -f
4260: 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c  ile .\path\to\al
4270: 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23  l.eagle..      #
4280: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
4290: 6f 20 65 78 69 73 74 73 20 3a 3a 62 75 69 6c 64  o exists ::build
42a0: 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c  _directory] && \
42b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
42c0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 62 75  ing length $::bu
42d0: 69 6c 64 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e  ild_directory] >
42e0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
42f0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
4300: 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74   NOTE: The locat
4310: 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 64  ion of the build
4320: 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
4330: 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d  een overridden;.
4340: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
4350: 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   therefore, use 
4360: 69 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20  it verbatim...  
4370: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
4380: 20 72 65 74 75 72 6e 20 24 3a 3a 62 75 69 6c 64   return $::build
4390: 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20  _directory..    
43a0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
43b0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
43c0: 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 22 6e   NOTE: If the "n
43d0: 61 74 69 76 65 22 20 72 75 6e 74 69 6d 65 20 6f  ative" runtime o
43e0: 70 74 69 6f 6e 20 69 73 20 73 65 74 2c 20 74 68  ption is set, th
43f0: 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73  e mixed-mode ass
4400: 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 20 20 23  embly..        #
4410: 20 20 20 20 20 20 20 69 73 20 62 65 69 6e 67 20         is being 
4420: 74 65 73 74 65 64 2e 20 20 49 6e 20 74 68 61 74  tested.  In that
4430: 20 63 61 73 65 2c 20 74 68 65 20 70 61 74 68 20   case, the path 
4440: 74 6f 20 74 68 65 20 62 75 69 6c 64 20 64 69 72  to the build dir
4450: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 20 20  ectory..        
4460: 23 20 20 20 20 20 20 20 77 69 6c 6c 20 63 6f 6e  #       will con
4470: 74 61 69 6e 20 74 68 65 20 70 6c 61 74 66 6f 72  tain the platfor
4480: 6d 20 6e 61 6d 65 20 61 6e 64 20 61 6c 6c 20 74  m name and all t
4490: 68 65 20 62 69 6e 61 72 69 65 73 20 75 6e 64 65  he binaries unde
44a0: 72 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20  r test..        
44b0: 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62  #       should b
44c0: 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 61  e present in tha
44d0: 74 20 64 69 72 65 63 74 6f 72 79 2e 20 20 49 66  t directory.  If
44e0: 20 74 68 65 20 22 6e 61 74 69 76 65 22 20 72 75   the "native" ru
44f0: 6e 74 69 6d 65 0d 0a 20 20 20 20 20 20 20 20 23  ntime..        #
4500: 20 20 20 20 20 20 20 6f 70 74 69 6f 6e 20 69 73         option is
4510: 20 6e 6f 74 20 73 65 74 2c 20 74 68 65 20 62 75   not set, the bu
4520: 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20 77 69  ild directory wi
4530: 6c 6c 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64  ll be considered
4540: 20 74 6f 20 62 65 0d 0a 20 20 20 20 20 20 20 20   to be..        
4550: 23 20 20 20 20 20 20 20 22 70 6c 61 74 66 6f 72  #       "platfor
4560: 6d 2d 6e 65 75 74 72 61 6c 22 2c 20 77 69 74 68  m-neutral", with
4570: 20 74 68 65 20 6e 6f 74 61 62 6c 65 20 65 78 63   the notable exc
4580: 65 70 74 69 6f 6e 20 6f 66 20 61 6e 79 20 6e 61  eption of any na
4590: 74 69 76 65 0d 0a 20 20 20 20 20 20 20 20 23 20  tive..        # 
45a0: 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 20 28        assembly (
45b0: 65 2e 67 2e 20 22 53 51 4c 69 74 65 2e 49 6e 74  e.g. "SQLite.Int
45c0: 65 72 6f 70 2e 64 6c 6c 22 29 20 63 6f 70 69 65  erop.dll") copie
45d0: 64 20 74 68 65 72 65 20 64 75 72 69 6e 67 20 74  d there during t
45e0: 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  he..        #   
45f0: 20 20 20 20 62 75 69 6c 64 20 70 72 6f 63 65 73      build proces
4600: 73 20 69 74 73 65 6c 66 2e 20 20 49 66 20 74 68  s itself.  If th
4610: 65 20 62 75 69 6c 64 20 70 72 6f 63 65 73 73 20  e build process 
4620: 73 6f 6d 65 68 6f 77 20 64 6f 65 73 20 6e 6f 74  somehow does not
4630: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
4640: 20 20 63 6f 70 79 20 74 68 65 20 6e 61 74 69 76    copy the nativ
4650: 65 20 61 73 73 65 6d 62 6c 79 20 66 6f 72 20 74  e assembly for t
4660: 68 69 73 20 70 6c 61 74 66 6f 72 6d 2c 20 6d 6f  his platform, mo
4670: 73 74 20 6f 66 20 74 68 65 20 74 65 73 74 73 0d  st of the tests.
4680: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
4690: 20 69 6e 20 74 68 65 20 73 75 69 74 65 20 77 69   in the suite wi
46a0: 6c 6c 20 73 69 6d 70 6c 79 20 62 65 20 73 6b 69  ll simply be ski
46b0: 70 70 65 64 2e 20 20 47 65 6e 65 72 61 6c 6c 79  pped.  Generally
46c0: 20 73 70 65 61 6b 69 6e 67 2c 20 74 68 65 72 65   speaking, there
46d0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
46e0: 20 20 61 72 65 20 74 77 6f 20 77 61 79 73 20 74    are two ways t
46f0: 6f 20 62 75 69 6c 64 20 74 68 65 20 62 69 6e 61  o build the bina
4700: 72 69 65 73 20 77 68 65 6e 20 70 72 65 70 61 72  ries when prepar
4710: 69 6e 67 20 74 6f 20 72 75 6e 20 74 68 65 0d 0a  ing to run the..
4720: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
4730: 74 65 73 74 20 73 75 69 74 65 3a 0d 0a 20 20 20  test suite:..   
4740: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4750: 23 20 20 20 20 20 20 20 31 2e 20 42 75 69 6c 64  #       1. Build
4760: 20 74 68 65 20 73 65 70 61 72 61 74 65 20 6d 61   the separate ma
4770: 6e 61 67 65 64 20 61 6e 64 20 6e 61 74 69 76 65  naged and native
4780: 20 61 73 73 65 6d 62 6c 69 65 73 20 75 73 69 6e   assemblies usin
4790: 67 20 73 6f 6d 65 0d 0a 20 20 20 20 20 20 20 20  g some..        
47a0: 23 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 61  #          comma
47b0: 6e 64 73 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0d  nds similar to:.
47c0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
47d0: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 62      #          b
47e0: 75 69 6c 64 2e 62 61 74 20 24 7b 43 6f 6e 66 69  uild.bat ${Confi
47f0: 67 75 72 61 74 69 6f 6e 7d 4d 61 6e 61 67 65 64  guration}Managed
4800: 4f 6e 6c 79 20 24 7b 50 6c 61 74 66 6f 72 6d 7d  Only ${Platform}
4810: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
4820: 20 20 20 20 20 62 75 69 6c 64 2e 62 61 74 20 24       build.bat $
4830: 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 4e  {Configuration}N
4840: 61 74 69 76 65 4f 6e 6c 79 20 24 7b 50 6c 61 74  ativeOnly ${Plat
4850: 66 6f 72 6d 7d 0d 0a 20 20 20 20 20 20 20 20 23  form}..        #
4860: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
4870: 20 20 20 20 20 57 68 65 72 65 20 24 7b 43 6f 6e       Where ${Con
4880: 66 69 67 75 72 61 74 69 6f 6e 7d 20 69 73 20 65  figuration} is e
4890: 69 74 68 65 72 20 22 44 65 62 75 67 22 20 6f 72  ither "Debug" or
48a0: 20 22 52 65 6c 65 61 73 65 22 20 61 6e 64 0d 0a   "Release" and..
48b0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
48c0: 20 20 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 20 69     ${Platform} i
48d0: 73 20 65 69 74 68 65 72 20 22 57 69 6e 33 32 22  s either "Win32"
48e0: 20 6f 72 20 22 78 36 34 22 2e 0d 0a 20 20 20 20   or "x64"...    
48f0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
4900: 20 20 20 20 20 20 20 32 2e 20 42 75 69 6c 64 20         2. Build 
4910: 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61  the mixed-mode a
4920: 73 73 65 6d 62 6c 79 20 75 73 69 6e 67 20 61 20  ssembly using a 
4930: 63 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c 61 72 20  command similar 
4940: 74 6f 3a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  to:..        #..
4950: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
4960: 20 20 20 62 75 69 6c 64 2e 62 61 74 20 24 7b 43     build.bat ${C
4970: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 20 24 7b  onfiguration} ${
4980: 50 6c 61 74 66 6f 72 6d 7d 0d 0a 20 20 20 20 20  Platform}..     
4990: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
49a0: 20 20 20 20 20 20 20 20 20 57 68 65 72 65 20 24           Where $
49b0: 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 20  {Configuration} 
49c0: 69 73 20 65 69 74 68 65 72 20 22 44 65 62 75 67  is either "Debug
49d0: 22 20 6f 72 20 22 52 65 6c 65 61 73 65 22 20 61  " or "Release" a
49e0: 6e 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  nd..        #   
49f0: 20 20 20 20 20 20 20 24 7b 50 6c 61 74 66 6f 72         ${Platfor
4a00: 6d 7d 20 69 73 20 65 69 74 68 65 72 20 22 57 69  m} is either "Wi
4a10: 6e 33 32 22 20 6f 72 20 22 78 36 34 22 2e 20 20  n32" or "x64".  
4a20: 49 66 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  If this command 
4a30: 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  is..        #   
4a40: 20 20 20 20 20 20 20 75 73 65 64 2c 20 76 61 72         used, var
4a50: 69 6f 75 73 20 74 65 73 74 73 20 74 68 61 74 20  ious tests that 
4a60: 72 65 71 75 69 72 65 20 73 75 70 70 6c 65 6d 65  require suppleme
4a70: 6e 74 61 72 79 20 6d 61 6e 61 67 65 64 0d 0a 20  ntary managed.. 
4a80: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
4a90: 20 20 61 73 73 65 6d 62 6c 69 65 73 20 28 65 2e    assemblies (e.
4aa0: 67 2e 20 4c 49 4e 51 29 20 6d 61 79 20 62 65 20  g. LINQ) may be 
4ab0: 73 6b 69 70 70 65 64 20 75 6e 6c 65 73 73 20 74  skipped unless t
4ac0: 68 6f 73 65 20 62 69 6e 61 72 69 65 73 0d 0a 20  hose binaries.. 
4ad0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
4ae0: 20 20 61 72 65 20 73 75 62 73 65 71 75 65 6e 74    are subsequent
4af0: 6c 79 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74  ly copied into t
4b00: 68 65 20 63 6f 72 72 65 63 74 20 64 69 72 65 63  he correct direc
4b10: 74 6f 72 79 20 28 69 2e 65 2e 20 62 79 0d 0a 20  tory (i.e. by.. 
4b20: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
4b30: 20 20 22 74 65 73 74 5f 61 6c 6c 2e 62 61 74 22    "test_all.bat"
4b40: 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  )...        #.. 
4b50: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 4e         #       N
4b60: 6f 74 65 20 74 68 61 74 20 61 6c 6c 20 6f 66 20  ote that all of 
4b70: 74 68 65 20 62 75 69 6c 64 20 63 6f 6d 6d 61 6e  the build comman
4b80: 64 73 20 61 62 6f 76 65 20 77 69 6c 6c 20 64 65  ds above will de
4b90: 66 61 75 6c 74 20 74 6f 20 75 73 69 6e 67 0d 0a  fault to using..
4ba0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
4bb0: 74 68 65 20 6c 61 74 65 73 74 20 76 65 72 73 69  the latest versi
4bc0: 6f 6e 20 6f 66 20 4d 53 42 75 69 6c 64 20 61 76  on of MSBuild av
4bd0: 61 69 6c 61 62 6c 65 20 61 6e 64 20 74 68 65 20  ailable and the 
4be0: 22 74 65 73 74 5f 79 65 61 72 22 20 6d 61 79 0d  "test_year" may.
4bf0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
4c00: 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64 6a 75   need to be adju
4c10: 73 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79  sted accordingly
4c20: 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 72 75 6e   to actually run
4c30: 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e   the test suite.
4c40: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
4c50: 20 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 63    Refer to the c
4c60: 6f 6d 6d 65 6e 74 73 20 69 6e 20 5b 67 65 74 42  omments in [getB
4c70: 75 69 6c 64 59 65 61 72 5d 20 66 6f 72 20 6d 6f  uildYear] for mo
4c80: 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  re information o
4c90: 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  n..        #    
4ca0: 20 20 20 68 6f 77 20 74 6f 20 73 65 74 20 74 68     how to set th
4cb0: 69 73 20 76 61 72 69 61 62 6c 65 2e 0d 0a 20 20  is variable...  
4cc0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
4cd0: 20 73 65 74 20 6e 61 74 69 76 65 20 5b 68 61 73   set native [has
4ce0: 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61  RuntimeOption na
4cf0: 74 69 76 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  tive]....       
4d00: 20 72 65 74 75 72 6e 20 5b 6a 6f 69 6e 42 75 69   return [joinBui
4d10: 6c 64 44 69 72 65 63 74 6f 72 79 20 24 6e 61 74  ldDirectory $nat
4d20: 69 76 65 20 5b 67 65 74 42 75 69 6c 64 42 61 73  ive [getBuildBas
4d30: 65 44 69 72 65 63 74 6f 72 79 5d 20 5c 0d 0a 20  eDirectory] \.. 
4d40: 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42             [getB
4d50: 75 69 6c 64 59 65 61 72 5d 20 5b 67 65 74 42 75  uildYear] [getBu
4d60: 69 6c 64 50 6c 61 74 66 6f 72 6d 20 24 6e 61 74  ildPlatform $nat
4d70: 69 76 65 5d 20 5b 67 65 74 42 75 69 6c 64 43 6f  ive] [getBuildCo
4d80: 6e 66 69 67 75 72 61 74 69 6f 6e 5d 5d 0d 0a 20  nfiguration]].. 
4d90: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
4da0: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 52 65  ..    proc getRe
4db0: 6c 65 61 73 65 56 65 72 73 69 6f 6e 20 7b 7d 20  leaseVersion {} 
4dc0: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
4dd0: 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65    # NOTE: Figure
4de0: 20 6f 75 74 20 74 68 65 20 72 65 6c 65 61 73 65   out the release
4df0: 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 75 73 65   version for use
4e00: 20 77 69 74 68 20 74 68 65 20 62 75 69 6c 64 20   with the build 
4e10: 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20  directory..     
4e20: 20 23 20 20 20 20 20 20 20 77 68 65 6e 20 63 68   #       when ch
4e30: 65 63 6b 69 6e 67 20 66 6f 72 20 61 76 61 69 6c  ecking for avail
4e40: 61 62 6c 65 20 72 65 6c 65 61 73 65 73 2e 0d 0a  able releases...
4e50: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
4e60: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
4e70: 3a 3a 72 65 6c 65 61 73 65 5f 76 65 72 73 69 6f  ::release_versio
4e80: 6e 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  n] && \..       
4e90: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
4ea0: 68 20 24 3a 3a 72 65 6c 65 61 73 65 5f 76 65 72  h $::release_ver
4eb0: 73 69 6f 6e 5d 20 3e 20 30 7d 20 74 68 65 6e 20  sion] > 0} then 
4ec0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
4ed0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
4ee0: 65 20 72 65 6c 65 61 73 65 20 76 65 72 73 69 6f  e release versio
4ef0: 6e 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  n has been overr
4f00: 69 64 64 65 6e 3b 20 74 68 65 72 65 66 6f 72 65  idden; therefore
4f10: 2c 20 75 73 65 20 69 74 0d 0a 20 20 20 20 20 20  , use it..      
4f20: 20 20 23 20 20 20 20 20 20 20 76 65 72 62 61 74    #       verbat
4f30: 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  im...        #..
4f40: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
4f50: 3a 3a 72 65 6c 65 61 73 65 5f 76 65 72 73 69 6f  ::release_versio
4f60: 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  n..      } else 
4f70: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
4f80: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f        # NOTE: No
4f90: 20 72 65 6c 65 61 73 65 20 76 65 72 73 69 6f 6e   release version
4fa0: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72   is available, r
4fb0: 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73  eturn an empty s
4fc0: 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20  tring...        
4fd0: 23 20 20 20 20 20 20 20 49 74 20 69 73 20 69 6d  #       It is im
4fe0: 70 6f 72 74 61 6e 74 20 74 6f 20 72 65 74 75 72  portant to retur
4ff0: 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  n an empty strin
5000: 67 20 68 65 72 65 20 62 65 63 61 75 73 65 20 74  g here because t
5010: 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  he..        #   
5020: 20 20 20 20 72 65 73 75 6c 74 20 6f 66 20 74 68      result of th
5030: 69 73 20 70 72 6f 63 65 64 75 72 65 20 6d 61 79  is procedure may
5040: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 5b 66   be used with [f
5050: 69 6c 65 20 6a 6f 69 6e 5d 2e 0d 0a 20 20 20 20  ile join]...    
5060: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
5070: 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 20 20  eturn ""..      
5080: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
5090: 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 46 69   proc getBuildFi
50a0: 6c 65 4e 61 6d 65 20 7b 20 66 69 6c 65 4e 61 6d  leName { fileNam
50b0: 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20  e {platform ""} 
50c0: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
50d0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75      # NOTE: Retu
50e0: 72 6e 73 20 74 68 65 20 73 70 65 63 69 66 69 65  rns the specifie
50f0: 64 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 69  d file name as i
5100: 66 20 69 74 20 77 65 72 65 20 6c 6f 63 61 74 65  f it were locate
5110: 64 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20  d in the..      
5120: 23 20 20 20 20 20 20 20 62 75 69 6c 64 20 64 69  #       build di
5130: 72 65 63 74 6f 72 79 2c 20 64 69 73 63 61 72 64  rectory, discard
5140: 69 6e 67 20 61 6e 79 20 64 69 72 65 63 74 6f 72  ing any director
5150: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 72  y information pr
5160: 65 73 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20  esent..      #  
5170: 20 20 20 20 20 69 6e 20 74 68 65 20 66 69 6c 65       in the file
5180: 20 6e 61 6d 65 20 61 73 20 70 72 6f 76 69 64 65   name as provide
5190: 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e  d by our caller.
51a0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
51b0: 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61   return [file na
51c0: 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20  tivename \..    
51d0: 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e        [file join
51e0: 20 5b 67 65 74 42 75 69 6c 64 44 69 72 65 63 74   [getBuildDirect
51f0: 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d 20 5b  ory] $platform [
5200: 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e  file tail $fileN
5210: 61 6d 65 5d 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c  ame]]]..    }...
5220: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 45 78  ..    proc getEx
5230: 74 65 72 6e 61 6c 44 69 72 65 63 74 6f 72 79 20  ternalDirectory 
5240: 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
5250: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69       # NOTE: Thi
5260: 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75  s procedure retu
5270: 72 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f 72  rns the director
5280: 79 20 77 68 65 72 65 20 74 68 65 20 65 78 74 65  y where the exte
5290: 72 6e 61 6c 20 62 69 6e 61 72 79 0d 0a 20 20 20  rnal binary..   
52a0: 20 20 20 23 20 20 20 20 20 20 20 66 69 6c 65 73     #       files
52b0: 20 61 72 65 20 6c 6f 63 61 74 65 64 2e 0d 0a 20   are located... 
52c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
52d0: 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76  turn [file nativ
52e0: 65 6e 61 6d 65 20 5b 66 69 6c 65 20 64 69 72 6e  ename [file dirn
52f0: 61 6d 65 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  ame [file dirnam
5300: 65 20 5b 69 6e 66 6f 20 62 69 6e 61 72 79 5d 5d  e [info binary]]
5310: 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  ]]..    }.....  
5320: 20 20 70 72 6f 63 20 67 65 74 42 69 6e 61 72 79    proc getBinary
5330: 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a  Directory {} {..
5340: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
5350: 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63   NOTE: This proc
5360: 65 64 75 72 65 20 72 65 74 75 72 6e 73 20 74 68  edure returns th
5370: 65 20 64 69 72 65 63 74 6f 72 79 20 77 68 65 72  e directory wher
5380: 65 20 74 68 65 20 74 65 73 74 20 61 70 70 6c 69  e the test appli
5390: 63 61 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20  cation..      # 
53a0: 20 20 20 20 20 20 69 74 73 65 6c 66 20 28 69 2e        itself (i.
53b0: 65 2e 20 74 68 65 20 45 61 67 6c 65 20 73 68 65  e. the Eagle she
53c0: 6c 6c 29 20 69 73 20 6c 6f 63 61 74 65 64 2e 20  ll) is located. 
53d0: 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20 75 73   This will be us
53e0: 65 64 20 61 73 0d 0a 20 20 20 20 20 20 23 20 20  ed as..      #  
53f0: 20 20 20 20 20 74 68 65 20 64 65 73 74 69 6e 61       the destina
5400: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 63 6f 70  tion for the cop
5410: 69 65 64 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  ied System.Data.
5420: 53 51 4c 69 74 65 20 6e 61 74 69 76 65 20 61 6e  SQLite native an
5430: 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
5440: 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c   managed assembl
5450: 69 65 73 20 28 69 2e 65 2e 20 62 65 63 61 75 73  ies (i.e. becaus
5460: 65 20 74 68 69 73 20 69 73 20 6f 6e 65 20 6f 66  e this is one of
5470: 20 74 68 65 20 66 65 77 20 70 6c 61 63 65 73 0d   the few places.
5480: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77  .      #       w
5490: 68 65 72 65 20 74 68 65 20 43 4c 52 20 77 69 6c  here the CLR wil
54a0: 6c 20 61 63 74 75 61 6c 6c 79 20 66 69 6e 64 20  l actually find 
54b0: 61 6e 64 20 6c 6f 61 64 20 74 68 65 6d 20 70 72  and load them pr
54c0: 6f 70 65 72 6c 79 29 2e 0d 0a 20 20 20 20 20 20  operly)...      
54d0: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
54e0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 62 69 6e 61  fo exists ::bina
54f0: 72 79 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26  ry_directory] &&
5500: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
5510: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
5520: 62 69 6e 61 72 79 5f 64 69 72 65 63 74 6f 72 79  binary_directory
5530: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
5540: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
5550: 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f    # NOTE: The lo
5560: 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 69  cation of the bi
5570: 6e 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 68  nary directory h
5580: 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64  as been overridd
5590: 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20  en;..        #  
55a0: 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20       therefore, 
55b0: 75 73 65 20 69 74 20 76 65 72 62 61 74 69 6d 2e  use it verbatim.
55c0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
55d0: 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 62       return $::b
55e0: 69 6e 61 72 79 5f 64 69 72 65 63 74 6f 72 79 0d  inary_directory.
55f0: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
5600: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
5610: 5b 69 6e 66 6f 20 62 69 6e 61 72 79 5d 0d 0a 20  [info binary].. 
5620: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
5630: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 45 78  ..    proc getEx
5640: 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 20 7b  ternalFileName {
5650: 20 66 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d 0a 20   fileName } {.. 
5660: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
5670: 4e 4f 54 45 3a 20 52 65 74 75 72 6e 73 20 74 68  NOTE: Returns th
5680: 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
5690: 20 6e 61 6d 65 20 61 73 20 69 66 20 69 74 20 77   name as if it w
56a0: 65 72 65 20 6c 6f 63 61 74 65 64 20 69 6e 20 74  ere located in t
56b0: 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
56c0: 20 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74    directory cont
56d0: 61 69 6e 69 6e 67 20 74 68 65 20 65 78 74 65 72  aining the exter
56e0: 6e 61 6c 20 62 69 6e 61 72 69 65 73 2e 0d 0a 20  nal binaries... 
56f0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
5700: 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76  turn [file nativ
5710: 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
5720: 20 5b 67 65 74 45 78 74 65 72 6e 61 6c 44 69 72   [getExternalDir
5730: 65 63 74 6f 72 79 5d 20 24 66 69 6c 65 4e 61 6d  ectory] $fileNam
5740: 65 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  e]]..    }..... 
5750: 20 20 20 70 72 6f 63 20 67 65 74 42 69 6e 61 72     proc getBinar
5760: 79 46 69 6c 65 4e 61 6d 65 20 7b 20 66 69 6c 65  yFileName { file
5770: 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22  Name {platform "
5780: 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  "} } {..      #.
5790: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
57a0: 65 74 75 72 6e 73 20 74 68 65 20 73 70 65 63 69  eturns the speci
57b0: 66 69 65 64 20 66 69 6c 65 20 6e 61 6d 65 20 61  fied file name a
57c0: 73 20 69 66 20 69 74 20 77 65 72 65 20 6c 6f 63  s if it were loc
57d0: 61 74 65 64 20 69 6e 20 74 68 65 0d 0a 20 20 20  ated in the..   
57e0: 20 20 20 23 20 20 20 20 20 20 20 62 69 6e 61 72     #       binar
57f0: 79 20 64 69 72 65 63 74 6f 72 79 2c 20 64 69 73  y directory, dis
5800: 63 61 72 64 69 6e 67 20 61 6e 79 20 64 69 72 65  carding any dire
5810: 63 74 6f 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f  ctory informatio
5820: 6e 20 70 72 65 73 65 6e 74 0d 0a 20 20 20 20 20  n present..     
5830: 20 23 20 20 20 20 20 20 20 69 6e 20 74 68 65 20   #       in the 
5840: 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 70 72 6f  file name as pro
5850: 76 69 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c  vided by our cal
5860: 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ler...      #.. 
5870: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c       return [fil
5880: 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a  e nativename \..
5890: 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
58a0: 6a 6f 69 6e 20 5b 67 65 74 42 69 6e 61 72 79 44  join [getBinaryD
58b0: 69 72 65 63 74 6f 72 79 5d 20 24 70 6c 61 74 66  irectory] $platf
58c0: 6f 72 6d 20 5b 66 69 6c 65 20 74 61 69 6c 20 24  orm [file tail $
58d0: 66 69 6c 65 4e 61 6d 65 5d 5d 5d 0d 0a 20 20 20  fileName]]]..   
58e0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
58f0: 67 65 74 43 6f 72 65 42 69 6e 61 72 79 46 69 6c  getCoreBinaryFil
5900: 65 4e 61 6d 65 20 7b 20 7b 70 6c 61 74 66 6f 72  eName { {platfor
5910: 6d 20 22 22 7d 20 7b 73 74 61 6e 64 61 72 64 20  m ""} {standard 
5920: 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20  false} } {..    
5930: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
5940: 45 3a 20 52 65 74 75 72 6e 73 20 74 68 65 20 66  E: Returns the f
5950: 75 6c 6c 20 70 61 74 68 20 66 6f 72 20 74 68 65  ull path for the
5960: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67   file containing
5970: 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65   the SQLite core
5980: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
5990: 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79 20 63  native library c
59a0: 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70 6c 61  ode for this pla
59b0: 74 66 6f 72 6d 2e 20 20 46 69 72 73 74 2c 20 63  tform.  First, c
59c0: 68 65 63 6b 20 61 6e 64 20 73 65 65 20 69 66 0d  heck and see if.
59d0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
59e0: 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6e  he SQLite core n
59f0: 61 74 69 76 65 20 6c 69 62 72 61 72 79 20 68 61  ative library ha
5a00: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6c  s already been l
5a10: 6f 61 64 65 64 2e 20 20 4e 65 78 74 2c 0d 0a 20  oaded.  Next,.. 
5a20: 20 20 20 20 20 23 20 20 20 20 20 20 20 66 61 6c       #       fal
5a30: 6c 62 61 63 6b 20 74 6f 20 77 68 61 74 20 74 68  lback to what th
5a40: 65 20 66 75 6c 6c 20 70 61 74 68 20 73 68 6f 75  e full path shou
5a50: 6c 64 20 62 65 2c 20 62 61 73 65 64 20 6f 6e 20  ld be, based on 
5a60: 77 68 65 74 68 65 72 20 74 68 65 0d 0a 20 20 20  whether the..   
5a70: 20 20 20 23 20 20 20 20 20 20 20 6d 69 78 65 64     #       mixed
5a80: 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20 69  -mode assembly i
5a90: 73 20 62 65 69 6e 67 20 75 73 65 64 20 61 6e 64  s being used and
5aa0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
5ab0: 20 63 75 72 72 65 6e 74 0d 0a 20 20 20 20 20 20   current..      
5ac0: 23 20 20 20 20 20 20 20 70 6c 61 74 66 6f 72 6d  #       platform
5ad0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
5ae0: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62    if {[catch {ob
5af0: 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
5b00: 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
5b10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  .              S
5b20: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
5b30: 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  e.UnsafeNativeMe
5b40: 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20  thods \..       
5b50: 20 20 20 20 20 20 20 5f 53 51 4c 69 74 65 4e 61         _SQLiteNa
5b60: 74 69 76 65 4d 6f 64 75 6c 65 46 69 6c 65 4e 61  tiveModuleFileNa
5b70: 6d 65 7d 20 66 69 6c 65 4e 61 6d 65 5d 20 3d 3d  me} fileName] ==
5b80: 20 30 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20   0 && \..       
5b90: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
5ba0: 68 20 24 66 69 6c 65 4e 61 6d 65 5d 20 3e 20 30  h $fileName] > 0
5bb0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
5bc0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
5bd0: 4f 54 45 3a 20 54 68 65 20 53 51 4c 69 74 65 20  OTE: The SQLite 
5be0: 63 6f 72 65 20 6e 61 74 69 76 65 20 6c 69 62 72  core native libr
5bf0: 61 72 79 20 68 61 73 20 61 6c 72 65 61 64 79 20  ary has already 
5c00: 62 65 65 6e 20 6c 6f 61 64 65 64 20 76 69 61 0d  been loaded via.
5c10: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
5c20: 20 74 68 65 20 6e 61 74 69 76 65 20 6c 69 62 72   the native libr
5c30: 61 72 79 20 70 72 65 2d 6c 6f 61 64 65 72 2e 20  ary pre-loader. 
5c40: 20 52 65 74 75 72 6e 20 74 68 61 74 20 66 69 6c   Return that fil
5c50: 65 20 6e 61 6d 65 20 6e 6f 77 2e 0d 0a 20 20 20  e name now...   
5c60: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
5c70: 72 65 74 75 72 6e 20 24 66 69 6c 65 4e 61 6d 65  return $fileName
5c80: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
5c90: 20 20 20 69 66 20 7b 5b 68 61 73 52 75 6e 74 69     if {[hasRunti
5ca0: 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65 5d  meOption native]
5cb0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
5cc0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
5cd0: 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65 20  OTE: Return the 
5ce0: 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d  mixed-mode assem
5cf0: 62 6c 79 20 66 69 6c 65 20 6e 61 6d 65 2e 0d 0a  bly file name...
5d00: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
5d10: 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20     return [file 
5d20: 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20  nativename \..  
5d30: 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
5d40: 6a 6f 69 6e 20 5b 67 65 74 42 69 6e 61 72 79 44  join [getBinaryD
5d50: 69 72 65 63 74 6f 72 79 5d 20 24 70 6c 61 74 66  irectory] $platf
5d60: 6f 72 6d 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  orm System.Data.
5d70: 53 51 4c 69 74 65 2e 64 6c 6c 5d 5d 0d 0a 20 20  SQLite.dll]]..  
5d80: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 73      } elseif {$s
5d90: 74 61 6e 64 61 72 64 7d 20 74 68 65 6e 20 7b 0d  tandard} then {.
5da0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
5db0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75      # NOTE: Retu
5dc0: 72 6e 20 74 68 65 20 6e 61 74 69 76 65 2d 6f 6e  rn the native-on
5dd0: 6c 79 20 73 74 61 6e 64 61 72 64 20 53 51 4c 69  ly standard SQLi
5de0: 74 65 20 6c 69 62 72 61 72 79 20 66 69 6c 65 20  te library file 
5df0: 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  name...        #
5e00: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
5e10: 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
5e20: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
5e30: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74   [file join [get
5e40: 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d  BinaryDirectory]
5e50: 20 24 70 6c 61 74 66 6f 72 6d 20 73 71 6c 69 74   $platform sqlit
5e60: 65 33 2e 64 6c 6c 5d 5d 0d 0a 20 20 20 20 20 20  e3.dll]]..      
5e70: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
5e80: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
5e90: 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65 20  OTE: Return the 
5ea0: 6e 61 74 69 76 65 2d 6f 6e 6c 79 20 69 6e 74 65  native-only inte
5eb0: 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 66 69 6c  rop assembly fil
5ec0: 65 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20  e name...       
5ed0: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
5ee0: 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  rn [file nativen
5ef0: 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
5f00: 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67     [file join [g
5f10: 65 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72  etBinaryDirector
5f20: 79 5d 20 24 70 6c 61 74 66 6f 72 6d 20 53 51 4c  y] $platform SQL
5f30: 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 5d  ite.Interop.dll]
5f40: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
5f50: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
5f60: 65 74 43 6f 6d 6d 6f 6e 44 69 72 65 63 74 6f 72  etCommonDirector
5f70: 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  y {} {..      #.
5f80: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
5f90: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65  his procedure re
5fa0: 74 75 72 6e 73 20 74 68 65 20 64 69 72 65 63 74  turns the direct
5fb0: 6f 72 79 20 77 68 65 72 65 20 74 68 65 20 74 65  ory where the te
5fc0: 73 74 20 73 63 72 69 70 74 73 0d 0a 20 20 20 20  st scripts..    
5fd0: 20 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64    #       should
5fe0: 20 62 65 20 6c 6f 63 61 74 65 64 2e 20 20 42 79   be located.  By
5ff0: 20 64 65 66 61 75 6c 74 2c 20 74 68 69 73 20 6a   default, this j
6000: 75 73 74 20 72 65 74 75 72 6e 73 20 74 68 65 20  ust returns the 
6010: 45 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 20 20  Eagle..      #  
6020: 20 20 20 20 20 62 69 6e 61 72 79 20 64 69 72 65       binary dire
6030: 63 74 6f 72 79 2e 0d 0a 20 20 20 20 20 20 23 0d  ctory...      #.
6040: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
6050: 20 65 78 69 73 74 73 20 3a 3a 63 6f 6d 6d 6f 6e   exists ::common
6060: 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c  _directory] && \
6070: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
6080: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 63 6f  ing length $::co
6090: 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20  mmon_directory] 
60a0: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
60b0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
60c0: 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61  # NOTE: The loca
60d0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6d 6d  tion of the comm
60e0: 6f 6e 20 64 69 72 65 63 74 6f 72 79 20 68 61 73  on directory has
60f0: 20 62 65 65 6e 20 73 65 74 3b 0d 0a 20 20 20 20   been set;..    
6100: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 72      #       ther
6110: 65 66 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a  efore, use it...
6120: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
6130: 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 63 6f 6d     return $::com
6140: 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20  mon_directory.. 
6150: 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b       } elseif {[
6160: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 76 65  info exists ::ve
6170: 6e 64 6f 72 5f 64 69 72 65 63 74 6f 72 79 5d 20  ndor_directory] 
6180: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
6190: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
61a0: 3a 3a 76 65 6e 64 6f 72 5f 64 69 72 65 63 74 6f  ::vendor_directo
61b0: 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ry] > 0} then {.
61c0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
61d0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
61e0: 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  location of the 
61f0: 76 65 6e 64 6f 72 20 64 69 72 65 63 74 6f 72 79  vendor directory
6200: 20 68 61 73 20 62 65 65 6e 20 73 65 74 3b 0d 0a   has been set;..
6210: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6220: 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  therefore, use i
6230: 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
6240: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
6250: 3a 76 65 6e 64 6f 72 5f 64 69 72 65 63 74 6f 72  :vendor_director
6260: 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69  y..      } elsei
6270: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
6280: 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79 5d 20 26  ::tcl_library] &
6290: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
62a0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
62b0: 3a 74 63 6c 5f 6c 69 62 72 61 72 79 5d 20 3e 20  :tcl_library] > 
62c0: 30 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  0 && \..        
62d0: 20 20 5b 66 69 6c 65 20 69 73 64 69 72 65 63 74    [file isdirect
62e0: 6f 72 79 20 24 3a 3a 74 63 6c 5f 6c 69 62 72 61  ory $::tcl_libra
62f0: 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ry]} then {..   
6300: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
6310: 23 20 4e 4f 54 45 3a 20 54 68 65 20 76 61 72 69  # NOTE: The vari
6320: 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  able with the lo
6330: 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 63  cation of the sc
6340: 72 69 70 74 20 6c 69 62 72 61 72 79 20 69 73 0d  ript library is.
6350: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
6360: 20 73 65 74 20 61 6e 64 20 61 70 70 65 61 72 73   set and appears
6370: 20 74 6f 20 62 65 20 61 20 72 65 61 6c 20 64 69   to be a real di
6380: 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 20 6e 6f  rectory (i.e. no
6390: 74 20 65 6d 62 65 64 64 65 64 0d 0a 20 20 20 20  t embedded..    
63a0: 20 20 20 20 23 20 20 20 20 20 20 20 77 69 74 68      #       with
63b0: 69 6e 20 61 20 66 69 6c 65 29 3b 20 74 68 65 72  in a file); ther
63c0: 65 66 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a  efore, use it...
63d0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
63e0: 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 63 6c     return $::tcl
63f0: 5f 6c 69 62 72 61 72 79 0d 0a 20 20 20 20 20 20  _library..      
6400: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
6410: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
6420: 4f 54 45 3a 20 46 61 6c 6c 62 61 63 6b 20 74 6f  OTE: Fallback to
6430: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 63   the directory c
6440: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65 78  ontaining the ex
6450: 65 63 75 74 61 62 6c 65 2e 0d 0a 20 20 20 20 20  ecutable...     
6460: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
6470: 74 75 72 6e 20 5b 69 6e 66 6f 20 62 69 6e 61 72  turn [info binar
6480: 79 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  y]..      }..   
6490: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
64a0: 67 65 74 44 61 74 61 62 61 73 65 44 69 72 65 63  getDatabaseDirec
64b0: 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  tory {} {..     
64c0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
64d0: 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  : This procedure
64e0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 64 69 72   returns the dir
64f0: 65 63 74 6f 72 79 20 77 68 65 72 65 20 74 68 65  ectory where the
6500: 20 74 65 73 74 20 64 61 74 61 62 61 73 65 73 0d   test databases.
6510: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
6520: 68 6f 75 6c 64 20 62 65 20 6c 6f 63 61 74 65 64  hould be located
6530: 2e 20 20 42 79 20 64 65 66 61 75 6c 74 2c 20 74  .  By default, t
6540: 68 69 73 20 6a 75 73 74 20 75 73 65 73 20 74 68  his just uses th
6550: 65 20 74 65 6d 70 6f 72 61 72 79 0d 0a 20 20 20  e temporary..   
6560: 20 20 20 23 20 20 20 20 20 20 20 64 69 72 65 63     #       direc
6570: 74 6f 72 79 20 63 6f 6e 66 69 67 75 72 65 64 20  tory configured 
6580: 66 6f 72 20 74 68 69 73 20 73 79 73 74 65 6d 2e  for this system.
6590: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
65a0: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
65b0: 73 20 3a 3a 64 61 74 61 62 61 73 65 5f 64 69 72  s ::database_dir
65c0: 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20  ectory] && \..  
65d0: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
65e0: 6c 65 6e 67 74 68 20 24 3a 3a 64 61 74 61 62 61  length $::databa
65f0: 73 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20  se_directory] > 
6600: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
6610: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
6620: 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69  NOTE: The locati
6630: 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  on of the databa
6640: 73 65 20 64 69 72 65 63 74 6f 72 79 20 68 61 73  se directory has
6650: 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e   been overridden
6660: 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ;..        #    
6670: 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73     therefore, us
6680: 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  e it...        #
6690: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
66a0: 20 24 3a 3a 64 61 74 61 62 61 73 65 5f 64 69 72   $::database_dir
66b0: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20  ectory..      } 
66c0: 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78  elseif {[info ex
66d0: 69 73 74 73 20 3a 3a 73 63 72 61 74 63 68 5f 64  ists ::scratch_d
66e0: 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a  irectory] && \..
66f0: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
6700: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 73 63 72 61  g length $::scra
6710: 74 63 68 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e  tch_directory] >
6720: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
6730: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
6740: 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74   NOTE: The locat
6750: 69 6f 6e 20 6f 66 20 74 68 65 20 73 63 72 61 74  ion of the scrat
6760: 63 68 20 64 69 72 65 63 74 6f 72 79 20 68 61 73  ch directory has
6770: 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e   been overridden
6780: 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ;..        #    
6790: 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73     therefore, us
67a0: 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  e it...        #
67b0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
67c0: 20 24 3a 3a 73 63 72 61 74 63 68 5f 64 69 72 65   $::scratch_dire
67d0: 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65  ctory..      } e
67e0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  lse {..        r
67f0: 65 74 75 72 6e 20 5b 67 65 74 54 65 6d 70 6f 72  eturn [getTempor
6800: 61 72 79 50 61 74 68 5d 0d 0a 20 20 20 20 20 20  aryPath]..      
6810: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
6820: 20 70 72 6f 63 20 67 65 74 54 65 6d 70 6f 72 61   proc getTempora
6830: 72 79 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b  ryDirectory {} {
6840: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
6850: 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72   # NOTE: This pr
6860: 6f 63 65 64 75 72 65 20 72 65 74 75 72 6e 73 20  ocedure returns 
6870: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 77 68  the directory wh
6880: 65 72 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72  ere the temporar
6890: 79 20 66 69 6c 65 73 0d 0a 20 20 20 20 20 20 23  y files..      #
68a0: 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65         should be
68b0: 20 6c 6f 63 61 74 65 64 2e 20 20 42 79 20 64 65   located.  By de
68c0: 66 61 75 6c 74 2c 20 74 68 69 73 20 6a 75 73 74  fault, this just
68d0: 20 75 73 65 73 20 74 68 65 20 74 65 6d 70 6f 72   uses the tempor
68e0: 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ary..      #    
68f0: 20 20 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e     directory con
6900: 66 69 67 75 72 65 64 20 66 6f 72 20 74 68 69 73  figured for this
6910: 20 73 79 73 74 65 6d 2e 0d 0a 20 20 20 20 20 20   system...      
6920: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
6930: 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 6d 70  fo exists ::temp
6940: 6f 72 61 72 79 5f 64 69 72 65 63 74 6f 72 79 5d  orary_directory]
6950: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
6960: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
6970: 24 3a 3a 74 65 6d 70 6f 72 61 72 79 5f 64 69 72  $::temporary_dir
6980: 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65  ectory] > 0} the
6990: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
69a0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
69b0: 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  The location of 
69c0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69  the temporary di
69d0: 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e  rectory has been
69e0: 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20   overridden;..  
69f0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
6a00: 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 2e  erefore, use it.
6a10: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
6a20: 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74       return $::t
6a30: 65 6d 70 6f 72 61 72 79 5f 64 69 72 65 63 74 6f  emporary_directo
6a40: 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ry..      } else
6a50: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
6a60: 20 3a 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63   ::scratch_direc
6a70: 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20  tory] && \..    
6a80: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
6a90: 6e 67 74 68 20 24 3a 3a 73 63 72 61 74 63 68 5f  ngth $::scratch_
6aa0: 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20  directory] > 0} 
6ab0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
6ac0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
6ad0: 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  E: The location 
6ae0: 6f 66 20 74 68 65 20 73 63 72 61 74 63 68 20 64  of the scratch d
6af0: 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
6b00: 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20  n overridden;.. 
6b10: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
6b20: 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
6b30: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
6b40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
6b50: 73 63 72 61 74 63 68 5f 64 69 72 65 63 74 6f 72  scratch_director
6b60: 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  y..      } else 
6b70: 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
6b80: 6e 20 5b 67 65 74 54 65 6d 70 6f 72 61 72 79 50  n [getTemporaryP
6b90: 61 74 68 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  ath]..      }.. 
6ba0: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
6bb0: 63 20 67 65 74 54 65 73 74 4f 76 65 72 72 69 64  c getTestOverrid
6bc0: 65 73 50 72 65 61 6d 62 6c 65 20 7b 20 7b 65 78  esPreamble { {ex
6bd0: 74 72 61 56 61 72 4e 61 6d 65 73 20 22 22 7d 20  traVarNames ""} 
6be0: 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 76  } {..      set v
6bf0: 61 72 4e 61 6d 65 73 20 5b 6c 69 73 74 5d 0d 0a  arNames [list]..
6c00: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
6c10: 20 23 20 4e 4f 54 45 3a 20 49 66 20 61 76 61 69   # NOTE: If avai
6c20: 6c 61 62 6c 65 2c 20 73 74 61 72 74 20 77 69 74  lable, start wit
6c30: 68 20 74 68 65 20 6d 61 73 74 65 72 20 6c 69 73  h the master lis
6c40: 74 20 6f 66 20 74 65 73 74 20 6f 76 65 72 72 69  t of test overri
6c50: 64 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  de..      #     
6c60: 20 20 76 61 72 69 61 62 6c 65 73 2e 0d 0a 20 20    variables...  
6c70: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
6c80: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
6c90: 74 65 73 74 5f 6f 76 65 72 72 69 64 65 73 5d 20  test_overrides] 
6ca0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
6cb0: 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74  [llength $::test
6cc0: 5f 6f 76 65 72 72 69 64 65 73 5d 20 3e 20 30 7d  _overrides] > 0}
6cd0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
6ce0: 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 76 61   eval lappend va
6cf0: 72 4e 61 6d 65 73 20 24 3a 3a 74 65 73 74 5f 6f  rNames $::test_o
6d00: 76 65 72 72 69 64 65 73 0d 0a 20 20 20 20 20 20  verrides..      
6d10: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
6d20: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 72      # NOTE: If r
6d30: 65 71 75 65 73 74 65 64 20 62 79 20 6f 75 72 20  equested by our 
6d40: 63 61 6c 6c 65 72 2c 20 61 64 64 20 61 6e 79 20  caller, add any 
6d50: 61 64 64 69 74 69 6f 6e 61 6c 20 76 61 72 69 61  additional varia
6d60: 62 6c 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ble..      #    
6d70: 20 20 20 6e 61 6d 65 73 20 74 6f 20 63 6f 70 79     names to copy
6d80: 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a   now...      #..
6d90: 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67        if {[lleng
6da0: 74 68 20 24 65 78 74 72 61 56 61 72 4e 61 6d 65  th $extraVarName
6db0: 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  s] > 0} then {..
6dc0: 20 20 20 20 20 20 20 20 65 76 61 6c 20 6c 61 70          eval lap
6dd0: 70 65 6e 64 20 76 61 72 4e 61 6d 65 73 20 24 65  pend varNames $e
6de0: 78 74 72 61 56 61 72 4e 61 6d 65 73 0d 0a 20 20  xtraVarNames..  
6df0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
6e00: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
6e10: 42 75 69 6c 64 20 74 68 65 20 73 63 72 69 70 74  Build the script
6e20: 20 66 72 61 67 6d 65 6e 74 20 74 6f 20 62 65 20   fragment to be 
6e30: 72 65 74 75 72 6e 65 64 20 62 79 20 70 72 6f 63  returned by proc
6e40: 65 73 73 69 6e 67 20 65 61 63 68 0d 0a 20 20 20  essing each..   
6e50: 20 20 20 23 20 20 20 20 20 20 20 76 61 72 69 61     #       varia
6e60: 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 61 64 64  ble name and add
6e70: 69 6e 67 20 74 68 65 20 6e 65 63 65 63 65 73 73  ing the nececess
6e80: 61 72 79 20 73 63 72 69 70 74 20 66 72 61 67 6d  ary script fragm
6e90: 65 6e 74 73 20 66 6f 72 0d 0a 20 20 20 20 20 20  ents for..      
6ea0: 23 20 20 20 20 20 20 20 65 61 63 68 20 6f 6e 65  #       each one
6eb0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
6ec0: 20 20 73 65 74 20 72 65 73 75 6c 74 20 22 22 0d    set result "".
6ed0: 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68  ...      foreach
6ee0: 20 76 61 72 4e 61 6d 65 20 24 76 61 72 4e 61 6d   varName $varNam
6ef0: 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  es {..        #.
6f00: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
6f10: 20 42 75 69 6c 64 20 74 68 65 20 71 75 61 6c 69   Build the quali
6f20: 66 69 65 64 20 67 6c 6f 62 61 6c 20 76 61 72 69  fied global vari
6f30: 61 62 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20 20 20  able name...    
6f40: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
6f50: 65 74 20 66 75 6c 6c 56 61 72 4e 61 6d 65 20 5b  et fullVarName [
6f60: 61 70 70 65 6e 64 41 72 67 73 20 3a 3a 20 24 76  appendArgs :: $v
6f70: 61 72 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20  arName]....     
6f80: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
6f90: 4e 4f 54 45 3a 20 44 6f 65 73 20 74 68 65 20 76  NOTE: Does the v
6fa0: 61 72 69 61 62 6c 65 20 65 78 69 73 74 20 69 6e  ariable exist in
6fb0: 20 74 68 69 73 20 69 6e 74 65 72 70 72 65 74 65   this interprete
6fc0: 72 20 63 6f 6e 74 65 78 74 3f 0d 0a 20 20 20 20  r context?..    
6fd0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
6fe0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
6ff0: 24 66 75 6c 6c 56 61 72 4e 61 6d 65 5d 7d 20 74  $fullVarName]} t
7000: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
7010: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
7020: 4e 4f 54 45 3a 20 41 70 70 65 6e 64 20 61 20 73  NOTE: Append a s
7030: 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20 74  cript fragment t
7040: 6f 20 74 68 65 20 72 65 73 75 6c 74 20 74 68 61  o the result tha
7050: 74 20 77 69 6c 6c 20 63 6f 72 72 65 63 74 6c 79  t will correctly
7060: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
7070: 20 20 20 20 63 6f 70 79 20 61 6e 79 20 63 6f 6e      copy any con
7080: 74 61 69 6e 65 64 20 76 61 6c 75 65 20 74 6f 20  tained value to 
7090: 61 6e 6f 74 68 65 72 20 69 6e 74 65 72 70 72 65  another interpre
70a0: 74 65 72 20 63 6f 6e 74 65 78 74 2e 0d 0a 20 20  ter context...  
70b0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
70c0: 20 20 20 20 20 61 70 70 65 6e 64 20 72 65 73 75       append resu
70d0: 6c 74 20 5c 6e 20 22 73 65 74 20 22 20 24 66 75  lt \n "set " $fu
70e0: 6c 6c 56 61 72 4e 61 6d 65 20 22 20 5c 7b 22 20  llVarName " \{" 
70f0: 5b 73 65 74 20 24 66 75 6c 6c 56 61 72 4e 61 6d  [set $fullVarNam
7100: 65 5d 20 5c 7d 0d 0a 20 20 20 20 20 20 20 20 7d  e] \}..        }
7110: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
7120: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
7130: 54 45 3a 20 49 66 20 74 68 65 20 72 65 73 75 6c  TE: If the resul
7140: 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f  t contains one o
7150: 72 20 6d 6f 72 65 20 73 63 72 69 70 74 20 66 72  r more script fr
7160: 61 67 6d 65 6e 74 73 2c 20 61 70 70 65 6e 64 20  agments, append 
7170: 61 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  a..      #      
7180: 20 6e 65 77 6c 69 6e 65 2e 0d 0a 20 20 20 20 20   newline...     
7190: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   #..      if {[s
71a0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 72 65  tring length $re
71b0: 73 75 6c 74 5d 20 3e 20 30 7d 20 74 68 65 6e 20  sult] > 0} then 
71c0: 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  {..        appen
71d0: 64 20 72 65 73 75 6c 74 20 5c 6e 0d 0a 20 20 20  d result \n..   
71e0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
71f0: 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20  turn $result..  
7200: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
7210: 20 67 65 74 41 70 70 44 6f 6d 61 69 6e 50 72 65   getAppDomainPre
7220: 61 6d 62 6c 65 20 7b 20 7b 70 72 65 66 69 78 20  amble { {prefix 
7230: 22 22 7d 20 7b 73 75 66 66 69 78 20 22 22 7d 20  ""} {suffix ""} 
7240: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
7250: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73      # NOTE: This
7260: 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72   procedure retur
7270: 6e 73 20 61 20 74 65 73 74 20 73 65 74 75 70 20  ns a test setup 
7280: 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20  script fragment 
7290: 73 75 69 74 61 62 6c 65 20 66 6f 72 0d 0a 20 20  suitable for..  
72a0: 20 20 20 20 23 20 20 20 20 20 20 20 65 76 61 6c      #       eval
72b0: 75 61 74 69 6f 6e 20 62 79 20 61 6e 20 69 6e 74  uation by an int
72c0: 65 72 70 72 65 74 65 72 20 63 72 65 61 74 65 64  erpreter created
72d0: 20 69 6e 20 61 6e 20 69 73 6f 6c 61 74 65 64 20   in an isolated 
72e0: 61 70 70 6c 69 63 61 74 69 6f 6e 0d 0a 20 20 20  application..   
72f0: 20 20 20 23 20 20 20 20 20 20 20 64 6f 6d 61 69     #       domai
7300: 6e 2e 20 20 54 68 65 20 73 63 72 69 70 74 20 66  n.  The script f
7310: 72 61 67 6d 65 6e 74 20 62 65 69 6e 67 20 72 65  ragment being re
7320: 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 73  turned will be s
7330: 75 72 72 6f 75 6e 64 65 64 20 62 79 0d 0a 20 20  urrounded by..  
7340: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
7350: 70 72 65 66 69 78 20 61 6e 64 20 73 75 66 66 69  prefix and suffi
7360: 78 20 22 73 63 72 69 70 74 20 66 72 61 67 6d 65  x "script fragme
7370: 6e 74 73 22 20 73 70 65 63 69 66 69 65 64 20 62  nts" specified b
7380: 79 20 6f 75 72 20 63 61 6c 6c 65 72 2c 0d 0a 20  y our caller,.. 
7390: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 66 20       #       if 
73a0: 61 6e 79 2e 20 20 54 68 65 20 65 6e 74 69 72 65  any.  The entire
73b0: 20 73 63 72 69 70 74 20 62 65 69 6e 67 20 72 65   script being re
73c0: 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 73  turned will be s
73d0: 75 62 73 74 69 74 75 74 65 64 20 76 69 61 0d 0a  ubstituted via..
73e0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 5b 73        #       [s
73f0: 75 62 73 74 5d 2c 20 69 6e 20 74 68 65 20 63 6f  ubst], in the co
7400: 6e 74 65 78 74 20 6f 66 20 6f 75 72 20 63 61 6c  ntext of our cal
7410: 6c 65 72 2c 20 62 65 66 6f 72 65 20 62 65 69 6e  ler, before bein
7420: 67 20 72 65 74 75 72 6e 65 64 2e 0d 0a 20 20 20  g returned...   
7430: 20 20 20 23 20 20 20 20 20 20 20 54 68 69 73 20     #       This 
7440: 73 74 65 70 20 69 73 20 6e 65 63 65 73 73 61 72  step is necessar
7450: 79 20 73 6f 20 74 68 61 74 20 73 6f 6d 65 20 6c  y so that some l
7460: 69 6d 69 74 65 64 20 63 6f 6e 74 65 78 74 20 69  imited context i
7470: 6e 66 6f 72 6d 61 74 69 6f 6e 2c 0d 0a 20 20 20  nformation,..   
7480: 20 20 20 23 20 20 20 20 20 20 20 70 72 69 6d 61     #       prima
7490: 72 69 6c 79 20 72 65 6c 61 74 65 64 20 74 6f 20  rily related to 
74a0: 74 68 65 20 74 65 73 74 69 6e 67 20 64 69 72 65  the testing dire
74b0: 63 74 6f 72 69 65 73 2c 20 63 61 6e 20 62 65 20  ctories, can be 
74c0: 74 72 61 6e 73 66 65 72 72 65 64 0d 0a 20 20 20  transferred..   
74d0: 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 74 68     #       to th
74e0: 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 69 6e  e interpreter in
74f0: 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20 61 70   the isolated ap
7500: 70 6c 69 63 61 74 69 6f 6e 20 64 6f 6d 61 69 6e  plication domain
7510: 2c 20 6d 61 6b 69 6e 67 20 69 74 0d 0a 20 20 20  , making it..   
7520: 20 20 20 23 20 20 20 20 20 20 20 61 62 6c 65 20     #       able 
7530: 74 6f 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  to successfully 
7540: 72 75 6e 20 74 65 73 74 73 20 74 68 61 74 20 72  run tests that r
7550: 65 71 75 69 72 65 20 6f 6e 65 20 6f 72 20 6d 6f  equire one or mo
7560: 72 65 20 6f 66 20 74 68 65 0d 0a 20 20 20 20 20  re of the..     
7570: 20 23 20 20 20 20 20 20 20 66 69 6c 65 73 20 69   #       files i
7580: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 65 73  n one of the tes
7590: 74 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65 73  ting directories
75a0: 2e 20 20 43 61 6c 6c 65 72 73 20 73 68 6f 75 6c  .  Callers shoul
75b0: 64 20 6b 65 65 70 20 69 6e 0d 0a 20 20 20 20 20  d keep in..     
75c0: 20 23 20 20 20 20 20 20 20 6d 69 6e 64 20 74 68   #       mind th
75d0: 61 74 20 74 68 65 20 74 65 73 74 20 73 63 72 69  at the test scri
75e0: 70 74 20 66 72 61 67 6d 65 6e 74 20 62 65 69 6e  pt fragment bein
75f0: 67 20 72 65 74 75 72 6e 65 64 20 63 61 6e 6e 6f  g returned canno
7600: 74 20 72 65 6c 79 20 6f 6e 0d 0a 20 20 20 20 20  t rely on..     
7610: 20 23 20 20 20 20 20 20 20 61 6e 79 20 73 63 72   #       any scr
7620: 69 70 74 20 6c 69 62 72 61 72 79 20 70 72 6f 63  ipt library proc
7630: 65 64 75 72 65 73 20 74 68 61 74 20 61 72 65 20  edures that are 
7640: 6e 6f 74 20 70 72 6f 76 69 64 65 64 20 62 79 20  not provided by 
7650: 74 68 65 20 45 61 67 6c 65 0d 0a 20 20 20 20 20  the Eagle..     
7660: 20 23 20 20 20 20 20 20 20 6c 69 62 72 61 72 79   #       library
7670: 20 70 61 63 6b 61 67 65 20 28 69 2e 65 2e 20 22   package (i.e. "
7680: 69 6e 69 74 2e 65 61 67 6c 65 22 29 2c 20 69 6e  init.eagle"), in
7690: 63 6c 75 64 69 6e 67 20 74 68 6f 73 65 20 70 72  cluding those pr
76a0: 6f 76 69 64 65 64 20 62 79 0d 0a 20 20 20 20 20  ovided by..     
76b0: 20 23 20 20 20 20 20 20 20 74 68 65 20 45 61 67   #       the Eag
76c0: 6c 65 20 74 65 73 74 20 70 61 63 6b 61 67 65 2c  le test package,
76d0: 20 75 6e 6c 65 73 73 20 74 68 65 20 66 69 6c 65   unless the file
76e0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 6d   containing them
76f0: 20 69 73 20 6c 6f 61 64 65 64 0d 0a 20 20 20 20   is loaded..    
7700: 20 20 23 20 20 20 20 20 20 20 6d 61 6e 75 61 6c    #       manual
7710: 6c 79 20 76 69 61 20 73 6f 6d 65 20 6f 74 68 65  ly via some othe
7720: 72 20 6d 65 63 68 61 6e 69 73 6d 20 28 65 2e 67  r mechanism (e.g
7730: 2e 20 62 79 20 69 6e 63 6c 75 64 69 6e 67 20 61  . by including a
7740: 70 70 72 6f 70 72 69 61 74 65 0d 0a 20 20 20 20  ppropriate..    
7750: 20 20 23 20 20 20 20 20 20 20 5b 70 61 63 6b 61    #       [packa
7760: 67 65 20 72 65 71 75 69 72 65 5d 20 6f 72 20 5b  ge require] or [
7770: 73 6f 75 72 63 65 5d 20 63 6f 6d 6d 61 6e 64 73  source] commands
7780: 20 69 6e 20 74 68 65 20 70 72 65 66 69 78 20 6f   in the prefix o
7790: 72 20 73 75 66 66 69 78 0d 0a 20 20 20 20 20 20  r suffix..      
77a0: 23 20 20 20 20 20 20 20 73 63 72 69 70 74 20 66  #       script f
77b0: 72 61 67 6d 65 6e 74 73 29 2e 20 20 41 6c 73 6f  ragments).  Also
77c0: 2c 20 61 6c 6c 20 76 61 72 69 61 62 6c 65 20 72  , all variable r
77d0: 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 61 6c  eferences and al
77e0: 6c 20 6e 65 73 74 65 64 0d 0a 20 20 20 20 20 20  l nested..      
77f0: 23 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64 73  #       commands
7800: 20 28 69 2e 65 2e 20 74 68 6f 73 65 20 69 6e 20   (i.e. those in 
7810: 73 71 75 61 72 65 20 62 72 61 63 6b 65 74 73 29  square brackets)
7820: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
7830: 65 20 66 69 6e 61 6c 0d 0a 20 20 20 20 20 20 23  e final..      #
7840: 20 20 20 20 20 20 20 73 63 72 69 70 74 20 66 72         script fr
7850: 61 67 6d 65 6e 74 20 77 69 6c 6c 20 65 6e 64 20  agment will end 
7860: 75 70 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74  up being evaluat
7870: 65 64 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78  ed in the contex
7880: 74 20 6f 66 20 74 68 65 0d 0a 20 20 20 20 20 20  t of the..      
7890: 23 20 20 20 20 20 20 20 63 61 6c 6c 69 6e 67 20  #       calling 
78a0: 69 6e 74 65 72 70 72 65 74 65 72 20 61 6e 64 20  interpreter and 
78b0: 6e 6f 74 20 74 68 65 20 74 61 72 67 65 74 20 69  not the target i
78c0: 6e 74 65 72 70 72 65 74 65 72 20 63 72 65 61 74  nterpreter creat
78d0: 65 64 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20  ed in the..     
78e0: 20 23 20 20 20 20 20 20 20 69 73 6f 6c 61 74 65   #       isolate
78f0: 64 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 6f  d application do
7900: 6d 61 69 6e 20 75 6e 6c 65 73 73 20 74 68 65 20  main unless the 
7910: 64 6f 6c 6c 61 72 20 73 69 67 6e 73 20 61 6e 64  dollar signs and
7920: 2f 6f 72 20 73 71 75 61 72 65 0d 0a 20 20 20 20  /or square..    
7930: 20 20 23 20 20 20 20 20 20 20 62 72 61 63 6b 65    #       bracke
7940: 74 73 20 61 72 65 20 73 70 65 63 69 61 6c 6c 79  ts are specially
7950: 20 71 75 6f 74 65 64 20 77 69 74 68 20 62 61 63   quoted with bac
7960: 6b 73 6c 61 73 68 65 73 2e 0d 0a 20 20 20 20 20  kslashes...     
7970: 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   #..      return
7980: 20 5b 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73   [uplevel 1 [lis
7990: 74 20 73 75 62 73 74 20 5b 61 70 70 65 6e 64 41  t subst [appendA
79a0: 72 67 73 20 24 70 72 65 66 69 78 20 7b 0d 0a 20  rgs $prefix {.. 
79b0: 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61 73 52         if {[hasR
79c0: 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74  untimeOption nat
79d0: 69 76 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ive]} then {..  
79e0: 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
79f0: 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72 65 74 65  nvoke Interprete
7a00: 72 2e 47 65 74 41 63 74 69 76 65 20 41 64 64 52  r.GetActive AddR
7a10: 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74  untimeOption nat
7a20: 69 76 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ive..        }..
7a30: 20 20 20 20 20 20 7d 20 5b 67 65 74 54 65 73 74        } [getTest
7a40: 4f 76 65 72 72 69 64 65 73 50 72 65 61 6d 62 6c  OverridesPreambl
7a50: 65 20 5b 6c 69 73 74 20 70 61 74 68 20 74 65 73  e [list path tes
7a60: 74 5f 63 68 61 6e 6e 65 6c 5d 5d 20 24 73 75 66  t_channel]] $suf
7a70: 66 69 78 5d 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c  fix]]]..    }...
7a80: 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79 43 6f  ..    proc tryCo
7a90: 70 79 45 78 74 65 72 6e 61 6c 46 69 6c 65 20 7b  pyExternalFile {
7aa0: 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66   fileName {platf
7ab0: 6f 72 6d 20 22 22 7d 20 7b 6e 65 77 46 69 6c 65  orm ""} {newFile
7ac0: 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20  Name ""} } {..  
7ad0: 20 20 20 20 73 65 74 20 73 6f 75 72 63 65 46 69      set sourceFi
7ae0: 6c 65 4e 61 6d 65 20 5b 67 65 74 45 78 74 65 72  leName [getExter
7af0: 6e 61 6c 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c  nalFileName $fil
7b00: 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  eName]....      
7b10: 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74  if {![file exist
7b20: 73 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  s $sourceFileNam
7b30: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
7b40: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
7b50: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
7b60: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
7b70: 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70       "---- skipp
7b80: 65 64 20 63 6f 70 79 69 6e 67 20 65 78 74 65 72  ed copying exter
7b90: 6e 61 6c 20 66 69 6c 65 20 5c 22 22 20 24 73 6f  nal file \"" $so
7ba0: 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a  urceFileName \..
7bb0: 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c              "\",
7bc0: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
7bd0: 73 74 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20  st\n"]....      
7be0: 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20    return..      
7bf0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  }....      if {[
7c00: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e  string length $n
7c10: 65 77 46 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d  ewFileName] > 0}
7c20: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
7c30: 20 73 65 74 20 74 61 72 67 65 74 46 69 6c 65 4e   set targetFileN
7c40: 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69  ame [getBinaryFi
7c50: 6c 65 4e 61 6d 65 20 24 6e 65 77 46 69 6c 65 4e  leName $newFileN
7c60: 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a  ame $platform]..
7c70: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
7c80: 20 20 20 20 20 20 20 20 73 65 74 20 74 61 72 67          set targ
7c90: 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42  etFileName [getB
7ca0: 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66  inaryFileName $f
7cb0: 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72  ileName $platfor
7cc0: 6d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  m]..      }.... 
7cd0: 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74 44       set targetD
7ce0: 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65 20 64  irectory [file d
7cf0: 69 72 6e 61 6d 65 20 24 74 61 72 67 65 74 46 69  irname $targetFi
7d00: 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20  leName]....     
7d10: 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
7d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
7d30: 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24  {![file exists $
7d40: 74 61 72 67 65 74 44 69 72 65 63 74 6f 72 79 5d  targetDirectory]
7d50: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
7d60: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 6d            file m
7d70: 6b 64 69 72 20 24 74 61 72 67 65 74 44 69 72 65  kdir $targetDire
7d80: 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 20 20 20  ctory..         
7d90: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
7da0: 20 20 20 20 20 20 66 69 6c 65 20 63 6f 70 79 20        file copy 
7db0: 2d 66 6f 72 63 65 20 24 73 6f 75 72 63 65 46 69  -force $sourceFi
7dc0: 6c 65 4e 61 6d 65 20 24 74 61 72 67 65 74 46 69  leName $targetFi
7dd0: 6c 65 4e 61 6d 65 7d 5d 20 3d 3d 20 30 7d 20 74  leName}] == 0} t
7de0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  hen {..        t
7df0: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
7e00: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
7e10: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
7e20: 22 2d 2d 2d 2d 20 63 6f 70 69 65 64 20 65 78 74  "---- copied ext
7e30: 65 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20  ernal file from 
7e40: 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e  \"" $sourceFileN
7e50: 61 6d 65 20 22 5c 22 20 74 6f 20 5c 22 22 20 5c  ame "\" to \"" \
7e60: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 74  ..            $t
7e70: 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22  argetFileName \"
7e80: 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  \n]..      } els
7e90: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e {..        tpu
7ea0: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
7eb0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
7ec0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
7ed0: 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20 63 6f  --- failed to co
7ee0: 70 79 20 65 78 74 65 72 6e 61 6c 20 66 69 6c 65  py external file
7ef0: 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63   from \"" $sourc
7f00: 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20  eFileName \..   
7f10: 20 20 20 20 20 20 20 20 20 22 5c 22 20 74 6f 20           "\" to 
7f20: 5c 22 22 20 24 74 61 72 67 65 74 46 69 6c 65 4e  \"" $targetFileN
7f30: 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  ame \"\n]..     
7f40: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
7f50: 20 20 70 72 6f 63 20 74 72 79 43 6f 70 79 42 69    proc tryCopyBi
7f60: 6e 61 72 79 46 69 6c 65 20 7b 20 66 69 6c 65 4e  naryFile { fileN
7f70: 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22  ame {platform ""
7f80: 7d 20 7b 6e 65 77 46 69 6c 65 4e 61 6d 65 20 22  } {newFileName "
7f90: 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  "} } {..      se
7fa0: 74 20 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65  t sourceFileName
7fb0: 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
7fc0: 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70  ame $fileName $p
7fd0: 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20  latform]....    
7fe0: 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69    if {![file exi
7ff0: 73 74 73 20 24 73 6f 75 72 63 65 46 69 6c 65 4e  sts $sourceFileN
8000: 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
8010: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
8020: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
8030: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
8040: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69         "---- ski
8050: 70 70 65 64 20 63 6f 70 79 69 6e 67 20 62 69 6e  pped copying bin
8060: 61 72 79 20 66 69 6c 65 20 5c 22 22 20 24 73 6f  ary file \"" $so
8070: 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a  urceFileName \..
8080: 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c              "\",
8090: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
80a0: 73 74 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20  st\n"]....      
80b0: 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20    return..      
80c0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  }....      if {[
80d0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e  string length $n
80e0: 65 77 46 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d  ewFileName] > 0}
80f0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
8100: 20 73 65 74 20 74 61 72 67 65 74 46 69 6c 65 4e   set targetFileN
8110: 61 6d 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c  ame [getBuildFil
8120: 65 4e 61 6d 65 20 24 6e 65 77 46 69 6c 65 4e 61  eName $newFileNa
8130: 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20  me $platform].. 
8140: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
8150: 20 20 20 20 20 20 20 73 65 74 20 74 61 72 67 65         set targe
8160: 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 75  tFileName [getBu
8170: 69 6c 64 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c  ildFileName $fil
8180: 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d  eName $platform]
8190: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
81a0: 20 20 20 73 65 74 20 74 61 72 67 65 74 44 69 72     set targetDir
81b0: 65 63 74 6f 72 79 20 5b 66 69 6c 65 20 64 69 72  ectory [file dir
81c0: 6e 61 6d 65 20 24 74 61 72 67 65 74 46 69 6c 65  name $targetFile
81d0: 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69  Name]....      i
81e0: 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
81f0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
8200: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 74 61  [file exists $ta
8210: 72 67 65 74 44 69 72 65 63 74 6f 72 79 5d 7d 20  rgetDirectory]} 
8220: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
8230: 20 20 20 20 20 20 20 20 66 69 6c 65 20 6d 6b 64          file mkd
8240: 69 72 20 24 74 61 72 67 65 74 44 69 72 65 63 74  ir $targetDirect
8250: 6f 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ory..           
8260: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
8270: 20 20 20 20 66 69 6c 65 20 63 6f 70 79 20 2d 66      file copy -f
8280: 6f 72 63 65 20 24 73 6f 75 72 63 65 46 69 6c 65  orce $sourceFile
8290: 4e 61 6d 65 20 24 74 61 72 67 65 74 46 69 6c 65  Name $targetFile
82a0: 4e 61 6d 65 7d 5d 20 3d 3d 20 30 7d 20 74 68 65  Name}] == 0} the
82b0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  n {..        tpu
82c0: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
82d0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
82e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
82f0: 2d 2d 2d 20 63 6f 70 69 65 64 20 62 69 6e 61 72  --- copied binar
8300: 79 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20  y file from \"" 
8310: 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20  $sourceFileName 
8320: 22 5c 22 20 74 6f 20 5c 22 22 20 5c 0d 0a 20 20  "\" to \"" \..  
8330: 20 20 20 20 20 20 20 20 20 20 24 74 61 72 67 65            $targe
8340: 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d  tFileName \"\n].
8350: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
8360: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
8370: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
8380: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
8390: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
83a0: 66 61 69 6c 65 64 20 74 6f 20 63 6f 70 79 20 62  failed to copy b
83b0: 69 6e 61 72 79 20 66 69 6c 65 20 66 72 6f 6d 20  inary file from 
83c0: 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e  \"" $sourceFileN
83d0: 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
83e0: 20 20 20 22 5c 22 20 74 6f 20 5c 22 22 20 24 74     "\" to \"" $t
83f0: 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22  argetFileName \"
8400: 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  \n]..      }..  
8410: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
8420: 20 74 72 79 43 6f 70 79 42 75 69 6c 64 46 69 6c   tryCopyBuildFil
8430: 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c  e { fileName {pl
8440: 61 74 66 6f 72 6d 20 22 22 7d 20 7b 6e 65 77 46  atform ""} {newF
8450: 69 6c 65 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d  ileName ""} } {.
8460: 0a 20 20 20 20 20 20 73 65 74 20 73 6f 75 72 63  .      set sourc
8470: 65 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 75  eFileName [getBu
8480: 69 6c 64 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c  ildFileName $fil
8490: 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d  eName $platform]
84a0: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b  ....      if {![
84b0: 66 69 6c 65 20 65 78 69 73 74 73 20 24 73 6f 75  file exists $sou
84c0: 72 63 65 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  rceFileName]} th
84d0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  en {..        tp
84e0: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
84f0: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
8500: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
8510: 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 63 6f 70  ---- skipped cop
8520: 79 69 6e 67 20 62 75 69 6c 64 20 66 69 6c 65 20  ying build file 
8530: 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e  \"" $sourceFileN
8540: 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
8550: 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20     "\", it does 
8560: 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 0d  not exist\n"]...
8570: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d  .        return.
8580: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
8590: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
85a0: 6e 67 74 68 20 24 6e 65 77 46 69 6c 65 4e 61 6d  ngth $newFileNam
85b0: 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
85c0: 20 20 20 20 20 20 20 20 73 65 74 20 74 61 72 67          set targ
85d0: 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42  etFileName [getB
85e0: 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 6e  inaryFileName $n
85f0: 65 77 46 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74  ewFileName $plat
8600: 66 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 7d 20 65  form]..      } e
8610: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  lse {..        s
8620: 65 74 20 74 61 72 67 65 74 46 69 6c 65 4e 61 6d  et targetFileNam
8630: 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65  e [getBinaryFile
8640: 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24  Name $fileName $
8650: 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20  platform]..     
8660: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20   }....      set 
8670: 74 61 72 67 65 74 44 69 72 65 63 74 6f 72 79 20  targetDirectory 
8680: 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 74  [file dirname $t
8690: 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 5d 0d 0a  argetFileName]..
86a0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74  ..      if {[cat
86b0: 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
86c0: 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65      if {![file e
86d0: 78 69 73 74 73 20 24 74 61 72 67 65 74 44 69 72  xists $targetDir
86e0: 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d  ectory]} then {.
86f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8700: 20 66 69 6c 65 20 6d 6b 64 69 72 20 24 74 61 72   file mkdir $tar
8710: 67 65 74 44 69 72 65 63 74 6f 72 79 0d 0a 20 20  getDirectory..  
8720: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
8730: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c               fil
8740: 65 20 63 6f 70 79 20 2d 66 6f 72 63 65 20 24 73  e copy -force $s
8750: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 24 74  ourceFileName $t
8760: 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 7d 5d 20  argetFileName}] 
8770: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
8780: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
8790: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
87a0: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
87b0: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70         "---- cop
87c0: 69 65 64 20 62 75 69 6c 64 20 66 69 6c 65 20 66  ied build file f
87d0: 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63 65 46  rom \"" $sourceF
87e0: 69 6c 65 4e 61 6d 65 20 22 5c 22 20 74 6f 20 5c  ileName "\" to \
87f0: 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
8800: 20 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d    $targetFileNam
8810: 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d  e \"\n]..      }
8820: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
8830: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
8840: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
8850: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
8860: 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74    "---- failed t
8870: 6f 20 63 6f 70 79 20 62 75 69 6c 64 20 66 69 6c  o copy build fil
8880: 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72  e from \"" $sour
8890: 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20  ceFileName \..  
88a0: 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 74 6f            "\" to
88b0: 20 5c 22 22 20 24 74 61 72 67 65 74 46 69 6c 65   \"" $targetFile
88c0: 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20  Name \"\n]..    
88d0: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
88e0: 20 20 20 70 72 6f 63 20 74 72 79 44 65 6c 65 74     proc tryDelet
88f0: 65 42 69 6e 61 72 79 46 69 6c 65 20 7b 20 66 69  eBinaryFile { fi
8900: 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d  leName {platform
8910: 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20   ""} } {..      
8920: 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65  set fileName [ge
8930: 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
8940: 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66  $fileName $platf
8950: 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  orm]....      if
8960: 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20   {![file exists 
8970: 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  $fileName]} then
8980: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
8990: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
89a0: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
89b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
89c0: 2d 2d 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74  -- skipped delet
89d0: 69 6e 67 20 62 69 6e 61 72 79 20 66 69 6c 65 20  ing binary file 
89e0: 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d  \"" $fileName \.
89f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22  .            "\"
8a00: 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78  , it does not ex
8a10: 69 73 74 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20  ist\n"]....     
8a20: 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20     return..     
8a30: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   }....      if {
8a40: 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c  [catch {file del
8a50: 65 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d 5d 20  ete $fileName}] 
8a60: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
8a70: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
8a80: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
8a90: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
8aa0: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 64 65 6c         "---- del
8ab0: 65 74 65 64 20 62 69 6e 61 72 79 20 66 69 6c 65  eted binary file
8ac0: 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c   \"" $fileName \
8ad0: 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  "\n]..      } el
8ae0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  se {..        tp
8af0: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
8b00: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
8b10: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
8b20: 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20 64  ---- failed to d
8b30: 65 6c 65 74 65 20 62 69 6e 61 72 79 20 66 69 6c  elete binary fil
8b40: 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20  e \"" $fileName 
8b50: 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  \"\n]..      }..
8b60: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
8b70: 6f 63 20 74 72 79 44 65 6c 65 74 65 42 75 69 6c  oc tryDeleteBuil
8b80: 64 46 69 6c 65 20 7b 20 66 69 6c 65 4e 61 6d 65  dFile { fileName
8b90: 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7d   {platform ""} }
8ba0: 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69   {..      set fi
8bb0: 6c 65 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c 64  leName [getBuild
8bc0: 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61  FileName $fileNa
8bd0: 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d  me $platform]...
8be0: 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c  .      if {![fil
8bf0: 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61  e exists $fileNa
8c00: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
8c10: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
8c20: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
8c30: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
8c40: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70        "---- skip
8c50: 70 65 64 20 64 65 6c 65 74 69 6e 67 20 62 75 69  ped deleting bui
8c60: 6c 64 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c  ld file \"" $fil
8c70: 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  eName \..       
8c80: 20 20 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65       "\", it doe
8c90: 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d  s not exist\n"].
8ca0: 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ...        retur
8cb0: 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  n..      }....  
8cc0: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
8cd0: 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66 69 6c  file delete $fil
8ce0: 65 4e 61 6d 65 7d 5d 20 3d 3d 20 30 7d 20 74 68  eName}] == 0} th
8cf0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  en {..        tp
8d00: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
8d10: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
8d20: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
8d30: 2d 2d 2d 2d 20 64 65 6c 65 74 65 64 20 62 75 69  ---- deleted bui
8d40: 6c 64 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c  ld file \"" $fil
8d50: 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  eName \"\n]..   
8d60: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
8d70: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
8d80: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
8d90: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
8da0: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c        "---- fail
8db0: 65 64 20 74 6f 20 64 65 6c 65 74 65 20 62 75 69  ed to delete bui
8dc0: 6c 64 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c  ld file \"" $fil
8dd0: 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  eName \"\n]..   
8de0: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
8df0: 20 20 20 20 70 72 6f 63 20 74 72 79 43 6f 70 79      proc tryCopy
8e00: 41 73 73 65 6d 62 6c 79 20 7b 20 66 69 6c 65 4e  Assembly { fileN
8e10: 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22  ame {platform ""
8e20: 7d 20 7b 70 64 62 20 74 72 75 65 7d 20 7d 20 7b  } {pdb true} } {
8e30: 0d 0a 20 20 20 20 20 20 74 72 79 43 6f 70 79 42  ..      tryCopyB
8e40: 75 69 6c 64 46 69 6c 65 20 24 66 69 6c 65 4e 61  uildFile $fileNa
8e50: 6d 65 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 0d 0a  me $platform....
8e60: 20 20 20 20 20 20 69 66 20 7b 24 70 64 62 7d 20        if {$pdb} 
8e70: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
8e80: 74 72 79 43 6f 70 79 42 75 69 6c 64 46 69 6c 65  tryCopyBuildFile
8e90: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
8ea0: 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
8eb0: 65 20 72 6f 6f 74 6e 61 6d 65 20 24 66 69 6c 65  e rootname $file
8ec0: 4e 61 6d 65 5d 20 2e 70 64 62 5d 20 24 70 6c 61  Name] .pdb] $pla
8ed0: 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 7d 0d 0a  tform..      }..
8ee0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
8ef0: 6f 63 20 74 72 79 44 65 6c 65 74 65 41 73 73 65  oc tryDeleteAsse
8f00: 6d 62 6c 79 20 7b 20 66 69 6c 65 4e 61 6d 65 20  mbly { fileName 
8f10: 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 70  {platform ""} {p
8f20: 64 62 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20  db true} } {..  
8f30: 20 20 20 20 74 72 79 44 65 6c 65 74 65 42 69 6e      tryDeleteBin
8f40: 61 72 79 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d  aryFile $fileNam
8f50: 65 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 0d 0a 20  e $platform.... 
8f60: 20 20 20 20 20 69 66 20 7b 24 70 64 62 7d 20 74       if {$pdb} t
8f70: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  hen {..        t
8f80: 72 79 44 65 6c 65 74 65 42 69 6e 61 72 79 46 69  ryDeleteBinaryFi
8f90: 6c 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  le [appendArgs \
8fa0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
8fb0: 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 24 66 69  ile rootname $fi
8fc0: 6c 65 4e 61 6d 65 5d 20 2e 70 64 62 5d 20 24 70  leName] .pdb] $p
8fd0: 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 7d  latform..      }
8fe0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
8ff0: 70 72 6f 63 20 74 72 79 4c 6f 61 64 41 73 73 65  proc tryLoadAsse
9000: 6d 62 6c 79 20 7b 20 66 69 6c 65 4e 61 6d 65 20  mbly { fileName 
9010: 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7d 20  {platform ""} } 
9020: 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c  {..      set fil
9030: 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79  eName [getBinary
9040: 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61  FileName $fileNa
9050: 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d  me $platform]...
9060: 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63  .      if {[catc
9070: 68 20 7b 73 65 74 20 61 73 73 65 6d 62 6c 79 20  h {set assembly 
9080: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
9090: 20 5b 6f 62 6a 65 63 74 20 6c 6f 61 64 20 2d 6c   [object load -l
90a0: 6f 61 64 74 79 70 65 20 46 69 6c 65 20 2d 61 6c  oadtype File -al
90b0: 69 61 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 5d  ias $fileName]}]
90c0: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
90d0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
90e0: 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 2c 20 61    # NOTE: Now, a
90f0: 64 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  dd the necessary
9100: 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74   test constraint
9110: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
9120: 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
9130: 69 6e 74 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61  int [file rootna
9140: 6d 65 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66  me [file tail $f
9150: 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 0d 0a 20 20 20  ileName]]....   
9160: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
9170: 23 20 4e 4f 54 45 3a 20 47 72 61 62 20 74 68 65  # NOTE: Grab the
9180: 20 69 6d 61 67 65 20 72 75 6e 74 69 6d 65 20 76   image runtime v
9190: 65 72 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  ersion from the 
91a0: 61 73 73 65 6d 62 6c 79 20 62 65 63 61 75 73 65  assembly because
91b0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
91c0: 20 20 73 65 76 65 72 61 6c 20 74 65 73 74 73 20    several tests 
91d0: 72 65 6c 79 20 6f 6e 20 69 74 20 68 61 76 69 6e  rely on it havin
91e0: 67 20 61 20 63 65 72 74 61 69 6e 20 76 61 6c 75  g a certain valu
91f0: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
9200: 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
9210: 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
9220: 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c   [file tail $fil
9230: 65 4e 61 6d 65 5d 20 5f 20 5c 0d 0a 20 20 20 20  eName] _ \..    
9240: 20 20 20 20 20 20 20 20 5b 24 61 73 73 65 6d 62          [$assemb
9250: 6c 79 20 49 6d 61 67 65 52 75 6e 74 69 6d 65 56  ly ImageRuntimeV
9260: 65 72 73 69 6f 6e 5d 5d 0d 0a 0d 0a 20 20 20 20  ersion]]....    
9270: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
9280: 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68   NOTE: Return th
9290: 65 20 66 75 6c 6c 20 70 61 74 68 20 6f 66 20 74  e full path of t
92a0: 68 65 20 6c 6f 61 64 65 64 20 66 69 6c 65 2e 0d  he loaded file..
92b0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
92c0: 20 20 20 20 72 65 74 75 72 6e 20 24 66 69 6c 65      return $file
92d0: 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  Name..      }...
92e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22  .      return ""
92f0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
9300: 70 72 6f 63 20 69 73 53 51 4c 69 74 65 52 65 61  proc isSQLiteRea
9310: 64 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  dy {} {..      #
9320: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
9330: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 6d  This procedure m
9340: 75 73 74 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a  ust return non-z
9350: 65 72 6f 20 6f 6e 6c 79 20 69 66 20 74 68 65 20  ero only if the 
9360: 53 51 4c 69 74 65 20 6e 61 74 69 76 65 0d 0a 20  SQLite native.. 
9370: 20 20 20 20 20 23 20 20 20 20 20 20 20 6c 69 62       #       lib
9380: 72 61 72 79 20 61 6e 64 20 74 68 65 20 53 79 73  rary and the Sys
9390: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
93a0: 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79  managed assembly
93b0: 20 61 72 65 20 6c 6f 61 64 65 64 0d 0a 20 20 20   are loaded..   
93c0: 20 20 20 23 20 20 20 20 20 20 20 61 6e 64 20 72     #       and r
93d0: 65 61 64 79 20 66 6f 72 20 75 73 65 20 62 79 20  eady for use by 
93e0: 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e 20  the test suite. 
93f0: 20 43 75 72 72 65 6e 74 6c 79 2c 20 74 68 69 73   Currently, this
9400: 20 70 72 6f 63 65 64 75 72 65 0d 0a 20 20 20 20   procedure..    
9410: 20 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64    #       should
9420: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 6c 79 20   be called only 
9430: 61 66 74 65 72 20 74 68 65 20 5b 74 72 79 4c 6f  after the [tryLo
9440: 61 64 41 73 73 65 6d 62 6c 79 5d 20 70 72 6f 63  adAssembly] proc
9450: 65 64 75 72 65 20 68 61 73 0d 0a 20 20 20 20 20  edure has..     
9460: 20 23 20 20 20 20 20 20 20 62 65 65 6e 20 63 61   #       been ca
9470: 6c 6c 65 64 20 74 6f 20 70 72 6f 62 65 20 66 6f  lled to probe fo
9480: 72 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74  r the System.Dat
9490: 61 2e 53 51 4c 69 74 65 20 6d 61 6e 61 67 65 64  a.SQLite managed
94a0: 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20   assembly..     
94b0: 20 23 20 20 20 20 20 20 20 61 6e 64 20 74 68 65   #       and the
94c0: 20 5b 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65   [checkForSQLite
94d0: 5d 20 70 72 6f 63 65 64 75 72 65 20 68 61 73 20  ] procedure has 
94e0: 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 70  been called to p
94f0: 72 6f 62 65 20 66 6f 72 0d 0a 20 20 20 20 20 20  robe for..      
9500: 23 20 20 20 20 20 20 20 74 68 65 20 53 51 4c 69  #       the SQLi
9510: 74 65 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72  te native librar
9520: 79 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 74 68  y; otherwise, th
9530: 69 73 20 70 72 6f 63 65 64 75 72 65 20 77 69 6c  is procedure wil
9540: 6c 20 73 69 6d 70 6c 79 0d 0a 20 20 20 20 20 20  l simply..      
9550: 23 20 20 20 20 20 20 20 61 6c 77 61 79 73 20 72  #       always r
9560: 65 74 75 72 6e 20 7a 65 72 6f 2e 0d 0a 20 20 20  eturn zero...   
9570: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
9580: 72 6e 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20  rn [expr {..    
9590: 20 20 20 20 5b 68 61 76 65 43 6f 6e 73 74 72 61      [haveConstra
95a0: 69 6e 74 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  int System.Data.
95b0: 53 51 4c 69 74 65 5d 20 26 26 20 5b 68 61 76 65  SQLite] && [have
95c0: 43 6f 6e 73 74 72 61 69 6e 74 20 53 51 4c 69 74  Constraint SQLit
95d0: 65 5d 0d 0a 20 20 20 20 20 20 7d 5d 0d 0a 20 20  e]..      }]..  
95e0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
95f0: 20 6d 61 74 63 68 4d 61 63 68 69 6e 65 20 7b 20   matchMachine { 
9600: 70 6c 61 74 66 6f 72 6d 20 7d 20 7b 0d 0a 20 20  platform } {..  
9610: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
9620: 4f 54 45 3a 20 41 6e 20 65 6d 70 74 79 20 73 74  OTE: An empty st
9630: 72 69 6e 67 20 66 6f 72 20 74 68 65 20 70 6c 61  ring for the pla
9640: 74 66 6f 72 6d 20 6d 65 61 6e 73 20 74 68 61 74  tform means that
9650: 20 74 68 65 20 62 75 69 6c 64 20 69 73 20 6e 6f   the build is no
9660: 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  t..      #      
9670: 20 5b 70 72 69 6d 61 72 69 6c 79 5d 20 61 20 6e   [primarily] a n
9680: 61 74 69 76 65 20 62 75 69 6c 64 3b 20 74 68 65  ative build; the
9690: 72 65 66 6f 72 65 2c 20 69 74 20 61 6c 77 61 79  refore, it alway
96a0: 73 20 6d 61 74 63 68 65 73 2e 0d 0a 20 20 20 20  s matches...    
96b0: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
96c0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70  string length $p
96d0: 6c 61 74 66 6f 72 6d 5d 20 3d 3d 20 30 7d 20 74  latform] == 0} t
96e0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
96f0: 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20  eturn true..    
9700: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
9710: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f        # NOTE: Do
9720: 65 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64  es the specified
9730: 20 70 6c 61 74 66 6f 72 6d 20 6d 61 74 63 68 20   platform match 
9740: 75 70 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  up to the curren
9750: 74 20 70 72 6f 63 65 73 73 3f 0d 0a 20 20 20 20  t process?..    
9760: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24    #..      if {$
9770: 70 6c 61 74 66 6f 72 6d 20 65 71 20 5b 6d 61 63  platform eq [mac
9780: 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72 6d 20 24  hineToPlatform $
9790: 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d  ::tcl_platform(m
97a0: 61 63 68 69 6e 65 29 5d 7d 20 74 68 65 6e 20 7b  achine)]} then {
97b0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
97c0: 20 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a   true..      }..
97d0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
97e0: 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 73 70 65   # NOTE: The spe
97f0: 63 69 66 69 65 64 20 70 6c 61 74 66 6f 72 6d 20  cified platform 
9800: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 75  does not match u
9810: 70 20 77 69 74 68 20 74 68 65 20 70 6c 61 74 66  p with the platf
9820: 6f 72 6d 0d 0a 20 20 20 20 20 20 23 20 20 20 20  orm..      #    
9830: 20 20 20 66 6f 72 20 74 68 65 20 63 75 72 72 65     for the curre
9840: 6e 74 20 70 72 6f 63 65 73 73 2e 0d 0a 20 20 20  nt process...   
9850: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
9860: 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d  rn false..    }.
9870: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65  ....    proc che
9880: 63 6b 46 6f 72 53 51 4c 69 74 65 42 75 69 6c 64  ckForSQLiteBuild
9890: 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 73 65 6c  s { channel {sel
98a0: 65 63 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  ect false} } {..
98b0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
98c0: 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f 72   NOTE: Check for
98d0: 20 65 76 65 72 79 20 70 6f 73 73 69 62 6c 65 20   every possible 
98e0: 76 61 6c 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f  valid combinatio
98f0: 6e 20 6f 66 20 76 61 6c 75 65 73 20 75 73 65 64  n of values used
9900: 20 77 68 65 6e 0d 0a 20 20 20 20 20 20 23 20 20   when..      #  
9910: 20 20 20 20 20 6c 6f 63 61 74 69 6e 67 20 6f 75       locating ou
9920: 74 20 74 68 65 20 62 75 69 6c 64 20 6f 75 74 70  t the build outp
9930: 75 74 20 64 69 72 65 63 74 6f 72 79 2c 20 73 68  ut directory, sh
9940: 6f 77 69 6e 67 20 65 61 63 68 20 61 76 61 69 6c  owing each avail
9950: 61 62 6c 65 0d 0a 20 20 20 20 20 20 23 20 20 20  able..      #   
9960: 20 20 20 20 62 75 69 6c 64 20 76 61 72 69 61 74      build variat
9970: 69 6f 6e 20 61 6c 6f 6e 67 20 74 68 65 20 77 61  ion along the wa
9980: 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  y...      #..   
9990: 20 20 20 66 6f 72 65 61 63 68 20 6e 61 74 69 76     foreach nativ
99a0: 65 20 5b 6c 69 73 74 20 66 61 6c 73 65 20 74 72  e [list false tr
99b0: 75 65 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 66  ue] {..        f
99c0: 6f 72 65 61 63 68 20 79 65 61 72 20 5b 67 65 74  oreach year [get
99d0: 42 75 69 6c 64 59 65 61 72 73 5d 20 7b 0d 0a 20  BuildYears] {.. 
99e0: 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
99f0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 5b   configuration [
9a00: 67 65 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72  getBuildConfigur
9a10: 61 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20  ations] {..     
9a20: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
9a30: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69        # NOTE: Fi
9a40: 67 75 72 65 20 6f 75 74 20 74 68 65 20 65 66 66  gure out the eff
9a50: 65 63 74 69 76 65 20 62 75 69 6c 64 20 70 6c 61  ective build pla
9a60: 74 66 6f 72 6d 2e 20 20 54 68 69 73 20 69 73 0d  tform.  This is.
9a70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20  .            #  
9a80: 20 20 20 20 20 62 61 73 65 64 20 6f 6e 20 77 68       based on wh
9a90: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 5b  ether or not a [
9aa0: 70 72 69 6d 61 72 69 6c 79 5d 20 6e 61 74 69 76  primarily] nativ
9ab0: 65 20 62 75 69 6c 64 0d 0a 20 20 20 20 20 20 20  e build..       
9ac0: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 73 20       #       is 
9ad0: 62 65 69 6e 67 20 75 73 65 64 2e 20 20 46 6f 72  being used.  For
9ae0: 20 5b 70 72 69 6d 61 72 69 6c 79 5d 20 6e 6f 6e   [primarily] non
9af0: 2d 6e 61 74 69 76 65 20 62 75 69 6c 64 73 2c 0d  -native builds,.
9b00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20  .            #  
9b10: 20 20 20 20 20 74 68 69 73 20 77 69 6c 6c 20 62       this will b
9b20: 65 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  e an empty strin
9b30: 67 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  g...            
9b40: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  #..            s
9b50: 65 74 20 70 6c 61 74 66 6f 72 6d 20 5b 67 65 74  et platform [get
9b60: 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20 24 6e  BuildPlatform $n
9b70: 61 74 69 76 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  ative]....      
9b80: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
9b90: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
9ba0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
9bb0: 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69      "---- checki
9bc0: 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61  ng for System.Da
9bd0: 74 61 2e 53 51 4c 69 74 65 20 62 75 69 6c 64 20  ta.SQLite build 
9be0: 5c 22 22 20 5b 65 78 70 72 20 5c 0d 0a 20 20 20  \"" [expr \..   
9bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 24 6e               {$n
9c00: 61 74 69 76 65 20 3f 20 22 6e 61 74 69 76 65 2f  ative ? "native/
9c10: 22 20 3a 20 22 22 7d 5d 20 5b 65 78 70 72 20 7b  " : ""}] [expr {
9c20: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 5c  [string length \
9c30: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
9c40: 20 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30    $platform] > 0
9c50: 20 3f 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24   ? [appendArgs $
9c60: 70 6c 61 74 66 6f 72 6d 20 2f 5d 20 3a 20 22 22  platform /] : ""
9c70: 7d 5d 20 24 79 65 61 72 20 5c 0d 0a 20 20 20 20  }] $year \..    
9c80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 20 24 63              / $c
9c90: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 22 5c 22  onfiguration "\"
9ca0: 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20  ... "]....      
9cb0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
9cc0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69       # NOTE: Bui
9cd0: 6c 64 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61  ld the fully qua
9ce0: 6c 69 66 69 65 64 20 64 69 72 65 63 74 6f 72 79  lified directory
9cf0: 20 77 68 65 72 65 20 74 68 65 20 6e 65 63 65 73   where the neces
9d00: 73 61 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20  sary..          
9d10: 20 20 23 20 20 20 20 20 20 20 63 6f 6d 70 6f 6e    #       compon
9d20: 65 6e 74 73 20 66 6f 72 20 53 79 73 74 65 6d 2e  ents for System.
9d30: 44 61 74 61 2e 53 51 4c 69 74 65 20 73 68 6f 75  Data.SQLite shou
9d40: 6c 64 20 62 65 20 66 6f 75 6e 64 2e 0d 0a 20 20  ld be found...  
9d50: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
9d60: 20 20 20 20 20 20 20 20 20 73 65 74 20 64 69 72           set dir
9d70: 65 63 74 6f 72 79 20 5b 6a 6f 69 6e 42 75 69 6c  ectory [joinBuil
9d80: 64 44 69 72 65 63 74 6f 72 79 20 24 6e 61 74 69  dDirectory $nati
9d90: 76 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ve \..          
9da0: 20 20 20 20 20 20 5b 67 65 74 42 75 69 6c 64 42        [getBuildB
9db0: 61 73 65 44 69 72 65 63 74 6f 72 79 5d 20 24 79  aseDirectory] $y
9dc0: 65 61 72 20 24 70 6c 61 74 66 6f 72 6d 20 24 63  ear $platform $c
9dd0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 0d  onfiguration]...
9de0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
9df0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
9e00: 54 45 3a 20 44 6f 20 74 68 65 20 6e 65 63 65 73  TE: Do the neces
9e10: 73 61 72 79 20 66 69 6c 65 73 20 65 78 69 73 74  sary files exist
9e20: 3f 20 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f  ?  Currently, no
9e30: 20 6f 74 68 65 72 20 73 74 65 70 73 0d 0a 20 20   other steps..  
9e40: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
9e50: 20 20 61 72 65 20 74 61 6b 65 6e 20 74 6f 20 76    are taken to v
9e60: 65 72 69 66 79 20 74 68 69 73 20 62 75 69 6c 64  erify this build
9e70: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 76 69 61   is actually via
9e80: 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ble...          
9e90: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
9ea0: 20 69 66 20 7b 5b 69 73 42 75 69 6c 64 41 76 61   if {[isBuildAva
9eb0: 69 6c 61 62 6c 65 20 24 6e 61 74 69 76 65 20 24  ilable $native $
9ec0: 64 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e  directory]} then
9ed0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
9ee0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
9ef0: 20 20 20 23 20 4e 4f 54 45 3a 20 57 68 65 6e 20     # NOTE: When 
9f00: 69 6e 20 22 73 65 6c 65 63 74 22 20 6d 6f 64 65  in "select" mode
9f10: 2c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  , automatically 
9f20: 73 65 6c 65 63 74 20 74 68 65 20 66 69 72 73 74  select the first
9f30: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
9f40: 23 20 20 20 20 20 20 20 61 76 61 69 6c 61 62 6c  #       availabl
9f50: 65 20 62 75 69 6c 64 20 6f 66 20 53 79 73 74 65  e build of Syste
9f60: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 61 6e  m.Data.SQLite an
9f70: 64 20 74 68 65 6e 20 72 65 74 75 72 6e 0d 0a 20  d then return.. 
9f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
9f90: 20 20 20 20 20 69 6d 6d 65 64 69 61 74 65 6c 79       immediately
9fa0: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
9fb0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
9fc0: 20 20 69 66 20 7b 24 73 65 6c 65 63 74 20 26 26    if {$select &&
9fd0: 20 5b 6d 61 74 63 68 4d 61 63 68 69 6e 65 20 24   [matchMachine $
9fe0: 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20  platform]} then 
9ff0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
a000: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
a010: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61        # NOTE: Ma
a020: 6e 75 61 6c 6c 79 20 6f 76 65 72 72 69 64 65 20  nually override 
a030: 61 6c 6c 20 74 68 65 20 62 75 69 6c 64 20 64 69  all the build di
a040: 72 65 63 74 6f 72 79 20 73 65 6c 65 63 74 69 6f  rectory selectio
a050: 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n..             
a060: 20 20 20 23 20 20 20 20 20 20 20 72 65 6c 61 74     #       relat
a070: 65 64 20 74 65 73 74 20 73 65 74 74 69 6e 67 73  ed test settings
a080: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 6f 72   in order to for
a090: 63 65 20 74 68 69 73 20 62 75 69 6c 64 0d 0a 20  ce this build.. 
a0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
a0b0: 20 20 20 20 20 20 20 6f 66 20 53 79 73 74 65 6d         of System
a0c0: 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 74 6f 20  .Data.SQLite to 
a0d0: 62 65 20 75 73 65 64 2e 0d 0a 20 20 20 20 20 20  be used...      
a0e0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
a0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a               obj
a100: 65 63 74 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72  ect invoke Inter
a110: 70 72 65 74 65 72 2e 47 65 74 41 63 74 69 76 65  preter.GetActive
a120: 20 5b 65 78 70 72 20 7b 24 6e 61 74 69 76 65 20   [expr {$native 
a130: 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ? \..           
a140: 20 20 20 20 20 20 20 20 20 22 41 64 64 52 75 6e           "AddRun
a150: 74 69 6d 65 4f 70 74 69 6f 6e 22 20 3a 20 22 52  timeOption" : "R
a160: 65 6d 6f 76 65 52 75 6e 74 69 6d 65 4f 70 74 69  emoveRuntimeOpti
a170: 6f 6e 22 7d 5d 20 20 6e 61 74 69 76 65 0d 0a 0d  on"}]  native...
a180: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a190: 20 73 65 74 20 3a 3a 74 65 73 74 5f 79 65 61 72   set ::test_year
a1a0: 20 24 79 65 61 72 0d 0a 20 20 20 20 20 20 20 20   $year..        
a1b0: 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65          set ::te
a1c0: 73 74 5f 70 6c 61 74 66 6f 72 6d 20 24 70 6c 61  st_platform $pla
a1d0: 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20 20  tform..         
a1e0: 20 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73         set ::tes
a1f0: 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  t_configuration 
a200: 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0d 0a  $configuration..
a210: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a220: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
a230: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
a240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a250: 20 20 20 20 22 79 65 73 2c 20 73 65 6c 65 63 74      "yes, select
a260: 65 64 20 28 22 20 5b 65 78 70 72 20 7b 24 6e 61  ed (" [expr {$na
a270: 74 69 76 65 20 3f 20 22 6e 61 74 69 76 65 2f 22  tive ? "native/"
a280: 20 3a 20 22 22 7d 5d 20 5c 0d 0a 20 20 20 20 20   : ""}] \..     
a290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
a2a0: 65 78 70 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65  expr {[string le
a2b0: 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20  ngth $platform] 
a2c0: 3e 20 30 20 3f 20 5b 61 70 70 65 6e 64 41 72 67  > 0 ? [appendArg
a2d0: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
a2e0: 20 20 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f           $platfo
a2f0: 72 6d 20 2f 5d 20 3a 20 22 22 7d 5d 20 24 79 65  rm /] : ""}] $ye
a300: 61 72 20 2f 20 24 63 6f 6e 66 69 67 75 72 61 74  ar / $configurat
a310: 69 6f 6e 20 22 29 5c 6e 22 5d 0d 0a 0d 0a 20 20  ion ")\n"]....  
a320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
a330: 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20  turn true..     
a340: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
a350: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
a360: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
a370: 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 20  l yes\n..       
a380: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
a390: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
a3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
a3b0: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c  uts $channel no\
a3c0: 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  n..            }
a3d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
a3e0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
a3f0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
a400: 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a  n false..    }..
a410: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63  ...    proc chec
a420: 6b 46 6f 72 53 51 4c 69 74 65 52 65 6c 65 61 73  kForSQLiteReleas
a430: 65 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 73 65  es { channel {se
a440: 6c 65 63 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  lect false} } {.
a450: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
a460: 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f  # NOTE: Check fo
a470: 72 20 70 61 73 74 20 72 65 6c 65 61 73 65 73 20  r past releases 
a480: 6f 66 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  of System.Data.S
a490: 51 4c 69 74 65 20 69 6e 20 74 68 65 20 64 69 72  QLite in the dir
a4a0: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 23 20  ectory..      # 
a4b0: 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 65 64 20        contained 
a4c0: 69 6e 20 74 68 65 20 22 53 79 73 74 65 6d 2e 44  in the "System.D
a4d0: 61 74 61 2e 53 51 4c 69 74 65 22 20 65 6e 76 69  ata.SQLite" envi
a4e0: 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  ronment variable
a4f0: 2c 20 69 66 0d 0a 20 20 20 20 20 20 23 20 20 20  , if..      #   
a500: 20 20 20 20 70 72 65 73 65 6e 74 2e 0d 0a 20 20      present...  
a510: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
a520: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
a530: 65 6e 76 28 53 79 73 74 65 6d 2e 44 61 74 61 2e  env(System.Data.
a540: 53 51 4c 69 74 65 29 5d 20 26 26 20 5c 0d 0a 20  SQLite)] && \.. 
a550: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
a560: 20 6c 65 6e 67 74 68 20 24 3a 3a 65 6e 76 28 53   length $::env(S
a570: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
a580: 65 29 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  e)] > 0} then {.
a590: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
a5a0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c      # NOTE: Buil
a5b0: 64 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c  d the fully qual
a5c0: 69 66 69 65 64 20 64 69 72 65 63 74 6f 72 79 20  ified directory 
a5d0: 77 68 65 72 65 20 74 68 65 20 6e 65 63 65 73 73  where the necess
a5e0: 61 72 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ary..        #  
a5f0: 20 20 20 20 20 63 6f 6d 70 6f 6e 65 6e 74 73 20       components 
a600: 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  for System.Data.
a610: 53 51 4c 69 74 65 20 73 68 6f 75 6c 64 20 62 65  SQLite should be
a620: 20 66 6f 75 6e 64 2e 0d 0a 20 20 20 20 20 20 20   found...       
a630: 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
a640: 64 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65 20  directory [file 
a650: 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
a660: 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20   join \..       
a670: 20 20 20 20 20 24 3a 3a 65 6e 76 28 53 79 73 74       $::env(Syst
a680: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 29 20  em.Data.SQLite) 
a690: 5b 67 65 74 52 65 6c 65 61 73 65 56 65 72 73 69  [getReleaseVersi
a6a0: 6f 6e 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  on]]]....       
a6b0: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
a6c0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
a6d0: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
a6e0: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79   checking for Sy
a6f0: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
a700: 20 72 65 6c 65 61 73 65 20 5c 22 22 20 5c 0d 0a   release \"" \..
a710: 20 20 20 20 20 20 20 20 20 20 20 20 24 64 69 72              $dir
a720: 65 63 74 6f 72 79 20 22 5c 22 2e 2e 2e 20 22 5d  ectory "\"... "]
a730: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
a740: 5b 69 73 52 65 6c 65 61 73 65 41 76 61 69 6c 61  [isReleaseAvaila
a750: 62 6c 65 20 24 64 69 72 65 63 74 6f 72 79 20 70  ble $directory p
a760: 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b  latform]} then {
a770: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
a780: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
a790: 70 6c 61 74 66 6f 72 6d 5d 20 3d 3d 20 30 7d 20  platform] == 0} 
a7a0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
a7b0: 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d      set platform
a7c0: 20 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20   unknown..      
a7d0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
a7e0: 20 20 20 69 66 20 7b 24 73 65 6c 65 63 74 20 26     if {$select &
a7f0: 26 20 5b 6d 61 74 63 68 4d 61 63 68 69 6e 65 20  & [matchMachine 
a800: 24 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e  $platform]} then
a810: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
a820: 73 65 74 20 3a 3a 62 75 69 6c 64 5f 64 69 72 65  set ::build_dire
a830: 63 74 6f 72 79 20 24 64 69 72 65 63 74 6f 72 79  ctory $directory
a840: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
a850: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
a860: 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73 2c  appendArgs "yes,
a870: 20 73 65 6c 65 63 74 65 64 20 28 22 20 24 70 6c   selected (" $pl
a880: 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a 0d  atform ")\n"]...
a890: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
a8a0: 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
a8b0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
a8c0: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
a8d0: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
a8e0: 41 72 67 73 20 22 79 65 73 20 28 22 20 24 70 6c  Args "yes (" $pl
a8f0: 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a 20  atform ")\n"].. 
a900: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
a910: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
a920: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
a930: 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 0d 0a 20  hannel no\n.... 
a940: 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
a950: 20 70 61 74 68 20 5b 6c 73 6f 72 74 20 2d 64 65   path [lsort -de
a960: 63 72 65 61 73 69 6e 67 20 5b 66 69 6c 65 20 6c  creasing [file l
a970: 69 73 74 20 24 64 69 72 65 63 74 6f 72 79 20 2a  ist $directory *
a980: 5d 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ]] {..          
a990: 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73    if {[file exis
a9a0: 74 73 20 24 70 61 74 68 5d 20 26 26 20 5b 66 69  ts $path] && [fi
a9b0: 6c 65 20 69 73 64 69 72 65 63 74 6f 72 79 20 24  le isdirectory $
a9c0: 70 61 74 68 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  path]} then {.. 
a9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
a9e0: 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
a9f0: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
aa00: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
aa10: 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
aa20: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
aa30: 74 65 20 72 65 6c 65 61 73 65 20 5c 22 22 20 5c  te release \"" \
aa40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
aa50: 20 20 20 20 24 70 61 74 68 20 22 5c 22 2e 2e 2e      $path "\"...
aa60: 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20   "]....         
aa70: 20 20 20 20 20 69 66 20 7b 5b 69 73 52 65 6c 65       if {[isRele
aa80: 61 73 65 41 76 61 69 6c 61 62 6c 65 20 24 70 61  aseAvailable $pa
aa90: 74 68 20 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68  th platform]} th
aaa0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
aab0: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
aac0: 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f  g length $platfo
aad0: 72 6d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  rm] == 0} then {
aae0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
aaf0: 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d      set platform
ab00: 20 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20   unknown..      
ab10: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
ab20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
ab30: 66 20 7b 24 73 65 6c 65 63 74 20 26 26 20 5b 6d  f {$select && [m
ab40: 61 74 63 68 4d 61 63 68 69 6e 65 20 24 70 6c 61  atchMachine $pla
ab50: 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  tform]} then {..
ab60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab70: 20 20 73 65 74 20 3a 3a 62 75 69 6c 64 5f 64 69    set ::build_di
ab80: 72 65 63 74 6f 72 79 20 24 70 61 74 68 0d 0a 0d  rectory $path...
ab90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
aba0: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
abb0: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79  l [appendArgs "y
abc0: 65 73 2c 20 73 65 6c 65 63 74 65 64 20 28 22 20  es, selected (" 
abd0: 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d  $platform ")\n"]
abe0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
abf0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
ac00: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
ac10: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
ac20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
ac30: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
ac40: 70 70 65 6e 64 41 72 67 73 20 22 79 65 73 20 28  ppendArgs "yes (
ac50: 22 20 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e  " $platform ")\n
ac60: 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  "]..            
ac70: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
ac80: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
ac90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
aca0: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
acb0: 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  \n..            
acc0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
acd0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
ace0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
acf0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
ad00: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
ad10: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
ad20: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
ad30: 2d 2d 2d 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  --- environment 
ad40: 76 61 72 69 61 62 6c 65 20 5c 22 53 79 73 74 65  variable \"Syste
ad50: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 5c 22 20  m.Data.SQLite\" 
ad60: 69 73 20 6e 6f 74 20 22 20 5c 0d 0a 20 20 20 20  is not " \..    
ad70: 20 20 20 20 20 20 20 20 22 73 65 74 2c 20 73 6b          "set, sk
ad80: 69 70 70 69 6e 67 20 63 68 65 63 6b 20 66 6f 72  ipping check for
ad90: 20 72 65 6c 65 61 73 65 73 2e 2e 2e 5c 6e 22 5d   releases...\n"]
ada0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
adb0: 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d     return false.
adc0: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
add0: 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51 4c 69  roc checkForSQLi
ade0: 74 65 4c 69 62 72 61 72 79 20 7b 20 63 68 61 6e  teLibrary { chan
adf0: 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74  nel } {..      t
ae00: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
ae10: 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
ae20: 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62   SQLite core lib
ae30: 72 61 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  rary... "....   
ae40: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
ae50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  .              o
ae60: 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
ae70: 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 53  ags +NonPublic S
ae80: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
ae90: 65 2e 53 51 4c 69 74 65 33 20 5c 0d 0a 20 20 20  e.SQLite3 \..   
aea0: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 69 74             SQLit
aeb0: 65 56 65 72 73 69 6f 6e 7d 20 76 65 72 73 69 6f  eVersion} versio
aec0: 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  n] == 0} then {.
aed0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
aee0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
aef0: 6b 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 65  k if the returne
af00: 64 20 76 65 72 73 69 6f 6e 20 77 61 73 20 6e 75  d version was nu
af10: 6c 6c 2e 20 20 49 66 20 73 6f 2c 20 6d 61 6b 65  ll.  If so, make
af20: 20 69 74 20 65 61 73 79 0d 0a 20 20 20 20 20 20   it easy..      
af30: 20 20 23 20 20 20 20 20 20 20 74 6f 20 73 70 6f    #       to spo
af40: 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
af50: 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
af60: 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72 73 69  ng length $versi
af70: 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  on] == 0} then {
af80: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
af90: 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20 20  version null..  
afa0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
afb0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
afc0: 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
afd0: 20 71 75 65 72 79 20 74 68 65 20 46 6f 73 73 69   query the Fossi
afe0: 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69 66  l source identif
aff0: 69 65 72 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ier for the SQLi
b000: 74 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  te..        #   
b010: 20 20 20 20 63 6f 72 65 20 6c 69 62 72 61 72 79      core library
b020: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
b030: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
b040: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
b050: 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
b060: 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
b070: 6c 69 63 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  lic System.Data.
b080: 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 5c  SQLite.SQLite3 \
b090: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
b0a0: 20 20 53 51 4c 69 74 65 53 6f 75 72 63 65 49 64    SQLiteSourceId
b0b0: 7d 20 73 6f 75 72 63 65 49 64 5d 7d 20 74 68 65  } sourceId]} the
b0c0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  n {..          #
b0d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
b0e0: 54 45 3a 20 57 65 20 66 61 69 6c 65 64 20 74 6f  TE: We failed to
b0f0: 20 71 75 65 72 79 20 74 68 65 20 46 6f 73 73 69   query the Fossi
b100: 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69 66  l source identif
b110: 69 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ier...          
b120: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  #..          set
b130: 20 73 6f 75 72 63 65 49 64 20 75 6e 6b 6e 6f 77   sourceId unknow
b140: 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  n..        }....
b150: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
b160: 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
b170: 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 65 64   if the returned
b180: 20 46 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69   Fossil source i
b190: 64 65 6e 74 69 66 69 65 72 20 77 61 73 20 6e 75  dentifier was nu
b1a0: 6c 6c 2e 20 20 49 66 0d 0a 20 20 20 20 20 20 20  ll.  If..       
b1b0: 20 23 20 20 20 20 20 20 20 73 6f 2c 20 6d 61 6b   #       so, mak
b1c0: 65 20 69 74 20 65 61 73 79 20 74 6f 20 73 70 6f  e it easy to spo
b1d0: 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
b1e0: 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
b1f0: 6e 67 20 6c 65 6e 67 74 68 20 24 73 6f 75 72 63  ng length $sourc
b200: 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  eId] == 0} then 
b210: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
b220: 20 73 6f 75 72 63 65 49 64 20 6e 75 6c 6c 0d 0a   sourceId null..
b230: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
b240: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
b250: 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 74 68 65  # NOTE: Yes, the
b260: 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62   SQLite core lib
b270: 72 61 72 79 20 61 70 70 65 61 72 73 20 74 6f 20  rary appears to 
b280: 62 65 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20  be available... 
b290: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
b2a0: 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
b2b0: 53 51 4c 69 74 65 0d 0a 0d 0a 20 20 20 20 20 20  SQLite....      
b2c0: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
b2d0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79 65   [appendArgs "ye
b2e0: 73 20 28 22 20 24 76 65 72 73 69 6f 6e 20 22 20  s (" $version " 
b2f0: 22 20 24 73 6f 75 72 63 65 49 64 20 22 29 5c 6e  " $sourceId ")\n
b300: 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  "]..      } else
b310: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
b320: 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d  s $channel no\n.
b330: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
b340: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65  ....    proc che
b350: 63 6b 46 6f 72 53 51 4c 69 74 65 49 6e 74 65 72  ckForSQLiteInter
b360: 6f 70 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b  op { channel } {
b370: 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63  ..      tputs $c
b380: 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65  hannel "---- che
b390: 63 6b 69 6e 67 20 66 6f 72 20 53 51 4c 69 74 65  cking for SQLite
b3a0: 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c   interop assembl
b3b0: 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  y... "....      
b3c0: 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
b3d0: 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65              obje
b3e0: 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
b3f0: 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 53 79 73 74   +NonPublic Syst
b400: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53  em.Data.SQLite.S
b410: 51 4c 69 74 65 33 20 5c 0d 0a 20 20 20 20 20 20  QLite3 \..      
b420: 20 20 20 20 20 20 20 20 49 6e 74 65 72 6f 70 56          InteropV
b430: 65 72 73 69 6f 6e 7d 20 76 65 72 73 69 6f 6e 5d  ersion} version]
b440: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
b450: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
b460: 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
b470: 69 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  if the returned 
b480: 76 65 72 73 69 6f 6e 20 77 61 73 20 6e 75 6c 6c  version was null
b490: 2e 20 20 49 66 20 73 6f 2c 20 6d 61 6b 65 20 69  .  If so, make i
b4a0: 74 20 65 61 73 79 0d 0a 20 20 20 20 20 20 20 20  t easy..        
b4b0: 23 20 20 20 20 20 20 20 74 6f 20 73 70 6f 74 2e  #       to spot.
b4c0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
b4d0: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
b4e0: 20 6c 65 6e 67 74 68 20 24 76 65 72 73 69 6f 6e   length $version
b4f0: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
b500: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 76 65            set ve
b510: 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20 20 20 20  rsion null..    
b520: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
b530: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
b540: 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 71  TE: Attempt to q
b550: 75 65 72 79 20 74 68 65 20 46 6f 73 73 69 6c 20  uery the Fossil 
b560: 73 6f 75 72 63 65 20 69 64 65 6e 74 69 66 69 65  source identifie
b570: 72 20 66 6f 72 20 74 68 65 20 53 51 4c 69 74 65  r for the SQLite
b580: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
b590: 20 20 63 6f 72 65 20 6c 69 62 72 61 72 79 2e 0d    core library..
b5a0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
b5b0: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
b5c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
b5d0: 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
b5e0: 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
b5f0: 63 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  c System.Data.SQ
b600: 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 5c 0d 0a  Lite.SQLite3 \..
b610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b620: 49 6e 74 65 72 6f 70 53 6f 75 72 63 65 49 64 7d  InteropSourceId}
b630: 20 73 6f 75 72 63 65 49 64 5d 7d 20 74 68 65 6e   sourceId]} then
b640: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
b650: 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
b660: 45 3a 20 57 65 20 66 61 69 6c 65 64 20 74 6f 20  E: We failed to 
b670: 71 75 65 72 79 20 74 68 65 20 46 6f 73 73 69 6c  query the Fossil
b680: 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69 66 69   source identifi
b690: 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  er...          #
b6a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
b6b0: 73 6f 75 72 63 65 49 64 20 75 6e 6b 6e 6f 77 6e  sourceId unknown
b6c0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
b6d0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
b6e0: 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
b6f0: 69 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  if the returned 
b700: 46 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64  Fossil source id
b710: 65 6e 74 69 66 69 65 72 20 77 61 73 20 6e 75 6c  entifier was nul
b720: 6c 2e 20 20 49 66 0d 0a 20 20 20 20 20 20 20 20  l.  If..        
b730: 23 20 20 20 20 20 20 20 73 6f 2c 20 6d 61 6b 65  #       so, make
b740: 20 69 74 20 65 61 73 79 20 74 6f 20 73 70 6f 74   it easy to spot
b750: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
b760: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
b770: 67 20 6c 65 6e 67 74 68 20 24 73 6f 75 72 63 65  g length $source
b780: 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  Id] == 0} then {
b790: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
b7a0: 73 6f 75 72 63 65 49 64 20 6e 75 6c 6c 0d 0a 20  sourceId null.. 
b7b0: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
b7c0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
b7d0: 20 4e 4f 54 45 3a 20 59 65 73 2c 20 74 68 65 20   NOTE: Yes, the 
b7e0: 53 51 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61  SQLite interop a
b7f0: 73 73 65 6d 62 6c 79 20 61 70 70 65 61 72 73 20  ssembly appears 
b800: 74 6f 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2e  to be available.
b810: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
b820: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
b830: 6e 74 20 53 51 4c 69 74 65 49 6e 74 65 72 6f 70  nt SQLiteInterop
b840: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74  ....        tput
b850: 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
b860: 6e 64 41 72 67 73 20 22 79 65 73 20 28 22 20 24  ndArgs "yes (" $
b870: 76 65 72 73 69 6f 6e 20 22 20 22 20 24 73 6f 75  version " " $sou
b880: 72 63 65 49 64 20 22 29 5c 6e 22 5d 0d 0a 20 20  rceId ")\n"]..  
b890: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
b8a0: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
b8b0: 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20  nnel no\n..     
b8c0: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
b8d0: 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53    proc checkForS
b8e0: 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74  QLiteDefineConst
b8f0: 61 6e 74 20 7b 20 63 68 61 6e 6e 65 6c 20 6e 61  ant { channel na
b900: 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70  me } {..      tp
b910: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
b920: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
b930: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63        "---- chec
b940: 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e  king for System.
b950: 44 61 74 61 2e 53 51 4c 69 74 65 20 64 65 66 69  Data.SQLite defi
b960: 6e 65 20 63 6f 6e 73 74 61 6e 74 20 5c 22 22 20  ne constant \"" 
b970: 24 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  $name \..       
b980: 20 20 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a     "\"... "]....
b990: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
b9a0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
b9b0: 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
b9c0: 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
b9d0: 63 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  c System.Data.SQ
b9e0: 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 5c 0d 0a  Lite.SQLite3 \..
b9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 44 65                De
ba00: 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73 7d 20 64  fineConstants} d
ba10: 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73 5d 20  efineConstants] 
ba20: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
ba30: 20 20 20 20 20 20 69 66 20 7b 5b 6c 73 65 61 72        if {[lsear
ba40: 63 68 20 2d 65 78 61 63 74 20 2d 6e 6f 63 61 73  ch -exact -nocas
ba50: 65 20 24 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e  e $defineConstan
ba60: 74 73 20 24 6e 61 6d 65 5d 20 21 3d 20 2d 31 7d  ts $name] != -1}
ba70: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
ba80: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
ba90: 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 74 68 69  # NOTE: Yes, thi
baa0: 73 20 64 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e  s define constan
bab0: 74 20 77 61 73 20 65 6e 61 62 6c 65 64 20 77 68  t was enabled wh
bac0: 65 6e 20 74 68 65 20 6d 61 6e 61 67 65 64 0d 0a  en the managed..
bad0: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
bae0: 20 20 61 73 73 65 6d 62 6c 79 20 77 61 73 20 63    assembly was c
baf0: 6f 6d 70 69 6c 65 64 2e 0d 0a 20 20 20 20 20 20  ompiled...      
bb00: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
bb10: 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b   addConstraint [
bb20: 61 70 70 65 6e 64 41 72 67 73 20 64 65 66 69 6e  appendArgs defin
bb30: 65 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74 65 6d  eConstant.System
bb40: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 20 24 6e  .Data.SQLite. $n
bb50: 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ame]....        
bb60: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
bb70: 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 20 20   yes\n..        
bb80: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
bb90: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
bba0: 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 20  el no\n..       
bbb0: 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65   }..      } else
bbc0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
bbd0: 73 20 24 63 68 61 6e 6e 65 6c 20 65 72 72 6f 72  s $channel error
bbe0: 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  \n..      }..   
bbf0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
bc00: 67 65 74 44 61 74 65 54 69 6d 65 46 6f 72 6d 61  getDateTimeForma
bc10: 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  t {} {..      #.
bc20: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
bc30: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 73 69  his procedure si
bc40: 6d 70 6c 79 20 72 65 74 75 72 6e 73 20 74 68 65  mply returns the
bc50: 20 22 64 65 66 61 75 6c 74 22 20 44 61 74 65 54   "default" DateT
bc60: 69 6d 65 20 66 6f 72 6d 61 74 20 75 73 65 64 0d  ime format used.
bc70: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62  .      #       b
bc80: 79 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  y the test suite
bc90: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
bca0: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
bcb0: 74 73 20 3a 3a 64 61 74 65 74 69 6d 65 5f 66 6f  ts ::datetime_fo
bcc0: 72 6d 61 74 5d 20 26 26 20 5c 0d 0a 20 20 20 20  rmat] && \..    
bcd0: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
bce0: 6e 67 74 68 20 24 3a 3a 64 61 74 65 74 69 6d 65  ngth $::datetime
bcf0: 5f 66 6f 72 6d 61 74 5d 20 3e 20 30 7d 20 74 68  _format] > 0} th
bd00: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
bd10: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
bd20: 20 52 65 74 75 72 6e 20 74 68 65 20 6d 61 6e 75   Return the manu
bd30: 61 6c 6c 79 20 6f 76 65 72 72 69 64 64 65 6e 20  ally overridden 
bd40: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 44 61  value for the Da
bd50: 74 65 54 69 6d 65 20 66 6f 72 6d 61 74 2e 0d 0a  teTime format...
bd60: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
bd70: 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 64 61 74     return $::dat
bd80: 65 74 69 6d 65 5f 66 6f 72 6d 61 74 0d 0a 20 20  etime_format..  
bd90: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
bda0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
bdb0: 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20   # NOTE: Return 
bdc0: 61 6e 20 49 53 4f 38 36 30 31 20 44 61 74 65 54  an ISO8601 DateT
bdd0: 69 6d 65 20 66 6f 72 6d 61 74 20 63 6f 6d 70 61  ime format compa
bde0: 74 69 62 6c 65 20 77 69 74 68 20 53 51 4c 69 74  tible with SQLit
bdf0: 65 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  e,..        #   
be00: 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
be10: 53 51 4c 69 74 65 2c 20 61 6e 64 20 73 75 69 74  SQLite, and suit
be20: 61 62 6c 65 20 66 6f 72 20 72 6f 75 6e 64 2d 74  able for round-t
be30: 72 69 70 70 69 6e 67 20 77 69 74 68 20 74 68 65  ripping with the
be40: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
be50: 20 20 44 61 74 65 54 69 6d 65 20 63 6c 61 73 73    DateTime class
be60: 20 6f 66 20 74 68 65 20 66 72 61 6d 65 77 6f 72   of the framewor
be70: 6b 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75  k.  If this valu
be80: 65 20 69 73 20 63 68 61 6e 67 65 64 2c 0d 0a 20  e is changed,.. 
be90: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76         #       v
bea0: 61 72 69 6f 75 73 20 74 65 73 74 73 20 6d 61 79  arious tests may
beb0: 20 66 61 69 6c 2e 0d 0a 20 20 20 20 20 20 20 20   fail...        
bec0: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
bed0: 6e 20 22 79 79 79 79 2d 4d 4d 2d 64 64 20 48 48  n "yyyy-MM-dd HH
bee0: 3a 6d 6d 3a 73 73 2e 46 46 46 46 46 46 46 4b 22  :mm:ss.FFFFFFFK"
bef0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
bf00: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 65 6e  .....    proc en
bf10: 75 6d 65 72 61 62 6c 65 54 6f 4c 69 73 74 20 7b  umerableToList {
bf20: 20 65 6e 75 6d 65 72 61 62 6c 65 20 7d 20 7b 0d   enumerable } {.
bf30: 0a 20 20 20 20 20 20 73 65 74 20 72 65 73 75 6c  .      set resul
bf40: 74 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20  t [list]....    
bf50: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
bf60: 6e 67 74 68 20 24 65 6e 75 6d 65 72 61 62 6c 65  ngth $enumerable
bf70: 5d 20 3d 3d 20 30 20 7c 7c 20 24 65 6e 75 6d 65  ] == 0 || $enume
bf80: 72 61 62 6c 65 20 65 71 20 22 6e 75 6c 6c 22 7d  rable eq "null"}
bf90: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
bfa0: 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d   return $result.
bfb0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
bfc0: 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68    object foreach
bfd0: 20 2d 61 6c 69 61 73 20 69 74 65 6d 20 24 65 6e   -alias item $en
bfe0: 75 6d 65 72 61 62 6c 65 20 7b 0d 0a 20 20 20 20  umerable {..    
bff0: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
c000: 6c 65 6e 67 74 68 20 24 69 74 65 6d 5d 20 3e 20  length $item] > 
c010: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
c020: 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73       lappend res
c030: 75 6c 74 20 5b 24 69 74 65 6d 20 54 6f 53 74 72  ult [$item ToStr
c040: 69 6e 67 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d  ing]..        }.
c050: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
c060: 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74    return $result
c070: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
c080: 70 72 6f 63 20 63 61 74 63 68 41 6e 64 52 65 74  proc catchAndRet
c090: 75 72 6e 20 7b 20 73 63 72 69 70 74 20 7b 73 74  urn { script {st
c0a0: 61 63 6b 54 72 61 63 65 20 66 61 6c 73 65 7d 20  ackTrace false} 
c0b0: 7b 73 74 72 69 63 74 20 74 72 75 65 7d 20 7d 20  {strict true} } 
c0c0: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
c0d0: 20 20 23 20 4e 4f 54 45 3a 20 45 76 61 6c 75 61    # NOTE: Evalua
c0e0: 74 65 20 74 68 65 20 73 63 72 69 70 74 20 70 72  te the script pr
c0f0: 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20 63 61  ovided by our ca
c100: 6c 6c 65 72 20 69 6e 20 74 68 65 69 72 20 63 6f  ller in their co
c110: 6e 74 65 78 74 2c 0d 0a 20 20 20 20 20 20 23 20  ntext,..      # 
c120: 20 20 20 20 20 20 63 61 70 74 75 72 69 6e 67 20        capturing 
c130: 62 6f 74 68 20 74 68 65 20 72 65 73 75 6c 74 20  both the result 
c140: 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e 20 63  and the return c
c150: 6f 64 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ode...      #.. 
c160: 20 20 20 20 20 73 65 74 20 63 6f 64 65 20 5b 63       set code [c
c170: 61 74 63 68 20 7b 75 70 6c 65 76 65 6c 20 31 20  atch {uplevel 1 
c180: 24 73 63 72 69 70 74 7d 20 72 65 73 75 6c 74 5d  $script} result]
c190: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
c1a0: 20 20 20 23 20 4e 4f 54 45 3a 20 44 69 64 20 74     # NOTE: Did t
c1b0: 68 65 20 73 63 72 69 70 74 20 70 72 6f 76 69 64  he script provid
c1c0: 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72  ed by our caller
c1d0: 20 4e 4f 54 20 72 61 69 73 65 20 61 6e 20 65 72   NOT raise an er
c1e0: 72 6f 72 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ror?..      #.. 
c1f0: 20 20 20 20 20 69 66 20 7b 24 73 74 72 69 63 74       if {$strict
c200: 20 26 26 20 24 63 6f 64 65 20 3d 3d 20 30 20 7c   && $code == 0 |
c210: 7c 20 21 24 73 74 72 69 63 74 20 26 26 20 24 63  | !$strict && $c
c220: 6f 64 65 20 21 3d 20 31 7d 20 74 68 65 6e 20 7b  ode != 1} then {
c230: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
c240: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 75 63       # NOTE: Suc
c250: 63 65 73 73 2e 20 20 52 65 74 75 72 6e 20 61 20  cess.  Return a 
c260: 6c 69 73 74 20 77 69 74 68 20 74 68 65 20 72 65  list with the re
c270: 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 74 68  turn code and th
c280: 65 20 72 65 73 75 6c 74 2e 0d 0a 20 20 20 20 20  e result...     
c290: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
c2a0: 74 75 72 6e 20 5b 6c 69 73 74 20 24 63 6f 64 65  turn [list $code
c2b0: 20 24 72 65 73 75 6c 74 5d 0d 0a 20 20 20 20 20   $result]..     
c2c0: 20 7d 20 65 6c 73 65 69 66 20 7b 24 73 74 61 63   } elseif {$stac
c2d0: 6b 54 72 61 63 65 7d 20 74 68 65 6e 20 7b 0d 0a  kTrace} then {..
c2e0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
c2f0: 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 69 6c 75     # NOTE: Failu
c300: 72 65 2e 20 20 4f 75 72 20 63 61 6c 6c 65 72 20  re.  Our caller 
c310: 77 61 6e 74 73 20 61 20 66 75 6c 6c 20 73 74 61  wants a full sta
c320: 63 6b 20 74 72 61 63 65 20 28 69 66 20 61 70 70  ck trace (if app
c330: 6c 69 63 61 62 6c 65 29 2c 0d 0a 20 20 20 20 20  licable),..     
c340: 20 20 20 23 20 20 20 20 20 20 20 72 65 74 75 72     #       retur
c350: 6e 20 61 20 6c 69 73 74 20 77 69 74 68 20 74 68  n a list with th
c360: 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e  e return code an
c370: 64 20 74 68 65 20 72 65 73 75 6c 74 20 76 65 72  d the result ver
c380: 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20  batim...        
c390: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
c3a0: 6e 20 5b 6c 69 73 74 20 24 63 6f 64 65 20 24 72  n [list $code $r
c3b0: 65 73 75 6c 74 5d 0d 0a 20 20 20 20 20 20 7d 20  esult]..      } 
c3c0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
c3d0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
c3e0: 45 3a 20 46 61 69 6c 75 72 65 2e 20 20 4f 75 72  E: Failure.  Our
c3f0: 20 63 61 6c 6c 65 72 20 64 6f 65 73 20 6e 6f 74   caller does not
c400: 20 77 61 6e 74 20 61 20 66 75 6c 6c 20 73 74 61   want a full sta
c410: 63 6b 20 74 72 61 63 65 20 28 69 66 0d 0a 20 20  ck trace (if..  
c420: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 70        #       ap
c430: 70 6c 69 63 61 62 6c 65 29 2c 20 72 65 74 75 72  plicable), retur
c440: 6e 20 61 20 6c 69 73 74 20 77 69 74 68 20 74 68  n a list with th
c450: 65 20 72 65 74 75 72 6e 20 63 6f 64 65 2c 20 74  e return code, t
c460: 68 65 20 65 72 72 6f 72 0d 0a 20 20 20 20 20 20  he error..      
c470: 20 20 23 20 20 20 20 20 20 20 63 6f 64 65 20 66    #       code f
c480: 6f 72 20 74 68 65 20 69 6e 74 65 72 70 72 65 74  or the interpret
c490: 65 72 2c 20 61 6e 64 20 74 68 65 20 65 72 72 6f  er, and the erro
c4a0: 72 20 6d 65 73 73 61 67 65 20 75 70 20 74 6f 20  r message up to 
c4b0: 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  the..        #  
c4c0: 20 20 20 20 20 70 6f 69 6e 74 20 77 68 65 72 65       point where
c4d0: 20 74 68 65 20 73 74 61 63 6b 20 74 72 61 63 65   the stack trace
c4e0: 20 73 68 6f 75 6c 64 20 73 74 61 72 74 2e 0d 0a   should start...
c4f0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
c500: 20 20 20 73 65 74 20 69 6e 64 65 78 20 5b 73 74     set index [st
c510: 72 69 6e 67 20 66 69 72 73 74 20 22 20 20 20 61  ring first "   a
c520: 74 20 22 20 24 72 65 73 75 6c 74 5d 3b 20 23 20  t " $result]; # 
c530: 48 41 43 4b 3a 20 52 65 6c 69 61 62 6c 65 3f 0d  HACK: Reliable?.
c540: 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ...        retur
c550: 6e 20 5b 6c 69 73 74 20 24 63 6f 64 65 20 24 3a  n [list $code $:
c560: 3a 65 72 72 6f 72 43 6f 64 65 20 5b 65 78 70 72  :errorCode [expr
c570: 20 7b 24 69 6e 64 65 78 20 21 3d 20 2d 31 20 3f   {$index != -1 ?
c580: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
c590: 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 5b 73 74  [string trim [st
c5a0: 72 69 6e 67 20 72 61 6e 67 65 20 24 72 65 73 75  ring range $resu
c5b0: 6c 74 20 30 20 24 69 6e 64 65 78 5d 5d 20 3a 20  lt 0 $index]] : 
c5c0: 24 72 65 73 75 6c 74 7d 5d 5d 0d 0a 20 20 20 20  $result}]]..    
c5d0: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
c5e0: 20 20 20 70 72 6f 63 20 63 6f 6d 70 69 6c 65 43     proc compileC
c5f0: 53 68 61 72 70 57 69 74 68 20 7b 0d 0a 20 20 20  SharpWith {..   
c600: 20 20 20 20 20 20 20 20 20 74 65 78 74 20 6d 65           text me
c610: 6d 6f 72 79 20 73 79 6d 62 6f 6c 73 20 73 74 72  mory symbols str
c620: 69 63 74 20 72 65 73 75 6c 74 73 56 61 72 4e 61  ict resultsVarNa
c630: 6d 65 20 65 72 72 6f 72 73 56 61 72 4e 61 6d 65  me errorsVarName
c640: 20 66 69 6c 65 4e 61 6d 65 73 0d 0a 20 20 20 20   fileNames..    
c650: 20 20 20 20 20 20 20 20 61 72 67 73 20 7d 20 7b          args } {
c660: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
c670: 20 23 20 4e 4f 54 45 3a 20 53 69 6e 63 65 20 77   # NOTE: Since w
c680: 65 20 61 72 65 20 67 6f 69 6e 67 20 74 6f 20 75  e are going to u
c690: 73 65 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6e  se this method n
c6a0: 61 6d 65 20 61 20 6c 6f 74 2c 20 61 73 73 69 67  ame a lot, assig
c6b0: 6e 20 69 74 20 74 6f 20 61 0d 0a 20 20 20 20 20  n it to a..     
c6c0: 20 23 20 20 20 20 20 20 20 76 61 72 69 61 62 6c   #       variabl
c6d0: 65 20 66 69 72 73 74 2e 0d 0a 20 20 20 20 20 20  e first...      
c6e0: 23 0d 0a 20 20 20 20 20 20 73 65 74 20 61 64 64  #..      set add
c6f0: 20 52 65 66 65 72 65 6e 63 65 64 41 73 73 65 6d   ReferencedAssem
c700: 62 6c 69 65 73 2e 41 64 64 0d 0a 0d 0a 20 20 20  blies.Add....   
c710: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
c720: 54 45 3a 20 43 72 65 61 74 65 20 74 68 65 20 62  TE: Create the b
c730: 61 73 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65  ase command to e
c740: 76 61 6c 75 61 74 65 20 61 6e 64 20 61 64 64 20  valuate and add 
c750: 74 68 65 20 70 72 6f 70 65 72 74 79 20 73 65 74  the property set
c760: 74 69 6e 67 73 0d 0a 20 20 20 20 20 20 23 20 20  tings..      #  
c770: 20 20 20 20 20 74 68 61 74 20 61 72 65 20 61 6c       that are al
c780: 6d 6f 73 74 20 61 6c 77 61 79 73 20 6e 65 65 64  most always need
c790: 65 64 20 62 79 20 6f 75 72 20 75 6e 69 74 20 74  ed by our unit t
c7a0: 65 73 74 73 20 28 69 2e 65 2e 20 74 68 65 20 53  ests (i.e. the S
c7b0: 79 73 74 65 6d 0d 0a 20 20 20 20 20 20 23 20 20  ystem..      #  
c7c0: 20 20 20 20 20 61 6e 64 20 53 79 73 74 65 6d 2e       and System.
c7d0: 44 61 74 61 20 61 73 73 65 6d 62 6c 79 20 72 65  Data assembly re
c7e0: 66 65 72 65 6e 63 65 73 29 2e 0d 0a 20 20 20 20  ferences)...    
c7f0: 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 63    #..      set c
c800: 6f 6d 6d 61 6e 64 20 5b 6c 69 73 74 20 5c 0d 0a  ommand [list \..
c810: 20 20 20 20 20 20 20 20 20 20 63 6f 6d 70 69 6c            compil
c820: 65 43 53 68 61 72 70 20 24 74 65 78 74 20 24 6d  eCSharp $text $m
c830: 65 6d 6f 72 79 20 24 73 79 6d 62 6f 6c 73 20 24  emory $symbols $
c840: 73 74 72 69 63 74 20 72 65 73 75 6c 74 73 20 65  strict results e
c850: 72 72 6f 72 73 20 5c 0d 0a 20 20 20 20 20 20 20  rrors \..       
c860: 20 20 20 24 61 64 64 20 53 79 73 74 65 6d 2e 64     $add System.d
c870: 6c 6c 20 24 61 64 64 20 53 79 73 74 65 6d 2e 44  ll $add System.D
c880: 61 74 61 2e 64 6c 6c 20 24 61 64 64 20 53 79 73  ata.dll $add Sys
c890: 74 65 6d 2e 54 72 61 6e 73 61 63 74 69 6f 6e 73  tem.Transactions
c8a0: 2e 64 6c 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20  .dll \..        
c8b0: 20 20 24 61 64 64 20 53 79 73 74 65 6d 2e 58 6d    $add System.Xm
c8c0: 6c 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20  l.dll]....      
c8d0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
c8e0: 20 41 64 64 20 61 6c 6c 20 74 68 65 20 70 72 6f   Add all the pro
c8f0: 76 69 64 65 64 20 66 69 6c 65 20 6e 61 6d 65 73  vided file names
c900: 20 61 73 20 61 73 73 65 6d 62 6c 79 20 72 65 66   as assembly ref
c910: 65 72 65 6e 63 65 73 2e 0d 0a 20 20 20 20 20 20  erences...      
c920: 23 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68  #..      foreach
c930: 20 66 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e   fileName $fileN
c940: 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
c950: 6c 61 70 70 65 6e 64 20 63 6f 6d 6d 61 6e 64 20  lappend command 
c960: 24 61 64 64 20 5b 67 65 74 42 69 6e 61 72 79 46  $add [getBinaryF
c970: 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d  ileName $fileNam
c980: 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  e]..      }.... 
c990: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
c9a0: 4e 4f 54 45 3a 20 41 64 64 20 74 68 65 20 65 78  NOTE: Add the ex
c9b0: 74 72 61 20 61 72 67 75 6d 65 6e 74 73 2c 20 69  tra arguments, i
c9c0: 66 20 61 6e 79 2c 20 74 6f 20 74 68 65 20 63 6f  f any, to the co
c9d0: 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 75 61 74  mmand to evaluat
c9e0: 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
c9f0: 20 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20     eval lappend 
ca00: 63 6f 6d 6d 61 6e 64 20 24 61 72 67 73 0d 0a 0d  command $args...
ca10: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
ca20: 23 20 4e 4f 54 45 3a 20 41 6c 69 61 73 20 74 68  # NOTE: Alias th
ca30: 65 20 63 6f 6d 70 69 6c 65 72 20 6c 6f 63 61 6c  e compiler local
ca40: 20 72 65 73 75 6c 74 73 20 61 6e 64 20 65 72 72   results and err
ca50: 6f 72 73 20 76 61 72 69 61 62 6c 65 73 20 74 6f  ors variables to
ca60: 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
ca70: 20 20 20 20 76 61 72 69 61 62 6c 65 20 6e 61 6d      variable nam
ca80: 65 73 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f  es provided by o
ca90: 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20  ur caller...    
caa0: 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72    #..      upvar
cab0: 20 31 20 24 72 65 73 75 6c 74 73 56 61 72 4e 61   1 $resultsVarNa
cac0: 6d 65 20 72 65 73 75 6c 74 73 0d 0a 20 20 20 20  me results..    
cad0: 20 20 75 70 76 61 72 20 31 20 24 65 72 72 6f 72    upvar 1 $error
cae0: 73 56 61 72 4e 61 6d 65 20 65 72 72 6f 72 73 0d  sVarName errors.
caf0: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
cb00: 20 20 23 20 4e 4f 54 45 3a 20 45 76 61 6c 75 61    # NOTE: Evalua
cb10: 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74  te the construct
cb20: 65 64 20 5b 63 6f 6d 70 69 6c 65 43 53 68 61 72  ed [compileCShar
cb30: 70 5d 20 63 6f 6d 6d 61 6e 64 20 61 6e 64 20 72  p] command and r
cb40: 65 74 75 72 6e 20 74 68 65 0d 0a 20 20 20 20 20  eturn the..     
cb50: 20 23 20 20 20 20 20 20 20 72 65 73 75 6c 74 2e   #       result.
cb60: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
cb70: 20 65 76 61 6c 20 24 63 6f 6d 6d 61 6e 64 0d 0a   eval $command..
cb80: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
cb90: 6f 63 20 69 73 4d 65 6d 6f 72 79 44 62 20 7b 20  oc isMemoryDb { 
cba0: 66 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20  fileName } {..  
cbb0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
cbc0: 4f 54 45 3a 20 49 73 20 74 68 65 20 73 70 65 63  OTE: Is the spec
cbd0: 69 66 69 65 64 20 64 61 74 61 62 61 73 65 20 66  ified database f
cbe0: 69 6c 65 20 6e 61 6d 65 20 72 65 61 6c 6c 79 20  ile name really 
cbf0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
cc00: 61 62 61 73 65 3f 0d 0a 20 20 20 20 20 20 23 0d  abase?..      #.
cc10: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65  .      return [e
cc20: 78 70 72 20 7b 24 66 69 6c 65 4e 61 6d 65 20 65  xpr {$fileName e
cc30: 71 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 7c 7c 20  q ":memory:" || 
cc40: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
cc50: 72 69 6e 67 20 72 61 6e 67 65 20 24 66 69 6c 65  ring range $file
cc60: 4e 61 6d 65 20 30 20 31 32 5d 20 65 71 20 22 66  Name 0 12] eq "f
cc70: 69 6c 65 3a 3a 6d 65 6d 6f 72 79 3a 22 7d 5d 0d  ile::memory:"}].
cc80: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
cc90: 72 6f 63 20 69 73 54 61 62 6c 65 49 6e 44 62 20  roc isTableInDb 
cca0: 7b 20 6e 61 6d 65 20 7b 76 61 72 4e 61 6d 65 20  { name {varName 
ccb0: 64 62 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  db} } {..      #
ccc0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
ccd0: 52 65 66 65 72 20 74 6f 20 74 68 65 20 73 70 65  Refer to the spe
cce0: 63 69 66 69 65 64 20 76 61 72 69 61 62 6c 65 20  cified variable 
ccf0: 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74  (e.g. "db") in t
cd00: 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75  he context of ou
cd10: 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  r..      #      
cd20: 20 63 61 6c 6c 65 72 2e 20 20 49 74 20 63 6f 6e   caller.  It con
cd30: 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61  tains the databa
cd40: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  se connection ha
cd50: 6e 64 6c 65 20 74 68 61 74 20 77 69 6c 6c 20 62  ndle that will b
cd60: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
cd70: 20 75 73 65 64 20 74 6f 20 65 78 65 63 75 74 65   used to execute
cd80: 20 74 68 65 20 71 75 65 72 79 20 75 73 65 64 20   the query used 
cd90: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
cda0: 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20  the named table 
cdb0: 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  is..      #     
cdc0: 20 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 61    present in tha
cdd0: 74 20 64 61 74 61 62 61 73 65 2e 0d 0a 20 20 20  t database...   
cde0: 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61     #..      upva
cdf0: 72 20 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d  r 1 $varName db.
ce00: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
ce10: 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68    # NOTE: Use th
ce20: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
ce30: 74 61 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69  table to determi
ce40: 6e 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  ne if the named 
ce50: 74 61 62 6c 65 20 69 73 0d 0a 20 20 20 20 20 20  table is..      
ce60: 23 20 20 20 20 20 20 20 70 72 65 73 65 6e 74 20  #       present 
ce70: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
ce80: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
ce90: 20 73 65 74 20 73 71 6c 20 7b 0d 0a 20 20 20 20   set sql {..    
cea0: 20 20 20 20 53 45 4c 45 43 54 20 43 4f 55 4e 54      SELECT COUNT
ceb0: 28 2a 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  (*) FROM sqlite_
cec0: 6d 61 73 74 65 72 20 57 48 45 52 45 20 74 79 70  master WHERE typ
ced0: 65 20 3d 20 27 74 61 62 6c 65 27 20 41 4e 44 20  e = 'table' AND 
cee0: 6e 61 6d 65 20 3d 20 3f 3b 0d 0a 20 20 20 20 20  name = ?;..     
cef0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
cf00: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74       # NOTE: Ret
cf10: 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  urn non-zero if 
cf20: 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20  the named table 
cf30: 69 73 20 70 72 65 73 65 6e 74 2e 0d 0a 20 20 20  is present...   
cf40: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
cf50: 72 6e 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20  rn [expr {..    
cf60: 20 20 20 20 5b 73 71 6c 20 65 78 65 63 75 74 65      [sql execute
cf70: 20 2d 65 78 65 63 75 74 65 20 73 63 61 6c 61 72   -execute scalar
cf80: 20 24 64 62 20 24 73 71 6c 20 5b 6c 69 73 74 20   $db $sql [list 
cf90: 70 61 72 61 6d 31 20 53 74 72 69 6e 67 20 24 6e  param1 String $n
cfa0: 61 6d 65 5d 5d 20 3e 20 30 0d 0a 20 20 20 20 20  ame]] > 0..     
cfb0: 20 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20   }]..    }..... 
cfc0: 20 20 20 70 72 6f 63 20 74 72 69 6d 53 71 6c 20     proc trimSql 
cfd0: 7b 20 73 71 6c 20 7d 20 7b 0d 0a 20 20 20 20 20  { sql } {..     
cfe0: 20 72 65 74 75 72 6e 20 5b 72 65 67 73 75 62 20   return [regsub 
cff0: 2d 61 6c 6c 20 2d 2d 20 7b 5c 73 2b 7d 20 5b 73  -all -- {\s+} [s
d000: 74 72 69 6e 67 20 74 72 69 6d 20 24 73 71 6c 5d  tring trim $sql]
d010: 20 22 20 22 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d   " "]..    }....
d020: 0a 20 20 20 20 70 72 6f 63 20 65 78 65 63 75 74  .    proc execut
d030: 65 53 71 6c 20 7b 20 73 71 6c 20 7b 65 78 65 63  eSql { sql {exec
d040: 75 74 65 20 6e 6f 6e 65 7d 20 7b 66 6f 72 6d 61  ute none} {forma
d050: 74 20 6e 6f 6e 65 7d 20 7b 66 69 6c 65 4e 61 6d  t none} {fileNam
d060: 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  e ""} } {..     
d070: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
d080: 67 74 68 20 24 66 69 6c 65 4e 61 6d 65 5d 20 3d  gth $fileName] =
d090: 3d 20 30 7d 20 74 68 65 6e 20 7b 73 65 74 20 66  = 0} then {set f
d0a0: 69 6c 65 4e 61 6d 65 20 3a 6d 65 6d 6f 72 79 3a  ileName :memory:
d0b0: 7d 0d 0a 20 20 20 20 20 20 73 65 74 75 70 44 62  }..      setupDb
d0c0: 20 24 66 69 6c 65 4e 61 6d 65 20 22 22 20 22 22   $fileName "" ""
d0d0: 20 22 22 20 22 22 20 22 22 20 66 61 6c 73 65 20   "" "" "" false 
d0e0: 66 61 6c 73 65 20 66 61 6c 73 65 20 66 61 6c 73  false false fals
d0f0: 65 20 64 62 20 74 72 75 65 0d 0a 0d 0a 20 20 20  e db true....   
d100: 20 20 20 74 72 79 20 7b 0d 0a 20 20 20 20 20 20     try {..      
d110: 20 20 72 65 74 75 72 6e 20 5b 75 70 6c 65 76 65    return [upleve
d120: 6c 20 31 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20  l 1 [list \..   
d130: 20 20 20 20 20 20 20 20 20 73 71 6c 20 65 78 65           sql exe
d140: 63 75 74 65 20 2d 65 78 65 63 75 74 65 20 24 65  cute -execute $e
d150: 78 65 63 75 74 65 20 2d 66 6f 72 6d 61 74 20 24  xecute -format $
d160: 66 6f 72 6d 61 74 20 24 64 62 20 24 73 71 6c 5d  format $db $sql]
d170: 5d 0d 0a 20 20 20 20 20 20 7d 20 66 69 6e 61 6c  ]..      } final
d180: 6c 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6c  ly {..        cl
d190: 65 61 6e 75 70 44 62 20 24 66 69 6c 65 4e 61 6d  eanupDb $fileNam
d1a0: 65 20 64 62 20 66 61 6c 73 65 20 66 61 6c 73 65  e db false false
d1b0: 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 7d 0d   false..      }.
d1c0: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
d1d0: 72 6f 63 20 67 65 74 43 6f 6e 6e 65 63 74 69 6f  roc getConnectio
d1e0: 6e 46 6c 61 67 73 20 7b 20 66 69 6c 65 4e 61 6d  nFlags { fileNam
d1f0: 65 20 66 6c 61 67 73 20 7b 71 75 69 65 74 20 66  e flags {quiet f
d200: 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  alse} } {..     
d210: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
d220: 3a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 69  : Figure out whi
d230: 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ch database file
d240: 20 6e 61 6d 65 20 6f 72 20 63 6f 6e 6e 65 63 74   name or connect
d250: 69 6f 6e 20 73 74 72 69 6e 67 20 74 68 65 73 65  ion string these
d260: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
d270: 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
d280: 20 77 69 6c 6c 20 61 63 74 75 61 6c 6c 79 20 61   will actually a
d290: 70 70 6c 79 20 74 6f 2e 20 20 54 68 69 73 20 69  pply to.  This i
d2a0: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 0d  s not necessary.
d2b0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69  .      #       i
d2c0: 6e 20 71 75 69 65 74 20 6d 6f 64 65 20 62 65 63  n quiet mode bec
d2d0: 61 75 73 65 20 74 68 69 73 20 69 6e 66 6f 72 6d  ause this inform
d2e0: 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73  ation is only us
d2f0: 65 64 20 66 6f 72 20 6c 6f 67 67 69 6e 67 0d 0a  ed for logging..
d300: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6e        #       an
d310: 64 20 72 65 70 6f 72 74 69 6e 67 20 70 75 72 70  d reporting purp
d320: 6f 73 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  oses...      #..
d330: 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
d340: 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
d350: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
d360: 65 6e 67 74 68 20 24 66 69 6c 65 4e 61 6d 65 5d  ength $fileName]
d370: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
d380: 20 20 20 20 20 20 20 20 73 65 74 20 64 61 74 61          set data
d390: 62 61 73 65 20 5b 61 70 70 65 6e 64 41 72 67 73  base [appendArgs
d3a0: 20 22 66 69 6c 65 20 6e 61 6d 65 20 5c 22 22 20   "file name \"" 
d3b0: 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5d 0d 0a 20  $fileName \"].. 
d3c0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20         } elseif 
d3d0: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
d3e0: 64 61 74 61 53 6f 75 72 63 65 5d 20 26 26 20 5c  dataSource] && \
d3f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 21 5b  ..            ![
d400: 61 72 72 61 79 20 65 78 69 73 74 73 20 3a 3a 64  array exists ::d
d410: 61 74 61 53 6f 75 72 63 65 5d 7d 20 74 68 65 6e  ataSource]} then
d420: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
d430: 74 20 64 61 74 61 62 61 73 65 20 5b 61 70 70 65  t database [appe
d440: 6e 64 41 72 67 73 20 22 64 61 74 61 20 73 6f 75  ndArgs "data sou
d450: 72 63 65 20 5c 22 22 20 24 3a 3a 64 61 74 61 53  rce \"" $::dataS
d460: 6f 75 72 63 65 20 5c 22 5d 0d 0a 20 20 20 20 20  ource \"]..     
d470: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
d480: 20 20 20 20 20 20 20 73 65 74 20 64 61 74 61 62         set datab
d490: 61 73 65 20 3c 75 6e 6b 6e 6f 77 6e 3e 0d 0a 20  ase <unknown>.. 
d4a0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
d4b0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
d4c0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77      # NOTE: Show
d4d0: 20 28 61 6e 64 20 6c 6f 67 29 20 74 68 65 20 6c   (and log) the l
d4e0: 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ocal connection 
d4f0: 66 6c 61 67 73 20 61 6e 64 20 74 68 65 20 61 73  flags and the as
d500: 73 6f 63 69 61 74 65 64 0d 0a 20 20 20 20 20 20  sociated..      
d510: 23 20 20 20 20 20 20 20 64 61 74 61 20 73 6f 75  #       data sou
d520: 72 63 65 20 6f 72 20 66 69 6c 65 20 6e 61 6d 65  rce or file name
d530: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
d540: 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
d550: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  hen {..        t
d560: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
d570: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
d580: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
d590: 22 2d 2d 2d 2d 20 6c 6f 63 61 6c 20 63 6f 6e 6e  "---- local conn
d5a0: 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 66 6f 72  ection flags for
d5b0: 20 22 20 24 64 61 74 61 62 61 73 65 20 5c 0d 0a   " $database \..
d5c0: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 61 72              " ar
d5d0: 65 3a 20 22 20 5b 65 78 70 72 20 7b 5b 73 74 72  e: " [expr {[str
d5e0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 6c 61 67  ing length $flag
d5f0: 73 5d 20 3e 20 30 20 3f 20 5c 0d 0a 20 20 20 20  s] > 0 ? \..    
d600: 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41          [appendA
d610: 72 67 73 20 5c 22 20 24 66 6c 61 67 73 20 5c 22  rgs \" $flags \"
d620: 5d 20 3a 20 22 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c  ] : "<none>"}] \
d630: 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  n]..      }.... 
d640: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
d650: 4e 4f 54 45 3a 20 49 66 20 74 68 65 72 65 20 61  NOTE: If there a
d660: 72 65 20 61 6e 79 20 67 6c 6f 62 61 6c 20 28 70  re any global (p
d670: 65 72 20 74 65 73 74 20 72 75 6e 29 20 63 6f 6e  er test run) con
d680: 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 63 75  nection flags cu
d690: 72 72 65 6e 74 6c 79 0d 0a 20 20 20 20 20 20 23  rrently..      #
d6a0: 20 20 20 20 20 20 20 73 65 74 2c 20 75 73 65 20         set, use 
d6b0: 74 68 65 6d 20 6e 6f 77 20 28 69 2e 65 2e 20 62  them now (i.e. b
d6c0: 79 20 63 6f 6d 62 69 6e 69 6e 67 20 74 68 65 6d  y combining them
d6d0: 20 77 69 74 68 20 74 68 65 20 6f 6e 65 73 20 66   with the ones f
d6e0: 6f 72 20 74 68 69 73 0d 0a 20 20 20 20 20 20 23  or this..      #
d6f0: 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f         connectio
d700: 6e 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  n)...      #..  
d710: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
d720: 69 73 74 73 20 3a 3a 63 6f 6e 6e 65 63 74 69 6f  ists ::connectio
d730: 6e 5f 66 6c 61 67 73 5d 20 26 26 20 5c 0d 0a 20  n_flags] && \.. 
d740: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
d750: 20 6c 65 6e 67 74 68 20 24 3a 3a 63 6f 6e 6e 65   length $::conne
d760: 63 74 69 6f 6e 5f 66 6c 61 67 73 5d 20 3e 20 30  ction_flags] > 0
d770: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
d780: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
d790: 4f 54 45 3a 20 53 68 6f 77 20 28 61 6e 64 20 6c  OTE: Show (and l
d7a0: 6f 67 29 20 74 68 65 20 64 65 74 65 63 74 65 64  og) the detected
d7b0: 20 67 6c 6f 62 61 6c 20 63 6f 6e 6e 65 63 74 69   global connecti
d7c0: 6f 6e 20 66 6c 61 67 73 2e 0d 0a 20 20 20 20 20  on flags...     
d7d0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
d7e0: 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
d7f0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
d800: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
d810: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
d820: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
d830: 22 2d 2d 2d 2d 20 67 6c 6f 62 61 6c 20 63 6f 6e  "---- global con
d840: 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 64 65  nection flags de
d850: 74 65 63 74 65 64 3a 20 22 20 5c 0d 0a 20 20 20  tected: " \..   
d860: 20 20 20 20 20 20 20 20 20 20 20 5b 65 78 70 72             [expr
d870: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
d880: 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67  :connection_flag
d890: 73 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  s] && \..       
d8a0: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
d8b0: 65 6e 67 74 68 20 24 3a 3a 63 6f 6e 6e 65 63 74  ength $::connect
d8c0: 69 6f 6e 5f 66 6c 61 67 73 5d 20 3e 20 30 20 3f  ion_flags] > 0 ?
d8d0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
d8e0: 20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22    [appendArgs \"
d8f0: 20 24 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66   $::connection_f
d900: 6c 61 67 73 20 5c 22 5d 20 3a 20 22 3c 6e 6f 6e  lags \"] : "<non
d910: 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20  e>"}] \n]..     
d920: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
d930: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
d940: 45 3a 20 43 6f 6d 62 69 6e 65 20 61 6e 64 2f 6f  E: Combine and/o
d950: 72 20 72 65 70 6c 61 63 65 20 74 68 65 20 63 6f  r replace the co
d960: 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 61  nnection flags a
d970: 6e 64 20 74 68 65 6e 20 73 68 6f 77 20 74 68 65  nd then show the
d980: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
d990: 20 20 6e 65 77 20 76 61 6c 75 65 2e 0d 0a 20 20    new value...  
d9a0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
d9b0: 20 73 65 74 20 66 6c 61 67 73 20 5b 63 6f 6d 62   set flags [comb
d9c0: 69 6e 65 46 6c 61 67 73 20 24 66 6c 61 67 73 20  ineFlags $flags 
d9d0: 24 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c  $::connection_fl
d9e0: 61 67 73 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ags]....        
d9f0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
da00: 45 3a 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f 67  E: Show (and log
da10: 29 20 74 68 65 20 6e 65 77 20 65 66 66 65 63 74  ) the new effect
da20: 69 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  ive connection f
da30: 6c 61 67 73 2e 0d 0a 20 20 20 20 20 20 20 20 23  lags...        #
da40: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24  ..        if {!$
da50: 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
da60: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
da70: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
da80: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
da90: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
daa0: 2d 20 63 6f 6d 62 69 6e 65 64 20 63 6f 6e 6e 65  - combined conne
dab0: 63 74 69 6f 6e 20 66 6c 61 67 73 20 66 6f 72 20  ction flags for 
dac0: 22 20 24 64 61 74 61 62 61 73 65 20 5c 0d 0a 20  " $database \.. 
dad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 61               " a
dae0: 72 65 3a 20 22 20 5b 65 78 70 72 20 7b 5b 73 74  re: " [expr {[st
daf0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 6c 61  ring length $fla
db00: 67 73 5d 20 3e 20 30 20 3f 20 5c 0d 0a 20 20 20  gs] > 0 ? \..   
db10: 20 20 20 20 20 20 20 20 20 20 20 5b 61 70 70 65             [appe
db20: 6e 64 41 72 67 73 20 5c 22 20 24 66 6c 61 67 73  ndArgs \" $flags
db30: 20 5c 22 5d 20 3a 20 22 3c 6e 6f 6e 65 3e 22 7d   \"] : "<none>"}
db40: 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d  ] \n]..        }
db50: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
db60: 20 20 20 72 65 74 75 72 6e 20 24 66 6c 61 67 73     return $flags
db70: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
db80: 70 72 6f 63 20 67 65 74 46 6c 61 67 73 50 72 6f  proc getFlagsPro
db90: 70 65 72 74 79 20 7b 20 7b 66 6c 61 67 73 20 22  perty { {flags "
dba0: 22 7d 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d  "} {quiet false}
dbb0: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
dbc0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 65 74       # NOTE: Det
dbd0: 65 72 6d 69 6e 65 20 77 68 61 74 20 74 68 65 20  ermine what the 
dbe0: 63 6f 6d 62 69 6e 65 64 20 28 67 6c 6f 62 61 6c  combined (global
dbf0: 20 61 6e 64 20 6c 6f 63 61 6c 29 20 63 6f 6e 6e   and local) conn
dc00: 65 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20  ection..      # 
dc10: 20 20 20 20 20 20 66 6c 61 67 73 20 73 68 6f 75        flags shou
dc20: 6c 64 20 62 65 2c 20 70 6f 73 73 69 62 6c 79 20  ld be, possibly 
dc30: 71 75 69 65 74 6c 79 2e 0d 0a 20 20 20 20 20 20  quietly...      
dc40: 23 0d 0a 20 20 20 20 20 20 73 65 74 20 66 6c 61  #..      set fla
dc50: 67 73 20 5b 67 65 74 43 6f 6e 6e 65 63 74 69 6f  gs [getConnectio
dc60: 6e 46 6c 61 67 73 20 22 22 20 24 66 6c 61 67 73  nFlags "" $flags
dc70: 20 24 71 75 69 65 74 5d 0d 0a 0d 0a 20 20 20 20   $quiet]....    
dc80: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
dc90: 45 3a 20 49 66 20 6e 6f 20 67 6c 6f 62 61 6c 20  E: If no global 
dca0: 6f 72 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74  or local connect
dcb0: 69 6f 6e 20 66 6c 61 67 73 20 77 65 72 65 20 73  ion flags were s
dcc0: 70 65 63 69 66 69 65 64 2c 20 74 68 65 0d 0a 20  pecified, the.. 
dcd0: 20 20 20 20 20 23 20 20 20 20 20 20 20 64 65 66       #       def
dce0: 61 75 6c 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ault connection 
dcf0: 66 6c 61 67 73 20 73 68 6f 75 6c 64 20 62 65 20  flags should be 
dd00: 75 73 65 64 3b 20 74 68 65 72 65 66 6f 72 65 2c  used; therefore,
dd10: 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 23   return..      #
dd20: 20 20 20 20 20 20 20 61 6e 20 65 6d 70 74 79 20         an empty 
dd30: 73 74 72 69 6e 67 20 69 6e 20 74 68 61 74 20 63  string in that c
dd40: 61 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ase...      #.. 
dd50: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
dd60: 20 6c 65 6e 67 74 68 20 24 66 6c 61 67 73 5d 20   length $flags] 
dd70: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
dd80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d        return "".
dd90: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
dda0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
ddb0: 45 3a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 63  E: In order to c
ddc0: 68 65 63 6b 20 69 66 20 74 68 65 20 64 65 66 61  heck if the defa
ddd0: 75 6c 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  ult connection f
dde0: 6c 61 67 73 20 61 72 65 20 62 65 69 6e 67 20 75  lags are being u
ddf0: 73 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20  sed..      #    
de00: 20 20 20 69 74 20 69 73 20 6e 65 63 65 73 73 61     it is necessa
de10: 72 79 20 74 6f 20 61 74 74 65 6d 70 74 20 61 20  ry to attempt a 
de20: 63 6f 6e 76 65 72 73 69 6f 6e 20 74 6f 20 74 68  conversion to th
de30: 65 20 61 63 74 75 61 6c 20 65 6e 75 6d 65 72 61  e actual enumera
de40: 74 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ted..      #    
de50: 20 20 20 74 79 70 65 2e 20 20 46 61 69 6c 69 6e     type.  Failin
de60: 67 20 74 68 61 74 2c 20 74 68 65 20 63 68 65 63  g that, the chec
de70: 6b 20 61 67 61 69 6e 73 74 20 74 68 65 20 64 65  k against the de
de80: 66 61 75 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c  fault value will
de90: 20 62 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20   be..      #    
dea0: 20 20 20 73 6b 69 70 70 65 64 2e 0d 0a 20 20 20     skipped...   
deb0: 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
dec0: 65 72 72 6f 72 20 6e 75 6c 6c 3b 20 23 20 49 47  error null; # IG
ded0: 4e 4f 52 45 44 0d 0a 20 20 20 20 20 20 73 65 74  NORED..      set
dee0: 20 76 61 6c 75 65 20 5b 6f 62 6a 65 63 74 20 69   value [object i
def0: 6e 76 6f 6b 65 20 55 74 69 6c 69 74 79 20 54 72  nvoke Utility Tr
df00: 79 50 61 72 73 65 46 6c 61 67 73 45 6e 75 6d 20  yParseFlagsEnum 
df10: 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
df20: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
df30: 74 65 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74  te.SQLiteConnect
df40: 69 6f 6e 46 6c 61 67 73 20 22 22 20 24 66 6c 61  ionFlags "" $fla
df50: 67 73 20 6e 75 6c 6c 20 74 72 75 65 20 5c 0d 0a  gs null true \..
df60: 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 5d            error]
df70: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
df80: 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68     # NOTE: If th
df90: 65 20 63 6f 6d 62 69 6e 65 64 20 66 6c 61 67 73  e combined flags
dfa0: 20 73 74 72 69 6e 67 20 63 6f 75 6c 64 20 6e 6f   string could no
dfb0: 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 63 6f  t actually be co
dfc0: 6e 76 65 72 74 65 64 0d 0a 20 20 20 20 20 20 23  nverted..      #
dfd0: 20 20 20 20 20 20 20 74 6f 20 74 68 65 20 65 6e         to the en
dfe0: 75 6d 65 72 61 74 65 64 20 74 79 70 65 20 69 74  umerated type it
dff0: 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20   is the default 
e000: 76 61 6c 75 65 2c 20 74 68 65 6e 20 6a 75 73 74  value, then just
e010: 20 75 73 65 0d 0a 20 20 20 20 20 20 23 20 20 20   use..      #   
e020: 20 20 20 20 69 74 20 76 65 72 62 61 74 69 6d 3b      it verbatim;
e030: 20 6f 74 68 65 72 77 69 73 65 2c 20 6a 75 73 74   otherwise, just
e040: 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79   return an empty
e050: 20 73 74 72 69 6e 67 2e 20 20 49 6e 20 74 68 61   string.  In tha
e060: 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  t..      #      
e070: 20 63 61 73 65 2c 20 74 68 65 20 64 65 66 61 75   case, the defau
e080: 6c 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c  lt connection fl
e090: 61 67 73 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ags will be used
e0a0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
e0b0: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
e0c0: 6e 67 74 68 20 24 76 61 6c 75 65 5d 20 3d 3d 20  ngth $value] == 
e0d0: 30 20 7c 7c 20 24 76 61 6c 75 65 20 6e 65 20 22  0 || $value ne "
e0e0: 44 65 66 61 75 6c 74 22 7d 20 74 68 65 6e 20 7b  Default"} then {
e0f0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
e100: 20 20 20 20 20 23 20 57 41 52 4e 49 4e 47 3a 20       # WARNING: 
e110: 54 68 69 73 20 72 65 74 75 72 6e 73 20 74 68 65  This returns the
e120: 20 73 74 72 69 6e 67 20 76 61 6c 75 65 20 6f 66   string value of
e130: 20 74 68 65 20 63 6f 6d 62 69 6e 65 64 20 66 6c   the combined fl
e140: 61 67 73 2c 20 6e 6f 74 0d 0a 20 20 20 20 20 20  ags, not..      
e150: 20 20 23 20 20 20 20 20 20 20 20 20 20 74 68 65    #          the
e160: 20 65 6e 75 6d 65 72 61 74 65 64 20 76 61 6c 75   enumerated valu
e170: 65 2e 20 20 54 68 69 73 20 69 73 20 62 79 20 64  e.  This is by d
e180: 65 73 69 67 6e 20 61 6e 64 20 73 68 6f 75 6c 64  esign and should
e190: 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20 23 20   not..        # 
e1a0: 20 20 20 20 20 20 20 20 20 62 65 20 63 68 61 6e           be chan
e1b0: 67 65 64 20 77 69 74 68 6f 75 74 20 63 61 72 65  ged without care
e1c0: 66 75 6c 20 63 6f 6e 73 69 64 65 72 61 74 69 6f  ful consideratio
e1d0: 6e 20 28 65 2e 67 2e 20 69 74 20 77 6f 75 6c 64  n (e.g. it would
e1e0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
e1f0: 20 20 20 20 20 70 72 65 76 65 6e 74 20 74 68 65       prevent the
e200: 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f   SQLiteConnectio
e210: 6e 20 63 6c 61 73 73 20 66 72 6f 6d 20 61 6c 6c  n class from all
e220: 6f 77 69 6e 67 20 69 6e 76 61 6c 69 64 0d 0a 20  owing invalid.. 
e230: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
e240: 20 20 5b 22 6d 61 67 69 63 61 6c 22 5d 20 6d 65    ["magical"] me
e250: 74 61 2d 66 6c 61 67 73 29 2e 0d 0a 20 20 20 20  ta-flags)...    
e260: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
e270: 65 74 75 72 6e 20 5b 61 70 70 65 6e 64 41 72 67  eturn [appendArg
e280: 73 20 22 46 6c 61 67 73 3d 22 20 24 66 6c 61 67  s "Flags=" $flag
e290: 73 20 5c 3b 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  s \;]..      }..
e2a0: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 22  ..      return "
e2b0: 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  "..    }.....   
e2c0: 20 70 72 6f 63 20 73 65 74 75 70 44 62 20 7b 0d   proc setupDb {.
e2d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c  .            fil
e2e0: 65 4e 61 6d 65 20 7b 6d 6f 64 65 20 22 22 7d 20  eName {mode ""} 
e2f0: 7b 64 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 20  {dateTimeFormat 
e300: 22 22 7d 20 7b 64 61 74 65 54 69 6d 65 4b 69 6e  ""} {dateTimeKin
e310: 64 20 22 22 7d 20 7b 66 6c 61 67 73 20 22 22 7d  d ""} {flags ""}
e320: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 65  ..            {e
e330: 78 74 72 61 20 22 22 7d 20 7b 71 75 61 6c 69 66  xtra ""} {qualif
e340: 79 20 74 72 75 65 7d 20 7b 64 65 6c 65 74 65 20  y true} {delete 
e350: 74 72 75 65 7d 20 7b 75 72 69 20 66 61 6c 73 65  true} {uri false
e360: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  }..            {
e370: 74 65 6d 70 6f 72 61 72 79 20 74 72 75 65 7d 20  temporary true} 
e380: 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20 7b 71 75  {varName db} {qu
e390: 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  iet false} } {..
e3a0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
e3b0: 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20 73 65   NOTE: First, se
e3c0: 65 20 69 66 20 6f 75 72 20 63 61 6c 6c 65 72 20  e if our caller 
e3d0: 68 61 73 20 72 65 71 75 65 73 74 65 64 20 61 6e  has requested an
e3e0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
e3f0: 61 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ase...      #.. 
e400: 20 20 20 20 20 73 65 74 20 69 73 4d 65 6d 6f 72       set isMemor
e410: 79 20 5b 69 73 4d 65 6d 6f 72 79 44 62 20 24 66  y [isMemoryDb $f
e420: 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20  ileName]....    
e430: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
e440: 45 3a 20 46 6f 72 20 6e 6f 77 2c 20 61 6c 6c 20  E: For now, all 
e450: 74 65 73 74 20 64 61 74 61 62 61 73 65 73 20 75  test databases u
e460: 73 65 64 20 62 79 20 74 68 65 20 74 65 73 74 20  sed by the test 
e470: 73 75 69 74 65 20 61 72 65 20 70 6c 61 63 65 64  suite are placed
e480: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
e490: 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
e4a0: 65 20 64 69 72 65 63 74 6f 72 79 2e 20 20 45 61  e directory.  Ea
e4b0: 63 68 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ch database and 
e4c0: 72 65 6c 61 74 65 64 20 66 69 6c 65 73 0d 0a 20  related files.. 
e4d0: 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73 65       #       use
e4e0: 64 20 62 79 20 61 20 74 65 73 74 20 73 68 6f 75  d by a test shou
e4f0: 6c 64 20 62 65 20 63 6c 65 61 6e 65 64 20 75 70  ld be cleaned up
e500: 20 62 79 20 74 68 61 74 20 74 65 73 74 20 75 73   by that test us
e510: 69 6e 67 20 74 68 65 0d 0a 20 20 20 20 20 20 23  ing the..      #
e520: 20 20 20 20 20 20 20 22 63 6c 65 61 6e 75 70 44         "cleanupD
e530: 62 22 20 70 72 6f 63 65 64 75 72 65 2c 20 62 65  b" procedure, be
e540: 6c 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  low...      #.. 
e550: 20 20 20 20 20 69 66 20 7b 21 24 69 73 4d 65 6d       if {!$isMem
e560: 6f 72 79 20 26 26 20 24 71 75 61 6c 69 66 79 7d  ory && $qualify}
e570: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
e580: 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66   set fileName [f
e590: 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 44 61 74  ile join [getDat
e5a0: 61 62 61 73 65 44 69 72 65 63 74 6f 72 79 5d 20  abaseDirectory] 
e5b0: 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65  [file tail $file
e5c0: 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d  Name]]..      }.
e5d0: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
e5e0: 20 20 23 20 4e 4f 54 45 3a 20 42 79 20 64 65 66    # NOTE: By def
e5f0: 61 75 6c 74 2c 20 64 65 6c 65 74 65 20 61 6e 79  ault, delete any
e600: 20 70 72 65 2d 65 78 69 73 74 69 6e 67 20 64 61   pre-existing da
e610: 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20  tabase with the 
e620: 73 61 6d 65 20 66 69 6c 65 0d 0a 20 20 20 20 20  same file..     
e630: 20 23 20 20 20 20 20 20 20 6e 61 6d 65 20 69 66   #       name if
e640: 20 69 74 20 63 75 72 72 65 6e 74 6c 79 20 65 78   it currently ex
e650: 69 73 74 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ists...      #..
e660: 20 20 20 20 20 20 69 66 20 7b 21 24 69 73 4d 65        if {!$isMe
e670: 6d 6f 72 79 20 26 26 20 24 64 65 6c 65 74 65 20  mory && $delete 
e680: 26 26 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20  && [file exists 
e690: 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  $fileName]} then
e6a0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
e6b0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41         # NOTE: A
e6c0: 74 74 65 6d 70 74 20 74 6f 20 64 65 6c 65 74 65  ttempt to delete
e6d0: 20 61 6e 79 20 70 72 65 2d 65 78 69 73 74 69 6e   any pre-existin
e6e0: 67 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20  g database with 
e6f0: 74 68 65 20 73 61 6d 65 20 66 69 6c 65 0d 0a 20  the same file.. 
e700: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e         #       n
e710: 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ame...        #.
e720: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
e730: 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65  tch {file delete
e740: 20 24 66 69 6c 65 4e 61 6d 65 7d 20 65 72 72 6f   $fileName} erro
e750: 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  r]} then {..    
e760: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
e770: 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f     # NOTE: We so
e780: 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f 20  mehow failed to 
e790: 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 2c  delete the file,
e7a0: 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20   report why...  
e7b0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
e7c0: 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
e7d0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
e7e0: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
e7f0: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
e800: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
e810: 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
e820: 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
e830: 20 74 6f 20 64 65 6c 65 74 65 20 64 61 74 61 62   to delete datab
e840: 61 73 65 20 66 69 6c 65 20 5c 22 22 20 24 66 69  ase file \"" $fi
e850: 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  leName \..      
e860: 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 64 75            "\" du
e870: 72 69 6e 67 20 73 65 74 75 70 2c 20 65 72 72 6f  ring setup, erro
e880: 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72  r: " \n\t $error
e890: 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
e8a0: 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
e8b0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
e8c0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
e8d0: 52 65 66 65 72 20 74 6f 20 74 68 65 20 73 70 65  Refer to the spe
e8e0: 63 69 66 69 65 64 20 76 61 72 69 61 62 6c 65 20  cified variable 
e8f0: 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74  (e.g. "db") in t
e900: 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75  he context of ou
e910: 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  r..      #      
e920: 20 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 68 61   caller.  The ha
e930: 6e 64 6c 65 20 74 6f 20 74 68 65 20 6f 70 65 6e  ndle to the open
e940: 65 64 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c  ed database will
e950: 20 62 65 20 73 74 6f 72 65 64 20 74 68 65 72 65   be stored there
e960: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
e970: 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
e980: 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23  me db....      #
e990: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
e9a0: 53 74 61 72 74 20 62 75 69 6c 64 69 6e 67 20 74  Start building t
e9b0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74  he connection st
e9c0: 72 69 6e 67 2e 20 20 54 68 65 20 6f 6e 6c 79 20  ring.  The only 
e9d0: 72 65 71 75 69 72 65 64 20 70 6f 72 74 69 6f 6e  required portion
e9e0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
e9f0: 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  of the connectio
ea00: 6e 20 73 74 72 69 6e 67 20 69 73 20 74 68 65 20  n string is the 
ea10: 64 61 74 61 20 73 6f 75 72 63 65 2c 20 77 68 69  data source, whi
ea20: 63 68 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0d  ch contains the.
ea30: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64  .      #       d
ea40: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
ea50: 65 20 69 74 73 65 6c 66 2e 20 20 49 66 20 6f 75  e itself.  If ou
ea60: 72 20 63 61 6c 6c 65 72 20 77 61 6e 74 73 20 74  r caller wants t
ea70: 6f 20 75 73 65 20 61 20 55 52 49 20 61 73 0d 0a  o use a URI as..
ea80: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
ea90: 65 20 64 61 74 61 20 73 6f 75 72 63 65 2c 20 75  e data source, u
eaa0: 73 65 20 74 68 65 20 46 75 6c 6c 55 72 69 20 63  se the FullUri c
eab0: 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67  onnection string
eac0: 20 70 72 6f 70 65 72 74 79 20 74 6f 0d 0a 20 20   property to..  
ead0: 20 20 20 20 23 20 20 20 20 20 20 20 70 72 65 76      #       prev
eae0: 65 6e 74 20 74 68 65 20 64 61 74 61 20 73 6f 75  ent the data sou
eaf0: 72 63 65 20 73 74 72 69 6e 67 20 66 72 6f 6d 20  rce string from 
eb00: 62 65 69 6e 67 20 6d 61 6e 67 6c 65 64 2e 0d 0a  being mangled...
eb10: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
eb20: 66 20 7b 24 75 72 69 7d 20 74 68 65 6e 20 7b 0d  f {$uri} then {.
eb30: 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 6e  .        set con
eb40: 6e 65 63 74 69 6f 6e 20 7b 46 75 6c 6c 55 72 69  nection {FullUri
eb50: 3d 24 7b 66 69 6c 65 4e 61 6d 65 7d 7d 0d 0a 20  =${fileName}}.. 
eb60: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
eb70: 20 20 20 20 20 20 20 73 65 74 20 63 6f 6e 6e 65         set conne
eb80: 63 74 69 6f 6e 20 7b 44 61 74 61 20 53 6f 75 72  ction {Data Sour
eb90: 63 65 3d 24 7b 66 69 6c 65 4e 61 6d 65 7d 7d 0d  ce=${fileName}}.
eba0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
ebb0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
ebc0: 45 3a 20 53 69 6e 63 65 20 74 68 69 73 20 70 72  E: Since this pr
ebd0: 6f 63 65 64 75 72 65 20 68 61 73 20 6e 6f 20 73  ocedure has no s
ebe0: 70 65 63 69 61 6c 20 6b 6e 6f 77 6c 65 64 67 65  pecial knowledge
ebf0: 20 6f 66 20 77 68 61 74 20 74 68 65 20 64 65 66   of what the def
ec00: 61 75 6c 74 0d 0a 20 20 20 20 20 20 23 20 20 20  ault..      #   
ec10: 20 20 20 20 73 65 74 74 69 6e 67 20 69 73 20 66      setting is f
ec20: 6f 72 20 74 68 65 20 54 6f 46 75 6c 6c 50 61 74  or the ToFullPat
ec30: 68 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72  h connection str
ec40: 69 6e 67 20 70 72 6f 70 65 72 79 2c 20 61 6c 77  ing propery, alw
ec50: 61 79 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ays..      #    
ec60: 20 20 20 61 64 64 20 74 68 65 20 76 61 6c 75 65     add the value
ec70: 20 77 65 20 6b 6e 6f 77 20 61 62 6f 75 74 20 74   we know about t
ec80: 6f 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  o the connection
ec90: 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20   string...      
eca0: 23 0d 0a 20 20 20 20 20 20 61 70 70 65 6e 64 20  #..      append 
ecb0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 54 6f 46  connection {;ToF
ecc0: 75 6c 6c 50 61 74 68 3d 24 7b 71 75 61 6c 69 66  ullPath=${qualif
ecd0: 79 7d 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  y}}....      #..
ece0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
ecf0: 20 6f 75 72 20 63 61 6c 6c 65 72 20 73 70 65 63   our caller spec
ed00: 69 66 69 65 64 20 61 20 6a 6f 75 72 6e 61 6c 20  ified a journal 
ed10: 6d 6f 64 65 2c 20 61 64 64 20 74 68 65 20 6e 65  mode, add the ne
ed20: 63 65 73 73 61 72 79 20 70 6f 72 74 69 6f 6e 0d  cessary portion.
ed30: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f  .      #       o
ed40: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
ed50: 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20   string now...  
ed60: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
ed70: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
ed80: 24 6d 6f 64 65 5d 20 3e 20 30 7d 20 74 68 65 6e  $mode] > 0} then
ed90: 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65   {..        appe
eda0: 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b  nd connection {;
edb0: 4a 6f 75 72 6e 61 6c 20 4d 6f 64 65 3d 24 7b 6d  Journal Mode=${m
edc0: 6f 64 65 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a  ode}}..      }..
edd0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
ede0: 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20   # NOTE: If our 
edf0: 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64  caller specified
ee00: 20 61 20 44 61 74 65 54 69 6d 65 20 66 6f 72 6d   a DateTime form
ee10: 61 74 2c 20 61 64 64 20 74 68 65 20 6e 65 63 65  at, add the nece
ee20: 73 73 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20  ssary..      #  
ee30: 20 20 20 20 20 70 6f 72 74 69 6f 6e 20 6f 66 20       portion of 
ee40: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  the connection s
ee50: 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20  tring now...    
ee60: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
ee70: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 64  string length $d
ee80: 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 5d 20 3e  ateTimeFormat] >
ee90: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
eea0: 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65      append conne
eeb0: 63 74 69 6f 6e 20 7b 3b 44 61 74 65 54 69 6d 65  ction {;DateTime
eec0: 46 6f 72 6d 61 74 3d 24 7b 64 61 74 65 54 69 6d  Format=${dateTim
eed0: 65 46 6f 72 6d 61 74 7d 7d 0d 0a 20 20 20 20 20  eFormat}}..     
eee0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
eef0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
ef00: 6f 75 72 20 63 61 6c 6c 65 72 20 73 70 65 63 69  our caller speci
ef10: 66 69 65 64 20 61 20 44 61 74 65 54 69 6d 65 4b  fied a DateTimeK
ef20: 69 6e 64 2c 20 61 64 64 20 74 68 65 20 6e 65 63  ind, add the nec
ef30: 65 73 73 61 72 79 20 70 6f 72 74 69 6f 6e 0d 0a  essary portion..
ef40: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 66        #       of
ef50: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
ef60: 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20  string now...   
ef70: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
ef80: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
ef90: 64 61 74 65 54 69 6d 65 4b 69 6e 64 5d 20 3e 20  dateTimeKind] > 
efa0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
efb0: 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63     append connec
efc0: 74 69 6f 6e 20 7b 3b 44 61 74 65 54 69 6d 65 4b  tion {;DateTimeK
efd0: 69 6e 64 3d 24 7b 64 61 74 65 54 69 6d 65 4b 69  ind=${dateTimeKi
efe0: 6e 64 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  nd}}..      }...
eff0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
f000: 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f  # NOTE: Figure o
f010: 75 74 20 77 68 61 74 20 74 68 65 20 66 69 6e 61  ut what the fina
f020: 6c 20 66 6c 61 67 73 20 66 6f 72 20 74 68 69 73  l flags for this
f030: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 65 65 64   connection need
f040: 20 74 6f 20 62 65 2e 0d 0a 20 20 20 20 20 20 23   to be...      #
f050: 0d 0a 20 20 20 20 20 20 73 65 74 20 66 6c 61 67  ..      set flag
f060: 73 20 5b 67 65 74 43 6f 6e 6e 65 63 74 69 6f 6e  s [getConnection
f070: 46 6c 61 67 73 20 24 66 69 6c 65 4e 61 6d 65 20  Flags $fileName 
f080: 24 66 6c 61 67 73 20 24 71 75 69 65 74 5d 0d 0a  $flags $quiet]..
f090: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
f0a0: 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20   # NOTE: If our 
f0b0: 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64  caller specified
f0c0: 20 73 6f 6d 65 20 53 51 4c 69 74 65 43 6f 6e 6e   some SQLiteConn
f0d0: 65 63 74 69 6f 6e 46 6c 61 67 73 2c 20 61 64 64  ectionFlags, add
f0e0: 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
f0f0: 20 20 20 20 6e 65 63 65 73 73 61 72 79 20 70 6f      necessary po
f100: 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6e  rtion of the con
f110: 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e  nection string n
f120: 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ow...      #..  
f130: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
f140: 6c 65 6e 67 74 68 20 24 66 6c 61 67 73 5d 20 3e  length $flags] >
f150: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
f160: 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65      append conne
f170: 63 74 69 6f 6e 20 7b 3b 46 6c 61 67 73 3d 24 7b  ction {;Flags=${
f180: 66 6c 61 67 73 7d 7d 0d 0a 20 20 20 20 20 20 7d  flags}}..      }
f190: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
f1a0: 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75     # NOTE: If ou
f1b0: 72 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69  r caller specifi
f1c0: 65 64 20 61 6e 20 65 78 74 72 61 20 70 61 79 6c  ed an extra payl
f1d0: 6f 61 64 20 74 6f 20 74 68 65 20 63 6f 6e 6e 65  oad to the conne
f1e0: 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20  ction..      #  
f1f0: 20 20 20 20 20 73 74 72 69 6e 67 2c 20 61 70 70       string, app
f200: 65 6e 64 20 69 74 20 6e 6f 77 2e 0d 0a 20 20 20  end it now...   
f210: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
f220: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
f230: 65 78 74 72 61 5d 20 3e 20 30 7d 20 74 68 65 6e  extra] > 0} then
f240: 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65   {..        appe
f250: 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 3b  nd connection \;
f260: 20 24 65 78 74 72 61 0d 0a 20 20 20 20 20 20 7d   $extra..      }
f270: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
f280: 20 20 20 23 20 4e 4f 54 45 3a 20 4f 70 65 6e 20     # NOTE: Open 
f290: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
f2a0: 6e 65 63 74 69 6f 6e 20 6e 6f 77 2c 20 70 6c 61  nection now, pla
f2b0: 63 69 6e 67 20 74 68 65 20 6f 70 61 71 75 65 20  cing the opaque 
f2c0: 68 61 6e 64 6c 65 20 76 61 6c 75 65 0d 0a 20 20  handle value..  
f2d0: 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 74 6f      #       into
f2e0: 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 73 70   the variable sp
f2f0: 65 63 69 66 69 65 64 20 62 79 20 6f 75 72 20 63  ecified by our c
f300: 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d  aller...      #.
f310: 0a 20 20 20 20 20 20 73 65 74 20 64 62 20 5b 73  .      set db [s
f320: 71 6c 20 6f 70 65 6e 20 2d 74 79 70 65 20 53 51  ql open -type SQ
f330: 4c 69 74 65 20 5b 73 75 62 73 74 20 24 63 6f 6e  Lite [subst $con
f340: 6e 65 63 74 69 6f 6e 5d 5d 0d 0a 0d 0a 20 20 20  nection]]....   
f350: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
f360: 54 45 3a 20 43 6f 6e 66 69 67 75 72 65 20 74 68  TE: Configure th
f370: 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65  e temporary dire
f380: 63 74 6f 72 79 20 66 6f 72 20 74 68 65 20 6e 65  ctory for the ne
f390: 77 6c 79 20 6f 70 65 6e 65 64 20 64 61 74 61 62  wly opened datab
f3a0: 61 73 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ase..      #    
f3b0: 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f     connection no
f3c0: 77 20 75 6e 6c 65 73 73 20 6f 75 72 20 63 61 6c  w unless our cal
f3d0: 6c 65 72 20 66 6f 72 62 69 64 73 20 69 74 2e 0d  ler forbids it..
f3e0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
f3f0: 69 66 20 7b 24 74 65 6d 70 6f 72 61 72 79 20 26  if {$temporary &
f400: 26 20 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  & ![info exists 
f410: 3a 3a 6e 6f 28 73 65 74 54 65 6d 70 6f 72 61 72  ::no(setTemporar
f420: 79 44 69 72 65 63 74 6f 72 79 29 5d 7d 20 74 68  yDirectory)]} th
f430: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 71  en {..        sq
f440: 6c 20 65 78 65 63 75 74 65 20 24 64 62 20 5b 61  l execute $db [a
f450: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
f460: 20 20 20 20 20 20 20 20 20 22 50 52 41 47 4d 41           "PRAGMA
f470: 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65   temp_store_dire
f480: 63 74 6f 72 79 20 3d 20 5c 22 22 20 5b 67 65 74  ctory = \"" [get
f490: 54 65 6d 70 6f 72 61 72 79 44 69 72 65 63 74 6f  TemporaryDirecto
f4a0: 72 79 5d 20 5c 22 5c 3b 5d 0d 0a 20 20 20 20 20  ry] \"\;]..     
f4b0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
f4c0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 6c 77       # NOTE: Alw
f4d0: 61 79 73 20 72 65 74 75 72 6e 20 74 68 65 20 63  ays return the c
f4e0: 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65  onnection handle
f4f0: 20 75 70 6f 6e 20 73 75 63 63 65 73 73 2e 0d 0a   upon success...
f500: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72        #..      r
f510: 65 74 75 72 6e 20 24 64 62 0d 0a 20 20 20 20 7d  eturn $db..    }
f520: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
f530: 74 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20  tDbConnection { 
f540: 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b  {varName db} } {
f550: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
f560: 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74   # NOTE: Refer t
f570: 6f 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  o the specified 
f580: 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22  variable (e.g. "
f590: 64 62 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74  db") in the cont
f5a0: 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20  ext of our..    
f5b0: 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72    #       caller
f5c0: 2e 20 20 54 68 65 20 68 61 6e 64 6c 65 20 74 6f  .  The handle to
f5d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 72   the database pr
f5e0: 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20  eviously opened 
f5f0: 76 69 61 20 74 68 65 0d 0a 20 20 20 20 20 20 23  via the..      #
f600: 20 20 20 20 20 20 20 5b 73 65 74 75 70 44 62 5d         [setupDb]
f610: 20 70 72 6f 63 65 64 75 72 65 20 73 68 6f 75 6c   procedure shoul
f620: 64 20 62 65 20 73 74 6f 72 65 64 20 74 68 65 72  d be stored ther
f630: 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
f640: 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e     upvar 1 $varN
f650: 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20  ame db....      
f660: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
f670: 20 54 68 69 73 20 72 65 74 75 72 6e 73 20 74 68   This returns th
f680: 65 20 41 44 4f 2e 4e 45 54 20 49 44 62 43 6f 6e  e ADO.NET IDbCon
f690: 6e 65 63 74 69 6f 6e 20 6f 62 6a 65 63 74 20 69  nection object i
f6a0: 6e 73 74 61 6e 63 65 20 66 6f 72 20 74 68 65 0d  nstance for the.
f6b0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
f6c0: 70 65 63 69 66 69 65 64 20 64 61 74 61 62 73 65  pecified databse
f6d0: 20 68 61 6e 64 6c 65 2e 20 20 53 69 6e 63 65 20   handle.  Since 
f6e0: 67 65 74 74 69 6e 67 20 74 68 69 73 20 6f 62 6a  getting this obj
f6f0: 65 63 74 20 72 65 6c 69 65 73 20 75 70 6f 6e 0d  ect relies upon.
f700: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45  .      #       E
f710: 61 67 6c 65 20 69 6e 74 65 72 6e 61 6c 73 2c 20  agle internals, 
f720: 67 72 65 61 74 20 63 61 72 65 20 73 68 6f 75 6c  great care shoul
f730: 64 20 62 65 20 74 61 6b 65 6e 20 74 6f 20 61 76  d be taken to av
f740: 6f 69 64 20 64 69 73 70 6f 73 69 6e 67 20 6f 66  oid disposing of
f750: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
f760: 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 6f  this object or o
f770: 74 68 65 72 77 69 73 65 20 70 75 74 74 69 6e 67  therwise putting
f780: 20 69 74 20 69 6e 74 6f 20 61 6e 20 69 6e 76 61   it into an inva
f790: 6c 69 64 20 73 74 61 74 65 2e 0d 0a 20 20 20 20  lid state...    
f7a0: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
f7b0: 69 6e 66 6f 20 65 78 69 73 74 73 20 64 62 5d 7d  info exists db]}
f7c0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
f7d0: 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
f7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
f7f0: 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
f800: 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d  ags +NonPublic -
f810: 6f 62 6a 65 63 74 66 6c 61 67 73 20 2b 4e 6f 44  objectflags +NoD
f820: 69 73 70 6f 73 65 20 5c 0d 0a 20 20 20 20 20 20  ispose \..      
f830: 20 20 20 20 20 20 20 20 20 20 2d 61 6c 69 61 73            -alias
f840: 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74   Interpreter.Get
f850: 41 63 74 69 76 65 2e 63 6f 6e 6e 65 63 74 69 6f  Active.connectio
f860: 6e 73 20 49 74 65 6d 20 24 64 62 7d 20 5c 0d 0a  ns Item $db} \..
f870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f880: 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68  result] == 0} th
f890: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
f8a0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
f8b0: 4f 54 45 3a 20 53 75 63 63 65 73 73 2c 20 72 65  OTE: Success, re
f8c0: 74 75 72 6e 20 74 68 65 20 6f 70 61 71 75 65 20  turn the opaque 
f8d0: 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 2e 0d 0a  object handle...
f8e0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
f8f0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72         return $r
f900: 65 73 75 6c 74 0d 0a 20 20 20 20 20 20 20 20 7d  esult..        }
f910: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
f920: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
f930: 23 20 4e 4f 54 45 3a 20 46 61 69 6c 75 72 65 2c  # NOTE: Failure,
f940: 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20   report why...  
f950: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
f960: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
f970: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
f980: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
f990: 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
f9a0: 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
f9b0: 20 67 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   get connection 
f9c0: 68 61 6e 64 6c 65 20 66 6f 72 20 64 61 74 61 62  handle for datab
f9d0: 61 73 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ase \"" \..     
f9e0: 20 20 20 20 20 20 20 20 20 24 64 62 20 22 5c 22           $db "\"
f9f0: 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  , error: " \n\t 
fa00: 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
fa10: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
fa20: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
fa30: 72 6f 63 20 66 72 65 65 44 62 43 6f 6e 6e 65 63  roc freeDbConnec
fa40: 74 69 6f 6e 20 7b 20 7b 76 61 72 4e 61 6d 65 20  tion { {varName 
fa50: 63 6f 6e 6e 65 63 74 69 6f 6e 7d 20 7d 20 7b 0d  connection} } {.
fa60: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
fa70: 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f  # NOTE: Refer to
fa80: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76   the specified v
fa90: 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 63  ariable (e.g. "c
faa0: 6f 6e 6e 65 63 74 69 6f 6e 22 29 20 69 6e 20 74  onnection") in t
fab0: 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
fac0: 20 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72    context of our
fad0: 20 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 6f 70   caller.  The op
fae0: 61 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64  aque object hand
faf0: 6c 65 20 66 6f 72 20 61 6e 20 41 44 4f 2e 4e 45  le for an ADO.NE
fb00: 54 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  T..      #      
fb10: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 65 76   connection prev
fb20: 69 6f 75 73 6c 79 20 72 65 74 75 72 6e 65 64 20  iously returned 
fb30: 62 79 20 5b 67 65 74 44 62 43 6f 6e 6e 65 63 74  by [getDbConnect
fb40: 69 6f 6e 5d 20 73 68 6f 75 6c 64 20 62 65 0d 0a  ion] should be..
fb50: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 74        #       st
fb60: 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a 20 20 20  ored there...   
fb70: 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61     #..      upva
fb80: 72 20 31 20 24 76 61 72 4e 61 6d 65 20 63 6f 6e  r 1 $varName con
fb90: 6e 65 63 74 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20  nection....     
fba0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
fbb0: 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 72 65 6d  : Attempt to rem
fbc0: 6f 76 65 20 74 68 65 20 6f 70 61 71 75 65 20 6f  ove the opaque o
fbd0: 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 66 72 6f  bject handle fro
fbe0: 6d 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65  m the interprete
fbf0: 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  r..      #      
fc00: 20 6e 6f 77 2e 20 20 54 68 69 73 20 5b 6f 62 6a   now.  This [obj
fc10: 65 63 74 20 64 69 73 70 6f 73 65 5d 20 63 61 6c  ect dispose] cal
fc20: 6c 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61  l will not actua
fc30: 6c 6c 79 20 64 69 73 70 6f 73 65 20 6f 66 20 74  lly dispose of t
fc40: 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
fc50: 20 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 62 6a    underlying obj
fc60: 65 63 74 20 62 65 63 61 75 73 65 20 74 68 65 20  ect because the 
fc70: 2b 4e 6f 44 69 73 70 6f 73 65 20 66 6c 61 67 20  +NoDispose flag 
fc80: 77 61 73 20 73 65 74 20 6f 6e 20 69 74 0d 0a 20  was set on it.. 
fc90: 20 20 20 20 20 23 20 20 20 20 20 20 20 64 75 72       #       dur
fca0: 69 6e 67 20 63 72 65 61 74 69 6f 6e 20 6f 66 20  ing creation of 
fcb0: 74 68 65 20 6f 70 61 71 75 65 20 6f 62 6a 65 63  the opaque objec
fcc0: 74 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20  t handle...     
fcd0: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
fce0: 6e 66 6f 20 65 78 69 73 74 73 20 63 6f 6e 6e 65  nfo exists conne
fcf0: 63 74 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20 20 20  ction] && \..   
fd00: 20 20 20 20 20 20 20 5b 63 61 74 63 68 20 7b 6f         [catch {o
fd10: 62 6a 65 63 74 20 64 69 73 70 6f 73 65 20 24 63  bject dispose $c
fd20: 6f 6e 6e 65 63 74 69 6f 6e 7d 20 65 72 72 6f 72  onnection} error
fd30: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
fd40: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
fd50: 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77  NOTE: We somehow
fd60: 20 66 61 69 6c 65 64 20 74 6f 20 72 65 6d 6f 76   failed to remov
fd70: 65 20 74 68 65 20 68 61 6e 64 6c 65 2c 20 72 65  e the handle, re
fd80: 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20  port why...     
fd90: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70     #..        tp
fda0: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
fdb0: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
fdc0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
fdd0: 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
fde0: 69 6c 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 63  iled to remove c
fdf0: 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65  onnection handle
fe00: 20 5c 22 22 20 24 63 6f 6e 6e 65 63 74 69 6f 6e   \"" $connection
fe10: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
fe20: 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e  "\", error: " \n
fe30: 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20  \t $error \n].. 
fe40: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
fe50: 0d 0a 20 20 20 20 70 72 6f 63 20 61 64 64 44 62  ..    proc addDb
fe60: 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20 63 6f 6e  Connection { con
fe70: 6e 65 63 74 69 6f 6e 20 7b 76 61 72 4e 61 6d 65  nection {varName
fe80: 20 64 62 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20   db} } {..      
fe90: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
fea0: 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 73 70   Refer to the sp
feb0: 65 63 69 66 69 65 64 20 76 61 72 69 61 62 6c 65  ecified variable
fec0: 20 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20   (e.g. "db") in 
fed0: 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f  the context of o
fee0: 75 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ur..      #     
fef0: 20 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20    caller...     
ff00: 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20   #..      upvar 
ff10: 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d  1 $varName db...
ff20: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
ff30: 23 20 4e 4f 54 45 3a 20 43 72 65 61 74 65 20 61  # NOTE: Create a
ff40: 20 63 6f 72 72 65 63 74 6c 79 20 66 6f 72 6d 61   correctly forma
ff50: 74 74 65 64 20 6e 61 6d 65 20 66 6f 72 20 74 68  tted name for th
ff60: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
ff70: 63 74 69 6f 6e 20 74 6f 0d 0a 20 20 20 20 20 20  ction to..      
ff80: 23 20 20 20 20 20 20 20 62 65 20 61 64 64 65 64  #       be added
ff90: 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6d 61 6e   to the list man
ffa0: 61 67 65 64 20 62 79 20 74 68 65 20 45 61 67 6c  aged by the Eagl
ffb0: 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a  e interpreter...
ffc0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73        #..      s
ffd0: 65 74 20 64 62 20 5b 6f 62 6a 65 63 74 20 69 6e  et db [object in
ffe0: 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
fff0: 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
10000 20 20 20 20 45 61 67 6c 65 2e 5f 43 6f 6d 70 6f      Eagle._Compo
10010 6e 65 6e 74 73 2e 50 72 69 76 61 74 65 2e 46 6f  nents.Private.Fo
10020 72 6d 61 74 4f 70 73 20 44 61 74 61 62 61 73 65  rmatOps Database
10030 4f 62 6a 65 63 74 4e 61 6d 65 20 24 63 6f 6e 6e  ObjectName $conn
10040 65 63 74 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20  ection \..      
10050 20 20 20 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63      SQLiteConnec
10060 74 69 6f 6e 20 5b 6f 62 6a 65 63 74 20 69 6e 76  tion [object inv
10070 6f 6b 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e  oke Interpreter.
10080 47 65 74 41 63 74 69 76 65 20 4e 65 78 74 49 64  GetActive NextId
10090 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ]]....      #.. 
100a0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64       # NOTE: Add
100b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
100c0 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 76 69 64 65  nnection provide
100d0 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 20  d by our caller 
100e0 74 6f 20 74 68 65 20 6c 69 73 74 0d 0a 20 20 20  to the list..   
100f0 20 20 20 23 20 20 20 20 20 20 20 6f 66 20 74 68     #       of th
10100 6f 73 65 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 65  ose known to the
10110 20 45 61 67 6c 65 20 69 6e 74 65 72 70 72 65 74   Eagle interpret
10120 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  er...      #..  
10130 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
10140 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
10150 6c 69 63 20 49 6e 74 65 72 70 72 65 74 65 72 2e  lic Interpreter.
10160 47 65 74 41 63 74 69 76 65 2e 63 6f 6e 6e 65 63  GetActive.connec
10170 74 69 6f 6e 73 20 41 64 64 20 5c 0d 0a 20 20 20  tions Add \..   
10180 20 20 20 20 20 20 20 24 64 62 20 24 63 6f 6e 6e         $db $conn
10190 65 63 74 69 6f 6e 0d 0a 20 20 20 20 7d 0d 0a 0c  ection..    }...
101a0 0d 0a 20 20 20 20 70 72 6f 63 20 63 6c 65 61 6e  ..    proc clean
101b0 75 70 44 62 20 7b 20 66 69 6c 65 4e 61 6d 65 20  upDb { fileName 
101c0 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20 7b 63 6f  {varName db} {co
101d0 6c 6c 65 63 74 20 74 72 75 65 7d 20 7b 71 75 61  llect true} {qua
101e0 6c 69 66 79 20 74 72 75 65 7d 0d 0a 20 20 20 20  lify true}..    
101f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10200 20 7b 64 65 6c 65 74 65 20 74 72 75 65 7d 20 7d   {delete true} }
10210 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
10220 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
10230 70 74 20 74 6f 20 66 6f 72 63 65 20 61 6c 6c 20  pt to force all 
10240 70 65 6e 64 69 6e 67 20 22 67 61 72 62 61 67 65  pending "garbage
10250 22 20 6f 62 6a 65 63 74 73 20 74 6f 20 62 65 20  " objects to be 
10260 63 6f 6c 6c 65 63 74 65 64 2c 0d 0a 20 20 20 20  collected,..    
10270 20 20 23 20 20 20 20 20 20 20 69 6e 63 6c 75 64    #       includ
10280 69 6e 67 20 53 51 4c 69 74 65 20 73 74 61 74 65  ing SQLite state
10290 6d 65 6e 74 73 20 61 6e 64 20 62 61 63 6b 75 70  ments and backup
102a0 20 6f 62 6a 65 63 74 73 3b 20 74 68 69 73 20 73   objects; this s
102b0 68 6f 75 6c 64 20 61 6c 6c 6f 77 0d 0a 20 20 20  hould allow..   
102c0 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 75     #       the u
102d0 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
102e0 73 65 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65  se file to be de
102f0 6c 65 74 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d  leted...      #.
10300 0a 20 20 20 20 20 20 69 66 20 7b 24 63 6f 6c 6c  .      if {$coll
10310 65 63 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ect} then {..   
10320 20 20 20 20 20 63 6f 6c 6c 65 63 74 47 61 72 62       collectGarb
10330 61 67 65 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  age $::test_chan
10340 6e 65 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  nel..      }....
10350 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
10360 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20   NOTE: Refer to 
10370 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61  the specified va
10380 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62  riable (e.g. "db
10390 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78  ") in the contex
103a0 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20  t of our..      
103b0 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20  #       caller. 
103c0 20 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 74   The handle to t
103d0 68 65 20 64 61 74 61 62 61 73 65 20 70 72 65 76  he database prev
103e0 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 76 69  iously opened vi
103f0 61 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  a the..      #  
10400 20 20 20 20 20 5b 73 65 74 75 70 44 62 5d 20 70       [setupDb] p
10410 72 6f 63 65 64 75 72 65 20 73 68 6f 75 6c 64 20  rocedure should 
10420 62 65 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e  be stored there.
10430 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
10440 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d   upvar 1 $varNam
10450 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  e db....      #.
10460 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43  .      # NOTE: C
10470 6c 6f 73 65 20 74 68 65 20 63 6f 6e 6e 65 63 74  lose the connect
10480 69 6f 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ion to the datab
10490 61 73 65 20 6e 6f 77 2e 20 20 54 68 69 73 20 73  ase now.  This s
104a0 68 6f 75 6c 64 20 61 6c 6c 6f 77 20 75 73 0d 0a  hould allow us..
104b0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f        #       to
104c0 20 64 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65   delete the unde
104d0 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
104e0 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  file...      #..
104f0 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
10500 65 78 69 73 74 73 20 64 62 5d 20 26 26 20 5b 63  exists db] && [c
10510 61 74 63 68 20 7b 73 71 6c 20 63 6c 6f 73 65 20  atch {sql close 
10520 24 64 62 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65  $db} error]} the
10530 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
10540 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
10550 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65  We somehow faile
10560 64 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 64  d to close the d
10570 61 74 61 62 61 73 65 2c 20 72 65 70 6f 72 74 20  atabase, report 
10580 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  why...        #.
10590 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
105a0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
105b0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
105c0 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
105d0 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
105e0 74 6f 20 63 6c 6f 73 65 20 64 61 74 61 62 61 73  to close databas
105f0 65 20 5c 22 22 20 24 64 62 20 22 5c 22 2c 20 65  e \"" $db "\", e
10600 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20  rror: " \..     
10610 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 65 72 72         \n\t $err
10620 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d  or \n]..      }.
10630 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
10640 20 20 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c    # NOTE: First,
10650 20 73 65 65 20 69 66 20 6f 75 72 20 63 61 6c 6c   see if our call
10660 65 72 20 68 61 73 20 72 65 71 75 65 73 74 65 64  er has requested
10670 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
10680 74 61 62 61 73 65 2e 0d 0a 20 20 20 20 20 20 23  tabase...      #
10690 0d 0a 20 20 20 20 20 20 73 65 74 20 69 73 4d 65  ..      set isMe
106a0 6d 6f 72 79 20 5b 69 73 4d 65 6d 6f 72 79 44 62  mory [isMemoryDb
106b0 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20   $fileName].... 
106c0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
106d0 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20  NOTE: Build the 
106e0 66 75 6c 6c 20 70 61 74 68 20 74 6f 20 74 68 65  full path to the
106f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
10700 61 6d 65 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 61  ame.  For now, a
10710 6c 6c 20 74 65 73 74 0d 0a 20 20 20 20 20 20 23  ll test..      #
10720 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
10730 66 69 6c 65 73 20 61 72 65 20 73 74 6f 72 65 64  files are stored
10740 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72   in the temporar
10750 79 20 64 69 72 65 63 74 6f 72 79 2e 0d 0a 20 20  y directory...  
10760 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
10770 7b 21 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24  {!$isMemory && $
10780 71 75 61 6c 69 66 79 7d 20 74 68 65 6e 20 7b 0d  qualify} then {.
10790 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c  .        set fil
107a0 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  eName [file join
107b0 20 5b 67 65 74 44 61 74 61 62 61 73 65 44 69 72   [getDatabaseDir
107c0 65 63 74 6f 72 79 5d 20 5b 66 69 6c 65 20 74 61  ectory] [file ta
107d0 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a  il $fileName]]..
107e0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
107f0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
10800 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 66  : Check if the f
10810 69 6c 65 20 73 74 69 6c 6c 20 65 78 69 73 74 73  ile still exists
10820 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
10830 20 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72 79    if {!$isMemory
10840 20 26 26 20 24 64 65 6c 65 74 65 20 26 26 20 5b   && $delete && [
10850 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c  file exists $fil
10860 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
10870 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
10880 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20     # NOTE: Skip 
10890 64 65 6c 65 74 69 6e 67 20 64 61 74 61 62 61 73  deleting databas
108a0 65 20 66 69 6c 65 73 20 69 66 20 73 6f 6d 65 62  e files if someb
108b0 6f 64 79 20 73 65 74 73 20 74 68 65 20 67 6c 6f  ody sets the glo
108c0 62 61 6c 0d 0a 20 20 20 20 20 20 20 20 23 20 20  bal..        #  
108d0 20 20 20 20 20 76 61 72 69 61 62 6c 65 20 74 6f       variable to
108e0 20 70 72 65 76 65 6e 74 20 69 74 2e 0d 0a 20 20   prevent it...  
108f0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
10900 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
10910 74 73 20 3a 3a 6e 6f 28 63 6c 65 61 6e 75 70 44  ts ::no(cleanupD
10920 62 46 69 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d  bFile)]} then {.
10930 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
10940 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
10950 41 74 74 65 6d 70 74 20 74 6f 20 64 65 6c 65 74  Attempt to delet
10960 65 20 74 68 65 20 74 65 73 74 20 64 61 74 61 62  e the test datab
10970 61 73 65 20 66 69 6c 65 20 6e 6f 77 2e 0d 0a 20  ase file now... 
10980 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
10990 20 20 20 20 20 20 69 66 20 7b 5b 73 65 74 20 63        if {[set c
109a0 6f 64 65 20 5b 63 61 74 63 68 20 7b 66 69 6c 65  ode [catch {file
109b0 20 64 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d   delete $fileNam
109c0 65 7d 20 65 72 72 6f 72 5d 5d 7d 20 74 68 65 6e  e} error]]} then
109d0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
109e0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  #..            #
109f0 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f   NOTE: We someho
10a00 77 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65  w failed to dele
10a10 74 65 20 74 68 65 20 66 69 6c 65 2c 20 72 65 70  te the file, rep
10a20 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20  ort why...      
10a30 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
10a40 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
10a50 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
10a60 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
10a70 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
10a80 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
10a90 74 6f 20 64 65 6c 65 74 65 20 64 61 74 61 62 61  to delete databa
10aa0 73 65 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c  se file \"" $fil
10ab0 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  eName \..       
10ac0 20 20 20 20 20 20 20 20 20 22 5c 22 20 64 75 72           "\" dur
10ad0 69 6e 67 20 63 6c 65 61 6e 75 70 2c 20 65 72 72  ing cleanup, err
10ae0 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f  or: " \n\t $erro
10af0 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  r \n]..         
10b00 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c   }..        } el
10b10 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
10b20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
10b30 4f 54 45 3a 20 53 68 6f 77 20 74 68 61 74 20 77  OTE: Show that w
10b40 65 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69  e skipped deleti
10b50 6e 67 20 74 68 65 20 66 69 6c 65 2e 0d 0a 20 20  ng the file...  
10b60 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
10b70 20 20 20 20 20 73 65 74 20 63 6f 64 65 20 30 0d       set code 0.
10b80 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  ...          tpu
10b90 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
10ba0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
10bb0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
10bc0 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 73  "==== WARNING: s
10bd0 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20  kipped deleting 
10be0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 5c 22  database file \"
10bf0 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  " $fileName \.. 
10c00 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22               "\"
10c10 20 64 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 5c   during cleanup\
10c20 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  n"]..        }..
10c30 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
10c40 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
10c50 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 66     # NOTE: The f
10c60 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
10c70 73 74 2c 20 73 75 63 63 65 73 73 21 0d 0a 20 20  st, success!..  
10c80 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
10c90 20 73 65 74 20 63 6f 64 65 20 30 0d 0a 20 20 20   set code 0..   
10ca0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
10cb0 74 75 72 6e 20 24 63 6f 64 65 0d 0a 20 20 20 20  turn $code..    
10cc0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73  }.....    proc s
10cd0 65 74 75 70 44 62 49 6e 74 65 72 72 75 70 74 43  etupDbInterruptC
10ce0 61 6c 6c 62 61 63 6b 20 7b 20 63 68 61 6e 6e 65  allback { channe
10cf0 6c 20 6c 6f 67 20 7d 20 7b 0d 0a 20 20 20 20 20  l log } {..     
10d00 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
10d10 22 2d 2d 2d 2d 20 73 65 74 74 69 6e 67 20 75 70  "---- setting up
10d20 20 64 65 62 75 67 67 65 72 20 69 6e 74 65 72 72   debugger interr
10d30 75 70 74 20 63 61 6c 6c 62 61 63 6b 2e 2e 2e 20  upt callback... 
10d40 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  "....      if {[
10d50 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
10d60 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
10d70 54 45 3a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  TE: Make sure th
10d80 65 20 73 63 72 69 70 74 20 64 65 62 75 67 67 65  e script debugge
10d90 72 20 61 6e 64 20 74 68 65 20 69 73 6f 6c 61 74  r and the isolat
10da0 65 64 20 69 6e 74 65 72 70 72 65 74 65 72 20 61  ed interpreter a
10db0 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  re..        #   
10dc0 20 20 20 20 73 65 74 75 70 20 61 6e 64 20 72 65      setup and re
10dd0 61 64 79 20 66 6f 72 20 75 73 65 2e 0d 0a 20 20  ady for use...  
10de0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
10df0 20 64 65 62 75 67 20 73 65 74 75 70 20 74 72 75   debug setup tru
10e00 65 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20  e true....      
10e10 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
10e20 4f 54 45 3a 20 4c 6f 61 64 20 74 68 65 20 6e 65  OTE: Load the ne
10e30 63 65 73 73 61 72 79 20 70 61 63 6b 61 67 65 73  cessary packages
10e40 20 69 6e 74 6f 20 74 68 65 20 69 73 6f 6c 61 74   into the isolat
10e50 65 64 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d  ed interpreter..
10e60 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
10e70 20 20 20 20 64 65 62 75 67 20 65 76 61 6c 20 7b      debug eval {
10e80 0d 0a 20 20 20 20 20 20 20 20 20 20 70 61 63 6b  ..          pack
10e90 61 67 65 20 72 65 71 75 69 72 65 20 45 61 67 6c  age require Eagl
10ea0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 70 61 63  e..          pac
10eb0 6b 61 67 65 20 72 65 71 75 69 72 65 20 45 61 67  kage require Eag
10ec0 6c 65 2e 4c 69 62 72 61 72 79 0d 0a 20 20 20 20  le.Library..    
10ed0 20 20 20 20 20 20 70 61 63 6b 61 67 65 20 72 65        package re
10ee0 71 75 69 72 65 20 45 61 67 6c 65 2e 54 65 73 74  quire Eagle.Test
10ef0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
10f00 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
10f10 20 20 23 20 4e 4f 54 45 3a 20 43 6f 70 79 20 74    # NOTE: Copy t
10f20 68 65 20 6e 65 63 65 73 73 61 72 79 20 76 61 72  he necessary var
10f30 69 61 62 6c 65 73 20 69 6e 74 6f 20 74 68 65 20  iables into the 
10f40 69 73 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72  isolated interpr
10f50 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 23  eter...        #
10f60 0d 0a 20 20 20 20 20 20 20 20 64 65 62 75 67 20  ..        debug 
10f70 69 6e 76 6f 6b 65 20 30 20 73 65 74 20 3a 3a 74  invoke 0 set ::t
10f80 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 63 68 61  est_channel $cha
10f90 6e 6e 65 6c 3b 20 23 20 4e 4f 54 45 3a 20 46 6f  nnel; # NOTE: Fo
10fa0 72 20 5b 74 70 75 74 73 5d 2e 0d 0a 20 20 20 20  r [tputs]...    
10fb0 20 20 20 20 64 65 62 75 67 20 69 6e 76 6f 6b 65      debug invoke
10fc0 20 30 20 73 65 74 20 3a 3a 74 65 73 74 5f 6c 6f   0 set ::test_lo
10fd0 67 20 24 6c 6f 67 3b 20 23 20 4e 4f 54 45 3a 20  g $log; # NOTE: 
10fe0 46 6f 72 20 5b 74 6c 6f 67 5d 2e 0d 0a 0d 0a 20  For [tlog]..... 
10ff0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
11000 20 20 23 20 4e 4f 54 45 3a 20 49 6e 73 74 61 6c    # NOTE: Instal
11010 6c 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 73  l the callback s
11020 63 72 69 70 74 20 74 6f 20 62 65 20 65 76 61 6c  cript to be eval
11030 75 61 74 65 64 20 69 6e 20 74 68 65 20 69 73 6f  uated in the iso
11040 6c 61 74 65 64 0d 0a 20 20 20 20 20 20 20 20 23  lated..        #
11050 20 20 20 20 20 20 20 69 6e 74 65 72 70 72 65 74         interpret
11060 65 72 20 77 68 65 6e 20 74 68 69 73 20 69 6e 74  er when this int
11070 65 72 70 72 65 74 65 72 20 69 73 20 69 6e 74 65  erpreter is inte
11080 72 72 75 70 74 65 64 20 62 79 20 73 63 72 69 70  rrupted by scrip
11090 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
110a0 20 20 20 63 61 6e 63 65 6c 6c 61 74 69 6f 6e 2c     cancellation,
110b0 20 65 74 63 2e 0d 0a 20 20 20 20 20 20 20 20 23   etc...        #
110c0 0d 0a 20 20 20 20 20 20 20 20 64 65 62 75 67 20  ..        debug 
110d0 63 61 6c 6c 62 61 63 6b 20 61 70 70 6c 79 20 7b  callback apply {
110e0 7b 73 65 6e 64 65 72 20 65 7d 20 7b 0d 0a 20 20  {sender e} {..  
110f0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
11100 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
11110 63 6b 20 69 66 20 74 68 69 73 20 63 61 6c 6c 62  ck if this callb
11120 61 63 6b 20 69 73 20 6f 6e 65 20 74 68 61 74 20  ack is one that 
11130 77 65 20 63 61 72 65 20 61 62 6f 75 74 2e 0d 0a  we care about...
11140 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
11150 20 20 20 20 20 20 20 69 66 20 7b 22 43 61 6e 63         if {"Canc
11160 65 6c 65 64 22 20 69 6e 20 5b 73 70 6c 69 74 20  eled" in [split 
11170 5b 24 65 20 49 6e 74 65 72 72 75 70 74 54 79 70  [$e InterruptTyp
11180 65 5d 20 22 2c 20 22 5d 7d 20 74 68 65 6e 20 7b  e] ", "]} then {
11190 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
111a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
111b0 4f 54 45 3a 20 49 74 65 72 61 74 65 20 74 68 72  OTE: Iterate thr
111c0 6f 75 67 68 20 61 6c 6c 20 64 61 74 61 62 61 73  ough all databas
111d0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6b 6e  e connections kn
111e0 6f 77 6e 20 74 6f 20 74 68 65 0d 0a 20 20 20 20  own to the..    
111f0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
11200 70 61 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74  parent interpret
11210 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  er...           
11220 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
11230 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20 2d  object foreach -
11240 61 6c 69 61 73 20 70 61 69 72 20 5c 0d 0a 20 20  alias pair \..  
11250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 6f                [o
11260 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
11270 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 24  ags +NonPublic $
11280 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e 63 6f  e Interpreter.co
11290 6e 6e 65 63 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20  nnections] {..  
112a0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
112b0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
112c0 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20  OTE: Attempt to 
112d0 63 61 6e 63 65 6c 20 61 6e 79 20 53 51 4c 20 71  cancel any SQL q
112e0 75 65 72 69 65 73 20 69 6e 20 70 72 6f 67 72 65  ueries in progre
112f0 73 73 20 6f 6e 20 74 68 69 73 0d 0a 20 20 20 20  ss on this..    
11300 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
11310 20 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65    database conne
11320 63 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20  ction...        
11330 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
11340 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
11350 68 20 7b 24 70 61 69 72 20 56 61 6c 75 65 2e 43  h {$pair Value.C
11360 61 6e 63 65 6c 7d 20 65 72 72 6f 72 5d 7d 20 74  ancel} error]} t
11370 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
11380 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
11390 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
113a0 70 65 6e 64 41 72 67 73 20 5c 6e 20 5c 0d 0a 20  pendArgs \n \.. 
113b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113c0 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
113d0 3a 20 66 61 69 6c 65 64 20 74 6f 20 63 61 6e 63  : failed to canc
113e0 65 6c 20 71 75 65 72 79 20 66 6f 72 20 63 6f 6e  el query for con
113f0 6e 65 63 74 69 6f 6e 20 5c 22 22 20 5c 0d 0a 20  nection \"" \.. 
11400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11410 20 20 20 5b 24 70 61 69 72 20 4b 65 79 5d 20 22     [$pair Key] "
11420 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  \", error: " \n\
11430 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20  t $error \n]..  
11440 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
11450 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
11460 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
11470 20 20 20 7d 7d 0d 0a 20 20 20 20 20 20 7d 20 65     }}..      } e
11480 72 72 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  rror] == 0} then
11490 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43   {..        addC
114a0 6f 6e 73 74 72 61 69 6e 74 20 69 6e 74 65 72 72  onstraint interr
114b0 75 70 74 43 61 6c 6c 62 61 63 6b 2e 73 71 6c 69  uptCallback.sqli
114c0 74 65 33 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74  te3....        t
114d0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65  puts $channel ye
114e0 73 5c 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  s\n..      } els
114f0 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e {..        tpu
11500 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
11510 65 6e 64 41 72 67 73 20 22 6e 6f 2c 20 65 72 72  endArgs "no, err
11520 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f  or: " \n\t $erro
11530 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  r \n]..      }..
11540 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
11550 6f 63 20 63 6c 65 61 6e 75 70 46 69 6c 65 20 7b  oc cleanupFile {
11560 20 66 69 6c 65 4e 61 6d 65 20 7b 63 6f 6c 6c 65   fileName {colle
11570 63 74 20 74 72 75 65 7d 20 7b 66 6f 72 63 65 20  ct true} {force 
11580 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20  false} } {..    
11590 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
115a0 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 66 6f  E: Attempt to fo
115b0 72 63 65 20 61 6c 6c 20 70 65 6e 64 69 6e 67 20  rce all pending 
115c0 22 67 61 72 62 61 67 65 22 20 6f 62 6a 65 63 74  "garbage" object
115d0 73 20 74 6f 20 62 65 20 63 6f 6c 6c 65 63 74 65  s to be collecte
115e0 64 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  d,..      #     
115f0 20 20 69 6e 63 6c 75 64 69 6e 67 20 53 51 4c 69    including SQLi
11600 74 65 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6e  te statements an
11610 64 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73  d backup objects
11620 3b 20 74 68 69 73 20 73 68 6f 75 6c 64 20 61 6c  ; this should al
11630 6c 6f 77 0d 0a 20 20 20 20 20 20 23 20 20 20 20  low..      #    
11640 20 20 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e     the underlyin
11650 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
11660 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 0d 0a  to be deleted...
11670 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
11680 66 20 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65  f {$collect} the
11690 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c  n {..        col
116a0 6c 65 63 74 47 61 72 62 61 67 65 20 24 3a 3a 74  lectGarbage $::t
116b0 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20  est_channel..   
116c0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
116d0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43  .      # NOTE: C
116e0 68 65 63 6b 20 69 66 20 74 68 65 20 66 69 6c 65  heck if the file
116f0 20 73 74 69 6c 6c 20 65 78 69 73 74 73 2e 0d 0a   still exists...
11700 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
11710 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20  f {[file exists 
11720 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  $fileName]} then
11730 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
11740 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
11750 6b 69 70 20 64 65 6c 65 74 69 6e 67 20 74 65 73  kip deleting tes
11760 74 20 66 69 6c 65 73 20 69 66 20 73 6f 6d 65 62  t files if someb
11770 6f 64 79 20 73 65 74 73 20 74 68 65 20 67 6c 6f  ody sets the glo
11780 62 61 6c 20 76 61 72 69 61 62 6c 65 0d 0a 20 20  bal variable..  
11790 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f        #       to
117a0 20 70 72 65 76 65 6e 74 20 69 74 2e 0d 0a 20 20   prevent it...  
117b0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
117c0 20 69 66 20 7b 24 66 6f 72 63 65 20 7c 7c 20 21   if {$force || !
117d0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
117e0 6f 28 63 6c 65 61 6e 75 70 46 69 6c 65 29 5d 7d  o(cleanupFile)]}
117f0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
11800 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
11810 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
11820 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  to delete the te
11830 73 74 20 66 69 6c 65 20 6e 6f 77 2e 0d 0a 20 20  st file now...  
11840 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
11850 20 20 20 20 20 69 66 20 7b 5b 73 65 74 20 63 6f       if {[set co
11860 64 65 20 5b 63 61 74 63 68 20 7b 66 69 6c 65 20  de [catch {file 
11870 64 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65  delete $fileName
11880 7d 20 65 72 72 6f 72 5d 5d 7d 20 74 68 65 6e 20  } error]]} then 
11890 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  {..            #
118a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
118b0 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77  NOTE: We somehow
118c0 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74   failed to delet
118d0 65 20 74 68 65 20 66 69 6c 65 2c 20 72 65 70 6f  e the file, repo
118e0 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20  rt why...       
118f0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
11900 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
11910 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
11920 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
11930 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
11940 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
11950 6f 20 64 65 6c 65 74 65 20 74 65 73 74 20 66 69  o delete test fi
11960 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65  le \"" $fileName
11970 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
11980 20 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63      "\" during c
11990 6c 65 61 6e 75 70 2c 20 65 72 72 6f 72 3a 20 22  leanup, error: "
119a0 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d   \n\t $error \n]
119b0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
119c0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
119d0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
119e0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
119f0 53 68 6f 77 20 74 68 61 74 20 77 65 20 73 6b 69  Show that we ski
11a00 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20 74 68  pped deleting th
11a10 65 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20  e file...       
11a20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
11a30 73 65 74 20 63 6f 64 65 20 30 0d 0a 0d 0a 20 20  set code 0....  
11a40 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
11a50 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
11a60 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
11a70 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
11a80 20 57 41 52 4e 49 4e 47 3a 20 73 6b 69 70 70 65   WARNING: skippe
11a90 64 20 64 65 6c 65 74 69 6e 67 20 74 65 73 74 20  d deleting test 
11aa0 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61  file \"" $fileNa
11ab0 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
11ac0 20 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63      "\" during c
11ad0 6c 65 61 6e 75 70 5c 6e 22 5d 0d 0a 20 20 20 20  leanup\n"]..    
11ae0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65      }..      } e
11af0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
11b00 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
11b10 3a 20 54 68 65 20 66 69 6c 65 20 64 6f 65 73 20  : The file does 
11b20 6e 6f 74 20 65 78 69 73 74 2c 20 73 75 63 63 65  not exist, succe
11b30 73 73 21 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ss!..        #..
11b40 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 64 65          set code
11b50 20 30 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   0..      }.... 
11b60 20 20 20 20 20 72 65 74 75 72 6e 20 24 63 6f 64       return $cod
11b70 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  e..    }.....   
11b80 20 70 72 6f 63 20 63 6f 6c 6c 65 63 74 47 61 72   proc collectGar
11b90 62 61 67 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7b  bage { channel {
11ba0 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 31 30 30  milliseconds 100
11bb0 30 7d 20 7b 71 75 69 65 74 20 74 72 75 65 7d 20  0} {quiet true} 
11bc0 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  } {..      if {[
11bd0 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e  catch {object in
11be0 76 6f 6b 65 20 47 43 20 47 65 74 54 6f 74 61 6c  voke GC GetTotal
11bf0 4d 65 6d 6f 72 79 20 66 61 6c 73 65 7d 20 72 65  Memory false} re
11c00 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sult] == 0} then
11c10 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
11c20 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
11c30 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
11c40 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
11c50 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
11c60 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6d 65 6d         "---- mem
11c70 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 74 68  ory in use by th
11c80 65 20 43 4c 52 20 62 65 66 6f 72 65 20 63 6f 6c  e CLR before col
11c90 6c 65 63 74 69 6f 6e 2e 2e 2e 20 22 20 5c 0d 0a  lection... " \..
11ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 72                $r
11cb0 65 73 75 6c 74 20 22 20 62 79 74 65 73 5c 6e 22  esult " bytes\n"
11cc0 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
11cd0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
11ce0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
11cf0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
11d00 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
11d10 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
11d20 61 69 6c 65 64 20 74 6f 20 67 65 74 20 43 4c 52  ailed to get CLR
11d30 20 6d 65 6d 6f 72 79 20 75 73 61 67 65 2c 20 65   memory usage, e
11d40 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20  rror: " \..     
11d50 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73         \n\t $res
11d60 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d  ult \n]..      }
11d70 0d 0a 0d 0a 20 20 20 20 20 20 23 23 23 23 23 23  ....      ######
11d80 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11d90 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11da0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11db0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11dc0 23 23 23 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  ###....      #..
11dd0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
11de0 70 65 61 74 65 64 6c 79 20 61 74 74 65 6d 70 74  peatedly attempt
11df0 20 74 6f 20 63 6f 6c 6c 65 63 74 20 67 61 72 62   to collect garb
11e00 61 67 65 20 75 6e 74 69 6c 20 74 68 65 20 61 6c  age until the al
11e10 6c 6f 74 74 65 64 20 6e 75 6d 62 65 72 0d 0a 20  lotted number.. 
11e20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 66 20       #       of 
11e30 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 68 61 73  milliseconds has
11e40 20 65 6c 61 70 73 65 64 2e 20 20 41 6c 77 61 79   elapsed.  Alway
11e50 73 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6f 6c  s attempt to col
11e60 6c 65 63 74 20 67 61 72 62 61 67 65 0d 0a 20 20  lect garbage..  
11e70 20 20 20 20 23 20 20 20 20 20 20 20 61 74 20 6c      #       at l
11e80 65 61 73 74 20 6f 6e 63 65 2e 0d 0a 20 20 20 20  east once...    
11e90 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 73    #..      set s
11ea0 74 61 72 74 20 5b 63 6c 6f 63 6b 20 73 65 63 6f  tart [clock seco
11eb0 6e 64 73 5d 0d 0a 20 20 20 20 20 20 73 65 74 20  nds]..      set 
11ec0 73 74 6f 70 20 5b 65 78 70 72 20 7b 24 73 74 61  stop [expr {$sta
11ed0 72 74 20 2b 20 28 24 6d 69 6c 6c 69 73 65 63 6f  rt + ($milliseco
11ee0 6e 64 73 20 2f 20 31 30 30 30 29 7d 5d 0d 0a 0d  nds / 1000)}]...
11ef0 0a 20 20 20 20 20 20 64 6f 20 7b 0d 0a 20 20 20  .      do {..   
11f00 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
11f10 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
11f20 74 6f 20 66 6f 72 63 65 20 61 20 66 75 6c 6c 20  to force a full 
11f30 67 61 72 62 61 67 65 20 63 6f 6c 6c 65 63 74 69  garbage collecti
11f40 6f 6e 20 6e 6f 77 2e 20 20 52 65 70 6f 72 74 20  on now.  Report 
11f50 61 6e 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20  any..        #  
11f60 20 20 20 20 20 65 72 72 6f 72 20 74 68 61 74 20       error that 
11f70 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69  is encountered i
11f80 66 20 77 65 20 66 61 69 6c 2e 0d 0a 20 20 20 20  f we fail...    
11f90 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
11fa0 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63  f {[catch {objec
11fb0 74 20 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54  t invoke GC GetT
11fc0 6f 74 61 6c 4d 65 6d 6f 72 79 20 74 72 75 65 7d  otalMemory true}
11fd0 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d   error]} then {.
11fe0 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
11ff0 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
12000 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
12010 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
12020 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 66 75 6c  NING: failed ful
12030 6c 20 67 61 72 62 61 67 65 20 63 6f 6c 6c 65 63  l garbage collec
12040 74 69 6f 6e 2c 20 65 72 72 6f 72 3a 20 22 20 5c  tion, error: " \
12050 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
12060 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
12070 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
12080 20 20 20 20 20 20 73 65 74 20 6e 6f 77 20 5b 63        set now [c
12090 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 0d 0a 20  lock seconds].. 
120a0 20 20 20 20 20 7d 20 77 68 69 6c 65 20 7b 24 73       } while {$s
120b0 74 61 72 74 20 3c 3d 20 24 6e 6f 77 20 26 26 20  tart <= $now && 
120c0 24 6e 6f 77 20 3c 20 24 73 74 6f 70 7d 0d 0a 0d  $now < $stop}...
120d0 0a 20 20 20 20 20 20 23 23 23 23 23 23 23 23 23  .      #########
120e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
120f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12100 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12110 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12120 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63  ....      if {[c
12130 61 74 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76  atch {object inv
12140 6f 6b 65 20 47 43 20 47 65 74 54 6f 74 61 6c 4d  oke GC GetTotalM
12150 65 6d 6f 72 79 20 66 61 6c 73 65 7d 20 72 65 73  emory false} res
12160 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ult] == 0} then 
12170 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  {..        if {!
12180 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
12190 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
121a0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
121b0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
121c0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6d 65 6d 6f        "---- memo
121d0 72 79 20 69 6e 20 75 73 65 20 62 79 20 74 68 65  ry in use by the
121e0 20 43 4c 52 20 61 66 74 65 72 20 63 6f 6c 6c 65   CLR after colle
121f0 63 74 69 6f 6e 2e 2e 2e 20 22 20 5c 0d 0a 20 20  ction... " \..  
12200 20 20 20 20 20 20 20 20 20 20 20 20 24 72 65 73              $res
12210 75 6c 74 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d  ult " bytes\n"].
12220 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
12230 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
12240 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
12250 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
12260 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 3d  ..            "=
12270 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
12280 6c 65 64 20 74 6f 20 67 65 74 20 43 4c 52 20 6d  led to get CLR m
12290 65 6d 6f 72 79 20 75 73 61 67 65 2c 20 65 72 72  emory usage, err
122a0 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  or: " \..       
122b0 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c       \n\t $resul
122c0 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  t \n]..      }..
122d0 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
122e0 6f 63 20 67 65 74 53 51 4c 69 74 65 48 61 6e 64  oc getSQLiteHand
122f0 6c 65 43 6f 75 6e 74 73 20 7b 20 63 68 61 6e 6e  leCounts { chann
12300 65 6c 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d  el {quiet false}
12310 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20   } {..      set 
12320 72 65 73 75 6c 74 20 5b 6c 69 73 74 5d 0d 0a 0d  result [list]...
12330 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65  .      if {[have
12340 43 6f 6e 73 74 72 61 69 6e 74 20 5c 0d 0a 20 20  Constraint \..  
12350 20 20 20 20 20 20 20 20 20 20 20 20 64 65 66 69              defi
12360 6e 65 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74 65  neConstant.Syste
12370 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 43 4f  m.Data.SQLite.CO
12380 55 4e 54 5f 48 41 4e 44 4c 45 5d 7d 20 74 68 65  UNT_HANDLE]} the
12390 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
123a0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
123b0 41 64 64 20 65 61 63 68 20 63 72 69 74 69 63 61  Add each critica
123c0 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 20 74  l handle count t
123d0 6f 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20  o the resulting 
123e0 6c 69 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  list...        #
123f0 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  ..        foreac
12400 68 20 6e 61 6d 65 20 5b 6c 69 73 74 20 63 6f 6e  h name [list con
12410 6e 65 63 74 69 6f 6e 43 6f 75 6e 74 20 73 74 61  nectionCount sta
12420 74 65 6d 65 6e 74 43 6f 75 6e 74 20 62 61 63 6b  tementCount back
12430 75 70 43 6f 75 6e 74 5d 20 7b 0d 0a 20 20 20 20  upCount] {..    
12440 20 20 20 20 20 20 73 65 74 20 76 61 6c 75 65 20        set value 
12450 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d  [object invoke -
12460 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
12470 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
12480 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
12490 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76  Lite.UnsafeNativ
124a0 65 4d 65 74 68 6f 64 73 20 24 6e 61 6d 65 5d 0d  eMethods $name].
124b0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
124c0 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
124d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
124e0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
124f0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
12500 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
12510 2d 20 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c  - critical handl
12520 65 20 63 6f 75 6e 74 20 5c 22 22 20 24 6e 61 6d  e count \"" $nam
12530 65 20 22 5c 22 20 69 73 20 22 20 24 76 61 6c 75  e "\" is " $valu
12540 65 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  e \n]..         
12550 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
12560 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 24  lappend result $
12570 76 61 6c 75 65 0d 0a 20 20 20 20 20 20 20 20 7d  value..        }
12580 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66  ..      } elseif
12590 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
125a0 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
125b0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
125c0 65 20 61 63 74 75 61 6c 20 68 61 6e 64 6c 65 20  e actual handle 
125d0 63 6f 75 6e 74 73 20 61 72 65 20 6e 6f 74 20 61  counts are not a
125e0 76 61 69 6c 61 62 6c 65 3b 20 74 68 65 72 65 66  vailable; theref
125f0 6f 72 65 2c 20 6a 75 73 74 0d 0a 20 20 20 20 20  ore, just..     
12600 20 20 20 23 20 20 20 20 20 20 20 72 65 74 75 72     #       retur
12610 6e 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e  n an empty list.
12620 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
12630 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
12640 6e 65 6c 20 22 2d 2d 2d 2d 20 63 72 69 74 69 63  nel "---- critic
12650 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 73  al handle counts
12660 20 75 6e 61 76 61 69 6c 61 62 6c 65 5c 6e 22 0d   unavailable\n".
12670 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
12680 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74    return $result
12690 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
126a0 70 72 6f 63 20 73 68 75 74 64 6f 77 6e 53 51 4c  proc shutdownSQL
126b0 69 74 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 66  ite { channel {f
126c0 6f 72 63 65 20 66 61 6c 73 65 7d 20 7b 71 75 69  orce false} {qui
126d0 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  et false} } {.. 
126e0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
126f0 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75 72 65 20  NOTE: Make sure 
12700 74 68 61 74 20 53 51 4c 69 74 65 20 63 6f 72 65  that SQLite core
12710 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d 70   library is comp
12720 6c 65 74 65 6c 79 20 73 68 75 74 64 6f 77 6e 2e  letely shutdown.
12730 20 20 54 68 69 73 0d 0a 20 20 20 20 20 20 23 20    This..      # 
12740 20 20 20 20 20 20 69 73 20 75 73 65 64 20 62 79        is used by
12750 20 74 65 73 74 73 20 74 68 61 74 20 63 68 61 6e   tests that chan
12760 67 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ge configuration
12770 20 6f 70 74 69 6f 6e 73 20 61 6e 64 2f 6f 72 20   options and/or 
12780 74 68 6f 73 65 0d 0a 20 20 20 20 20 20 23 20 20  those..      #  
12790 20 20 20 20 20 74 68 61 74 20 6e 65 65 64 20 74       that need t
127a0 6f 20 6d 61 6b 65 20 73 75 72 65 20 6c 6f 67 67  o make sure logg
127b0 69 6e 67 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ing is initializ
127c0 65 64 20 28 69 2e 65 2e 20 6a 75 73 74 20 69 6e  ed (i.e. just in
127d0 20 63 61 73 65 0d 0a 20 20 20 20 20 20 23 20 20   case..      #  
127e0 20 20 20 20 20 74 68 65 20 53 51 4c 69 74 65 20       the SQLite 
127f0 63 6f 72 65 20 6c 69 62 72 61 72 79 20 77 61 73  core library was
12800 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 69 6e 20   initialized in 
12810 74 68 65 20 70 72 6f 63 65 73 73 20 70 72 69 6f  the process prio
12820 72 20 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20  r to..      #   
12830 20 20 20 20 74 68 65 20 53 51 4c 69 74 65 4c 6f      the SQLiteLo
12840 67 20 63 6c 61 73 73 20 62 65 69 6e 67 20 61 62  g class being ab
12850 6c 65 20 74 6f 20 73 65 74 75 70 20 69 74 73 20  le to setup its 
12860 6c 6f 67 67 69 6e 67 20 63 61 6c 6c 62 61 63 6b  logging callback
12870 29 2e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  )...      #     
12880 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73    Normally, this
12890 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
128a0 70 65 72 66 6f 72 6d 65 64 20 69 66 20 53 51 4c  performed if SQL
128b0 69 74 65 20 69 73 20 6c 6f 61 64 65 64 20 61 6e  ite is loaded an
128c0 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
128d0 20 72 65 61 64 79 20 66 6f 72 20 75 73 65 20 62   ready for use b
128e0 79 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  y the test suite
128f0 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
12900 20 20 69 66 20 7b 24 66 6f 72 63 65 20 7c 7c 20    if {$force || 
12910 5b 69 73 53 51 4c 69 74 65 52 65 61 64 79 5d 7d  [isSQLiteReady]}
12920 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
12930 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 42 55   #..        # BU
12940 47 46 49 58 3a 20 42 65 66 6f 72 65 20 63 61 6c  GFIX: Before cal
12950 6c 69 6e 67 20 74 68 65 20 6e 61 74 69 76 65 20  ling the native 
12960 73 68 75 74 64 6f 77 6e 20 66 75 6e 63 74 69 6f  shutdown functio
12970 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 62 6f 74  n, make sure bot
12980 68 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  h..        #    
12990 20 20 20 20 20 6f 66 20 74 68 65 20 50 52 41 47       of the PRAG
129a0 4d 41 20 72 65 6c 61 74 65 64 20 64 69 72 65 63  MA related direc
129b0 74 6f 72 79 20 6e 61 6d 65 73 20 61 72 65 20 66  tory names are f
129c0 72 65 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23  reed...        #
129d0 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46  ..        checkF
129e0 6f 72 53 51 4c 69 74 65 44 69 72 65 63 74 6f 72  orSQLiteDirector
129f0 69 65 73 20 24 63 68 61 6e 6e 65 6c 20 74 72 75  ies $channel tru
12a00 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  e....        if 
12a10 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20  {[catch {object 
12a20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
12a30 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
12a40 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
12a50 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55  em.Data.SQLite.U
12a60 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
12a70 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ds \..          
12a80 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 68        sqlite3_sh
12a90 75 74 64 6f 77 6e 7d 20 72 65 73 75 6c 74 5d 20  utdown} result] 
12aa0 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
12ab0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
12ac0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
12ad0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
12ae0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
12af0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
12b00 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c         "---- cal
12b10 6c 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f  l sqlite3_shutdo
12b20 77 6e 28 29 2e 2e 2e 20 6f 6b 3a 20 22 20 24 72  wn()... ok: " $r
12b30 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20  esult \n]..     
12b40 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
12b50 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
12b60 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
12b70 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
12b80 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
12b90 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
12ba0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
12bb0 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71     "---- call sq
12bc0 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 29  lite3_shutdown()
12bd0 2e 2e 2e 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  ... error: " \n\
12be0 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20  t $result \n].. 
12bf0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
12c00 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
12c10 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
12c20 6f 63 20 72 65 70 6f 72 74 53 51 4c 69 74 65 52  oc reportSQLiteR
12c30 65 73 6f 75 72 63 65 73 20 7b 20 63 68 61 6e 6e  esources { chann
12c40 65 6c 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d  el {quiet false}
12c50 20 7b 63 6f 6c 6c 65 63 74 20 74 72 75 65 7d 20   {collect true} 
12c60 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
12c70 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70      # NOTE: Skip
12c80 20 61 6c 6c 20 6f 75 74 70 75 74 20 69 66 20 77   all output if w
12c90 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 69 6e  e are running in
12ca0 20 22 71 75 69 65 74 22 20 6d 6f 64 65 2e 0d 0a   "quiet" mode...
12cb0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
12cc0 66 20 7b 5b 68 61 76 65 43 6f 6e 73 74 72 61 69  f {[haveConstrai
12cd0 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  nt \..          
12ce0 20 20 20 20 64 65 66 69 6e 65 43 6f 6e 73 74 61      defineConsta
12cf0 6e 74 2e 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  nt.System.Data.S
12d00 51 4c 69 74 65 2e 49 4e 54 45 52 4f 50 5f 56 49  QLite.INTEROP_VI
12d10 52 54 55 41 4c 5f 54 41 42 4c 45 5d 20 26 26 20  RTUAL_TABLE] && 
12d20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 68 61  \..          [ha
12d30 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5c 0d 0a  veConstraint \..
12d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65                de
12d50 66 69 6e 65 43 6f 6e 73 74 61 6e 74 2e 53 79 73  fineConstant.Sys
12d60 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
12d70 54 52 41 43 4b 5f 4d 45 4d 4f 52 59 5f 42 59 54  TRACK_MEMORY_BYT
12d80 45 53 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ES]} then {..   
12d90 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
12da0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
12db0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
12dc0 65 6c 20 22 2d 2d 2d 2d 20 63 75 72 72 65 6e 74  el "---- current
12dd0 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62   memory in use b
12de0 79 20 53 51 4c 69 74 65 4d 65 6d 6f 72 79 2e 2e  y SQLiteMemory..
12df0 2e 20 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  . "..        }..
12e00 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
12e10 61 74 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76  atch {object inv
12e20 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
12e30 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
12e40 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
12e50 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69  Data.SQLite.SQLi
12e60 74 65 4d 65 6d 6f 72 79 20 5c 0d 0a 20 20 20 20  teMemory \..    
12e70 20 20 20 20 20 20 20 20 20 20 20 20 62 79 74 65              byte
12e80 73 41 6c 6c 6f 63 61 74 65 64 7d 20 6d 65 6d 6f  sAllocated} memo
12e90 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  ry] == 0} then {
12ea0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
12eb0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
12ec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
12ed0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
12ee0 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20  endArgs $memory 
12ef0 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20  " bytes\n"]..   
12f00 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
12f10 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
12f20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79        set memory
12f30 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20   unknown....    
12f40 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
12f50 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
12f60 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
12f70 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
12f80 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20  s $memory \n].. 
12f90 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
12fa0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
12fb0 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
12fc0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
12fd0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
12fe0 2d 2d 2d 2d 20 6d 61 78 69 6d 75 6d 20 6d 65 6d  ---- maximum mem
12ff0 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 53 51  ory in use by SQ
13000 4c 69 74 65 4d 65 6d 6f 72 79 2e 2e 2e 20 22 0d  LiteMemory... ".
13010 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
13020 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
13030 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   {object invoke 
13040 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
13050 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
13060 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
13070 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 4d 65  .SQLite.SQLiteMe
13080 6d 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20  mory \..        
13090 20 20 20 20 20 20 20 20 6d 61 78 69 6d 75 6d 42          maximumB
130a0 79 74 65 73 41 6c 6c 6f 63 61 74 65 64 7d 20 6d  ytesAllocated} m
130b0 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65  emory] == 0} the
130c0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
130d0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
130e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
130f0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
13100 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f  appendArgs $memo
13110 72 79 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a  ry " bytes\n"]..
13120 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
13130 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
13140 20 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d           set mem
13150 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20  ory unknown.... 
13160 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
13170 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
13180 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
13190 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
131a0 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d  Args $memory \n]
131b0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
131c0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
131d0 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21  }....      if {!
131e0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
131f0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
13200 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 75 72  hannel "---- cur
13210 72 65 6e 74 20 6d 65 6d 6f 72 79 20 69 6e 20 75  rent memory in u
13220 73 65 20 62 79 20 53 51 4c 69 74 65 2e 2e 2e 20  se by SQLite... 
13230 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  "..      }....  
13240 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
13250 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
13260 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
13270 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
13280 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
13290 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65  ite.UnsafeNative
132a0 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20  Methods \..     
132b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
132c0 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 7d 20 6d 65  _memory_used} me
132d0 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  mory] == 0} then
132e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
132f0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
13300 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
13310 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
13320 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20  dArgs $memory " 
13330 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20  bytes\n"]..     
13340 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
13350 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
13360 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
13370 20 4d 61 79 62 65 20 74 68 65 20 53 51 4c 69 74   Maybe the SQLit
13380 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20 69  e core library i
13390 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 3f 0d 0a  s unavailable?..
133a0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
133b0 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e     set memory un
133c0 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20  known....       
133d0 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
133e0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
133f0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
13400 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f  appendArgs $memo
13410 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ry \n]..        
13420 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
13430 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 24      set result $
13440 6d 65 6d 6f 72 79 3b 20 23 20 4e 4f 54 45 3a 20  memory; # NOTE: 
13450 52 65 74 75 72 6e 20 6d 65 6d 6f 72 79 20 69 6e  Return memory in
13460 2d 75 73 65 20 74 6f 20 6f 75 72 20 63 61 6c 6c  -use to our call
13470 65 72 2e 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  er.....      if 
13480 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
13490 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
134a0 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 6d  $channel "---- m
134b0 61 78 69 6d 75 6d 20 6d 65 6d 6f 72 79 20 69 6e  aximum memory in
134c0 20 75 73 65 20 62 79 20 53 51 4c 69 74 65 2e 2e   use by SQLite..
134d0 2e 20 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  . "..      }....
134e0 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
134f0 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   {object invoke 
13500 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
13510 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
13520 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
13530 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69  QLite.UnsafeNati
13540 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20  veMethods \..   
13550 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
13560 65 33 5f 6d 65 6d 6f 72 79 5f 68 69 67 68 77 61  e3_memory_highwa
13570 74 65 72 20 30 7d 20 6d 65 6d 6f 72 79 5d 20 3d  ter 0} memory] =
13580 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
13590 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
135a0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
135b0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
135c0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  el [appendArgs $
135d0 6d 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e  memory " bytes\n
135e0 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  "]..        }.. 
135f0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
13600 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
13610 20 20 23 20 4e 4f 54 45 3a 20 4d 61 79 62 65 20    # NOTE: Maybe 
13620 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20  the SQLite core 
13630 6c 69 62 72 61 72 79 20 69 73 20 75 6e 61 76 61  library is unava
13640 69 6c 61 62 6c 65 3f 0d 0a 20 20 20 20 20 20 20  ilable?..       
13650 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
13660 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a  memory unknown..
13670 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24  ..        if {!$
13680 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
13690 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
136a0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
136b0 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d  rgs $memory \n].
136c0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
136d0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
136e0 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65 6e 20  {$collect} then 
136f0 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c 6c 65  {..        colle
13700 63 74 47 61 72 62 61 67 65 20 24 63 68 61 6e 6e  ctGarbage $chann
13710 65 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  el..      }.... 
13720 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
13730 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
13740 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
13750 20 22 2d 2d 2d 2d 20 63 75 72 72 65 6e 74 20 6d   "---- current m
13760 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20  emory in use by 
13770 74 68 65 20 43 4c 52 2e 2e 2e 20 22 0d 0a 20 20  the CLR... "..  
13780 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69      }....      i
13790 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63  f {[catch {objec
137a0 74 20 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54  t invoke GC GetT
137b0 6f 74 61 6c 4d 65 6d 6f 72 79 20 66 61 6c 73 65  otalMemory false
137c0 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20  } memory] == 0} 
137d0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
137e0 69 66 20 7b 5b 73 74 72 69 6e 67 20 69 73 20 69  if {[string is i
137f0 6e 74 65 67 65 72 20 2d 73 74 72 69 63 74 20 24  nteger -strict $
13800 6d 65 6d 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d  memory]} then {.
13810 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
13820 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
13830 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
13840 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
13850 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22  ndArgs $memory "
13860 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20   bytes\n"]..    
13870 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
13880 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
13890 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20       set memory 
138a0 69 6e 76 61 6c 69 64 0d 0a 0d 0a 20 20 20 20 20  invalid....     
138b0 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
138c0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
138d0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
138e0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
138f0 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20   $memory \n]..  
13900 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
13910 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
13920 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  se {..        se
13930 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e  t memory unknown
13940 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
13950 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
13960 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
13970 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
13980 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e  dArgs $memory \n
13990 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
139a0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72      }....      r
139b0 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20  eturn $result.. 
139c0 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
139d0 63 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65  c checkForSQLite
139e0 44 69 72 65 63 74 6f 72 69 65 73 20 7b 20 63 68  Directories { ch
139f0 61 6e 6e 65 6c 20 7b 72 65 73 65 74 20 66 61 6c  annel {reset fal
13a00 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  se} } {..      #
13a10 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
13a20 43 68 65 63 6b 20 69 66 20 74 68 65 20 73 71 6c  Check if the sql
13a30 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
13a40 69 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f  irectory functio
13a50 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d  n is available..
13a60 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
13a70 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5c  tputs $channel \
13a80 0d 0a 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d  ..          "---
13a90 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 66  - checking for f
13aa0 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 5f  unction sqlite3_
13ab0 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
13ac0 6f 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  ory... "....    
13ad0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
13ae0 45 3a 20 54 68 69 73 20 63 61 6c 6c 20 74 6f 20  E: This call to 
13af0 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  the sqlite3_win3
13b00 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20  2_set_directory 
13b10 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 74 68  function uses th
13b20 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
13b30 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 20 30   invalid value 0
13b40 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 61   for the first a
13b50 72 67 75 6d 65 6e 74 2e 20 20 54 68 69 73 20 63  rgument.  This c
13b60 6f 64 65 20 69 73 20 64 65 73 69 67 6e 65 64 0d  ode is designed.
13b70 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
13b80 6f 20 63 68 65 63 6b 20 69 66 20 63 61 6c 6c 69  o check if calli
13b90 6e 67 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  ng the function 
13ba0 77 69 6c 6c 20 72 61 69 73 65 20 61 6e 20 65 78  will raise an ex
13bb0 63 65 70 74 69 6f 6e 20 28 69 2e 65 2e 0d 0a 20  ception (i.e... 
13bc0 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
13bd0 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74 20 6f   actual result o
13be0 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64  f the function d
13bf0 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 20 61  oes not matter a
13c00 73 20 6c 6f 6e 67 20 61 73 20 6e 6f 0d 0a 20 20  s long as no..  
13c10 20 20 20 20 23 20 20 20 20 20 20 20 64 69 72 65      #       dire
13c20 63 74 6f 72 79 20 69 73 20 63 68 61 6e 67 65 64  ctory is changed
13c30 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  )...      #..   
13c40 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
13c50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  .              o
13c60 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
13c70 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
13c80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
13c90 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
13ca0 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d  te.UnsafeNativeM
13cb0 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20  ethods \..      
13cc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
13cd0 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
13ce0 6f 72 79 20 30 20 6e 75 6c 6c 7d 5d 20 3d 3d 20  ory 0 null}] == 
13cf0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
13d00 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
13d10 4e 4f 54 45 3a 20 43 61 6c 6c 69 6e 67 20 74 68  NOTE: Calling th
13d20 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  e sqlite3_win32_
13d30 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66 75  set_directory fu
13d40 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 0d  nction does not.
13d50 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
13d60 20 63 61 75 73 65 20 61 6e 20 65 78 63 65 70 74   cause an except
13d70 69 6f 6e 3b 20 74 68 65 72 65 66 6f 72 65 2c 20  ion; therefore, 
13d80 69 74 20 6d 75 73 74 20 62 65 20 61 76 61 69 6c  it must be avail
13d90 61 62 6c 65 20 28 69 2e 65 2e 0d 0a 20 20 20 20  able (i.e...    
13da0 20 20 20 20 23 20 20 20 20 20 20 20 65 76 65 6e      #       even
13db0 20 74 68 6f 75 67 68 20 69 74 20 73 68 6f 75 6c   though it shoul
13dc0 64 20 72 65 74 75 72 6e 20 61 20 66 61 69 6c 75  d return a failu
13dd0 72 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69  re return code i
13de0 6e 20 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20  n this..        
13df0 23 20 20 20 20 20 20 20 63 61 73 65 29 2e 0d 0a  #       case)...
13e00 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
13e10 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
13e20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
13e30 65 74 5f 64 69 72 65 63 74 6f 72 79 0d 0a 0d 0a  et_directory....
13e40 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
13e50 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 0d 0a  hannel yes\n....
13e60 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
13e70 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20     # NOTE: Does 
13e80 6f 75 72 20 63 61 6c 6c 65 72 20 77 61 6e 74 20  our caller want 
13e90 74 6f 20 72 65 73 65 74 20 74 68 65 20 64 69 72  to reset the dir
13ea0 65 63 74 6f 72 69 65 73 3f 0d 0a 20 20 20 20 20  ectories?..     
13eb0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
13ec0 20 7b 24 72 65 73 65 74 7d 20 74 68 65 6e 20 7b   {$reset} then {
13ed0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
13ee0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
13ef0 20 4e 6f 77 20 6d 61 6b 65 20 73 75 72 65 20 74   Now make sure t
13f00 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
13f10 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
13f20 6f 72 69 65 73 20 61 72 65 0d 0a 20 20 20 20 20  ories are..     
13f30 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65 73       #       res
13f40 65 74 20 74 68 65 69 72 20 64 65 66 61 75 6c 74  et their default
13f50 20 76 61 6c 75 65 73 2c 20 77 68 69 63 68 20 73   values, which s
13f60 68 6f 75 6c 64 20 62 65 20 6e 75 6c 6c 20 66 6f  hould be null fo
13f70 72 20 62 6f 74 68 2e 0d 0a 20 20 20 20 20 20 20  r both...       
13f80 20 20 20 23 20 20 20 20 20 20 20 53 69 6e 63 65     #       Since
13f90 20 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e   the sqlite3_win
13fa0 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79  32_set_directory
13fb0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 76 61   function is ava
13fc0 69 6c 61 62 6c 65 2c 0d 0a 20 20 20 20 20 20 20  ilable,..       
13fd0 20 20 20 23 20 20 20 20 20 20 20 75 73 65 20 69     #       use i
13fe0 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  t...          #.
13ff0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 7b  .          for {
14000 73 65 74 20 69 6e 64 65 78 20 31 7d 20 7b 24 69  set index 1} {$i
14010 6e 64 65 78 20 3c 20 33 7d 20 7b 69 6e 63 72 20  ndex < 3} {incr 
14020 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20 20 20 20  index} {..      
14030 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
14040 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
14050 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
14060 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
14070 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
14080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
14090 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
140a0 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  e.UnsafeNativeMe
140b0 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20  thods \..       
140c0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
140d0 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
140e0 69 72 65 63 74 6f 72 79 20 24 69 6e 64 65 78 20  irectory $index 
140f0 6e 75 6c 6c 7d 20 5c 0d 0a 20 20 20 20 20 20 20  null} \..       
14100 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73               res
14110 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ult] == 0} then 
14120 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
14130 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
14140 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
14150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14160 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69   "---- call sqli
14170 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69  te3_win32_set_di
14180 72 65 63 74 6f 72 79 28 22 20 24 69 6e 64 65 78  rectory(" $index
14190 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
141a0 20 20 20 20 20 20 22 2c 20 6e 75 6c 6c 29 2e 2e        ", null)..
141b0 2e 20 6f 6b 3a 20 22 20 24 72 65 73 75 6c 74 20  . ok: " $result 
141c0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n]..           
141d0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
141e0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
141f0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
14200 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
14210 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
14220 61 6c 6c 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  all sqlite3_win3
14230 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28  2_set_directory(
14240 22 20 24 69 6e 64 65 78 20 5c 0d 0a 20 20 20 20  " $index \..    
14250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2c                ",
14260 20 6e 75 6c 6c 29 2e 2e 2e 20 65 72 72 6f 72 3a   null)... error:
14270 20 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20   " \n\t $result 
14280 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n]..           
14290 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
142a0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
142b0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
142c0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
142d0 65 6c 20 6e 6f 5c 6e 0d 0a 0d 0a 20 20 20 20 20  el no\n....     
142e0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
142f0 4e 4f 54 45 3a 20 44 6f 65 73 20 6f 75 72 20 63  NOTE: Does our c
14300 61 6c 6c 65 72 20 77 61 6e 74 20 74 6f 20 72 65  aller want to re
14310 73 65 74 20 74 68 65 20 64 69 72 65 63 74 6f 72  set the director
14320 69 65 73 3f 20 20 54 68 69 73 20 63 61 6e 20 6f  ies?  This can o
14330 6e 6c 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20  nly..        #  
14340 20 20 20 20 20 62 65 20 70 65 72 66 6f 72 6d 65       be performe
14350 64 20 69 66 20 53 51 4c 69 74 65 20 69 73 20 6c  d if SQLite is l
14360 6f 61 64 65 64 20 61 6e 64 20 72 65 61 64 79 20  oaded and ready 
14370 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 74  for use by the t
14380 65 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20  est..        #  
14390 20 20 20 20 20 73 75 69 74 65 2e 0d 0a 20 20 20       suite...   
143a0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
143b0 69 66 20 7b 24 72 65 73 65 74 20 26 26 20 5b 69  if {$reset && [i
143c0 73 53 51 4c 69 74 65 52 65 61 64 79 5d 7d 20 74  sSQLiteReady]} t
143d0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
143e0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
143f0 4e 4f 54 45 3a 20 4e 6f 77 20 6d 61 6b 65 20 73  NOTE: Now make s
14400 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ure the database
14410 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 64   and temporary d
14420 69 72 65 63 74 6f 72 69 65 73 20 61 72 65 0d 0a  irectories are..
14430 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
14440 20 20 72 65 73 65 74 20 74 68 65 69 72 20 64 65    reset their de
14450 66 61 75 6c 74 20 76 61 6c 75 65 73 2c 20 77 68  fault values, wh
14460 69 63 68 20 73 68 6f 75 6c 64 20 62 65 20 6e 75  ich should be nu
14470 6c 6c 20 66 6f 72 20 62 6f 74 68 2e 0d 0a 20 20  ll for both...  
14480 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
14490 53 69 6e 63 65 20 74 68 65 20 73 71 6c 69 74 65  Since the sqlite
144a0 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65  3_win32_set_dire
144b0 63 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20 64  ctory function d
144c0 6f 65 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20  oes not..       
144d0 20 20 20 23 20 20 20 20 20 20 20 61 70 70 65 61     #       appea
144e0 72 20 74 6f 20 62 65 20 61 76 61 69 6c 61 62 6c  r to be availabl
144f0 65 2c 20 75 73 65 20 74 68 65 20 61 73 73 6f 63  e, use the assoc
14500 69 61 74 65 64 20 50 52 41 47 4d 41 20 63 6f 6d  iated PRAGMA com
14510 6d 61 6e 64 73 0d 0a 20 20 20 20 20 20 20 20 20  mands..         
14520 20 23 20 20 20 20 20 20 20 69 6e 73 74 65 61 64   #       instead
14530 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
14540 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
14550 68 20 64 69 72 65 63 74 6f 72 79 20 5b 6c 69 73  h directory [lis
14560 74 20 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72  t data_store_dir
14570 65 63 74 6f 72 79 20 74 65 6d 70 5f 73 74 6f 72  ectory temp_stor
14580 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 7b 0d 0a  e_directory] {..
14590 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
145a0 73 71 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  sql [appendArgs 
145b0 22 50 52 41 47 4d 41 20 22 20 24 64 69 72 65 63  "PRAGMA " $direc
145c0 74 6f 72 79 20 22 20 3d 20 5c 22 5c 22 3b 22 5d  tory " = \"\";"]
145d0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
145e0 69 66 20 7b 5b 63 61 74 63 68 20 7b 65 78 65 63  if {[catch {exec
145f0 75 74 65 53 71 6c 20 24 73 71 6c 7d 20 72 65 73  uteSql $sql} res
14600 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ult] == 0} then 
14610 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
14620 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
14630 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
14640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14650 20 22 2d 2d 2d 2d 20 65 78 65 63 75 74 65 20 50   "---- execute P
14660 52 41 47 4d 41 20 22 20 24 64 69 72 65 63 74 6f  RAGMA " $directo
14670 72 79 20 22 2e 2e 2e 20 6f 6b 3a 20 5c 22 22 20  ry "... ok: \"" 
14680 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
14690 20 20 20 20 20 24 72 65 73 75 6c 74 20 5c 22 5c       $result \"\
146a0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
146b0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
146c0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
146d0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
146e0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
146f0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 65 78          "---- ex
14700 65 63 75 74 65 20 50 52 41 47 4d 41 20 22 20 24  ecute PRAGMA " $
14710 64 69 72 65 63 74 6f 72 79 20 22 2e 2e 2e 20 65  directory "... e
14720 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20  rror: " \..     
14730 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c               \n\
14740 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20  t $result \n].. 
14750 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
14760 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
14770 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
14780 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
14790 23 20 4e 4f 54 45 3a 20 46 69 6e 61 6c 6c 79 2c  # NOTE: Finally,
147a0 20 73 68 6f 77 20 74 68 65 20 63 75 72 72 65 6e   show the curren
147b0 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64  t value of the d
147c0 61 74 61 62 61 73 65 20 61 6e 64 20 74 65 6d 70  atabase and temp
147d0 6f 72 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20  orary..      #  
147e0 20 20 20 20 20 64 69 72 65 63 74 6f 72 69 65 73       directories
147f0 2e 20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  .  This can only
14800 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66   be performed if
14810 20 53 51 4c 69 74 65 20 69 73 20 6c 6f 61 64 65   SQLite is loade
14820 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
14830 20 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20 75   and ready for u
14840 73 65 20 62 79 20 74 68 65 20 74 65 73 74 20 73  se by the test s
14850 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  uite...      #..
14860 20 20 20 20 20 20 69 66 20 7b 5b 69 73 53 51 4c        if {[isSQL
14870 69 74 65 52 65 61 64 79 5d 7d 20 74 68 65 6e 20  iteReady]} then 
14880 7b 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61  {..        forea
14890 63 68 20 64 69 72 65 63 74 6f 72 79 20 5b 6c 69  ch directory [li
148a0 73 74 20 64 61 74 61 5f 73 74 6f 72 65 5f 64 69  st data_store_di
148b0 72 65 63 74 6f 72 79 20 74 65 6d 70 5f 73 74 6f  rectory temp_sto
148c0 72 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 7b 0d  re_directory] {.
148d0 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
148e0 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
148f0 64 41 72 67 73 20 22 2d 2d 2d 2d 20 63 68 65 63  dArgs "---- chec
14900 6b 69 6e 67 20 22 20 24 64 69 72 65 63 74 6f 72  king " $director
14910 79 20 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20  y "... "]....   
14920 20 20 20 20 20 20 20 73 65 74 20 73 71 6c 20 5b         set sql [
14930 61 70 70 65 6e 64 41 72 67 73 20 22 50 52 41 47  appendArgs "PRAG
14940 4d 41 20 22 20 24 64 69 72 65 63 74 6f 72 79 20  MA " $directory 
14950 5c 3b 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  \;]....         
14960 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 65 78 65   if {[catch {exe
14970 63 75 74 65 53 71 6c 20 24 73 71 6c 20 73 63 61  cuteSql $sql sca
14980 6c 61 72 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20  lar} result] == 
14990 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
149a0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
149b0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
149c0 73 20 22 6f 6b 3a 20 5c 22 22 20 24 72 65 73 75  s "ok: \"" $resu
149d0 6c 74 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  lt \"\n]..      
149e0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
149f0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
14a00 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
14a10 41 72 67 73 20 22 65 72 72 6f 72 3a 20 22 20 5c  Args "error: " \
14a20 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d  n\t $result \n].
14a30 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
14a40 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
14a50 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
14a60 70 72 6f 63 20 6c 6f 61 64 53 51 4c 69 74 65 54  proc loadSQLiteT
14a70 65 73 74 53 65 74 74 69 6e 67 73 20 7b 20 63 68  estSettings { ch
14a80 61 6e 6e 65 6c 20 7b 73 75 66 66 69 78 20 22 22  annel {suffix ""
14a90 7d 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20  } {quiet false} 
14aa0 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
14ab0 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70      # NOTE: Skip
14ac0 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 73 65 74   loading the set
14ad0 74 69 6e 67 73 20 69 66 20 74 68 65 69 72 20 75  tings if their u
14ae0 73 61 67 65 20 68 61 73 20 62 65 65 6e 20 64 69  sage has been di
14af0 73 61 62 6c 65 64 2e 0d 0a 20 20 20 20 20 20 23  sabled...      #
14b00 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e  ..      if {![in
14b10 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73  fo exists ::no(s
14b20 71 6c 69 74 65 54 65 73 74 53 65 74 74 69 6e 67  qliteTestSetting
14b30 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
14b40 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
14b50 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 63 75 73  # NOTE: Load cus
14b60 74 6f 6d 20 70 65 72 2d 75 73 65 72 20 61 6e 64  tom per-user and
14b70 2f 6f 72 20 70 65 72 2d 68 6f 73 74 20 74 65 73  /or per-host tes
14b80 74 20 73 65 74 74 69 6e 67 73 20 6e 6f 77 2e 0d  t settings now..
14b90 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
14ba0 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
14bb0 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66  ists ::tcl_platf
14bc0 6f 72 6d 28 75 73 65 72 29 5d 7d 20 74 68 65 6e  orm(user)]} then
14bd0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
14be0 74 20 75 73 65 72 53 65 74 74 69 6e 67 73 46 69  t userSettingsFi
14bf0 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  leName [file joi
14c00 6e 20 5b 67 65 74 43 6f 6d 6d 6f 6e 44 69 72 65  n [getCommonDire
14c10 63 74 6f 72 79 5d 20 5c 0d 0a 20 20 20 20 20 20  ctory] \..      
14c20 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41          [appendA
14c30 72 67 73 20 73 65 74 74 69 6e 67 73 20 24 73 75  rgs settings $su
14c40 66 66 69 78 20 2e 20 24 3a 3a 74 63 6c 5f 70 6c  ffix . $::tcl_pl
14c50 61 74 66 6f 72 6d 28 75 73 65 72 29 20 2e 65 61  atform(user) .ea
14c60 67 6c 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  gle]]....       
14c70 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69     if {[file exi
14c80 73 74 73 20 24 75 73 65 72 53 65 74 74 69 6e 67  sts $userSetting
14c90 73 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  sFileName]} then
14ca0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
14cb0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
14cc0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
14cd0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
14ce0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
14cf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14d00 20 20 20 22 2d 2d 2d 2d 20 6c 6f 61 64 69 6e 67     "---- loading
14d10 20 70 65 72 2d 75 73 65 72 20 74 65 73 74 20 73   per-user test s
14d20 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22  ettings file \""
14d30 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
14d40 20 20 20 20 20 20 24 75 73 65 72 53 65 74 74 69        $userSetti
14d50 6e 67 73 46 69 6c 65 4e 61 6d 65 20 5c 22 2e 2e  ngsFileName \"..
14d60 2e 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  .\n]..          
14d70 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
14d80 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 75     if {[catch {u
14d90 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 73  plevel 1 [list s
14da0 6f 75 72 63 65 20 24 75 73 65 72 53 65 74 74 69  ource $userSetti
14db0 6e 67 73 46 69 6c 65 4e 61 6d 65 5d 7d 20 5c 0d  ngsFileName]} \.
14dc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14dd0 20 20 20 20 20 65 72 72 6f 72 5d 7d 20 74 68 65       error]} the
14de0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
14df0 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
14e00 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
14e10 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
14e20 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
14e30 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
14e40 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
14e50 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
14e60 74 6f 20 6c 6f 61 64 20 70 65 72 2d 75 73 65 72  to load per-user
14e70 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c   settings file \
14e80 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
14e90 20 20 20 20 20 20 20 20 20 20 24 75 73 65 72 53            $userS
14ea0 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20  ettingsFileName 
14eb0 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e  "\", error: " \n
14ec0 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20  \t $error \n].. 
14ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
14ee0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
14ef0 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
14f00 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
14f10 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
14f20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
14f30 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
14f40 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
14f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f60 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20    "---- skipped 
14f70 6c 6f 61 64 69 6e 67 20 70 65 72 2d 75 73 65 72  loading per-user
14f80 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 66   test settings f
14f90 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ile \"" \..     
14fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 24 75 73               $us
14fb0 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61  erSettingsFileNa
14fc0 6d 65 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20  me "\", it does 
14fd0 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20  not exist\n"].. 
14fe0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
14ff0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
15000 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
15010 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15020 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15030 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15040 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15050 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20  #######....     
15060 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
15070 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f  sts ::tcl_platfo
15080 72 6d 28 68 6f 73 74 29 5d 7d 20 74 68 65 6e 20  rm(host)]} then 
15090 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
150a0 20 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c   hostSettingsFil
150b0 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  eName [file join
150c0 20 5b 67 65 74 43 6f 6d 6d 6f 6e 44 69 72 65 63   [getCommonDirec
150d0 74 6f 72 79 5d 20 5c 0d 0a 20 20 20 20 20 20 20  tory] \..       
150e0 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72         [appendAr
150f0 67 73 20 73 65 74 74 69 6e 67 73 20 24 73 75 66  gs settings $suf
15100 66 69 78 20 2e 20 24 3a 3a 74 63 6c 5f 70 6c 61  fix . $::tcl_pla
15110 74 66 6f 72 6d 28 68 6f 73 74 29 20 2e 65 61 67  tform(host) .eag
15120 6c 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  le]]....        
15130 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73    if {[file exis
15140 74 73 20 24 68 6f 73 74 53 65 74 74 69 6e 67 73  ts $hostSettings
15150 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  FileName]} then 
15160 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
15170 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
15180 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
15190 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
151a0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
151b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
151c0 20 20 22 2d 2d 2d 2d 20 6c 6f 61 64 69 6e 67 20    "---- loading 
151d0 70 65 72 2d 68 6f 73 74 20 74 65 73 74 20 73 65  per-host test se
151e0 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20  ttings file \"" 
151f0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
15200 20 20 20 20 20 24 68 6f 73 74 53 65 74 74 69 6e       $hostSettin
15210 67 73 46 69 6c 65 4e 61 6d 65 20 5c 22 2e 2e 2e  gsFileName \"...
15220 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n]..           
15230 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
15240 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 75 70    if {[catch {up
15250 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 73 6f  level 1 [list so
15260 75 72 63 65 20 24 68 6f 73 74 53 65 74 74 69 6e  urce $hostSettin
15270 67 73 46 69 6c 65 4e 61 6d 65 5d 7d 20 5c 0d 0a  gsFileName]} \..
15280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15290 20 20 20 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e      error]} then
152a0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
152b0 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
152c0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
152d0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
152e0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
152f0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
15300 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
15310 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
15320 6f 20 6c 6f 61 64 20 70 65 72 2d 68 6f 73 74 20  o load per-host 
15330 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22  settings file \"
15340 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
15350 20 20 20 20 20 20 20 20 20 24 68 6f 73 74 53 65           $hostSe
15360 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22  ttingsFileName "
15370 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  \", error: " \n\
15380 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20  t $error \n]..  
15390 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
153a0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
153b0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
153c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
153d0 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
153e0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
153f0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
15400 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
15410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15420 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6c   "---- skipped l
15430 6f 61 64 69 6e 67 20 70 65 72 2d 68 6f 73 74 20  oading per-host 
15440 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 66 69  test settings fi
15450 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  le \"" \..      
15460 20 20 20 20 20 20 20 20 20 20 20 20 24 68 6f 73              $hos
15470 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d  tSettingsFileNam
15480 65 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e  e "\", it does n
15490 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20  ot exist\n"]..  
154a0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
154b0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
154c0 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
154d0 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
154e0 20 72 75 6e 53 51 4c 69 74 65 54 65 73 74 50 72   runSQLiteTestPr
154f0 6f 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20 20 20  ologue {} {..   
15500 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
15510 54 45 3a 20 53 6b 69 70 20 72 75 6e 6e 69 6e 67  TE: Skip running
15520 20 6f 75 72 20 63 75 73 74 6f 6d 20 70 72 6f 6c   our custom prol
15530 6f 67 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e  ogue if the main
15540 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 0d 0a 20   one has been.. 
15550 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6b 69       #       ski
15560 70 70 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  pped...      #..
15570 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
15580 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 70 72 6f   exists ::no(pro
15590 6c 6f 67 75 65 2e 65 61 67 6c 65 29 5d 7d 20 74  logue.eagle)]} t
155a0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
155b0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
155c0 3a 20 4c 6f 61 64 20 74 68 65 20 22 62 65 66 6f  : Load the "befo
155d0 72 65 2d 63 6f 6e 73 74 72 61 69 6e 74 73 22 20  re-constraints" 
155e0 63 75 73 74 6f 6d 20 70 65 72 2d 75 73 65 72 20  custom per-user 
155f0 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74 0d  and/or per-host.
15600 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
15610 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 6e   test settings n
15620 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ow...        #..
15630 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20          uplevel 
15640 31 20 5b 6c 69 73 74 20 6c 6f 61 64 53 51 4c 69  1 [list loadSQLi
15650 74 65 54 65 73 74 53 65 74 74 69 6e 67 73 20 24  teTestSettings $
15660 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 2e  ::test_channel .
15670 62 65 66 6f 72 65 5d 0d 0a 0d 0a 20 20 20 20 20  before]....     
15680 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
15690 4e 4f 54 45 3a 20 44 65 74 65 72 6d 69 6e 65 20  NOTE: Determine 
156a0 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65  the names of the
156b0 20 6e 61 74 69 76 65 20 70 6c 61 74 66 6f 72 6d   native platform
156c0 20 61 6e 64 20 61 72 63 68 69 74 65 63 74 75 72   and architectur
156d0 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
156e0 20 20 20 20 20 20 20 73 65 74 20 70 6c 61 74 66         set platf
156f0 6f 72 6d 20 5b 67 65 74 42 75 69 6c 64 50 6c 61  orm [getBuildPla
15700 74 66 6f 72 6d 20 74 72 75 65 5d 0d 0a 20 20 20  tform true]..   
15710 20 20 20 20 20 73 65 74 20 61 72 63 68 69 74 65       set archite
15720 63 74 75 72 65 20 5b 61 72 63 68 69 74 65 63 74  cture [architect
15730 75 72 65 46 6f 72 50 6c 61 74 66 6f 72 6d 20 24  ureForPlatform $
15740 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20  platform]....   
15750 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
15760 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68 65  # NOTE: Show the
15770 20 70 6c 61 74 66 6f 72 6d 20 61 6e 64 20 61 72   platform and ar
15780 63 68 69 74 65 63 74 75 72 65 20 75 73 65 64 20  chitecture used 
15790 74 6f 20 68 65 6c 70 20 6c 6f 63 61 74 65 20 74  to help locate t
157a0 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  he..        #   
157b0 20 20 20 20 6e 61 74 69 76 65 20 62 75 69 6c 64      native build
157c0 20 66 69 6c 65 73 2e 0d 0a 20 20 20 20 20 20 20   files...       
157d0 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   #..        tput
157e0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
157f0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
15800 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
15810 2d 2d 20 70 6c 61 74 66 6f 72 6d 20 66 6f 72 20  -- platform for 
15820 6c 6f 63 61 74 69 6e 67 20 6e 61 74 69 76 65 20  locating native 
15830 62 75 69 6c 64 20 66 69 6c 65 73 20 69 73 20 5c  build files is \
15840 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
15850 20 20 24 70 6c 61 74 66 6f 72 6d 20 5c 22 5c 6e    $platform \"\n
15860 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75  ]....        tpu
15870 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
15880 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
15890 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
158a0 2d 2d 2d 20 61 72 63 68 69 74 65 63 74 75 72 65  --- architecture
158b0 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67 20 6e 61   for locating na
158c0 74 69 76 65 20 62 75 69 6c 64 20 66 69 6c 65 73  tive build files
158d0 20 69 73 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20   is \"" \..     
158e0 20 20 20 20 20 20 20 24 61 72 63 68 69 74 65 63         $architec
158f0 74 75 72 65 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20  ture \"\n]....  
15900 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
15910 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 61   # NOTE: Build a
15920 20 6c 69 73 74 20 6f 66 20 63 6f 6e 66 69 67 75   list of configu
15930 72 61 74 69 6f 6e 20 66 69 6c 65 73 20 74 68 61  ration files tha
15940 74 20 77 65 20 68 61 6e 64 6c 65 2e 0d 0a 20 20  t we handle...  
15950 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
15960 20 73 65 74 20 63 6f 6e 66 69 67 46 69 6c 65 4e   set configFileN
15970 61 6d 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20  ames [list \..  
15980 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
15990 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
159a0 2e 63 6f 6e 66 69 67 5d 0d 0a 0d 0a 20 20 20 20  .config]....    
159b0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
159c0 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 61 20 6c   NOTE: Build a l
159d0 69 73 74 20 6f 66 20 61 75 78 69 6c 69 61 72 79  ist of auxiliary
159e0 20 4d 61 6e 61 67 65 64 20 44 65 62 75 67 67 69   Managed Debuggi
159f0 6e 67 20 41 73 73 69 73 74 61 6e 74 73 20 28 4d  ng Assistants (M
15a00 44 41 29 0d 0a 20 20 20 20 20 20 20 20 23 20 20  DA)..        #  
15a10 20 20 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69       configurati
15a20 6f 6e 20 66 69 6c 65 73 20 74 68 61 74 20 77 65  on files that we
15a30 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20   handle...      
15a40 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74    #..        set
15a50 20 6d 64 61 43 6f 6e 66 69 67 46 69 6c 65 4e 61   mdaConfigFileNa
15a60 6d 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20  mes [list \..   
15a70 20 20 20 20 20 20 20 20 20 49 6e 73 74 61 6c 6c           Install
15a80 65 72 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69  er.exe.mda.confi
15a90 67 20 74 65 73 74 2e 65 78 65 2e 6d 64 61 2e 63  g test.exe.mda.c
15aa0 6f 6e 66 69 67 20 5c 0d 0a 20 20 20 20 20 20 20  onfig \..       
15ab0 20 20 20 20 20 74 65 73 74 6c 69 6e 71 2e 65 78       testlinq.ex
15ac0 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 74 65 73  e.mda.config tes
15ad0 74 65 66 36 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e  tef6.exe.mda.con
15ae0 66 69 67 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  fig]....        
15af0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
15b00 45 3a 20 42 75 69 6c 64 20 74 68 65 20 6c 69 73  E: Build the lis
15b10 74 20 6f 66 20 65 78 74 65 72 6e 61 6c 20 66 69  t of external fi
15b20 6c 65 73 20 74 68 61 74 20 77 65 20 68 61 6e 64  les that we hand
15b30 6c 65 2e 20 20 53 6f 6d 65 20 6f 66 0d 0a 20 20  le.  Some of..  
15b40 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
15b50 65 73 65 20 66 69 6c 65 73 20 6d 61 79 20 62 65  ese files may be
15b60 20 6e 61 74 69 76 65 20 61 6e 64 2f 6f 72 20 6d   native and/or m
15b70 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 69 65  anaged assemblie
15b80 73 20 74 68 61 74 20 61 72 65 0d 0a 20 20 20 20  s that are..    
15b90 20 20 20 20 23 20 20 20 20 20 20 20 72 65 71 75      #       requ
15ba0 69 72 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20  ired to perform 
15bb0 76 61 72 69 6f 75 73 20 74 65 73 74 73 2e 0d 0a  various tests...
15bc0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
15bd0 20 20 20 73 65 74 20 65 78 74 65 72 6e 61 6c 46     set externalF
15be0 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74 20 5c  ileNames [list \
15bf0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
15c00 69 6c 65 20 6a 6f 69 6e 20 45 6e 74 69 74 79 46  ile join EntityF
15c10 72 61 6d 65 77 6f 72 6b 20 6c 69 62 20 5b 73 74  ramework lib [st
15c20 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20 46  ring map [list F
15c30 78 20 22 22 5d 20 5b 73 74 72 69 6e 67 20 5c 0d  x ""] [string \.
15c40 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 70  .            map
15c50 20 5b 6c 69 73 74 20 6e 65 74 46 78 34 35 31 20   [list netFx451 
15c60 6e 65 74 46 78 34 35 5d 20 5b 67 65 74 42 75 69  netFx45] [getBui
15c70 6c 64 4e 65 74 46 78 5d 5d 5d 20 45 6e 74 69 74  ldNetFx]]] Entit
15c80 79 46 72 61 6d 65 77 6f 72 6b 2e 64 6c 6c 5d 5d  yFramework.dll]]
15c90 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
15ca0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42         # NOTE: B
15cb0 75 69 6c 64 20 74 68 65 20 6c 69 73 74 20 6f 66  uild the list of
15cc0 20 6e 61 74 69 76 65 20 61 73 73 65 6d 62 6c 79   native assembly
15cd0 20 66 69 6c 65 73 20 74 68 61 74 20 77 65 20 68   files that we h
15ce0 61 6e 64 6c 65 2e 20 20 54 68 65 0d 0a 20 20 20  andle.  The..   
15cf0 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65 61       #       rea
15d00 73 6f 6e 20 74 68 65 20 22 53 79 73 74 65 6d 2e  son the "System.
15d10 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 22  Data.SQLite.dll"
15d20 20 66 69 6c 65 20 69 73 20 69 6e 63 6c 75 64 65   file is include
15d30 64 20 68 65 72 65 20 69 73 0d 0a 20 20 20 20 20  d here is..     
15d40 20 20 20 23 20 20 20 20 20 20 20 62 65 63 61 75     #       becau
15d50 73 65 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74  se it could be t
15d60 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73  he mixed-mode as
15d70 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20  sembly...       
15d80 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
15d90 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20  nativeFileNames 
15da0 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20  [list \..       
15db0 20 20 20 20 20 73 71 6c 69 74 65 33 2e 64 6c 6c       sqlite3.dll
15dc0 20 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e   SQLite.Interop.
15dd0 64 6c 6c 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  dll System.Data.
15de0 53 51 4c 69 74 65 2e 64 6c 6c 5d 0d 0a 0d 0a 20  SQLite.dll].... 
15df0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
15e00 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20    # NOTE: Build 
15e10 74 68 65 20 6c 69 73 74 20 6f 66 20 6d 61 6e 61  the list of mana
15e20 67 65 64 20 61 73 73 65 6d 62 6c 79 20 66 69 6c  ged assembly fil
15e30 65 73 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c  es that we handl
15e40 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
15e50 20 20 20 20 20 20 20 73 65 74 20 6d 61 6e 61 67         set manag
15e60 65 64 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73  edFileNames [lis
15e70 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
15e80 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
15e90 69 74 65 2e 64 6c 6c 20 53 79 73 74 65 6d 2e 44  ite.dll System.D
15ea0 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e  ata.SQLite.Linq.
15eb0 64 6c 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  dll \..         
15ec0 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
15ed0 51 4c 69 74 65 2e 45 46 36 2e 64 6c 6c 5d 0d 0a  QLite.EF6.dll]..
15ee0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
15ef0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 6d       # NOTE: Rem
15f00 6f 76 65 20 61 6e 79 20 74 65 73 74 20 63 6f 6e  ove any test con
15f10 73 74 72 61 69 6e 74 73 20 74 68 61 74 20 72 65  straints that re
15f20 66 65 72 20 74 6f 20 74 68 65 20 6e 61 74 69 76  fer to the nativ
15f30 65 20 61 6e 64 2f 6f 72 0d 0a 20 20 20 20 20 20  e and/or..      
15f40 20 20 23 20 20 20 20 20 20 20 6d 61 6e 61 67 65    #       manage
15f50 64 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 73  d assembly files
15f60 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65 20   that we handle 
15f70 75 6e 6c 65 73 73 20 66 6f 72 62 69 64 64 65 6e  unless forbidden
15f80 20 66 72 6f 6d 0d 0a 20 20 20 20 20 20 20 20 23   from..        #
15f90 20 20 20 20 20 20 20 64 6f 69 6e 67 20 73 6f 2e         doing so.
15fa0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
15fb0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
15fc0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69  exists ::no(sqli
15fd0 74 65 52 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69  teRemoveConstrai
15fe0 6e 74 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  nts)]} then {.. 
15ff0 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
16000 20 66 69 6c 65 4e 61 6d 65 20 24 63 6f 6e 66 69   fileName $confi
16010 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  gFileNames {..  
16020 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76 65            remove
16030 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
16040 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 24 66 69  ndArgs file_ $fi
16050 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20  leName]..       
16060 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
16070 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
16080 6d 65 20 24 6d 64 61 43 6f 6e 66 69 67 46 69 6c  me $mdaConfigFil
16090 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
160a0 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73        removeCons
160b0 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
160c0 67 73 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61  gs file_ $fileNa
160d0 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  me]..          }
160e0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f  ....          fo
160f0 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
16100 65 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65  externalFileName
16110 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
16120 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e   removeConstrain
16130 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
16140 6c 65 5f 20 5b 66 69 6c 65 20 74 61 69 6c 20 24  le_ [file tail $
16150 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20  fileName]]..    
16160 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
16170 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
16180 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c  eName $nativeFil
16190 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
161a0 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73        removeCons
161b0 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
161c0 67 73 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61  gs file_ $fileNa
161d0 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  me]..          }
161e0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f  ....          fo
161f0 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
16200 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73  managedFileNames
16210 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
16220 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74  removeConstraint
16230 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
16240 65 5f 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20  e_ $fileName].. 
16250 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
16260 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
16270 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
16280 54 45 3a 20 53 6b 69 70 20 61 6c 6c 20 53 79 73  TE: Skip all Sys
16290 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
162a0 72 65 6c 61 74 65 64 20 66 69 6c 65 20 68 61 6e  related file han
162b0 64 6c 69 6e 67 20 28 64 65 6c 65 74 69 6e 67 2c  dling (deleting,
162c0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
162d0 20 20 63 6f 70 79 69 6e 67 2c 20 61 6e 64 20 6c    copying, and l
162e0 6f 61 64 69 6e 67 29 20 69 66 20 69 6e 73 74 72  oading) if instr
162f0 75 63 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20  ucted...        
16300 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  #..        if {!
16310 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
16320 6f 28 73 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d  o(sqliteFiles)]}
16330 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
16340 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
16350 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72 79  # NOTE: Skip try
16360 69 6e 67 20 74 6f 20 64 65 6c 65 74 65 20 61 6e  ing to delete an
16370 79 20 66 69 6c 65 73 20 69 66 20 69 6e 73 74 72  y files if instr
16380 75 63 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20  ucted...        
16390 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69    #..          i
163a0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
163b0 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69   ::no(deleteSqli
163c0 74 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  teFiles)]} then 
163d0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
163e0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
163f0 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69   ::no(deleteSqli
16400 74 65 43 6f 6e 66 69 67 46 69 6c 65 73 29 5d 7d  teConfigFiles)]}
16410 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
16420 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
16430 69 6c 65 4e 61 6d 65 20 24 63 6f 6e 66 69 67 46  ileName $configF
16440 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
16450 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44              tryD
16460 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20  eleteBinaryFile 
16470 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  $fileName..     
16480 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
16490 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
164a0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
164b0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
164c0 64 65 6c 65 74 65 53 71 6c 69 74 65 45 78 74 65  deleteSqliteExte
164d0 72 6e 61 6c 46 69 6c 65 73 29 5d 7d 20 74 68 65  rnalFiles)]} the
164e0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
164f0 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
16500 61 6d 65 20 24 6d 64 61 43 6f 6e 66 69 67 46 69  ame $mdaConfigFi
16510 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
16520 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65             tryDe
16530 6c 65 74 65 42 75 69 6c 64 46 69 6c 65 20 24 66  leteBuildFile $f
16540 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20  ileName..       
16550 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
16560 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
16570 68 20 66 69 6c 65 4e 61 6d 65 20 24 65 78 74 65  h fileName $exte
16580 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  rnalFileNames {.
16590 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
165a0 20 74 72 79 44 65 6c 65 74 65 42 69 6e 61 72 79   tryDeleteBinary
165b0 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a  File $fileName..
165c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
165d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
165e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
165f0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
16600 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74  ::no(deleteSqlit
16610 65 4e 61 74 69 76 65 46 69 6c 65 73 29 5d 7d 20  eNativeFiles)]} 
16620 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
16630 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
16640 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c   exists ::no(del
16650 65 74 65 53 71 6c 69 74 65 49 6d 70 6c 69 63 69  eteSqliteImplici
16660 74 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  tFiles)]} then {
16670 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
16680 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
16690 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61  me $nativeFileNa
166a0 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
166b0 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c 65           tryDele
166c0 74 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65  teAssembly $file
166d0 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Name..          
166e0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
166f0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
16700 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
16710 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
16720 28 64 65 6c 65 74 65 53 71 6c 69 74 65 4e 6f 6e  (deleteSqliteNon
16730 49 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d  ImplicitFiles)]}
16740 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
16750 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
16760 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
16770 64 65 6c 65 74 65 53 71 6c 69 74 65 50 6c 61 74  deleteSqlitePlat
16780 66 6f 72 6d 46 69 6c 65 73 29 5d 20 26 26 20 5c  formFiles)] && \
16790 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
167a0 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
167b0 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20  ngth $platform] 
167c0 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
167d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
167e0 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
167f0 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73  $nativeFileNames
16800 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
16810 20 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74          tryDelet
16820 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e  eAssembly $fileN
16830 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 20  ame $platform.. 
16840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16850 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
16860 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
16870 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
16880 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
16890 64 65 6c 65 74 65 53 71 6c 69 74 65 41 72 63 68  deleteSqliteArch
168a0 69 74 65 63 74 75 72 65 46 69 6c 65 73 29 5d 20  itectureFiles)] 
168b0 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
168c0 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
168d0 67 20 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74  g length $archit
168e0 65 63 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65  ecture] > 0} the
168f0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
16900 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
16910 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46  ileName $nativeF
16920 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
16930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16940 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c  tryDeleteAssembl
16950 79 20 24 66 69 6c 65 4e 61 6d 65 20 24 61 72 63  y $fileName $arc
16960 68 69 74 65 63 74 75 72 65 0d 0a 20 20 20 20 20  hitecture..     
16970 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
16980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16990 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
169a0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
169b0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
169c0 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
169d0 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71  ts ::no(deleteSq
169e0 6c 69 74 65 4d 61 6e 61 67 65 64 46 69 6c 65 73  liteManagedFiles
169f0 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
16a00 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
16a10 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61  h fileName $mana
16a20 67 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  gedFileNames {..
16a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a40 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c  tryDeleteAssembl
16a50 79 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  y $fileName..   
16a60 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
16a70 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
16a80 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
16a90 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
16aa0 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
16ab0 20 66 6f 72 20 74 68 65 20 22 61 75 74 6f 53 65   for the "autoSe
16ac0 6c 65 63 74 22 20 72 75 6e 74 69 6d 65 20 6f 70  lect" runtime op
16ad0 74 69 6f 6e 2e 20 20 49 66 20 70 72 65 73 65 6e  tion.  If presen
16ae0 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  t,..          # 
16af0 20 20 20 20 20 20 61 74 74 65 6d 70 74 20 74 6f        attempt to
16b00 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73   automatically s
16b10 65 6c 65 63 74 20 74 68 65 20 66 69 72 73 74 20  elect the first 
16b20 61 76 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20  available..     
16b30 20 20 20 20 20 23 20 20 20 20 20 20 20 62 75 69       #       bui
16b40 6c 64 20 28 6f 72 20 22 72 65 6c 65 61 73 65 22  ld (or "release"
16b50 29 20 6f 66 20 53 51 4c 69 74 65 20 61 6e 64 20  ) of SQLite and 
16b60 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
16b70 74 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  te..          # 
16b80 20 20 20 20 20 20 66 6f 72 20 75 73 65 20 77 69        for use wi
16b90 74 68 20 74 68 65 20 74 65 73 74 20 73 75 69 74  th the test suit
16ba0 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  e...          #.
16bb0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
16bc0 68 61 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  hasRuntimeOption
16bd0 20 61 75 74 6f 53 65 6c 65 63 74 5d 7d 20 74 68   autoSelect]} th
16be0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
16bf0 20 20 69 66 20 7b 21 5b 63 68 65 63 6b 46 6f 72    if {![checkFor
16c00 53 51 4c 69 74 65 42 75 69 6c 64 73 20 24 3a 3a  SQLiteBuilds $::
16c10 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75  test_channel tru
16c20 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
16c30 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
16c40 6f 72 53 51 4c 69 74 65 52 65 6c 65 61 73 65 73  orSQLiteReleases
16c50 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
16c60 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 20   true..         
16c70 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
16c80 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23  }....          #
16c90 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
16ca0 54 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20  TE: Skip trying 
16cb0 74 6f 20 76 65 72 69 66 79 20 74 68 65 20 62 75  to verify the bu
16cc0 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20 69 66  ild directory if
16cd0 20 69 6e 73 74 72 75 63 74 65 64 3b 0d 0a 20 20   instructed;..  
16ce0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
16cf0 6f 74 68 65 72 77 69 73 65 2c 20 6d 61 6b 65 20  otherwise, make 
16d00 73 75 72 65 20 69 74 20 61 63 74 75 61 6c 6c 79  sure it actually
16d10 20 65 78 69 73 74 73 20 6f 72 20 68 61 6c 74 20   exists or halt 
16d20 74 68 65 20 65 6e 74 69 72 65 0d 0a 20 20 20 20  the entire..    
16d30 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65        #       te
16d40 73 74 69 6e 67 20 70 72 6f 63 65 73 73 20 69 66  sting process if
16d50 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
16d60 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  st...          #
16d70 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
16d80 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
16d90 6e 6f 28 76 65 72 69 66 79 42 75 69 6c 64 44 69  no(verifyBuildDi
16da0 72 65 63 74 6f 72 79 29 5d 7d 20 74 68 65 6e 20  rectory)]} then 
16db0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  {..            #
16dc0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
16dd0 4e 4f 54 45 3a 20 41 74 20 74 68 69 73 20 70 6f  NOTE: At this po
16de0 69 6e 74 2c 20 74 68 65 20 62 75 69 6c 64 20 64  int, the build d
16df0 69 72 65 63 74 6f 72 79 20 4d 55 53 54 20 65 78  irectory MUST ex
16e00 69 73 74 20 61 73 20 61 0d 0a 20 20 20 20 20 20  ist as a..      
16e10 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61        #       va
16e20 6c 69 64 20 64 69 72 65 63 74 6f 72 79 20 66 6f  lid directory fo
16e30 72 20 74 68 65 20 74 65 73 74 69 6e 67 20 70 72  r the testing pr
16e40 6f 63 65 73 73 20 74 6f 20 63 6f 6e 74 69 6e 75  ocess to continu
16e50 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e...            
16e60 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  #..            s
16e70 65 74 20 64 69 72 65 63 74 6f 72 79 20 5b 67 65  et directory [ge
16e80 74 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79 5d  tBuildDirectory]
16e90 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
16ea0 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74  if {![file exist
16eb0 73 20 24 64 69 72 65 63 74 6f 72 79 5d 20 7c 7c  s $directory] ||
16ec0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
16ed0 20 20 20 20 21 5b 66 69 6c 65 20 69 73 64 69 72      ![file isdir
16ee0 65 63 74 6f 72 79 20 24 64 69 72 65 63 74 6f 72  ectory $director
16ef0 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  y]} then {..    
16f00 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
16f10 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
16f20 45 3a 20 4a 75 73 74 20 70 72 69 6f 72 20 74 6f  E: Just prior to
16f30 20 61 63 74 75 61 6c 6c 79 20 68 61 6c 74 69 6e   actually haltin
16f40 67 20 74 68 65 20 74 65 73 74 69 6e 67 20 70 72  g the testing pr
16f50 6f 63 65 73 73 2c 0d 0a 20 20 20 20 20 20 20 20  ocess,..        
16f60 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 64        #       ad
16f70 64 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 74 68  d an error to th
16f80 65 20 74 65 73 74 20 6c 6f 67 20 66 69 6c 65 2e  e test log file.
16f90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
16fa0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
16fb0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
16fc0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
16fd0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
16fe0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f          "---- co
16ff0 75 6c 64 20 6e 6f 74 20 76 65 72 69 66 79 20 62  uld not verify b
17000 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20 5c  uild directory \
17010 22 22 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d  "" $directory \.
17020 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17030 20 20 20 22 5c 22 2c 20 61 6c 6c 20 74 65 73 74     "\", all test
17040 69 6e 67 20 68 61 6c 74 65 64 5c 6e 22 5d 0d 0a  ing halted\n"]..
17050 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17060 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
17070 20 23 20 4e 4f 54 45 3a 20 52 61 69 73 69 6e 67   # NOTE: Raising
17080 20 61 20 73 63 72 69 70 74 20 65 72 72 6f 72 20   a script error 
17090 66 72 6f 6d 20 74 68 69 73 20 70 6f 69 6e 74 20  from this point 
170a0 73 68 6f 75 6c 64 20 68 61 6c 74 0d 0a 20 20 20  should halt..   
170b0 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
170c0 20 20 20 74 68 65 20 74 65 73 74 69 6e 67 20 70     the testing p
170d0 72 6f 63 65 73 73 2e 0d 0a 20 20 20 20 20 20 20  rocess...       
170e0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
170f0 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 5b 61          error [a
17100 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
17110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
17120 63 6f 75 6c 64 20 6e 6f 74 20 76 65 72 69 66 79  could not verify
17130 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79   build directory
17140 20 5c 22 22 20 24 64 69 72 65 63 74 6f 72 79 20   \"" $directory 
17150 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
17160 20 20 20 20 20 22 5c 22 2c 20 61 6c 6c 20 74 65       "\", all te
17170 73 74 69 6e 67 20 68 61 6c 74 65 64 22 5d 0d 0a  sting halted"]..
17180 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
17190 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
171a0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
171b0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69       # NOTE: Ski
171c0 70 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 70 79  p trying to copy
171d0 20 61 6e 79 20 66 69 6c 65 73 20 69 66 20 69 6e   any files if in
171e0 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20 20  structed...     
171f0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
17200 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
17210 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c  sts ::no(copySql
17220 69 74 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  iteFiles)]} then
17230 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
17240 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
17250 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74  s ::no(copySqlit
17260 65 43 6f 6e 66 69 67 46 69 6c 65 73 29 5d 7d 20  eConfigFiles)]} 
17270 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
17280 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
17290 6c 65 4e 61 6d 65 20 24 63 6f 6e 66 69 67 46 69  leName $configFi
172a0 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
172b0 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f             tryCo
172c0 70 79 42 75 69 6c 64 46 69 6c 65 20 24 66 69 6c  pyBuildFile $fil
172d0 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20  eName..         
172e0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
172f0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
17300 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
17310 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79  exists ::no(copy
17320 53 71 6c 69 74 65 45 78 74 65 72 6e 61 6c 46 69  SqliteExternalFi
17330 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
17340 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
17350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
17360 4e 4f 54 45 3a 20 43 6f 70 79 20 74 68 65 20 4d  NOTE: Copy the M
17370 61 6e 61 67 65 64 20 44 65 62 75 67 67 69 6e 67  anaged Debugging
17380 20 41 73 73 69 73 74 61 6e 74 73 20 28 4d 44 41   Assistants (MDA
17390 29 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0d  ) configuration.
173a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
173b0 20 20 20 20 20 20 20 66 69 6c 65 20 66 6f 72 20         file for 
173c0 74 68 65 20 45 61 67 6c 65 20 73 68 65 6c 6c 20  the Eagle shell 
173d0 74 6f 20 74 68 65 20 62 75 69 6c 64 20 6f 75 74  to the build out
173e0 70 75 74 20 64 69 72 65 63 74 6f 72 79 2c 0d 0a  put directory,..
173f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
17400 20 20 20 20 20 20 77 68 69 6c 65 20 75 73 69 6e        while usin
17410 67 20 65 61 63 68 20 6f 66 20 74 68 65 20 6e 61  g each of the na
17420 6d 65 73 20 6f 66 20 74 68 65 20 76 61 72 69 6f  mes of the vario
17430 75 73 20 6c 65 67 61 63 79 20 74 65 73 74 0d 0a  us legacy test..
17440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
17450 20 20 20 20 20 20 65 78 65 63 75 74 61 62 6c 65        executable
17460 73 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 68 65  s.  This will he
17470 6c 70 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  lp to make sure 
17480 74 68 61 74 20 61 6c 6c 20 74 68 65 0d 0a 20 20  that all the..  
17490 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
174a0 20 20 20 20 6c 65 67 61 63 79 20 74 65 73 74 73      legacy tests
174b0 20 72 75 6e 20 77 69 74 68 20 65 78 61 63 74 6c   run with exactl
174c0 79 20 74 68 65 20 73 61 6d 65 20 73 65 74 20 6f  y the same set o
174d0 66 20 4d 61 6e 61 67 65 64 0d 0a 20 20 20 20 20  f Managed..     
174e0 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
174f0 20 44 65 62 75 67 67 69 6e 67 20 41 73 73 69 73   Debugging Assis
17500 74 61 6e 74 73 20 63 6f 6e 66 69 67 75 72 65 64  tants configured
17510 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
17520 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
17530 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
17540 6d 65 20 24 6d 64 61 43 6f 6e 66 69 67 46 69 6c  me $mdaConfigFil
17550 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
17560 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70            tryCop
17570 79 42 69 6e 61 72 79 46 69 6c 65 20 45 61 67 6c  yBinaryFile Eagl
17580 65 53 68 65 6c 6c 2e 65 78 65 2e 6d 64 61 2e 63  eShell.exe.mda.c
17590 6f 6e 66 69 67 20 22 22 20 24 66 69 6c 65 4e 61  onfig "" $fileNa
175a0 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  me..            
175b0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
175c0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
175d0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f        # NOTE: Co
175e0 70 79 20 74 68 65 20 65 78 74 65 72 6e 61 6c 20  py the external 
175f0 62 69 6e 61 72 69 65 73 2c 20 69 66 20 61 6e 79  binaries, if any
17600 2c 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f  , to the directo
17610 72 79 20 74 68 61 74 0d 0a 20 20 20 20 20 20 20  ry that..       
17620 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
17630 6f 6e 74 61 69 6e 73 20 74 68 65 20 45 61 67 6c  ontains the Eagl
17640 65 20 73 68 65 6c 6c 2e 20 20 54 68 69 73 20 69  e shell.  This i
17650 73 20 74 79 70 69 63 61 6c 6c 79 20 75 73 65 64  s typically used
17660 20 74 6f 20 6d 61 6b 65 0d 0a 20 20 20 20 20 20   to make..      
17670 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
17680 73 75 72 65 20 61 73 73 65 6d 62 6c 69 65 73 20  sure assemblies 
17690 72 65 66 65 72 65 6e 63 65 64 20 62 79 20 74 68  referenced by th
176a0 65 20 6f 6e 65 73 20 62 65 69 6e 67 20 74 65 73  e ones being tes
176b0 74 65 64 20 61 72 65 0d 0a 20 20 20 20 20 20 20  ted are..       
176c0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
176d0 76 61 69 6c 61 62 6c 65 20 64 75 72 69 6e 67 20  vailable during 
176e0 74 68 65 20 74 65 73 74 69 6e 67 20 70 72 6f 63  the testing proc
176f0 65 73 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ess...          
17700 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
17710 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
17720 65 4e 61 6d 65 20 24 65 78 74 65 72 6e 61 6c 46  eName $externalF
17730 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
17740 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43              tryC
17750 6f 70 79 45 78 74 65 72 6e 61 6c 46 69 6c 65 20  opyExternalFile 
17760 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  $fileName..     
17770 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
17780 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
17790 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
177a0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
177b0 63 6f 70 79 53 71 6c 69 74 65 4e 61 74 69 76 65  copySqliteNative
177c0 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
177d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
177e0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
177f0 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65   ::no(copySqlite
17800 49 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d  ImplicitFiles)]}
17810 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
17820 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
17830 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76   fileName $nativ
17840 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  eFileNames {..  
17850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17860 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20  tryCopyAssembly 
17870 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  $fileName..     
17880 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
17890 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
178a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
178b0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
178c0 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65   ::no(copySqlite
178d0 4e 6f 6e 49 6d 70 6c 69 63 69 74 46 69 6c 65 73  NonImplicitFiles
178e0 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
178f0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
17900 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
17910 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 50 6c 61  no(copySqlitePla
17920 74 66 6f 72 6d 46 69 6c 65 73 29 5d 20 26 26 20  tformFiles)] && 
17930 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
17940 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
17950 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d  ength $platform]
17960 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
17970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17980 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
17990 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65   $nativeFileName
179a0 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
179b0 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79           tryCopy
179c0 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61  Assembly $fileNa
179d0 6d 65 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 20 20  me $platform..  
179e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179f0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
17a00 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
17a10 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
17a20 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63  fo exists ::no(c
17a30 6f 70 79 53 71 6c 69 74 65 41 72 63 68 69 74 65  opySqliteArchite
17a40 63 74 75 72 65 46 69 6c 65 73 29 5d 20 26 26 20  ctureFiles)] && 
17a50 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
17a60 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
17a70 65 6e 67 74 68 20 24 61 72 63 68 69 74 65 63 74  ength $architect
17a80 75 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ure] > 0} then {
17a90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17aa0 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
17ab0 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65  Name $nativeFile
17ac0 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
17ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
17ae0 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 24 66 69  CopyAssembly $fi
17af0 6c 65 4e 61 6d 65 20 24 61 72 63 68 69 74 65 63  leName $architec
17b00 74 75 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20  ture..          
17b10 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
17b20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
17b30 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
17b40 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
17b50 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
17b60 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
17b70 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 4d 61 6e  no(copySqliteMan
17b80 61 67 65 64 46 69 6c 65 73 29 5d 7d 20 74 68 65  agedFiles)]} the
17b90 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
17ba0 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
17bb0 61 6d 65 20 24 6d 61 6e 61 67 65 64 46 69 6c 65  ame $managedFile
17bc0 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
17bd0 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79           tryCopy
17be0 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61  Assembly $fileNa
17bf0 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  me..            
17c00 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
17c10 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
17c20 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
17c30 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
17c40 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74 6f  : Skip trying to
17c50 20 6c 6f 61 64 20 61 6e 79 20 66 69 6c 65 73 20   load any files 
17c60 69 66 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a  if instructed...
17c70 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
17c80 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
17c90 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f  o exists ::no(lo
17ca0 61 64 53 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d  adSqliteFiles)]}
17cb0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
17cc0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
17cd0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64  exists ::no(load
17ce0 53 71 6c 69 74 65 49 6d 70 6c 69 63 69 74 46 69  SqliteImplicitFi
17cf0 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
17d00 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
17d10 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20 53 79 73  LoadAssembly Sys
17d20 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
17d30 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  dll..           
17d40 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
17d50 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
17d60 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c  sts ::no(loadSql
17d70 69 74 65 4c 69 6e 71 46 69 6c 65 73 29 5d 7d 20  iteLinqFiles)]} 
17d80 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
17d90 20 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73        tryLoadAss
17da0 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74  embly System.Dat
17db0 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c  a.SQLite.Linq.dl
17dc0 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  l..            }
17dd0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
17de0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
17df0 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74  s ::no(loadSqlit
17e00 65 45 66 36 46 69 6c 65 73 29 5d 7d 20 74 68 65  eEf6Files)]} the
17e10 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
17e20 20 20 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62     tryLoadAssemb
17e30 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  ly System.Data.S
17e40 51 4c 69 74 65 2e 45 46 36 2e 64 6c 6c 0d 0a 20  QLite.EF6.dll.. 
17e50 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
17e60 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
17e70 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
17e80 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 4e 6f 6e  no(loadSqliteNon
17e90 49 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d  ImplicitFiles)]}
17ea0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
17eb0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
17ec0 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f  o exists ::no(lo
17ed0 61 64 53 71 6c 69 74 65 50 6c 61 74 66 6f 72 6d  adSqlitePlatform
17ee0 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20  Files)] && \..  
17ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f00 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
17f10 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74  platform] > 0} t
17f20 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
17f30 20 20 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73         tryLoadAs
17f40 73 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61  sembly System.Da
17f50 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 20 24 70  ta.SQLite.dll $p
17f60 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20  latform..       
17f70 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
17f80 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
17f90 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
17fa0 28 6c 6f 61 64 53 71 6c 69 74 65 41 72 63 68 69  (loadSqliteArchi
17fb0 74 65 63 74 75 72 65 46 69 6c 65 73 29 5d 20 26  tectureFiles)] &
17fc0 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
17fd0 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
17fe0 65 6e 67 74 68 20 24 61 72 63 68 69 74 65 63 74  ength $architect
17ff0 75 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ure] > 0} then {
18000 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18010 20 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c    tryLoadAssembl
18020 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  y System.Data.SQ
18030 4c 69 74 65 2e 64 6c 6c 20 24 61 72 63 68 69 74  Lite.dll $archit
18040 65 63 74 75 72 65 0d 0a 20 20 20 20 20 20 20 20  ecture..        
18050 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
18060 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
18070 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
18080 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20  ..        catch 
18090 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
180a0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
180b0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
180c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
180d0 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69  "---- file versi
180e0 6f 6e 20 6f 66 20 5c 22 73 71 6c 69 74 65 33 2e  on of \"sqlite3.
180f0 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5c 0d 0a 20 20  dll\"... " \..  
18100 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
18110 65 20 76 65 72 73 69 6f 6e 20 5b 67 65 74 42 69  e version [getBi
18120 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 73 71 6c  naryFileName sql
18130 69 74 65 33 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a  ite3.dll]] \n]..
18140 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
18150 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
18160 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
18170 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
18180 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
18190 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
181a0 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66   file version of
181b0 20 5c 22 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f   \"SQLite.Intero
181c0 70 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5c 0d 0a  p.dll\"... " \..
181d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66                [f
181e0 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67 65 74  ile version [get
181f0 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 53  BinaryFileName S
18200 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c  QLite.Interop.dl
18210 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  l]] \n]..       
18220 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61   }....        ca
18230 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
18240 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
18250 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
18260 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
18270 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76      "---- file v
18280 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53 79 73 74  ersion of \"Syst
18290 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
182a0 6c 6c 5c 22 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20  ll\"... " \..   
182b0 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
182c0 20 76 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e   version [getBin
182d0 61 72 79 46 69 6c 65 4e 61 6d 65 20 53 79 73 74  aryFileName Syst
182e0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
182f0 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  ll]] \n]..      
18300 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63    }....        c
18310 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
18320 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
18330 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
18340 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
18350 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20       "---- file 
18360 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53 79 73  version of \"Sys
18370 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
18380 4c 69 6e 71 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20  Linq.dll\"... " 
18390 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
183a0 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b   [file version [
183b0 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
183c0 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  e System.Data.SQ
183d0 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 5d 5d 20  Lite.Linq.dll]] 
183e0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  \n]..        }..
183f0 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20  ..        catch 
18400 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
18410 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
18420 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
18430 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18440 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69  "---- file versi
18450 6f 6e 20 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44  on of \"System.D
18460 61 74 61 2e 53 51 4c 69 74 65 2e 45 46 36 2e 64  ata.SQLite.EF6.d
18470 6c 6c 5c 22 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20  ll\"... " \..   
18480 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
18490 20 76 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e   version [getBin
184a0 61 72 79 46 69 6c 65 4e 61 6d 65 20 53 79 73 74  aryFileName Syst
184b0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 45  em.Data.SQLite.E
184c0 46 36 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20  F6.dll]] \n]..  
184d0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
184e0 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
184f0 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d  ength $platform]
18500 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
18510 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d          catch {.
18520 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
18530 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
18540 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
18550 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18560 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72    "---- file ver
18570 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24 70 6c 61  sion of \"" $pla
18580 74 66 6f 72 6d 20 5c 0d 0a 20 20 20 20 20 20 20  tform \..       
18590 20 20 20 20 20 20 20 20 20 22 2f 73 71 6c 69 74           "/sqlit
185a0 65 33 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5b 66  e3.dll\"... " [f
185b0 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20  ile version \.. 
185c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
185d0 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
185e0 65 20 73 71 6c 69 74 65 33 2e 64 6c 6c 20 24 70  e sqlite3.dll $p
185f0 6c 61 74 66 6f 72 6d 5d 5d 20 5c 6e 5d 0d 0a 20  latform]] \n].. 
18600 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
18610 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d          catch {.
18620 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
18630 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
18640 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
18650 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18660 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72    "---- file ver
18670 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24 70 6c 61  sion of \"" $pla
18680 74 66 6f 72 6d 20 5c 0d 0a 20 20 20 20 20 20 20  tform \..       
18690 20 20 20 20 20 20 20 20 20 22 2f 53 51 4c 69 74           "/SQLit
186a0 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 5c 22 2e  e.Interop.dll\".
186b0 2e 2e 20 22 20 5b 66 69 6c 65 20 76 65 72 73 69  .. " [file versi
186c0 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  on \..          
186d0 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61 72 79        [getBinary
186e0 46 69 6c 65 4e 61 6d 65 20 53 51 4c 69 74 65 2e  FileName SQLite.
186f0 49 6e 74 65 72 6f 70 2e 64 6c 6c 20 24 70 6c 61  Interop.dll $pla
18700 74 66 6f 72 6d 5d 5d 20 5c 6e 5d 0d 0a 20 20 20  tform]] \n]..   
18710 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
18720 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20        catch {.. 
18730 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
18740 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
18750 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
18760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18770 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69  "---- file versi
18780 6f 6e 20 6f 66 20 5c 22 22 20 24 70 6c 61 74 66  on of \"" $platf
18790 6f 72 6d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  orm \..         
187a0 20 20 20 20 20 20 20 22 2f 53 79 73 74 65 6d 2e         "/System.
187b0 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c  Data.SQLite.dll\
187c0 22 2e 2e 2e 20 22 20 5b 66 69 6c 65 20 76 65 72  "... " [file ver
187d0 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  sion \..        
187e0 20 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61          [getBina
187f0 72 79 46 69 6c 65 4e 61 6d 65 20 53 79 73 74 65  ryFileName Syste
18800 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
18810 6c 20 24 70 6c 61 74 66 6f 72 6d 5d 5d 20 5c 6e  l $platform]] \n
18820 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
18830 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
18840 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
18850 20 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74 65   length $archite
18860 63 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e  cture] > 0} then
18870 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61   {..          ca
18880 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
18890 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
188a0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
188b0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
188c0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69          "---- fi
188d0 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22  le version of \"
188e0 22 20 24 61 72 63 68 69 74 65 63 74 75 72 65 20  " $architecture 
188f0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
18900 20 20 20 22 2f 73 71 6c 69 74 65 33 2e 64 6c 6c     "/sqlite3.dll
18910 5c 22 2e 2e 2e 20 22 20 5b 66 69 6c 65 20 76 65  \"... " [file ve
18920 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20  rsion \..       
18930 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e           [getBin
18940 61 72 79 46 69 6c 65 4e 61 6d 65 20 73 71 6c 69  aryFileName sqli
18950 74 65 33 2e 64 6c 6c 20 24 61 72 63 68 69 74 65  te3.dll $archite
18960 63 74 75 72 65 5d 5d 20 5c 6e 5d 0d 0a 20 20 20  cture]] \n]..   
18970 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
18980 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20        catch {.. 
18990 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
189a0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
189b0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
189c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
189d0 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69  "---- file versi
189e0 6f 6e 20 6f 66 20 5c 22 22 20 24 61 72 63 68 69  on of \"" $archi
189f0 74 65 63 74 75 72 65 20 5c 0d 0a 20 20 20 20 20  tecture \..     
18a00 20 20 20 20 20 20 20 20 20 20 20 22 2f 53 51 4c             "/SQL
18a10 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 5c  ite.Interop.dll\
18a20 22 2e 2e 2e 20 22 20 5b 66 69 6c 65 20 76 65 72  "... " [file ver
18a30 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  sion \..        
18a40 20 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61          [getBina
18a50 72 79 46 69 6c 65 4e 61 6d 65 20 53 51 4c 69 74  ryFileName SQLit
18a60 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 20 24 61  e.Interop.dll $a
18a70 72 63 68 69 74 65 63 74 75 72 65 5d 5d 20 5c 6e  rchitecture]] \n
18a80 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
18a90 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61 74 63  ..          catc
18aa0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
18ab0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
18ac0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
18ad0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
18ae0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65        "---- file
18af0 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20   version of \"" 
18b00 24 61 72 63 68 69 74 65 63 74 75 72 65 20 5c 0d  $architecture \.
18b10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18b20 20 22 2f 53 79 73 74 65 6d 2e 44 61 74 61 2e 53   "/System.Data.S
18b30 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22  QLite.dll\"... "
18b40 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c   [file version \
18b50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18b60 20 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65    [getBinaryFile
18b70 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74 61  Name System.Data
18b80 2e 53 51 4c 69 74 65 2e 64 6c 6c 20 24 61 72 63  .SQLite.dll $arc
18b90 68 69 74 65 63 74 75 72 65 5d 5d 20 5c 6e 5d 0d  hitecture]] \n].
18ba0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
18bb0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
18bc0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
18bd0 4e 4f 54 45 3a 20 47 72 61 62 20 74 68 65 20 6c  NOTE: Grab the l
18be0 69 73 74 20 6f 66 20 6d 61 6e 61 67 65 64 20 61  ist of managed a
18bf0 73 73 65 6d 62 6c 69 65 73 20 66 6f 72 20 74 68  ssemblies for th
18c00 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73  e current proces
18c10 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  s..        #    
18c20 20 20 20 61 6e 64 20 72 65 70 6f 72 74 20 6f 6e     and report on
18c30 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61   the System.Data
18c40 2e 53 51 4c 69 74 65 20 72 65 6c 61 74 65 64 20  .SQLite related 
18c50 6f 6e 65 73 2e 0d 0a 20 20 20 20 20 20 20 20 23  ones...        #
18c60 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 61 73  ..        set as
18c70 73 65 6d 62 6c 69 65 73 20 5b 6f 62 6a 65 63 74  semblies [object
18c80 20 69 6e 76 6f 6b 65 20 41 70 70 44 6f 6d 61 69   invoke AppDomai
18c90 6e 2e 43 75 72 72 65 6e 74 44 6f 6d 61 69 6e 20  n.CurrentDomain 
18ca0 47 65 74 41 73 73 65 6d 62 6c 69 65 73 5d 0d 0a  GetAssemblies]..
18cb0 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74  ..        object
18cc0 20 66 6f 72 65 61 63 68 20 61 73 73 65 6d 62 6c   foreach assembl
18cd0 79 20 24 61 73 73 65 6d 62 6c 69 65 73 20 7b 0d  y $assemblies {.
18ce0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
18cf0 73 74 72 69 6e 67 20 6d 61 74 63 68 20 5c 7b 53  string match \{S
18d00 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
18d10 65 2a 20 24 61 73 73 65 6d 62 6c 79 5d 7d 20 74  e* $assembly]} t
18d20 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
18d30 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
18d40 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
18d50 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
18d60 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 6f          "---- fo
18d70 75 6e 64 20 6c 6f 61 64 65 64 20 61 73 73 65 6d  und loaded assem
18d80 62 6c 79 3a 20 22 20 24 61 73 73 65 6d 62 6c 79  bly: " $assembly
18d90 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
18da0 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
18db0 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d          catch {.
18dc0 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
18dd0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
18de0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
18df0 20 20 22 2d 2d 2d 2d 20 64 65 66 69 6e 65 20 63    "---- define c
18e00 6f 6e 73 74 61 6e 74 73 20 66 6f 72 20 5c 22 53  onstants for \"S
18e10 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
18e20 65 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  e\"... "....    
18e30 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
18e40 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   {object invoke 
18e50 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
18e60 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
18e70 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
18e80 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65  ta.SQLite.SQLite
18e90 33 20 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74  3 DefineConstant
18ea0 73 7d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  s} \..          
18eb0 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 43 6f          defineCo
18ec0 6e 73 74 61 6e 74 73 5d 20 3d 3d 20 30 7d 20 74  nstants] == 0} t
18ed0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
18ee0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
18ef0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
18f00 41 72 67 73 20 5b 66 6f 72 6d 61 74 4c 69 73 74  Args [formatList
18f10 20 5b 6c 73 6f 72 74 20 5c 0d 0a 20 20 20 20 20   [lsort \..     
18f20 20 20 20 20 20 20 20 20 20 20 20 24 64 65 66 69             $defi
18f30 6e 65 43 6f 6e 73 74 61 6e 74 73 5d 20 3c 6e 6f  neConstants] <no
18f40 6e 65 3e 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  ne>] \n]..      
18f50 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
18f60 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
18f70 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
18f80 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20  unknown\n..     
18f90 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
18fa0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74  }....        cat
18fb0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
18fc0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
18fd0 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20  annel \..       
18fe0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6f 75         "---- sou
18ff0 72 63 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c  rce version of \
19000 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  "System.Data.SQL
19010 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 0d 0a  ite.dll\"... "..
19020 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
19030 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20 69  [catch {object i
19040 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
19050 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
19060 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
19070 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
19080 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
19090 20 50 72 6f 76 69 64 65 72 56 65 72 73 69 6f 6e   ProviderVersion
190a0 7d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  } \..           
190b0 20 20 20 20 20 20 20 76 65 72 73 69 6f 6e 5d 20         version] 
190c0 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
190d0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73            if {[s
190e0 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65  tring length $ve
190f0 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65  rsion] == 0} the
19100 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
19110 20 20 20 73 65 74 20 76 65 72 73 69 6f 6e 20 6e     set version n
19120 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ull..           
19130 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
19140 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
19150 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
19160 73 20 24 76 65 72 73 69 6f 6e 20 5c 6e 5d 0d 0a  s $version \n]..
19170 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
19180 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
19190 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
191a0 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d  annel unknown\n.
191b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
191c0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
191d0 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20     catch {..    
191e0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
191f0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20  est_channel \.. 
19200 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
19210 2d 2d 20 73 6f 75 72 63 65 20 63 68 65 63 6b 6f  -- source checko
19220 75 74 20 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44  ut of \"System.D
19230 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c 22  ata.SQLite.dll\"
19240 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20  ... "....       
19250 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f     if {[catch {o
19260 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
19270 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
19280 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19290 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
192a0 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 43 6f 6e  SQLite.SQLiteCon
192b0 6e 65 63 74 69 6f 6e 20 50 72 6f 76 69 64 65 72  nection Provider
192c0 53 6f 75 72 63 65 49 64 7d 20 5c 0d 0a 20 20 20  SourceId} \..   
192d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
192e0 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74  ourceId] == 0} t
192f0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
19300 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
19310 65 6e 67 74 68 20 24 73 6f 75 72 63 65 49 64 5d  ength $sourceId]
19320 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
19330 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
19340 20 73 6f 75 72 63 65 49 64 20 6e 75 6c 6c 0d 0a   sourceId null..
19350 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
19360 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
19370 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
19380 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 73 6f   [appendArgs $so
19390 75 72 63 65 49 64 20 5c 6e 5d 0d 0a 20 20 20 20  urceId \n]..    
193a0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
193b0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
193c0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
193d0 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20  l unknown\n..   
193e0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
193f0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
19400 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
19410 3a 20 43 68 65 63 6b 20 74 68 65 20 61 76 61 69  : Check the avai
19420 6c 61 62 6c 65 20 62 75 69 6c 64 73 20 28 61 6e  lable builds (an
19430 64 20 22 72 65 6c 65 61 73 65 73 22 29 20 6f 66  d "releases") of
19440 20 53 51 4c 69 74 65 20 61 6e 64 0d 0a 20 20 20   SQLite and..   
19450 20 20 20 20 20 23 20 20 20 20 20 20 20 53 79 73       #       Sys
19460 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
19470 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
19480 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c       checkForSQL
19490 69 74 65 42 75 69 6c 64 73 20 24 3a 3a 74 65 73  iteBuilds $::tes
194a0 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20  t_channel..     
194b0 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74     checkForSQLit
194c0 65 52 65 6c 65 61 73 65 73 20 24 3a 3a 74 65 73  eReleases $::tes
194d0 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20  t_channel....   
194e0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
194f0 23 20 4e 4f 54 45 3a 20 4e 6f 77 2c 20 77 65 20  # NOTE: Now, we 
19500 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 66 20  need to know if 
19510 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20  the SQLite core 
19520 6c 69 62 72 61 72 79 20 69 73 20 61 76 61 69 6c  library is avail
19530 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20  able..        # 
19540 20 20 20 20 20 20 28 69 2e 65 2e 20 62 65 63 61        (i.e. beca
19550 75 73 65 20 74 68 65 20 6d 61 6e 61 67 65 64 2d  use the managed-
19560 6f 6e 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61  only System.Data
19570 2e 53 51 4c 69 74 65 20 61 73 73 65 6d 62 6c 79  .SQLite assembly
19580 20 63 61 6e 0d 0a 20 20 20 20 20 20 20 20 23 20   can..        # 
19590 20 20 20 20 20 20 6c 6f 61 64 20 77 69 74 68 6f        load witho
195a0 75 74 20 69 74 3b 20 68 6f 77 65 76 65 72 2c 20  ut it; however, 
195b0 69 74 20 63 61 6e 6e 6f 74 20 64 6f 20 61 6e 79  it cannot do any
195c0 74 68 69 6e 67 20 75 73 65 66 75 6c 20 77 69 74  thing useful wit
195d0 68 6f 75 74 0d 0a 20 20 20 20 20 20 20 20 23 20  hout..        # 
195e0 20 20 20 20 20 20 69 74 29 2e 20 20 49 66 20 77        it).  If w
195f0 65 20 61 72 65 20 75 73 69 6e 67 20 74 68 65 20  e are using the 
19600 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d  mixed-mode assem
19610 62 6c 79 20 61 6e 64 20 77 65 20 61 6c 72 65 61  bly and we alrea
19620 64 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  dy..        #   
19630 20 20 20 20 66 6f 75 6e 64 20 69 74 20 28 61 62      found it (ab
19640 6f 76 65 29 2c 20 74 68 69 73 20 73 68 6f 75 6c  ove), this shoul
19650 64 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64  d always succeed
19660 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
19670 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51        checkForSQ
19680 4c 69 74 65 4c 69 62 72 61 72 79 20 24 3a 3a 74  LiteLibrary $::t
19690 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20  est_channel.... 
196a0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
196b0 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
196c0 69 66 20 74 68 65 20 53 51 4c 69 74 65 20 69 6e  if the SQLite in
196d0 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 69  terop assembly i
196e0 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20  s available...  
196f0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
19700 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 49   checkForSQLiteI
19710 6e 74 65 72 6f 70 20 24 3a 3a 74 65 73 74 5f 63  nterop $::test_c
19720 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20  hannel....      
19730 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
19740 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20 53  OTE: Check the S
19750 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 61  QLite database a
19760 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72  nd temporary dir
19770 65 63 74 6f 72 69 65 73 2e 0d 0a 20 20 20 20 20  ectories...     
19780 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68     #..        ch
19790 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 69 72 65  eckForSQLiteDire
197a0 63 74 6f 72 69 65 73 20 24 3a 3a 74 65 73 74 5f  ctories $::test_
197b0 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20  channel....     
197c0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
197d0 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
197e0 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 76 61   determine if va
197f0 72 69 6f 75 73 20 63 6f 6d 70 69 6c 65 2d 74 69  rious compile-ti
19800 6d 65 20 6f 70 74 69 6f 6e 73 20 6e 65 65 64 65  me options neede
19810 64 20 66 6f 72 0d 0a 20 20 20 20 20 20 20 20 23  d for..        #
19820 20 20 20 20 20 20 20 74 65 73 74 20 63 6f 6e 73         test cons
19830 74 72 61 69 6e 74 73 20 77 65 72 65 20 65 6e 61  traints were ena
19840 62 6c 65 64 20 66 6f 72 20 74 68 65 20 6d 61 6e  bled for the man
19850 61 67 65 64 20 61 73 73 65 6d 62 6c 79 2e 20 20  aged assembly.  
19860 54 68 65 72 65 0d 0a 20 20 20 20 20 20 20 20 23  There..        #
19870 20 20 20 20 20 20 20 61 72 65 20 73 6f 6d 65 20         are some 
19880 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
19890 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20 61  ions that must a
198a0 6c 73 6f 20 68 61 76 65 20 62 65 65 6e 20 65 6e  lso have been en
198b0 61 62 6c 65 64 0d 0a 20 20 20 20 20 20 20 20 23  abled..        #
198c0 20 20 20 20 20 20 20 66 6f 72 20 74 68 65 20 69         for the i
198d0 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20  nterop assembly 
198e0 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 65  in order to be e
198f0 66 66 65 63 74 69 76 65 2e 20 20 46 6f 72 20 74  ffective.  For t
19900 68 6f 73 65 0d 0a 20 20 20 20 20 20 20 20 23 20  hose..        # 
19910 20 20 20 20 20 20 6f 70 74 69 6f 6e 73 2c 20 69        options, i
19920 74 20 77 69 6c 6c 20 62 65 20 61 73 73 75 6d 65  t will be assume
19930 64 20 74 68 61 74 20 69 74 20 77 61 73 20 65 6e  d that it was en
19940 61 62 6c 65 64 20 66 6f 72 20 74 68 65 20 69 6e  abled for the in
19950 74 65 72 6f 70 0d 0a 20 20 20 20 20 20 20 20 23  terop..        #
19960 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 20         assembly 
19970 69 66 20 69 74 20 77 61 73 20 65 6e 61 62 6c 65  if it was enable
19980 64 20 66 6f 72 20 74 68 65 20 6d 61 6e 61 67 65  d for the manage
19990 64 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20  d assembly...   
199a0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
199b0 66 6f 72 65 61 63 68 20 64 65 66 69 6e 65 43 6f  foreach defineCo
199c0 6e 73 74 61 6e 74 20 5b 6c 69 73 74 20 5c 0d 0a  nstant [list \..
199d0 20 20 20 20 20 20 20 20 20 20 20 20 43 48 45 43              CHEC
199e0 4b 5f 53 54 41 54 45 20 43 4f 55 4e 54 5f 48 41  K_STATE COUNT_HA
199f0 4e 44 4c 45 20 44 45 42 55 47 20 49 4e 54 45 52  NDLE DEBUG INTER
19a00 4f 50 5f 43 4f 44 45 43 20 49 4e 54 45 52 4f 50  OP_CODEC INTEROP
19a10 5f 44 45 42 55 47 20 5c 0d 0a 20 20 20 20 20 20  _DEBUG \..      
19a20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 45 58        INTEROP_EX
19a30 54 45 4e 53 49 4f 4e 5f 46 55 4e 43 54 49 4f 4e  TENSION_FUNCTION
19a40 53 20 49 4e 54 45 52 4f 50 5f 4c 45 47 41 43 59  S INTEROP_LEGACY
19a50 5f 43 4c 4f 53 45 20 49 4e 54 45 52 4f 50 5f 4c  _CLOSE INTEROP_L
19a60 4f 47 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  OG \..          
19a70 20 20 49 4e 54 45 52 4f 50 5f 54 45 53 54 5f 45    INTEROP_TEST_E
19a80 58 54 45 4e 53 49 4f 4e 20 49 4e 54 45 52 4f 50  XTENSION INTEROP
19a90 5f 56 49 52 54 55 41 4c 5f 54 41 42 4c 45 20 4e  _VIRTUAL_TABLE N
19aa0 45 54 5f 32 30 20 4e 45 54 5f 33 35 20 5c 0d 0a  ET_20 NET_35 \..
19ab0 20 20 20 20 20 20 20 20 20 20 20 20 4e 45 54 5f              NET_
19ac0 34 30 20 4e 45 54 5f 34 35 20 4e 45 54 5f 34 35  40 NET_45 NET_45
19ad0 31 20 4e 45 54 5f 43 4f 4d 50 41 43 54 5f 32 30  1 NET_COMPACT_20
19ae0 20 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50 41 43   PLATFORM_COMPAC
19af0 54 46 52 41 4d 45 57 4f 52 4b 20 5c 0d 0a 20 20  TFRAMEWORK \..  
19b00 20 20 20 20 20 20 20 20 20 20 50 52 45 4c 4f 41            PRELOA
19b10 44 5f 4e 41 54 49 56 45 5f 4c 49 42 52 41 52 59  D_NATIVE_LIBRARY
19b20 20 52 45 54 41 52 47 45 54 41 42 4c 45 20 53 51   RETARGETABLE SQ
19b30 4c 49 54 45 5f 53 54 41 4e 44 41 52 44 20 5c 0d  LITE_STANDARD \.
19b40 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 48 52  .            THR
19b50 4f 57 5f 4f 4e 5f 44 49 53 50 4f 53 45 44 20 54  OW_ON_DISPOSED T
19b60 52 41 43 45 20 54 52 41 43 45 5f 43 4f 4e 4e 45  RACE TRACE_CONNE
19b70 43 54 49 4f 4e 20 54 52 41 43 45 5f 48 41 4e 44  CTION TRACE_HAND
19b80 4c 45 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  LE \..          
19b90 20 20 54 52 41 43 45 5f 50 52 45 4c 4f 41 44 20    TRACE_PRELOAD 
19ba0 54 52 41 43 45 5f 53 48 41 52 45 44 20 54 52 41  TRACE_SHARED TRA
19bb0 43 45 5f 53 54 41 54 45 4d 45 4e 54 20 54 52 41  CE_STATEMENT TRA
19bc0 43 45 5f 57 41 52 4e 49 4e 47 20 5c 0d 0a 20 20  CE_WARNING \..  
19bd0 20 20 20 20 20 20 20 20 20 20 54 52 41 43 4b 5f            TRACK_
19be0 4d 45 4d 4f 52 59 5f 42 59 54 45 53 20 55 53 45  MEMORY_BYTES USE
19bf0 5f 45 4e 54 49 54 59 5f 46 52 41 4d 45 57 4f 52  _ENTITY_FRAMEWOR
19c00 4b 5f 36 20 55 53 45 5f 49 4e 54 45 52 4f 50 5f  K_6 USE_INTEROP_
19c10 44 4c 4c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  DLL \..         
19c20 20 20 20 55 53 45 5f 50 52 45 50 41 52 45 5f 56     USE_PREPARE_V
19c30 32 20 57 49 4e 44 4f 57 53 5d 20 7b 0d 0a 20 20  2 WINDOWS] {..  
19c40 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
19c50 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
19c60 63 6b 20 69 66 20 74 68 65 20 63 6f 6d 70 69 6c  ck if the compil
19c70 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
19c80 20 6c 69 73 74 65 64 20 69 6e 20 74 68 65 20 6c   listed in the l
19c90 69 73 74 20 6f 66 0d 0a 20 20 20 20 20 20 20 20  ist of..        
19ca0 20 20 23 20 20 20 20 20 20 20 22 64 65 66 69 6e    #       "defin
19cb0 65 20 63 6f 6e 73 74 61 6e 74 73 22 20 6b 65 70  e constants" kep
19cc0 74 20 74 72 61 63 6b 20 6f 66 20 62 79 20 74 68  t track of by th
19cd0 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62  e managed assemb
19ce0 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ly...          #
19cf0 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63  ..          chec
19d00 6b 46 6f 72 53 51 4c 69 74 65 44 65 66 69 6e 65  kForSQLiteDefine
19d10 43 6f 6e 73 74 61 6e 74 20 24 3a 3a 74 65 73 74  Constant $::test
19d20 5f 63 68 61 6e 6e 65 6c 20 24 64 65 66 69 6e 65  _channel $define
19d30 43 6f 6e 73 74 61 6e 74 0d 0a 20 20 20 20 20 20  Constant..      
19d40 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
19d50 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
19d60 3a 20 43 68 65 63 6b 20 74 68 65 20 63 75 72 72  : Check the curr
19d70 65 6e 74 20 62 75 69 6c 64 20 79 65 61 72 2e 20  ent build year. 
19d80 20 42 61 73 69 63 61 6c 6c 79 2c 20 74 68 69 73   Basically, this
19d90 20 69 6e 64 69 63 61 74 65 73 0d 0a 20 20 20 20   indicates..    
19da0 20 20 20 20 23 20 20 20 20 20 20 20 77 68 69 63      #       whic
19db0 68 20 76 65 72 73 69 6f 6e 20 6f 66 20 4d 53 42  h version of MSB
19dc0 75 69 6c 64 20 61 6e 64 2f 6f 72 20 56 69 73 75  uild and/or Visu
19dd0 61 6c 20 53 74 75 64 69 6f 20 77 61 73 20 75 73  al Studio was us
19de0 65 64 20 74 6f 0d 0a 20 20 20 20 20 20 20 20 23  ed to..        #
19df0 20 20 20 20 20 20 20 63 6f 6d 70 69 6c 65 20 74         compile t
19e00 68 65 20 61 73 73 65 6d 62 6c 79 20 62 69 6e 61  he assembly bina
19e10 72 69 65 73 20 75 6e 64 65 72 20 74 65 73 74 2e  ries under test.
19e20 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
19e30 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
19e40 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20  st_channel \..  
19e50 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
19e60 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73  checking for Sys
19e70 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
19e80 62 75 69 6c 64 20 79 65 61 72 2e 2e 2e 20 22 0d  build year... ".
19e90 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 79  ...        set y
19ea0 65 61 72 20 5b 67 65 74 42 75 69 6c 64 59 65 61  ear [getBuildYea
19eb0 72 5d 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43  r]..        addC
19ec0 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
19ed0 64 41 72 67 73 20 62 75 69 6c 64 59 65 61 72 2e  dArgs buildYear.
19ee0 20 24 79 65 61 72 5d 0d 0a 20 20 20 20 20 20 20   $year]..       
19ef0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
19f00 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
19f10 67 73 20 5c 22 20 24 79 65 61 72 20 5c 22 5c 6e  gs \" $year \"\n
19f20 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
19f30 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
19f40 43 68 65 63 6b 20 74 68 65 20 63 75 72 72 65 6e  Check the curren
19f50 74 20 62 75 69 6c 64 20 2e 4e 45 54 20 46 72 61  t build .NET Fra
19f60 6d 65 77 6f 72 6b 2e 20 20 42 61 73 69 63 61 6c  mework.  Basical
19f70 6c 79 2c 20 74 68 69 73 0d 0a 20 20 20 20 20 20  ly, this..      
19f80 20 20 23 20 20 20 20 20 20 20 69 6e 64 69 63 61    #       indica
19f90 74 65 73 20 77 68 69 63 68 20 76 65 72 73 69 6f  tes which versio
19fa0 6e 20 6f 66 20 74 68 65 20 2e 4e 45 54 20 46 72  n of the .NET Fr
19fb0 61 6d 65 77 6f 72 6b 20 69 73 20 62 65 69 6e 67  amework is being
19fc0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
19fd0 20 20 62 79 20 74 68 65 20 61 73 73 65 6d 62 6c    by the assembl
19fe0 79 20 62 69 6e 61 72 69 65 73 20 75 6e 64 65 72  y binaries under
19ff0 20 74 65 73 74 2e 0d 0a 20 20 20 20 20 20 20 20   test...        
1a000 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  #..        tputs
1a010 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1a020 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1a030 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
1a040 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  or System.Data.S
1a050 51 4c 69 74 65 20 62 75 69 6c 64 20 2e 4e 45 54  QLite build .NET
1a060 20 46 72 61 6d 65 77 6f 72 6b 2e 2e 2e 20 22 0d   Framework... ".
1a070 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e  ...        set n
1a080 65 74 46 78 20 5b 67 65 74 42 75 69 6c 64 4e 65  etFx [getBuildNe
1a090 74 46 78 5d 0d 0a 20 20 20 20 20 20 20 20 61 64  tFx]..        ad
1a0a0 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  dConstraint [app
1a0b0 65 6e 64 41 72 67 73 20 62 75 69 6c 64 46 72 61  endArgs buildFra
1a0c0 6d 65 77 6f 72 6b 2e 20 24 6e 65 74 46 78 5d 0d  mework. $netFx].
1a0d0 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
1a0e0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
1a0f0 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24 6e  appendArgs \" $n
1a100 65 74 46 78 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20  etFx \"\n]....  
1a110 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1a120 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74   # NOTE: Check t
1a130 68 65 20 63 75 72 72 65 6e 74 20 62 75 69 6c 64  he current build
1a140 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20   configuration. 
1a150 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 72   This should nor
1a160 6d 61 6c 6c 79 0d 0a 20 20 20 20 20 20 20 20 23  mally..        #
1a170 20 20 20 20 20 20 20 62 65 20 65 69 74 68 65 72         be either
1a180 20 22 44 65 62 75 67 22 20 6f 72 20 22 52 65 6c   "Debug" or "Rel
1a190 65 61 73 65 22 2e 0d 0a 20 20 20 20 20 20 20 20  ease"...        
1a1a0 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  #..        tputs
1a1b0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1a1c0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1a1d0 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
1a1e0 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  or System.Data.S
1a1f0 51 4c 69 74 65 20 62 75 69 6c 64 20 63 6f 6e 66  QLite build conf
1a200 69 67 75 72 61 74 69 6f 6e 2e 2e 2e 20 22 0d 0a  iguration... "..
1a210 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f  ..        set co
1a220 6e 66 69 67 75 72 61 74 69 6f 6e 20 5b 67 65 74  nfiguration [get
1a230 42 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69  BuildConfigurati
1a240 6f 6e 5d 0d 0a 20 20 20 20 20 20 20 20 61 64 64  on]..        add
1a250 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
1a260 6e 64 41 72 67 73 20 62 75 69 6c 64 43 6f 6e 66  ndArgs buildConf
1a270 69 67 75 72 61 74 69 6f 6e 2e 20 24 63 6f 6e 66  iguration. $conf
1a280 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 20 20 20 20  iguration]..    
1a290 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
1a2a0 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
1a2b0 64 41 72 67 73 20 5c 22 20 24 63 6f 6e 66 69 67  dArgs \" $config
1a2c0 75 72 61 74 69 6f 6e 20 5c 22 5c 6e 5d 0d 0a 0d  uration \"\n]...
1a2d0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1a2e0 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 72 79 20      # NOTE: Try 
1a2f0 74 6f 20 73 65 74 75 70 20 61 6e 20 69 6e 74 65  to setup an inte
1a300 72 72 75 70 74 20 63 61 6c 6c 62 61 63 6b 20 75  rrupt callback u
1a310 73 69 6e 67 20 74 68 65 20 73 63 72 69 70 74 20  sing the script 
1a320 64 65 62 75 67 67 65 72 0d 0a 20 20 20 20 20 20  debugger..      
1a330 20 20 23 20 20 20 20 20 20 20 74 68 61 74 20 77    #       that w
1a340 69 6c 6c 20 63 61 6e 63 65 6c 20 61 6c 6c 20 53  ill cancel all S
1a350 51 4c 20 71 75 65 72 69 65 73 20 69 6e 20 70 72  QL queries in pr
1a360 6f 67 72 65 73 73 20 66 6f 72 20 61 6c 6c 20 64  ogress for all d
1a370 61 74 61 62 61 73 65 0d 0a 20 20 20 20 20 20 20  atabase..       
1a380 20 23 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74   #       connect
1a390 69 6f 6e 73 20 6b 6e 6f 77 6e 20 74 6f 20 74 68  ions known to th
1a3a0 69 73 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d  is interpreter..
1a3b0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1a3c0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
1a3d0 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74  xists ::no(sqlit
1a3e0 65 49 6e 74 65 72 72 75 70 74 43 61 6c 6c 62 61  eInterruptCallba
1a3f0 63 6b 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ck)]} then {..  
1a400 20 20 20 20 20 20 20 20 73 65 74 75 70 44 62 49          setupDbI
1a410 6e 74 65 72 72 75 70 74 43 61 6c 6c 62 61 63 6b  nterruptCallback
1a420 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1a430 20 24 3a 3a 74 65 73 74 5f 6c 6f 67 0d 0a 20 20   $::test_log..  
1a440 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1a450 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1a460 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f 72 20  NOTE: Check for 
1a470 74 68 65 20 6e 61 74 69 76 65 20 72 75 6e 74 69  the native runti
1a480 6d 65 20 6f 70 74 69 6f 6e 2c 20 77 68 69 63 68  me option, which
1a490 20 77 6f 75 6c 64 20 6d 65 61 6e 20 77 65 20 61   would mean we a
1a4a0 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  re..        #   
1a4b0 20 20 20 20 75 73 69 6e 67 20 74 68 65 20 6d 69      using the mi
1a4c0 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c  xed-mode assembl
1a4d0 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  y...        #.. 
1a4e0 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 52         checkForR
1a4f0 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 24 3a 3a  untimeOption $::
1a500 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 6e 61 74  test_channel nat
1a510 69 76 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  ive....        #
1a520 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1a530 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 74  : Check if the t
1a540 65 73 74 20 73 75 69 74 65 20 73 68 6f 75 6c 64  est suite should
1a550 20 63 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   count the numbe
1a560 72 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  r of connections
1a570 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1a580 20 20 22 6f 70 65 6e 65 64 22 20 61 6e 64 20 22    "opened" and "
1a590 63 6c 6f 73 65 64 22 20 66 72 6f 6d 20 74 68 65  closed" from the
1a5a0 20 70 6f 6f 6c 20 77 68 65 6e 20 64 65 74 65 72   pool when deter
1a5b0 6d 69 6e 69 6e 67 20 69 66 20 61 20 74 65 73 74  mining if a test
1a5c0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1a5d0 20 20 70 61 73 73 65 64 2e 20 20 44 69 73 61 62    passed.  Disab
1a5e0 6c 69 6e 67 20 74 68 69 73 20 62 65 68 61 76 69  ling this behavi
1a5f0 6f 72 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 20  or is sometimes 
1a600 6e 65 63 65 73 73 61 72 79 20 28 65 2e 67 2e 0d  necessary (e.g..
1a610 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
1a620 20 64 75 72 69 6e 67 20 74 68 65 20 72 65 6c 65   during the rele
1a630 61 73 65 20 74 65 73 74 69 6e 67 20 70 72 6f 63  ase testing proc
1a640 65 73 73 29 20 62 65 63 61 75 73 65 20 74 68 65  ess) because the
1a650 72 65 20 61 72 65 20 73 65 76 65 72 61 6c 0d 0a  re are several..
1a660 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1a670 74 65 73 74 73 20 74 68 61 74 20 72 65 6c 79 20  tests that rely 
1a680 6f 6e 20 74 68 65 20 22 6f 70 65 6e 65 64 20 66  on the "opened f
1a690 72 6f 6d 20 70 6f 6f 6c 22 20 63 6f 75 6e 74 20  rom pool" count 
1a6a0 62 65 69 6e 67 20 67 72 65 61 74 65 72 0d 0a 20  being greater.. 
1a6b0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
1a6c0 68 61 6e 20 7a 65 72 6f 2e 20 20 54 68 65 73 65  han zero.  These
1a6d0 20 74 65 73 74 73 20 6d 61 79 20 66 61 69 6c 20   tests may fail 
1a6e0 64 75 65 20 74 6f 20 74 68 65 20 6e 6f 6e 2d 64  due to the non-d
1a6f0 65 74 65 72 6d 69 6e 69 73 74 69 63 0d 0a 20 20  eterministic..  
1a700 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65        #       be
1a710 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20 43 4c  havior of the CL
1a720 52 20 47 43 2c 20 65 76 65 6e 20 77 68 65 6e 20  R GC, even when 
1a730 74 68 65 72 65 20 69 73 20 6e 6f 20 62 75 67 20  there is no bug 
1a740 69 6e 20 74 68 65 20 63 6f 64 65 0d 0a 20 20 20  in the code..   
1a750 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65 69       #       bei
1a760 6e 67 20 74 65 73 74 65 64 2e 0d 0a 20 20 20 20  ng tested...    
1a770 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63      #..        c
1a780 68 65 63 6b 46 6f 72 52 75 6e 74 69 6d 65 4f 70  heckForRuntimeOp
1a790 74 69 6f 6e 20 24 3a 3a 74 65 73 74 5f 63 68 61  tion $::test_cha
1a7a0 6e 6e 65 6c 20 6e 6f 50 6f 6f 6c 43 6f 75 6e 74  nnel noPoolCount
1a7b0 73 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  s....        #..
1a7c0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1a7d0 52 65 70 6f 72 74 20 74 68 65 20 72 65 73 6f 75  Report the resou
1a7e0 72 63 65 20 75 73 61 67 65 20 70 72 69 6f 72 20  rce usage prior 
1a7f0 74 6f 20 72 75 6e 6e 69 6e 67 20 61 6e 79 20 74  to running any t
1a800 65 73 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 23  ests...        #
1a810 0d 0a 20 20 20 20 20 20 20 20 72 65 70 6f 72 74  ..        report
1a820 53 51 4c 69 74 65 52 65 73 6f 75 72 63 65 73 20  SQLiteResources 
1a830 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d  $::test_channel.
1a840 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1a850 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 47 72        # NOTE: Gr
1a860 61 62 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6e  ab the list of n
1a870 61 74 69 76 65 20 6d 6f 64 75 6c 65 73 20 66 6f  ative modules fo
1a880 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72  r the current pr
1a890 6f 63 65 73 73 20 61 6e 64 0d 0a 20 20 20 20 20  ocess and..     
1a8a0 20 20 20 23 20 20 20 20 20 20 20 72 65 70 6f 72     #       repor
1a8b0 74 20 6f 6e 20 74 68 65 20 53 79 73 74 65 6d 2e  t on the System.
1a8c0 44 61 74 61 2e 53 51 4c 69 74 65 20 72 65 6c 61  Data.SQLite rela
1a8d0 74 65 64 20 6f 6e 65 73 2e 0d 0a 20 20 20 20 20  ted ones...     
1a8e0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65     #..        se
1a8f0 74 20 6d 6f 64 75 6c 65 73 20 5b 6f 62 6a 65 63  t modules [objec
1a900 74 20 69 6e 76 6f 6b 65 20 5c 0d 0a 20 20 20 20  t invoke \..    
1a910 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
1a920 69 61 67 6e 6f 73 74 69 63 73 2e 50 72 6f 63 65  iagnostics.Proce
1a930 73 73 2e 47 65 74 43 75 72 72 65 6e 74 50 72 6f  ss.GetCurrentPro
1a940 63 65 73 73 20 4d 6f 64 75 6c 65 73 5d 0d 0a 0d  cess Modules]...
1a950 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20  .        object 
1a960 66 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20 6d  foreach -alias m
1a970 6f 64 75 6c 65 20 24 6d 6f 64 75 6c 65 73 20 7b  odule $modules {
1a980 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
1a990 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
1a9a0 20 54 68 65 20 6d 6f 64 75 6c 65 20 66 69 6c 65   The module file
1a9b0 20 6e 61 6d 65 20 68 65 72 65 20 6d 75 73 74 20   name here must 
1a9c0 62 65 20 6e 6f 72 6d 61 6c 69 7a 65 64 2e 0d 0a  be normalized...
1a9d0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1a9e0 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e         set fileN
1a9f0 61 6d 65 20 5b 66 69 6c 65 20 6e 6f 72 6d 61 6c  ame [file normal
1aa00 69 7a 65 20 5b 24 6d 6f 64 75 6c 65 20 46 69 6c  ize [$module Fil
1aa10 65 4e 61 6d 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20  eName]]....     
1aa20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
1aa30 20 6d 61 74 63 68 20 2d 6e 6f 63 61 73 65 20 2a   match -nocase *
1aa40 2f 73 71 6c 69 74 65 33 2e 64 6c 6c 20 24 66 69  /sqlite3.dll $fi
1aa50 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
1aa60 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
1aa70 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
1aa80 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1aa90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1aaa0 20 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c 6f    "---- found lo
1aab0 61 64 65 64 20 53 51 4c 69 74 65 20 6e 61 74 69  aded SQLite nati
1aac0 76 65 20 6c 69 62 72 61 72 79 20 6d 6f 64 75 6c  ve library modul
1aad0 65 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  e: " \..        
1aae0 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d          $fileNam
1aaf0 65 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  e \n]..         
1ab00 20 7d 20 65 6c 73 65 69 66 20 7b 5b 73 74 72 69   } elseif {[stri
1ab10 6e 67 20 6d 61 74 63 68 20 5c 0d 0a 20 20 20 20  ng match \..    
1ab20 20 20 20 20 20 20 20 20 20 20 2d 6e 6f 63 61 73            -nocas
1ab30 65 20 2a 2f 53 51 4c 69 74 65 2e 49 6e 74 65 72  e */SQLite.Inter
1ab40 6f 70 2e 64 6c 6c 20 24 66 69 6c 65 4e 61 6d 65  op.dll $fileName
1ab50 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1ab60 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
1ab70 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
1ab80 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
1ab90 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
1aba0 2d 20 66 6f 75 6e 64 20 6c 6f 61 64 65 64 20 53  - found loaded S
1abb0 51 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73  QLite interop as
1abc0 73 65 6d 62 6c 79 20 6d 6f 64 75 6c 65 3a 20 22  sembly module: "
1abd0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1abe0 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 20 5c 6e      $fileName \n
1abf0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
1ac00 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1ac10 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
1ac20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
1ac30 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d  :test_channel \.
1ac40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
1ac50 2d 2d 2d 2d 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  ---- compile-tim
1ac60 65 20 6f 70 74 69 6f 6e 73 20 66 6f 72 20 53 51  e options for SQ
1ac70 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72  Lite core librar
1ac80 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  y... "....      
1ac90 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
1aca0 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
1acb0 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
1acc0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1acd0 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
1ace0 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20  .SQLite.SQLite3 
1acf0 53 51 4c 69 74 65 43 6f 6d 70 69 6c 65 4f 70 74  SQLiteCompileOpt
1ad00 69 6f 6e 73 7d 20 5c 0d 0a 20 20 20 20 20 20 20  ions} \..       
1ad10 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d 70 69             compi
1ad20 6c 65 4f 70 74 69 6f 6e 73 5d 20 3d 3d 20 30 7d  leOptions] == 0}
1ad30 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1ad40 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
1ad50 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
1ad60 6e 64 41 72 67 73 20 5b 66 6f 72 6d 61 74 4c 69  ndArgs [formatLi
1ad70 73 74 20 5b 6c 73 6f 72 74 20 5c 0d 0a 20 20 20  st [lsort \..   
1ad80 20 20 20 20 20 20 20 20 20 20 20 20 20 24 63 6f               $co
1ad90 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 5d 20 3c 6e  mpileOptions] <n
1ada0 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20  one>] \n]..     
1adb0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1adc0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1add0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1ade0 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20   unknown\n..    
1adf0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1ae00 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61   }....        ca
1ae10 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
1ae20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
1ae30 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20  hannel \..      
1ae40 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f          "---- co
1ae50 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
1ae60 6e 73 20 66 6f 72 20 53 51 4c 69 74 65 20 69 6e  ns for SQLite in
1ae70 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 2e 2e  terop assembly..
1ae80 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  . "....         
1ae90 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a   if {[catch {obj
1aea0 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
1aeb0 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
1aec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aed0 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
1aee0 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 49 6e 74  Lite.SQLite3 Int
1aef0 65 72 6f 70 43 6f 6d 70 69 6c 65 4f 70 74 69 6f  eropCompileOptio
1af00 6e 73 7d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ns} \..         
1af10 20 20 20 20 20 20 20 20 20 63 6f 6d 70 69 6c 65           compile
1af20 4f 70 74 69 6f 6e 73 5d 20 3d 3d 20 30 7d 20 74  Options] == 0} t
1af30 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1af40 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
1af50 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
1af60 41 72 67 73 20 5b 66 6f 72 6d 61 74 4c 69 73 74  Args [formatList
1af70 20 5b 6c 73 6f 72 74 20 5c 0d 0a 20 20 20 20 20   [lsort \..     
1af80 20 20 20 20 20 20 20 20 20 20 20 24 63 6f 6d 70             $comp
1af90 69 6c 65 4f 70 74 69 6f 6e 73 5d 20 3c 6e 6f 6e  ileOptions] <non
1afa0 65 3e 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  e>] \n]..       
1afb0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1afc0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1afd0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75  ::test_channel u
1afe0 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20  nknown\n..      
1aff0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1b000 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
1b010 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
1b020 68 6f 77 20 74 68 65 20 61 63 74 69 76 65 20 74  how the active t
1b030 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  est constraints.
1b040 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1b050 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
1b060 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
1b070 6e 64 41 72 67 73 20 22 2d 2d 2d 2d 20 63 6f 6e  ndArgs "---- con
1b080 73 74 72 61 69 6e 74 73 3a 20 22 20 5c 0d 0a 20  straints: " \.. 
1b090 20 20 20 20 20 20 20 20 20 20 20 5b 66 6f 72 6d             [form
1b0a0 61 74 4c 69 73 74 20 5b 6c 73 6f 72 74 20 5b 67  atList [lsort [g
1b0b0 65 74 43 6f 6e 73 74 72 61 69 6e 74 73 5d 5d 20  etConstraints]] 
1b0c0 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a 0d 0a 20  <none>] \n].... 
1b0d0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1b0e0 20 20 23 20 4e 4f 54 45 3a 20 53 61 76 65 20 74    # NOTE: Save t
1b0f0 68 65 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69  he test constrai
1b100 6e 74 73 20 66 6f 72 20 75 73 65 20 62 79 20 74  nts for use by t
1b110 68 72 65 61 64 73 20 63 72 65 61 74 65 64 20 69  hreads created i
1b120 6e 20 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20  n this..        
1b130 23 20 20 20 20 20 20 20 61 70 70 6c 69 63 61 74  #       applicat
1b140 69 6f 6e 20 64 6f 6d 61 69 6e 2e 20 20 54 68 69  ion domain.  Thi
1b150 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62  s is necessary b
1b160 65 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20 45  ecause all the E
1b170 61 67 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20  agle..        # 
1b180 20 20 20 20 20 20 22 74 65 73 74 20 63 6f 6e 74        "test cont
1b190 65 78 74 22 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ext" information
1b1a0 20 69 73 20 70 65 72 2d 74 68 72 65 61 64 2e 0d   is per-thread..
1b1b0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1b1c0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
1b1d0 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 63 6f 6e  xists ::test_con
1b1e0 73 74 72 61 69 6e 74 73 5d 7d 20 74 68 65 6e 20  straints]} then 
1b1f0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
1b200 20 3a 3a 74 65 73 74 5f 63 6f 6e 73 74 72 61 69   ::test_constrai
1b210 6e 74 73 20 24 3a 3a 65 61 67 6c 65 5f 74 65 73  nts $::eagle_tes
1b220 74 73 28 63 6f 6e 73 74 72 61 69 6e 74 73 29 0d  ts(constraints).
1b230 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
1b240 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1b250 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 74 68   # NOTE: Load th
1b260 65 20 22 61 66 74 65 72 2d 63 6f 6e 73 74 72 61  e "after-constra
1b270 69 6e 74 73 22 20 63 75 73 74 6f 6d 20 70 65 72  ints" custom per
1b280 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20 70 65 72  -user and/or per
1b290 2d 68 6f 73 74 0d 0a 20 20 20 20 20 20 20 20 23  -host..        #
1b2a0 20 20 20 20 20 20 20 74 65 73 74 20 73 65 74 74         test sett
1b2b0 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  ings now...     
1b2c0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 75 70     #..        up
1b2d0 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 6c 6f  level 1 [list lo
1b2e0 61 64 53 51 4c 69 74 65 54 65 73 74 53 65 74 74  adSQLiteTestSett
1b2f0 69 6e 67 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  ings $::test_cha
1b300 6e 6e 65 6c 20 2e 61 66 74 65 72 5d 0d 0a 0d 0a  nnel .after]....
1b310 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1b320 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20     # NOTE: Show 
1b330 77 68 65 6e 20 6f 75 72 20 74 65 73 74 73 20 61  when our tests a
1b340 63 74 75 61 6c 6c 79 20 62 65 67 61 6e 20 28 6e  ctually began (n
1b350 6f 77 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ow)...        #.
1b360 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
1b370 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
1b380 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1b390 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
1b3a0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
1b3b0 74 65 20 74 65 73 74 73 20 62 65 67 61 6e 20 61  te tests began a
1b3c0 74 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  t " \..         
1b3d0 20 20 20 5b 63 6c 6f 63 6b 20 66 6f 72 6d 61 74     [clock format
1b3e0 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d   [clock seconds]
1b3f0 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  ] \n]..      }..
1b400 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
1b410 6f 63 20 72 75 6e 53 51 4c 69 74 65 54 65 73 74  oc runSQLiteTest
1b420 45 70 69 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20  Epilogue {} {.. 
1b430 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
1b440 4e 4f 54 45 3a 20 53 6b 69 70 20 72 75 6e 6e 69  NOTE: Skip runni
1b450 6e 67 20 6f 75 72 20 63 75 73 74 6f 6d 20 65 70  ng our custom ep
1b460 69 6c 6f 67 75 65 20 69 66 20 74 68 65 20 6d 61  ilogue if the ma
1b470 69 6e 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 0d  in one has been.
1b480 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
1b490 6b 69 70 70 65 64 2e 0d 0a 20 20 20 20 20 20 23  kipped...      #
1b4a0 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e  ..      if {![in
1b4b0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65  fo exists ::no(e
1b4c0 70 69 6c 6f 67 75 65 2e 65 61 67 6c 65 29 5d 7d  pilogue.eagle)]}
1b4d0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1b4e0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1b4f0 54 45 3a 20 53 68 6f 77 20 77 68 65 6e 20 6f 75  TE: Show when ou
1b500 72 20 74 65 73 74 73 20 61 63 74 75 61 6c 6c 79  r tests actually
1b510 20 65 6e 64 65 64 20 28 6e 6f 77 29 2e 0d 0a 20   ended (now)... 
1b520 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1b530 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
1b540 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1b550 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1b560 20 20 20 22 2d 2d 2d 2d 20 53 79 73 74 65 6d 2e     "---- System.
1b570 44 61 74 61 2e 53 51 4c 69 74 65 20 74 65 73 74  Data.SQLite test
1b580 73 20 65 6e 64 65 64 20 61 74 20 22 20 5c 0d 0a  s ended at " \..
1b590 20 20 20 20 20 20 20 20 20 20 20 20 5b 63 6c 6f              [clo
1b5a0 63 6b 20 66 6f 72 6d 61 74 20 5b 63 6c 6f 63 6b  ck format [clock
1b5b0 20 73 65 63 6f 6e 64 73 5d 5d 20 5c 6e 5d 0d 0a   seconds]] \n]..
1b5c0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1b5d0 20 20 20 20 20 23 20 42 55 47 46 49 58 3a 20 42       # BUGFIX: B
1b5e0 65 66 6f 72 65 20 63 68 65 63 6b 69 6e 67 20 74  efore checking t
1b5f0 68 65 20 66 69 6e 61 6c 20 72 65 73 6f 75 72 63  he final resourc
1b600 65 73 20 69 6e 20 75 73 65 20 62 79 20 53 51 4c  es in use by SQL
1b610 69 74 65 2c 20 6d 61 6b 65 0d 0a 20 20 20 20 20  ite, make..     
1b620 20 20 20 23 20 20 20 20 20 20 20 20 20 73 75 72     #         sur
1b630 65 20 62 6f 74 68 20 6f 66 20 74 68 65 20 50 52  e both of the PR
1b640 41 47 4d 41 20 72 65 6c 61 74 65 64 20 64 69 72  AGMA related dir
1b650 65 63 74 6f 72 79 20 6e 61 6d 65 73 20 61 72 65  ectory names are
1b660 20 66 72 65 65 64 2e 0d 0a 20 20 20 20 20 20 20   freed...       
1b670 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63   #..        chec
1b680 6b 46 6f 72 53 51 4c 69 74 65 44 69 72 65 63 74  kForSQLiteDirect
1b690 6f 72 69 65 73 20 24 3a 3a 74 65 73 74 5f 63 68  ories $::test_ch
1b6a0 61 6e 6e 65 6c 20 74 72 75 65 0d 0a 0d 0a 20 20  annel true....  
1b6b0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1b6c0 20 23 20 4e 4f 54 45 3a 20 41 6c 73 6f 20 72 65   # NOTE: Also re
1b6d0 70 6f 72 74 20 74 68 65 20 72 65 73 6f 75 72 63  port the resourc
1b6e0 65 20 75 73 61 67 65 20 61 66 74 65 72 20 72 75  e usage after ru
1b6f0 6e 6e 69 6e 67 20 74 68 65 20 74 65 73 74 73 2e  nning the tests.
1b700 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1b710 20 20 20 20 20 72 65 70 6f 72 74 53 51 4c 69 74       reportSQLit
1b720 65 52 65 73 6f 75 72 63 65 73 20 24 3a 3a 74 65  eResources $::te
1b730 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20  st_channel....  
1b740 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1b750 20 23 20 4e 4f 54 45 3a 20 52 65 70 6f 72 74 20   # NOTE: Report 
1b760 74 68 65 20 63 72 69 74 69 63 61 6c 20 68 61 6e  the critical han
1b770 64 6c 65 20 63 6f 75 6e 74 73 20 61 66 74 65 72  dle counts after
1b780 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 74 65 73   running the tes
1b790 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ts...        #..
1b7a0 20 20 20 20 20 20 20 20 67 65 74 53 51 4c 69 74          getSQLit
1b7b0 65 48 61 6e 64 6c 65 43 6f 75 6e 74 73 20 24 3a  eHandleCounts $:
1b7c0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20  :test_channel.. 
1b7d0 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
1b7e0 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23  ..    ##########
1b7f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b800 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b810 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b820 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b830 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23  #..    #########
1b840 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b850 23 23 23 23 20 45 4e 44 20 45 61 67 6c 65 20 4f  #### END Eagle O
1b860 4e 4c 59 20 23 23 23 23 23 23 23 23 23 23 23 23  NLY ############
1b870 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b880 23 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23  ##..    ########
1b890 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b8a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b8b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b8c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b8d0 23 23 23 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 0d  ###..  }....  #.
1b8e0 0a 20 20 23 20 4e 4f 54 45 3a 20 53 61 76 65 20  .  # NOTE: Save 
1b8f0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
1b900 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69  directory contai
1b910 6e 69 6e 67 20 74 68 69 73 20 66 69 6c 65 2e 0d  ning this file..
1b920 0a 20 20 23 0d 0a 20 20 69 66 20 7b 21 5b 69 6e  .  #..  if {![in
1b930 66 6f 20 65 78 69 73 74 73 20 63 6f 6d 6d 6f 6e  fo exists common
1b940 5f 64 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65  _directory]} the
1b950 6e 20 7b 0d 0a 20 20 20 20 73 65 74 20 63 6f 6d  n {..    set com
1b960 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 20 5b 66  mon_directory [f
1b970 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b 69 6e 66  ile dirname [inf
1b980 6f 20 73 63 72 69 70 74 5d 5d 0d 0a 20 20 7d 0d  o script]]..  }.
1b990 0a 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45  ...  #..  # NOTE
1b9a0 3a 20 50 72 6f 76 69 64 65 20 74 68 65 20 53 79  : Provide the Sy
1b9b0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
1b9c0 20 74 65 73 74 20 70 61 63 6b 61 67 65 20 74 6f   test package to
1b9d0 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
1b9e0 2e 0d 0a 20 20 23 0d 0a 20 20 70 61 63 6b 61 67  ...  #..  packag
1b9f0 65 20 70 72 6f 76 69 64 65 20 53 79 73 74 65 6d  e provide System
1ba00 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 54 65 73  .Data.SQLite.Tes
1ba10 74 20 31 2e 30 0d 0a 7d 0d 0a                    t 1.0..}..